diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0543dec0..15d45e49 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,7 @@ stages: - build variables: - VERSION: 0.1.8-beta + VERSION: 0.1.9-beta POST_MESSAGE: "Pipeline Trigger: ${CI_PIPELINE_SOURCE}\n Branch: ${CI_COMMIT_REF_NAME}\n Commit: ${CI_COMMIT_SHA}\n diff --git a/__mocks__/react-native-fetch/fetch.js b/__mocks__/react-native-fetch/fetch.js new file mode 100644 index 00000000..dc4bf8f2 --- /dev/null +++ b/__mocks__/react-native-fetch/fetch.js @@ -0,0 +1,58 @@ +const mocked_results = require('./mocked_results/mocked_results.js') +const DEFAULT_ELECTRUM_SERVER_VERSION = ["ElectrumX"] + +/** + * Mock of the react-native-fetch http call function. If the URL is an electrum string, + * it will parse the electrum data, and use it to return mock electrum data. Possible + * electrum servers follow the format status:-code:-eproto:-params: + * @param {String} url The full URL to fetch. Test commands should be included in here + * @param {Object} payload Fetch type, body, headers etc. + */ +const fetch = function(url, payload) { + + if (url.endsWith('mock.proxy.server')) { + return new Promise((resolve) => (resolve({status: 200}))) + } + + const original_ip_regex = /\/{1}[^\/\n]+?\// + const url_ip = url.match(original_ip_regex)[0].slice(1,-1) + + if (url_ip == 'mock.proxy.server') { + const url_params_regex = /&[^\/\n]+?$/ + const electrum_cmd_regex = /api\/{1}[^\n]+?\?/ + const electrum_cmd = url.match(electrum_cmd_regex)[0].slice(4,-1).replace('/', '_') + const electrum_params = url.match(url_params_regex)[0].slice(1).split('&') + let params_obj = {} + + electrum_params.map((param) => { + const param_split = param.split('=') + params_obj[param_split[0]] = param_split[1] + }) + + return new Promise((resolve) => { + const test_params = JSON.parse(params_obj.ip.replace(/\|/g, ':')) + const mock_function = mocked_results[electrum_cmd] + + if (test_params.success) { + if (test_params.params[electrum_cmd] == null) throw new Error(`No params specified for ${electrum_cmd} command. Please include them when calling mock fetch, or set them to [] to use the commands passed to the function.`) + else if (test_params.params[electrum_cmd].length === 0) { + //If params are left empty, call mock function with default supplied params sorted in alphabetical order by their key names + delete params_obj.ip + delete params_obj.port + delete params_obj.proto + + let supplied_params = Object.keys(params_obj).sort() + supplied_params = supplied_params.map((value_key) => params_obj[value_key]) + + resolve({json: () => {return {msg: 'success', result: mock_function(...supplied_params)}}}) + } else resolve({json: () => {return {msg: 'success', result: mock_function(...test_params.params[electrum_cmd])}}}) + } else { + resolve({json: () => {return {msg: 'error', result: `code ${test_params.code}: ${test_params.error_msg}`}}}) + } + }) + } else { + throw new Error("Test fetch function called with incompatible mock parameters, try using the real fetch function.") + } +} + +module.exports = fetch \ No newline at end of file diff --git a/__mocks__/react-native-fetch/mocked_results/blockchain_data.js b/__mocks__/react-native-fetch/mocked_results/blockchain_data.js new file mode 100644 index 00000000..71f231bc --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/blockchain_data.js @@ -0,0 +1,900 @@ +/** + * This array represents all the possible UTXOs in the test set + */ +const unspent_utxos = [ + {"tx_hash":"83c6e70044f3fcb8cc352b3573519419c27430d799bfd0df8a2daaf80bdee2f1","tx_pos":0,"height":118329,"value":9599980000}, + {"tx_hash":"cfa84868e18825fe626f6ce805ee506ec266e61dfa39ed6d281e037909f480b4","tx_pos":0,"height":136264,"value":9599990000}, + {"tx_hash":"af3a49c449574036944ae536b9cdee0281f021ce2fc5b1461fd9867380494c21","tx_pos":0,"height":150213,"value":4799980000}, + {"tx_hash":"6c609613ea6bca1d87482a5dc6b24fc81ff780fdaf285f33e73259587cbc5566","tx_pos":0,"height":167225,"value":4799980000}, + {"tx_hash":"af70b16d34fbb82f414ea271ea60e984803f16fb59ae4637ea6cb8cb52168889","tx_pos":0,"height":168833,"value":4799990000}, + {"tx_hash":"db5a675f84ee26ffe35e2ee03e83fa910193e88f79566ee71af5c837f9a77475","tx_pos":0,"height":169466,"value":4799980000}, + {"tx_hash":"e6ba7bf531dc1ff0ee3ca7182a9887af1c09234e60f9bb761922ea11729b926b","tx_pos":0,"height":177901,"value":4799980000}, + {"tx_hash":"93994e51e33c82d14277942031c08a6bfb20039f06c3d4f41eb9f88d8a960379","tx_pos":0,"height":204693,"value":2399980000}, + {"tx_hash":"9f01c1d5f7fd67ec40d45e3c81006e18e6239a3b54d6a78e99c2c28cc3915558","tx_pos":0,"height":204832,"value":2399980000}, + {"tx_hash":"4d715a5765cf5eb32422130ccbf919c5bfb787e3e781430b859f16d91154862b","tx_pos":0,"height":204935,"value":2399980000}, + {"tx_hash":"0ac42a6511b12c14d6bac0d4846de17a380e2b251e3a0b0f938e635581094c27","tx_pos":0,"height":225156,"value":2399980000}, + {"tx_hash":"390a41cfd03e4381986178f608cb6c93b815554b14b49c6f0bfdc6e8e3f03fb2","tx_pos":0,"height":227460,"value":19199980000}, + {"tx_hash":"672956de3d8506d2d2b4c4229e1d810f2a52778f806aa003ef6aaaf9e35ccbc2","tx_pos":0,"height":227745,"value":2399980000}, + {"tx_hash":"e99b94e54dd788b2f570044bd1e2e8c877b56efaf589287a4041ff3852a70abc","tx_pos":0,"height":234776,"value":2399980000}, + {"tx_hash":"24e58441c79b87fa8ca9e547ac2f46a7478f018f45aef2af57ab9e90ec65f6b6","tx_pos":0,"height":235891,"value":2399990000}, + {"tx_hash":"acab6ce7260def05ac80ba3868226637f2fdf15d01fa6eeb90af32f9d2c29c85","tx_pos":0,"height":237054,"value":2399980000}, + {"tx_hash":"c9b95c6640cb23ac166f4f80f1328bbf5af630ce5ad5d83ede4412556bfdf645","tx_pos":0,"height":242452,"value":9599980000}, + {"tx_hash":"e17956cc1d6b545f0f8dcea46d50ed0d7de853fa7b994014505b046de23d6a2a","tx_pos":0,"height":244971,"value":11210885728}, + {"tx_hash":"0eb31e6663f0e2c395bf475a464eb5cb850c19a4837b3ff2ce376d545c18483a","tx_pos":0,"height":252211,"value":4799990000}, + {"tx_hash":"580b6a5ee8a1197c28c9d14ef3eaf4576733caa288e5ded69a2170c434e83c23","tx_pos":0,"height":259234,"value":4799990000}, + {"tx_hash":"cd4d361c63b006d94f089afa2caa103495b39b1b7439cd2f2d4412fe8b0ca849","tx_pos":0,"height":278293,"value":2399990000}, + {"tx_hash":"9de6831620e895832129abf44e56e1169c470f8b42dbfff1eefc1c6213d21c84","tx_pos":0,"height":281652,"value":2399980000}, + {"tx_hash":"c0d3f80b0a98bfeb3ce8eef6eeeedec48eb5e4f8ac022a5995e8adce8d18358d","tx_pos":0,"height":306015,"value":4799995000}, + {"tx_hash":"9eda91b6cc6389197cc3c56d81dc31959a4748a779156372e468b1f9db16c61c","tx_pos":0,"height":306601,"value":2399980000}, + {"tx_hash":"519a72dc8fae27da1c6239b3609b8f9f17c4b7f184988bc91dd3a21d85d05603","tx_pos":0,"height":306908,"value":4799980000}, + {"tx_hash":"31d95d6e686d9dc7515f9d6837f52df35ea58349ed88c6f28545fcbdb73a8105","tx_pos":0,"height":348160,"value":4799980000}, + {"tx_hash":"a1e1902d9fa018a2f5b0d55ff2d91a95c21eae1f3a48778445208161d1b76c2b","tx_pos":0,"height":386897,"value":4799990000}, + {"tx_hash":"1c9b0df6dd6820cb962ac2f375baebefbac751a821254d3ecd7cacb7c7aea405","tx_pos":0,"height":406622,"value":2399980000}, + {"tx_hash":"74e69be3010b31b16cb9a4c0c06a964b58b72eae1da0ad8a32bbd5f1dd0bcfcb","tx_pos":0,"height":437992,"value":2399990000}, + {"tx_hash":"5a04a9ef62b67455ea53e34fc96645fa797efc1b13e8e6fb2121c970779dbcfd","tx_pos":0,"height":483691,"value":9599980000}, + {"tx_hash":"d52ffaacec24fb10727dbd20332797f65c09d20319c2cfeee169853ba8e71d54","tx_pos":0,"height":495970,"value":9599980000}, + {"tx_hash":"a2c7e2c19bb731ddc569067b7a1c86543651c587ea277518890875e19db4c1fc","tx_pos":0,"height":535433,"value":4799980000}, + {"tx_hash":"4ca8cb003c52f384cadcef864ea0d4208b24f5ff6348c37fbdedd165be70c368","tx_pos":0,"height":560592,"value":19199980000}, + {"tx_hash":"b14fbd65a854c34fe67dc5b57f30df9aac558950f6db95b805587d9add3e1a89","tx_pos":0,"height":573698,"value":2399980000}, + {"tx_hash":"726b4c39249f4ac3e786a64c813bd00f9a3a92316717455d9b7371967bcedc71","tx_pos":0,"height":589774,"value":4799985000}, + {"tx_hash":"dc55db213f1f056c3563389673cbcc33f0c8c92dd993f40a06757c3e6fe446b7","tx_pos":0,"height":594920,"value":2399980000}, + {"tx_hash":"e06d5c69940232851b348f1f821902d93981d90ce4ecd28f73cb07ddf5aff932","tx_pos":0,"height":611093,"value":14399980000}, + {"tx_hash":"e4167bbacac6786006f6c9be83d79ba32fa4694b9b966780f4dcd68582076860","tx_pos":0,"height":627535,"value":9599980000}, + {"tx_hash":"b5893206c154252399f713b453bb5f148c25623bab15125f2b7179964c5215a6","tx_pos":0,"height":669688,"value":38399980000}, + {"tx_hash":"04d172cc9125f05f91ef4a2d1548e7c23e24a1a84944f64cd794b1996dd4b347","tx_pos":0,"height":681186,"value":19199980000}, + {"tx_hash":"98969d100b47a358b97d444d46f6b03f7571911720542bac4cbd96d423155330","tx_pos":0,"height":681537,"value":16799995000}, + {"tx_hash":"c2cb4289ce998bd01852c8a2d2ae05d8c13adc165e4d64072102ee7cf41d3805","tx_pos":0,"height":694383,"value":25200005150}, + {"tx_hash":"838e566eeb8173d8401e95c6776393af8afbfc9616ac1cce142451ad24fc7f47","tx_pos":0,"height":697581,"value":9600000000}] + +/** + * This key-value store holds the transaction hashes of each transaction in the unspent_utxos set + */ +const gotten_utxos = { + 'cfa84868e18825fe626f6ce805ee506ec266e61dfa39ed6d281e037909f480b4': '020000000001f038343c020000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac1bda825b0100000000000000000060343c020000009b571ae6151eb730a16d255640ded53a7b49f81a20fc41c7219bc830b3c3e00dc7ca654bd05848de697fc6f7aca0c85416ef0ccd5a486490743fa05aff2c8aaefadf8732516e558bcf296fcda5dcf094c8e56f28af90ddbd57ce7cabf0d6b186b26e5d3a1185c20f294b7a0ea6efd720c7377819b2aa161bd41e5d9908439bc23750bc00988f06d27e7682d46f5860d1b48563bc1a0d2bab98a823ecdf9f306f7b750a188a76cdce76c760f572d82b3acad05c344f37b2bf7eedd71126ae9047fd4a0cc0c16044eb0e96d9b6ff9ff1059e737b3e5d4497cbf02acd379b1bde6fa1fe63d141e1e2095e4e18f949f3fc011849dd05bea0cd6c1697eb9bd9d8367587d287be6c873de2749896f2912dd2d5d4442d97a7fea4f97ade96671ac64bd4032002a3635a6efc24199ec1fe58ea78a4af4421eed35f7b7fd9f48bbd2e63a2550218270974e8caa55934ab72d6dbb1e50dd834365826b29746af1c2d53b1a76a780a019b56857bdc6ecde62513b21345ae12eb6eef2904bf40be885b3cef2ada15fd1f997d331e41c110bd7c51a5e0301ba91b7c8af7ea3fdfa13bf9fab42e8a11f60306fe4e86e5c99f41a10d40268568b4c50b7611d88c21b68fdfb6896425583c14031a26e92189dca558a6362f4d97d77864ecdd004fd47c61f067c2100e4166072c031027e8986662d434e8a72bb79a7e25cf24610c976bdf7b57bdbf3dcac3ae1960021eb2fcd062c638676a21e323d6ed79c5372b7e6f2da5c0c5ccfe9a88a6e69f87030c4d041c5141791d42609df79307c6ea12ef956fc4ef0a62e049ef32213e56e84931f4221674860105e64a6666fb81546ff854f5107c7bc00f06c9f41975597d7c76aae8416c16fb559e7d069852153f925efd1bffd424fb1f5dec2d573b0372e1a4302308ab63c2108e68712d5e9d49ff46c22212d8db363d7da32d51c4dd73d9cf21796ea3381742b78237e764cae95c0f205dfa71f343c611e258f42380298bb8c988786eed276ab8bf83e9bf68dd8a99962a2bffa5b656c1f880b4aa0c99d3bbabf79e6a0be2f2f72a41b5e3f692b3495dd29de4f71522fa770b0c286a257c8ee4c85d8880297b7be8356744aee36ae2b5bf6e6b0400f146022b6ae8c8bb6b5ada8f00dcef7d67257f202279d6426a69cf813b9d5f8a22c0b6b8bdd737d7fc8e56d0e68507fd1e23429993303a7f8cef0bbf7a6afbc0c5515290fa074d64e25189f893e407e5a7168e0c0061894fa84e3cc822fc54a6a248b04882ca1af1f29d34b94dcbc3b691203054da8a57ba792afeeaef8949382bafbd290d8cdb2284073b62ae966910b472a7b659662c3156a8bb9786b64fce213feaad7fb1d7d0dc318788c81b6c5646ab40955855efe9c8579b14f965d7ca54b8c3495ab38d2da8b53c21c72cd068eb57d23cd485a8c569143cf59d85be6cfa311bb1b54dae6c5c615ec97b178bfd4ccf251818bc49ab4352e45129cc78b3cbff586701e567d64865f6744516faf34d61a70cf1f5ee2cddc8ebda7bc8db7a3c12d2155d83b32f8253f93ff1fae932bb5c76876568f063e7cf3150fa199c7b9a821ba6725bbc25fbc1f9800998ee9f82d9ac0fbae18d69800db31ee1f17625858afd4f41357abc7ffe093526b615b02707febdfe16cbafc8618151a3d7582bb7f36226920ebc09be92f35064643544642dc3d47bae84c0a57a50921dd0d190041d650d03c902909bf93e202ce7c72b5660d8890000eb1ab8098351aef6dde10e473a83b9d510879c4e9d2ab82ca28a21d028431e6da1c32e9287f1e9991fa9604be1ae37c564f312a06b073d44f21450dcb4b7b2f1b595e7f7a63573d1a7041980ce6ca61c1f64249cf7ce024d895df8f7ef9e09f9799e5cb4208ebcf17c8beff0632d3cd1088c7270c901c4e8a734c3d44765d636109af821c4947a42b30bd454ef52bf4b89fb7262be25633535607ea55a6741e31e45f1f236ab692c83cce16232e5638eb9fb06e8fba1c811b7dcbff71fe1109b10d01f27de9c12949bf39f24005dedb1a6fe692189913cbc97b64d09e676016915f17af1b571de9ad8e780c6a693c53f7f9bac22a74278291c1807ec8e3ab08733826eee3eb21ac4efe8652d91bf20e3b380bf37ab751b1996682046b7a7460fa612c2b14b51107dee61211b9028638f38bd26c7c50d8a9cc6adf2da0780d652e5dc29329d549897ecfd5296d55b038aaa7fe5685a3fb8883bb4a8cf85db90ff83897c2db7515621bcb02861c556ff315671b6243d5ac2d42aa905eaed6198d7260eb266aa45d9e5d93f11026c74f411d68c91fef19189134d1386485d8226fc14aed8e7a1d8c550cc5a1b20922c85db9d0eab69a61ce0be2b9a889fb591a50b71ded0fe0ad40acbf2665f44b9ef6c532e91931fc04853c2d3a510b5a362e6b39e4bf99f6324d5d775b6041337d2515d7bc13e3387f9c5c8832d907cfc7c9363f9cfe3650b4a3e0149d670b7473a7fec37c29a87cd1e2584d23f7753a581d833971a0c26dd9621b592ed8e141060504bdda297864c94851a011f175d295dd0800e8be2e3b2fab22fae93c01b0d99b4124112d35593b23dcf506aacc226a2162e98d22ff011eae37ea28f7eea47a61bdc1069e7980e324d0666c1976efe876e2fa75c3801', + '9f01c1d5f7fd67ec40d45e3c81006e18e6239a3b54d6a78e99c2c28cc3915558': '020000000001e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac56a7c35b010000000000000000f0f00c8f00000000972e4d2a7a96551a4e488e85c7f7e19191ccf9694b4c9188d094883180e48b9a77a382eb95c6270200eb9450f8c5646aa98830fd23df2507314c360662610caa03699184ad2180924dd459aacd23fbc8dfd9783c385e03bdc2db2810f489899f8cb0c97a10d9815ff5d759b444f4ef9dfe616e16f96c355b4f2350a16ed101b0fdad6db10b8839a584ccc94b24e6d07796b58670399127b1ab5dfdc9e527f63cccb6feee7125537afa1239f3ec934b65ff028ae63e16e3447fc5b60f9fb6fe57f78cf621416e8df41340e7b81c74bdaf2b6d6a80378461c3503300b93426a6c00c65d4b928e80567ada4d9969bd74d9f7e56c53694bb68bb798fb1220d6e781c9ce9c21c11c1508ae92452f5583f9b320b4d961410130ad8032901f8aa57b312032705ddc3b2388ea0ab0e1ad55c40efdd874e92b7cced780d92486dc2edf5cb60031ae6dd80524fb17f6c3b3f0625ea27605dc47af77210d97199da71c7989649c50a0423f927003244931943aaffdc493e4eb2ebc111f08306382efd18e57a776534cb646aa7b68675e2bceb19a0db76ca7e8ad606abd0c095fbf40672231ffa04ce03157ccbe9b415b0f685e9a71935ad3b8344dea0764ba1098480cca1685443b03d0306b9911314ddd0513326d4277764aaf5bf1cbe76dedb36b16c444ab86a266011021367d2d5a3d38798a349c628e106eefdd37d3a79067414f6c7d638a0cd2b727802243f973df0b9d0266f01b066e066d23e149043c0ecf2a0ee14809af6fd017f9f030bfd52b76e2e9b2d7f4ac948f307efea139fae683bc74b870c810288404c029a9302a8aab63b4eafc04962a0fa861629ba0be39db773edf9d65c309254a9829f82ada33a5e49d01cc29e05626a0147ff00d4caf354d8c99e38ff40c84f7934c1710da7e2a0e5a6390374af9a7d788056e2dfe1551462cbcd1663f6e80772144d9c01aed3f74d1c5fab53a8d1b6bf6576a1ce174e34fb3a286f893b8878af56f3f5723b0c1352242ea763ffa1cb34f456d5cd768ed3a24dddfa04181822459a67ab6cdb54270adaac60041037c47ba386b03b35932a8903b93da064c97feb2e09e3eea95677f6680010d17d6503cc8476aa8c56581c3b5ec9b7aee1bafd0d746e12aae804d9d25a9a4150ac8b82e7b0c841a85ca3c69e5f02d20df0c2099f1ae696109bd028a48c94204ceac0865f64f509d95e457b7c19600785897388d16f0e1f0370b8a89f12511a32eb22deb5fe0c7db586826c101aa1ca792ba86f48c2ef6eb694b4380f48c6e1ca85ef2cfc8ecd1c7a2a5686bb40e4d11fac2277ecc5821cc24d4c645296bc43a680392fe3773f789c0d18d52b096266cae6242b1a9b3a79bbf4bdda9695420d20f312a2264b107c237636b244c8d3ee3ce126b03334f1c5334a300331820d93cbb1322e95ea2b16b0f4c60f03428c8f3448d27183cf0e22e65e0924dae5d5e146e0648872f49c9629c936b110eb3ef17f583b063dca7d2707dea05b858a7ad06ce6d83fef3feb557621ea52ee3ff545351235cb7534a8dfab6bba41faa23f9c997f3ea9a913d271dfa6ae90a429f73ce4dcb610607f501dc6724749cb7ce3f632bd6f4cfbcdfd0dad7b6a0edb27e74d80dbb568dd5eac8ae3ee72feb451efabba9314c8975093d84d3165785ff53c1c1c0394838277249ada025d611620f7e23af46d13de3a474abd29aa3044bdc78e3776cecb4fbe6e9f5eb764ecb16f5da4385808f4a4fac0a9953c66c2137794c66113a0af1b9cb9a7ee648293eaaecdef6ea8c6cdfb974bfbd1af2d82124ed089bf871fd16d192315e124fa595dd3585cdba055b601082ada6e33668c272c68d3e8eedac048f82ba232be8eb0d16b70f7dea7435107ae6ae73c3e6e5cf2c590164278ff1d55232b092816ccad8810a4e15b8edd02f99df56d41bcea783f278408c4bbf93981fc07ac10e7a9b8f31f2a03a2d1990e434b829da4bd34927080918ac1ed9686f66a64de336472d5c17342d18e0205c69f16c7761bbd1b9bcfb2b757edb95c6720c7443f343ecf8f45330ae58f15378b6cf5bf8a9b834ed125380850b4094a7144829960215b52c3eef711a9095468623d3b9e93c4a2a820e1d671db7a4a666752e24453f017f74fbab1ca710c640d693851e17b1b9113acb196982448ba8f8fb08da561da9d6b8eea502b4499a907c7771403b2d9caa54b202a773bbfdea0ac3535e767a9d72045ea5444420980ccbd038cf1e8c54bd5d34de0ebb29953e10dd2429016f361cae1f26df8527a3d92cecef246d65629cc0915c3dc8c5d67ec9058b02ee9712b470885e73f9aebee4d0c02cc8f08fd247e59666e8e907c079131e85f1a4a81f9396fd83f8f721b8a8693512b2dda39036648df44f1ffe2f090d05bfffc6a0f45c2d7e061031277d2e78c574921401567fc500ad5d431299a4f4bafc642486e162e9b7be107f4d0b6384f9d0f9ea589cf3f1ba3ca5a74d8a9616a600592dd4eddc3e88139cec92a2f88bb024a17b24bb9c60873c69bc681587449017f2c77b63ae319cdcb738f061adb8d52c1a8a21926901fa238758e35816c5d5724777f82a8ac46888e6231ca0da10360292cf123902ae39f2c8f36b7c640bd6d9bd48c771bb592c0139306dfa98c377c5a6e370f', + '6c609613ea6bca1d87482a5dc6b24fc81ff780fdaf285f33e73259587cbc5566': '020000000001e0e1191e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988acc01aa05b010000000000000000f0081a1e01000000e96d7cdaf155e68d92106b4ee72272292e9129586dd669a04d5bfdcb4c2dd5b61a1d2a68505e47bb4c230ee94394ae19c906a479131c7a97bd09e18896a8ffe3908a944bc621df2bcf1fe760923e035a5cfcee2f7813597e2a337154dfe3c19439c63b8e9d76ab31f4845154e4c85756b4fe5411cbaee0a3135d35fc189af0dd95c98678ed0d2f461eace916a223e5a93b5ef5cd9c94e83afd6500bae242f3fae1e7dcfe49cf2d6beafa318a9d1696d4a5515b3132d6eb712ff0e243c629f23073003cd16c7c480a105676db0c47602467e246211d038b3bd5fd17fbf04e99fc36ef6fcd39ec4d3d88393e507b260d4a8bf27ff9e8494315a5d9a62227d64dfa206bbe99c1d527ef81fca2091cb9fe8c8a1f7bd00ede0d82c22fb6faaf0d3357031338dee10f2e76e2be9338f17a72888f80fe765178a60ebccbe0750ef568ea9b021231d87ebc6264c90f373a8ce42c76d3a2e18f09e6bc621f4db74f36293154410b089ea47ee9941ac5fddcd99dd3fb3820f125f5ef9dbe5c40a5a59dc3b20e92a085a7c06560d061db573317cbe5824fa659a16dbf55a75b0f78822556ffb74a80031014c1ed4ea34d5ff6a46a788831ea80664c39efebc7b91809dbe6e48e7f7de60314191cd3278928639ea2a4697ba269aaac0baed8412b859bd075ef75f4556aab0200836e08d4501118cf1cf78d71036e7067fd7dc8458bbf0e4e1119337770fdea02005941018ddfc89072bf2961f14c752d6ce03704b08b46783ea943e32f560f9d030ed16209146ac2aee92089bdf2aa380d5a73a35df47281b89e08f8beb4d938c04f817935882c50fe0004d2d6295dbc10a116e04b312e97cce3d8911ed5ee478faadb43b2ba06debdef40fbce74b36ee518767fe0415e5976a22ccbe2752d9f4385e75a5a967642f9d31b21a974ba933de981408279098fba5ebaf1f2c7589cbe1114fc4cd912521059647b03641a6b7b008e1adcb2354427fe769929e3c344af3ccd6fd46c6cae38a25f52f5d1ccfaf38897128653d5043335b24d1553e960d2472ee8f9a53cc28901125b6f8bb29f0d41a8871467e1dcb832feb4fff5854c5cb64b14c221be9d65f007b315c8d97ba14e5fd6f09fb2a1166da521475e423df0a321b342972bf1df9a829aa78ab413286b35782d61cfc70f8e4fd32b4fc31adfe01fe83c73363a63aa9d30cbfa5ef1de4dfcc1115219a3d2b90017b779e3ba7289eed98192689775da218a38bc63b1b86e6a7fa820b57f147db8458ea51c3847ece4405e28397a28bbd285dd774226ea1252aadf51db8faabd6b97e720efe8d4af3ee569709a2b8156c018b6e902527d51ec0653528fdb6013056216b6295876e1e6be9e5219d0e0c3f526da4eb463ef573c816035efcd19e1de100e8fa252d26b6466ec74881c24b904ed56696dbbb7b3ee1baa21ab16b5499161e95062b09b48d088d5e55248b60a30703ce24588642d6ead3289c5cc627e3dcc28345bff7b1b484c92e2956758214e5d83c8f337f3f8c0fb7b429a26f6af1572b956d855cbf90aa3efb68dfd4412e802de9ade55975b53ed91b0aac4d6512388bb227e1c8b93da8dff8ce673c063bef939d4a274ea7219453ae5aa41eb38103d9785684b521b0238a864d3b58292ba1ec8f1b18b776e8ed28df4cc7850c2600b09dc6465365eec511f3c1abd422f555cb84b52af71438b986fd850a3f848029cdf8ecff4755840edb9e9b12f0fbdb82f06fbb5ea1c1e8bf25b43c08db5fd0c731985acae20813977f9bb74bc722b7dd71ef31d75efaf5a7e819ae5f533626bd466664afd79d44292ea9090b74e1104b858a753d7ebf9050ebe57f871876682dbaa68a6c1323f7178df6798dc17e4f0214eee5dd962216e00d36b8f52d74e067a62a4b454de8b8bc7e3a2c51849fe9035605648eff2779fff9217f72210274daf561f2a380607156e51b502e7d818e94e85df7211108ef2802d4c353620cc86b19e062cd0c94558409f91f2523e098de7d3103495347c90d2cbd72b859a18e604cc36c801029e50d6344da3fb43f23b86cc9c5a336cbdab3cdf8c5dbccbd64d8be38b2385f9f03d7f1097014b50c26feb836e24ec73dd75cc84923bf51fd758b5c7e0c49bbdd362f2bbfb6515b82266948b571fb13d851e799f8d750db14ac11146a064b222d6527cfece71793796f8ab363916389db0ca5f2ce665db3047e23d121d1bbe3622961f214bb728223dcfac095de934e81ce074727edd0937ebf8fb28bcd3c7911c3fbba00e96f30a8fd8454d8153f78d9580ccd5109848982668402691081fabfe028c361b9de57abdc831e06d13a6652b5720774ff1523147f5d4b1d784f1a4b22629bf8aa6c75408f41df44404c650aa43050c85d8756733d3a06d5b22edb6ba2b645126d7b2594cb37320568a84c1a177bdeb22eeb73e711878c1c98155207edea0a04d5b3589141412a28a755b70855840a927ca7bf1cace07dd1e2bbe77b4e9cc309d36a76479816717000e70397bb70a3dab00875c5921f4485fe2375d97daba3e7ef34244d2ee509b7c3b2e0828565da7a66863c51d542686afd284c423eaf3f28a2c17aba6e6b7667d50584558732551eb312d0f289b04287ca5b0825684cb7433bb3769b689730e9d89db485c06', + '9eda91b6cc6389197cc3c56d81dc31959a4748a779156372e468b1f9db16c61c': '0400008085202f890001e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000bdad0400f0f00c8f000000000196319b17272ca72b6df52c303e78131fa2b28d2dfef96799b590844ae50b583edadd4626c7d64c6fa1604cb70884040af78c6071c92ee676a02ed830e42451088fae9b09b2df29370ae8b9c8d3be17778a292c0e07903c03b2c8a02f3659175d36b610c8c05e0ec6e36801824e6c6e3729fd6fb7b2137bb617f3e0b393a61596a1448c544670faf8efb3cdc3aab06614c5fd2e925e9cf0ac76eec05bcb0e9699be1cb87dc5496354772d186e328b5d8cb21413f23bf1c42bf91252301161fcb23bce943a0ecb501e289dbf122fdbdb44e31b36fffe1496009e92a5ebca4a50750cfa05764625dc38cf51cb699e5880c4fa2671964328edc7e0455ec9cb4a524fe857016a176e99bfddea4e463828eda180edf4ea7fc24a19591de1bd0d0ff6a3f182235148ff9ac496e25eee12a9d0453026527122560e906badc57a3912ee2e5b57ba8f833edab764745720b5f7c586511ff3d54fba525ebfe4a394b2ff4e277a5997557fead643e53a62283fba2f6e48032ca8149ba2f9a56e906b61b8950d000046eb41457e663585d08e88bb5ac1aefa4acc91d6ee82756bd9318d28bd2fa49c984eb7e74247463eb7dab44fd3cd9bc9b091553a5ff49ec261e539d54992e10a', + '0eb31e6663f0e2c395bf475a464eb5cb850c19a4837b3ff2ce376d545c18483a': '0400008085202f890001f0081a1e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac0000000047d9030000301a1e010000000188acc43fe7ffabac6534daf6dd70a1ba97aabecf2c252748804b2e781205fe27d0f734c1db21a0d692d6c4c158313a70bc1119aa11ff361a4c70db07b7c41b597cba39aeef501f918f4e0f2b72dbf4223e64103bb4ff4b2a32ee87302126043db45185015cc5328c19e7b0d1c852f43efa0f9714ac32bb9230eb3c497d5f11c483798c7fca07ff970ef3d021d4446b8028abe4a65d1290bf1e2284d037e8cb4719ccbc6c7e1132e031a160b291bb9f0e877b6dfde48b748d889e686d5db97581760c111d0a18b2fdee6005e36efec468934092408f388d6e9ec4acec8c37d5061556f29fb047b2bc6fa35bb66ea4adcad4b359f6c2cf06d3e860e3b442be893d54682d558a39c767f7c867de4fc54e98a0f60ac1a64b3abfa978256c12ce34c188a4da994afb9a43ea92425c3bb161043ca4f9daef103474c29b6d341bf3b73bbce50243f23ac5e8ab2f39a904269b4f760dcbb43a9a8384050740be8fdbc60c447a9606e0e18ad1dc55dace46b7071366496957e2d81a2269cb07e909b69f070000232e5a247da8a2a7225686143cd45fb3144379f48dd02d53f14efbec67813444d3ce2bb6766c0c4024ee1af9ec2f7062db265c6354f0726f7d7e9e2a39e53709', + 'acab6ce7260def05ac80ba3868226637f2fdf15d01fa6eeb90af32f9d2c29c85': '0400008085202f890001e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000119e0300f0f00c8f0000000001782193d0c7e2a2b635d9777184470c4d422ed2191ebed0da603d12e8a70b89db9f05d682464c67085bf3ccb3f91d29eb71d236f8a5d8e0020c2ed363783a2517cfcc3405f116f72b2cc9c24204af15f1b270a384cfd9b7e356ed9d958abddc1ee9043edcb4447cd9d9c8acbbc408203da9e5e793be28e034e84d0fd0c0a0b5d2a6570c1c37d4366d6b9a3cf5ec8bc24ece97d5124e0d99759c69c618e743c50cfaa208bab6417b780797167670b9a74f8f96bf1ffde2248beb8996aaad9b7471f335b110607f8f7ae150f32beeb0141409d82a468dc690043cb6b8fa9ae43ae50325c8d782e7ee2dc4d9e0666922fd02996a5706bad65499b704dd93705a124343641c60ac8c4ce7a28ae8cf8787cdc2994a88e462b09c4346fd7faf0a542da44564997f1f7072741c3f6812c7af8d0a261f6e3adadcfc2ad7478edec08a0a3b6d991ec0d07833cc641248bacaad4145c7ac8b225256c18f4fd4cff31567b66256b1a680685a27e909dd2718a07fc8b73d4aa4972a1512273f28200a4910230d0000da67e586c5223df39b38b8d4dac7295d9918804c6a44e65c6173e913b515b01e5385847c3ba9418042da653a5a1a03c6c14c5649fffa4164dd5de4b3962af20a', + '519a72dc8fae27da1c6239b3609b8f9f17c4b7f184988bc91dd3a21d85d05603': '0400008085202f89012558bea322f4df226cce0613c271381581ce2a509231d18ef9affddda64141d1000000006b483045022100b528f737383841860ab21f268dc2adcc8ad97792379a0f3dbba72792d6a4ff14022019fe6de95502b1705bd7d057ba621ec8bdd860f83d15b161b1aa49cb9960ba4901210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e0e1191e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c520302700303dcae0420c5837bc3912750136a4a109d3b8d7a428d10b7bf9a9644f61813000000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf0000000040af04000000000000000000000000', + 'c0d3f80b0a98bfeb3ce8eef6eeeedec48eb5e4f8ac022a5995e8adce8d18358d': '0400008085202f8901245ffe2b4c2ce0032ffe58408a4458ec23ca8a1dc45b3704f3ae40e335757d44000000006b483045022100eb29fb508cddf1b6fdd7eb084439ba9734ea1d3f57b6831dbb50256dff1f1f11022017a9147dc4cd6dfbff6eb1507e2e7f38a3e48f330e35136171f431e04682501501210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02781c1a1e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203005602035fab04200b2b3e44186bfa4c78c7db706ffd291412a33f0ee9ba1f763682cd2e80e29821210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000c3ab04000000000000000000000000', + '838e566eeb8173d8401e95c6776393af8afbfc9616ac1cce142451ad24fc7f47': '0400008085202f8901930cfe74e956e1928291c61cc4e6d9b9bcc7ef53d4ad508de4abac21b290ccc4000000006b483045022100ff717c5ecd3f3247eb5ba79735898cfab86a6a906088ca9970f41137138815ae02202149c0537841f6c92a11ccb39dab3eb2e1c723c8c8f490ea4287768d7fc286d101210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff020060343c020000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203db6f0203eda40a204a420b6e7cc5353832f8bb1295df67168d67cfa0a5c29e6d456e000000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf0000000051a50a000000000000000000000000', + 'c2cb4289ce998bd01852c8a2d2ae05d8c13adc165e4d64072102ee7cf41d3805': '0400008085202f89012b73fb7eef960ed9b683edb6ae751ff44c9864e87fcf5a425ea2e07b1f6553fb000000006b4830450221009309ce017a84d852b000269d55d7d051f0de6406706f2c8c337fc6947a32079f0220229985fe80633eb7217b198e196054c8f47a31bdede1db721f58d46e17351d5d01210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff021e9009de050000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c52039f8509036f980a203d185e198cd5078c15afb4b801a1a84eb40b1f028fe3c839abb65e1a2e066360210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000d3980a000000000000000000000000', + 'e06d5c69940232851b348f1f821902d93981d90ce4ecd28f73cb07ddf5aff932': '0400008085202f890108cb06d4ce8c10288293e5c02365958e6c6f76241d7b50db08131ccad3111ca2000000006b483045022100dd59bcc9b1e0d3097c3164484d3cf50dd0de95f625e4be6a49480afa2dd840c402206908645d6ce5bca5674722a9e08c28b6e86901edc871143eec3f611d1d724d7a01210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e0414e5a030000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203b5ca070315530920b7eb7305ea279ca7b04378b00f0689df4e7a2e0a66fd2c59fe61050000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000795309000000000000000000000000', + '9de6831620e895832129abf44e56e1169c470f8b42dbfff1eefc1c6213d21c84': '0400008085202f890001e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000474c0400f0f00c8f00000000011e62aed6522bf0422ab9004bfdf682a129c300d0653fd3935639d3c9ddcfd1c7d1799367bbfea6d7ba4bd0ed9defbbf989c92be676e64eab7f0138ec31933f3efabaacd9971b4d5651ae486a895893a189599ab0621ba2a77394ba1ffc3383a9223b95bb3a44142cc2db60c4cf3f4c73193589c0838a20c64e4327e6b4315baab7e5e29f6c3bc0a89a1c70342aefe021bb4f681f93b07acfb3741f8d0d40ad0d47d177bc4d9e71ebc3686c7ac45b44e6939c12a3edecbee1592163e9ccd607f174123769b6429c4c4a7921d9bf89c0f14266e5161f6ca30358cb0d82b00d87f91905d60295f6eb3bab1efb13b92d5429e000e7b8e258c23cdbe80462517576dec612eda7f776b92d4c861bade654bd11a5bac29e56ef54fb074f3a27e3feea6c581c31312045c9b308d34d5b5a31dddbc91fbcd2ecf50792dc1e699477231791c03d665936e951dda24eb5b1a5df126766716060fd060cf36d756e3e33b46a5e0fadddf83f4d469761a0022cdb92101cd1f57dd6bbdb77e5d63ad9d7238eb10a00008bfc92824b4ed65ca62ba9408dc92dda89118c8b4441430592fd792abc01199ee8784fc3306dc2b60efa39bfbc2aaa27a86ae16020077867571cb51ed3fb3309', + '726b4c39249f4ac3e786a64c813bd00f9a3a92316717455d9b7371967bcedc71': '0400008085202f890199fb95f1a34b745e0854d30d4d1800eafa02f667da4d39fcdc21cb0878cf0a89000000006b4830450221009c57bebf651e047a00c5d94bbf7f250756a794087805ac623e157ad5c0cd48a8022038e9e5530004cc7cbe0bd0e44974f63d41fd78345b4ad55da4c65d8ae59c248201210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff0268f5191e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c520381f00603ceff082028123385de04b5c2c596ee4474f40de2a2c53ddba4c6350f6f35f0dd04ccf793210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000320009000000000000000000000000', + 'dc55db213f1f056c3563389673cbcc33f0c8c92dd993f40a06757c3e6fe446b7': '0400008085202f8901e1db1e9330a5650d987afc7d22882aff12c7ed015d3d0daa91aa454ed6e6132b000000006a473044022050c12544abd7f0a8dd059d7c7231cfb2189892c3351d872dfc43bff93531ee4902206609eda0710c59ecf239aa2a892a0ebc6acf318ad39366ca77b1c1b109c5ffd901210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203714a0603e813092036f0c66f188427ad93af374dd2b5ca53a89d3862e2ce9bf6862c0f0000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf000000004c1409000000000000000000000000', + '98969d100b47a358b97d444d46f6b03f7571911720542bac4cbd96d423155330': '0400008085202f8901e78b48dd30ee88165f75539e788cb9fbb9c35614646bcb1921b94dd7d7db3e9f000000006a4730440220462815ce7247c4c8fde691fc5188b3fea93089601317e2b859667bcaf6992789022078796ea7fee57111bff0f9f5a145bf9dfc9ccfb7db4882c2bd921db6ae3d272901210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff0278945be9030000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c520311d8050341660a20473e5baa49bfee5dd9d48f5f258a8d742558a8e02e91507759ff177419867f63210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000a5660a000000000000000000000000', + '04d172cc9125f05f91ef4a2d1548e7c23e24a1a84944f64cd794b1996dd4b347': '0400008085202f8901e9ab29ae061789f959f134055ce066711518f9582bfbf391ba9c9c0d294d2b18000000006b483045022100cbb1fbe33a4c0722adb9868f64e6aaec09499a7e3b9f36675654ec903b08016b02207973630e9de7977fa035fe519a7be5cd20e9bc76dcb4e13c3d06baf9629db92c01210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e0716878040000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203f3210403e2640a20a743574c76daa66543dbf21fd51923c85c4962ccdaaea9994fd2549067faad23210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf0000000046650a000000000000000000000000', + 'a2c7e2c19bb731ddc569067b7a1c86543651c587ea277518890875e19db4c1fc': '0400008085202f890150ba0645a9d853fa8571779cf41d3110b938fcbe66de21344b8f3d5671ffdca6000000006a47304402203c8e273be09e2b305efc6a5f66c3116dfa5746f0c2883065d6059d9162ec4b9102202fb1d83717fd14f963acaab63956cd72b60b0d2a2ed4d269a033d54714ba934b01210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e0e1191e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c520334b90203892b08204c8c315223b3cac437cba1ea2a3a12aae8ad389b76141bf07fc3fd8f50c92257210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000ed2b08000000000000000000000000', + '5a04a9ef62b67455ea53e34fc96645fa797efc1b13e8e6fb2121c970779dbcfd': '0400008085202f890104b63ca798d0a7695bb044602caefdf7703556d8f61b8b2d97af29d20d630119000000006a4730440220298a547a962b7fff5b91376775c9f578a0fdf462a8c72c0d4169fed11bc96d0602202255324b5b732cd267ba2b8c3198f8323ff91525b08051b7fd119c5ecc62bee901210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e011343c020000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c520397b201036b610720f01014a1662912c39a204ba47c036909da75d8cd0c8699b953376e6b7c871ac5210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000cf6107000000000000000000000000', + 'd52ffaacec24fb10727dbd20332797f65c09d20319c2cfeee169853ba8e71d54': '0400008085202f89019c713a950f6e86001325a19b5069dd5bf0e549dc8fb533cfa939eda59ba77e9b000000006b483045022100deb274d4b9bff886f952a3d8c543990644065d543e7f9faa67b9b1b72ada8019022051fb4db7e080a806b0eddcc2d5c1e23415999971f8058f3b001022aafd00a1f001210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e011343c020000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c52035e5b060362910720b7c25b6669e77001301ad541a5a8c067546d152527ff3dedd385030000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000c69107000000000000000000000000', + 'b14fbd65a854c34fe67dc5b57f30df9aac558950f6db95b805587d9add3e1a89': '0400008085202f8901eb607ce563ff9c13c522f54cc77641d4a876b8b04fe79d96befd40d3772efe37000000006b483045022100e0af22bbfc46cf3dc97af32bb76295c28110c3ea90cbb86140c837a9536a81c60220566e53372f8f4e872aa39ed5e826d09aa61c3919c64c5f2b68888661868f5b0901210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c52037d6e030302c10820e6e69ab293b097b7f443a9bc598c8c5729eb8e4af3e8a944a270010000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf0000000066c108000000000000000000000000', + 'af3a49c449574036944ae536b9cdee0281f021ce2fc5b1461fd9867380494c21': '020000000001e0e1191e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac2908905b010000000000000000f0081a1e01000000a32819f1bc74bf17e0edb88aa457988eafb5ed1972b72eca990c85e072a572d63faa920d9b7f3038e40206294f379267abed870684057cd880055b53b5a67832f2a12656f33f26498956380177ee2799d32cacb430f515c0b2848ee82e437e2742cd98c64d190cdaf2b446d1a436184f3c98d07ebbabff563e08b5b97a88065769e3704778596a2e58bf7c69c3858171c99aa7beb0d450bab48ead14928e7279c1249bbe456cb56e87544cde1f66e6bf15d2e6143a9bcd7e3a626bc68986a429f977404383f0d8dc39ef1e4bb64bedeb06e035a53075d9e698092f814aba8e4dc4d31de9ae3ce2871c1bdb6a19a4fd70c02591f2def3eeb53727a3af9bdad729f93caba2f2a5b5f652707198bf3f7906cec1b7d8fc59b2eca9f2d302359ea01a03224c5f4eebc11ea4724ce5f806ce7a5486bd993065ffc5afc61b62a0843e4885020109bfa80498ad1c2d6afd827a1c83f74f41deffbcd0e37e4964902660737a0f0b05580480ac93f4779dcf21f4a0194796ce1046111900ed2b128f43dc6976f7fdc3594ad3fec21499f507b825a36d655731df88f4f8dd13917e109468f69feda4032adba4bd56eb7c7b08ac3f1411ec0dd6e71add88521aa51d157fa5ce574125ae021cdd59f0e181e0f079d756e22b9373879377f362be2dd72f5b4ac025f9cc558e031f8a3660e7142ffbd079482ee42e1002c201212c750bf0dfcc5dd43473a8477b030b0454bd31e4952088ca05d23bc9c95c8d644455bea0ba9736e6f141e3b600c902162b316dd71969dc4f455b6f4693f9bd377fd777953fec1e7c0e0794d1e71c252f796d6e0620c91c335ffe59f386dd14a9f9ada5cdac66176592ddeb1b79c2dfe0e5b04db51f4af8484cf8b4ce1db42a8c79a579cdd40194087c155b501bc59f24ce2037e30625eab02cff6d1bac2de7c37a719a51506df74f6ea9453435cb6de8b208045a94ed2387b6f4a81ea711702223eef7291a5a306f1322b067089178a3ce91dc129f4c6653561de5260ac0bfc524690a7589613681e103887758ddd3a6ec1f66d7f4002afd40f42f4dfa46c412442559546484a2083036ebe2585c267d7dc1940fcb81c579f176d7028e62dc88eebaee557d82122b92c53df7eb749413c38db4ab33c2981e3bac7fb0b6fa60bb4517a83b9fff2ead9b2b07f8ccb7c3ab090d6efa03f885b2f5cf143efb4ea9d66d1f2a7ee0a85ecfe788f0c47973fc69ae1b51d960444de7ebdcfd041cc9ad0fde2b8adf149b184b1ae8258404b02e16886668bd61432ed6544e4796b2a11291e1b83f07d0364a9f0aedf771b8055762d59e0229e248902ee95ec8d39fd722721b84de4e2b5fb3db3e822475114cc481569552c40c6acef13dc9cc611c723ff7364f5d6bb616b9d310f6c3c692c96b01cce8ba7b13430f9e87daf2d9d0d056ee0c69015e370080b57200c1ede98fad7a2f5c972f81887c3877064c5faa86979a6379f8e307420c5ca626508b162d35ec071e0f3e0afb1e1fc88ec715917663e39204d0b0a4d0822ff0e131a7507ddf9b92d0cb8fe274887c5239530e0d3b021fa15c753b27403471bab90d1dfe164bf25ab0d6c45b3cb22ced7e1d053c140aa668b6a6932c47f84cb96d91933448280775a4d85c538bd8f9105c11a51f18de0fa156b9d8bf38806be2be68936b056d42f08f622bf4938ef13850ea1f76e47ce247caa1375aab473bf88c98cbe7d9bdb3fd9eeb138ec4145c00003e479ec594e6b2ed6d5d32dddfe70e5b33d19a5d7192974b23afa85c5afe3a610cfe12e653c9763bd0c7d10ed6e2633af28d7e2f228fe98a001cf3d97e111a4e34a903c7e9bdfd554fac3550ae671d2eabb07544356a88f177139f595033e87185345aa685b46f10088def4b73718dcf11c55cb6d264fb0dcb69628a69fd96aa2e484d093bc08114e6d30e65925bfac26e25d290427567b41d23a090344cd1397358e8d0925ce9c3fce7cb31c19a482f7a2eff4b8aea7edde59e07452f3e7ca7f4b59145f1696205c93c3bc3dbbdcbbb3378040fecf46e387d374bdb780267409058c2a81cb1d942fe9bfef65f7c134006b89db972f0c2758fc3a1c9dedaf85707fd2252e6de42a76e109bbb171187e8cfd2a4ca2b4a0a5466065abb5cf238d5258ce9e5c6e23bcd70ba4fecb59cec877f7676b2f7fed81b5fa63a0164e135225c1d6bf094a36c86054b034514b008d4fbd2ed8aec018a81a89c87321a1f617b0170b2cf9c8b4bab786708c967b03f33ef001b155ff6cff257d8ed838b88ab5b082b24d3c373f97982e6d4b02bcabdbebed68f865759729b70db0de6d8a6874a0c947c1a8f017b8ac66e72e1c101d77d34abfa349e7753c9db619a788d617b25307c2afcd65cb8ecaa18b3ffce9b1adea072f10006dfe7fa4be1d2375ee020c19f93e54b29ff5397ff15b9f067da5e45f991df74132446d5a9622dbd96cdfd78704689eb057daecb8eed13a6a82dfb5d13d23c9dad0de7ec87494a14a3f19250d1ea8fc65f924bc729985d4e6244981e247fa12b2b991338fac17220eac0ce1ab6d9a0ac81fd46d004aaebae146a4447baeccfcea2c1555dd4a75ac8e8466f925577cbbf5d53c3e743b5feeb2b836b76e558a4c18e8813a4e57d9cae5a4e972fe60c04d466f305', + '83c6e70044f3fcb8cc352b3573519419c27430d799bfd0df8a2daaf80bdee2f1': '0100000001fe9679196c2a6e704949cc23e4778ab5dc480a1c723c8b538c0304b2fc977cbe000000006b483045022100cb7d422098a869d14c58ef306125cbb01ae58839d87eb65e521b3d401b5cdd2902206ca792572a4f455b0a87be9de8907cbdf0522776dc131c7d3f67bd2c29d42a8201210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff01e011343c020000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000', + '93994e51e33c82d14277942031c08a6bfb20039f06c3d4f41eb9f88d8a960379': '020000000001e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988acc084c35b010000000000000000f0f00c8f00000000e87bc8f1e35f93b2393529772ccf79798b06023e438d2af64f41ba2f43bcbf0bb6cdfe950acf51f0483deb01a4b0f3221a920948af153f5cbb901770803d89128d167d90d20766c9c64a3e69db61e15dd7b8cbba7eb879d0b6d341b8fa1aaca3093e03f29a11fe4d0858dd9c0287eda605c5416675fecd2011868e62f0a465d7beb3984103903b30a686fcc215424b8da394e8f95121c488e356051d91dfcef27f50d594c4914e658ad5717a8475e0f4b9f300d906422e261bc497c0717bd132ddddbf1289dd5748bc1e3239614588f4fca2cb9d9fac1eaa926fc184c99845ca9a904ea41e1ffa2ae3c94f34cca313b03cd64852def9f4aa1bbb6beebf8e4a0608b2723314df823616553e4ad1aa399712c7346d3795750778ab2d75beca12a6030d5b4a8e09c6fac3fa7903304df1bd38a52ef46f09d31edf15231ba9108f6355030fb896b240ff05660f5676741adcf0aff3aebdf5245696eea251c4269166e4970b0092d86f25f15a827ef524a3bb040babd179b44ad724c4593a7afa9969c92f8e63883511a06f58c1289bce32a5b65f440ee5f7f48ab3ae1741c9eb52946a3303030e61599214f316427a3bcd98e4af54f11faa2234289ae4e8894e22b6157648c2022b4ccb7575ff920fe008fae2c1e5d3ff76ffcf7e1a2b20699ce709da884bda0a02231b790e9ed032350e9651ca367dc12a1fb57fc11c635e9660079fde442e6c5a0209a93d2809b974e9be7e806617c4c20a4a2d7cdfa09e02e693c8fee6595bf6b4022ef47c3531e0ae594ee5c47c9927db0a82719f6beaa4ab53490822f2ed87c27f3775c03691632d92b0c35d150bf501c8070a740b52ad94c4bb413c8a332119a77d368fbdc2bd1aba9be8cc4fa4f2077395650c5c2374fbbf1387bca0646c6150bbdfd368250777e6555d73fff74dccba615ff85e56fb3de30f7a37f2f6002567871022fb89c66e3c43153c094d8d6a1a321ba64fba38471cc0ce4f0e99cb0d543615db5d2f0802b94c1bb77dcce6786032e1a556cb82f31d7fa946041b65bc78636347eb9b000c6617fe9ac7138d52412f40f4e75c03bed21d404f8ed8ff8556ca685e3d2d80fc45756b659ce6dfea965edba496299e194254c782f0ade2ad6fce412c9670d17eadc80c08ee82b19edb16fb6273ba728196fade6e7a0e34b790e66a1272dbf3e7fa812e9b7f7ff558a890e64f9a25c1db94567981c68eb2f003088be6854aca7118bdb701cccc267df7fc46f16feb5edb8f340ff48b65f508212937a93d638614fe967cd266ea5422446f9ee6fd874b7bb9f4bbf702559c27464a781f43ddf5b0ece9a616e655d352d02702ec1d4b441595b5eab606fb4de896e9935b4532bf2f58418225b88b1b4cc20bfbebefb4115daf0ae163de1c91e74164d52fcaebbac8fb017c9290f99e415e0c3087ab403d270eaef20bfc38df034d00a96fba2244fd569be4147b8a307fb78a3c0da059c96b1caa4bf5124fa7d22a51ef882c745b803e99c09132734ed499ef4696624952f5cd64d1966dcd50ecc2603b5d042487aba03d27135e774eae023208d88b734bcc47b090c23aa3bfbc02681ddc36e0766542c32d8011d08b75b2f9959211ab104c35318a061f671b1b64a4b9a30a231c636c5913683442e940fd3f8e2dff5248368c896ade4e18dde18392c65e89df9fe2e444cacc185ed80b3ac72e16b0750d5fc83ba0a85dfad9d5b07be3b5a73c78941747d90c212fef766b8d480bc708cbf5e49177aee91eaee5b5ca288d7718289fd98aab74906b74b012edd421156d63dd69e7b869ffbca7c5ed1342a6a8a92389330dd77a38abb0385228ecaf8f1c8d0e4579c615ca132a3f24e580d6b8f813319adcea408c2e14b84c424d2bca30de3c3df17a41722f35c5f2bc1c20d9094e5c53dacdfd0f1bfb4963acfd1f6563bd945a6fe778646577d13d57439acaa91be55214080effeae0de804793e70adc791d2663dc81284b21bcd2e82c0b989703ee049e7884dbc8d08ab014befbac27467ebe5c8447498603a88820d0da1f5ad3900f11400f77e14f3ba63197118cd910339bd14f398a33e7107ec2c3f70a52ba2ffaff6919f8305f2d7bc8e285f00ddcead69435773a44d5d05bf28592163824d9f8e5b0a1f762095ed7d13b5cd73b0bd9ad954bc219d36196812c70d08f0b17cfb4e58f856404953f708e354a9a4360f49519f28364edbc9a7a6b99c988ecef37971f5571f3c237ea04a9e0c82104096da506d815af6511b5c2ddfe5f948ae2d3def2720b14fb9fb12c339c4e11255ae35e46a6e49f2e45afa5dc05e4927132063b3dba2de300b5c0ecf339811ef22473acb45ba86acec23053baa9d29823880c9916f29d1560de45179b80ff6fe74b15847a2497cdbc2f2cb9ecc3b504e2913ded704b352025c4a6bf1d500ba09144a0e3ee5f177032d83cf4d0eed26ef3c51352a33348d2a729b569e69025be936daa94e6159e3b37ba86b345118e247557a4e618b9059b2083fac1e3570e8a581cf704b6695f1806f1dc98ece0f4fe7e1b37956d17ba281eeed7b2571a41d1af3b0b325204620eeba0bf7a67eeff212fcb391f02e91073f8f618c771151ab4bc4c18ff859c6ac41f46d7298b4d3fe74f804875a9f01dd129d07e2c3104', + 'c9b95c6640cb23ac166f4f80f1328bbf5af630ce5ad5d83ede4412556bfdf645': '0400008085202f8901198cf99f671b66a6d49197d9891b264f094c3aa72af29dd07ff4bc673e00ec3b000000006b48304502210098fd1ffbbcfceedbacf73898fb26b180bb7a275c9aaddf06ba39b3fd76a9200b02206e279c13391c72c54948f31c4b2055b5fe3020eeda8aba41f261b12b9917694901210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e011343c020000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c52038269020314b303202ff0126fa4409a8df303437e77379ad98c69176c7f3738be1f829d25552d803c210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf0000000078b303000000000000000000000000', + '672956de3d8506d2d2b4c4229e1d810f2a52778f806aa003ef6aaaf9e35ccbc2': '0400008085202f890001e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988acfe50d95bb279030000000000000000000000010000000000000000f0f00c8f0000000023b3c7c3963ac279455c5ff752b1742c348eabd180d83237ed90dc5d5b37f7a6adcea37a6c0d65f25428b668e794d46446322b8b3f28dc4a6c7ba2851fdc424adfa6bf225519ab04a2ce925f851e303f1725a394d8b70b326781b559d3bba77f8721d271d3750e2cd6e8cabc254a73ddeda0a194de6afba5188c53995586dd65572488cbdf55edab7820c50f4296885058a1b1cf17d5371c2bbb2f6756f7ac0ccb8ce2e2c683444a35710e71980e5ae5ad5a6f72ed23f93c100355b3a3a3242723d0818e3cd5722060d05627be7864a1d98a0727c1e6d7035de99a89d12ae79d36e491789484a95775ec5600e9a2a0d0d60b98f1354e49eedf1b1ab46fc71b344ada1e80c535b090ecf7e46ea8a4c38ea5464b3c019ce9631ae8b83d62b64cabb61cdbc8941b4611413fb2fa91c2ec777e341d7a9d789ea914df2ac92d64b76572093f52058ddd8c5c61a4878b9c2972a48f32c18a8ff610d512f9f8ec2febb45917a88a11b3498da43815b7a2f36a2b2e75250e2812922a47fd0767494c78d7116a1e1c2a7dc1cf3a03820da07c8aaa4d43ba1b5ab35906c2c74187799969917e6cfee6b1df8d2ef487fbc95f869de5aca4950ea6418f064be3f44f76d8e0d6274d1092d4820db60d5995146a6213abacc948f2da144de6077e57989fa71bb67bee2d05c8297e1b95dc2c5d98ba58b713a96420dfad495c37357bd30b51176e69abdef748c8b28542da03af378fac378bb0f903dafdc575d1bc4b457356ab80638aa872e2885ab4bb598aeaf5bfc6e1131408017a6856c810c54a2285a8d4ab1da7ad5df5015b517459ff652048cf09c3889594ad4d82b2160569d6512b96d6733440505b0440547d5292f817b77c4995807823f5854e9b9ce8e2048faddebe3abfad2734c6abf02de10a638e806d2844f1a8702b7ae7c9c85764851139910bd2d877a7ee21f21de4fc3b581313afa18c75afbf3a41a049280bcb87cd6a9b0b3698457444ab123684d5aaf0dc7b086eeec57eea6c9c2aa67c7ea13b08ce9ca354974f325d961a047eed33d4b2c6d2491345b5343fdfd1b188e8ef22583225a5191719c80268a1ce03cbedc5010c6b08f1682a5e68aa54072a94d90e2458f1500025fa26e88fb3276bfcefb07c6e564913250526202911ede0181a3f148befb45172e9c480049ecf5b7caafa1ea5fe10924a2d88d6c02a9cd6b6410c00f597a88123daefd0ebf022196680043424f786cfd0beb006a286b72c50d212dbaa41bf41b919a786042ac3294d93e6a8998f57bcf4c8614df7ac147ea534076d58e960032e38ba6cb79e13ffd06ed6d4d8658cb0fb4161b942a9a589a4a8d9647d636c59ae384227602d87f692699ce84653eee34c1c90b9beba0943fb56181a40a578b8619ec25473174c7b10802e6f17eafb5a84dffcd5b2e0626b112ac2d6be4b134d917a41d38852deb175234f4ccc32e23b2e02659a7dc06564638c3ec8d31721eb84a427b6cf73beee379db0da0591df3c94d22f54968657a13b1db6603fdfde05def2b64b9d34901405d1e4ccf1573f3f0a9f8f3c65dec110a32f69ca96a7731bcd771b2b0d4a582589a3d32bbfbd28f42ca451d132f222867ad7c7653476d712f750d831cde7aeca4e40cc3c8f08e917df13a5b2a7998fe6372131931aab37f4af844264b3a695b35f0b0e82b8aed3fcca411c7fcdb8827b399faa1b97f21aab3345e035b403bc30f6f0034b1ecc1ee3268b225cd9a4c6fa58c91f34105f3b5dd9bdf793aa7132b47101e19c08cf709da070d76420153462d472ab1eb89048f665a9712df7c778c0e0672687db625b968e30b5ebf1becaef2728ab2f6ff68a953455a7127cc58737f29b48cf859193880a6fa03b3f1a63a9640bcdef7a9a32ceecabf22ee8f3e2d0f41da3d79a1ba05fa9acd576cd7e8f9cc27e60a5167e5aa068ee05f6feb04ca0401175d9c11cd522875228259a6ae39351e0f7aa9771d284f01e4d8a57b4925d010d1f8dc069864a06972db070a9dd555eb6fa16c2516292019677da35b8982cf8d0fea04232a2b337f92dc4a9b44881509f012be9b43940592b3f8501bc5a2b99836d828f9445974d3bdadc024f193b0120321384c1af5286ff365e00ce6ef36c4ac31acf9fe28b36188b9acd77c1a76d697ce6e6c05f1eecf2502bb3db44b5042325478abae759f064d2b0c305e66bc617057880813581074a74fba0fd5d9b8432cd0df9b86713a3a856fb6988d568e954f7a60816b0197541335f425a82673bf36b19757010ee86e486fa8fcb38f50a8b3c362880577ceef21634c67cf190de10313fe41ac103266096171a333af806c50cc5509cff140b0abdd02a37aa2038532e532359d01e9d38e2a1dffb67e13c7cff9465d3e0c87b907d36b78c420257185d435ddad73040465521687d99d52ecfcabe2d3df6239c5d78db130c0212e1cd6f598abfb66542f723bfca51e49129235b90f9c5d9b0ece650f5049b412d339eb37b9b642aa308', + '4d715a5765cf5eb32422130ccbf919c5bfb787e3e781430b859f16d91154862b': '020000000001e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac21c0c35b010000000000000000f0f00c8f000000004ed34670a3b0b8e07e3deadba998a2144030d45b06be2c0439a2ec2464054428cb7eafd5c693e1bbec254ed471532f61258021440319075b8aaa2b8664fd4d6d3927e0156945e49bb97b54b209e2c80295588657de0b14993d1f5137aa624daa3071a80b9fc2864a547f62e4314dec06cd30fceb3f46f26ad78f17f38607d6b8e82d01af43ab71ee1692cd2588aae9e502cd0298cd8a9fbe75b118080a8233b3d1058e8d6f5fae533afe9ba776d4790bee62d0539e351487f115ab60abb18c6aa05fa990fd50483bb039ed8e284052598d3e77766960c6db2e4f5a8399ddd96dca84ae8ee1da2266c47939d4a970e7ea20277534c1398dda19d74d7333aec11e07157f9c95afef3540bd2a6d3d22e2e412d868ec176b741c63b4febbd7d6667203265a38f771c9d7d5b8cb55a61ccd1b821cf825ddb048bfed4e025ba05defa33802114342d0e42d5650404ffd873621ba73dddc756c225b2a687fe4c6458c3e60680a000ff9fa1f4f1511eb53ac32e11e0ace90b9e595ea7c6b432e765c5a567aa969001606ba71fab117faf3fbcca2ffbf2204aac38f9adc52df4d190dc0720ba8a402169dd5f592803b22a348f9389abf1d3e9ef376468a3f9d431015e02dbda05bf7032f4ae1181394d3071488d8ad6ed157006a976f90eba6ad8d11b89befdfab484d0220e0f19b7f2d06b0fdc46ef4cbe7c5a33914798b7d602aea1e0a99b8b6c4fb79032e40221bda466bec4e4900d3057c21300b62ddf3120977b348e33a72344685a2020473dda66a4066fdb0027a888aef2db82cfb65d1c5d2d2a512b78c6482237ebecd72aeeb847e4c0a26d9f6d81938aed6dae487a14e1160a172c0c829f2474be360b25efa69f89422cb66817dbcf887b15dcf872bb98c51140c7212839bdfd45484e302e67ff500b6c5002378f965ee1e571d93b04b5c05b54ed875f903ebfcb7589ccac11a7cb96c1da49758a4a9bc9dbb455940724d7f943dcd0f0f173a41d908b22f9e491a70e476d292a3f2d8f03fde23dfa0f32905dafa258ae5372c1247ef2201c901e4fe6fbaa94da13bb0759fb92e07c1d2b44e185e0f3cfea5b6f2ea4602cf3eec2bd8a9375d860e0935cd1a5a515b6fc32278b91fa74b8433f102e4c27b4f3559f841da8215346ff84e15088c84c84c01ae5ddf8e959fb5d83c9b5f0fa769f1c77cb3bc3a48400562913bdc8117d7086b79fb8444d528fdcbb7648aa087bf48904357039cac5acfbfed37b1f61e9868f0243b82956bcda352185c907cabeda20d9d7ffcc9dfe6795b2fbc5166757ed57b48ff04e5c6b2127959755e1d57e7329f7e899d78f9f90c61f4f69041fe9ec593258be5a4e130aea15b2abe8699f475514f9a83ed2ddf17587019c1ede92717c69f96605a2e60d04256b3dc6e579cc3fadf48e498f2f7536e6c2e6a91062e39d0f83bc1eb68610efe4fe7f35edadbb01d0adc1f7b82529332019816a5d94418a75151900fe5e99140ee6c6caedcf954558a8c74e2ae849776c4b7d6e2a9d759adb04a2eade644605949dab952543231b978e1fad18294a026a2ed626569aeecad83484adc1692469c858a21f35d754c26aab94f5a7fa655b0c85bc43765d5cf9d82c0a97a8e2ff9276a4d7bf3caf0f9dcf9d656daa6f462a8ada473d86de344e79d4d079e07f1e02b0447cd96f2cb1ff4aff122c171ee78e1240f65167a0328610bd1ab3597c3354939447b4943048cb0d0d821098069c89c02d0ff2137c4ad5e37c076f7fd59137934ebad6a0a2c6e8b645fae5b41d46d09def0db8c29b9ea7b3476de8a344f159b21977346548cc37d442425d4d181fcb545eab8bfdd6d353dbbe3cfcc52e935b98bc90be6551d38a34ec13ccccaa8b99e85f502d80f223182e420a1ef40820bc1074c24ab5ed8b800794dbe6a537da15016e1b9fbdd9dbdecd7db54fc029b189db7df83a2a6cf32c79d756283212e981b59f1dc822d28f7be367e2aa51e900587104591341b10e7fb595f24ed51aa8234c8919bc54a45bf622bbfdb53b445ba5e9e3426712e80bd8e0ed56e50d7088c29799160a35c425c457484fd24c2c5163bb7deda0db0932687e43ccae332c1d78aa5c0af42da60926640b769a5d2c9cd2e11cdbaa91d4eec147105b5bf05c816239c925cac66b691621cfba196f01a31b9ebb7a552f9071aa4cd01413784dd2694bdc50955ebb21683472b3cd5e8a30984e9cfb05e372f998932f9dced6ca591bcebac742ff1f4f175bd920c32ce5178b060488c482eef343b384e777fe77ccbfb507060af8a7d6d5910f97319c5c5d64e00cc0b5fe493d88f8433cf62bdb3bfa1010b009cd0f55adca62bfaf0bf4fe273173cdcb76612e972fe7f7099fa73224a92e0798f6211911e6758b84d93e709ac7419d9a6a61e6aa3314bb2af105d2feaaea5cf55bc2db703cbf038a9b12dd348042b93e92b709c5995460ac94d20f1509d16e1f5a769acbaf7443da07925e55bf3383caee59b0703863e4a3690f36fdb1493e1ce1be17fe9ca165812d27ec4ebf9c775cdc9305608a8e66c1581da8d455e6f0af014a18572d91cfde5d49defbe536dff88a0e8a801dd17690e3ca076a4a24cd3013f12160f1c0620507753989a6a4b47f709a39b5653000718a7eca8a8737b5aaf0c', + 'cd4d361c63b006d94f089afa2caa103495b39b1b7439cd2f2d4412fe8b0ca849': '0400008085202f890001f0f00c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000283f040000180d8f0000000001770f86db6822a900a46225a6b0057d78dd1420b35df49bcc25ada119ca84ccdfa5520422d91b0600609e1267e266005ffb046b497057a5fdbb70a4f08a802830ec8215feb49d7165055dcd610c99b5aefe49d92b2b5e5b63945c78435252002b92a10f46bb68e0d65e92e999bb9f14826dda76e5679cf2ddd40ef3b2ad7c9e44819135a9c872f6e0ace4ffa2af9313a8413ca448ef9802c0a77994a71e2cacaa5327bca53e85535cea35c710399caa918538e03170cad988c1080fcfd018cc7267b280ec56165ff8779902e878bd2a9b98c66691438c271c77ad5ae6813844b7105500adcfe7f9c490099c1a58984a31fe1aece448bd1693bb2931dcbc63c6c697e2799be96c9d411e99cbac076054c9b5704c10468fa43c7e6f5c128bdf27ce5794a59e0d194efd63a8f9c59e10d3a9253215afc670bb0ff74aad4142c0ec7879a9553694dadf8966843d7d5db8417cc5c22e44ffef409102b1e2d85864a11b7f995b78ce2ad43923f86ae9a7d6e526f0c5a863dd08e09c99f9cecaf1ae290700001146713ae22d95218ac2ac917cffbb5de31c7e237ea363ad9da952cb413e1ebe3ed449e82d141506b7a854240b7a20e6edb4bd9c906f7850787f23a3e0dd5203', + 'a1e1902d9fa018a2f5b0d55ff2d91a95c21eae1f3a48778445208161d1b76c2b': '0400008085202f8901442d3a0a436243bbf82eeff2a26cee52c5f4545f898f6d6f78d45eb7adc5c569000000006b483045022100adde9aaef1f669fe67c78172a301beecbf044cb13058219cb13947f382013ec9022030942dcaa40a89d6b0df53ea4d24605c2ce4b89b974719df1aa4228999a202d701210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02f0081a1e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203a153020351e70520db555d642e81ddef865652e707d048f85960a4ab5bf6b8b5e82afd436be2c506210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000b5e705000000000000000000000000', + '1c9b0df6dd6820cb962ac2f375baebefbac751a821254d3ecd7cacb7c7aea405': '0400008085202f890001e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac0000000071340600f0f00c8f0000000001f07e42bbbf0ae8713d5bbbbae478f6c0a8b5dab5d94bb70d5de55b08e925fa5714aab7adea3da518540f7d1369400bab345e51c195c2265b626484134cfa0b2ff043f0806b8fc2e48f8404bff091c2d3f3ce1ec97e7b7b9e6d4f4167e1a8ec2bb78e093c4dca8fbe61f835c7a4be5e5db10eef4692e029666922ea41eb8b1ba3b166abc4cd0ee4a01cc948a2880af5eba705648f2361558fd261628d90de5ea672c57888bf152ad023ac649f29cc5f598276fef86d885b4732835a06a03d1260c4de2bf9af4855789623a0865665eba6e952f4c4ac255a9e7b5407540423589b0cbeface3a3e5d7767bdb5c7a2270d11335e123a366c2d4c6a4e5ae85cf6b4dddd258a3a1b4410112abbaf04e2e0c07194a43093d9f00f3627b3704114e338586df72dc364a53b92d8e861fefce5436051cf1e6be4489a85c2accd85be1065cefc23a2ef92d24b16973f1d25377cc2e52eee0dcb61fff5bb6f8708859135890fb5c424cdcd98b68903154ad0376462ff5a246a3e75453cc8c6ad64ca2436c306000090db9ba5b526b1bbe01dd75a73631542eec0cce7a8b03ae9b1be219b114941c0a21aa53262a7dc4429c676bbc44c617009b0c7435596d9bb43ba7ebdc540d909', + '390a41cfd03e4381986178f608cb6c93b815554b14b49c6f0bfdc6e8e3f03fb2': '0100000001d779ad3ff989985d5e024cce22bfb4e2e0fb9b45bb8791dc118e4c90726ea8ec000000006b483045022100bf95c0cca5039279ff91745ca3a330bd379d7bb74e8f2aa5e51cffe9c78b53f7022077478b5260340dbc8e67b08713b8a5ff9fdf231753db663f9811d42d3e7e995401210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff01e0716878040000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000', + '580b6a5ee8a1197c28c9d14ef3eaf4576733caa288e5ded69a2170c434e83c23': '0400008085202f8901c3c98d027eac3e6db908162a3a1f62c3c79fe402285227f852201c92504e4bda000000006b4830450221008f9ed959b2a5551bc4291d20bcf456241943a1a7b6e78290293ee634d854829a02204ec774e96bf518207d78345c9d35164cd6bbb9cc84a2342c4c954cb9789100f601210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02f0081a1e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c520388a40203a2f40320cbc17e8300c2fdc19c340e485556667ca8817141392ae17329f2490d325786cf210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf0000000006f503000000000000000000000000', + 'e17956cc1d6b545f0f8dcea46d50ed0d7de853fa7b994014505b046de23d6a2a': '0400008085202f8901fd08a79924fb5e11663e2b7bf3c0b7e2cb1ef9640ae3f1a67f1433291b09458c000000006a4730440220030ecfd4eac646b008f87a2c1f0193aeeedc0cfd9d0d134cdaaab02ac943e42a0220052ed81bece8a5b69d19b0ff857dbe3d03180cc12501c29cb0e99655cd8afdb401210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02608a389c020000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203f4160303ebbc0320640e173967bc7761fdede6842ca993410917439068a693155630000000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf000000004fbd03000000000000000000000000', + '74e69be3010b31b16cb9a4c0c06a964b58b72eae1da0ad8a32bbd5f1dd0bcfcb': '0400008085202f890001f0f00c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000fbae060000180d8f00000000016304c0ea751c1dfdfafc081395e145e7924355c6817f105e19dc3642dbaa4802debebf92ece96c3da77cea6907b1266f8ef2954045f8a0ca4bc9e3cc36db6239c36a5fb5f81f34890e1545f297768cef0389b5ea727286ede55a35c3daeaff1c8071ab04778d7a6180d36f6deea769c8eac7d083ceb49a77b44a37385d0cfc11a1c75c9144f5a0322e5256b265bafb90f17816d1ea46bf909c8bf780b76a70a533fcdb241276a2e916a0dfdaf027855193ef2f9ce92cf3018bd346ef7c78f70ece74ba6ca4b2d0efd9dd4163ad23811fc8d5a28ea43f910d0ecfa7ff8b5874a9110f983be9cd03f7c9255a194bed757a593d7fbbde08da987b485e1220a088c166968db6f6c2e8a10f5395d597e8347eb1b470e94415a08ba5eb4e97f84df965609203ed8aa7a1d6bc36f988e55a6e420e4a718a7b4a878d7763235d49ecf6ac65816ea2209738898de48ac022390a0130718a5df8596d7c58cbbb859b4680436a66653b823982e7fa5e6ea09e7c41d06d919ebfe3abbfd63f084c8a63ba95040000129ad58dea830966be1d1fddc21a19c3ddf1bf4e80d02dc99f769afabb5edfcd637e2b21ce85723366f53301b0404cb6a3bbddd93d02e5b04386d6cca478090c', + '4ca8cb003c52f384cadcef864ea0d4208b24f5ff6348c37fbdedd165be70c368': '0400008085202f890112d33a9eb5a082d30d2cc8d51d26ee33ac0c8ff9247873bfa5bf7b668a55c141000000006a4730440220163578986cb6906e1d2766484c4103051925b581b195b9f0c73e87af5605b809022057b912fd00f4d4f14bb121b68111f3941069d5b0dcbf81bb3660ab5712f29d3a01210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e0716878040000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203e8f70703d08d08200d87d839aab5d7b7f14e45cbe6edcc5e2e15e9f7d1aef4c945cbf6e191988ad1210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000348e08000000000000000000000000', + 'e6ba7bf531dc1ff0ee3ca7182a9887af1c09234e60f9bb761922ea11729b926b': '0100000001e6846e460abc87f93f118ed6319cde692255e7feb044323e45fd362eec845ae3000000006a4730440220192c457c6884c2d85bf1959e04f42cab660f3b5c750e201ceed81de6df49eb8e022068064220e871a79c250426b584e62e41cd13e28efd1674560c99dde88c017c9401210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff01e0e1191e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000', + '0ac42a6511b12c14d6bac0d4846de17a380e2b251e3a0b0f938e635581094c27': '020000000001e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac5aded65b010000000000000000f0f00c8f00000000a99dbfe1cf64d2a2751f87f15aedba434ef6f79bd1312b71d8a6823a97daa2315a2e78fae21de50ba3437245c69139fc5acf0016ff287d7289f961c52081f64c38488caa605c7281d90ea44eec01b8ce91fd54d8668887cc13481ff8649dda5b9e4b4f8db545fcba8a9d06944f7868624dc07f17ad107a86fa99cea97becec3c66e05706cf10f3d8ee21b9af49ab6c7f308966784203b54fcf71d8cb537c668076c20c7706e093db22df5fc44073c116ed80482f17f558d3beca28ea388c1a2b71f002547e60b736c4bfd178f8919734092e49b4f1dc8a1ae04524a9a334c92e3c5623737744cad3f9ae50367493a2f475889c552f9ae00ba5a07871c47f648225a7050625201993c7e4a9752fd70f6ac7fee5dfb5a4dd2dd6b89ece3494f57302114de211ddeb3e7e64e67c84dfdc0e6c8e3f4d8e643f462a85bc043fdd3b80ae0301590d6c5d2372125fae8d62f9241631853596273f4d1c04d4653ad070822be80a0248246981a70ea3c07ab34a43eee16caf7817e607a1125baed6332b747d95190dd823f1fca4ac3af0d9898f6d86bdfeaea0c145ed6bcafa20a42c3288725773021df2fc8a522417b857b2d2d539dd87f62dd4426fec78db1137d5b825d7f20a51030b15573ab8f82de63edbe9504ec25e9ac56b640aa001be11d7a57a0f1703079e0305da62d96d69371f7964dc933efb41e92a7445ed9f90090d05fd351c280e44ea021b6269c33c0c42b3ac2a5ffe88aa67bb435b1ade966534431454c91da2194133031ad266ef413a3999563d11f60411ef08c9a83dd91912c05c8aa2f99b9ae5b4db1b1162570cd570b1a0c3fe543fe010544e3b55ba871e37557a3f6d056b72ee68507770572e3c48e22947d88b380df947c4e023969d967e3c985f7492b528a78615810037180d5633d957c2d9a6731db6ed849ec3c7eebf155c3547b46d533cfa79308cd7779b0560f7799e54bb6cd7a0199a641084bffb0b2059378bac332a6d6c38446477767e5938e0ea5dd9b60c3968c33a1ccac013d5093f7f4856d811d8db7396bad7ebb2b6b37527da7f5e5b98c83666546bda069b271b98d9883f4cd450feed77e24eb9a442f9043f64fdf31c52ec23d6a94c9263f7f774cb81d3a110e64adcd85b7f7e12113633aa3c45b6bdcb599795eb0c2a157d6a856032044dbe17b9be40584f74e0524ef754550b995e695a328487b937b495ca83181fd3e461203e61b8fc096fac0921bd9106565c2438b9c4c54ddbd0546420947a90e42c3e6d119404ff43bded0784f0d9d6bbbc58097a08b73a752501f8a427b08a2fec3d469157d61fac02d8e8b4ff16018fc2e51b2a5d5a4af0ce5e652791a2fc74e02a6ed8bae33bf076f91a6cd2892dd89b4a5e8f35bdffb02fdb6c80e21be9fccfce4bff34c7d1361829c2be09d30a7cb3fd2730951ebf7004fc795966db6e1e1a33bdd11e533d03bd3e27b88de2f4962ed65fd436cf483042a4667d9b3d11e136eefaa4bd030d2aed207454cbac1663e48a52a4be58c8a960812d2acf4bc8ea9db695aa26aa17090167ec3d4666b957ad567f48a1942e177560574b78986bce83b7efae46daa7073d6ba0e784d2bfc6f76203116838d101a90a93b1c9b494d595d953734d9be0f01294df32a0a864aa4158157ecedc77fb59e32dabf0ef248d024aafcd57f5ecb558f80de04f88ef3fb3f3dd40144be6e617efc6d15a8a132915c9430cd0d3d5895139b4c9dafda41e213fe4cf3665cf72891d2bd11422ead0fe55c56e48c23612e059322b86e74d85885ecfae9b962f0b864082807d0eb8de6b3383cd0229acc09c9ad62986d3b52a1f4ba2bfa1fb2df217e8cfc737e0ac836f1936e733cf73cf2928aae95d6a100e6134f3e68687f6e2becd551da165367361e658e6ce91a4c1e3f245f45720d376d70412fe659f8d8a736b657e24aae5a0bccc1ee7d50512ef476cdd3f99ad4bd851c39e27eb4ef4c9135a6f72953a372fcb02c58914963ab7b078c873692b2fbcac91c35b70b71f9ed0c56ed1f3eeaa0cf79394b15657acf050f597dfe0e2ee14fb779b30e58fb6076f41a8ed1a8cfbe9a3988d3a841999b5a806dd3d397bb6f02e74c7b5396e69a450b917268b4225be83ed1375aca8122a5c494967c69762b917e6a46e58c3e644789cd3bf6787017285674f4c6abab49f30b22caf7ac1de26c04da056eda71a5ce1f09171697b13d49372d172b89857c6ff448fde3636ab7e9f2e39bd8d605560b922ed3473860e15ab0a86cc6a6c0cf587f13d2d83230242224d8eae1ca4978501b758794bb5877c880eb79c5fec6e72a057b758a663c9c29342c42df64046cd239da897858127eb7f1d991c5f832de0fa5f528aed6050d91ec26f3c35ade4b557ef2a5f312adaec2b923ed6f81f0696444882d9eb82ee79376447d0d622830684d5a45f0ca962826cac4024c7f9049b60fae3e349984535295137cf19b6d0854022d468fd0aa1578a7d28329bc9bd160b3015f1bcf94b74db681e164634237b5475aa4f45f459ed826d3b9ea6d4cebc0b4c4e7f9de739c0710a113e659f888e2d1fa781b248b4b9e9833543cec15ba32edd8281d19cfd358e07a2e36b1463dab6f3f013afe7e01ee1980fb96b388fb1daae46cebf9680d9471c390d', + '31d95d6e686d9dc7515f9d6837f52df35ea58349ed88c6f28545fcbdb73a8105': '0400008085202f89012f67f818a6f9e7f6e2ba1dd4a123e29c5b9201a9553f33613979f9423c96125d000000006a473044022078e11f25bb37ab617392c62e8e92baeec0b598f9775731f575bbc8fbabb3e84e0220356c18469ed965534ee3c91836952c11640fadcddf2d628df0f324d8dce05f8701210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e0e1191e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c520329c503030050052045d5bab6dcfecfdf63c6019483a897b5c078a0813a46925142ad0f0000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000645005000000000000000000000000', + 'e99b94e54dd788b2f570044bd1e2e8c877b56efaf589287a4041ff3852a70abc': '0400008085202f890001e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac0000000028950300f0f00c8f0000000001945eb28c1dd5afe884ea3eacb7a88cd4580941981ba85fa317bdcdb38fd39741c36305d22969df88280da39909a76f56608cab3b6fd6ee1ad481afdb8269542caf7b57918087376e809825fffdfc5ec0176a40aa268f4cd8c65775a921b7fd3d7c40c35708339c1d64d460f30996cf3889733bff483c491b5f6a251612237b5d92782c00eff893d994910951a18dd2bc9eb2663cc3a67fbab52687fa9b518d304a9ddffba5f08e9985b48cf03c130ebdae2f49ced61279234e6e019db096a31029e50133dfff5b37ba8a41c8c4b2ada06d54df0b844c8e9b9a1bef2d79ac039504269955039eeef8524a48e75420a3bb465d9adf5fef143de75f4dfae3cf432c1845cd1d5e2290ea377a09a1b60248aa8eb05a729bcc8b2518fd9055df436e40438b18a3f094f5ab57032762efa290b71e07ef24bc250793c0bc2b1a0bbe4afcfe4595226a7ea5dfbd4ef35af1a3bb8bc0af00c83b753c50576ce84f43e2c298646c77656ac51c8d56d0a0e0fcb273cf5fb70c7f9f9769338927e0cbec33d50a000092defceb8dc4bf5449faec96f9906be3f504577c5ef2e32f6daec84d8dad793026157540a71e9c173d55a3e47521d90e940c5cf13565d77380ea5c2ece08e60b', + 'db5a675f84ee26ffe35e2ee03e83fa910193e88f79566ee71af5c837f9a77475': '020000000001e0e1191e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac1b37a25b010000000000000000f0081a1e01000000daa35def491cf3151276348f00cd5b4e7d712880d942d3ab9176fc314211c8021030b29ff2b820fb1d3408f32b065cda7ed6d4d097fe73a15d5216e12797aa8f070818244b04f66a8b8abc2ed241d765457efff1f3756f48069196c590a842a34d5cc3110c933c929932d1f2aca6900fd5448c1f95f643b621fdb57c052a4e2b08c86b487c6076d7820eb23bc9bec3829d7b5ca1b4c7b90c9736c1db0af118298b58a32139125bf3bd8b837ac916f068fedde37ae3b420e68a8641c4affa7950fad92aec409a95c09a9a32e57102358da986f1a14cd441d0ce99ae66eaae935a4a49edbf891ed283143488e780034240d4281d9d6080242d5c7abf04c61f698c564df9e3d0db194d19e1e816f817313d71b635ce04b8b6f9e703545e5d6646a50300c28b105a789350ff11b70dee13e472ebd1706b5671647ab9e41824728a3045020d754c2e04884ce11902ce4de5f3cb66635d3c1d06c23784185d4566a2168aff0a090a4e8f6aa6bc62c24eec468932b1513ad9ad0049f079d2e4a9a4a2b2e2c463943bda22074fd142914eded143bbe027b1670885638b70ce1620454ec0b7f7be021a2312f25908bcb45ca1dbb34e477c96469ace06aecc3ef5406bbca5df2b9b7a03241a7fbf9140b95e0f0cf7f433e010dc4fccd39ea6cd379cfba99ed9c09377df0319b206f4b4017bc1ba1d7633447183cc47bc5034da23b1908e7f2524e41b7b9a03047545655dc1eddb2371e2064f62c12882a01a5affcea8e2f989af2f9b6f4d1a030d63ef3a8657980f4d32797936ec58149e0a633f59215e241ede400d442ba3b3ecdcecbe1eb869ff72fa88742a4c7dc23aeff043e24a105b340b7432f25101139b3e9195921583bd108e82158c379e7e219ae7dc35dd89c19a5c6f020677053027611f739efb8b083029e83f00096ce5cc31a6fd1347acf3242ff3c6c03ef4af0f1e86d1e5a86eb49561e34d838c123bd7e95bf9ed64241129873aadbf6d9f91d9acb85daf28179868034c9c2a3720f82b9000df77ba7a116ae55899d62d80b6912abc85dd55da853eeda95238bfa334d941cedbb66f6470ffc6c5ec34fb322499f346f25e7fd50d69234a3c9f4b8db3dab064c5eed4b7ff9c915c1466fdc22a135d2420bb9eff06058413f10ab44b7c95ba0a2c7e182c9b0671917b1f0f21914e5723b080083732339975870ef2fed00ae6fd183645a90ff17b0ee73ddb05c11b22e8758eaacf5ef55b2043b87b076979918808e7abc31dbd80acdee756f809b0d8e9eb47aea2650f72301270b6e43ff30bedcc24df4c6ae4dab2c536b28ed63be8cc05e97959171f2859a58bf1409639150222f579f1d8a26fdd4bd2b0046d1433cecc3dabe1c7ee56c6d4c58a8de772fdc0b97b9f3e094f86ec4067f09a80388afc53360ce0a6baa1373c719e0b3f7784f8aefade7a0686b46c413f4dc9564760182be7475d0a20003295319db8a3ad79adfd693675a8170852a7dac0d83e95e00642828f26b4634702bbd9ff1ec5d67ba6f06ac54ea5d99e7c888f8d9fa2c5d3a721e2c473242ee16440b916e61e626a64a6346eed4dc03f5048da345611ebda79e6c5c411ea9ab95240935878d0cad11910f1687bbac66125301ffc802502f298a7f6d3ede936c341958153a222f4b78bf92c37a19523fa3d4482deef8123916ea225ccf9d8425fac20a36e4ad301651d7e944ac5301be05354a6ab4c81e91ece21602d23961207ac0a36915de42e508537b24987d3a0dfbcde4a947305b9c84a36b0b867e587b3f13d61baa6860a9f32e35a5c4da607abad9fe4eed72644019e5e0dc306d8b7de7a18fbfd6053dc353424c18c79561a9a26878e13ae140696568ff1030f59949d9389e2560dcbf820d03de3faf4c3194233f6bc3ea85d1cb8f648c52506682f0c261862e1b81fa596fddcd91b385efc1aee854b810633c08f6803001b3c6ac9d58881cea234aa574c0da49c19520f7ecc588cd234dc63033d6bca3342cc38bc767ffdeedf62973188b392eb01d490c3e55a811873fd6466fa2c463cbd8e892f493c5cb686512d0ad69b721cdf47db6a24c8419c66543400d97d5fbce7ca1593e5c44158899d29f7aa1f3e648fcfe24363fa859a2651da758ae327deb29caba9d1069c1380769bc5271d337951c89b3ce0e24f75517890ef03104732b162f40e3b37ad79e0f6ad4dd24205d1a35658caf2773e972aec1aad8418fbca9edbbbb7fd1aff4f94fccccaa91f4e7fabd96e5271a20aaf7462f1a15354dac0915369e9c8c8e7d523b0c37f6104b3c52b0c8d1508ac32ae2d53314ac97f8b6e642e3238090e3f96a30125690d57c388aab3aea4397bf9f4642cd392f48e3d11a3f7e3aac9e2ea4ad34522763cd0efd5cfe7d28854a8afb76286a704f62516c4cd9d64902d789ba26332ff2d48e9b01b5e63c2b8eba2d6eccd1de2b1b262f0e49a4b0cbce7204090b7ef0ce12ed5b089c3769b2d96dd4017c094e2e3178064eb082b377abd9e579b33af5ffb6fc2f2c2bd570604c54a3c7462369d33b163ae6b375913f7c05bacdd0f3844ff47dfb53515e7d602c4d9fb98ef75eb656fe6e9971c645a9fce5540d2c63f96fa13e6f6bc67c61d39369b02e924e956b73f681ac0e654eda9cc229a926eeab7240c', + 'e4167bbacac6786006f6c9be83d79ba32fa4694b9b966780f4dcd68582076860': '0400008085202f89010b16574966f76c39d9b3473adf41f45d08d7deae27db239e34d3021b22de9f52000000006b483045022100bff1160baa7be5daa7b3b2df3c1afb63316b8052dd4a90d96b0507ce3fc56d3602200cf1113832dd617fbcea2625861b092ffc8f0082b1db2778dc49e551a8f1637201210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e011343c020000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203f4c101034f93092066172603589507304558b7e5f03782bd17bdf04952e09f0acafe130000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000b39309000000000000000000000000', + 'b5893206c154252399f713b453bb5f148c25623bab15125f2b7179964c5215a6': '0400008085202f8901be58226e0d9ef6712005282979ff73b0bfff1e3ba507fe10d34a83b43a2abed2000000006a47304402201e678e235b450245c40c14f27bca600495745310d20f8fde90e5e3d6cbb9aa2602201976b8950d11d9d7036e2e6128945246b34a014a2a73672ea6569f7eecbb078101210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e031d1f0080000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203ce700403f8370a20079edf03b95bf9dc97f96d0d6016b1fe5d23f1f7e53a82f93b28010000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf000000005c380a000000000000000000000000', + '24e58441c79b87fa8ca9e547ac2f46a7478f018f45aef2af57ab9e90ec65f6b6': '0400008085202f890001f0f00c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac000000008799030000180d8f0000000001a20f7214f93c0952a0410eb36926363c855f5e23e793353fe1458d81d3a7656243d04191eff636229bac5789d9894d3ca196cb5d1661dfb48f6fbc8c5e030d427f674ea70e5abff6506b552e000477b9091238788b12544de595568e07520c3d3bff88f4026ba4d7ca6f5854894aa0e8e13dbe010fd6d856903d6fdf600c301aa3626c612625541d47627b805736520c6602d79016274b29dc772178d94ff72e613027018539a5ffbac8ee2b0054fe49a0233eeb780571a378c175e997424f4e4efada6f4cb7d56d2ec2a7b32d84ea4589d873d245b52902244856658e0f8abc093267492de4d23c4679171f92fa17846512ea95cab23174b96a869a2d98bac18139f8bc84f3169f415beaa1b5f55869aa3dff2937633f0e7f2849d10bd19278146c09cee8e5ecef518a3339bf4b9c1502d754ff8ddd8d86fde2ecc962847804369ebe54b16036c84002fea76f2d22a714a2890d41ba0994fce9faf2a84499c8ec5f075a7ab34639f4387168a80d866b5f18503331d88df6be717345104cb2040000fa29c64a5cc0e080183eec9c8d1cca91996470d112301cdc49621634579bcc63c08c71f4772e22d0c782648d1b9fe8fd8416dc87b3b1e1cbaabd1bdb2fc8810d', + 'af70b16d34fbb82f414ea271ea60e984803f16fb59ae4637ea6cb8cb52168889': '020000000001f0081a1e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac4b9fa15b01000000000000000000301a1e0100000079c06c4d5a83b2b24b4e8f890e7d66e6a836a8e540d89845a50a17b1489c50c8437dc6c4e2b80b3483c048f762ff7ff9a1de28f0f59e5a48e2e9065f29317135580581752896bc2aa905fbb4ed83e124b8f63cfeede63753a7ee71a39e68759abcf12268cf1abcc14d220b3263777351e62b2bef79271791d28e38159041082eece0d60365f8cf331b2b078fbb8b9ca397ecb566b98fabd360ba9fea83446ca137ab9ce65513b65699da3e14d79f1d6a292b0d1882d9cd2f87b970f7b958766eaf121958829578a2ab9ce74c721e89571121e7abccb900769490c9fe96618654a50e539323e32207bea2456515289aa6a56633fa18d1cf15eab2bdff651347003af51fd662da84023803bd0d75a45248076e6d8c93b4d464ae1158fb05e5ad4f022d84cb6247b17bc5f10a185a6d54225e9f38aa82c17c12e44378212789d2868203250bb4209166efb53c9bc1b9eeb2e358b632ba0947959e373dc3c1881bd2f9a10b0190bb874c92be6a0d5dfb477cf4076b1c5f4e2867f4e789b6d1cc54f3731cde3f522707fddfb90c8e0c504a106c721ced989d500710991c2f39c3c3c713723c0304cd785916faa4bba21112f0c3d0aadf577b5496448b3c74f153d2b7647c90cb0225b8d1c49fbf0adcb67faca7f04892666b9110435535c06cc28d205163c408260308acd2143ff17722f20d3c351d2a25d9f8617da859e4eff3f767d9f710bac7a30207d26b7bc448b223c7fb5cae3f240c9d0fcd6e8d18c442f092599ac4048245c4022b314e528b6c074c63fbebc88077dee565ff528cd23e21f5b3ab14afb0bfc76c1a9ca738aaef1e3808496744839b6b7f080383ebc456d2168627d13263f99e9c824eafdfc59834fd154af1cbc3b7f6a50efc92be9f62ed8671335863a5d3fe01b4d0cbda7a452335808b20349433d46077d5a3c0e25eadc77c4416c6dc73298b3954a3350f95ba7089b0bbbfb1063a378ba2b37cd5ffd9c6ce68b07aa3efa2c1bbb46d0d37a213ec179d1832109cb44c88f931d6a1b9597f712d4bafdc5bdb18e6969f5999e9e1d42fad19326df3a0fde79bdc4d4f4edc47db6cb7984064737af991be70c4405af47fba922c8dfa71c706471436807b81a345343915f594f2c664e84aca3f120a98b2e725f5fa9fbec1f9f7450c94dcd8c94acdcb2ef0f97a243faabc7cac0500cd319063f74c05a15acdaccc5b790d52167fa8242aa1f377b48a33e0387c6a935e7a106a5751dfe7c56c31274ffeb02feb91d8a0f260b6e720271f93c1f7123455a94f02e178b2cd4bd00b54d80acd292072b448ab909ffbf621fab60f28fe2669548a979593f710e693ad508d8e4677162449be7cd62ef783dd1be8324b34f6385b4c5ba2db86c801f324105358b558b453a10930ddf6ac09798bd8955a95dce69bf4b486e224c0e5df417578c5d2c005aca94842ede38179c87e9ea7fdda85c838cdfee58f60740eed23109bdd529b961d4ec2616da6286d1e8477efa5995c1db008530ebc4aa5c28bff088485fdc625a13ef5f2eab9735109e19656203cd73e78bb82ebc6e4baa69abe4b02790704a33e44aa3ddf63e8f56a67f02a740bb035a736ca496b669b3c99a13f83c6f29d92d40d3a9c36fb7750dbc3ac8b6cf8e27a63dc4f1c2c8d206e39b8792b74dfca7433d2a9a065919eb8cea15e58e5a4bde513321850967b5169d91b50e168462ce25ef2356b2461160e794b27c3b4520c2b7a079beb3e2adb185506d6369fe6fd0256ce633c147ce9418d4cda0cf2dbf38b1c8cc9d4d6607c2f1b5ff789afa1f5daa40f0ab373e347acfd8152e960ca9c497dba49428aafdde2ba7c7d2e8085c127c6ff75e24833110a99f6e9d41407c49e62f964b02ef3fb1151bee0e8431a638c7c3865e275b31540aa6abc109400aedd890cf7b795f1d8cf746e7b5a0bd32eab414895394ed59fe711b3ff3bde399905fc64579e6d0dd2f3bef49f5a4edcdf84342d98a191ce7ab6b44a9ea134075f51ce44aef485a6657f08b1002d1f53faedeb7ea9b13d0b7c3ddef05401cb72be2d611835a441136eb12c499473d95b04d3441b2e1c3a4c01f776e7236f3d5a5a01a581890aa98795cf8d34a59d2e7a3d0d824eb5a7a2af3a14dc9ee5e02918584ebf29c501d045866dee065b03a8279eb54ebf9606e4db7933dd53b874a59e656abb7c0a51952c457a0d9840068cd802ed05caab06d949c541b6987383177ce3001a2bcd3390710257cf8f02b9a406088810f0110f27c03a1ada5bf8edc48a6a69d5ec6deab3b47e9f40cb33b7e182c852a5d02c1c68f233fa52058151f021768208a1baf47694b812ce35a1e9a71a2588b3c3b33044449911e447a63d700cda6292d631e9502bcfcbc412be5aeef95ab299944047dcd3bab80d92a11e4a1707a1676b50e5eff4b75480bb13a3d4bf9ec7803a141c632acb3ae64ac7fd2b7c2b0bb1f286d275f30fcb558c3dd454f43e4d667782fdf4204a53a8665ae3b492710405983acca7e902fe0d3ef471ba42dc42b2be8ef80c637c79934dcbbc8f55633249890616835d968d410d018e64a55ec5c1aec87af3a4c530da95c9503a7d02ab3a0a0000b4e90cd5cb1ade3d0f41151caa395c3cff0fecf936bc8d8c6a9ffe7611c9cfb04bb36c0d8c00' +} + +/** + * This array represents blocks gotten from getblockinfo on the list of UTXOs + */ +const gotten_blocks = { + 118329: { + version: 4, + prev_block_hash: 'e13561bd74c64fcba0db0e1eeaa7498aa2208161231dab80c133af5219ba86d9', + merkle_root: '4a7e1cfbe05cf55c907751652e7882e3a93d1db9dd17ff8f0025f2cac55d7d56', + reserved: '0000000000000000000000000000000000000000000000000000000000000000', + timestamp: 1534192430, + bits: 453212297, + nonce: 'ac8a20774e9ab0327e7f602b8be4df991b549973e19ec45cb17a3c1e1b00dda9', + block_height: 118329 + }, + 136264: { + version: 4, + prev_block_hash: '00000000000013dd17d298f1563b20d43509b8515844bcb6a8ac749ff8984e68', + merkle_root: '2eb800a7bc4828614d837f36c682df3a9a0022e23183697415e2e3ed49598a96', + reserved: '0000000000000000000000000000000000000000000000000000000000000000', + timestamp: 1535302356, + bits: 453047581, + nonce: '0000324c473b6160ceaf721c17412af16973b65c6867f6337e932d24c0cec357', + block_height: 136264 + }, + 150213: { + version: 4, + prev_block_hash: '000000000000a55ced2b5a40efa54fa884bb20a6349ee96243146940dd7ecab2', + merkle_root: 'f3b9e2d6b7f41278736985070ad4a8d9a356d25d908dc334311c5d1db646b6d6', + reserved: '0000000000000000000000000000000000000000000000000000000000000000', + timestamp: 1536166141, + bits: 453030663, + nonce: '0000000000000000000000000300000000000000000000000000003dd2020068', + block_height: 150213 + }, + 167225: { + version: 4, + prev_block_hash: '000000000000348aae713f47c6c132ca3d6646e1c1ca99458db0ff5b948d9c7b', + merkle_root: 'ac9b8571505d818fd3942cd2dc656ff8aa48d35eb716bf87e69b59b8bd8114ab', + reserved: '0000000000000000000000000000000000000000000000000000000000000000', + timestamp: 1537219413, + bits: 453038716, + nonce: '00000000000000000000000004000007ccccccd8000000000000000003000038', + block_height: 167225 + }, + 168833: { + version: 4, + prev_block_hash: '246aa1e2af84c16890011a2c7ef2b258468982d96678565f4daefd62088ad8d1', + merkle_root: '071803ad659ffacf428f945e54d606ba5e7eb3017c70da979d886e3ac8ba9ad1', + reserved: '0000000000000000000000000000000000000000000000000000000000000000', + timestamp: 1537318941, + bits: 453034055, + nonce: '0000000000000000000000000e0000000000000000000000000001ea2b840030', + block_height: 168833 + }, + 169466: { + version: 4, + prev_block_hash: '3604de0778385b9686e594b18c2e38b2315b7a7fb447fb47393d3e73dfceed44', + merkle_root: 'b5e0e3156e7fda071f78abedbd378141bb8bd6ae0d0d1d3646b92f4da66efa0f', + reserved: '0000000000000000000000000000000000000000000000000000000000000000', + timestamp: 1537357860, + bits: 453028689, + nonce: '000000000000000000000000210000000000000000000000000001f0c41d0050', + block_height: 169466 + }, + 177901: { + version: 4, + prev_block_hash: '00000000000093df509b6ac28eb643a21a5e178cc55255b078f8dc81200ea65a', + merkle_root: '94c9daa5f47c3b4e7646e3381d26533de0293b545b2d4ecdc7be4835a91775f4', + reserved: '3e49b5f954aa9d3545bc6c37744661eea48d7c34e3000d82b7f0010c30f4c2fb', + timestamp: 1537881295, + bits: 453032097, + nonce: 'a084fa24190a492a21cc34f053caf40d422383fdffe2220627718b4b1a52b625', + block_height: 177901 + }, + 204693: { + version: 4, + prev_block_hash: '0000000000002d990f04afcb56386c9c7114a19e179c57da7f3600b19181a4b2', + merkle_root: '5db7a76c48bd379855278bdb315fc5609c87d7f8249042f126b6408310095ec3', + reserved: '0000000000000000000000000000000000000000000000000000000000000000', + timestamp: 1539540320, + bits: 453030750, + nonce: 'b5913887670bc7be2e26fa28cf136318d752acbb5dcfc82fba386c6b1a3ecf65', + block_height: 204693 + }, + 204832: { + version: 4, + prev_block_hash: '000000000000aec25704669c66ca5b36ab62cc3a6eebc2f74905f4f3f3cc8b6b', + merkle_root: 'dd6e44eb9d0a0a72dfc292936199e339a5b636b76a5d8a4a8fb62e29fe02930e', + reserved: '0000000000000000000000000000000000000000000000000000000000000000', + timestamp: 1539549215, + bits: 453041708, + nonce: '0000000000000000000000000300000f8000001a0000000000000000efffff6f', + block_height: 204832 + }, + 204935: { + version: 4, + prev_block_hash: '9aa17ae1cf9dd78d090882074130cbe89fcc4c744932f7e245abaddc0e4f1c5d', + merkle_root: '3416015867ea4d95c73e576edb9ccfb5567744622c7ae2dcf86503d49bc0fbbe', + reserved: '0000000000000000000000000000000000000000000000000000000000000000', + timestamp: 1539555554, + bits: 453038306, + nonce: '0000000000000000000000008a1c57d2971ab39f49e262afc9cf71dae4fcff17', + block_height: 204935 + }, + 225156: { + version: 4, + prev_block_hash: '0000000000001dbcca8a5447b81e44a34ea587ed82aa4094c7b6d1de4952b319', + merkle_root: '4e9e53b4d7d4632f085a996c9bb41e48f79aca8ce66e68ce8ef653f17520feea', + reserved: '3e49b5f954aa9d3545bc6c37744661eea48d7c34e3000d82b7f0010c30f4c2fb', + timestamp: 1540808446, + bits: 442554148, + nonce: 'c189137f316f13b679ee0a884a8b5612242caea8ac6c0ea918cd9b441a52f941', + block_height: 225156 + }, + 227460: { + version: 4, + prev_block_hash: '0000000000002166300d036ea4b5c739fedc079811a9a113babbecc9c202a5d3', + merkle_root: '4e652262ca1a525c3834fd65c0bca65ecd21bd74e575d40276b7e64114648903', + reserved: '3e49b5f954aa9d3545bc6c37744661eea48d7c34e3000d82b7f0010c30f4c2fb', + timestamp: 1540951359, + bits: 443296280, + nonce: '426abd0e04e6e35637fe98875d814bd9ac3d9b720a701af754b017cf1a3c2c7b', + block_height: 227460 + }, + 227745: { + version: 4, + prev_block_hash: '0000000000001ddb9ff9f88b5a53f4b127536445a7e9ca19bc1a2fdb9142a1c4', + merkle_root: 'd6f6cb25d78af7aa469796c34ae7d89ac74523f2f118fabda14a5f44a2bc3da0', + reserved: '03660c5b652e464c4064ac3aac7872edeb1677bc2f6da1d138415e55d433217f', + timestamp: 1540969035, + bits: 442237262, + nonce: '0000000000000000000000000100000d2aaaaab60000000000000000400b0048', + block_height: 227745 + }, + 234776: { + version: 4, + prev_block_hash: '22b1c216883cd83cc70e30f8ee9c629cec087fabd4ff0ede7c8c6c3c88c66241', + merkle_root: '474d4204e182f47dd644552078f4b92b27844ef1f3a7812858e2754c72b5a92e', + reserved: '3aa697abcb46590269facd13d88ee584277a8cf6b7cdfe7f2af843423eaa1a59', + timestamp: 1541404522, + bits: 443308551, + nonce: '0000000000000000000000000700000c89d89d9b000000000000000017020060', + block_height: 234776 + }, + 235891: { + version: 4, + prev_block_hash: 'b881b682153672328d3a08d125d87b7249ef6fc0c175e1d6ed47f3841465ba56', + merkle_root: 'f12497fa17fb7d15495d756d39259c91eadac0d35680f210e7f8f346b558784b', + reserved: '420d035e8cbc6f8fb4df61165dcb96a13c4d89d98957ac9b2236f6ef9141d043', + timestamp: 1541473180, + bits: 440610314, + nonce: '0000000000000000000000004a68466ebead9a3e3673fb726af060f5ff7f431b', + block_height: 235891 + }, + 237054: { + version: 4, + prev_block_hash: 'fdbc11bf524cd02834308836eadad269cb8e82b2e90923310be4f1c1fced45d1', + merkle_root: '700f6c1fe18362865f8ec3c4a917c11d930a1157639268f91721bf2f526ad3ec', + reserved: '17253a7863d32e0c02e0d8a5f836d271eb291df9b3ccf35b08674c4682d6059f', + timestamp: 1541545865, + bits: 443504425, + nonce: '000000000000000000000004000000012aaaaaa8000000000000000092f8ff47', + block_height: 237054 + }, + 242452: { + version: 4, + prev_block_hash: '3c802d55259d821fbe38377f6c17698cd99a37777e4303f38d9a40a46f12f02f', + merkle_root: 'aa8b652f96a77b2b68e80c629540e84483e99dc974ab9c7f86f85995c0fce1c3', + reserved: '0d715021aec35fc2a7166c85ac09f3db5afa07627cbb539ef905d4c23e11a95d', + timestamp: 1541879912, + bits: 443410198, + nonce: '9d92480a0f5cc5fd9898ff039099d236bde2e795f1089a7659feffb81a373405', + block_height: 242452 + }, + 244971: { + version: 4, + prev_block_hash: '00000000000030561593a668904317094193a92c84e6edfd6177bc6739170e64', + merkle_root: '66a3886c735fa1df678ffb3528000b03236da20aa5f40bcb3e13d8ca1948a9bd', + reserved: '4db31350371cfa4c681aa70ac8932bff0d0db960648943f373285a50bc7e76a2', + timestamp: 1542034731, + bits: 439625053, + nonce: 'bc44154249cfd95cf1f940282bbaebec577c5d4ac2e596c939a166f71a3b1b49', + block_height: 244971 + }, + 252211: { + version: 4, + prev_block_hash: 'd2ec92976494f5ae5e96eb16c0545a3e808d6f19271a8d37b6f3c1e6c0c28420', + merkle_root: '029c0f98aaa575c053ee4b2537df1f4b305055d17c53b1c45ee9f0eac39cbd03', + reserved: '2588c7ffa0add69ab7c643b4e49297170ddfb88f21732b1409019820b4e4ec7d', + timestamp: 1542483192, + bits: 439022133, + nonce: '512f0dbbcfc4c0000000000000000000000000000000000000000a7e31010040', + block_height: 252211 + }, + 259234: { + version: 4, + prev_block_hash: 'cf8657320d49f22973e12a39417181a87c665655480e349cc1fdc200837ec1cb', + merkle_root: '8e69611b162b5b193e7f88515abc18a2891e0df1f7647fbbbbbe718fdd8bc743', + reserved: '6ab4b390a9e350635cae5b8ee1e0f80feafac6be918e1d757f4ead883ededde9', + timestamp: 1542918490, + bits: 442395265, + nonce: '72ef108abda4d64d33436477edd2d9b9573381f735dadabcb53b32181a427cd4', + block_height: 259234 + }, + 278293: { + version: 4, + prev_block_hash: '7cc46b8cfed0d38c38c90c6f2796f28e5169b0edc11ebe9618736e2ecd1449af', + merkle_root: '70d76a130834e9f0e7d783aacaf95cfa22c1e1eed2e1b43623a85aab95dc5305', + reserved: '3028808af0a470bbfda55770496b04fb5f0066e267129e6000061bd9220452a5', + timestamp: 1544099814, + bits: 439240823, + nonce: 'bdbdda7b5c50f8ce835c517b89d0c0ffae4be62fa9206575be117cf41a211c8d', + block_height: 278293 + }, + 281652: { + version: 4, + prev_block_hash: '0000000000000212f89ccb8d4ea58407f866970dd652f6bde1dd7672649b3b6b', + merkle_root: '1c47a3ee4a6cd5d929132079b08dd70fcd307869f12d454df8256e45d62b592b', + reserved: '63ecd5bbf479b9c43f8660f18f0a2e1810c4b23f67987c142a17e8bfceb62a09', + timestamp: 1544308438, + bits: 438532298, + nonce: '0b0e1c60294ec0000000000000000000000000000000000000001b3c5b1c0050', + block_height: 281652 + }, + 306015: { + version: 4, + prev_block_hash: '2198e2802ecd8236761fbae90e3fa3121429fd6f70dbc7784cfa6b18443e2b0b', + merkle_root: 'c3ea380a9ba1a965bdbe08ce3f846606fb7be9bab2f2f553b4eb23e90e2dcf06', + reserved: '0d364333cb4e8b79b95d8101d9fb545d22966ca14dabe5729bbdbc5988ace1e5', + timestamp: 1545818805, + bits: 439682640, + nonce: '51b006e5752179d3cc8d5232917ae62923000a794991073cb569a0461a36b9eb', + block_height: 306015 + }, + 306601: { + version: 4, + prev_block_hash: '0000000000001db7c3b9e8ac2b83a41cf244cf90d715351d38d8cae0af73a3a9', + merkle_root: 'c4be8ce7d52773045d9d9e1779467bfc7c5d6e350fa31431a38589f7e359e6fb', + reserved: '35d3c467994fafb1fed7eaee4e3f72aa069f17fae15eb3efa5b14290122a5a71', + timestamp: 1545854868, + bits: 438451617, + nonce: '0d31ca0dad8ab8000000000000000000000000000000000000000a5cce1b0058', + block_height: 306601 + }, + 306908: { + version: 4, + prev_block_hash: '0000000000001318f644969abfb7108d427a8d3b9d104a6a13502791c37b83c5', + merkle_root: '48622886bd580d2c71d13035c8ccfbbe2b7229b61e7d2edc30680b1f5660b6b8', + reserved: '4535236be79cebc398183aa12d4847c950b1fa5b7ba2a0193d750bfe7a59fc75', + timestamp: 1545874099, + bits: 439097777, + nonce: '9c4408d95f60a00f76717d194deb5111f73945992b96f4198da84b801a2a435d', + block_height: 306908 + }, + 348160: { + version: 65540, + prev_block_hash: '00000000000fad425192463a81a078c0b597a8839401c663dfcffedcb6bad545', + merkle_root: 'ead02963fe9e05d952ec79a9a3b9584c5ce5b59483ab2e96d4e16c93bdfa9e93', + reserved: '049b60238cfa4de2a03471a28bb748f035ff05eeefad2d6347b9db6a92186780', + timestamp: 1548430997, + bits: 455239932, + nonce: '0116b4f822f0e4e194ed877c7bef0e18dc6e235661156dd8fac5e0e61a1a0214', + block_height: 348160 + }, + 386897: { + version: 65540, + prev_block_hash: '06c5e26b43fd2ae8b5b8f65baba46059f848d007e7525686efdd812e645d55db', + merkle_root: 'ec2604447978167cf4db79741af9c81c18a059d26bd914f57d109a9000bb5584', + reserved: '44b4c417a9f41372400956379fbb8a1971435b3185e107e4e44ed449808dbca2', + timestamp: 1550829949, + bits: 455102411, + nonce: '7ca7748120062bc12485cf4d7f257dbc4ab0a8e795e5a7a332d991181a26fb44', + block_height: 386897 + }, + 406622: { + version: 65540, + prev_block_hash: '000000000001c24066e999e015033a6dae531ef527120ea1440c7d861173776d', + merkle_root: 'd8f3b2e956b9a423e7d5cd2609de3115bc252f262b91277601ca46345d575642', + reserved: '7126923413da69c3fca3a7b0fed219c9ec0d230c7e82e3a5a32d73c2a133cb40', + timestamp: 1552050935, + bits: 455285097, + nonce: '15d712e4447801c7e079fc7753921acefae403f2ea9fef5ee7347b5f1a2349e3', + block_height: 406622 + }, + 437992: { + version: 65540, + prev_block_hash: '0000000000185b42aa6d736037175e351da9ac23ddbaf1051430535fa3c57f6b', + merkle_root: '55c7743522b55255a4393116d4621ff94e0fc379c1c446d672f08d1243e6d67f', + reserved: '2fcdfb20e2cc0d6f47549babd5508b4cfd45ebb7cef50567897304701c4e895c', + timestamp: 1553993783, + bits: 455151085, + nonce: '14482879a673a8000000000000000000000000000000000000000002d35d0028', + block_height: 437992 + }, + 483691: { + version: 65540, + prev_block_hash: 'c51a877c6b6e3753b999860ccdd875da0969037ca44b209ac3122966a11410f0', + merkle_root: '6fe42f5b877721446a41154cf060c1036286deebb6f7a9cbb8b35895057e6a0e', + reserved: '0b833ddc73375f170464136be5260aa85bbb0203a6253abd2344af36887d1d19', + timestamp: 1556822760, + bits: 454539057, + nonce: '18652c401c1c7b0de83598ec2fe149ae52828b239bacea73b8c78cf11a1b11f0', + block_height: 483691 + }, + 495970: { + version: 65540, + prev_block_hash: '00000000000385d3ed3dff2725156d5467c0a8a541d51a300170e769665bc2b7', + merkle_root: 'f9cd12a66a029ec0951b3b4fc97d3dff18524de3defa2756ef4146527fd7c4d8', + reserved: '6a93f4bb8a6de5a6d29bb4b60584a99851048f0c46bb81e7b1942c8ffa09c615', + timestamp: 1557583411, + bits: 454586150, + nonce: '74c42bbc8d01c809c26c4c35b3a0b849d107391a58723fdf4512e38f1a1a0897', + block_height: 495970 + }, + 535433: { + version: 65540, + prev_block_hash: '5722c9508ffdc37ff01b14769b38ade8aa123a2aeaa1cb37c4cab32352318c4c', + merkle_root: 'f8981868664a2a70479fe71299b9e5bb908695dd745d4f03f56708a76ae99539', + reserved: '37dec0235fd628ab5ddb0ca75871bc9aa4ca0ec5cf774ea57d179bfb18190384', + timestamp: 1560027306, + bits: 453752926, + nonce: '30ff8eea7923ec62afbf0e9b80450579484e92a3c6b25723190cf8c21a178af9', + block_height: 535433 + }, + 560592: { + version: 65540, + prev_block_hash: 'd18a9891e1f6cb45c9f4aed1f7e9152e5eccede6cb454ef1b7d7b5aa39d8870d', + merkle_root: '4aa0ff1cd6f42c4d186de26679b28f889d7470fca1b5c71682e78cca3d78fdd3', + reserved: '5e3fca7f6a0d1e1bd59ac361528b430555fbd63d54d9d7fcdf2e0ef4a3387a4d', + timestamp: 1561589461, + bits: 454197658, + nonce: '493d79d34f2a3ffa9932aee7b0b8be39714935cd6eda1ee19caf53591a166c6d', + block_height: 560592 + }, + 573698: { + version: 65540, + prev_block_hash: '00000000000170a244a9e8f34a8eeb29578c8c59bca943f4b797b093b29ae6e6', + merkle_root: '3b2e3653002237df6d124c2b266857cf24a2afdeedc01d2c42741ac008051362', + reserved: '1995996cd85f002af413c2a1c93e4de0682ef02648b02c9ea05744da567d5eaa', + timestamp: 1562401261, + bits: 454091321, + nonce: 'fab3e7270ed5c71dfe97fdfc4525c2f909f579cc82219a46a59c058c1a1e05f5', + block_height: 573698 + }, + 589774: { + version: 65540, + prev_block_hash: '93f7cc04ddf0356f0f35c6a4db3dc5a2e20df47444ee96c5c2b504de85331228', + merkle_root: '1e5cfd67b677940a0bb0d0b8a1f98a3c2346b91407c5cb6d858bef54a5ba849c', + reserved: '33c8688af65b057c09a20d204e67960dc57a59ec93185f9eb3f85ea9a457e9e3', + timestamp: 1563395594, + bits: 454060979, + nonce: '592bbc966023eed81fcc978c70f7bf3f7fefa9a62ef6bbc5be5eb4871a26a4f5', + block_height: 589774 + }, + 594920: { + version: 65540, + prev_block_hash: '00000000000f2c86f69bcee262389da853cab5d24d37af93ad2784186fc6f036', + merkle_root: 'e746a8b8ecc8fc9d18758adfbb90388f1652c2b16b80d7095c14b07a4213bd82', + reserved: '1ffccde1aa3e50b9394993a6e903b2f062b2fe206eaa36b645453e0230d257b2', + timestamp: 1563714501, + bits: 454278286, + nonce: '25d548bf593906d5d096755827776ce091b63f0768397ba0d869736c1a1d7479', + block_height: 594920 + }, + 611093: { + version: 65540, + prev_block_hash: '00000000000561fe592cfd660a2e7a4edf89060fb07843b0a79c27ea0573ebb7', + merkle_root: '4e5c4211c654a4d1d9be4e5d490b0cb9fe01d14ea34b33854554a074b87af15a', + reserved: '452afe71a2437f035f41949c0c5df2418cb3de8dd96d4b3b0d6c8a3a2cd6e5b7', + timestamp: 1564715660, + bits: 453989832, + nonce: 'd52482e70fa7e95791387b5df4f20012ee392878784193d8c03a15c21a15d4dc', + block_height: 611093 + }, + 627535: { + version: 65540, + prev_block_hash: '000000000013feca0a9fe05249f0bd17bd8237f0e5b758453007955803261766', + merkle_root: 'e57aab0fa56a99ddef6e25907e5353b3cc2dcec7779eba232231752c293e9062', + reserved: '480341da458afdc89cfe5b0968d5d0215b1a4bda1cbf249b18f971c392dd7564', + timestamp: 1565735013, + bits: 454492849, + nonce: '430ecfe82c158be9829c12990945fd64bea8a9355b40bcadb7124e8f1a196266', + block_height: 627535 + }, + 669688: { + version: 65540, + prev_block_hash: '000000000001283bf9823ae5f7f1235dfeb116600d6df997dcf95bb903df9e07', + merkle_root: 'fe0111d55ce6992c20e202daada71583682066c8fd7c341736204acce79ac7bb', + reserved: '6beaf6ec34b732787481f438157a3f6b7e1ade182885afe7c66c5daf4af56b2b', + timestamp: 1568347256, + bits: 454617207, + nonce: '847882af9696e3b95dcdda5c3737e43c1e4548defd28e519eb164e821a179ee2', + block_height: 669688 + }, + 681186: { + version: 65540, + prev_block_hash: '23adfa679054d24f99a9aedacc62495cc82319d51ff2db4365a6da764c5743a7', + merkle_root: '78339e221760bfdb6280b0e61fecabedb28124b78ab0d24f1b99021cff0007b7', + reserved: '652665f14a37f25b800c32d382560b44b0f523d1a3ea6f4cc673aabb6f113b76', + timestamp: 1569058559, + bits: 453574073, + nonce: 'c1303e161f5172a2a046514f9bbce0033d48584acbed2eee7fbd6f161a1188ec', + block_height: 681186 + }, + 681537: { + version: 65540, + prev_block_hash: '637f86197417ff597750912ee0a85825748d8a255f8fd4d95deebf49aa5b3e47', + merkle_root: 'f79518dd30f45ca2c9f9e693e24122781d51a668abfeb4940f7ba3f5a1de3180', + reserved: '6c55d4a1269113436adc0fc14526d422c0f2e6e99de82d762bc55a2a6907c31a', + timestamp: 1569080786, + bits: 453882203, + nonce: '917b818ff6fc8a5b812d09b48f1cfdd3c54f8725baa16b82fab0aa561a1c0b23', + block_height: 681537 + }, + 694383: { + version: 65540, + prev_block_hash: '6063062e1a5eb6ab39c8e38f021f0bb44ea8a101b8b4af158c07d58c195e183d', + merkle_root: '0e255399678fb20d9a1d05ecc44ac6ea611facda034847bb8513a4df866fd318', + reserved: '2e8ea8ab1c8de07b3a7835cb15d17705ca9d08c7f7b0f6b51579f76f174e1c3a', + timestamp: 1569876424, + bits: 454290557, + nonce: '82fdf4375a6029900226217c38eff35bb5b68e954b4a19dccd65713c1a22208b', + block_height: 694383 + }, + 697581: { + version: 65540, + prev_block_hash: '0000000000006e456d9ec2a5a0cf678d1667df9512bbf8323835c57c6e0b424a', + merkle_root: '021720c5fb2b86d00052fa7c207e313b8171086ec50a2a08d67de42cb1049096', + reserved: '1e88219a36a8a90efdff5b742f27c0e1c8e7ad0fe0624f4eb542de25c3d46cb5', + timestamp: 1570073727, + bits: 453783308, + nonce: '13769f33245f0ec82910784f6a2bd601f30680968aa7451e7052598f1a168a28', + block_height: 697581 + } +} + +/** + * This array represents mock transaction objects received from a call to listtransactions + */ +const transaction_list = [{"height":697581,"txid":"838e566eeb8173d8401e95c6776393af8afbfc9616ac1cce142451ad24fc7f47","raw":"0400008085202f8901930cfe74e956e1928291c61cc4e6d9b9bcc7ef53d4ad508de4abac21b290ccc4000000006b483045022100ff717c5ecd3f3247eb5ba79735898cfab86a6a906088ca9970f41137138815ae02202149c0537841f6c92a11ccb39dab3eb2e1c723c8c8f490ea4287768d7fc286d101210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff020060343c020000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203db6f0203eda40a204a420b6e7cc5353832f8bb1295df67168d67cfa0a5c29e6d456e000000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf0000000051a50a000000000000000000000000"}, +{"height":694383,"txid":"c2cb4289ce998bd01852c8a2d2ae05d8c13adc165e4d64072102ee7cf41d3805","raw":"0400008085202f89012b73fb7eef960ed9b683edb6ae751ff44c9864e87fcf5a425ea2e07b1f6553fb000000006b4830450221009309ce017a84d852b000269d55d7d051f0de6406706f2c8c337fc6947a32079f0220229985fe80633eb7217b198e196054c8f47a31bdede1db721f58d46e17351d5d01210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff021e9009de050000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c52039f8509036f980a203d185e198cd5078c15afb4b801a1a84eb40b1f028fe3c839abb65e1a2e066360210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000d3980a000000000000000000000000"}, +{"height":681537,"txid":"98969d100b47a358b97d444d46f6b03f7571911720542bac4cbd96d423155330","raw":"0400008085202f8901e78b48dd30ee88165f75539e788cb9fbb9c35614646bcb1921b94dd7d7db3e9f000000006a4730440220462815ce7247c4c8fde691fc5188b3fea93089601317e2b859667bcaf6992789022078796ea7fee57111bff0f9f5a145bf9dfc9ccfb7db4882c2bd921db6ae3d272901210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff0278945be9030000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c520311d8050341660a20473e5baa49bfee5dd9d48f5f258a8d742558a8e02e91507759ff177419867f63210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000a5660a000000000000000000000000"}, +{"height":681186,"txid":"04d172cc9125f05f91ef4a2d1548e7c23e24a1a84944f64cd794b1996dd4b347","raw":"0400008085202f8901e9ab29ae061789f959f134055ce066711518f9582bfbf391ba9c9c0d294d2b18000000006b483045022100cbb1fbe33a4c0722adb9868f64e6aaec09499a7e3b9f36675654ec903b08016b02207973630e9de7977fa035fe519a7be5cd20e9bc76dcb4e13c3d06baf9629db92c01210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e0716878040000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203f3210403e2640a20a743574c76daa66543dbf21fd51923c85c4962ccdaaea9994fd2549067faad23210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf0000000046650a000000000000000000000000"}, +{"height":669688,"txid":"b5893206c154252399f713b453bb5f148c25623bab15125f2b7179964c5215a6","raw":"0400008085202f8901be58226e0d9ef6712005282979ff73b0bfff1e3ba507fe10d34a83b43a2abed2000000006a47304402201e678e235b450245c40c14f27bca600495745310d20f8fde90e5e3d6cbb9aa2602201976b8950d11d9d7036e2e6128945246b34a014a2a73672ea6569f7eecbb078101210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e031d1f0080000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203ce700403f8370a20079edf03b95bf9dc97f96d0d6016b1fe5d23f1f7e53a82f93b28010000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf000000005c380a000000000000000000000000"}, +{"height":627535,"txid":"e4167bbacac6786006f6c9be83d79ba32fa4694b9b966780f4dcd68582076860","raw":"0400008085202f89010b16574966f76c39d9b3473adf41f45d08d7deae27db239e34d3021b22de9f52000000006b483045022100bff1160baa7be5daa7b3b2df3c1afb63316b8052dd4a90d96b0507ce3fc56d3602200cf1113832dd617fbcea2625861b092ffc8f0082b1db2778dc49e551a8f1637201210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e011343c020000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203f4c101034f93092066172603589507304558b7e5f03782bd17bdf04952e09f0acafe130000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000b39309000000000000000000000000"}, +{"height":624031,"txid":"fb53651f7be0a25e425acf7fe864984cf41f75aeb6ed83b6d90e96ef7efb732b","raw":"0400008085202f8901b0d149d8457d28de7082c14886f571d423c8c4223b1df629ea0e1dad9c1c4388000000006b483045022100b3f023fcd1b570202dcaa45b24822df9e3acd995ab08ce4f612c94e1a29dae1802205084aee13f4e73c3085e45a7e7eb7745a2a92c0d5fa7cc1e7e1b481d19892b9301210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff021e9009de050000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c520343a907039f85092029c09e54bfcc49edc548731960639989db0a2e82965f46125bec060000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000038609000000000000000000000000"}, +{"height":611093,"txid":"e06d5c69940232851b348f1f821902d93981d90ce4ecd28f73cb07ddf5aff932","raw":"0400008085202f890108cb06d4ce8c10288293e5c02365958e6c6f76241d7b50db08131ccad3111ca2000000006b483045022100dd59bcc9b1e0d3097c3164484d3cf50dd0de95f625e4be6a49480afa2dd840c402206908645d6ce5bca5674722a9e08c28b6e86901edc871143eec3f611d1d724d7a01210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e0414e5a030000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203b5ca070315530920b7eb7305ea279ca7b04378b00f0689df4e7a2e0a66fd2c59fe61050000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000795309000000000000000000000000"}, +{"height":594920,"txid":"dc55db213f1f056c3563389673cbcc33f0c8c92dd993f40a06757c3e6fe446b7","raw":"0400008085202f8901e1db1e9330a5650d987afc7d22882aff12c7ed015d3d0daa91aa454ed6e6132b000000006a473044022050c12544abd7f0a8dd059d7c7231cfb2189892c3351d872dfc43bff93531ee4902206609eda0710c59ecf239aa2a892a0ebc6acf318ad39366ca77b1c1b109c5ffd901210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff02e0c90c8f000000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c5203714a0603e813092036f0c66f188427ad93af374dd2b5ca53a89d3862e2ce9bf6862c0f0000000000210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf000000004c1409000000000000000000000000"}, +{"height":589774,"txid":"726b4c39249f4ac3e786a64c813bd00f9a3a92316717455d9b7371967bcedc71","raw":"0400008085202f890199fb95f1a34b745e0854d30d4d1800eafa02f667da4d39fcdc21cb0878cf0a89000000006b4830450221009c57bebf651e047a00c5d94bbf7f250756a794087805ac623e157ad5c0cd48a8022038e9e5530004cc7cbe0bd0e44974f63d41fd78345b4ad55da4c65d8ae59c248201210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cfffffffff0268f5191e010000001976a914fa7cce13f7c9eb41e305736736343c59e4b3c38988ac00000000000000004f6a4c4c520381f00603ceff082028123385de04b5c2c596ee4474f40de2a2c53ddba4c6350f6f35f0dd04ccf793210252a0a4424b5e7563571ab858478f20161a54af22146615a42ea3ed8616fb81cf00000000320009000000000000000000000000"}] + +/** + * This object represents getmerkle call results, using a height and a txid as a key for a merkle root object + */ +const merkle_roots = { + '9f01c1d5f7fd67ec40d45e3c81006e18e6239a3b54d6a78e99c2c28cc3915558-204832': { + block_height: '204832', + merkle: [ + 'bd051b6e52ccde1608202f017e9616f973c950aeee3ef0049b425ef505ed5e0f', + 'f8fcf39876b5d668345fe13129edcaaa6f0822994cb20aa4bd24d9b641f93ce1', + '502eedbd49c4ee7edac284424e712a7f4b41eb7b34cfc74e16ac802640fbd806' + ], + pos: 3 + }, + '0ac42a6511b12c14d6bac0d4846de17a380e2b251e3a0b0f938e635581094c27-225156': { + block_height: '225156', + merkle: [ + 'a0e061784f132cc6d426c3b9e855e4fa75610d4c22bc91775108cede81ca4bcf', + 'd53abb5803b6e197c0409eda1b457056c2feefee3e066049bd28e3933af3c3cd' + ], + pos: 2 + }, + 'e6ba7bf531dc1ff0ee3ca7182a9887af1c09234e60f9bb761922ea11729b926b-177901': { + block_height: '177901', + merkle: [ + '10c8d384dd8d12a21b9fae0eff31b829afcf9e258129935490ef8785e56565ba' + ], + pos: 1 + }, + '5a04a9ef62b67455ea53e34fc96645fa797efc1b13e8e6fb2121c970779dbcfd-483691': { + block_height: '483691', + merkle: [ + '9b2460ee033e347aca56b56eefcf222898a979999c99ae78e504ffe9314faa99' + ], + pos: 1 + }, + 'e17956cc1d6b545f0f8dcea46d50ed0d7de853fa7b994014505b046de23d6a2a-244971': { + block_height: '244971', + merkle: [ + 'eb7b7ded36d747f783cb68390070d7bb96d304037e8d8c1ebb362aa5fc9a13e6', + 'b646eeab51474728675e747052170feec6467908679f43f4b156907d61c0a989' + ], + pos: 3 + }, + 'a2c7e2c19bb731ddc569067b7a1c86543651c587ea277518890875e19db4c1fc-535433': { + block_height: '535433', + merkle: [ + '5186acb42a79b837cb83c228474aee506afeea5bfadcb02ac13c5199d838798a' + ], + pos: 1 + }, + 'cfa84868e18825fe626f6ce805ee506ec266e61dfa39ed6d281e037909f480b4-136264': { + block_height: '136264', + merkle: [ + '4908b8c870250eafa03b3e41a4d36789ab6c65dbafab9912a94d013bf0d215a4', + 'b7e93060541e9f4a7b6adf15e635936b75d91dd51808e20aacdb05703089e83e', + '52301e95fda418bb4f7596d9326b2033a61bc695f57a0412123ff8e90ec5bff6' + ], + pos: 4 + }, + '83c6e70044f3fcb8cc352b3573519419c27430d799bfd0df8a2daaf80bdee2f1-118329': { + block_height: '118329', + merkle: [ + '373ebff5208dc1ad5c48d321a39db2d9a9985693ec7d2b554912e3a2f20e36ce' + ], + pos: 1 + }, + 'acab6ce7260def05ac80ba3868226637f2fdf15d01fa6eeb90af32f9d2c29c85-237054': { + block_height: '237054', + merkle: [ + 'fb80d172ee06a6a788dc066ca1b2d3706564e03c260e9bd04541dde5cefe5e58', + '3d500987c890c49e4836678d9af282d040837580a97ae168aa21958f7ee3e02d' + ], + pos: 3 + }, + '24e58441c79b87fa8ca9e547ac2f46a7478f018f45aef2af57ab9e90ec65f6b6-235891': { + block_height: '235891', + merkle: [ + 'c6b2854d222476919ece482561c2f681bf6d477229ca847197fa9f997472d675', + '7f08b838b52d022f509d66de20459658a969332109f770ae3dba13a24fa7aebc', + 'b4049e0d46e8b2f5e58ed7d72e9d6f350f5df09d6d1b7fa0e4768008edbcbcff' + ], + pos: 3 + }, + '390a41cfd03e4381986178f608cb6c93b815554b14b49c6f0bfdc6e8e3f03fb2-227460': { + block_height: '227460', + merkle: [ + 'd1a529ec042617554a7668c6c9688174a248cbf31625e54fa9ebc1452cf2f2eb', + 'b512273b75f831d8e66921ccdb206c01793ef84b49431930bba007058352fb76' + ], + pos: 3 + }, + 'db5a675f84ee26ffe35e2ee03e83fa910193e88f79566ee71af5c837f9a77475-169466': { + block_height: '169466', + merkle: [ + '462c008d78281f9591f7ee599bef95d16a1c48cc14a70cde39c490807377d72e', + 'eb561696dab6912703a8858c1c894b595a640a6430766d573e2651847732847f', + '9e62cfe81f3df5311b60596007d3686e53ef4e7d41446339e56d9e881e0a8043', + 'fd9409d57ce1836de6b479645fdc30739124d9dd2177c3f43c82c7719ca49626' + ], + pos: 7 + }, + 'af70b16d34fbb82f414ea271ea60e984803f16fb59ae4637ea6cb8cb52168889-168833': { + block_height: '168833', + merkle: [ + 'c7f1432b9f7f610ac4e432ca30bf91ff5f3e23db3c96f9412e3dd4e230c5be1b', + '06f732224f82b6e39dae394addc800f2afa8b9bd88ae00746015da101bd021c5', + '749801276141d1bc8a739e1f4e6f0818571a819b35856a90dd537b18eb561ba5' + ], + pos: 5 + }, + '31d95d6e686d9dc7515f9d6837f52df35ea58349ed88c6f28545fcbdb73a8105-348160': { + block_height: '348160', + merkle: [ + '6ac85f2a820b38843fec9e24888b6241a809da111067036a0209a5bf0f9a7f9c' + ], + pos: 1 + }, + '0eb31e6663f0e2c395bf475a464eb5cb850c19a4837b3ff2ce376d545c18483a-252211': { + block_height: '252211', + merkle: [ + '935cbc48d0a802e669dd6e649bd3206472717a68c8d00d35834b1008562b16d4', + 'e5f13903d184e5e0e5ed7261f293cf3b74169dc6eb671668879e88a917794b02', + 'd07102371a81d823dbec8492d406aa1b770d3d49aaf975c2ea329be03e4c3b4a' + ], + pos: 2 + }, + 'af3a49c449574036944ae536b9cdee0281f021ce2fc5b1461fd9867380494c21-150213': { + block_height: '150213', + merkle: [ + 'bdfd68cbf7cfa56e49409c48876c1129c0275ea823b685c39e516aba4327851c', + 'a3c3869a0a563e739ca239199727bbe8b3173689a2ad6e0b480db1de698513f1', + '4bc44f422043a04b39316b6b871e9a67abd5c68b3b4fa1b5e58dacfc29f7d67a' + ], + pos: 3 + }, + '04d172cc9125f05f91ef4a2d1548e7c23e24a1a84944f64cd794b1996dd4b347-681186': { + block_height: '681186', + merkle: [ + '69b8c1c4f03b7c005ef4be62b6df9c075f0074ec8fe006d1118b2f3c014cf68e' + ], + pos: 1 + }, + '580b6a5ee8a1197c28c9d14ef3eaf4576733caa288e5ded69a2170c434e83c23-259234': { + block_height: '259234', + merkle: [ + 'd7c4a540c17c1eb975225afa887841f032cd69c85ca8785b5c08a4d3d009c4f9' + ], + pos: 1 + }, + 'b14fbd65a854c34fe67dc5b57f30df9aac558950f6db95b805587d9add3e1a89-573698': { + block_height: '573698', + merkle: [ + '33857714a1bda0101ed423ba4b3a9ecf73c8eb09782180f3f15e5fb9fcd08a8b' + ], + pos: 1 + }, + 'a1e1902d9fa018a2f5b0d55ff2d91a95c21eae1f3a48778445208161d1b76c2b-386897': { + block_height: '386897', + merkle: [ + '045f2793b0f5590c94843637e83e8f4cae6556714c1fa24dc680017cc019dbee' + ], + pos: 1 + }, + 'd52ffaacec24fb10727dbd20332797f65c09d20319c2cfeee169853ba8e71d54-495970': { + block_height: '495970', + merkle: [ + '21aae64997e0875fcc907519b46fa349443d0a3b5c6f99f59dd96fabcba827ee' + ], + pos: 1 + }, + '74e69be3010b31b16cb9a4c0c06a964b58b72eae1da0ad8a32bbd5f1dd0bcfcb-437992': { + block_height: '437992', + merkle: [ + '74e69be3010b31b16cb9a4c0c06a964b58b72eae1da0ad8a32bbd5f1dd0bcfcb', + '09cc5b331e9a4cbdd90ad80b55f0318b9b3a40d14fa82dc2e0ef3c53e2ec5e0b', + '38e0ba5b51d04d3931c1fd68f82945b948d5499df778f4a84a208d109a880d77' + ], + pos: 4 + }, + '838e566eeb8173d8401e95c6776393af8afbfc9616ac1cce142451ad24fc7f47-697581': { + block_height: '697581', + merkle: [ + '7be3668c4e7afed75507832f1568998a95bf8b8768b43b83fa3db250feb0c0ec' + ], + pos: 1 + }, + 'b5893206c154252399f713b453bb5f148c25623bab15125f2b7179964c5215a6-669688': { + block_height: '669688', + merkle: [ + '4b76ba56386b96370703ed10734601c247e2459a01b00b6ecbb3c040f772746d' + ], + pos: 1 + }, + 'e4167bbacac6786006f6c9be83d79ba32fa4694b9b966780f4dcd68582076860-627535': { + block_height: '627535', + merkle: [ + '526a601b48b7bb2ac8c4f43ff73b1dad03ae500acaefa085b2d38091784006b5' + ], + pos: 1 + }, + 'c2cb4289ce998bd01852c8a2d2ae05d8c13adc165e4d64072102ee7cf41d3805-694383': { + block_height: '694383', + merkle: [ + '24c50f0e895888273ac8f51afbfdd834c83405ce55290015c77fe4a63f3d0094' + ], + pos: 1 + }, + '98969d100b47a358b97d444d46f6b03f7571911720542bac4cbd96d423155330-681537': { + block_height: '681537', + merkle: [ + '68b200b9ff410107d940aa0fdc57921ee1f9240bae083a8c6ca24bea4e269d5e' + ], + pos: 1 + }, + '9eda91b6cc6389197cc3c56d81dc31959a4748a779156372e468b1f9db16c61c-306601': { + block_height: '306601', + merkle: [ + 'bd8cd8c60434d7306e0e45e55cf0019301e8ae63a1c744f6136bc8699c8040ee', + 'e34a018484b9fc9adf6d54fd3b772c5a8c12ec59b2c51ef7d78712989fec8172', + '7bc2233083af2a2b28f735416054bfdc0b24699e94a3dfcdc180eca65e7fd2a8', + 'bb562f8d423ebb7dbebb06b1a5ef8809a6730648cdc6b5e1aa9bbc654a391f06' + ], + pos: 6 + }, + 'c0d3f80b0a98bfeb3ce8eef6eeeedec48eb5e4f8ac022a5995e8adce8d18358d-306015': { + block_height: '306015', + merkle: [ + '74990f6ede32f8efe44402bd8e76d7ad5f44a5e3a3860d18cb9cfbb0cfa167de', + '77384278840a3842606074257b4ea44f17f52207f1c04b1acc8883ddf89922e6', + 'dee0f230e3e8f97e9c769b4fe0a64f67a3975ce349d48c2e98f5a5ba43cad124' + ], + pos: 5 + }, + '93994e51e33c82d14277942031c08a6bfb20039f06c3d4f41eb9f88d8a960379-204693': { + block_height: '204693', + merkle: [ + 'c4c6e5a90cf6d7f5e533c375cde0b4dfdd5ae2de8529011b421723fb74f3bff1', + '8a9c1380830c132aaa80cd4b76be1d1fcdc4bd31ebca65f57f1e7ecfa43fe3d4' + ], + pos: 1 + }, + '9de6831620e895832129abf44e56e1169c470f8b42dbfff1eefc1c6213d21c84-281652': { + block_height: '281652', + merkle: [ + 'f39423026bf07605978d97d544de06565ce7f954ffd011a6e4179260b8a45652', + 'f82994bf9d0be04d744a459d7d851a0c2b9bc5819097c8c3b86b796a3c7609fd', + '39b4764d8de890571cae50af2012694d6087086dbf516959e697c00366f846d6', + 'c1458147bfa11d90962b2641b3c407cd8ef033d1f63035248894053e2ec9084d' + ], + pos: 9 + }, + 'e99b94e54dd788b2f570044bd1e2e8c877b56efaf589287a4041ff3852a70abc-234776': { + block_height: '234776', + merkle: [ + 'a76e6729d8635b4fc45cc1f475175e0fdffd0678a665bfb05aac42f1a1b3f304', + '65a46b9994b2b844185b2ecbf4d8c2f9c206bc924baa1568605bec3329ac2f76', + '5714433897287ee80e16ecbb80d2ea2a2baeb90f5d40e3113772413963be8498', + '7556b7ffc4bce5d280a6ac16dbc205a88e588194c3d204f9239b5ed11a36fa06' + ], + pos: 8 + }, + '4d715a5765cf5eb32422130ccbf919c5bfb787e3e781430b859f16d91154862b-204935': { + block_height: '204935', + merkle: [ + 'cddd27f69ba9794d839f78986392af51e5c539b21775f0b95442aa84a8a3879e', + '617b30f3a952dab3a49d9daeda90fbf259fa652e4b50327c6e054bdcd03ac878', + 'e44194b6be048a6b50da051e448190b437d1a91162915081ec0f8e4aea171b07' + ], + pos: 5 + }, + 'cd4d361c63b006d94f089afa2caa103495b39b1b7439cd2f2d4412fe8b0ca849-278293': { + block_height: '278293', + merkle: [ + '1ef6bc33e1fd36d43ea0dba5ef1addb2cdb8b154f95b6b585bf55940f44bdc7b', + 'e5f95f9e2542b7cdefc689ed0cea47d8417ce2b1cc748b65265fa896ac2cb825' + ], + pos: 1 + }, + '6c609613ea6bca1d87482a5dc6b24fc81ff780fdaf285f33e73259587cbc5566-167225': { + block_height: '167225', + merkle: [ + '6c609613ea6bca1d87482a5dc6b24fc81ff780fdaf285f33e73259587cbc5566', + '89f87d713c86eadfa9ad34f60cd433a572ada6baa37093120c4981f5e84e19da' + ], + pos: 2 + }, + 'dc55db213f1f056c3563389673cbcc33f0c8c92dd993f40a06757c3e6fe446b7-594920': { + block_height: '594920', + merkle: [ + '41656ea6aa6ce2dae3718b4692437a0aba9edaadaa8c3ccb081dd3b992e35493' + ], + pos: 1 + }, + 'c9b95c6640cb23ac166f4f80f1328bbf5af630ce5ad5d83ede4412556bfdf645-242452': { + block_height: '242452', + merkle: [ + 'c9b95c6640cb23ac166f4f80f1328bbf5af630ce5ad5d83ede4412556bfdf645', + '390634c499bc8423d0dc5f6273294672f84397fd553c44f373e61676a44cc5dc' + ], + pos: 2 + }, + '672956de3d8506d2d2b4c4229e1d810f2a52778f806aa003ef6aaaf9e35ccbc2-227745': { + block_height: '227745', + merkle: [ + '26b41a86e283522e05fbd8be0734ea4980a64bd018b9ee91d81ca65a13acca38', + '33cfaaceaa02e6c77c02afe7cb100210cb331c30eb65074d51cbb94d7a7190d9', + '2bcbe8cfeb4b47217b2930be2b70fd67f9196d8a2ee383fe5a00f3ae47f38ec6', + 'b7b6cb5d52f517edfaf09845fc5accc07df23bbae6bed8c356e64f165c032367', + 'af1c99cf7b3b04240d7b2712f44e3f4746968e003629cdf568de7f9543e499be' + ], + pos: 15 + }, + 'e06d5c69940232851b348f1f821902d93981d90ce4ecd28f73cb07ddf5aff932-611093': { + block_height: '611093', + merkle: [ + '3787f9a41e2dcc86d7cd07c2392cb9d0a81fe77377c05f989db88c9c4d476b95' + ], + pos: 1 + }, + '4ca8cb003c52f384cadcef864ea0d4208b24f5ff6348c37fbdedd165be70c368-560592': { + block_height: '560592', + merkle: [ + '4ca8cb003c52f384cadcef864ea0d4208b24f5ff6348c37fbdedd165be70c368', + 'a8bb7f0b9470647486aa09541857a95c7feed696a333113e04a66df83c62aa20' + ], + pos: 2 + }, + '519a72dc8fae27da1c6239b3609b8f9f17c4b7f184988bc91dd3a21d85d05603-306908': { + block_height: '306908', + merkle: [ + '519a72dc8fae27da1c6239b3609b8f9f17c4b7f184988bc91dd3a21d85d05603', + '4b12342408a1ac25a4c2b70a14c5953ac17d3759b55c73692316ef833600c739' + ], + pos: 2 + }, + '1c9b0df6dd6820cb962ac2f375baebefbac751a821254d3ecd7cacb7c7aea405-406622': { + block_height: '406622', + merkle: [ + '432f7ba740cfc01f3236147b331619794b775122faab9c9883939c04960b6d3b', + 'a38a51a734b41fe72ddb434f82da6fbab55eb59818f7b22816e20263709b0029' + ], + pos: 2 + }, + '726b4c39249f4ac3e786a64c813bd00f9a3a92316717455d9b7371967bcedc71-589774': { + block_height: '589774', + merkle: [ + '24f3dfc76a487100dfde4d526e27ffb1d36bd7b6b9a956485ab0247cc7ffce1f' + ], + pos: 1 + } +} + +module.exports = {unspent_utxos, gotten_utxos, gotten_blocks, transaction_list, merkle_roots} \ No newline at end of file diff --git a/__mocks__/react-native-fetch/mocked_results/estimatefee.js b/__mocks__/react-native-fetch/mocked_results/estimatefee.js new file mode 100644 index 00000000..807fefcf --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/estimatefee.js @@ -0,0 +1 @@ +//TODO: Add mock for estimatefee \ No newline at end of file diff --git a/__mocks__/react-native-fetch/mocked_results/getbalance.js b/__mocks__/react-native-fetch/mocked_results/getbalance.js new file mode 100644 index 00000000..37a51b7b --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/getbalance.js @@ -0,0 +1,10 @@ +/** + * This returns a getbalance result based on the supplied confirmed and unconfirmed balances + * @param {Number} confirmed Confirmed balance to return + * @param {Number} unconfirmed Unconfirmed balance to return + */ +const getbalance_mock = function(confirmed, unconfirmed) { + return {confirmed, unconfirmed} +} + +module.exports = getbalance_mock \ No newline at end of file diff --git a/__mocks__/react-native-fetch/mocked_results/getblockinfo.js b/__mocks__/react-native-fetch/mocked_results/getblockinfo.js new file mode 100644 index 00000000..5b2d8e0d --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/getblockinfo.js @@ -0,0 +1,14 @@ +const gotten_blocks = require('./blockchain_data').gotten_blocks + +/** + * The mock for getblockinfo. This function searches through the mock block list, and returns a block info object if it is found. + * @param {Integer} height The blockheight of the block to get. If found in the mock block list, its info will be returned. + */ +const getblockinfo_mock = function(height) { + if (Number(height) < 0 || Number(height) % 1 != 0) return {"code":1,"message":`${height} should be a non-negative integer`} + if (gotten_blocks.hasOwnProperty(height)) return gotten_blocks[height] + + return {"code":1,"message":`height ${height} out of range`} +} + +module.exports = getblockinfo_mock diff --git a/__mocks__/react-native-fetch/mocked_results/getcurrentblock.js b/__mocks__/react-native-fetch/mocked_results/getcurrentblock.js new file mode 100644 index 00000000..dd97df3c --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/getcurrentblock.js @@ -0,0 +1,9 @@ +/** + * This returns a getcurrentblock result based on the supplied height + * @param {Number} height The blockheight you would like returned from the API call + */ +const getcurrentblock_mock = function(height) { + return height +} + +module.exports = getcurrentblock_mock \ No newline at end of file diff --git a/__mocks__/react-native-fetch/mocked_results/getmerkle.js b/__mocks__/react-native-fetch/mocked_results/getmerkle.js new file mode 100644 index 00000000..8af82fec --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/getmerkle.js @@ -0,0 +1,15 @@ +const merkle_roots = require('./blockchain_data').merkle_roots + +/** + * The mock for getmerkle. This function searches through the mock merkle root list, and returns a merkle root if it is found. + * @param {Integer} height The blockheight of the utxo to fetch merkle hashes for. + * @param {String} txid The txid string of the transaction to fetch merkle hashes for. + */ +const getmerkle_mock = function(height, txid) { + if (merkle_roots.hasOwnProperty(`${txid}-${height}`)) return merkle_roots[`${txid}-${height}`] + + return {"code":1,"message":`${txid} should be a transaction hash`} +} + + +module.exports = getmerkle_mock \ No newline at end of file diff --git a/__mocks__/react-native-fetch/mocked_results/gettransaction.js b/__mocks__/react-native-fetch/mocked_results/gettransaction.js new file mode 100644 index 00000000..7053af03 --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/gettransaction.js @@ -0,0 +1,13 @@ +const gotten_utxos = require('./blockchain_data').gotten_utxos + +/** + * The mock for gettransaction. This function searches through the mock UTXO list, and returns a transaction hash if it is found. + * @param {String} txid The txid string of the transaction to get. If found in the mock UTXO list, its hash will be returned. + */ +const gettransaction_mock = function(txid) { + if (gotten_utxos.hasOwnProperty(txid)) return gotten_utxos[txid] + + return { status: 'not found' } +} + +module.exports = gettransaction_mock \ No newline at end of file diff --git a/__mocks__/react-native-fetch/mocked_results/listtransactions.js b/__mocks__/react-native-fetch/mocked_results/listtransactions.js new file mode 100644 index 00000000..0c2770a1 --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/listtransactions.js @@ -0,0 +1,17 @@ +const transaction_list = require('./blockchain_data').transaction_list + +/** + * Mocks an electrum call to listtransactions, and returns a specified number + * of transactions + * @param {Integer} num_txs The number of txs to return + */ +const listtransactions_mock = function(num_txs) { + let returned_txs = [] + for (let i = 0; i < num_txs; i++) { + returned_txs.push(transaction_list[Math.round(Math.random() * (transaction_list.length - 1))]) + } + + return returned_txs +} + +module.exports = listtransactions_mock diff --git a/__mocks__/react-native-fetch/mocked_results/listunspent.js b/__mocks__/react-native-fetch/mocked_results/listunspent.js new file mode 100644 index 00000000..784865f8 --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/listunspent.js @@ -0,0 +1,17 @@ +const unspent_utxos = require('./blockchain_data').unspent_utxos + +/** + * Mocks an electrum call to listunspent, and returns a specified number + * of unspent UTXOs + * @param {Integer} num_utxos The number of unspent utxos to return + */ +const listunspent_mock = function(num_utxos) { + let returned_utxos = [] + for (let i = 0; i < num_utxos; i++) { + returned_utxos.push(unspent_utxos[Math.round(Math.random() * (unspent_utxos.length - 1))]) + } + + return returned_utxos +} + +module.exports = listunspent_mock diff --git a/__mocks__/react-native-fetch/mocked_results/mocked_results.js b/__mocks__/react-native-fetch/mocked_results/mocked_results.js new file mode 100644 index 00000000..b8bfc876 --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/mocked_results.js @@ -0,0 +1,19 @@ +const getbalance_mock = require("./getbalance.js") +const getblockinfo_mock = require("./getblockinfo.js") +const getcurrentblock_mock = require("./getcurrentblock.js") +const getmerkle_mock = require("./getmerkle.js") +const gettransaction_mock = require("./gettransaction.js") +const listtransactions_mock = require("./listtransactions.js") +const listunspent_mock = require("./listunspent.js") +const server_version_mock = require("./server_version.js") + +module.exports = { + getbalance: getbalance_mock, + getblockinfo: getblockinfo_mock, + getcurrentblock: getcurrentblock_mock, + getmerkle: getmerkle_mock, + gettransaction: gettransaction_mock, + listtransactions: listtransactions_mock, + listunspent: listunspent_mock, + server_version: server_version_mock +} \ No newline at end of file diff --git a/__mocks__/react-native-fetch/mocked_results/pushtx.js b/__mocks__/react-native-fetch/mocked_results/pushtx.js new file mode 100644 index 00000000..b5967784 --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/pushtx.js @@ -0,0 +1 @@ +//TODO: Add mock for pushtx \ No newline at end of file diff --git a/__mocks__/react-native-fetch/mocked_results/server_version.js b/__mocks__/react-native-fetch/mocked_results/server_version.js new file mode 100644 index 00000000..a4c03403 --- /dev/null +++ b/__mocks__/react-native-fetch/mocked_results/server_version.js @@ -0,0 +1,11 @@ +/** + * Returns a server version object with the specified version passed in + * @param {String} version_string Server version string, traditonally in the format 'ElectrumX x.x.x' + * @param {Number} version_int (Optional) Version integer, in the format x.x. If omitted, return will be 'ElectrumX' + */ +const server_version_mock = function(version_string, version_int) { + if (version_int == null) return 'ElectrumX' + return [ version_string, version_int.toString() ] +} + +module.exports = server_version_mock \ No newline at end of file diff --git a/android/.project b/android/.project old mode 100644 new mode 100755 diff --git a/android/.settings/org.eclipse.buildship.core.prefs b/android/.settings/org.eclipse.buildship.core.prefs old mode 100644 new mode 100755 diff --git a/android/app/.classpath b/android/app/.classpath old mode 100644 new mode 100755 diff --git a/android/app/.project b/android/app/.project old mode 100644 new mode 100755 diff --git a/android/app/.settings/org.eclipse.buildship.core.prefs b/android/app/.settings/org.eclipse.buildship.core.prefs old mode 100644 new mode 100755 diff --git a/android/app/BUCK b/android/app/BUCK old mode 100644 new mode 100755 diff --git a/android/app/app.iml b/android/app/app.iml old mode 100644 new mode 100755 index aad62a83..9523272e --- a/android/app/app.iml +++ b/android/app/app.iml @@ -91,7 +91,10 @@ - + + + + @@ -99,18 +102,33 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -118,17 +136,21 @@ - + + + + + + - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/android/app/bin/.project b/android/app/bin/.project old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/AndroidManifest.xml b/android/app/bin/src/main/AndroidManifest.xml old mode 100644 new mode 100755 index b2a337dd..4a6a7b82 --- a/android/app/bin/src/main/AndroidManifest.xml +++ b/android/app/bin/src/main/AndroidManifest.xml @@ -16,7 +16,7 @@ android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize" - android:windowSoftInputMode="adjustResize"> + android:windowSoftInputMode="adjustPan"> diff --git a/android/app/bin/src/main/assets/fonts/AntDesign.ttf b/android/app/bin/src/main/assets/fonts/AntDesign.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/Entypo.ttf b/android/app/bin/src/main/assets/fonts/Entypo.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/EvilIcons.ttf b/android/app/bin/src/main/assets/fonts/EvilIcons.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/FontAwesome.ttf b/android/app/bin/src/main/assets/fonts/FontAwesome.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/FontAwesome5_Brands.ttf b/android/app/bin/src/main/assets/fonts/FontAwesome5_Brands.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/FontAwesome5_Regular.ttf b/android/app/bin/src/main/assets/fonts/FontAwesome5_Regular.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/FontAwesome5_Solid.ttf b/android/app/bin/src/main/assets/fonts/FontAwesome5_Solid.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/Foundation.ttf b/android/app/bin/src/main/assets/fonts/Foundation.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/Ionicons.ttf b/android/app/bin/src/main/assets/fonts/Ionicons.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/MaterialCommunityIcons.ttf b/android/app/bin/src/main/assets/fonts/MaterialCommunityIcons.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/MaterialIcons.ttf b/android/app/bin/src/main/assets/fonts/MaterialIcons.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/Octicons.ttf b/android/app/bin/src/main/assets/fonts/Octicons.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/SimpleLineIcons.ttf b/android/app/bin/src/main/assets/fonts/SimpleLineIcons.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/assets/fonts/Zocial.ttf b/android/app/bin/src/main/assets/fonts/Zocial.ttf old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/java/com/verusmobile/MainActivity.class b/android/app/bin/src/main/java/com/verusmobile/MainActivity.class old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/java/com/verusmobile/MainApplication.class b/android/app/bin/src/main/java/com/verusmobile/MainApplication.class old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/bin/src/main/res/mipmap-hdpi/ic_launcher.png old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/bin/src/main/res/mipmap-hdpi/ic_launcher_round.png old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/bin/src/main/res/mipmap-mdpi/ic_launcher.png old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/bin/src/main/res/mipmap-mdpi/ic_launcher_round.png old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/bin/src/main/res/mipmap-xhdpi/ic_launcher.png old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/bin/src/main/res/mipmap-xhdpi/ic_launcher_round.png old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/bin/src/main/res/mipmap-xxhdpi/ic_launcher.png old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/bin/src/main/res/mipmap-xxhdpi/ic_launcher_round.png old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/bin/src/main/res/mipmap-xxxhdpi/ic_launcher.png old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/bin/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/values/strings.xml b/android/app/bin/src/main/res/values/strings.xml old mode 100644 new mode 100755 diff --git a/android/app/bin/src/main/res/values/styles.xml b/android/app/bin/src/main/res/values/styles.xml old mode 100644 new mode 100755 diff --git a/android/app/build.gradle b/android/app/build.gradle old mode 100644 new mode 100755 index 495a61b6..945d5eb3 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -4,8 +4,8 @@ import com.android.build.OutputFile def versionMajor = 0 def versionMinor = 1 -def versionRevision = 8 -def versionBuild = 1 +def versionRevision = 9 +def versionBuild = 0 def keystorePropertiesFile = rootProject.file("keystore.properties"); @@ -156,6 +156,13 @@ android { } dependencies { + implementation project(':react-native-permissions') + implementation project(':react-native-gesture-handler') + implementation project(':@react-native-community_datetimepicker') + implementation project(':react-native-text-input-mask') + implementation project(':react-native-webview') + implementation project(':rn-fetch-blob') + implementation project(':react-native-image-picker') implementation project(':react-native-svg') implementation project(':react-native-share') implementation project(':react-native-fs') @@ -168,7 +175,7 @@ dependencies { implementation project(':react-native-os') implementation project(':react-native-camera') implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation "com.android.support:appcompat-v7:23.0.1" + implementation 'androidx.appcompat:appcompat:1.0.0' implementation "com.facebook.react:react-native:+" // From node_modules } diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro old mode 100644 new mode 100755 diff --git a/android/app/release/output.json b/android/app/release/output.json old mode 100644 new mode 100755 diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml old mode 100644 new mode 100755 index a5449c83..0070e8df --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize" - android:windowSoftInputMode="adjustResize" + android:windowSoftInputMode="adjustPan" android:exported="true"> diff --git a/android/app/src/main/assets/fonts/AntDesign.ttf b/android/app/src/main/assets/fonts/AntDesign.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/Avenir-Black.ttf b/android/app/src/main/assets/fonts/Avenir-Black.ttf new file mode 100755 index 00000000..0fc77a10 Binary files /dev/null and b/android/app/src/main/assets/fonts/Avenir-Black.ttf differ diff --git a/android/app/src/main/assets/fonts/Avenir-Book.ttf b/android/app/src/main/assets/fonts/Avenir-Book.ttf new file mode 100755 index 00000000..ab9362f3 Binary files /dev/null and b/android/app/src/main/assets/fonts/Avenir-Book.ttf differ diff --git a/android/app/src/main/assets/fonts/Avenir-Light.ttf b/android/app/src/main/assets/fonts/Avenir-Light.ttf new file mode 100755 index 00000000..fadd2631 Binary files /dev/null and b/android/app/src/main/assets/fonts/Avenir-Light.ttf differ diff --git a/android/app/src/main/assets/fonts/Avenir-Medium.ttf b/android/app/src/main/assets/fonts/Avenir-Medium.ttf new file mode 100755 index 00000000..f1d4dabb Binary files /dev/null and b/android/app/src/main/assets/fonts/Avenir-Medium.ttf differ diff --git a/android/app/src/main/assets/fonts/Entypo.ttf b/android/app/src/main/assets/fonts/Entypo.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/EvilIcons.ttf b/android/app/src/main/assets/fonts/EvilIcons.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/FontAwesome.ttf b/android/app/src/main/assets/fonts/FontAwesome.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/FontAwesome5_Brands.ttf b/android/app/src/main/assets/fonts/FontAwesome5_Brands.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/FontAwesome5_Regular.ttf b/android/app/src/main/assets/fonts/FontAwesome5_Regular.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/FontAwesome5_Solid.ttf b/android/app/src/main/assets/fonts/FontAwesome5_Solid.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/Foundation.ttf b/android/app/src/main/assets/fonts/Foundation.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/Ionicons.ttf b/android/app/src/main/assets/fonts/Ionicons.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf b/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/MaterialIcons.ttf b/android/app/src/main/assets/fonts/MaterialIcons.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/Octicons.ttf b/android/app/src/main/assets/fonts/Octicons.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/SimpleLineIcons.ttf b/android/app/src/main/assets/fonts/SimpleLineIcons.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/assets/fonts/Zocial.ttf b/android/app/src/main/assets/fonts/Zocial.ttf old mode 100644 new mode 100755 diff --git a/android/app/src/main/java/com/verusmobile/MainActivity.java b/android/app/src/main/java/com/verusmobile/MainActivity.java old mode 100644 new mode 100755 diff --git a/android/app/src/main/java/com/verusmobile/MainApplication.java b/android/app/src/main/java/com/verusmobile/MainApplication.java old mode 100644 new mode 100755 index 70cd55b0..e2f0a018 --- a/android/app/src/main/java/com/verusmobile/MainApplication.java +++ b/android/app/src/main/java/com/verusmobile/MainApplication.java @@ -3,6 +3,13 @@ import android.app.Application; import com.facebook.react.ReactApplication; +import com.reactnativecommunity.rnpermissions.RNPermissionsPackage; +import com.swmansion.gesturehandler.react.RNGestureHandlerPackage; +import com.reactcommunity.rndatetimepicker.RNDateTimePickerPackage; +import com.RNTextInputMask.RNTextInputMaskPackage; +import com.reactnativecommunity.webview.RNCWebViewPackage; +import com.RNFetchBlob.RNFetchBlobPackage; +import com.imagepicker.ImagePickerPackage; import com.horcrux.svg.SvgPackage; import cl.json.RNSharePackage; import com.rnfs.RNFSPackage; @@ -33,7 +40,14 @@ public boolean getUseDeveloperSupport() { @Override protected List getPackages() { return Arrays.asList( - new MainReactPackage(), + new MainReactPackage(), + new RNPermissionsPackage(), + new RNGestureHandlerPackage(), + new RNDateTimePickerPackage(), + new RNTextInputMaskPackage(), + new RNCWebViewPackage(), + new RNFetchBlobPackage(), + new ImagePickerPackage(), new SvgPackage(), new RNSharePackage(), new RNFSPackage(), diff --git a/android/app/src/main/java/com/verusmobile/SplashActivity.java b/android/app/src/main/java/com/verusmobile/SplashActivity.java old mode 100644 new mode 100755 index c0e8bf30..e9cea6ee --- a/android/app/src/main/java/com/verusmobile/SplashActivity.java +++ b/android/app/src/main/java/com/verusmobile/SplashActivity.java @@ -1,8 +1,8 @@ -package com.verusmobile; +package com.verusmobile; import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; public class SplashActivity extends AppCompatActivity { @Override @@ -13,4 +13,4 @@ protected void onCreate(Bundle savedInstanceState) { startActivity(intent); finish(); } -} \ No newline at end of file +} diff --git a/android/app/src/main/res/drawable-hdpi/node_modules_reactnavigation_src_views_assets_backicon.png b/android/app/src/main/res/drawable-hdpi/node_modules_reactnavigation_src_views_assets_backicon.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/node_modules_reactnativeelements_src_rating_images_bell.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnativeelements_src_rating_images_bell.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/node_modules_reactnativeelements_src_rating_images_heart.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnativeelements_src_rating_images_heart.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/node_modules_reactnativeelements_src_rating_images_rocket.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnativeelements_src_rating_images_rocket.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/node_modules_reactnativeelements_src_rating_images_star.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnativeelements_src_rating_images_star.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_src_views_assets_backicon.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_src_views_assets_backicon.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_src_views_assets_backiconmask.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_src_views_assets_backiconmask.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_assets_vrsc.png b/android/app/src/main/res/drawable-mdpi/src_assets_vrsc.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_bch.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_bch.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_btc.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_btc.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_ccl.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_ccl.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_dash.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_dash.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_dgb.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_dgb.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_doge.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_doge.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_k64.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_k64.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_kmd.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_kmd.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_ltc.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_ltc.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_oot.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_oot.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_vrsc.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_vrsc.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_zec.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_zec.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_zilla.png b/android/app/src/main/res/drawable-mdpi/src_images_cryptologo_zilla.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_customicons_addcoin.png b/android/app/src/main/res/drawable-mdpi/src_images_customicons_addcoin.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_customicons_incomingarrow.png b/android/app/src/main/res/drawable-mdpi/src_images_customicons_incomingarrow.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_customicons_interestplus.png b/android/app/src/main/res/drawable-mdpi/src_images_customicons_interestplus.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_customicons_outgoingarrow.png b/android/app/src/main/res/drawable-mdpi/src_images_customicons_outgoingarrow.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_customicons_selfarrow.png b/android/app/src/main/res/drawable-mdpi/src_images_customicons_selfarrow.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_customicons_unknownlogo.png b/android/app/src/main/res/drawable-mdpi/src_images_customicons_unknownlogo.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_customicons_verusheaderlogo.png b/android/app/src/main/res/drawable-mdpi/src_images_customicons_verusheaderlogo.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_customicons_veruspay.png b/android/app/src/main/res/drawable-mdpi/src_images_customicons_veruspay.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-mdpi/src_images_customicons_verusqrlogo.png b/android/app/src/main/res/drawable-mdpi/src_images_customicons_verusqrlogo.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_src_views_assets_backicon.png b/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_src_views_assets_backicon.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_src_views_assets_backicon.png b/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_src_views_assets_backicon.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_src_views_assets_backicon.png b/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_src_views_assets_backicon.png old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/drawable/background_splash.xml b/android/app/src/main/res/drawable/background_splash.xml old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png old mode 100755 new mode 100644 index 4a654ca2..2f0b620f Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100755 index 8ac3a956..00000000 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-hdpi/icon.png b/android/app/src/main/res/mipmap-hdpi/icon.png index ef150451..68631493 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/icon.png and b/android/app/src/main/res/mipmap-hdpi/icon.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png old mode 100755 new mode 100644 index 18fc5412..f1abaf5a Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100755 index de0870d3..00000000 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-mdpi/icon.png b/android/app/src/main/res/mipmap-mdpi/icon.png index 05e175d8..eaa9727b 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/icon.png and b/android/app/src/main/res/mipmap-mdpi/icon.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png old mode 100755 new mode 100644 index 55188952..81c44335 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100755 index bf02a645..00000000 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xhdpi/icon.png b/android/app/src/main/res/mipmap-xhdpi/icon.png index 513ebd47..d14af95a 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/icon.png and b/android/app/src/main/res/mipmap-xhdpi/icon.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png old mode 100755 new mode 100644 index dcc30ef1..73dfea1b Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100755 index 33c7f389..00000000 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/icon.png b/android/app/src/main/res/mipmap-xxhdpi/icon.png index 513ebd47..d14af95a 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/icon.png and b/android/app/src/main/res/mipmap-xxhdpi/icon.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png old mode 100755 new mode 100644 index d0244f41..01e7ae23 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100755 index 3fc4ca21..00000000 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/icon.png b/android/app/src/main/res/mipmap-xxxhdpi/icon.png index 513ebd47..d14af95a 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/icon.png and b/android/app/src/main/res/mipmap-xxxhdpi/icon.png differ diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml old mode 100644 new mode 100755 index 3c1e2647..c79c7495 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -1,5 +1,5 @@ - #659dda - #2E86AB + #3165d4 + #254b9c \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml old mode 100644 new mode 100755 diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml old mode 100644 new mode 100755 diff --git a/android/build.gradle b/android/build.gradle old mode 100644 new mode 100755 diff --git a/android/gradle.properties b/android/gradle.properties old mode 100644 new mode 100755 index 244258f7..8b3ac932 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -18,4 +18,5 @@ # org.gradle.parallel=true android.useDeprecatedNdk=true - +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar old mode 100644 new mode 100755 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties old mode 100644 new mode 100755 diff --git a/android/gradlew.bat b/android/gradlew.bat old mode 100644 new mode 100755 diff --git a/android/keystores/BUCK b/android/keystores/BUCK old mode 100644 new mode 100755 diff --git a/android/keystores/debug.keystore.properties b/android/keystores/debug.keystore.properties old mode 100644 new mode 100755 diff --git a/android/settings.gradle b/android/settings.gradle old mode 100644 new mode 100755 index ce84bc8d..991cde73 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,18 @@ rootProject.name = 'verusmobile' +include ':react-native-permissions' +project(':react-native-permissions').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-permissions/android') +include ':react-native-gesture-handler' +project(':react-native-gesture-handler').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-gesture-handler/android') +include ':@react-native-community_datetimepicker' +project(':@react-native-community_datetimepicker').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/datetimepicker/android') +include ':react-native-text-input-mask' +project(':react-native-text-input-mask').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-text-input-mask/android') +include ':react-native-webview' +project(':react-native-webview').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webview/android') +include ':rn-fetch-blob' +project(':rn-fetch-blob').projectDir = new File(rootProject.projectDir, '../node_modules/rn-fetch-blob/android') +include ':react-native-image-picker' +project(':react-native-image-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-image-picker/android') include ':react-native-svg' project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android') include ':react-native-share' diff --git a/android/verusmobile.iml b/android/verusmobile.iml old mode 100644 new mode 100755 diff --git a/assets/fonts/Avenir/Avenir-Black.ttf b/assets/fonts/Avenir/Avenir-Black.ttf new file mode 100644 index 00000000..0fc77a10 Binary files /dev/null and b/assets/fonts/Avenir/Avenir-Black.ttf differ diff --git a/assets/fonts/Avenir/Avenir-Book.ttf b/assets/fonts/Avenir/Avenir-Book.ttf new file mode 100644 index 00000000..ab9362f3 Binary files /dev/null and b/assets/fonts/Avenir/Avenir-Book.ttf differ diff --git a/assets/fonts/Avenir/Avenir-Medium.ttf b/assets/fonts/Avenir/Avenir-Medium.ttf new file mode 100644 index 00000000..f1d4dabb Binary files /dev/null and b/assets/fonts/Avenir/Avenir-Medium.ttf differ diff --git a/assets/fonts/Avenir/Avenir.ttf b/assets/fonts/Avenir/Avenir.ttf new file mode 100644 index 00000000..fadd2631 Binary files /dev/null and b/assets/fonts/Avenir/Avenir.ttf differ diff --git a/src/assets/vrsc.png b/assets/vrsc.png similarity index 100% rename from src/assets/vrsc.png rename to assets/vrsc.png diff --git a/debug/setupJest.js b/debug/setupJest.js index 4e9e6b29..4debc86d 100644 --- a/debug/setupJest.js +++ b/debug/setupJest.js @@ -1 +1 @@ -global.fetch = require('node-fetch') \ No newline at end of file +global.fetch = require('../__mocks__/react-native-fetch/fetch') \ No newline at end of file diff --git a/global.js b/global.js index 3bd57fab..cea7b3df 100644 --- a/global.js +++ b/global.js @@ -1,5 +1,5 @@ //Versions -global.APP_VERSION = "0.1.8-beta"; +global.APP_VERSION = "0.1.9-beta"; global.VERUS_QR_VERSION = "0.1.1"; global.CHAIN_QR_VERSION = "0.1.0" global.ELECTRUM_PROTOCOL_CHANGE = 1.4; diff --git a/ios/splash-image.png b/ios/splash-image.png old mode 100644 new mode 100755 diff --git a/ios/verusMobile-tvOS/Info.plist b/ios/verusMobile-tvOS/Info.plist old mode 100644 new mode 100755 diff --git a/ios/verusMobile-tvOSTests/Info.plist b/ios/verusMobile-tvOSTests/Info.plist old mode 100644 new mode 100755 diff --git a/ios/verusMobile.xcodeproj/project.pbxproj b/ios/verusMobile.xcodeproj/project.pbxproj old mode 100644 new mode 100755 index 1054c0d8..8d433d85 --- a/ios/verusMobile.xcodeproj/project.pbxproj +++ b/ios/verusMobile.xcodeproj/project.pbxproj @@ -13,11 +13,9 @@ 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 00E356F31AD99517003FC87E /* verusmobileTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* verusmobileTests.m */; }; - 0C55A42690BD4DCEB0968187 /* libRNSVG-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 37A87853FE4947CDBB4BBC72 /* libRNSVG-tvOS.a */; }; 0D3855D5B0B24F33BD5C00A3 /* AntDesign.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8E3F117C85D440B8B541DF02 /* AntDesign.ttf */; }; 13073E97336D4B00AF0BCA70 /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9CAD9DFEFF6845BBAC980F14 /* SimpleLineIcons.ttf */; }; 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; - 1357CB44E03642BF97A6700C /* libRNCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CC296FAD8B214711B714557A /* libRNCamera.a */; }; 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; @@ -27,6 +25,8 @@ 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 1FC44E54BCE14973884B2942 /* libRNRandomBytes-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 95337D25B934457F876A9ED1 /* libRNRandomBytes-tvOS.a */; }; + 222409548A77499D8CDE8D30 /* libRNGestureHandler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B2398A8CE45A44C79ED68E40 /* libRNGestureHandler.a */; }; + 2C2A1DE2E6B441EF9DC2D561 /* Fontisto.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4BCFD26B7725491FB98CFFEA /* Fontisto.ttf */; }; 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; @@ -39,19 +39,44 @@ 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; }; 2DCD954D1E0B4F2C00145EB5 /* verusmobileTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* verusmobileTests.m */; }; + 3755ABA0237EB50400393E99 /* InputMask.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3755AB9F237EB50400393E99 /* InputMask.framework */; }; + 3755ABA1237EB50400393E99 /* InputMask.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3755AB9F237EB50400393E99 /* InputMask.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 395267E8BF4E4154A45F3398 /* libRNImagePicker.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C6F7EDA3EE7B4E5CBB8B73A8 /* libRNImagePicker.a */; }; 44493CD6D50940C7B9134034 /* libRNScreens.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ADA91A9E65A468FA13F414E /* libRNScreens.a */; }; 46EB2EFF5EDF43E48B3BED1F /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 037DDD2122AB4258ABB7A2EA /* MaterialCommunityIcons.ttf */; }; + 497FA154902F40AFBBFF1A76 /* libRNTextInputMask.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2EF2DA6EF62D4E0FB4C905E1 /* libRNTextInputMask.a */; }; 4BB7A062F04647DBBCD24E29 /* libTcpSockets.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AFE20E750284A15A7F8AC7D /* libTcpSockets.a */; }; + 4E997A1764894180A8D76D8D /* libRNSVG-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DE70CFD98894B3AA5C72B1F /* libRNSVG-tvOS.a */; }; + 4E9EA95423BA796100B9FA10 /* RNPermissionHandlerCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA95323BA796100B9FA10 /* RNPermissionHandlerCamera.m */; }; + 4E9EA95723BA797100B9FA10 /* RNPermissionHandlerMicrophone.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA95623BA797100B9FA10 /* RNPermissionHandlerMicrophone.m */; }; + 4E9EA95A23BA797F00B9FA10 /* RNPermissionHandlerPhotoLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA95823BA797F00B9FA10 /* RNPermissionHandlerPhotoLibrary.m */; }; + 4E9EA95B23BA7B6C00B9FA10 /* libRNCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 810686F8221E9E0300F4268D /* libRNCamera.a */; }; + 4E9EA96323BA7DA900B9FA10 /* RNPermissions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA96223BA7DA900B9FA10 /* RNPermissions.m */; }; + 4E9EA96723BA7EFE00B9FA10 /* RNPermissionHandlerSiri.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA96523BA7EFE00B9FA10 /* RNPermissionHandlerSiri.m */; }; + 4E9EA96A23BA7F0900B9FA10 /* RNPermissionHandlerSpeechRecognition.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA96923BA7F0900B9FA10 /* RNPermissionHandlerSpeechRecognition.m */; }; + 4E9EA96D23BA7F1400B9FA10 /* RNPermissionHandlerStoreKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA96C23BA7F1400B9FA10 /* RNPermissionHandlerStoreKit.m */; }; + 4E9EA97023BA7F2000B9FA10 /* RNPermissionHandlerBluetoothPeripheral.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA96F23BA7F2000B9FA10 /* RNPermissionHandlerBluetoothPeripheral.m */; }; + 4E9EA97323BA7F2600B9FA10 /* RNPermissionHandlerCalendars.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA97223BA7F2600B9FA10 /* RNPermissionHandlerCalendars.m */; }; + 4E9EA97623BA7F2E00B9FA10 /* RNPermissionHandlerContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA97523BA7F2E00B9FA10 /* RNPermissionHandlerContacts.m */; }; + 4E9EA97923BA7F3600B9FA10 /* RNPermissionHandlerFaceID.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA97823BA7F3600B9FA10 /* RNPermissionHandlerFaceID.m */; }; + 4E9EA97C23BA7F3E00B9FA10 /* RNPermissionHandlerLocationAlways.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA97B23BA7F3D00B9FA10 /* RNPermissionHandlerLocationAlways.m */; }; + 4E9EA97F23BA7F4700B9FA10 /* RNPermissionHandlerLocationWhenInUse.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA97D23BA7F4600B9FA10 /* RNPermissionHandlerLocationWhenInUse.m */; }; + 4E9EA98223BA7F5000B9FA10 /* RNPermissionHandlerMediaLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA98123BA7F5000B9FA10 /* RNPermissionHandlerMediaLibrary.m */; }; + 4E9EA98523BA7F6D00B9FA10 /* RNPermissionHandlerMotion.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA98423BA7F6C00B9FA10 /* RNPermissionHandlerMotion.m */; }; + 4E9EA98823BA7F7700B9FA10 /* RNPermissionHandlerNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA98623BA7F7700B9FA10 /* RNPermissionHandlerNotifications.m */; }; + 4E9EA98B23BA7F7E00B9FA10 /* RNPermissionHandlerReminders.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9EA98A23BA7F7E00B9FA10 /* RNPermissionHandlerReminders.m */; }; + 4E9EA99B23BB63A800B9FA10 /* main.jsbundle in Resources */ = {isa = PBXBuildFile; fileRef = 008F07F21AC5B25A0029DE68 /* main.jsbundle */; }; + 4E9EA99D23BB985300B9FA10 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 4E9EA99C23BB985200B9FA10 /* assets */; }; 593FA5C43DB94CDCACE6BB12 /* libRNFS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 626A9F13C73249B8818E79A9 /* libRNFS.a */; }; 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 6204CB3970E24A7F9C07FCFA /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1DFC2CCFDE654798A64E1922 /* Ionicons.ttf */; }; 6253916B93DA424FBFA8F13A /* FontAwesome5_Solid.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CCD4474502484E13AC0652F2 /* FontAwesome5_Solid.ttf */; }; 674A7F4B8F6844FDB1B17D4F /* libRNCAsyncStorage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FE84B4CF7E6B4D8E927EB282 /* libRNCAsyncStorage.a */; }; - 74805A4DA49E44C2A9D49F12 /* libReactNativePermissions.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CD8B5748E6514788A6364B4A /* libReactNativePermissions.a */; }; 76FE8FBEA9854FD6B69338AD /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 56A25BA6B5754BE79DCFEAFB /* Entypo.ttf */; }; - 7A209B33773449FC91AB7C22 /* libRNSVG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B17B5F1EBAC4631BB4B4D95 /* libRNSVG.a */; }; 7B00A252D48B46FB9815A83E /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D76713AFEEF4986AD60E315 /* libRNVectorIcons.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; + 8E9D1132B8BA4DD5BE5D347E /* libRNSVG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 11DCE44907D942BCA4AEBDD9 /* libRNSVG.a */; }; + 9413F2A0653D4829B8444E00 /* libRNGestureHandler-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 61722FD8237A46A6AD7B47C7 /* libRNGestureHandler-tvOS.a */; }; 9422EED849364904B3293AF7 /* Feather.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C11275B669D54454ACE53412 /* Feather.ttf */; }; 9494D005134443DDAD4AA55F /* FontAwesome5_Brands.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 842860A0D38C4F53A3EF76D3 /* FontAwesome5_Brands.ttf */; }; 9555D3418C004880B5A054B4 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4CFDF87268374246B91A2F72 /* Zocial.ttf */; }; @@ -60,10 +85,13 @@ ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; }; B203A0B9E5454C94B1BFDBA1 /* libRNShare.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB4D8853AE664293B8629FDE /* libRNShare.a */; }; BC4A3D5B317D44C6AE041D3C /* libRNRandomBytes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0446088E12094EFFAF29F593 /* libRNRandomBytes.a */; }; + C384E8F71D9F4A3B8FF19E44 /* libRNCWebView.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EEF6E4383446DA91C07DF0 /* libRNCWebView.a */; }; C3F0F1EC224C38D900279E92 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3F0F1EB224C38D900279E92 /* JavaScriptCore.framework */; }; + C78EECB16082448B90D851A7 /* libRNFetchBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6742422040AC419C80926888 /* libRNFetchBlob.a */; }; D08649F3B20D46DBA121581B /* FontAwesome5_Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3F4FFC227A7146BAB05B947F /* FontAwesome5_Regular.ttf */; }; D3920DB51C024A56998A2ED6 /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1A63C3132FCC48BAAEBD7F3A /* FontAwesome.ttf */; }; D89D7FEA42F144D7B24A3AC0 /* libRNOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF58C5E85782430AA15D7D13 /* libRNOS.a */; }; + E3F18E5EE5FD4C98AD647F19 /* libRNDateTimePicker.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7313AD3571D04D2081FDE9B1 /* libRNDateTimePicker.a */; }; E78EDC1DD21C4172B41D16E4 /* libUdpSockets.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 38D04647AAFB4943A8DD845F /* libUdpSockets.a */; }; F73844B799BF438996EB6FFD /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7486B3ADFE6E4933A10EB3E2 /* EvilIcons.ttf */; }; FC8D0E93A71448BAB53C041F /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 015B95AEAE8846598210DFBB /* MaterialIcons.ttf */; }; @@ -162,6 +190,48 @@ remoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32; remoteInfo = "fishhook-tvOS"; }; + 3755AB9D237EB30400393E99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EA34A4C3F8E3474D994E8A0D /* RNTextInputMask.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RNTextInputMask; + }; + 376AD845236EFCDE00B18C63 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EC201B4A11474F438ABE0560 /* RNSVG.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 0CF68AC11AF0540F00FF9E5C; + remoteInfo = RNSVG; + }; + 376AD847236EFCDE00B18C63 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EC201B4A11474F438ABE0560 /* RNSVG.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 94DDAC5C1F3D024300EED511; + remoteInfo = "RNSVG-tvOS"; + }; + 376F304F2374E8940015733F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 45FD39CF955B4485B310D4D6 /* RNFetchBlob.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = A15C300E1CD25C330074CB35; + remoteInfo = RNFetchBlob; + }; + 377E5E7B23733DA300928D60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 893399C234F94788BA8526F8 /* RNImagePicker.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 014A3B5C1C6CF33500B6D375; + remoteInfo = RNImagePicker; + }; + 37CE7CEA2376225500A031DC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D8D27F42AD16452DB4EAC0FF /* RNCWebView.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RNCWebView; + }; 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; @@ -239,6 +309,27 @@ remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; remoteInfo = "cxxreact-tvOS"; }; + 4E3F293023BA3E5B00D38164 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 958A6679814B47F4B08C6445 /* RNGestureHandler.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RNGestureHandler; + }; + 4E3F293223BA3E5B00D38164 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 958A6679814B47F4B08C6445 /* RNGestureHandler.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B5C32A36220C603B000FFB8D; + remoteInfo = "RNGestureHandler-tvOS"; + }; + 4E3F293523BA3E5B00D38164 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC25042A7C9642DC99D2B6FF /* RNPermissions.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RNPermissions; + }; 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; @@ -372,6 +463,13 @@ remoteGlobalIDString = 58B5119B1A9E6C1200147676; remoteInfo = RCTText; }; + 90E28DFA2383EFB0008766F7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8214F60179334E07BB8E0DB8 /* RNDateTimePicker.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RNDateTimePicker; + }; ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; @@ -407,20 +505,6 @@ remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = RNShare; }; - C31623902342589000559B29 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 252A9A18224F473B98B3A80A /* RNSVG.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 0CF68AC11AF0540F00FF9E5C; - remoteInfo = RNSVG; - }; - C31623922342589000559B29 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 252A9A18224F473B98B3A80A /* RNSVG.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 94DDAC5C1F3D024300EED511; - remoteInfo = "RNSVG-tvOS"; - }; C3F0F188224C34B600279E92 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; @@ -465,6 +549,20 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 3755ABA2237EB50400393E99 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3755ABA1237EB50400393E99 /* InputMask.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; @@ -479,6 +577,7 @@ 037DDD2122AB4258ABB7A2EA /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialCommunityIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = ""; }; 0446088E12094EFFAF29F593 /* libRNRandomBytes.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNRandomBytes.a; sourceTree = ""; }; 0D76713AFEEF4986AD60E315 /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; + 11DCE44907D942BCA4AEBDD9 /* libRNSVG.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSVG.a; sourceTree = ""; }; 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* verusmobile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = verusmobile.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -493,44 +592,95 @@ 199A728D014C4034A85F1F5E /* TcpSockets.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = TcpSockets.xcodeproj; path = "../node_modules/react-native-tcp/ios/TcpSockets.xcodeproj"; sourceTree = ""; }; 1A1D62FAD9854483818F0F8C /* RNCAsyncStorage.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNCAsyncStorage.xcodeproj; path = "../node_modules/@react-native-community/async-storage/ios/RNCAsyncStorage.xcodeproj"; sourceTree = ""; }; 1A63C3132FCC48BAAEBD7F3A /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; - 1B17B5F1EBAC4631BB4B4D95 /* libRNSVG.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSVG.a; sourceTree = ""; }; 1DFC2CCFDE654798A64E1922 /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; }; - 252A9A18224F473B98B3A80A /* RNSVG.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNSVG.xcodeproj; path = "../node_modules/react-native-svg/ios/RNSVG.xcodeproj"; sourceTree = ""; }; 2D02E47B1E0B4A5D006451C7 /* verusmobile-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "verusmobile-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D02E4901E0B4A5D006451C7 /* verusmobile-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "verusmobile-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 37A87853FE4947CDBB4BBC72 /* libRNSVG-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNSVG-tvOS.a"; sourceTree = ""; }; + 2EF2DA6EF62D4E0FB4C905E1 /* libRNTextInputMask.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNTextInputMask.a; sourceTree = ""; }; + 3755AB9F237EB50400393E99 /* InputMask.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = InputMask.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 38D04647AAFB4943A8DD845F /* libUdpSockets.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libUdpSockets.a; sourceTree = ""; }; 3F4FFC227A7146BAB05B947F /* FontAwesome5_Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Regular.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf"; sourceTree = ""; }; + 45FD39CF955B4485B310D4D6 /* RNFetchBlob.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNFetchBlob.xcodeproj; path = "../node_modules/rn-fetch-blob/ios/RNFetchBlob.xcodeproj"; sourceTree = ""; }; + 4BCFD26B7725491FB98CFFEA /* Fontisto.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Fontisto.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf"; sourceTree = ""; }; 4CFDF87268374246B91A2F72 /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; }; + 4E9EA95223BA796100B9FA10 /* RNPermissionHandlerCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerCamera.h; path = "../node_modules/react-native-permissions/ios/Camera/RNPermissionHandlerCamera.h"; sourceTree = ""; }; + 4E9EA95323BA796100B9FA10 /* RNPermissionHandlerCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerCamera.m; path = "../node_modules/react-native-permissions/ios/Camera/RNPermissionHandlerCamera.m"; sourceTree = ""; }; + 4E9EA95523BA797100B9FA10 /* RNPermissionHandlerMicrophone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerMicrophone.h; path = "../node_modules/react-native-permissions/ios/Microphone/RNPermissionHandlerMicrophone.h"; sourceTree = ""; }; + 4E9EA95623BA797100B9FA10 /* RNPermissionHandlerMicrophone.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerMicrophone.m; path = "../node_modules/react-native-permissions/ios/Microphone/RNPermissionHandlerMicrophone.m"; sourceTree = ""; }; + 4E9EA95823BA797F00B9FA10 /* RNPermissionHandlerPhotoLibrary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerPhotoLibrary.m; path = "../node_modules/react-native-permissions/ios/PhotoLibrary/RNPermissionHandlerPhotoLibrary.m"; sourceTree = ""; }; + 4E9EA95923BA797F00B9FA10 /* RNPermissionHandlerPhotoLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerPhotoLibrary.h; path = "../node_modules/react-native-permissions/ios/PhotoLibrary/RNPermissionHandlerPhotoLibrary.h"; sourceTree = ""; }; + 4E9EA96123BA7DA900B9FA10 /* RNPermissions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissions.h; path = "../node_modules/react-native-permissions/ios/RNPermissions.h"; sourceTree = ""; }; + 4E9EA96223BA7DA900B9FA10 /* RNPermissions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissions.m; path = "../node_modules/react-native-permissions/ios/RNPermissions.m"; sourceTree = ""; }; + 4E9EA96523BA7EFE00B9FA10 /* RNPermissionHandlerSiri.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerSiri.m; path = "../node_modules/react-native-permissions/ios/Siri/RNPermissionHandlerSiri.m"; sourceTree = ""; }; + 4E9EA96623BA7EFE00B9FA10 /* RNPermissionHandlerSiri.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerSiri.h; path = "../node_modules/react-native-permissions/ios/Siri/RNPermissionHandlerSiri.h"; sourceTree = ""; }; + 4E9EA96823BA7F0900B9FA10 /* RNPermissionHandlerSpeechRecognition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerSpeechRecognition.h; path = "../node_modules/react-native-permissions/ios/SpeechRecognition/RNPermissionHandlerSpeechRecognition.h"; sourceTree = ""; }; + 4E9EA96923BA7F0900B9FA10 /* RNPermissionHandlerSpeechRecognition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerSpeechRecognition.m; path = "../node_modules/react-native-permissions/ios/SpeechRecognition/RNPermissionHandlerSpeechRecognition.m"; sourceTree = ""; }; + 4E9EA96B23BA7F1400B9FA10 /* RNPermissionHandlerStoreKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerStoreKit.h; path = "../node_modules/react-native-permissions/ios/StoreKit/RNPermissionHandlerStoreKit.h"; sourceTree = ""; }; + 4E9EA96C23BA7F1400B9FA10 /* RNPermissionHandlerStoreKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerStoreKit.m; path = "../node_modules/react-native-permissions/ios/StoreKit/RNPermissionHandlerStoreKit.m"; sourceTree = ""; }; + 4E9EA96E23BA7F2000B9FA10 /* RNPermissionHandlerBluetoothPeripheral.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerBluetoothPeripheral.h; path = "../node_modules/react-native-permissions/ios/BluetoothPeripheral/RNPermissionHandlerBluetoothPeripheral.h"; sourceTree = ""; }; + 4E9EA96F23BA7F2000B9FA10 /* RNPermissionHandlerBluetoothPeripheral.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerBluetoothPeripheral.m; path = "../node_modules/react-native-permissions/ios/BluetoothPeripheral/RNPermissionHandlerBluetoothPeripheral.m"; sourceTree = ""; }; + 4E9EA97123BA7F2600B9FA10 /* RNPermissionHandlerCalendars.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerCalendars.h; path = "../node_modules/react-native-permissions/ios/Calendars/RNPermissionHandlerCalendars.h"; sourceTree = ""; }; + 4E9EA97223BA7F2600B9FA10 /* RNPermissionHandlerCalendars.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerCalendars.m; path = "../node_modules/react-native-permissions/ios/Calendars/RNPermissionHandlerCalendars.m"; sourceTree = ""; }; + 4E9EA97423BA7F2E00B9FA10 /* RNPermissionHandlerContacts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerContacts.h; path = "../node_modules/react-native-permissions/ios/Contacts/RNPermissionHandlerContacts.h"; sourceTree = ""; }; + 4E9EA97523BA7F2E00B9FA10 /* RNPermissionHandlerContacts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerContacts.m; path = "../node_modules/react-native-permissions/ios/Contacts/RNPermissionHandlerContacts.m"; sourceTree = ""; }; + 4E9EA97723BA7F3600B9FA10 /* RNPermissionHandlerFaceID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerFaceID.h; path = "../node_modules/react-native-permissions/ios/FaceID/RNPermissionHandlerFaceID.h"; sourceTree = ""; }; + 4E9EA97823BA7F3600B9FA10 /* RNPermissionHandlerFaceID.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerFaceID.m; path = "../node_modules/react-native-permissions/ios/FaceID/RNPermissionHandlerFaceID.m"; sourceTree = ""; }; + 4E9EA97A23BA7F3D00B9FA10 /* RNPermissionHandlerLocationAlways.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerLocationAlways.h; path = "../node_modules/react-native-permissions/ios/LocationAlways/RNPermissionHandlerLocationAlways.h"; sourceTree = ""; }; + 4E9EA97B23BA7F3D00B9FA10 /* RNPermissionHandlerLocationAlways.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerLocationAlways.m; path = "../node_modules/react-native-permissions/ios/LocationAlways/RNPermissionHandlerLocationAlways.m"; sourceTree = ""; }; + 4E9EA97D23BA7F4600B9FA10 /* RNPermissionHandlerLocationWhenInUse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerLocationWhenInUse.m; path = "../node_modules/react-native-permissions/ios/LocationWhenInUse/RNPermissionHandlerLocationWhenInUse.m"; sourceTree = ""; }; + 4E9EA97E23BA7F4600B9FA10 /* RNPermissionHandlerLocationWhenInUse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerLocationWhenInUse.h; path = "../node_modules/react-native-permissions/ios/LocationWhenInUse/RNPermissionHandlerLocationWhenInUse.h"; sourceTree = ""; }; + 4E9EA98023BA7F4F00B9FA10 /* RNPermissionHandlerMediaLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerMediaLibrary.h; path = "../node_modules/react-native-permissions/ios/MediaLibrary/RNPermissionHandlerMediaLibrary.h"; sourceTree = ""; }; + 4E9EA98123BA7F5000B9FA10 /* RNPermissionHandlerMediaLibrary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerMediaLibrary.m; path = "../node_modules/react-native-permissions/ios/MediaLibrary/RNPermissionHandlerMediaLibrary.m"; sourceTree = ""; }; + 4E9EA98323BA7F6C00B9FA10 /* RNPermissionHandlerMotion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerMotion.h; path = "../node_modules/react-native-permissions/ios/Motion/RNPermissionHandlerMotion.h"; sourceTree = ""; }; + 4E9EA98423BA7F6C00B9FA10 /* RNPermissionHandlerMotion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerMotion.m; path = "../node_modules/react-native-permissions/ios/Motion/RNPermissionHandlerMotion.m"; sourceTree = ""; }; + 4E9EA98623BA7F7700B9FA10 /* RNPermissionHandlerNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerNotifications.m; path = "../node_modules/react-native-permissions/ios/Notifications/RNPermissionHandlerNotifications.m"; sourceTree = ""; }; + 4E9EA98723BA7F7700B9FA10 /* RNPermissionHandlerNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerNotifications.h; path = "../node_modules/react-native-permissions/ios/Notifications/RNPermissionHandlerNotifications.h"; sourceTree = ""; }; + 4E9EA98923BA7F7E00B9FA10 /* RNPermissionHandlerReminders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNPermissionHandlerReminders.h; path = "../node_modules/react-native-permissions/ios/Reminders/RNPermissionHandlerReminders.h"; sourceTree = ""; }; + 4E9EA98A23BA7F7E00B9FA10 /* RNPermissionHandlerReminders.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNPermissionHandlerReminders.m; path = "../node_modules/react-native-permissions/ios/Reminders/RNPermissionHandlerReminders.m"; sourceTree = ""; }; + 4E9EA99C23BB985200B9FA10 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = ""; }; 56A25BA6B5754BE79DCFEAFB /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; + 5DE70CFD98894B3AA5C72B1F /* libRNSVG-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNSVG-tvOS.a"; sourceTree = ""; }; 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; + 61722FD8237A46A6AD7B47C7 /* libRNGestureHandler-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNGestureHandler-tvOS.a"; sourceTree = ""; }; 626A9F13C73249B8818E79A9 /* libRNFS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFS.a; sourceTree = ""; }; + 6742422040AC419C80926888 /* libRNFetchBlob.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFetchBlob.a; sourceTree = ""; }; 6AB9A21C9DD440DE899785E2 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; }; + 72EEF6E4383446DA91C07DF0 /* libRNCWebView.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCWebView.a; sourceTree = ""; }; + 7313AD3571D04D2081FDE9B1 /* libRNDateTimePicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNDateTimePicker.a; sourceTree = ""; }; 7486B3ADFE6E4933A10EB3E2 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; }; 770EB60891D549ED898A45CA /* RNRandomBytes.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNRandomBytes.xcodeproj; path = "../node_modules/react-native-randombytes/RNRandomBytes.xcodeproj"; sourceTree = ""; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; + 7B3C51ABA6784BFFAAA71AE3 /* libRNPermissions.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNPermissions.a; sourceTree = ""; }; + 8214F60179334E07BB8E0DB8 /* RNDateTimePicker.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNDateTimePicker.xcodeproj; path = "../node_modules/@react-native-community/datetimepicker/ios/RNDateTimePicker.xcodeproj"; sourceTree = ""; }; 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 842860A0D38C4F53A3EF76D3 /* FontAwesome5_Brands.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Brands.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf"; sourceTree = ""; }; + 893399C234F94788BA8526F8 /* RNImagePicker.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNImagePicker.xcodeproj; path = "../node_modules/react-native-image-picker/ios/RNImagePicker.xcodeproj"; sourceTree = ""; }; 8ADA91A9E65A468FA13F414E /* libRNScreens.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNScreens.a; sourceTree = ""; }; 8E3F117C85D440B8B541DF02 /* AntDesign.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = AntDesign.ttf; path = "../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf"; sourceTree = ""; }; 95337D25B934457F876A9ED1 /* libRNRandomBytes-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNRandomBytes-tvOS.a"; sourceTree = ""; }; + 958A6679814B47F4B08C6445 /* RNGestureHandler.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNGestureHandler.xcodeproj; path = "../node_modules/react-native-gesture-handler/ios/RNGestureHandler.xcodeproj"; sourceTree = ""; }; 9AFE20E750284A15A7F8AC7D /* libTcpSockets.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libTcpSockets.a; sourceTree = ""; }; 9C7CAE5D7DF04E2FAA775E6A /* UdpSockets.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = UdpSockets.xcodeproj; path = "../node_modules/react-native-udp/ios/UdpSockets.xcodeproj"; sourceTree = ""; }; 9CAD9DFEFF6845BBAC980F14 /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = ""; }; ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; }; AF58C5E85782430AA15D7D13 /* libRNOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNOS.a; sourceTree = ""; }; + B2398A8CE45A44C79ED68E40 /* libRNGestureHandler.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNGestureHandler.a; sourceTree = ""; }; + BC25042A7C9642DC99D2B6FF /* RNPermissions.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNPermissions.xcodeproj; path = "../node_modules/react-native-permissions/ios/RNPermissions.xcodeproj"; sourceTree = ""; }; BCE0C43464F64C95A6B4FCD7 /* RNShare.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNShare.xcodeproj; path = "../node_modules/react-native-share/ios/RNShare.xcodeproj"; sourceTree = ""; }; BCF96D32860A4D32AF3C572A /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; }; C11275B669D54454ACE53412 /* Feather.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Feather.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Feather.ttf"; sourceTree = ""; }; C3F0F1EB224C38D900279E92 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + C6F7EDA3EE7B4E5CBB8B73A8 /* libRNImagePicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNImagePicker.a; sourceTree = ""; }; CC296FAD8B214711B714557A /* libRNCamera.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCamera.a; sourceTree = ""; }; CCD4474502484E13AC0652F2 /* FontAwesome5_Solid.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Solid.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf"; sourceTree = ""; }; CD8B5748E6514788A6364B4A /* libReactNativePermissions.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libReactNativePermissions.a; sourceTree = ""; }; + D8D27F42AD16452DB4EAC0FF /* RNCWebView.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNCWebView.xcodeproj; path = "../node_modules/react-native-webview/ios/RNCWebView.xcodeproj"; sourceTree = ""; }; DFA9FBA47C0740B6B9F4D399 /* RNScreens.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNScreens.xcodeproj; path = "../node_modules/react-native-screens/ios/RNScreens.xcodeproj"; sourceTree = ""; }; DFF57B3EB4F24D3E91E7F92C /* ReactNativePermissions.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = ReactNativePermissions.xcodeproj; path = "../node_modules/react-native-permissions/ios/ReactNativePermissions.xcodeproj"; sourceTree = ""; }; E8A42999AD1946EDB1EBFE84 /* libRNVectorIcons-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNVectorIcons-tvOS.a"; sourceTree = ""; }; E9CC7D2CD3174BEE8DD60236 /* RNCamera.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNCamera.xcodeproj; path = "../node_modules/react-native-camera/ios/RNCamera.xcodeproj"; sourceTree = ""; }; + EA34A4C3F8E3474D994E8A0D /* RNTextInputMask.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNTextInputMask.xcodeproj; path = "../node_modules/react-native-text-input-mask/ios/RNTextInputMask.xcodeproj"; sourceTree = ""; }; + EC201B4A11474F438ABE0560 /* RNSVG.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNSVG.xcodeproj; path = "../node_modules/react-native-svg/ios/RNSVG.xcodeproj"; sourceTree = ""; }; EE9BCA94FD224B1795EEEFE4 /* ReactNativePermissions.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = ReactNativePermissions.xcodeproj; path = "../node_modules/react-native-permissions/ios/ReactNativePermissions.xcodeproj"; sourceTree = ""; }; F978B92BB035496884EE33CE /* RNOS.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNOS.xcodeproj; path = "../node_modules/react-native-os/ios/RNOS.xcodeproj"; sourceTree = ""; }; FB4D8853AE664293B8629FDE /* libRNShare.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNShare.a; sourceTree = ""; }; @@ -551,7 +701,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4E9EA95B23BA7B6C00B9FA10 /* libRNCamera.a in Frameworks */, C3F0F1EC224C38D900279E92 /* JavaScriptCore.framework in Frameworks */, + 3755ABA0237EB50400393E99 /* InputMask.framework in Frameworks */, ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */, 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, 146834051AC3E58100842450 /* libReact.a in Frameworks */, @@ -565,18 +717,22 @@ 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, - 1357CB44E03642BF97A6700C /* libRNCamera.a in Frameworks */, D89D7FEA42F144D7B24A3AC0 /* libRNOS.a in Frameworks */, BC4A3D5B317D44C6AE041D3C /* libRNRandomBytes.a in Frameworks */, 44493CD6D50940C7B9134034 /* libRNScreens.a in Frameworks */, 4BB7A062F04647DBBCD24E29 /* libTcpSockets.a in Frameworks */, E78EDC1DD21C4172B41D16E4 /* libUdpSockets.a in Frameworks */, 7B00A252D48B46FB9815A83E /* libRNVectorIcons.a in Frameworks */, - 74805A4DA49E44C2A9D49F12 /* libReactNativePermissions.a in Frameworks */, 674A7F4B8F6844FDB1B17D4F /* libRNCAsyncStorage.a in Frameworks */, - 7A209B33773449FC91AB7C22 /* libRNSVG.a in Frameworks */, 593FA5C43DB94CDCACE6BB12 /* libRNFS.a in Frameworks */, B203A0B9E5454C94B1BFDBA1 /* libRNShare.a in Frameworks */, + 8E9D1132B8BA4DD5BE5D347E /* libRNSVG.a in Frameworks */, + 395267E8BF4E4154A45F3398 /* libRNImagePicker.a in Frameworks */, + C78EECB16082448B90D851A7 /* libRNFetchBlob.a in Frameworks */, + C384E8F71D9F4A3B8FF19E44 /* libRNCWebView.a in Frameworks */, + 497FA154902F40AFBBFF1A76 /* libRNTextInputMask.a in Frameworks */, + E3F18E5EE5FD4C98AD647F19 /* libRNDateTimePicker.a in Frameworks */, + 222409548A77499D8CDE8D30 /* libRNGestureHandler.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -594,7 +750,8 @@ 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */, 1FC44E54BCE14973884B2942 /* libRNRandomBytes-tvOS.a in Frameworks */, 9E4AC74256FC4BB490285BFF /* libRNVectorIcons-tvOS.a in Frameworks */, - 0C55A42690BD4DCEB0968187 /* libRNSVG-tvOS.a in Frameworks */, + 4E997A1764894180A8D76D8D /* libRNSVG-tvOS.a in Frameworks */, + 9413F2A0653D4829B8444E00 /* libRNGestureHandler-tvOS.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -729,10 +886,110 @@ children = ( C3F0F1EB224C38D900279E92 /* JavaScriptCore.framework */, 2D16E6891FA4F8E400B85C8A /* libReact.a */, + 3755AB9F237EB50400393E99 /* InputMask.framework */, ); name = Frameworks; sourceTree = ""; }; + 3755AB9A237EB30400393E99 /* Products */ = { + isa = PBXGroup; + children = ( + 3755AB9E237EB30400393E99 /* libRNTextInputMask.a */, + ); + name = Products; + sourceTree = ""; + }; + 376AD841236EFCDD00B18C63 /* Products */ = { + isa = PBXGroup; + children = ( + 376AD846236EFCDE00B18C63 /* libRNSVG.a */, + 376AD848236EFCDE00B18C63 /* libRNSVG-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 376F304C2374E8940015733F /* Products */ = { + isa = PBXGroup; + children = ( + 376F30502374E8940015733F /* libRNFetchBlob.a */, + ); + name = Products; + sourceTree = ""; + }; + 377E5E7823733DA300928D60 /* Products */ = { + isa = PBXGroup; + children = ( + 377E5E7C23733DA300928D60 /* libRNImagePicker.a */, + ); + name = Products; + sourceTree = ""; + }; + 37CE7CE72376225500A031DC /* Products */ = { + isa = PBXGroup; + children = ( + 37CE7CEB2376225500A031DC /* libRNCWebView.a */, + ); + name = Products; + sourceTree = ""; + }; + 4E3F292A23BA3E5B00D38164 /* Products */ = { + isa = PBXGroup; + children = ( + 4E3F293123BA3E5B00D38164 /* libRNGestureHandler.a */, + 4E3F293323BA3E5B00D38164 /* libRNGestureHandler-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 4E3F292C23BA3E5B00D38164 /* Products */ = { + isa = PBXGroup; + children = ( + 4E3F293623BA3E5B00D38164 /* libRNPermissions.a */, + ); + name = Products; + sourceTree = ""; + }; + 4E9EA94F23BA790200B9FA10 /* Permissions */ = { + isa = PBXGroup; + children = ( + 4E9EA95923BA797F00B9FA10 /* RNPermissionHandlerPhotoLibrary.h */, + 4E9EA96123BA7DA900B9FA10 /* RNPermissions.h */, + 4E9EA96623BA7EFE00B9FA10 /* RNPermissionHandlerSiri.h */, + 4E9EA96E23BA7F2000B9FA10 /* RNPermissionHandlerBluetoothPeripheral.h */, + 4E9EA96F23BA7F2000B9FA10 /* RNPermissionHandlerBluetoothPeripheral.m */, + 4E9EA96823BA7F0900B9FA10 /* RNPermissionHandlerSpeechRecognition.h */, + 4E9EA96923BA7F0900B9FA10 /* RNPermissionHandlerSpeechRecognition.m */, + 4E9EA97123BA7F2600B9FA10 /* RNPermissionHandlerCalendars.h */, + 4E9EA97E23BA7F4600B9FA10 /* RNPermissionHandlerLocationWhenInUse.h */, + 4E9EA97D23BA7F4600B9FA10 /* RNPermissionHandlerLocationWhenInUse.m */, + 4E9EA98923BA7F7E00B9FA10 /* RNPermissionHandlerReminders.h */, + 4E9EA98A23BA7F7E00B9FA10 /* RNPermissionHandlerReminders.m */, + 4E9EA98723BA7F7700B9FA10 /* RNPermissionHandlerNotifications.h */, + 4E9EA98623BA7F7700B9FA10 /* RNPermissionHandlerNotifications.m */, + 4E9EA97723BA7F3600B9FA10 /* RNPermissionHandlerFaceID.h */, + 4E9EA97823BA7F3600B9FA10 /* RNPermissionHandlerFaceID.m */, + 4E9EA98323BA7F6C00B9FA10 /* RNPermissionHandlerMotion.h */, + 4E9EA98423BA7F6C00B9FA10 /* RNPermissionHandlerMotion.m */, + 4E9EA97A23BA7F3D00B9FA10 /* RNPermissionHandlerLocationAlways.h */, + 4E9EA97B23BA7F3D00B9FA10 /* RNPermissionHandlerLocationAlways.m */, + 4E9EA98023BA7F4F00B9FA10 /* RNPermissionHandlerMediaLibrary.h */, + 4E9EA98123BA7F5000B9FA10 /* RNPermissionHandlerMediaLibrary.m */, + 4E9EA97223BA7F2600B9FA10 /* RNPermissionHandlerCalendars.m */, + 4E9EA97423BA7F2E00B9FA10 /* RNPermissionHandlerContacts.h */, + 4E9EA97523BA7F2E00B9FA10 /* RNPermissionHandlerContacts.m */, + 4E9EA96B23BA7F1400B9FA10 /* RNPermissionHandlerStoreKit.h */, + 4E9EA96C23BA7F1400B9FA10 /* RNPermissionHandlerStoreKit.m */, + 4E9EA96523BA7EFE00B9FA10 /* RNPermissionHandlerSiri.m */, + 4E9EA96223BA7DA900B9FA10 /* RNPermissions.m */, + 4E9EA95823BA797F00B9FA10 /* RNPermissionHandlerPhotoLibrary.m */, + 4E9EA95523BA797100B9FA10 /* RNPermissionHandlerMicrophone.h */, + 4E9EA95623BA797100B9FA10 /* RNPermissionHandlerMicrophone.m */, + 4E9EA95223BA796100B9FA10 /* RNPermissionHandlerCamera.h */, + 4E9EA95323BA796100B9FA10 /* RNPermissionHandlerCamera.m */, + ); + name = Permissions; + sourceTree = ""; + }; 5E91572E1DD0AC6500FF2AA8 /* Products */ = { isa = PBXGroup; children = ( @@ -765,10 +1022,18 @@ E8A42999AD1946EDB1EBFE84 /* libRNVectorIcons-tvOS.a */, CD8B5748E6514788A6364B4A /* libReactNativePermissions.a */, FE84B4CF7E6B4D8E927EB282 /* libRNCAsyncStorage.a */, - 1B17B5F1EBAC4631BB4B4D95 /* libRNSVG.a */, 626A9F13C73249B8818E79A9 /* libRNFS.a */, FB4D8853AE664293B8629FDE /* libRNShare.a */, - 37A87853FE4947CDBB4BBC72 /* libRNSVG-tvOS.a */, + 11DCE44907D942BCA4AEBDD9 /* libRNSVG.a */, + 5DE70CFD98894B3AA5C72B1F /* libRNSVG-tvOS.a */, + C6F7EDA3EE7B4E5CBB8B73A8 /* libRNImagePicker.a */, + 6742422040AC419C80926888 /* libRNFetchBlob.a */, + 72EEF6E4383446DA91C07DF0 /* libRNCWebView.a */, + 2EF2DA6EF62D4E0FB4C905E1 /* libRNTextInputMask.a */, + 7313AD3571D04D2081FDE9B1 /* libRNDateTimePicker.a */, + B2398A8CE45A44C79ED68E40 /* libRNGestureHandler.a */, + 7B3C51ABA6784BFFAAA71AE3 /* libRNPermissions.a */, + 61722FD8237A46A6AD7B47C7 /* libRNGestureHandler-tvOS.a */, ); name = "Recovered References"; sourceTree = ""; @@ -855,9 +1120,16 @@ 6AB9A21C9DD440DE899785E2 /* RNVectorIcons.xcodeproj */, EE9BCA94FD224B1795EEEFE4 /* ReactNativePermissions.xcodeproj */, 1A1D62FAD9854483818F0F8C /* RNCAsyncStorage.xcodeproj */, - 252A9A18224F473B98B3A80A /* RNSVG.xcodeproj */, 15E7DE1EB4D34B56AD6EFD54 /* RNFS.xcodeproj */, BCE0C43464F64C95A6B4FCD7 /* RNShare.xcodeproj */, + EC201B4A11474F438ABE0560 /* RNSVG.xcodeproj */, + 893399C234F94788BA8526F8 /* RNImagePicker.xcodeproj */, + 45FD39CF955B4485B310D4D6 /* RNFetchBlob.xcodeproj */, + D8D27F42AD16452DB4EAC0FF /* RNCWebView.xcodeproj */, + EA34A4C3F8E3474D994E8A0D /* RNTextInputMask.xcodeproj */, + 8214F60179334E07BB8E0DB8 /* RNDateTimePicker.xcodeproj */, + 958A6679814B47F4B08C6445 /* RNGestureHandler.xcodeproj */, + BC25042A7C9642DC99D2B6FF /* RNPermissions.xcodeproj */, ); name = Libraries; sourceTree = ""; @@ -874,6 +1146,8 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( + 4E9EA99C23BB985200B9FA10 /* assets */, + 4E9EA94F23BA790200B9FA10 /* Permissions */, 13B07FAE1A68108700A75B9A /* verusmobile */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* verusmobileTests */, @@ -898,6 +1172,14 @@ name = Products; sourceTree = ""; }; + 90E28DF72383EFB0008766F7 /* Products */ = { + isa = PBXGroup; + children = ( + 90E28DFB2383EFB0008766F7 /* libRNDateTimePicker.a */, + ); + name = Products; + sourceTree = ""; + }; 9FA1689132444214AF5B6A83 /* Resources */ = { isa = PBXGroup; children = ( @@ -916,6 +1198,7 @@ FD85F0AE5B2D4059A3BA59BB /* Octicons.ttf */, 9CAD9DFEFF6845BBAC980F14 /* SimpleLineIcons.ttf */, 4CFDF87268374246B91A2F72 /* Zocial.ttf */, + 4BCFD26B7725491FB98CFFEA /* Fontisto.ttf */, ); name = Resources; sourceTree = ""; @@ -954,15 +1237,6 @@ name = Products; sourceTree = ""; }; - C316238C2342589000559B29 /* Products */ = { - isa = PBXGroup; - children = ( - C31623912342589000559B29 /* libRNSVG.a */, - C31623932342589000559B29 /* libRNSVG-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; C3F0F19E224C34B700279E92 /* Products */ = { isa = PBXGroup; children = ( @@ -1008,6 +1282,7 @@ 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 3755ABA2237EB50400393E99 /* Embed Frameworks */, ); buildRules = ( ); @@ -1160,14 +1435,38 @@ ProductGroup = C316237A2342588F00559B29 /* Products */; ProjectRef = 1A1D62FAD9854483818F0F8C /* RNCAsyncStorage.xcodeproj */; }, + { + ProductGroup = 37CE7CE72376225500A031DC /* Products */; + ProjectRef = D8D27F42AD16452DB4EAC0FF /* RNCWebView.xcodeproj */; + }, + { + ProductGroup = 90E28DF72383EFB0008766F7 /* Products */; + ProjectRef = 8214F60179334E07BB8E0DB8 /* RNDateTimePicker.xcodeproj */; + }, + { + ProductGroup = 376F304C2374E8940015733F /* Products */; + ProjectRef = 45FD39CF955B4485B310D4D6 /* RNFetchBlob.xcodeproj */; + }, { ProductGroup = C316237C2342589000559B29 /* Products */; ProjectRef = 15E7DE1EB4D34B56AD6EFD54 /* RNFS.xcodeproj */; }, + { + ProductGroup = 4E3F292A23BA3E5B00D38164 /* Products */; + ProjectRef = 958A6679814B47F4B08C6445 /* RNGestureHandler.xcodeproj */; + }, + { + ProductGroup = 377E5E7823733DA300928D60 /* Products */; + ProjectRef = 893399C234F94788BA8526F8 /* RNImagePicker.xcodeproj */; + }, { ProductGroup = 810686CA221E9E0200F4268D /* Products */; ProjectRef = F978B92BB035496884EE33CE /* RNOS.xcodeproj */; }, + { + ProductGroup = 4E3F292C23BA3E5B00D38164 /* Products */; + ProjectRef = BC25042A7C9642DC99D2B6FF /* RNPermissions.xcodeproj */; + }, { ProductGroup = 810686D5221E9E0300F4268D /* Products */; ProjectRef = 770EB60891D549ED898A45CA /* RNRandomBytes.xcodeproj */; @@ -1181,8 +1480,12 @@ ProjectRef = BCE0C43464F64C95A6B4FCD7 /* RNShare.xcodeproj */; }, { - ProductGroup = C316238C2342589000559B29 /* Products */; - ProjectRef = 252A9A18224F473B98B3A80A /* RNSVG.xcodeproj */; + ProductGroup = 376AD841236EFCDD00B18C63 /* Products */; + ProjectRef = EC201B4A11474F438ABE0560 /* RNSVG.xcodeproj */; + }, + { + ProductGroup = 3755AB9A237EB30400393E99 /* Products */; + ProjectRef = EA34A4C3F8E3474D994E8A0D /* RNTextInputMask.xcodeproj */; }, { ProductGroup = 810686C8221E9E0200F4268D /* Products */; @@ -1285,6 +1588,48 @@ remoteRef = 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 3755AB9E237EB30400393E99 /* libRNTextInputMask.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNTextInputMask.a; + remoteRef = 3755AB9D237EB30400393E99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 376AD846236EFCDE00B18C63 /* libRNSVG.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNSVG.a; + remoteRef = 376AD845236EFCDE00B18C63 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 376AD848236EFCDE00B18C63 /* libRNSVG-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRNSVG-tvOS.a"; + remoteRef = 376AD847236EFCDE00B18C63 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 376F30502374E8940015733F /* libRNFetchBlob.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNFetchBlob.a; + remoteRef = 376F304F2374E8940015733F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 377E5E7C23733DA300928D60 /* libRNImagePicker.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNImagePicker.a; + remoteRef = 377E5E7B23733DA300928D60 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 37CE7CEB2376225500A031DC /* libRNCWebView.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNCWebView.a; + remoteRef = 37CE7CEA2376225500A031DC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1362,6 +1707,27 @@ remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 4E3F293123BA3E5B00D38164 /* libRNGestureHandler.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNGestureHandler.a; + remoteRef = 4E3F293023BA3E5B00D38164 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 4E3F293323BA3E5B00D38164 /* libRNGestureHandler-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRNGestureHandler-tvOS.a"; + remoteRef = 4E3F293223BA3E5B00D38164 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 4E3F293623BA3E5B00D38164 /* libRNPermissions.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNPermissions.a; + remoteRef = 4E3F293523BA3E5B00D38164 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1495,6 +1861,13 @@ remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 90E28DFB2383EFB0008766F7 /* libRNDateTimePicker.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNDateTimePicker.a; + remoteRef = 90E28DFA2383EFB0008766F7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1530,20 +1903,6 @@ remoteRef = C316238A2342589000559B29 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C31623912342589000559B29 /* libRNSVG.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRNSVG.a; - remoteRef = C31623902342589000559B29 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - C31623932342589000559B29 /* libRNSVG-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRNSVG-tvOS.a"; - remoteRef = C31623922342589000559B29 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; C3F0F189224C34B600279E92 /* libjsi.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1600,6 +1959,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4E9EA99D23BB985300B9FA10 /* assets in Resources */, + 4E9EA99B23BB63A800B9FA10 /* main.jsbundle in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, 0D3855D5B0B24F33BD5C00A3 /* AntDesign.ttf in Resources */, @@ -1617,6 +1978,7 @@ FF2DDB75EC664C78A5E8BF6E /* Octicons.ttf in Resources */, 13073E97336D4B00AF0BCA70 /* SimpleLineIcons.ttf in Resources */, 9555D3418C004880B5A054B4 /* Zocial.ttf in Resources */, + 2C2A1DE2E6B441EF9DC2D561 /* Fontisto.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1650,7 +2012,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; + shellScript = "export NODE_BINARY=node\\n../node_modules/react-native/scripts/react-native-xcode.sh\n"; }; 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { isa = PBXShellScriptBuildPhase; @@ -1681,8 +2043,25 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4E9EA96723BA7EFE00B9FA10 /* RNPermissionHandlerSiri.m in Sources */, + 4E9EA96A23BA7F0900B9FA10 /* RNPermissionHandlerSpeechRecognition.m in Sources */, + 4E9EA97323BA7F2600B9FA10 /* RNPermissionHandlerCalendars.m in Sources */, 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, + 4E9EA95723BA797100B9FA10 /* RNPermissionHandlerMicrophone.m in Sources */, + 4E9EA97023BA7F2000B9FA10 /* RNPermissionHandlerBluetoothPeripheral.m in Sources */, + 4E9EA97623BA7F2E00B9FA10 /* RNPermissionHandlerContacts.m in Sources */, + 4E9EA96D23BA7F1400B9FA10 /* RNPermissionHandlerStoreKit.m in Sources */, + 4E9EA98223BA7F5000B9FA10 /* RNPermissionHandlerMediaLibrary.m in Sources */, + 4E9EA96323BA7DA900B9FA10 /* RNPermissions.m in Sources */, + 4E9EA95A23BA797F00B9FA10 /* RNPermissionHandlerPhotoLibrary.m in Sources */, + 4E9EA97923BA7F3600B9FA10 /* RNPermissionHandlerFaceID.m in Sources */, + 4E9EA97C23BA7F3E00B9FA10 /* RNPermissionHandlerLocationAlways.m in Sources */, + 4E9EA95423BA796100B9FA10 /* RNPermissionHandlerCamera.m in Sources */, + 4E9EA98823BA7F7700B9FA10 /* RNPermissionHandlerNotifications.m in Sources */, + 4E9EA98B23BA7F7E00B9FA10 /* RNPermissionHandlerReminders.m in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, + 4E9EA98523BA7F6D00B9FA10 /* RNPermissionHandlerMotion.m in Sources */, + 4E9EA97F23BA7F4700B9FA10 /* RNPermissionHandlerLocationWhenInUse.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1751,9 +2130,16 @@ "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-share/ios", + "$(SRCROOT)/../node_modules/react-native-svg/ios/**", + "$(SRCROOT)/../node_modules/react-native-image-picker/ios", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/react-native-text-input-mask/ios/**", + "$(SRCROOT)/../node_modules/@react-native-community/datetimepicker/ios/**", + "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", + "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", ); INFOPLIST_FILE = verusmobileTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1764,6 +2150,12 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1791,9 +2183,16 @@ "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-share/ios", + "$(SRCROOT)/../node_modules/react-native-svg/ios/**", + "$(SRCROOT)/../node_modules/react-native-image-picker/ios", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/react-native-text-input-mask/ios/**", + "$(SRCROOT)/../node_modules/@react-native-community/datetimepicker/ios/**", + "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", + "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", ); INFOPLIST_FILE = verusmobileTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1804,6 +2203,12 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1834,13 +2239,21 @@ "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-share/ios", + "$(SRCROOT)/../node_modules/react-native-svg/ios/**", + "$(SRCROOT)/../node_modules/react-native-image-picker/ios", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/react-native-text-input-mask/ios/**", + "$(SRCROOT)/../node_modules/@react-native-community/datetimepicker/ios/**", + "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", + "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", ); INFOPLIST_FILE = verusmobile/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.1.9; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1872,13 +2285,21 @@ "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-share/ios", + "$(SRCROOT)/../node_modules/react-native-svg/ios/**", + "$(SRCROOT)/../node_modules/react-native-image-picker/ios", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/react-native-text-input-mask/ios/**", + "$(SRCROOT)/../node_modules/@react-native-community/datetimepicker/ios/**", + "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", + "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", ); INFOPLIST_FILE = verusmobile/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.1.9; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1914,9 +2335,16 @@ "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-share/ios", + "$(SRCROOT)/../node_modules/react-native-svg/ios/**", + "$(SRCROOT)/../node_modules/react-native-image-picker/ios", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/react-native-text-input-mask/ios/**", + "$(SRCROOT)/../node_modules/@react-native-community/datetimepicker/ios/**", + "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", + "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", ); INFOPLIST_FILE = "verusmobile-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -1926,6 +2354,12 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1962,9 +2396,16 @@ "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-share/ios", + "$(SRCROOT)/../node_modules/react-native-svg/ios/**", + "$(SRCROOT)/../node_modules/react-native-image-picker/ios", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/react-native-text-input-mask/ios/**", + "$(SRCROOT)/../node_modules/@react-native-community/datetimepicker/ios/**", + "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", + "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", ); INFOPLIST_FILE = "verusmobile-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -1974,6 +2415,12 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -2006,6 +2453,12 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.verusmobile-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2034,6 +2487,12 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.verusmobile-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ios/verusMobile.xcodeproj/xcshareddata/xcschemes/verusMobile-tvOS.xcscheme b/ios/verusMobile.xcodeproj/xcshareddata/xcschemes/verusMobile-tvOS.xcscheme old mode 100644 new mode 100755 diff --git a/ios/verusMobile.xcodeproj/xcshareddata/xcschemes/verusMobile.xcscheme b/ios/verusMobile.xcodeproj/xcshareddata/xcschemes/verusMobile.xcscheme old mode 100644 new mode 100755 index 0c94973a..3c583bc7 --- a/ios/verusMobile.xcodeproj/xcshareddata/xcschemes/verusMobile.xcscheme +++ b/ios/verusMobile.xcodeproj/xcshareddata/xcschemes/verusMobile.xcscheme @@ -55,6 +55,15 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> + + + + @@ -67,17 +76,6 @@ - - - - - - - - - - - - + + - + @@ -20,13 +18,13 @@ - + - + diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/100.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/100.png new file mode 100644 index 00000000..3a81cb04 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/100.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/1024.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 00000000..d34ce0c2 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/1024.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/114.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/114.png new file mode 100644 index 00000000..6f6d5226 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/114.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/120.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 00000000..1e1e7e66 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/120.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/128.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/128.png new file mode 100644 index 00000000..431431d7 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/128.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/144.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/144.png new file mode 100644 index 00000000..1b25de8e Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/144.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/152.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/152.png new file mode 100644 index 00000000..54bef44a Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/152.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/16.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/16.png new file mode 100644 index 00000000..bfc4fdd0 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/16.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/167.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/167.png new file mode 100644 index 00000000..8e11d881 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/167.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/172.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/172.png new file mode 100644 index 00000000..5173fd75 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/172.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/180.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/180.png new file mode 100644 index 00000000..b4492dc7 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/180.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/196.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/196.png new file mode 100644 index 00000000..3101090b Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/196.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/20.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/20.png new file mode 100644 index 00000000..b488995c Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/20.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/216.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/216.png new file mode 100644 index 00000000..a78427ff Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/216.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/256.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/256.png new file mode 100644 index 00000000..d87c31e4 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/256.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/29.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/29.png new file mode 100644 index 00000000..3e70589f Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/29.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/32.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/32.png new file mode 100644 index 00000000..5a981b74 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/32.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/40.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 00000000..866894d2 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/40.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/48.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/48.png new file mode 100644 index 00000000..97f361c2 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/48.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/50.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/50.png new file mode 100644 index 00000000..478e9679 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/50.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/512.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/512.png new file mode 100644 index 00000000..6b025994 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/512.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/55.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/55.png new file mode 100644 index 00000000..6aa8ebcd Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/55.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/57.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/57.png new file mode 100644 index 00000000..c9a6f5fb Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/57.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/58.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/58.png new file mode 100644 index 00000000..b19f6e32 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/58.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/60.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/60.png new file mode 100644 index 00000000..d77ac8d4 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/60.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/64.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/64.png new file mode 100644 index 00000000..97f2d576 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/64.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/72.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/72.png new file mode 100644 index 00000000..c4d831e6 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/72.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/76.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/76.png new file mode 100644 index 00000000..428a3089 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/76.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/80.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/80.png new file mode 100644 index 00000000..8743c8be Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/80.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/87.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/87.png new file mode 100644 index 00000000..1c0e9844 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/87.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/88.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/88.png new file mode 100644 index 00000000..d9c21f81 Binary files /dev/null and b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/88.png differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/Contents.json index 73c5ec79..e138c0bd 100644 --- a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,62 +1 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "verus-20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "verus-20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "verus-29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "verus-29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "verus-40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "verus-40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "verus-60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "verus-60@3x.png", - "scale" : "3x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "verus-1024.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file +{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"idiom":"watch","filename":"172.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"86x86","expected-size":"172","role":"quickLook"},{"idiom":"watch","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"40x40","expected-size":"80","role":"appLauncher"},{"idiom":"watch","filename":"88.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"40mm","scale":"2x","size":"44x44","expected-size":"88","role":"appLauncher"},{"idiom":"watch","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"50x50","expected-size":"100","role":"appLauncher"},{"idiom":"watch","filename":"196.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"98x98","expected-size":"196","role":"quickLook"},{"idiom":"watch","filename":"216.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"108x108","expected-size":"216","role":"quickLook"},{"idiom":"watch","filename":"48.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"24x24","expected-size":"48","role":"notificationCenter"},{"idiom":"watch","filename":"55.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"27.5x27.5","expected-size":"55","role":"notificationCenter"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"3x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"2x"},{"size":"1024x1024","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch-marketing","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} \ No newline at end of file diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-1024.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-1024.png deleted file mode 100644 index 993efe54..00000000 Binary files a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-1024.png and /dev/null differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-20@2x.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-20@2x.png deleted file mode 100644 index 47e31384..00000000 Binary files a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-20@2x.png and /dev/null differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-20@3x.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-20@3x.png deleted file mode 100644 index ded05166..00000000 Binary files a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-20@3x.png and /dev/null differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-29@2x.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-29@2x.png deleted file mode 100644 index 6fbcb406..00000000 Binary files a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-29@2x.png and /dev/null differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-29@3x.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-29@3x.png deleted file mode 100644 index d131cb6b..00000000 Binary files a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-29@3x.png and /dev/null differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-40@2x.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-40@2x.png deleted file mode 100644 index bba441c3..00000000 Binary files a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-40@2x.png and /dev/null differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-40@3x.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-40@3x.png deleted file mode 100644 index 2d77cdf6..00000000 Binary files a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-40@3x.png and /dev/null differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-60@2x.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-60@2x.png deleted file mode 100644 index 2d77cdf6..00000000 Binary files a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-60@2x.png and /dev/null differ diff --git a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-60@3x.png b/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-60@3x.png deleted file mode 100644 index c432b600..00000000 Binary files a/ios/verusMobile/Images.xcassets/AppIcon.appiconset/verus-60@3x.png and /dev/null differ diff --git a/ios/verusMobile/Images.xcassets/Contents.json b/ios/verusMobile/Images.xcassets/Contents.json old mode 100644 new mode 100755 diff --git a/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Contents.json b/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Contents.json old mode 100644 new mode 100755 diff --git a/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash-1.png b/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash-1.png index c689a387..68631493 100644 Binary files a/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash-1.png and b/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash-1.png differ diff --git a/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash-2.png b/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash-2.png index c689a387..d14af95a 100644 Binary files a/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash-2.png and b/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash-2.png differ diff --git a/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash.png b/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash.png index c689a387..eaa9727b 100644 Binary files a/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash.png and b/ios/verusMobile/Images.xcassets/Verus-Splash.imageset/Verus-Splash.png differ diff --git a/ios/verusMobile/Info.plist b/ios/verusMobile/Info.plist old mode 100644 new mode 100755 index d13606ad..03c5c63d --- a/ios/verusMobile/Info.plist +++ b/ios/verusMobile/Info.plist @@ -17,11 +17,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.1.8 + $(MARKETING_VERSION) CFBundleSignature ???? CFBundleVersion 0.1 + LSApplicationCategoryType + LSRequiresIPhoneOS NSAppTransportSecurity @@ -43,6 +45,14 @@ My app does not request this permission or utilize this functionality but it is included in our info.plist since our app utilizes the react-native-permissions library, which references this permission in its code. NSCalendarsUsageDescription My app does not request this permission or utilize this functionality but it is included in our info.plist since our app utilizes the react-native-permissions library, which references this permission in its code. + NSContactsUsageDescription + My app does not request this permission or utilize this functionality but it is included in our info.plist since our app utilizes the react-native-permissions library, which references this permission in its code. + NSSiriUsageDescription + My app does not request this permission or utilize this functionality but it is included in our info.plist since our app utilizes the react-native-permissions library, which references this permission in its code. + NSLocationAlwaysUsageDescription + My app does not request this permission or utilize this functionality but it is included in our info.plist since our app utilizes the react-native-permissions library, which references this permission in its code. + NSBluetoothAlwaysUsageDescription + My app does not request this permission or utilize this functionality but it is included in our info.plist since our app utilizes the react-native-permissions library, which references this permission in its code. NSCameraUsageDescription VerusPay needs access to the camera to scan QR codes NSLocationWhenInUseUsageDescription diff --git a/ios/verusMobile/main.m b/ios/verusMobile/main.m old mode 100644 new mode 100755 diff --git a/ios/verusMobileTests/Info.plist b/ios/verusMobileTests/Info.plist old mode 100644 new mode 100755 diff --git a/ios/verusMobileTests/verusMobileTests.m b/ios/verusMobileTests/verusMobileTests.m old mode 100644 new mode 100755 diff --git a/package.json b/package.json old mode 100644 new mode 100755 index 60ecd4d8..3f983ed7 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "verusmobile", - "version": "0.1.8-beta", + "version": "0.1.9-beta", "private": true, "scripts": { - "postinstall": "patch-package && ./node_modules/.bin/rn-nodeify --hack --install", + "postinstall": "patch-package && ./node_modules/.bin/rn-nodeify --hack --install && npx jetify", "start": "node node_modules/react-native/local-cli/cli.js start", "android": "react-native run-android", "ios": "react-native run-ios", @@ -13,13 +13,18 @@ "test": "jest" }, "dependencies": { + "@babel/core": "^7.7.7", "@babel/runtime": "7.0.0-beta.55", "@react-native-community/async-storage": "^1.5.1", + "@react-native-community/datetimepicker": "^2.1.0", "@react-navigation/core": "^3.0.2", "@react-navigation/native": "^3.1.1", "@tradle/react-native-http": "^2.0.1", "agama-wallet-lib": "git://github.com/VerusCoin/agama-wallet-lib.git#mobile", "assert": "^1.4.1", + "asyncstorage-down": "^4.2.0", + "axios": "^0.19.0", + "babel-core": "^6.26.3", "babel-preset-es2015": "^6.24.1", "babel-preset-stage-2": "^6.24.1", "babel-runtime": "^6.20.0", @@ -28,6 +33,7 @@ "browserify": "^16.2.3", "browserify-zlib": "^0.1.4", "buffer": "^4.9.1", + "coinselect": "^3.1.11", "console-browserify": "^1.1.0", "cordova-common": "^3.1.0", "dns.js": "^1.0.1", @@ -43,24 +49,30 @@ "patch-package": "^6.1.2", "path-browserify": "0.0.0", "postinstall-postinstall": "^2.0.0", + "prop-types": "^15.7.2", "qrcode.react": "^0.7.1", "querystring-es3": "^0.2.1", "react": "16.8.3", + "react-art": "^16.12.0", "react-dom": "^16.4.2", "react-native": "0.59.9", "react-native-alert-async": "^1.0.3", "react-native-cache": "https://github.com/michaeltout/react-native-cache.git", "react-native-camera": "^1.10.1", + "react-native-country-picker-modal": "^1.5.2", "react-native-crypto": "^2.1.2", "react-native-elements": "^0.19.1", - "react-native-fs": "^2.14.1", + "react-native-fs": "~2.15.0", + "react-native-gesture-handler": "~1.4.0", + "react-native-image-picker": "^1.1.0", "react-native-level-fs": "^3.0.1", "react-native-loading-spinner-overlay": "^1.0.1", "react-native-material-bottom-navigation": "^1.0.2", "react-native-material-dropdown": "^0.11.1", "react-native-os": "^1.2.1", "react-native-paper": "^2.6.3", - "react-native-permissions": "^1.1.1", + "react-native-permissions": "^2.0.8", + "react-native-plaid-link": "^1.4.4", "react-native-progress": "^3.5.0", "react-native-qrcode-scanner": "^1.1.2", "react-native-qrcode-svg": "^5.1.2", @@ -69,14 +81,19 @@ "react-native-share": "1.2.1", "react-native-svg": "^9.2.4", "react-native-tcp": "^3.3.0", + "react-native-text-input-mask": "^1.0.6", "react-native-udp": "^2.3.1", "react-native-vector-icons": "^6.2.0", + "react-native-web": "^0.12.0-rc.1", + "react-native-webview": "^8.0.2", + "react-native-windows": "^0.59.0-legacy.1", "react-navigation": "1.2.1", "react-navigation-material-bottom-tabs": "^1.0.0", "react-redux": "^5.0.6", "readable-stream": "^1.0.33", "redux": "^3.6.0", "redux-thunk": "^2.2.0", + "rn-fetch-blob": "^0.11.2", "stream-browserify": "^1.0.0", "string_decoder": "^0.10.31", "timers-browserify": "^1.4.2", @@ -90,6 +107,7 @@ "devDependencies": { "babel-jest": "23.6.0", "jest": "^24.9.0", + "jetifier": "^1.6.4", "metro-react-native-babel-preset": "0.53.1", "node-fetch": "^2.6.0", "react-test-renderer": "16.5.0", @@ -104,7 +122,7 @@ "level-filesystem": "1.2.0", "levelup": "4.1.0", "mem": "5.1.1", - "handlebars": "^4.4.0" + "handlebars": "^4.5.3" }, "jest": { "preset": "react-native", diff --git a/src/VerusMobile.js b/src/VerusMobile.js index 541b7483..e44f112b 100644 --- a/src/VerusMobile.js +++ b/src/VerusMobile.js @@ -10,7 +10,7 @@ import { import { initCache, clearCachedVersions, - updateActiveCoinList_v0_1_8_beta, + updateActiveCoinList_v0_1_9_beta, checkAndSetVersion } from './utils/asyncStore/asyncStore' import { connect } from 'react-redux'; @@ -45,9 +45,9 @@ class VerusMobile extends React.Component { let promiseArr = [fetchUsers(), initSettings()] //Handle version change stuff here - if (global.APP_VERSION === '0.1.8-beta' && versionCompare === -1) { - if (__DEV__) console.log("Old version detected, updating active coins for 0.1.8-beta") - promiseArr.push(updateActiveCoinList_v0_1_8_beta()) + if (global.APP_VERSION === '0.1.9-beta' && versionCompare === -1) { + if (__DEV__) console.log("Old version detected, updating active coins for 0.1.9-beta") + promiseArr.push(updateActiveCoinList_v0_1_9_beta()) } return Promise.all(promiseArr) diff --git a/src/actions/actionCreators.js b/src/actions/actionCreators.js index 742320b5..964ae754 100644 --- a/src/actions/actionCreators.js +++ b/src/actions/actionCreators.js @@ -78,6 +78,14 @@ export const setCoinSettingsState = (state) => { } } +//Reducer Name: settings +export const setBuySellSettingsState = (state) => { + return { + type: 'SET_BUY_SELL_SETTINGS_STATE', + wyreSettings: state + } +} + //Reducer Name: settings export const setGeneralWalletSettingsState = (state) => { return { @@ -238,3 +246,93 @@ export const setActiveSectionCustomCoins = (activeSection) => { } } +//Reducer name: buySellCrypto +export const setActiveSectionBuySellCrypto = (activeSection) => { + return { + type: 'SET_ACTIVE_SECTION_BUY_SELL_CRYPTO', + activeSection: activeSection + } +} + +// Payment Method +export const createWyreAccount = () => ({ + type: 'CREATE_WYRE_ACCOUNT', + payload: {}, +}); + +export const createWyreAccountResponse = () => ({ + type: 'CREATE_WYRE_ACCOUNT_RESPONSE', + payload: {}, +}); + +export const getWyreAccount = () => ({ + type: 'GET_WYRE_ACCOUNT', + payload: {}, +}); + +export const getWyreAccountResponse = (account = {}) => ({ + type: 'GET_WYRE_ACCOUNT_RESPONSE', + payload: { + account, + }, +}); + +export const putWyreAccount = () => ({ + type: 'PUT_WYRE_ACCOUNT', + payload: {}, +}); + +export const putWyreAccountResponse = (account = {}) => ({ + type: 'PUT_WYRE_ACCOUNT_RESPONSE', + payload: { + account, + }, +}); + +export const getWyreConfig = () => ({ + type: 'GET_WYRE_CONFIG', + payload: {}, +}); + +export const getWyreConfigResponse = (config = {}) => ({ + type: 'GET_WYRE_CONFIG_RESPONSE', + payload: { + config, + }, +}); + +export const createWyrePayment = () => ({ + type: 'CREATE_WYRE_PAYMENT', + payload: {}, +}); + +export const createWyrePaymentResponse = (payment = {}) => ({ + type: 'CREATE_WYRE_PAYMENT_RESPONSE', + payload: { + payment, + }, +}); + +export const getActiveTransaction = () => ({ + type: 'GET_EXCHANGE_RATES', + payload: {}, +}); + +export const getActiveTransactionResponse = (rates = {}) => ({ + type: 'GET_EXCHANGE_RATES_RESPONSE', + payload: { + rates, + }, +}); + +export const getTransactionHistory = () => ({ + type: 'GET_TRANSACTION_HISTORY', + payload: {}, +}); + +export const getTransactionHistoryResponse = (history = {}) => ({ + type: 'GET_TRANSACTION_HISTORY_RESPONSE', + payload: { + history, + } +}); diff --git a/src/actions/actions/Coins.js b/src/actions/actions/Coins.js index ce93ba32..87f557b6 100644 --- a/src/actions/actions/Coins.js +++ b/src/actions/actions/Coins.js @@ -34,7 +34,7 @@ export const addExistingCoin = (fullCoinObj, activeCoins, userName) => { } } else { - activeCoins.push(fullCoinObj); + activeCoins.push({...fullCoinObj, users: [userName]}); return new Promise((resolve, reject) => { storeCoins(activeCoins) .then((res) => { diff --git a/src/actions/actions/Ledger.js b/src/actions/actions/Ledger.js index 3ed79798..420b5a03 100644 --- a/src/actions/actions/Ledger.js +++ b/src/actions/actions/Ledger.js @@ -4,6 +4,8 @@ import { updateCoinRates } from '../actionCreators'; +import { Alert } from 'react-native' + import { getBalances, getOneBalance, @@ -106,6 +108,7 @@ export const fetchTransactionsForCoin = (oldTransactions, coinObj, activeUser, n let consolidatedTxs = gottenBlocksInfo.pop() let _parsedTxList = [] let index = 0 + let error = false let network = networks[coinObj.id.toLowerCase()] ? networks[coinObj.id.toLowerCase()] : networks['default'] for (let i = 0; i < gottenBlocksInfo.length; i++) { @@ -121,9 +124,14 @@ export const fetchTransactionsForCoin = (oldTransactions, coinObj, activeUser, n } for (let i = 0; i < consolidatedTxs.transactions.length; i++) { - _parsedTxList.push(formatTx(consolidatedTxs.transactions[i], address, network, consolidatedTxs.currentHeight)) + const formattedTx = formatTx(consolidatedTxs.transactions[i], address, network, consolidatedTxs.currentHeight) + + if (formattedTx != false) _parsedTxList.push(formattedTx) + else error = true } + if (error) Alert.alert(`Error reading transaction list for ${coinObj.id}. This may indicate electrum server maintenence.`) + resolve(updateCoinTransactions(coinObj.id, _parsedTxList, oldTransactions, needsUpdateObj)) }) .catch(err => reject(err)) diff --git a/src/actions/actions/PaymentMethod/WyreAccount.js b/src/actions/actions/PaymentMethod/WyreAccount.js new file mode 100644 index 00000000..2962588e --- /dev/null +++ b/src/actions/actions/PaymentMethod/WyreAccount.js @@ -0,0 +1,280 @@ +import DelayedAlert from '../../../utils/delayedAlert'; +import { NavigationActions } from 'react-navigation'; + +import { WYRE_URL } from '../../../utils/constants'; + +import WyreService from '../../../services/wyreService'; +import { putUserPaymentMethods } from '../../../utils/asyncStore/asyncStore'; + +import { + selectWyrePaymentMethod, + selectActiveAccount, +} from '../../../selectors/authentication'; +import hasPaymentMethod from '../../../utils/paymentMethod'; + +import { + createWyreAccount, + createWyreAccountResponse, + getWyreAccount, + getWyreAccountResponse, + setAccounts, + signIntoAccount, + putWyreAccount, + putWyreAccountResponse, + getWyreConfig, + getWyreConfigResponse, + createWyrePayment, + createWyrePaymentResponse, + getActiveTransaction, + getActiveTransactionResponse, + getTransactionHistory, + getTransactionHistoryResponse +} from '../../actionCreators'; + + +const getPaymentAddress = (account, currency) => { + switch (currency) { + case 'BTC': + return `bitcoin:${account.depositAddresses.BTC}`; + case 'USD': + return `account:${account.id}`; + default: + return ''; + } +}; + +export const manageAccount = (navigation) => async (dispatch, getState) => { + const state = getState(); + const paymentMethod = selectWyrePaymentMethod(state); + + if (!hasPaymentMethod(paymentMethod)) { + // Create account + try { + dispatch(createWyreAccount()); + + const { data, key, error } = await WyreService.build().createAccount(paymentMethod.key); + + dispatch(createWyreAccountResponse()); + + if (error) return DelayedAlert('Failed creating Wyre account'); + + const activeAccount = selectActiveAccount(state); + + const newActiveAccount = { + ...activeAccount, + paymentMethods: { + ...activeAccount.paymentMethods, + wyre: { + id: data.id, + key, + } + } + }; + + dispatch(signIntoAccount(newActiveAccount)); + + } catch (error) { + dispatch(createWyreAccountResponse()); + return DelayedAlert('Failed creating Wyre account'); + } + } + // Navigate to manage screen + return navigation.navigate('ManageWyreAccount'); +}; + +export const getAccount = () => async (dispatch, getState) => { + const state = getState(); + const paymentMethod = selectWyrePaymentMethod(state); + if (!hasPaymentMethod(paymentMethod)) { + DelayedAlert('No Payment Account'); + return; + } + dispatch(getWyreAccount()); + try { + const { data, error } = await WyreService.build() + .getAccount(paymentMethod.id, paymentMethod.key); + + dispatch(getWyreAccountResponse(data)); + + if (error) DelayedAlert('Failed fetching Wyre account'); + + } catch (error) { + dispatch(getWyreAccountResponse()); + DelayedAlert('Failed fetching Wyre account'); + } +}; + +export const putWyreAccountField = (params, navigation, onSuccess) => async (dispatch, getState) => { + const state = getState(); + const paymentMethod = selectWyrePaymentMethod(state); + if (!hasPaymentMethod(paymentMethod)) { + return DelayedAlert('No Payment Account'); + } + dispatch(putWyreAccount()); + try { + const { data, error } = await WyreService.build() + .putAccount(paymentMethod.id, paymentMethod.key, { + profileFields: params, + }); + + dispatch(putWyreAccountResponse(data)); + if (error) return DelayedAlert('Failed updating Wyre account', error); + } catch (error) { + dispatch(putWyreAccountResponse(null)); + return DelayedAlert('Failed updating Wyre account', error); + } + if (onSuccess) { + return onSuccess() + } + return navigation.dispatch(NavigationActions.back()); +}; + +export const uploadWyreAccountDocument = (field, uri, type, onSuccess) => async (dispatch, getState) => { + const state = getState(); + const paymentMethod = selectWyrePaymentMethod(state); + if (!hasPaymentMethod(paymentMethod)) { + return DelayedAlert('No Payment Account'); + } + dispatch(putWyreAccount()); + try { + const { data, error } = await WyreService.build() + .uploadDocument(paymentMethod.id, paymentMethod.key, field, uri, type); + + dispatch(putWyreAccountResponse(data)); + + if (error) return DelayedAlert('Failed uploading Wyre document', error); + } catch (error) { + dispatch(putWyreAccountResponse()); + return DelayedAlert('Failed uploading Wyre document'); + } + return onSuccess(); +}; + +export const getConfig = () => async (dispatch) => { + dispatch(getWyreConfig()); + try { + const response = await fetch(`${WYRE_URL}/v2/client/config/plaid`); + + if (response.ok) { + const config = await response.json(); + dispatch(getWyreConfigResponse(config)); + } else { + DelayedAlert('Failed fetching Wyre payment method configuration'); + } + } catch (error) { + dispatch(getWyreConfigResponse()); + DelayedAlert('Failed fetching Wyre payment method configuration'); + } +}; + +export const createWyreAccountPaymentMethod = (token, navigation) => async (dispatch, getState) => { + const state = getState(); + const paymentMethod = selectWyrePaymentMethod(state); + if (!hasPaymentMethod(paymentMethod)) { + DelayedAlert('No Payment Account'); + return; + } + + dispatch(putWyreAccount()); + try { + const { error } = await WyreService.build() + .createPaymentMethod(paymentMethod.key, token); + + if (error) DelayedAlert('Failed creating Wyre payment method', error); + } catch (error) { + DelayedAlert('Failed creating Wyre payment method'); + } + dispatch(putWyreAccountResponse({})); + navigation.dispatch(NavigationActions.back()); +}; + +export const sendTransaction = (_, fromCurr, fromVal, toCurr, navigation) => async (dispatch, getState) => { + const state = getState(); + const paymentMethod = selectWyrePaymentMethod(state); + if (!hasPaymentMethod(paymentMethod)) { + DelayedAlert('No Payment Account'); + return; + } + + dispatch(createWyrePayment()); + try { + const paymentMethods = await WyreService.build() + .getPaymentMethods(paymentMethod.key); + + if (paymentMethods.error || !paymentMethods.data.length) { + DelayedAlert('Cannot fetch Payment Method'); + dispatch(createWyrePaymentResponse()); + return; + } + + const account = await WyreService.build() + .getAccount(paymentMethod.id, paymentMethod.key); + + if (account.error) { + DelayedAlert('Cannot fetch Payment Account'); + dispatch(createWyrePaymentResponse()); + return; + } + + const { error } = await WyreService.build() + .createTransfer( + paymentMethod.key, + `${paymentMethods.data[0].srn}:ach`, + fromCurr, + fromVal, + getPaymentAddress(account.data, toCurr), + toCurr + ); + + dispatch(createWyrePaymentResponse()); + + if (error) { + DelayedAlert('Failed to create Wyre Transfer', error); + return; + } + + DelayedAlert('Payment Success'); + navigation.dispatch(NavigationActions.back()); + } catch (error) { + dispatch(createWyrePaymentResponse()); + DelayedAlert('Failed to create Wyre Transfer'); + } +}; + +export const getExchangeRates = () => async (dispatch) => { + dispatch(getActiveTransaction()); + try { + const { data, error } = await WyreService.build().getRates(); + if (!error) { + dispatch(getActiveTransactionResponse(data)); + } else { + DelayedAlert('Failed fetching Exchange rates'); + } + } catch (error) { + dispatch(getActiveTransactionResponse()); + DelayedAlert('Failed fetching Exchange rates'); + } +}; + +export const getTransactions = () => async (dispatch, getState) => { + const state = getState(); + const paymentMethod = selectWyrePaymentMethod(state); + if (!hasPaymentMethod(paymentMethod)) { + DelayedAlert('No Payment Account'); + return; + } + dispatch(getTransactionHistory()); + try { + const { data, error } = await WyreService.build().getTransactions(paymentMethod.key) + if (!error) { + dispatch(getTransactionHistoryResponse(data)); + } else { + DelayedAlert('Failed fetching transactions history') + } + } catch (error) { + dispatch(getTransactionHistoryResponse()); + DelayedAlert('Failed fetching transactions history'); + } +} + +export default manageAccount; \ No newline at end of file diff --git a/src/actions/actions/UserData.js b/src/actions/actions/UserData.js index 66fc09a1..0ebefaae 100644 --- a/src/actions/actions/UserData.js +++ b/src/actions/actions/UserData.js @@ -1,9 +1,9 @@ -import { +import { setAccounts, setFingerAuth, signIntoAccount, updateAccountKeys - } from '../actionCreators'; +} from '../actionCreators'; import { storeUser, getUsers, @@ -16,13 +16,19 @@ import { makeKeyPair } from '../../utils/keys' import { - decryptkey + decryptkey, + decryptGeneral, } from '../../utils/seedCrypt' +import { sha256 } from '../../utils/crypto/hash'; + +import WyreService from '../../services/wyreService'; +import { ENABLE_WYRE } from '../../utils/constants'; + //TODO: Fingerprint authentication export const addUser = (userName, wifKey, pin, users) => { - let authData = {wifKey: wifKey, pin: pin, userName: userName} + let authData = { wifKey: wifKey, pin: pin, userName: userName } return new Promise((resolve, reject) => { storeUser(authData, users) .then(res => { @@ -81,8 +87,29 @@ export const loginUser = (account, password) => { _keys[activeCoins[i].id] = makeKeyPair(seed, activeCoins[i].id) } } - let _activeAccount = {id: account.id, wifKey: seed, keys: _keys} - resolve(signIntoAccount(_activeAccount)) + + let paymentMethods = { + ...account.paymentMethods + } + + if (ENABLE_WYRE) { + const hashedSeed = sha256(seed).toString('hex'); + + WyreService.build().submitAuthToken(hashedSeed).then((response) => { + + const submitAuthTokenResponse = response.data; + + paymentMethods.wyre = { + id: submitAuthTokenResponse.authenticatedAs ? + submitAuthTokenResponse.authenticatedAs.slice(8) : null, + key: hashedSeed + } + + resolve(signIntoAccount({ id: account.id, wifKey: seed, keys: _keys, paymentMethods })); + }); + } else { + resolve(signIntoAccount({ id: account.id, wifKey: seed, keys: _keys, paymentMethods: {} })); + } }) .catch(err => reject(err)); }); @@ -113,6 +140,3 @@ export const addKeypair = (seed, coinID, keys) => { return updateAccountKeys(_keys) } - - - diff --git a/src/actions/actions/WalletSettings.js b/src/actions/actions/WalletSettings.js index 2ab28a75..a0d013e1 100644 --- a/src/actions/actions/WalletSettings.js +++ b/src/actions/actions/WalletSettings.js @@ -1,6 +1,7 @@ import { setAllSettings, setCoinSettingsState, + setBuySellSettingsState, setGeneralWalletSettingsState } from '../actionCreators' import { @@ -60,6 +61,26 @@ export const saveCoinSettings = (stateChanges, coinID) => { }) } +/** + * Saves a single buy/sell settings state change to Async storage and returns a promise that resolves + * to an action to be dispatched to the redux store. Rejects on error. + * @param {Object} stateChanges Changes to be made to the user's buy/sell setting state + * @param {String} userID UserID of the user who's buy/sell settings are being modified + */ +export const saveBuySellSettings = (stateChanges, userID) => { + const settingsState = store.getState().settings + const buySellSettingsForUser = {...settingsState.buySellSettings[userID], ...stateChanges} + const buySellSettings = {...settingsState.buySellSettings, [userID]: buySellSettingsForUser} + + return new Promise((resolve, reject) => { + storeSettings({...settingsState, buySellSettings}) + .then(() => { + resolve(setBuySellSettingsState(buySellSettings)) + }) + .catch(err => reject(err)) + }) +} + /** * Saves a general settings state change to Async storage and returns a promise that resolves * to an action to be dispatched to the redux store. Rejects on error. diff --git a/src/assets/fonts/Arial.ttf b/src/assets/fonts/Arial.ttf deleted file mode 100644 index ab68fb19..00000000 Binary files a/src/assets/fonts/Arial.ttf and /dev/null differ diff --git a/src/components/DrawerHeader.js b/src/components/DrawerHeader.js index 9cc8dd21..d220bc3f 100644 --- a/src/components/DrawerHeader.js +++ b/src/components/DrawerHeader.js @@ -7,26 +7,28 @@ import { TouchableOpacity, Platform } from 'react-native'; +import Colors from '../globals/colors'; -const LOGO_DIR = require('../images/customIcons/verusHeaderLogo.png'); +const LOGO_DIR = require('../images/customIcons/Verus.png'); const DrawerHeader = ({ navigateToScreen }) => ( navigateToScreen('Home')}> - + Verus Wallet diff --git a/src/components/QRModal.js b/src/components/QRModal.js index 5f590990..ff8bbef5 100644 --- a/src/components/QRModal.js +++ b/src/components/QRModal.js @@ -24,6 +24,7 @@ import AlertAsync from "react-native-alert-async" import { Icon } from "react-native-elements" import RNFS from "react-native-fs" import Share from 'react-native-share'; +import Colors from '../globals/colors'; const LOGO_DIR = require('../images/customIcons/verusQRLogo.png'); const NOT_REAL_ERROR_MSG = "User did not share" @@ -155,20 +156,20 @@ class QRModal extends Component { {return 0} : this.requestSaveQR} activeOpacity={this.state.libraryPressed ? 1 : DEFAULT_OPACITY}> - + {Platform.OS === 'ios' && {return 0} : this.requestShareQR} activeOpacity={this.state.sharePressed ? 1 : DEFAULT_OPACITY}> - + } @@ -182,7 +183,7 @@ export default QRModal; const styles = StyleSheet.create({ root: { - backgroundColor: "#232323", + backgroundColor: Colors.secondaryColor, }, singleButtonContainer: { width: "75%", @@ -206,14 +207,14 @@ const styles = StyleSheet.create({ mainLabel: { backgroundColor: "transparent", fontSize: 22, - color: "#E9F1F7", + color: Colors.quinaryColor, textAlign: "center", paddingBottom: 10 }, mainDesc: { backgroundColor: "transparent", fontSize: 16, - color: "#E9F1F7", + color: Colors.quinaryColor, textAlign: "center" }, textContainer: { diff --git a/src/components/ScanSeed.js b/src/components/ScanSeed.js index a3211221..463f0c57 100644 --- a/src/components/ScanSeed.js +++ b/src/components/ScanSeed.js @@ -52,7 +52,7 @@ class ScanSeed extends Component { diff --git a/src/containers/AddCoin.js b/src/containers/AddCoin/AddCoin.js similarity index 87% rename from src/containers/AddCoin.js rename to src/containers/AddCoin/AddCoin.js index c6dc69dc..5beef45c 100644 --- a/src/containers/AddCoin.js +++ b/src/containers/AddCoin/AddCoin.js @@ -7,14 +7,16 @@ import React, { Component } from "react"; import { SearchBar, ListItem } from "react-native-elements"; -import { View, StyleSheet, FlatList, TouchableOpacity, Alert } from "react-native"; +import { View, FlatList, TouchableOpacity, Alert } from "react-native"; import { connect } from 'react-redux'; +import styles from './AddCoin.styles' +import Colors from '../../globals/colors'; import { defaultAssetsPath, namesList, findCoinObj -} from '../utils/CoinData'; +} from '../../utils/CoinData'; class AddCoin extends Component { constructor(props) { @@ -90,8 +92,9 @@ class AddCoin extends Component { roundAvatar title={item} avatar={defaultAssetsPath.coinLogo[item.toLowerCase()]} - containerStyle={{ borderBottomWidth: 0 }} - titleStyle={{color: "#E9F1F7"}} + containerStyle={styles.listItemContainer} + titleStyle={{color: "black", fontFamily: 'Avenir'}} + chevronColor={Colors.quinaryColor} /> )} @@ -110,13 +113,4 @@ const mapStateToProps = (state) => { export default connect(mapStateToProps)(AddCoin); -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - coinList: { - width: "100%", - }, -}); + diff --git a/src/containers/AddCoin/AddCoin.styles.js b/src/containers/AddCoin/AddCoin.styles.js new file mode 100644 index 00000000..eb1ff2b4 --- /dev/null +++ b/src/containers/AddCoin/AddCoin.styles.js @@ -0,0 +1,16 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center" + }, + coinList: { + width: "90%", + }, + listItemContainer: { + borderBottomWidth: 0, + } +}); \ No newline at end of file diff --git a/src/containers/BuySellCrypto/BuyCrypto/BuyCrypto.js b/src/containers/BuySellCrypto/BuyCrypto/BuyCrypto.js new file mode 100644 index 00000000..55bd4b46 --- /dev/null +++ b/src/containers/BuySellCrypto/BuyCrypto/BuyCrypto.js @@ -0,0 +1,565 @@ +/* + This component is responsible for creating cryptocurrency buy orders, + and pushing them to the confirmation screen +*/ + +import React, { Component } from "react" +import Button1 from "../../../symbols/button1" +import { + View, + ScrollView, + Keyboard, + RefreshControl, + Text, + TouchableWithoutFeedback, + } from "react-native" +import { ListItem } from "react-native-elements"; +import { NavigationActions } from 'react-navigation'; +import Spinner from 'react-native-loading-spinner-overlay'; +import { FormLabel, FormInput, FormValidationMessage, Icon, TouchableOpacity } from 'react-native-elements' +import { connect } from 'react-redux' +import { Dropdown } from 'react-native-material-dropdown' +import { isNumber } from '../../../utils/math'; +import { calculatePrice } from '../../../utils/price'; +import { SUPPORTED_CRYPTOCURRENCIES, SUPPORTED_FIAT_CURRENCIES, SUPPORTED_PAYMENT_METHODS } from '../../../utils/constants' +import { + setCoinRates, + everythingNeedsUpdate, + addExistingCoin, + setUserCoins, + addKeypair, + transactionsNeedUpdate, + needsUpdate, + updateCoinBalances +} from '../../../actions/actionCreators' +import { findCoinObj } from '../../../utils/CoinData' +import styles from './BuyCrypto.styles' +import DelayedAsyncAlert from '../../../utils/delayedAsyncAlert' +import DelayedAlert from '../../../utils/delayedAlert'; +import Colors from '../../../globals/colors'; +import { ENABLE_WYRE } from '../../../utils/constants' + +import { + BankBuildingBlack, Bank, +} from '../../../images/customIcons'; + +import { + getExchangeRates, +} from '../../../actions/actions/PaymentMethod/WyreAccount'; + +import { + selectWyreCreatePaymentIsFetching, + selectExchangeRates, + selectExchangeRatesIsFetching, +} from '../../../selectors/paymentMethods'; +import { selectWyrePaymentMethod } from '../../../selectors/authentication'; +import hasPaymentMethod from '../../../utils/paymentMethod'; +class BuyCrypto extends Component { + constructor(props) { + super(props); + const initialToCurr = this.props.activeCoinsForUser.find(coin => { + return SUPPORTED_CRYPTOCURRENCIES.map(x => x.value).includes(coin.id); + }) + this.state = { + fromCurr: SUPPORTED_FIAT_CURRENCIES[0].value, + toCurr: initialToCurr ? initialToCurr.id : 'Select...', + fromVal: '', + toVal: '', + paymentMethod: SUPPORTED_PAYMENT_METHODS[0], + errors: { fromVal: null, toVal: null }, + loading: false, + loadingOverlay: false, + addingCoin: false, + }; + } + componentDidMount() { + this.props.getExchangeRates(); + } + + componentWillReceiveProps(newProps) { + if(this.props.buy != newProps.buy) { + this.setState({ + fromCurr: this.state.toCurr, + toCurr: this.state.fromCurr, + }); + } + } + + // back = () => { + // this.props.navigation.dispatch(NavigationActions.back()) + // } + + static navigationOptions = ({ navigation }) => { + return { + title: typeof(navigation.state.params)==='undefined' || + typeof(navigation.state.params.title) === 'undefined' ? + 'undefined': navigation.state.params.title, + }; + }; + + _handleSubmit = () => { + Keyboard.dismiss(); + if (!hasPaymentMethod(this.props.paymentMethod)){ + DelayedAlert('Please Manage Account first') + this.props.navigation.navigate('SelectPaymentMethod', { + onSelect: this.switchPaymentMethod, + }); + }else { + this.validateFormData() + } + } + + handleError = (error, field) => { + let _errors = this.state.errors + _errors[field] = error + + this.setState({errors: _errors}) + } + + forceUpdate = () => { + //TODO: Figure out why screen doesnt always update if everything is called seperately + + /*this.props.dispatch(transactionsNeedUpdate(this.props.activeCoin.id, this.props.needsUpdate.transanctions)) + this.props.dispatch(needsUpdate("balances")) + this.props.dispatch(needsUpdate("rates"))*/ + this.props.dispatch(everythingNeedsUpdate()) + + this.refresh() + } + + refresh = () => { + const _activeCoinsForUser = this.props.activeCoinsForUser + + let promiseArray = [] + + if(this.props.needsUpdate.rates) { + console.log("Rates need update, pushing update to transaction array") + if (!this.state.loading) { + this.setState({ loading: true }); + } + promiseArray.push(setCoinRates(_activeCoinsForUser)) + } + + this.updateProps(promiseArray) + } + + updateProps = (promiseArray) => { + return new Promise((resolve, reject) => { + Promise.all(promiseArray) + .then((updatesArray) => { + if (updatesArray.length > 0) { + for (let i = 0; i < updatesArray.length; i++) { + if(updatesArray[i]) { + this.props.dispatch(updatesArray[i]) + } + } + if (this.state.loading) { + this.setState({ loading: false }); + } + resolve(true) + } + else { + resolve(false) + } + }) + }) + } + + canAddCoin = (coinTicker) => { + return DelayedAsyncAlert( + 'Coin Inactive', + 'In order to buy ' + coinTicker + ', you will need to add it to your wallet. Would you like to do so now?', + [ + { + text: 'No, take me back', + onPress: () => Promise.resolve(false), + style: 'cancel', + }, + {text: 'Yes', onPress: () => Promise.resolve(true)}, + ], + { + cancelable: false, + }, + ) + } + + setFromVal = (value) => { + const converted = calculatePrice(value, this.state.fromCurr, this.state.toCurr, this.props.rates) + + this.setState({fromVal: value, toVal: (isNumber(converted)) ? converted : this.state.toVal}) + } + + setToVal = (value) => { + const converted = calculatePrice(value, this.state.fromCurr, this.state.toCurr, this.props.rates) + + this.setState({toVal: value, fromVal: (isNumber(converted)) ? converted : this.state.fromVal}) + } + + handleAddCoin = (coinTicker) => { + this.setState({ addingCoin: true }); + return new Promise((resolve, reject) => { + addExistingCoin(findCoinObj(coinTicker), this.props.activeCoinList, this.props.activeAccount.id) + .then(response => { + if (response) { + this.props.dispatch(response) + this.props.dispatch(setUserCoins(this.props.activeCoinList, this.props.activeAccount.id)) + this.props.dispatch(addKeypair(this.props.activeAccount.wifKey, coinTicker, this.props.activeAccount.keys)) + this.props.dispatch(transactionsNeedUpdate(coinTicker, this.props.needsUpdate.transanctions)) + + this.props.dispatch(needsUpdate("balances")) + this.setState({ addingCoin: false }); + + resolve(true) + } + else { + this.errorHandler("Error adding coin") + } + }) + }) + } + + switchFromCurr = (curr) => { + this.setState({fromCurr: curr}) + } + + handleUpdates = () => { + let promiseArray = [] + + if(this.props.needsUpdate.balances) { + console.log("Balances need update, pushing update to transaction array") + if (!this.state.loading) { + this.setState({ loading: true }); + } + promiseArray.push(updateCoinBalances( + this.props.balances, + this.props.activeCoinsForUser, + this.props.activeAccount) + ) + } + + if(this.state.coinObj && this.state.coinObj.id === 'BTC' && !this.state.loadingBTCFees) { + this.setState({ loadingBTCFees: true }); + } + + return this.updateProps(promiseArray) + } + + switchToCurr = (coin) => { + const coinIsAlreadyAddedToWallet = (this.props.activeCoinsForUser.find(coinObj => { + return SUPPORTED_CRYPTOCURRENCIES.map(x => x.value).includes(coinObj.id) + })) + if (this.props.buy && !coinIsAlreadyAddedToWallet) { + this.canAddCoin(coin) + .then((res) => { + if (res) { + this.setState({loadingOverlay: true, addingCoin: true}, () => { + this.handleAddCoin(coin) + .then((res) => { + if (res) { + this.handleUpdates() + .then(() => { + this.setState({toCurr: coin, loadingOverlay: false, addingCoin: false}) + }) + } + }) + }) + } + }) + } else { + this.setState({toCurr: coin}) + } + } + + switchPaymentMethod = (method) => { + this.setState({paymentMethod: method}) + } + + /** + * Gets price from amount based on rates prop + * @param {Number} amount Amount to get price for + * @param {Boolean} fromFiat (Optional, Default = false) Whether to convert from fiat to crypto instead of crypto to fiat + */ + + validateFormData = () => { + this.setState({ + errors: { fromVal: null, toVal: null }, + }, () => { + const _fromVal = this.state.fromVal + const _toVal = this.state.toVal + const _fromCurr = this.state.fromCurr + const _toCurr = this.state.toCurr + let _errors = false; + + if (!_fromCurr) { + Alert.alert("Error", "Please select a currency to pay in") + _errors = true + } else if (!_toCurr) { + Alert.alert("Error", "Please select a currency to buy") + _errors = true + } + + if (!(_fromVal.toString()) || _fromVal.toString().length < 1) { + this.handleError("Required field", "fromVal") + _errors = true + } else if (!(isNumber(_fromVal))) { + this.handleError("Invalid amount", "fromVal") + _errors = true + } else if (Number(_fromVal) <= 0) { + this.handleError("Enter an amount greater than 0", "fromVal") + _errors = true + } else if(!this.props.buy && _fromVal > this.props.balances[_fromCurr].result.confirmed){ + this.handleError("You exceeded your balance amount", "fromVal") + _errors = true + } + + if (!(_toVal.toString()) || _toVal.toString().length < 1) { + this.handleError("Required field", "toVal") + _errors = true + } else if (!(isNumber(_toVal))) { + this.handleError("Invalid amount", "toVal") + _errors = true + } else if (Number(_toVal) <= 0) { + this.handleError("Enter an amount greater than 0", "toVal") + _errors = true + } + + if (!_errors && hasPaymentMethod(this.props.paymentMethod)) { + switch (this.state.paymentMethod.id) { + case 'US_BANK_ACCT': + this.usBankAcctPayment( + this.state.fromVal, + this.state.fromCurr, + this.state.toCurr, + this.state.toVal + ); + break; + default: + } + } else { + return false; + } + }); + } + + usBankAcctPayment = (fromVal, fromCurr, toCurr, toVal) => { + if (ENABLE_WYRE) { + this.props.navigation.navigate('SendTransaction', { + paymentMethod: this.state.paymentMethod, + fromCurr, + fromVal, + toCurr, + toVal, + }); + } + } + + openPaymentMethodOptions = () => { + this.props.navigation.navigate('SelectPaymentMethod', { + onSelect: this.switchPaymentMethod, + }); + } + + + render() { + return ( + + + + + }> + + + + {`${this.props.buy ? 'Spend:' : 'Sell: ' } `} + + this.setFromVal(text)} + /> + + + { + return item.value + }} + valueExtractor={(item) => { + return item.value + }} + data={this.props.buy ? SUPPORTED_FIAT_CURRENCIES : SUPPORTED_CRYPTOCURRENCIES} + onChangeText={(value) => this.switchFromCurr(value)} + textColor="" + selectedItemColor="#232323" + value={this.state.fromCurr} + containerStyle={styles.currencyDropDownContainer} + renderBase={() => { return( + + {this.state.fromCurr} + + + ) }} + pickerStyle={{backgroundColor: Colors.tertiaryColor}} + itemTextStyle={{fontFamily: 'Avenir'}} + /> + + + + + { + this.state.errors.fromVal ? + this.state.errors.fromVal + : + null + } + + + + + + Receive + + this.setToVal(text)} + editable={false} + /> + + + { + return item.value; + }} + valueExtractor={(item) => { + return item.value; + }} + data={this.props.buy ? SUPPORTED_CRYPTOCURRENCIES : SUPPORTED_FIAT_CURRENCIES } + onChangeText={(value) => this.switchToCurr(value)} + textColor="#E9F1F7" + selectedItemColor="#232323" + value={this.state.toCurr} + containerStyle={styles.currencyDropDownContainer} + renderBase={() => { return( + + {this.state.toCurr} + + + ) }} + pickerStyle={{backgroundColor: Colors.tertiaryColor}} + itemTextStyle={{fontFamily: 'Avenir'}} + /> + + + + + { + this.state.errors.toVal ? + this.state.errors.toVal + : + null + } + + + + {ENABLE_WYRE ? ( + + + + + {this.state.paymentMethod.name} + + )} + avatar={BankBuildingBlack} + avatarOverlayContainerStyle={{backgroundColor: 'transparent'}} + avatarStyle={{ resizeMode: 'contain'}} + containerStyle={{ borderBottomWidth: 0 }} + chevronColor={'black'} + /> + + + + ) : ( + + + item.name} + valueExtractor={(item) => item} + label="Pay With" + labelTextStyle={{ fontWeight: 'bold', fontFamily: 'Avenir' }} + labelFontSize={12} + data={SUPPORTED_PAYMENT_METHODS} + onChangeText={(method) => this.switchPaymentMethod(method)} + textColor="black" + selectedItemColor="#232323" + baseColor="#86939e" + value={this.state.paymentMethod.name} + containerStyle={styles.dropDownContainer} + /> + + + )} + + + + + + + ); + } +} + +const mapStateToProps = (state) => ({ + activeCoin: state.coins.activeCoin, + activeCoinsForUser: state.coins.activeCoinsForUser, + activeAccount: state.authentication.activeAccount, + needsUpdate: state.ledger.needsUpdate, + activeCoinList: state.coins.activeCoinList, + inProgress: selectWyreCreatePaymentIsFetching(state), + rates: selectExchangeRates(state), + exchangeRatesFetching: selectExchangeRatesIsFetching(state), + paymentMethod: selectWyrePaymentMethod(state), + balances: state.ledger.balances, +}); + +const mapDispatchToProps = (dispatch) => ({ + dispatch, + getExchangeRates: () => dispatch(getExchangeRates()), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(BuyCrypto); diff --git a/src/containers/BuySellCrypto/BuyCrypto/BuyCrypto.styles.js b/src/containers/BuySellCrypto/BuyCrypto/BuyCrypto.styles.js new file mode 100644 index 00000000..4d06ddff --- /dev/null +++ b/src/containers/BuySellCrypto/BuyCrypto/BuyCrypto.styles.js @@ -0,0 +1,93 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + flexDirection: "column", + paddingBottom: 0, + marginVertical: '2%', + }, + formLabel: { + textAlign:"left", + marginLeft: 3, + color: 'black', + fontFamily:'Avenir', + fontWeight: 'normal' + }, + formInputLabelContainer: { + flex: 1, + }, + valueContainer: { + width: "85%", + }, + formInput: { + width: "100%", + marginLeft: 0, + }, + currencyLabel: { + color: 'black', + fontSize: 20, + fontFamily:'Avenir', + }, + dropDownContainer: { + paddingHorizontal: 3, + width: "100%", + flex: 1, + flexDirection: "column", + justifyContent: 'flex-start', + alignItems: 'stretch' + }, + dropDownBase: { + flex: 1, + flexDirection: "row", + alignItems: "center", + paddingTop: 15 + }, + dropDownIcon: { + marginLeft: 0, + paddingLeft: 0 + }, + formInputContainer: { + width: "100%", + marginLeft: 0, + paddingRight: 0 + }, + buttonContainer: { + width: "85%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-between", + marginTop: '35%', + }, + currencyDropDownContainer: { + flex: 1, + flexDirection: "row", + alignItems: "flex-start", + }, + inputAndDropDownContainer: { + width: "85%", + alignItems: "flex-start", + flex: 1, + flexDirection: "row", + justifyContent: "center", + maxHeight: 80, + }, + saveChangesButton: { + height: 44, + backgroundColor: Colors.successButtonColor, + width: '100%', + }, + touchableInputBank: { + width: "85%", + margin: 20, + }, + inputBankFieldText:{ + color: 'black', + }, + coinItemLabel: { + color: "black", + marginLeft: 10, + }, +}); diff --git a/src/containers/BuySellCrypto/BuySellCryptoMenus.js b/src/containers/BuySellCrypto/BuySellCryptoMenus.js new file mode 100644 index 00000000..57e436e9 --- /dev/null +++ b/src/containers/BuySellCrypto/BuySellCryptoMenus.js @@ -0,0 +1,128 @@ +/* + This component's purpose is to display a tab bar of + all the different options for buying/selling crypto +*/ + +import React, { Component } from "react"; +import { + View, + Image, +} from "react-native"; +import { connect } from 'react-redux'; +import BottomNavigation, { + FullTab +} from 'react-native-material-bottom-navigation' +//import SellCrypto from './SellCrypto/SellCrypto' +import BuyCrypto from './BuyCrypto/BuyCrypto' +import { Icon } from "react-native-elements" +import Colors from '../../globals/colors'; +import { Buy, Sell } from '../../images/customIcons'; + +class BuySellCryptoMenus extends Component { + constructor(props) { + super(props) + let stateObj = this.generateTabs(); + this.state = { + tabs: stateObj.tabs, + activeTab: stateObj.activeTab, + }; + } + + static navigationOptions = ({ navigation }) => { + return { + title: typeof(navigation.state.params)==='undefined' || + typeof(navigation.state.params.title) === 'undefined' ? + 'undefined': navigation.state.params.title, + }; + }; + + generateTabs = () => { + let tabArray = [ + { + key: "buy-crypto", + icon: "photo-camera", + label: "Buy Crypto", + barColor: Colors.basicButtonColor, + pressColor: 'rgba(255, 255, 255, 0.16)', + screen: "BuyCrypto", + source: Buy + }, + { + key: "sell-crypto", + icon: "format-list-numbered", + label: "Sell Crypto", + barColor: Colors.basicButtonColor, + pressColor: 'rgba(255, 255, 255, 0.16)', + screen: "SellCrypto", + source: Sell + }, + ] + let activeTab + let index = 0 + + while (index < tabArray.length && tabArray[index].key !== this.props.activeSection) { + index++ + } + + if (index < tabArray.length) { + activeTab = tabArray[index] + } else { + throw new Error("Tab not found for active section " + this.props.activeSection) + } + + return { + tabs: tabArray, + activeTab: activeTab + }; + } + + renderIcon = icon => () => ( + + ) + + renderTab = ({ tab, isActive }) => ( + + ) + + switchTab = (newTab) => { + this.props.navigation.setParams({ title: newTab.label }) + this.setState({ activeTab: newTab }) + } + + render() { + return ( + + {this.state.activeTab.screen === "SellCrypto" ? : + (this.state.activeTab.screen === "BuyCrypto" ? : + null)} + this.switchTab(newTab)} + renderTab={this.renderTab} + tabs={this.state.tabs} + activeTab={this.state.activeTab.key} + /> + + ); + } +} + +const mapStateToProps = (state) => { + return { + activeSection: state.buySellCrypto.activeSection + } +}; + +export default connect(mapStateToProps)(BuySellCryptoMenus); diff --git a/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreAccount.js b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreAccount.js new file mode 100644 index 00000000..471b5ac5 --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreAccount.js @@ -0,0 +1,205 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; + +import { + View, + Text, + TouchableWithoutFeedback, + TouchableHighlight, + Keyboard, + RefreshControl, + ScrollView, + Image, +} from 'react-native'; +import Button1 from '../../../../symbols/button1'; +import Spinner from 'react-native-loading-spinner-overlay'; +import { + selectWyreAccount, + selectWyreGetAccountIsFetching, +} from '../../../../selectors/paymentMethods'; + +import { getAccount } from '../../../../actions/actions/PaymentMethod/WyreAccount'; + +import styles from './ManageWyreAccount.styles'; + +import Colors from '../../../../globals/colors'; + +import { + Email, Phone, File, + BankBuilding, User, + Address, Home, +} from '../../../../images/customIcons'; + +class ManageWyreAccount extends Component { + componentDidMount() { + this.forceUpdateHandler = this.props.navigation.addListener( + 'willFocus', + () => this.forceUpdate() + ); + } + + componentWillUnmount() { + if (!this.forceUpdateHandler) return; + this.forceUpdateHandler.remove(); + } + + forceUpdate = () => { + this.props.getAccount(); + } + + renderSectionStatus = (status, screen) => { + switch (status) { + case 'PENDING': + return( + this.navigate(screen)} + buttonStyle={styles.statusButtonStyle} + /> + ) + case 'APPROVED': + return ( + this.navigate(screen)} + buttonStyle={styles.statusButtonApprovedStyle} + /> + ) + default: + return ( + this.navigate(screen)} + buttonStyle={styles.statusButtonStyle} + /> + ) + } + } + + renderEmailSection = () => { + const emailObj = this.props.account.denormalizedProfileFields.individualEmail || {}; + return this.renderSection('ManageWyreEmail', Email, 'Email', emailObj.status); + } + + renderCellphoneSection = () => { + const phoneObj = this.props.account.denormalizedProfileFields.individualCellphoneNumber || {}; + return this.renderSection('ManageWyreCellphone', Phone, 'Phone', phoneObj.status); + } + + renderPersonalDetailsSection = () => { + const personalDetailsObj = this.props.account.denormalizedProfileFields.individualLegalName + || {}; + return this.renderSection('ManageWyrePersonalDetails', User, 'Personal Details', personalDetailsObj.status); + } + + renderAddressSection = () => { + const addressobj = this.props.account.denormalizedProfileFields.individualResidenceAddress + || {}; + return this.renderSection('ManageWyreAddress', Home, 'Address', addressobj.status); + } + + renderDocumentsSection = () => { + const documentsObj = this.props.account.denormalizedProfileFields.individualGovernmentId || {}; + return this.renderSection('ManageWyreDocuments', File, 'Documents', documentsObj.status); + } + + renderPaymentMethodSection = () => { + const paymentMethodObj = this.props.account.denormalizedProfileFields.individualSourceOfFunds + || {}; + return this.renderSection('ManageWyrePaymentMethod', BankBuilding, 'Bank', paymentMethodObj.status); + } + + renderProofOfAddressSection = () => { + const proofOfAddressObj = this.props.account.denormalizedProfileFields.individualProofOfAddress + || {}; + return this.renderSection('ManageWyreProofOfAddress', Address, 'Proof Of Address', proofOfAddressObj.status); + } + + renderSection = (screen, icon, label, status) => ( + this.navigate(screen)} style={styles.viewContainer}> + + + + {label} + + + {this.renderSectionStatus(status, screen)} + + + + ); + + navigate = (screen) => { + this.props.navigation.navigate(screen); + } + + render() { + return ( + + + + + )} + > + Verification Set Up + + + + Account Id:     + + + {this.props.account.id} + + + + + Account Status:     + + + {this.props.account.status} + + + + {this.renderEmailSection()} + {this.renderCellphoneSection()} + {this.renderPersonalDetailsSection()} + {this.renderAddressSection()} + {this.renderDocumentsSection()} + {this.renderPaymentMethodSection()} + {this.renderProofOfAddressSection()} + + + + + ); + } +} + +const mapStateToProps = (state) => ({ + isFetching: selectWyreGetAccountIsFetching(state), + account: selectWyreAccount(state), +}); + +const mapDispatchToProps = ({ + getAccount, +}); + +export default connect(mapStateToProps, mapDispatchToProps)(ManageWyreAccount); diff --git a/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreAccount.styles.js b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreAccount.styles.js new file mode 100644 index 00000000..2cd22191 --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreAccount.styles.js @@ -0,0 +1,205 @@ +import { StyleSheet } from 'react-native'; +import Colors from '../../../../globals/colors'; + +export default StyleSheet.create({ + userProfileContainer: { + backgroundColor: Colors.secondaryColor, + height: '100%' + }, + viewContainer: { + width: '90%', + borderRadius: 7, + borderWidth: 0.8, + borderColor: Colors.quaternaryColor, + height: '8%', + margin: '2%', + marginVertical: 0, + paddingVertical: 0, + marginBottom: '2%', + }, + wyreCard: { + paddingLeft: 10, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + flex: 1, + width: '100%', + marginVertical: 0, + paddingVertical: 0, + }, + wyreInfo: { + fontSize: 13, + color: '#86939e', + }, + wyreCardText: { + color: Colors.quaternaryColor, + paddingLeft: 10, + fontFamily: 'Avenir-Book', + fontSize: 16, + }, + wyreCardIconContainer: { + flexDirection: 'row', + flex: 1, + alignItems: 'center', + }, + icon: { + width: 20, + height: 20, + tintColor: 'black' + }, + buttonSubmit: { + alignSelf: 'center', + marginTop: 10, + height: 46, + width: '90%', + backgroundColor: "#009B72", + }, + buttonConfirm: { + width: '100%', + height: 40, + backgroundColor: '#009B72', + marginTop: 15, + }, + buttonCancel: { + width: '100%', + height: 40, + backgroundColor: Colors.basicButtonColor, + marginTop: 15, + }, + buttonSelect: { + alignSelf: 'center', + height: 46, + width: '90%', + backgroundColor: "#009B72" + }, + mainInputView: { + backgroundColor: Colors.secondaryColor, + height: '100%', + paddingBottom: 10, + paddingHorizontal: '5%', + paddingVertical: '5%' + }, + formLabel: { + fontSize: 16, + textAlign: 'left', + paddingTop: '0%', + color: Colors.quaternaryColor, + marginVertical: 0, + paddingVertical: 0, + fontFamily: 'Avenir-Book', + fontWeight: 'normal' + }, + buttonContainer: { + width: '80%', + paddingTop: 10, + backgroundColor: 'transparent', + flexDirection: 'column', + alignSelf: 'center', + alignContent: 'flex-end', + marginTop: '40%', + }, + imageContainer: { + width: 280, + height: 280, + alignSelf: 'center', + marginVertical: 20, + }, + dropdownInput: { + width: '100%', + paddingHorizontal: '6%', + marginVertical: -13, + }, + statusInfo: { + color: Colors.quaternaryColor, + alignSelf: 'center', + fontSize: 15, + fontFamily: 'Avenir', + }, + statusInfoHeader: { + color: Colors.quaternaryColor, + alignSelf: 'center', + fontSize: 22, + fontFamily: 'Avenir', + }, + statusInfoContent: { + color: Colors.quaternaryColor, + alignSelf: 'center', + fontSize: 15, + fontWeight: 'bold' + }, + buttonContainerBottom: { + flex: 1, + justifyContent: 'flex-end', + }, + inputMask: { + color: Colors.quaternaryColor, + borderBottomColor: '#86939d', + borderBottomWidth: 2, + width: '87%', + marginLeft: 20, + paddingVertical: 10, + }, + formInputContainer: { + fontSize: 15, + width: '100%', + marginVertical: 0, + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Medium', + }, + inputMaskDateOfBirth: { + color: Colors.quaternaryColor, + borderBottomColor: '#86939d', + borderBottomWidth: 2, + width: '76%', + marginLeft: 20, + paddingVertical: 10, + }, + containerCalendarButton: { + width: '15%', + marginTop: '5%', + marginLeft: '3%', + }, + containerDateOfBirth: { + flexDirection: 'row', + }, + formValidationLabel: { + fontSize: 12, + }, + dropdownInputContainer: { + borderBottomWidth: 1, + marginTop: 15 + }, + statusButtonAdd: { + backgroundColor: Colors.successButtonColor, + width: 110, + height: 35, + marginRight: 15, + }, + statusButtonPending: { + backgroundColor: Colors.infoButtonColor, + width: 110, + height: 35, + marginRight: 15, + }, + statusButtonApproved: { + backgroundColor: 'transparent', + width: 110, + height: 35, + marginRight: 15, + }, + statusButtonApprovedStyle: { + fontSize: 15, + color: Colors.linkButtonColor, + width: 130, + textAlign: 'center', + fontWeight: '600', + fontFamily: 'Avenir', + }, + statusButtonStyle: { + fontSize: 15, + width: 130, + textAlign: 'center', + fontWeight: '600', + color: Colors.secondaryColor, + }, +}); \ No newline at end of file diff --git a/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreAddress.js b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreAddress.js new file mode 100644 index 00000000..dc27a7b8 --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreAddress.js @@ -0,0 +1,248 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { + ScrollView, + View, + TouchableWithoutFeedback, + Keyboard +} from 'react-native'; +import { FormLabel, FormInput, FormValidationMessage } from 'react-native-elements'; +import { Dropdown } from 'react-native-material-dropdown'; +import Spinner from 'react-native-loading-spinner-overlay'; +import Button1 from '../../../../symbols/button1'; +import styles from './ManageWyreAccount.styles'; +import { + selectWyreAccountField, + selectWyrePutAccountIsFetching, +} from '../../../../selectors/paymentMethods'; +import { + putWyreAccountField +} from '../../../../actions/actions/PaymentMethod/WyreAccount'; +import { STATES, WYRE_COUNTRIES } from '../../../../utils/constants'; +import Colors from '../../../../globals/colors'; + + +class ManageWyreAddress extends Component { + constructor(props) { + super(props); + const individualAddress = this.props.individualResidenceAddress.value || {}; + this.state = { + streetAddress: individualAddress.street1, + city: individualAddress.city, + countryState: individualAddress.state, + postalCode: individualAddress.postalCode, + country: individualAddress.country, + errors: { + streetAddress: null, + city: null, + countryState: null, + postalCode: null, + country: null, + }, + + }; + } + + handleError = (error, field) => { + const displayError = this.state.errors; + displayError[field] = error; + this.setState({ errors: displayError }); + } + + handleSubmit = () => { + Keyboard.dismiss(); + this.validateFormData(); + }; + + validateFormData = () => { + this.setState({ + errors: { + streetAddress: null, + city: null, + countryState: null, + postalCode: null, + country: null, + }, + }, () => { + const userStreetAddress = this.state.streetAddress; + const userCity = this.state.city; + const userCountryState = this.state.countryState; + const userPostalCode = this.state.postalCode; + const userCountry = this.state.country; + + let inputError = false; + + const regexPostalCode = /^\d{5}$/; + const regexCity = /^[a-zA-Z]+(?:[\s-][a-zA-Z]+)*$/; + + + if (!userStreetAddress) { + this.handleError('Required field', 'streetAddress'); + inputError = true; + } + + if (!userCity) { + this.handleError('Required field', 'city'); + inputError = true; + } + + if (!userCountryState) { + this.handleError('Required field, Choose one', 'countryState'); + inputError = true; + } + + if (!userPostalCode) { + this.handleError('Required field', 'postalCode'); + inputError = true; + } else if (!regexPostalCode.test(userPostalCode)) { + this.handleError('"postalCode" must be a 5 digit US Zipcode', 'postalCode'); + inputError = true; + } + + if (!userCountry) { + this.handleError('Required field', 'country'); + inputError = true; + } + + if (!inputError) { + this.doSubmit(); + } + }); + } + + doSubmit = async () => { + this.props.putWyreAccountField([{ + fieldId: 'individualResidenceAddress', + value: { + street1: this.state.streetAddress, + city: this.state.city, + state: this.state.countryState, + postalCode: this.state.postalCode, + country: this.state.country, + } + }], this.props.navigation); + }; + + render() { + return ( + + + + + + + Street Address: + + this.setState({ streetAddress: text })} + value={this.state.streetAddress} + autoCorrect={false} + inputStyle={styles.formInputContainer} + /> + + {this.state.errors.streetAddress} + + + + + City: + + this.setState({ city: text })} + value={this.state.city} + autoCorrect={false} + inputStyle={styles.formInputContainer} + /> + + {this.state.errors.city} + + + + + item.value} + valueExtractor={(item) => item.value} + label="State: " + labelTextStyle={{ fontFamily: 'Avenir-Book'}} + labelFontSize={13} + data={STATES} + onChangeText={(value) => this.setState({ countryState: value })} + textColor={Colors.quaternaryColor} + selectedItemColor={Colors.quaternaryColor} + baseColor={Colors.quaternaryColor} + value={this.state.countryState} + inputContainerStyle={styles.dropdownInputContainer} + pickerStyle={{backgroundColor: Colors.tertiaryColor}} + /> + + + {this.state.errors.countryState} + + + + + Postal Code: + + this.setState({ postalCode: text })} + value={this.state.postalCode} + autoCorrect={false} + inputStyle={styles.formInputContainer} + /> + + {this.state.errors.postalCode} + + + + + item.value} + valueExtractor={(item) => item.value} + label="Country: " + labelTextStyle={{ fontWeight: '700' }} + labelFontSize={13} + data={WYRE_COUNTRIES} + onChangeText={(value) => this.setState({ country: value })} + textColor={Colors.quaternaryColor} + selectedItemColor={Colors.quaternaryColor} + baseColor={Colors.quaternaryColor} + value={this.state.country ? `${this.state.country}` : ''} + inputContainerStyle={styles.dropdownInputContainer} + pickerStyle={{backgroundColor: Colors.tertiaryColor}} + /> + + + {this.state.errors.country} + + + + + + + + + ); + } +} + +const mapStateToProps = (state) => ({ + isFetching: selectWyrePutAccountIsFetching(state), + individualResidenceAddress: selectWyreAccountField(state, 'individualResidenceAddress'), +}); + +const mapDispatchToProps = ({ + putWyreAccountField, +}); + +export default connect(mapStateToProps, mapDispatchToProps)(ManageWyreAddress); diff --git a/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreCellphone.js b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreCellphone.js new file mode 100644 index 00000000..b9fd6948 --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreCellphone.js @@ -0,0 +1,126 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { + View, + TouchableWithoutFeedback, + Keyboard +} from 'react-native'; + +import { + FormLabel, + FormInput, + FormValidationMessage +} from 'react-native-elements'; + +import Spinner from 'react-native-loading-spinner-overlay'; + +import Button1 from '../../../../symbols/button1'; + +import { + selectWyreAccountField, + selectWyrePutAccountIsFetching, +} from '../../../../selectors/paymentMethods'; + +import { + putWyreAccountField +} from '../../../../actions/actions/PaymentMethod/WyreAccount'; + +import styles from './ManageWyreAccount.styles'; +import Colors from '../../../../globals/colors'; + +class ManageWyreCellphone extends Component { + constructor(props) { + super(props); + this.state = { + phone: this.props.field.value, + error: null, + }; + } + + handleSubmit = () => { + Keyboard.dismiss(); + this.validateFormData(); + }; + + validateFormData = () => { + this.setState({ + error: null, + }, () => { + const userPhone = this.state.phone; + + let errors = false; + + const numberReg = /^[0-9)(-]+$/; + + if (!userPhone) { + this.setState({ error: 'Required field' }); + errors = true; + } else if (!numberReg.test(userPhone)) { + this.setState({ error: 'Enter valid phone number, ex: (123)456-78-90' }); + errors = true; + } + + if (!errors) { + this.doSubmit(); + } + }); + } + + + doSubmit = () => { + this.props.putWyreAccountField([{ + fieldId: 'individualCellphoneNumber', + value: `+${this.state.phone}`, + }], this.props.navigation); + }; + + render() { + console.log(this.props) + return ( + + + + + + + Enter Cellphone Number: + + this.setState({ phone: text })} + value={this.state.phone} + autoCorrect={false} + inputStyle={styles.formInputContainer} + /> + + {this.state.error} + + + + + + + + + ); + } +} + +const mapStateToProps = (state) => ({ + isFetching: selectWyrePutAccountIsFetching(state), + field: selectWyreAccountField(state, 'individualCellphoneNumber'), +}); + +const mapDispatchToProps = ({ + putWyreAccountField, +}); + +export default connect(mapStateToProps, mapDispatchToProps)(ManageWyreCellphone); diff --git a/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreDocuments.js b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreDocuments.js new file mode 100644 index 00000000..839981bc --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreDocuments.js @@ -0,0 +1,141 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import ImagePicker from 'react-native-image-picker'; +import { + Platform, + View, + TouchableWithoutFeedback, + Keyboard, + Alert, + Image, +} from 'react-native'; + +import { + FormLabel, + FormValidationMessage +} from 'react-native-elements'; + +import Spinner from 'react-native-loading-spinner-overlay'; + +import Button1 from '../../../../symbols/button1'; + +import { + selectWyreAccountField, + selectWyrePutAccountIsFetching, +} from '../../../../selectors/paymentMethods'; + +import { + uploadWyreAccountDocument +} from '../../../../actions/actions/PaymentMethod/WyreAccount'; + +import styles from './ManageWyreAccount.styles'; + +const formatURI = (uri) => ( + Platform.OS === 'android' ? uri : uri.replace('file://', '') +); + +class ManageWyreDocuments extends Component { + constructor(props) { + super(props); + this.state = { + image: null, + error: null, + }; + } + + handleSelect = () => { + Keyboard.dismiss(); + ImagePicker.showImagePicker((response) => { + if (response.error) { + Alert.alert(response.error); + } else if (response.type !== 'image/jpeg') { + Alert.alert('Please select image in jpeg format'); + } else { + this.setState({ + image: response, + }); + } + }); + }; + + clearSelectedImage = () => { + this.setState({ + image: null + }); + } + + handleUpload = () => { + this.props.uploadWyreAccountDocument(this.props.fieldId, + formatURI(this.state.image.uri), 'image/jpeg', this.clearSelectedImage); + }; + + render() { + return ( + + + + + + + Uploaded documents:     + {this.props.field.value ? this.props.field.value.length : 0} + + + {this.state.error} + + + {!this.state.image && ( + + + + )} + {this.state.image && ( + + + + + + + + )} + + + + ); + } +} + +const mapStateToProps = (state) => ({ + isFetching: selectWyrePutAccountIsFetching(state), + field: selectWyreAccountField(state, 'individualGovernmentId'), + fieldId: 'individualGovernmentId', +}); + +const mapDispatchToProps = ({ + uploadWyreAccountDocument, +}); + +export { + ManageWyreDocuments +} + +export default connect(mapStateToProps, mapDispatchToProps)(ManageWyreDocuments); diff --git a/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreEmail.js b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreEmail.js new file mode 100644 index 00000000..1ad08e69 --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreEmail.js @@ -0,0 +1,133 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { + View, + TouchableWithoutFeedback, + Keyboard +} from 'react-native'; + +import { + FormLabel, + FormInput, + FormValidationMessage +} from 'react-native-elements'; + +import Spinner from 'react-native-loading-spinner-overlay'; +import DelayedAlert from '../../../../utils/delayedAlert'; + +import Button1 from '../../../../symbols/button1'; + +import { + selectWyreAccountField, + selectWyrePutAccountIsFetching, +} from '../../../../selectors/paymentMethods'; +import { NavigationActions } from 'react-navigation'; + +import { + putWyreAccountField +} from '../../../../actions/actions/PaymentMethod/WyreAccount'; + +import styles from './ManageWyreAccount.styles'; +import Colors from '../../../../globals/colors'; + +class ManageWyreEmail extends Component { + constructor(props) { + super(props); + this.state = { + email: this.props.field.value, + error: null, + }; + } + + handleSubmit = () => { + Keyboard.dismiss(); + this.validateFormData(); + }; + + validateFormData = () => { + this.setState({ + error: null, + }, () => { + const userEmail = this.state.email; + + let errors = false; + + const emailReg = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; + + if (!userEmail) { + this.setState({ error: 'Required field' }); + errors = true; + } else if (!emailReg.test(userEmail)) { + this.setState({ error: 'Enter valid email ex: somebody@example.com' }); + errors = true; + } + + if (!errors) { + this.doSubmit(); + } + }); + } + + + doSubmit = () => { + this.props.putWyreAccountField([{ + fieldId: 'individualEmail', + value: this.state.email, + }], + this.props.navigation, + () => { + DelayedAlert('Success, Check your email and verify account'); + this.props.navigation.dispatch(NavigationActions.back()) + } + ); + }; + + render() { + return ( + + + + + + + Enter Email: + + this.setState({ email: text })} + value={this.state.email} + autoCorrect={false} + inputStyle={styles.formInputContainer} + /> + + {this.state.error} + + + + + + + + + ); + } +} + +const mapStateToProps = (state) => ({ + isFetching: selectWyrePutAccountIsFetching(state), + field: selectWyreAccountField(state, 'individualEmail'), +}); + +const mapDispatchToProps = ({ + putWyreAccountField, +}); + +export default connect(mapStateToProps, mapDispatchToProps)(ManageWyreEmail); diff --git a/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyrePaymentMethod.js b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyrePaymentMethod.js new file mode 100644 index 00000000..0c4b7bea --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyrePaymentMethod.js @@ -0,0 +1,82 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; + +import { View } from 'react-native'; +import { NavigationActions } from 'react-navigation'; +import PlaidAuthenticator from 'react-native-plaid-link'; +import Spinner from 'react-native-loading-spinner-overlay'; + +import { + selectWyreConfig, + selectWyreGetConfigIsFetching, + selectWyrePutAccountIsFetching, +} from '../../../../selectors/paymentMethods'; + +import { + getConfig, + createWyreAccountPaymentMethod +} from '../../../../actions/actions/PaymentMethod/WyreAccount'; + +import styles from './ManageWyreAccount.styles'; + +class ManageWyrePaymentMethod extends Component { + componentDidMount() { + this.props.getConfig(); + } + + onMessage = (data) => { + switch (data.action) { + case 'plaid_link-undefined::exit': + this.props.navigation.dispatch(NavigationActions.back()); + break; + case 'plaid_link-undefined::connected': + this.props.createWyreAccountPaymentMethod(`${data.metadata.public_token}|${data.metadata.account_id}`, this.props.navigation); + break; + default: + } + } + + renderPlaid = () => { + if (!Object.keys(this.props.config).length) { + return null; + } + return ( + + ); + } + + render() { + return ( + + {(this.props.isFetching || this.props.updatingAccount) ? ( + + ) : this.renderPlaid()} + + ); + } +} + +const mapStateToProps = (state) => ({ + isFetching: selectWyreGetConfigIsFetching(state), + updatingAccount: selectWyrePutAccountIsFetching(state), + config: selectWyreConfig(state), +}); + +const mapDispatchToProps = ({ + getConfig, + createWyreAccountPaymentMethod, +}); + +export default connect(mapStateToProps, mapDispatchToProps)(ManageWyrePaymentMethod); diff --git a/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyrePersonalDetails.js b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyrePersonalDetails.js new file mode 100644 index 00000000..1623d7de --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyrePersonalDetails.js @@ -0,0 +1,255 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { + View, + TouchableWithoutFeedback, + Keyboard, + Image, + TouchableOpacity, + Platform, +} from 'react-native'; +import { FormLabel, FormInput, FormValidationMessage } from 'react-native-elements'; +import Spinner from 'react-native-loading-spinner-overlay'; +import Button1 from '../../../../symbols/button1'; +import styles from './ManageWyreAccount.styles'; +import { + selectWyreAccountField, + selectWyrePutAccountIsFetching, +} from '../../../../selectors/paymentMethods'; +import { + putWyreAccountField +} from '../../../../actions/actions/PaymentMethod/WyreAccount'; +import TextInputMask from 'react-native-text-input-mask'; +import DateTimePicker from '@react-native-community/datetimepicker'; +import { Calendar} from '../../../../images/customIcons/index'; +import { parseDate } from '../../../../utils/date'; +import Colors from '../../../../globals/colors'; + + +class ManageWyrePersonalDetails extends Component { + constructor(props) { + super(props); + this.state = { + name: this.props.individualLegalName.value, + dateOfBirth: this.props.individualDateOfBirth.value, + socialSecurityNumber: this.props.individualSsn.value, + errors: { + name: null, + dateOfBirth: null, + socialSecurityNumber: null, + }, + date: new Date(), + mode: 'date', + showCalendar: false, + }; + } + + showCalendar = () => { + this.setState({ + showCalendar: true, + }); + } + + hideCalendar = () => { + this.setState({ + showCalendar: false, + }); + } + + setDate = (_, date) => { + this.setState({ + showCalendar: Platform.OS === 'ios' ? true : false, + }, () => { + if (date) { + this.setState({ + dateOfBirth: parseDate(date), + date + }) + } + }); + } + + handleSubmit = () => { + Keyboard.dismiss(); + this.validateFormData(); + }; + + validateFormData = () => { + this.setState({ + errors: { + name: null, + dateOfBirth: null, + socialSecurityNumber: null, + }, + }, () => { + const userName = this.state.name; + const userDateOfBirth = this.state.dateOfBirth; + const userSocialSecurityNumber = this.state.socialSecurityNumber; + + let inputError = false; + + const regexdateOfBirth = /^\d{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/; + const regexsocialSecurityNumber = /^([1-9])(?!\1{2}-\1{2}-\1{4})[1-9]{2}-[1-9]{2}-[1-9]{4}$/; + + const errors = {}; + + if (!userName) { + errors.name = 'Required field'; + inputError = true; + } + + if (!userDateOfBirth) { + errors.dateOfBirth = 'Required field'; + inputError = true; + } else if (!regexdateOfBirth.test(userDateOfBirth)) { + errors.dateOfBirth = '"Date Of Birth" must be in the following format: YYYY-MM-DD'; + inputError = true; + } + + if (!userSocialSecurityNumber) { + errors.socialSecurityNumber = 'Required field'; + inputError = true; + } else if (!regexsocialSecurityNumber.test(userSocialSecurityNumber)) { + errors.socialSecurityNumber = '"SSN" must be in the following format XXX-XX-XXXX'; + inputError = true; + } + + + if (!inputError) { + this.doSubmit(); + } else { + this.setState({ + errors, + }); + } + }); + } + + doSubmit = async () => { + this.props.putWyreAccountField([{ + fieldId: 'individualLegalName', + value: this.state.name + }, { + fieldId: 'individualDateOfBirth', + value: this.state.dateOfBirth + }, { + fieldId: 'individualSsn', + value: this.state.socialSecurityNumber + }], this.props.navigation); + }; + + render() { + return ( + { + Keyboard.dismiss() + if (this.state.showCalendar){ + this.hideCalendar(); + } + }} accessible={false}> + + + + + + Legal Name: + + this.setState({ name: text })} + value={this.state.name} + autoCorrect={false} + inputStyle={styles.formInputContainer} + /> + + {this.state.errors.name} + + + + + Date of Birth YYYY-MM-DD: + + + { + this.setState({dateOfBirth: formatted}) + }} + value={this.state.dateOfBirth} + mask={"[0000]-[00]-[00]"} + style={styles.inputMaskDateOfBirth} + /> + + + + + + + + { this.state.showCalendar && + } + + + {this.state.errors.dateOfBirth} + + + + + US Social Security Number XXX-XX-XXXX: + + { + this.setState({socialSecurityNumber: formatted}) + }} + mask={"[000]-[00]-[0000]"} + style={styles.inputMask} + /> + + {this.state.errors.socialSecurityNumber} + + + + { + if (this.state.showCalendar) { + this.hideCalendar(); + } + this.handleSubmit(); + } + } + /> + + + + + ); + } +} + +const mapStateToProps = (state) => ({ + isFetching: selectWyrePutAccountIsFetching(state), + individualLegalName: selectWyreAccountField(state, 'individualLegalName'), + individualDateOfBirth: selectWyreAccountField(state, 'individualDateOfBirth'), + individualSsn: selectWyreAccountField(state, 'individualSsn') +}); + +const mapDispatchToProps = ({ + putWyreAccountField, +}); + +export default connect(mapStateToProps, mapDispatchToProps)(ManageWyrePersonalDetails); diff --git a/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreProofOfAddress.js b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreProofOfAddress.js new file mode 100644 index 00000000..02e9d618 --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreProofOfAddress.js @@ -0,0 +1,25 @@ +import { connect } from 'react-redux'; + +import { ManageWyreDocuments } from './ManageWyreDocuments'; + +import { + selectWyreAccountField, + selectWyrePutAccountIsFetching, +} from '../../../../selectors/paymentMethods'; + +import { + uploadWyreAccountDocument +} from '../../../../actions/actions/PaymentMethod/WyreAccount'; + + +const mapStateToProps = (state) => ({ + isFetching: selectWyrePutAccountIsFetching(state), + field: selectWyreAccountField(state, 'individualProofOfAddress'), + fieldId: 'individualProofOfAddress', +}); + +const mapDispatchToProps = ({ + uploadWyreAccountDocument, +}); + +export default connect(mapStateToProps, mapDispatchToProps)(ManageWyreDocuments); diff --git a/src/containers/BuySellCrypto/PaymentMethod/SelectPaymentMethod/SelectPaymentMethod.js b/src/containers/BuySellCrypto/PaymentMethod/SelectPaymentMethod/SelectPaymentMethod.js new file mode 100644 index 00000000..a2c2e40e --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/SelectPaymentMethod/SelectPaymentMethod.js @@ -0,0 +1,69 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { + View, + ScrollView, + TouchableWithoutFeedback, + Keyboard, +} from 'react-native'; + +import { NavigationActions } from 'react-navigation'; + +import { selectWyreCreateAccountIsFetching } from '../../../../selectors/paymentMethods' + +import AccountRenderers from '../renderers/mappings'; + +import { SUPPORTED_PAYMENT_METHODS } from '../../../../utils/constants'; + +import Spinner from 'react-native-loading-spinner-overlay'; + +import styles from './SelectPaymentMethod.styles'; + +import Colors from '../../../../globals/colors'; + +class SelectPaymentMethod extends Component { + back = () => { + this.props.navigation.dispatch(NavigationActions.back()); + } + + onSelect = (method) => { + const { onSelect } = this.props.navigation.state.params; + if (!onSelect) return; + onSelect(method); + this.back(); + } + + render() { + return ( + + + + + { SUPPORTED_PAYMENT_METHODS.map((method) => { + const Renderer = AccountRenderers[method.id]; + return ( + { this.onSelect(method); }} + /> + ); + })} + + + + ); + } +} + +const mapStateToProps = (state) => ({ + isCreating: selectWyreCreateAccountIsFetching(state), +}); + + +export default connect( mapStateToProps )(SelectPaymentMethod); diff --git a/src/containers/BuySellCrypto/PaymentMethod/SelectPaymentMethod/SelectPaymentMethod.styles.js b/src/containers/BuySellCrypto/PaymentMethod/SelectPaymentMethod/SelectPaymentMethod.styles.js new file mode 100644 index 00000000..717b574a --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/SelectPaymentMethod/SelectPaymentMethod.styles.js @@ -0,0 +1,30 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + flexDirection: "column", + paddingVertical: 50, + marginHorizontal: -30, + }, + inputAndDropDownContainer: { + width: "85%", + alignItems: "flex-start", + flex: 1, + flexDirection: "row", + alignSelf: "center", + maxHeight: 100 + }, + saveChangesButton: { + height: 46, + backgroundColor: "#009B72", + }, + paymentMethodText: { + fontSize: 25, + color: '#86939e', + paddingLeft: 30, + padding: 30, + }, +}); diff --git a/src/containers/BuySellCrypto/PaymentMethod/SendTransaction/SendTransaction.js b/src/containers/BuySellCrypto/PaymentMethod/SendTransaction/SendTransaction.js new file mode 100644 index 00000000..b2b36fdc --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/SendTransaction/SendTransaction.js @@ -0,0 +1,140 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { + View, + Text, + ScrollView, + } from 'react-native'; +import { NavigationActions } from 'react-navigation'; +import { sendTransaction } from '../../../../actions/actions/PaymentMethod/WyreAccount'; +import Button1 from '../../../../symbols/button1'; +import styles from './SendTransaction.styles'; +import { + getTransactions +} from '../../../../actions/actions/PaymentMethod/WyreAccount'; +import { + selectTransactionHistoryIsFetching, + selectTransactionHistory +} from '../../../../selectors/paymentMethods'; +import { ListItem } from "react-native-elements"; +import Spinner from 'react-native-loading-spinner-overlay'; +import Colors from '../../../../globals/colors'; + +class SendTransaction extends Component { + componentDidMount() { + this.props.getTransactions(); + } + + + handleConfirm = () => { + this.props.sendTransaction( + this.props.navigation.state.params.paymentMethod.name, + this.props.navigation.state.params.fromCurr, + this.props.navigation.state.params.fromVal, + this.props.navigation.state.params.toCurr, + this.props.navigation, + ); + } + + back = () => { + this.props.navigation.dispatch(NavigationActions.back()); + } + + render() { + return( + + + + + Payment method + + + {this.props.navigation.state.params.paymentMethod.name} + + + + From + + + { + ` ${this.props.navigation.state.params.fromVal} "${this.props.navigation.state.params.fromCurr}"` + } + + + + To + + + { + `${this.props.navigation.state.params.toVal} "${this.props.navigation.state.params.toCurr}"` + } + + + + + + + + Transaction history + + + + { + this.props.history && this.props.history.data && this.props.history.data.map((item) => ( + + + + + )) + + } + + + + ); + } +} + +const mapStateToProps = (state) => ({ + activeAccount: state.authentication.activeAccount, + isTransactionHistoryFetching: selectTransactionHistoryIsFetching(state), + history: selectTransactionHistory(state) + }); + + +const mapDispatchToProps = ({ + sendTransaction, + getTransactions + }); + + +export default connect(mapStateToProps, mapDispatchToProps)(SendTransaction) \ No newline at end of file diff --git a/src/containers/BuySellCrypto/PaymentMethod/SendTransaction/SendTransaction.styles.js b/src/containers/BuySellCrypto/PaymentMethod/SendTransaction/SendTransaction.styles.js new file mode 100644 index 00000000..5e383772 --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/SendTransaction/SendTransaction.styles.js @@ -0,0 +1,89 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + flexDirection: "column", + paddingTop: '3%' + }, + containerConfirmTransaction: { + flexDirection: "column", + }, + containerTransactionInfo: { + borderRadius: 7, + backgroundColor: Colors.tertiaryColor, + marginHorizontal: '5%', + paddingVertical: '2%', + marginBottom: '4%', + paddingHorizontal: '2%', + }, + buttonContainer: { + width: "90%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-between", + alignSelf: 'center', + }, + saveChangesButton: { + height: 44, + backgroundColor: Colors.successButtonColor, + width: '63%', + marginVertical: 3, + }, + backButton: { + height: 44, + backgroundColor: Colors.basicButtonColor, + width: '35%', + marginVertical: 3, + }, + transactionInfoTitleTextStyle: { + color: Colors.quinaryColor, + textAlign: 'left', + fontWeight: 'bold', + fontSize: 18, + marginTop: '2%', + fontFamily: 'Avenir', + }, + transactionInfoSubtitleTextStyle: { + color: Colors.quaternaryColor, + fontSize: 15, + fontFamily: 'Avenir', + }, + textTransactionHistory: { + color: Colors.quinaryColor, + fontSize: 20, + marginVertical: '5%', + paddingTop: '5%', + paddingLeft: '5%', + fontWeight: '700', + fontFamily: 'Avenir', + }, + itemTextTransactionHistory: { + color: Colors.quinaryColor, + fontFamily: 'Avenir', + fontWeight: 'normal' + }, + itemContainerTransactionHistory: { + borderBottomWidth: 0, + }, + itemIdTransactionHistory: { + color: Colors.quinaryColor, + fontSize: 13, + fontFamily: 'Avenir', + }, + rightTitleStyle: { + fontSize: 17, + color: Colors.quinaryColor, + fontFamily: 'Avenir', + fontWeight: '500' + }, + containerTransactionView: { + width: '90%', + backgroundColor: Colors.tertiaryColor, + alignSelf: 'center', + borderRadius: 10, + marginBottom: '3%' + }, +}); diff --git a/src/containers/BuySellCrypto/PaymentMethod/renderers/WyreAccount/WyreAccount.js b/src/containers/BuySellCrypto/PaymentMethod/renderers/WyreAccount/WyreAccount.js new file mode 100644 index 00000000..38618021 --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/renderers/WyreAccount/WyreAccount.js @@ -0,0 +1,61 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; + +import { + View, + Text, + TouchableWithoutFeedback, +} from 'react-native'; +import { ListItem } from 'react-native-elements'; +import Button1 from '../../../../../symbols/button1'; + +import { manageAccount } from '../../../../../actions/actions/PaymentMethod/WyreAccount'; + +import { BankBuildingBlack } from '../../../../../images/customIcons'; + +import styles from '../mappings.styles'; + +class WyreAccount extends Component { + manageAccount = () => ( + this.props.manageAccount(this.props.navigation) + ) + + render() { + return ( + + + + Bank Transfer} + avatar={BankBuildingBlack} + avatarOverlayContainerStyle={{backgroundColor: 'transparent'}} + avatarStyle={{resizeMode: 'contain'}} + containerStyle={styles.coinItemContainer} + subtitle="ACH with Wyre" + subtitleStyle={{fontFamily: 'Avenir-Book'}} + rightTitle="max $2,500/wk" + rightTitleStyle={styles.rightTitleStyle} + /> + + + + + + + ); + } +} + + + +const mapDispatchToProps = { + manageAccount, +}; + + + +export default connect(null, mapDispatchToProps)(WyreAccount); diff --git a/src/containers/BuySellCrypto/PaymentMethod/renderers/mappings.js b/src/containers/BuySellCrypto/PaymentMethod/renderers/mappings.js new file mode 100644 index 00000000..eb4ea5d1 --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/renderers/mappings.js @@ -0,0 +1,5 @@ +import WyreAccount from './WyreAccount/WyreAccount'; + +export default { + US_BANK_ACCT: WyreAccount, +}; diff --git a/src/containers/BuySellCrypto/PaymentMethod/renderers/mappings.styles.js b/src/containers/BuySellCrypto/PaymentMethod/renderers/mappings.styles.js new file mode 100644 index 00000000..2309789d --- /dev/null +++ b/src/containers/BuySellCrypto/PaymentMethod/renderers/mappings.styles.js @@ -0,0 +1,45 @@ +import { StyleSheet } from 'react-native'; +import Colors from '../../../../globals/colors'; + +export default StyleSheet.create({ + manageAccountView: { + marginTop: 15, + }, + manageAccountLabel: { + height: 45, + backgroundColor: Colors.successButtonColor + }, + bankAccountLabel: { + color: 'black', + fontSize: 17, + fontWeight: '500', + padding: 5, + textAlign: 'center' + }, + bankAccountContainer: { + flex: 1, + padding: 10, + }, + coinItemLabel: { + color: Colors.quaternaryColor, + marginLeft: 10, + fontSize: 17, + fontFamily: 'Avenir-Black', + }, + coinItemContainer: { + borderBottomWidth: 0, + }, + formInput: { + width: '100%', + marginLeft: 0, + borderWidth: 1, + borderRadius: 7, + borderColor: '#86939e', + padding: 5, + }, + rightTitleStyle: { + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Book', + fontSize: 15 + }, +}); diff --git a/src/containers/BuySellCrypto/RegistrationModal/SelectCountry/SelectCountry.js b/src/containers/BuySellCrypto/RegistrationModal/SelectCountry/SelectCountry.js new file mode 100644 index 00000000..b38dda14 --- /dev/null +++ b/src/containers/BuySellCrypto/RegistrationModal/SelectCountry/SelectCountry.js @@ -0,0 +1,116 @@ +/* + This component serves as a gateway to the FIAT on/off ramp features. + Based on the answer to the "What Country?" question, this will either + let a user through to the fiat gateway registration process or deny + them entry (if their country is incompatible with fiat on/off ramp framework). +*/ + +import React, { Component } from "react"; +import Button1 from "../../../../symbols/button1"; +import { + View, + ScrollView, + Keyboard, + TouchableWithoutFeedback +} from "react-native"; +import { SUPPORTED_COUNTRIES } from '../../../../utils/constants' +import { saveBuySellSettings } from '../../../../actions/actionCreators' +import { NavigationActions } from 'react-navigation'; +import { connect } from 'react-redux'; +import styles from './SelectCountry.styles' +import CountryPicker from 'react-native-country-picker-modal'; + +class SelectCountry extends Component { + constructor() { + super(); + this.state = { + countryCode: '' + }; + } + + back = () => { + this.props.navigation.dispatch(NavigationActions.back()) + } + + handleSubmit = () => { + const selectedCountry = this.state.countryCode + + if (!SUPPORTED_COUNTRIES.includes(selectedCountry)) { + this.handleUnsupportedCountry() + } else { + //Handle wyre registration process here + } + } + + handleUnsupportedCountry = () => { + if (await this.canTurnOffBuySellForUser()) { + this.props.dispatch(saveBuySellSettings({buySellEnabled: false}, this.props.activeAccount.id)) + this.back() + Alert.alert("Setting Saved", `Buy/Sell buttons will no longer be visible for user ${this.props.activeAccount.id}. To re-enable, go to settings.`) + } + } + + canTurnOffBuySellForUser = async () => { + return AlertAsync( + 'Unsupported Country', + 'The country you have selected is currently not supported for cryptocurrency buying and selling. Would you like to ' + + 'remove the buy/sell buttons within Verus Mobile for this user account? (You can always change this later in settings)', + [ + { + text: 'Cancel', + onPress: () => Promise.resolve(false), + style: 'cancel', + }, + {text: 'Yes, remove buy/sell buttons', onPress: () => Promise.resolve(true)}, + ], + { + cancelable: false, + }, + ) + } + + render() { + return ( + + + + + {"Select your country..."} + + {this.setState({countryCode: country})}} + /> + + + + + + + + + + ); + } +} + +const mapStateToProps = (state) => { + return { + buySellSettings: state.settings.buySellSettings, + activeAccount: state.authentication.activeAccount, + } +}; + +export default connect(mapStateToProps)(SelectCountry); + diff --git a/src/containers/BuySellCrypto/RegistrationModal/SelectCountry/SelectCountry.styles.js b/src/containers/BuySellCrypto/RegistrationModal/SelectCountry/SelectCountry.styles.js new file mode 100644 index 00000000..031bfe68 --- /dev/null +++ b/src/containers/BuySellCrypto/RegistrationModal/SelectCountry/SelectCountry.styles.js @@ -0,0 +1,72 @@ +import { StyleSheet } from "react-native" + +export default styles = StyleSheet.create({ + root: { + backgroundColor: "#232323", + flex: 1, + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + }, + keyGenLabel: { + textAlign:"left", + marginRight: "auto", + color: "#2E86AB" + }, + formInput: { + width: "100%", + }, + valueContainer: { + width: "85%", + }, + mainLabel: { + backgroundColor: "transparent", + fontSize: 22, + color: "#E9F1F7", + textAlign: "center", + marginTop: 25 + }, + wifInput: { + width: "100%", + color: "#009B72" + }, + buttonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-between", + }, + singleButtonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "center", + }, + saveChangesButton: { + height: 46, + backgroundColor: "#009B72", + marginTop: 15, + }, + clearCacheButton: { + height: 46, + backgroundColor: "#2E86AB", + marginTop: 25, + marginBottom: 25 + }, + backButton: { + height: 46, + backgroundColor: "rgba(206,68,70,1)", + marginTop: 15, + }, + utxoVerificationDesc: { + textAlign:"left", + marginRight: "auto" + }, + bottom: { + flex: 1, + justifyContent: 'flex-end', + alignItems: 'center', + marginBottom: 36 + } +}); \ No newline at end of file diff --git a/src/containers/BuySellCrypto/SellCrypto/SellCrypto.js b/src/containers/BuySellCrypto/SellCrypto/SellCrypto.js new file mode 100644 index 00000000..e69de29b diff --git a/src/containers/CoinMenus.js b/src/containers/Coin/CoinMenus.js similarity index 92% rename from src/containers/CoinMenus.js rename to src/containers/Coin/CoinMenus.js index 29539d35..781d2e45 100644 --- a/src/containers/CoinMenus.js +++ b/src/containers/Coin/CoinMenus.js @@ -11,9 +11,9 @@ import { connect } from 'react-redux'; import BottomNavigation, { FullTab } from 'react-native-material-bottom-navigation' -import Overview from './Overview' -import SendCoin from './SendCoin' -import ReceiveCoin from './ReceiveCoin' +import Overview from './Overview/Overview' +import SendCoin from './SendCoin/SendCoin' +import ReceiveCoin from './ReceiveCoin/ReceiveCoin' import { Icon } from "react-native-elements" class CoinMenus extends Component { @@ -87,8 +87,10 @@ class CoinMenus extends Component { ) diff --git a/src/containers/Overview.js b/src/containers/Coin/Overview/Overview.js similarity index 82% rename from src/containers/Overview.js rename to src/containers/Coin/Overview/Overview.js index 7aabadb6..efa9d192 100644 --- a/src/containers/Overview.js +++ b/src/containers/Coin/Overview/Overview.js @@ -7,25 +7,25 @@ import React, { Component } from "react"; import { View, - StyleSheet, Text, FlatList, TouchableOpacity } from "react-native"; import { ListItem } from "react-native-elements"; import { connect } from 'react-redux'; -import { satsToCoins, truncateDecimal } from '../utils/math'; +import { satsToCoins, truncateDecimal } from '../../../utils/math'; import { fetchTransactionsForCoin, updateCoinBalances, everythingNeedsUpdate -} from '../actions/actionCreators'; +} from '../../../actions/actionCreators'; +import styles from './Overview.styles'; -const SELF = require('../images/customIcons/selfArrow.png') -const OUT = require('../images/customIcons/outgoingArrow.png') -const IN = require('../images/customIcons/incomingArrow.png') -const UNKNOWN = require('../images/customIcons/unknownLogo.png') -const INTEREST = require('../images/customIcons/interestPlus.png') +const SELF = require('../../../images/customIcons/selfArrow.png') +const OUT = require('../../../images/customIcons/outgoingArrow.png') +const IN = require('../../../images/customIcons/incomingArrow.png') +const UNKNOWN = require('../../../images/customIcons/unknownLogo.png') +const INTEREST = require('../../../images/customIcons/interestPlus.png') const CONNECTION_ERROR = "Connection Error" class Overview extends Component { @@ -268,61 +268,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(Overview); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - coinBalanceLabel: { - backgroundColor: "transparent", - opacity: 0.89, - marginTop: 15, - marginBottom: 15, - paddingBottom: 0, - paddingTop: 0, - fontSize: 25, - textAlign: "center", - color: "#E9F1F7", - }, - connectionErrorLabel: { - backgroundColor: "transparent", - opacity: 0.89, - marginTop: 15, - marginBottom: 15, - paddingBottom: 0, - paddingTop: 0, - fontSize: 25, - textAlign: "center", - color: "rgba(206,68,70,1)", - }, - spinner: { - marginTop: 13, - marginBottom: 14, - }, - transactionLabel: { - width: "100%", - backgroundColor: "#E9F1F7", - opacity: 0.86, - marginTop: 0, - marginBottom: 0, - paddingBottom: 15, - paddingTop: 15, - fontSize: 22, - textAlign: "center", - color: "#232323" - }, - headerContainer: { - flexDirection: "row", - justifyContent: "center", - }, - transactionList: { - width: "100%", - }, - transactionItemLabel: { - color: "#E9F1F7", - marginLeft: 10, - }, -}); +export default connect(mapStateToProps)(Overview); \ No newline at end of file diff --git a/src/containers/Coin/Overview/Overview.styles.js b/src/containers/Coin/Overview/Overview.styles.js new file mode 100644 index 00000000..872baff5 --- /dev/null +++ b/src/containers/Coin/Overview/Overview.styles.js @@ -0,0 +1,62 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center" + }, + coinBalanceLabel: { + backgroundColor: "transparent", + opacity: 0.89, + marginTop: 15, + marginBottom: 15, + paddingBottom: 0, + paddingTop: 0, + fontSize: 35, + textAlign: "center", + color: Colors.quaternaryColor, + fontFamily: 'Avenir', + }, + connectionErrorLabel: { + backgroundColor: "transparent", + opacity: 0.89, + marginTop: 15, + marginBottom: 15, + paddingBottom: 0, + paddingTop: 0, + fontSize: 25, + textAlign: "center", + color: "rgba(206,68,70,1)", + }, + spinner: { + marginTop: 13, + marginBottom: 14, + }, + transactionLabel: { + width: "100%", + backgroundColor: Colors.tertiaryColor, + opacity: 0.86, + marginTop: 0, + marginBottom: 0, + paddingBottom: 15, + paddingTop: 15, + fontSize: 22, + textAlign: "center", + color: Colors.quinaryColor, + fontFamily: 'Avenir-Black', + }, + headerContainer: { + flexDirection: "row", + justifyContent: "center", + }, + transactionList: { + width: "100%", + }, + transactionItemLabel: { + color: Colors.quaternaryColor, + marginLeft: 10, + fontWeight: "bold" + }, +}); diff --git a/src/containers/ReceiveCoin.js b/src/containers/Coin/ReceiveCoin/ReceiveCoin.js similarity index 84% rename from src/containers/ReceiveCoin.js rename to src/containers/Coin/ReceiveCoin/ReceiveCoin.js index f52e8684..b41623ba 100644 --- a/src/containers/ReceiveCoin.js +++ b/src/containers/Coin/ReceiveCoin/ReceiveCoin.js @@ -6,10 +6,9 @@ */ import React, { Component } from "react" -import Button1 from "../symbols/button1" +import Button1 from "../../../symbols/button1" import { View, - StyleSheet, Text, TouchableOpacity, ScrollView, @@ -23,9 +22,11 @@ import { FormLabel, FormInput, FormValidationMessage, Icon } from 'react-native- import { connect } from 'react-redux' import { Dropdown } from 'react-native-material-dropdown' import QRCode from 'react-native-qrcode-svg'; -import QRModal from '../components/QRModal' -import { coinsToSats, isNumber, truncateDecimal } from '../utils/math' -import { setCoinRates, everythingNeedsUpdate } from '../actions/actionCreators' +import QRModal from '../../../components/QRModal' +import { coinsToSats, isNumber, truncateDecimal } from '../../../utils/math' +import { setCoinRates, everythingNeedsUpdate } from '../../../actions/actionCreators' +import styles from './ReceiveCoin.styles' +import Colors from '../../../globals/colors'; class ReceiveCoin extends Component { constructor(props) { @@ -229,11 +230,15 @@ class ReceiveCoin extends Component { }} data={this.props.activeCoinsForUser} onChangeText={(value, index, data) => this.switchInvoiceCoin(value)} - textColor="#E9F1F7" - selectedItemColor="#232323" - baseColor="#E9F1F7" + textColor={Colors.quinaryColor} + selectedItemColor={Colors.quinaryColor} + baseColor={Colors.quinaryColor} label="Selected Coin:" + labelTextStyle={{fontFamily: 'Avenir-Book'}} + labelFontSize={17} value={this.state.selectedCoin} + pickerStyle={{backgroundColor: Colors.tertiaryColor}} + itemTextStyle={{fontFamily: 'Avenir-Book'}} /> @@ -251,7 +256,7 @@ class ReceiveCoin extends Component { Your address: } - + @@ -286,7 +291,7 @@ class ReceiveCoin extends Component { } this.setState({amount: text})} shake={this.state.errors.amount} inputStyle={styles.formInput} @@ -314,7 +319,7 @@ class ReceiveCoin extends Component { {"Enter a note for the receiver (optional):"} this.setState({memo: text})} autoCapitalize={"none"} autoCorrect={false} @@ -333,7 +338,7 @@ class ReceiveCoin extends Component { @@ -353,75 +358,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(ReceiveCoin); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - }, - formLabel: { - textAlign:"left", - marginRight: "auto", - }, - formInput: { - width: "100%", - }, - valueContainer: { - width: "85%", - }, - wifLabel: { - backgroundColor: "transparent", - marginTop: 50, - marginBottom: 8, - paddingBottom: 0, - fontSize: 22, - color: "#E9F1F7", - width: "85%", - textAlign: "center" - }, - wifInput: { - width: "100%", - color: "#009B72" - }, - singleButtonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "center", - }, - labelContainer: { - width: "94%", - flexDirection: "row", - justifyContent: "space-between" - }, - addAccountButton: { - height: 46, - backgroundColor: "#2E86AB", - marginTop: 15, - marginBottom: 40 - }, - dropDownContainer: { - width: "85%", - alignItems: "center" - }, - dropDown: { - width: "90%", - marginBottom: 0, - marginTop: 0, - }, - swapInputTypeBtn: { - textAlign:"left", - marginRight: "auto", - color: "#2E86AB" - }, - swapInputTypeBtnBordered: { - marginRight: "auto", - color: "#2E86AB", - borderRadius: 10, - backgroundColor: "#E9F1F7", - paddingLeft: 5, - paddingRight: 5, - overflow: "hidden" - }, -}); \ No newline at end of file +export default connect(mapStateToProps)(ReceiveCoin); \ No newline at end of file diff --git a/src/containers/Coin/ReceiveCoin/ReceiveCoin.styles.js b/src/containers/Coin/ReceiveCoin/ReceiveCoin.styles.js new file mode 100644 index 00000000..20a71a14 --- /dev/null +++ b/src/containers/Coin/ReceiveCoin/ReceiveCoin.styles.js @@ -0,0 +1,83 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + color: Colors.quinaryColor, + fontWeight: 'normal', + fontSize: 17, + fontFamily: 'Avenir', + }, + formInput: { + width: "100%", + color: Colors.quinaryColor, + fontSize: 16, + fontFamily: 'Avenir', + }, + valueContainer: { + width: "85%", + }, + wifLabel: { + backgroundColor: "transparent", + marginTop: 50, + marginBottom: 8, + paddingBottom: 0, + fontSize: 22, + color: Colors.quaternaryColor, + width: "85%", + textAlign: "center", + fontFamily: 'Avenir-Black', + }, + wifInput: { + width: "100%", + color: "#009B72", + fontSize: 16, + }, + singleButtonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "center", + }, + labelContainer: { + width: "94%", + flexDirection: "row", + justifyContent: "space-between" + }, + addAccountButton: { + height: 46, + backgroundColor: Colors.successButtonColor, + marginTop: 15, + marginBottom: 40, + width: '100%' + }, + dropDownContainer: { + width: "85%", + alignItems: "center" + }, + dropDown: { + width: '85%', + marginBottom: 0, + marginTop: 0, + }, + swapInputTypeBtn: { + textAlign:"left", + marginRight: "auto", + color: "#2E86AB" + }, + swapInputTypeBtnBordered: { + marginRight: "auto", + color: "#2E86AB", + borderRadius: 10, + backgroundColor: Colors.tertiaryColor, + paddingLeft: 5, + paddingRight: 5, + overflow: "hidden" + }, +}); diff --git a/src/containers/SendCoin.js b/src/containers/Coin/SendCoin/SendCoin.js similarity index 84% rename from src/containers/SendCoin.js rename to src/containers/Coin/SendCoin/SendCoin.js index 87d50304..b674ea09 100644 --- a/src/containers/SendCoin.js +++ b/src/containers/Coin/SendCoin/SendCoin.js @@ -8,12 +8,11 @@ address to send to manually. */ -import React, { Component } from "react"; -import Button1 from "../symbols/button1"; -import { FormLabel, FormInput, FormValidationMessage, } from "react-native-elements"; +import React, { Component } from "react" +import Button1 from "../../../symbols/button1" +import { FormLabel, FormInput, FormValidationMessage, } from "react-native-elements" import { View, - StyleSheet, Text, Alert, Keyboard, @@ -22,14 +21,16 @@ import { TouchableOpacity, ScrollView, Image -} from "react-native"; -import { satsToCoins, truncateDecimal, isNumber, coinsToSats } from '../utils/math'; -import { updateCoinBalances, setCoinRates } from '../actions/actionCreators'; +} from "react-native" +import { satsToCoins, truncateDecimal, isNumber, coinsToSats } from '../../../utils/math' +import { updateCoinBalances, setCoinRates } from '../../../actions/actionCreators' import { connect } from "react-redux"; -import { getRecommendedBTCFees } from '../utils/httpCalls/callCreators' -import { removeSpaces } from '../utils/stringUtils' +import { getRecommendedBTCFees } from '../../../utils/httpCalls/callCreators' +import { removeSpaces } from '../../../utils/stringUtils' +import styles from './SendCoin.styles' +import Colors from '../../../globals/colors'; -const VERUSPAY_LOGO_DIR = require('../images/customIcons/verusPay.png') +const VERUSPAY_LOGO_DIR = require('../../../images/customIcons/verusPay.png') const DEFAULT_FEE_GUI = 10000; class SendCoin extends Component { @@ -285,7 +286,7 @@ class SendCoin extends Component { To: this.setState({toAddress: removeSpaces(text)})} onSubmitEditing={Keyboard.dismiss} value={this.state.toAddress} @@ -308,7 +309,7 @@ class SendCoin extends Component { Amount: this.setState({amount: text})} onSubmitEditing={Keyboard.dismiss} value={this.state.amount.toString()} @@ -328,7 +329,7 @@ class SendCoin extends Component { @@ -355,7 +356,7 @@ class SendCoin extends Component { : - + } @@ -374,87 +375,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(SendCoin); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - }, - formLabel: { - textAlign:"left", - marginRight: "auto", - }, - formInput: { - width: "100%", - }, - valueContainer: { - width: "85%", - }, - coinBalanceLabel: { - backgroundColor: "transparent", - opacity: 0.89, - marginTop: 15, - marginBottom: 15, - paddingBottom: 0, - paddingTop: 0, - fontSize: 25, - textAlign: "center", - color: "#009B72", - width: 359, - }, - sendLabel: { - width: "100%", - backgroundColor: "#E9F1F7", - opacity: 0.86, - marginTop: 0, - marginBottom: 0, - paddingBottom: 15, - paddingTop: 15, - fontSize: 22, - textAlign: "center", - color: "#232323" - }, - buttonContainer: { - height: 45, - width: 400, - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-around", - paddingBottom: 0, - paddingTop: 0, - marginBottom: 8, - marginTop: 28 - }, - loadingContainer: { - width: 400, - backgroundColor: "transparent", - justifyContent: "center", - paddingBottom: 0, - paddingTop: 0, - marginBottom: 8, - marginTop: 28 - }, - sendBtn: { - width: 104, - height: 45, - backgroundColor: "#009B72", - opacity: 1, - marginTop: 0, - marginBottom: 0 - }, - loadingText: { - backgroundColor: "transparent", - opacity: 0.86, - fontSize: 22, - textAlign: "center", - color: "#E9F1F7" - }, - errorText: { - backgroundColor: "transparent", - opacity: 0.86, - fontSize: 22, - textAlign: "center", - color: "rgba(206,68,70,1)" - }, -}); \ No newline at end of file +export default connect(mapStateToProps)(SendCoin); \ No newline at end of file diff --git a/src/containers/Coin/SendCoin/SendCoin.styles.js b/src/containers/Coin/SendCoin/SendCoin.styles.js new file mode 100644 index 00000000..173e2d75 --- /dev/null +++ b/src/containers/Coin/SendCoin/SendCoin.styles.js @@ -0,0 +1,90 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + color: Colors.quinaryColor, + fontFamily: 'Avenir', + }, + formInput: { + width: "100%", + color: Colors.quinaryColor, + fontFamily: 'Avenir', + }, + valueContainer: { + width: "85%", + }, + coinBalanceLabel: { + backgroundColor: "transparent", + opacity: 0.89, + marginTop: 15, + marginBottom: 15, + paddingBottom: 0, + paddingTop: 0, + fontSize: 35, + textAlign: "center", + color: Colors.primaryColor, + fontFamily: 'Avenir-Book', + }, + sendLabel: { + width: "100%", + backgroundColor: Colors.tertiaryColor, + opacity: 0.86, + marginTop: 0, + marginBottom: 0, + paddingBottom: 15, + paddingTop: 15, + fontSize: 22, + textAlign: "center", + color: Colors.quinaryColor, + fontFamily: 'Avenir-Black', + }, + buttonContainer: { + height: 45, + width: 400, + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-around", + paddingBottom: 0, + paddingTop: 0, + marginBottom: 8, + marginTop: 28 + }, + loadingContainer: { + width: 400, + backgroundColor: "transparent", + justifyContent: "center", + paddingBottom: 0, + paddingTop: 0, + marginBottom: 8, + marginTop: 28 + }, + sendBtn: { + width: '80%', + height: 45, + backgroundColor: Colors.successButtonColor, + opacity: 1, + marginTop: 0, + marginBottom: 0 + }, + loadingText: { + backgroundColor: "transparent", + opacity: 0.86, + fontSize: 22, + textAlign: "center", + color: Colors.quaternaryColor + }, + errorText: { + backgroundColor: "transparent", + opacity: 0.86, + fontSize: 22, + textAlign: "center", + color: "rgba(206,68,70,1)" + }, +}); \ No newline at end of file diff --git a/src/containers/SendResult.js b/src/containers/Coin/SendCoin/SendResult/SendResult.js similarity index 78% rename from src/containers/SendResult.js rename to src/containers/Coin/SendCoin/SendResult/SendResult.js index a1c26f78..c0e14d30 100644 --- a/src/containers/SendResult.js +++ b/src/containers/Coin/SendCoin/SendResult/SendResult.js @@ -8,33 +8,34 @@ is sent. */ -import React, { Component } from "react"; -import Button1 from "../symbols/button1"; -import { connect } from 'react-redux'; -import { sendRawTx } from '../utils/httpCalls/callCreators'; -import { networks } from 'bitgo-utxo-lib'; +import React, { Component } from "react" +import Button1 from "../../../../symbols/button1" +import { connect } from 'react-redux' +import { sendRawTx } from '../../../../utils/httpCalls/callCreators' +import { networks } from 'bitgo-utxo-lib' import { View, - StyleSheet, TouchableOpacity, Text, ScrollView, Linking, Alert, Clipboard - } from "react-native"; -import { satsToCoins, truncateDecimal } from '../utils/math'; -import { explorers } from '../utils/CoinData'; + } from "react-native" +import { satsToCoins, truncateDecimal } from '../../../../utils/math' +import { explorers } from '../../../../utils/CoinData' import { needsUpdate, transactionsNeedUpdate, setActiveCoin, setActiveApp, setActiveSection - } from '../actions/actionCreators'; -import ProgressBar from 'react-native-progress/Bar'; + } from '../../../../actions/actionCreators' +import ProgressBar from 'react-native-progress/Bar' import { Icon } from 'react-native-elements' -import { NO_VERIFICATION, MID_VERIFICATION } from '../utils/constants' +import { NO_VERIFICATION, MID_VERIFICATION } from '../../../../utils/constants' +import styles from './SendResult.styles' +import Colors from '../../../../globals/colors' const TIMEOUT_LIMIT = 120000 const LOADING_TICKER = 5000 @@ -237,7 +238,7 @@ class SendResult extends Component { {this.state.txid} - + @@ -305,110 +306,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(SendResult); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - loadingRoot: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center", - justifyContent: "center" - }, - infoBox: { - flex: 1, - flexDirection: 'column', - alignSelf: 'center', - justifyContent: 'flex-start', - width: "85%", - }, - infoRow: { - flex: 1, - flexDirection: 'row', - justifyContent: 'space-between', - alignSelf: 'stretch', - marginTop: 10 - }, - infoText: { - fontSize: 16, - color: "#E9F1F7" - }, - addressText: { - fontSize: 16, - color: "#E9F1F7", - width: "65%", - textAlign: "right" - }, - rect: { - height: 1, - width: 360, - backgroundColor: "rgb(230,230,230)" - }, - loadingLabel: { - backgroundColor: "transparent", - opacity: 0.86, - marginTop: 15, - marginBottom: 15, - fontSize: 22, - textAlign: "center", - color: "#E9F1F7" - }, - errorLabel: { - backgroundColor: "transparent", - opacity: 0.86, - marginTop: 15, - marginBottom: 15, - fontSize: 22, - textAlign: "center", - color: "rgba(206,68,70,1)" - }, - verifiedLabel: { - backgroundColor: "transparent", - opacity: 0.86, - marginTop: 15, - marginBottom: 15, - fontSize: 22, - textAlign: "center", - color: "rgba(68,206,147,1)" - }, - sendBtn: { - width: 140, - height: 45, - backgroundColor: "#009B72", - opacity: 1, - marginTop: 0, - marginBottom: 0 - }, - explBtn: { - width: 140, - height: 45, - backgroundColor: "#EDAE49", - opacity: 1, - marginTop: 0, - marginBottom: 0 - }, - homeBtn: { - width: 140, - height: 45, - backgroundColor: "#2E86AB", - opacity: 1, - marginTop: 0, - marginBottom: 0 - }, - buttonContainer: { - height: 54, - width: "100%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-around", - paddingBottom: 0, - paddingTop: 5, - marginBottom: 8, - marginTop: 8, - left: "0%" - }, -}); \ No newline at end of file +export default connect(mapStateToProps)(SendResult); \ No newline at end of file diff --git a/src/containers/Coin/SendCoin/SendResult/SendResult.styles.js b/src/containers/Coin/SendCoin/SendResult/SendResult.styles.js new file mode 100644 index 00000000..b08d4266 --- /dev/null +++ b/src/containers/Coin/SendCoin/SendResult/SendResult.styles.js @@ -0,0 +1,108 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../../globals/colors' + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center" + }, + loadingRoot: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center", + justifyContent: "center" + }, + infoBox: { + flex: 1, + flexDirection: 'column', + alignSelf: 'center', + justifyContent: 'flex-start', + width: "85%", + }, + infoRow: { + flex: 1, + flexDirection: 'row', + justifyContent: 'space-between', + alignSelf: 'stretch', + marginTop: 10 + }, + infoText: { + fontSize: 16, + color: Colors.quaternaryColor + }, + addressText: { + fontSize: 16, + color: Colors.quaternaryColor, + width: "65%", + textAlign: "right" + }, + rect: { + height: 1, + width: 360, + backgroundColor: "rgb(230,230,230)" + }, + loadingLabel: { + backgroundColor: "transparent", + opacity: 0.86, + marginTop: 15, + marginBottom: 15, + fontSize: 22, + textAlign: "center", + color: Colors.quaternaryColor + }, + errorLabel: { + backgroundColor: "transparent", + opacity: 0.86, + marginTop: 15, + marginBottom: 15, + fontSize: 22, + textAlign: "center", + color: "rgba(206,68,70,1)" + }, + verifiedLabel: { + backgroundColor: "transparent", + opacity: 0.86, + marginTop: 15, + marginBottom: 15, + fontSize: 22, + textAlign: "center", + color: Colors.successButtonColor + }, + sendBtn: { + width: 140, + height: 45, + backgroundColor: "#009B72", + opacity: 1, + marginTop: 0, + marginBottom: 0 + }, + explBtn: { + width: 140, + height: 45, + backgroundColor: "#EDAE49", + opacity: 1, + marginTop: 0, + marginBottom: 0 + }, + homeBtn: { + width: 140, + height: 45, + backgroundColor: "#2E86AB", + opacity: 1, + marginTop: 0, + marginBottom: 0 + }, + buttonContainer: { + height: 54, + width: "100%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-around", + paddingBottom: 0, + paddingTop: 5, + marginBottom: 8, + marginTop: 8, + left: "0%" + }, +}); \ No newline at end of file diff --git a/src/containers/CoinDetails.js b/src/containers/CoinDetails/CoinDetails.js similarity index 63% rename from src/containers/CoinDetails.js rename to src/containers/CoinDetails/CoinDetails.js index 487038b7..a0b0bf13 100644 --- a/src/containers/CoinDetails.js +++ b/src/containers/CoinDetails/CoinDetails.js @@ -6,8 +6,8 @@ */ import React, { Component } from "react"; -import Button1 from "../symbols/button1"; -import { View, StyleSheet, Text, ScrollView, Image, ActivityIndicator } from "react-native"; +import Button1 from "../../symbols/button1"; +import { View, Text, ScrollView, Image, ActivityIndicator } from "react-native"; import { Icon } from "react-native-elements"; import { connect } from 'react-redux'; import { @@ -16,8 +16,9 @@ import { needsUpdate, addKeypair, transactionsNeedUpdate - } from '../actions/actionCreators'; + } from '../../actions/actionCreators'; import { NavigationActions } from 'react-navigation' +import styles from './CoinDetails.styles' class CoinDetails extends Component { constructor(props) { @@ -81,11 +82,10 @@ class CoinDetails extends Component { return ( {this.state.fullCoinData.id} Details - Full Name: @@ -107,11 +107,11 @@ class CoinDetails extends Component { : this.state.isActive ? - Coin Added + COIN ADDED : - this._handleAddCoin()}/> + this._handleAddCoin()}/> } @@ -132,95 +132,4 @@ const mapStateToProps = (state) => { export default connect(mapStateToProps)(CoinDetails); -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - coinAddedBox: { - flex: 1, - flexDirection: 'row', - justifyContent: 'center', - alignItems: "center" - }, - titleLabel: { - backgroundColor: "transparent", - opacity: 0.86, - marginTop: 5, - marginBottom: 3, - paddingBottom: 0, - fontSize: 22, - textAlign: "center", - color: "#E9F1F7", - width: 245, - }, - fullName: { - backgroundColor: "transparent", - opacity: 0.86, - marginTop: 0, - marginBottom: 10, - paddingBottom: 0, - fontSize: 20, - textAlign: "center", - color: "#E9F1F7", - width: 245, - }, - - description: { - backgroundColor: "transparent", - opacity: 0.86, - marginTop: 0, - marginBottom: 0, - paddingBottom: 0, - fontSize: 22, - textAlign: "center", - color: "#E9F1F7", - width: 300, - }, - - coinAddedLabel: { - backgroundColor: "transparent", - opacity: 0.86, - fontSize: 22, - marginRight: 5, - color: "#50C3A5", - }, - rect: { - height: 1, - width: "100%", - backgroundColor: "rgb(230,230,230)" - }, - addCoinBtn: { - height: 54, - width: "100%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-around", - paddingBottom: 0, - paddingTop: 5, - marginBottom: 8, - marginTop: 8, - left: "0%" - }, - receiveBtn: { - width: 222.32, - height: 45, - backgroundColor: "rgba(29,145,95,1)", - opacity: 1, - marginTop: 0, - marginBottom: 0 - }, - homeLabel: { - width: 244, - backgroundColor: "transparent", - opacity: 0.86, - marginTop: 5, - marginBottom: 15, - paddingBottom: 0, - fontSize: 22, - textAlign: "center", - color: "#E9F1F7" - } -}); diff --git a/src/containers/CoinDetails/CoinDetails.styles.js b/src/containers/CoinDetails/CoinDetails.styles.js new file mode 100644 index 00000000..b47d2b7c --- /dev/null +++ b/src/containers/CoinDetails/CoinDetails.styles.js @@ -0,0 +1,90 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center" + }, + coinAddedBox: { + flex: 1, + flexDirection: 'row', + justifyContent: 'center', + alignItems: "center" + }, + titleLabel: { + backgroundColor: "transparent", + marginTop: 5, + marginBottom: 3, + paddingBottom: 0, + fontSize: 22, + textAlign: "center", + color: Colors.quaternaryColor, + fontWeight: 'bold', + fontFamily:'Avenir', + }, + + fullName: { + backgroundColor: "transparent", + opacity: 0.86, + marginTop: 0, + marginBottom: 10, + paddingBottom: 0, + fontSize: 20, + textAlign: "center", + color: Colors.quaternaryColor, + fontFamily:'Avenir', + }, + + description: { + backgroundColor: "transparent", + opacity: 0.86, + marginTop: 0, + marginBottom: 0, + paddingBottom: 0, + fontSize: 20, + textAlign: "center", + color: Colors.quaternaryColor, + width: 300, + fontFamily:'Avenir', + }, + + coinAddedLabel: { + backgroundColor: "transparent", + fontSize: 22, + marginRight: 5, + color: Colors.successButtonColor, + fontFamily:'Avenir-Book', + }, + addCoinBtn: { + height: 54, + width: "100%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-around", + paddingBottom: 0, + paddingTop: 5, + marginBottom: 8, + marginTop: 8, + left: "0%" + }, + receiveBtn: { + width: '85%', + height: 45, + backgroundColor: Colors.infoButtonColor, + marginTop: 0, + marginBottom: 0 + }, + homeLabel: { + backgroundColor: "transparent", + opacity: 0.86, + marginTop: 15, + marginBottom: '15%', + paddingBottom: 0, + fontSize: 25, + textAlign: "center", + color: Colors.quaternaryColor, + fontFamily:'Avenir', + } +}); \ No newline at end of file diff --git a/src/containers/ConfirmSend.js b/src/containers/ConfirmSend/ConfirmSend.js similarity index 83% rename from src/containers/ConfirmSend.js rename to src/containers/ConfirmSend/ConfirmSend.js index 7664e664..c1eb2979 100644 --- a/src/containers/ConfirmSend.js +++ b/src/containers/ConfirmSend/ConfirmSend.js @@ -7,15 +7,16 @@ */ import React, { Component } from "react"; -import Button1 from "../symbols/button1"; +import Button1 from "../../symbols/button1"; import { connect } from 'react-redux'; -import { txPreflight } from '../utils/httpCalls/callCreators'; +import { txPreflight } from '../../utils/httpCalls/callCreators'; import { networks } from 'bitgo-utxo-lib'; -import { View, StyleSheet, Text, ScrollView, Keyboard, Alert } from "react-native"; -import { satsToCoins, truncateDecimal, coinsToSats } from '../utils/math'; +import { View, Text, ScrollView, Keyboard, Alert } from "react-native"; +import { satsToCoins, truncateDecimal, coinsToSats } from '../../utils/math'; import ProgressBar from 'react-native-progress/Bar'; import { NavigationActions } from 'react-navigation'; -import { NO_VERIFICATION, MID_VERIFICATION } from '../utils/constants' +import { NO_VERIFICATION, MID_VERIFICATION } from '../../utils/constants' +import styles from './ConfirmSend.styles' const TIMEOUT_LIMIT = 120000 const LOADING_TICKER = 5000 @@ -254,10 +255,10 @@ class ConfirmSend extends Component { @@ -318,108 +319,3 @@ const mapStateToProps = (state) => { export default connect(mapStateToProps)(ConfirmSend); -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - loadingRoot: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center", - justifyContent: "center" - }, - infoBox: { - flex: 1, - flexDirection: 'column', - alignSelf: 'center', - justifyContent: 'flex-start', - width: "85%", - }, - infoRow: { - flex: 1, - flexDirection: 'row', - justifyContent: 'space-between', - alignSelf: 'stretch', - marginTop: 10 - }, - infoText: { - fontSize: 16, - color: "#E9F1F7" - }, - infoText: { - fontSize: 16, - color: "#E9F1F7" - }, - warningText: { - fontSize: 16, - color: "#ffa303" - }, - addressText: { - fontSize: 16, - color: "#E9F1F7", - width: "65%", - textAlign: "right" - }, - rect: { - height: 1, - width: 360, - backgroundColor: "rgb(230,230,230)" - }, - loadingLabel: { - backgroundColor: "transparent", - opacity: 0.86, - marginTop: 15, - marginBottom: 15, - fontSize: 22, - textAlign: "center", - color: "#E9F1F7" - }, - errorLabel: { - backgroundColor: "transparent", - opacity: 0.86, - marginTop: 15, - marginBottom: 15, - fontSize: 22, - textAlign: "center", - color: "rgba(206,68,70,1)" - }, - verifiedLabel: { - backgroundColor: "transparent", - opacity: 0.86, - marginTop: 15, - marginBottom: 15, - fontSize: 22, - textAlign: "center", - color: "rgba(68,206,147,1)" - }, - cancelBtn: { - width: 104, - height: 45, - backgroundColor: "rgba(206,68,70,1)", - opacity: 1, - marginTop: 0, - marginBottom: 0 - }, - confirmBtn: { - width: 104, - height: 45, - backgroundColor: "#009B72", - opacity: 1, - marginTop: 0, - marginBottom: 0 - }, - buttonContainer: { - height: 54, - width: "100%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-around", - paddingBottom: 0, - paddingTop: 5, - marginBottom: 8, - marginTop: 8, - left: "0%" - }, -}); \ No newline at end of file diff --git a/src/containers/ConfirmSend/ConfirmSend.styles.js b/src/containers/ConfirmSend/ConfirmSend.styles.js new file mode 100644 index 00000000..deeee825 --- /dev/null +++ b/src/containers/ConfirmSend/ConfirmSend.styles.js @@ -0,0 +1,108 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../globals/colors' + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center" + }, + loadingRoot: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center", + justifyContent: "center" + }, + infoBox: { + flex: 1, + flexDirection: 'column', + alignSelf: 'center', + justifyContent: 'flex-start', + width: "85%", + }, + infoRow: { + flex: 1, + flexDirection: 'row', + justifyContent: 'space-between', + alignSelf: 'stretch', + marginTop: 10 + }, + infoText: { + fontSize: 16, + color: Colors.quaternaryColor + }, + infoText: { + fontSize: 16, + color: Colors.quaternaryColor + }, + warningText: { + fontSize: 16, + color: "#ffa303" + }, + addressText: { + fontSize: 16, + color: Colors.quaternaryColor, + width: "65%", + textAlign: "right" + }, + rect: { + height: 1, + width: 360, + backgroundColor: "rgb(230,230,230)" + }, + loadingLabel: { + backgroundColor: "transparent", + opacity: 0.86, + marginTop: 15, + marginBottom: 15, + fontSize: 22, + textAlign: "center", + color: Colors.quaternaryColor + }, + errorLabel: { + backgroundColor: "transparent", + opacity: 0.86, + marginTop: 15, + marginBottom: 15, + fontSize: 22, + textAlign: "center", + color: "rgba(206,68,70,1)" + }, + verifiedLabel: { + backgroundColor: "transparent", + opacity: 0.86, + marginTop: 15, + marginBottom: 15, + fontSize: 22, + textAlign: "center", + color: Colors.successButtonColor + }, + cancelBtn: { + width: 104, + height: 45, + backgroundColor: "rgba(206,68,70,1)", + opacity: 1, + marginTop: 0, + marginBottom: 0 + }, + confirmBtn: { + width: 104, + height: 45, + backgroundColor: "#009B72", + opacity: 1, + marginTop: 0, + marginBottom: 0 + }, + buttonContainer: { + height: 54, + width: "100%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-around", + paddingBottom: 0, + paddingTop: 5, + marginBottom: 8, + marginTop: 8, + left: "0%" + }, +}); \ No newline at end of file diff --git a/src/containers/CustomChainForm.js b/src/containers/CustomChains/CustomChainForm/CustomChainForm.js similarity index 85% rename from src/containers/CustomChainForm.js rename to src/containers/CustomChains/CustomChainForm/CustomChainForm.js index 29ff0457..866bd2bc 100644 --- a/src/containers/CustomChainForm.js +++ b/src/containers/CustomChains/CustomChainForm/CustomChainForm.js @@ -4,7 +4,7 @@ */ import React, { Component } from "react"; -import Button1 from "../symbols/button1"; +import Button1 from "../../../symbols/button1"; import { View, StyleSheet, @@ -20,9 +20,9 @@ import { NavigationActions } from 'react-navigation'; import { FormLabel, FormInput, FormValidationMessage, Icon } from 'react-native-elements' import { connect } from 'react-redux'; import AlertAsync from "react-native-alert-async"; -import { namesList } from '../utils/CoinData' -import { hasSpecialCharacters, isElectrumUrl } from '../utils/stringUtils' -import { isNumber, coinsToSats } from '../utils/math' +import { namesList } from '../../../utils/CoinData' +import { hasSpecialCharacters, isElectrumUrl } from '../../../utils/stringUtils' +import { isNumber, coinsToSats } from '../../../utils/math' import { DEFAULT_FEE_DESC, ELECTRUM_SERVERS_DESC, @@ -38,11 +38,12 @@ import { ELECTRUM_DISCLAIMER_UNREALIZED, ELECTRUM_DISCLAIMER, POSSIBLY_UNSUPPORTED_CHAIN -} from '../utils/constants' -import extraCoins from '../utils/extraCoins/extraCoins' -import { createCoinObj } from '../utils/CoinData' +} from '../../../utils/constants' +import extraCoins from '../../../utils/extraCoins/extraCoins' +import { createCoinObj } from '../../../utils/CoinData' import { networks } from 'bitgo-utxo-lib'; import { isKomodoCoin } from 'agama-wallet-lib/src/coin-helpers'; +import styles from './CustomChainForm.styles' class CustomChainForm extends Component { constructor(props) { @@ -555,13 +556,13 @@ class CustomChainForm extends Component { {this.props.isModal && } @@ -578,129 +579,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(CustomChainForm); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - }, - mainLabel: { - backgroundColor: "transparent", - fontSize: 22, - color: "#E9F1F7", - textAlign: "center", - marginTop: 25 - }, - formLabel: { - textAlign:"left", - marginRight: "auto", - }, - keyGenLabel: { - textAlign:"left", - marginRight: "auto", - color: "#2E86AB" - }, - scanLabel: { - textAlign:"left", - marginRight: "auto", - color: "#009B72" - }, - formInput: { - width: "100%", - }, - valueContainer: { - width: "85%", - }, - switchContainer: { - alignItems: "flex-start", - marginLeft: 18 - }, - wifLabel: { - backgroundColor: "transparent", - marginTop: 50, - marginBottom: 8, - paddingBottom: 0, - fontSize: 22, - color: "#E9F1F7", - width: "85%", - textAlign: "center" - }, - wifInput: { - width: "100%", - color: "#009B72" - }, - buttonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-between", - }, - singleButtonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "center", - }, - addCoinButton: { - height: 46, - backgroundColor: "#2E86AB", - marginTop: 15, - marginBottom: 40 - }, - cancelButton: { - height: 46, - backgroundColor: "rgba(206,68,70,1)", - marginTop: 15, - }, - infoLink: { - color: "#2E86AB" - }, - addServerBtn: { - textAlign:"left", - marginRight: "auto", - color: "#2E86AB" - }, - serverItemContainer: { - flexDirection: "row", - justifyContent: "space-between", - alignItems: "center", - alignSelf: "center", - //borderWidth: 1, - //borderColor: "green", - width: "100%" - }, - serversContainer: { - justifyContent: "center", - //borderWidth: 1, - width: "100%", - //borderColor: "red" - }, - serverInput: { - width: "100%", - }, - serverInputContainer: { - marginHorizontal: 0, - flex: 1, - //borderWidth: 1, - //borderColor: "blue", - //width: "100%", - }, - labelContainer: { - width: "94%", - flexDirection: "row", - justifyContent: "space-between" - }, - infoBtn: { - marginRight: "auto", - color: "#2E86AB", - borderRadius: 10, - backgroundColor: "#E9F1F7", - paddingLeft: 5, - paddingRight: 5, - overflow: "hidden" - }, - removeServerBtn: { - marginRight: 15 - } -}); \ No newline at end of file +export default connect(mapStateToProps)(CustomChainForm); \ No newline at end of file diff --git a/src/containers/CustomChains/CustomChainForm/CustomChainForm.styles.js b/src/containers/CustomChains/CustomChainForm/CustomChainForm.styles.js new file mode 100644 index 00000000..050c280f --- /dev/null +++ b/src/containers/CustomChains/CustomChainForm/CustomChainForm.styles.js @@ -0,0 +1,126 @@ +import { StyleSheet } from "react-native" +import Colors from '../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + mainLabel: { + backgroundColor: "transparent", + fontSize: 22, + color: 'black', + textAlign: "center", + marginTop: 25 + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + color: Colors.quinaryColor, + fontFamily: 'Avenir-Book', + fontWeight: 'normal' + }, + keyGenLabel: { + textAlign:"left", + marginRight: "auto", + color: "#2E86AB" + }, + scanLabel: { + textAlign:"left", + marginRight: "auto", + color: "#009B72" + }, + formInput: { + width: "100%", + fontFamily: 'Avenir', + color: Colors.quaternaryColor + }, + valueContainer: { + width: "85%", + }, + switchContainer: { + alignItems: "flex-start", + marginLeft: 18 + }, + wifLabel: { + backgroundColor: "transparent", + marginTop: 50, + marginBottom: 8, + paddingBottom: 0, + fontSize: 22, + color: "#E9F1F7", + width: "85%", + textAlign: "center" + }, + wifInput: { + width: "100%", + color: "#009B72" + }, + buttonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-between", + }, + singleButtonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "center", + }, + addCoinButton: { + height: 46, + backgroundColor: Colors.successButtonColor, + marginTop: 15, + marginBottom: 40, + width: '100%' + }, + cancelButton: { + height: 46, + backgroundColor: "rgba(206,68,70,1)", + marginTop: 15, + }, + infoLink: { + color: "#2E86AB" + }, + addServerBtn: { + textAlign:"left", + marginRight: "auto", + color: "#2E86AB" + }, + serverItemContainer: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + alignSelf: "center", + width: "100%" + }, + serversContainer: { + justifyContent: "center", + width: "100%", + }, + serverInput: { + width: "100%", + }, + serverInputContainer: { + marginHorizontal: 0, + flex: 1, + }, + labelContainer: { + width: "80%", + flexDirection: "row", + justifyContent: "space-between" + }, + infoBtn: { + marginRight: "auto", + color: "#2E86AB", + borderRadius: 10, + backgroundColor: "#E9F1F7", + paddingLeft: 5, + paddingRight: 5, + overflow: "hidden" + }, + removeServerBtn: { + marginRight: 15 + } +}); \ No newline at end of file diff --git a/src/containers/CustomChainMenus.js b/src/containers/CustomChains/CustomChainMenus.js similarity index 87% rename from src/containers/CustomChainMenus.js rename to src/containers/CustomChains/CustomChainMenus.js index 1c21af2a..07249df8 100644 --- a/src/containers/CustomChainMenus.js +++ b/src/containers/CustomChains/CustomChainMenus.js @@ -11,9 +11,10 @@ import { connect } from 'react-redux'; import BottomNavigation, { FullTab } from 'react-native-material-bottom-navigation' -import CustomChainForm from './CustomChainForm' -import CustomChainScan from './CustomChainScan' +import CustomChainForm from './CustomChainForm/CustomChainForm' +import CustomChainScan from './CustomChainScan/CustomChainScan' import { Icon } from "react-native-elements" +import Colors from '../../globals/colors'; class CustomChainMenus extends Component { constructor(props) { @@ -39,7 +40,7 @@ class CustomChainMenus extends Component { key: "custom-coin-qr", icon: "photo-camera", label: "Scan QR", - barColor: '#009B72', + barColor: Colors.primaryColor, pressColor: 'rgba(255, 255, 255, 0.16)', screen: "CustomChainScan" }, @@ -47,7 +48,7 @@ class CustomChainMenus extends Component { key: "custom-coin-form", icon: "format-list-numbered", label: "Coin Form", - barColor: '#EDAE49', + barColor: Colors.infoButtonColor, pressColor: 'rgba(255, 255, 255, 0.16)', screen: "CustomChainForm" }, @@ -80,7 +81,9 @@ class CustomChainMenus extends Component { isActive={isActive} key={tab.key ? tab.key : ''} label={tab.label ? tab.label : ''} + labelStyle={{fontFamily: 'Avenir-Black',paddingLeft: 5}} renderIcon={this.renderIcon(tab.icon)} + style={{flexDirection: 'row', alignSelf: 'center', justifyContent: 'center'}} /> ) diff --git a/src/containers/CustomChainScan.js b/src/containers/CustomChains/CustomChainScan/CustomChainScan.js similarity index 92% rename from src/containers/CustomChainScan.js rename to src/containers/CustomChains/CustomChainScan/CustomChainScan.js index 06e100ad..5af5a7d3 100644 --- a/src/containers/CustomChainScan.js +++ b/src/containers/CustomChains/CustomChainScan/CustomChainScan.js @@ -15,15 +15,16 @@ import { Modal } from "react-native"; import QRCodeScanner from 'react-native-qrcode-scanner'; -import { isJson } from '../utils/objectManip' +import { isJson } from '../../../utils/objectManip' import { NavigationActions } from 'react-navigation'; import { connect } from 'react-redux'; -import { namesList } from '../utils/CoinData' +import { namesList } from '../../../utils/CoinData' import { FORMAT_UNKNOWN, INCOMPLETE_CHAIN_QR -} from '../utils/constants' -import CustomChainForm from './CustomChainForm' +} from '../../../utils/constants' +import CustomChainForm from '../CustomChainForm/CustomChainForm' +import styles from './CustomChainScan.styles' class CustomChainScan extends Component { constructor(props) { @@ -174,16 +175,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(CustomChainScan); - - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - QRCamera: { - height: "100%" - } -}); \ No newline at end of file +export default connect(mapStateToProps)(CustomChainScan); \ No newline at end of file diff --git a/src/containers/CustomChains/CustomChainScan/CustomChainScan.styles.js b/src/containers/CustomChains/CustomChainScan/CustomChainScan.styles.js new file mode 100644 index 00000000..9aa4d3db --- /dev/null +++ b/src/containers/CustomChains/CustomChainScan/CustomChainScan.styles.js @@ -0,0 +1,12 @@ +import { StyleSheet } from "react-native" + +export default styles = StyleSheet.create({ + root: { + backgroundColor: "#232323", + flex: 1, + alignItems: "center" + }, + QRCamera: { + height: "100%" + } +}); \ No newline at end of file diff --git a/src/containers/Home.js b/src/containers/Home/Home.js similarity index 77% rename from src/containers/Home.js rename to src/containers/Home/Home.js index 4a0e8c67..2ec070a9 100644 --- a/src/containers/Home.js +++ b/src/containers/Home/Home.js @@ -12,7 +12,6 @@ import React, { Component } from "react"; import { ListItem } from "react-native-elements"; import { View, - StyleSheet, Text, FlatList, TouchableOpacity, @@ -25,11 +24,15 @@ import { setActiveCoin, setActiveApp, setActiveSection, - everythingNeedsUpdate -} from '../actions/actionCreators'; + everythingNeedsUpdate, + setActiveSectionBuySellCrypto +} from '../../actions/actionCreators'; import { connect } from 'react-redux'; -import { satsToCoins, truncateDecimal } from '../utils/math'; +import { satsToCoins, truncateDecimal } from '../../utils/math'; import { NavigationActions } from 'react-navigation'; +import styles from './Home.styles' +import Colors from "../../globals/colors"; +import { ENABLE_WYRE } from "../../utils/constants"; const CONNECTION_ERROR = "Connection Error" @@ -168,6 +171,13 @@ class Home extends Component { navigation.navigate("AddCoin", { refresh: this.refresh }); } + _buySellCrypto = () => { + let navigation = this.props.navigation + this.props.dispatch(setActiveSectionBuySellCrypto('buy-crypto')) + + navigation.navigate("BuySellCryptoMenus", {title: "Buy"}); + } + renderCoinList = () => { return ( VerusPay} - rightIcon={{name: 'photo-camera'}} - avatar={require('../images/customIcons/verusPay.png')} + hideChevron + avatar={require('../../images/customIcons/verusPay.png')} containerStyle={{ borderBottomWidth: 0 }} /> @@ -205,29 +215,52 @@ class Home extends Component { null } avatar={item.logo} - subtitleStyle={this.props.balances.hasOwnProperty(item.id) && (this.props.balances[item.id].error || isNaN(this.props.balances[item.id].result.confirmed)) ? {color: "rgba(206,68,70,1)"} : null} + subtitleStyle={this.props.balances.hasOwnProperty(item.id) && (this.props.balances[item.id].error || isNaN(this.props.balances[item.id].result.confirmed)) ? {color: "rgba(206,68,70,1)", fontFamily: 'Avenir-Book'} : null} containerStyle={{ borderBottomWidth: 0 }} + rightTitleStyle={{color: 'black'}} rightTitle={ - ('$' + - (!this.props.balances.hasOwnProperty(item.id) || this.props.balances[item.id].error || isNaN(this.props.balances[item.id].result.confirmed) ? - '0.00' - : - truncateDecimal(((typeof(this.props.rates[item.id]) === 'number' ? this.props.rates[item.id] : 0)*(this.props.balances.hasOwnProperty(item.id) ? - satsToCoins(this.props.balances[item.id].result.confirmed) : - 0)), 2))) - } + ('$' + + (!this.props.balances.hasOwnProperty(item.id) || this.props.balances[item.id].error || isNaN(this.props.balances[item.id].result.confirmed) ? + '0.00' + : + truncateDecimal(((typeof(this.props.rates[item.id]) === 'number' ? this.props.rates[item.id] : 0)*(this.props.balances.hasOwnProperty(item.id) ? + satsToCoins(this.props.balances[item.id].result.confirmed) : + 0)), 2))) + } /> )} extraData={this.props.balances} keyExtractor={item => item.id} /> + + + { + ENABLE_WYRE && + + Buy/Sell Crypto} + avatar={require('../../images/customIcons/buySell.png')} + containerStyle={{ borderBottomWidth: 0 }} + hideChevron + /> + + } Add Coin} - avatar={require('../images/customIcons/addCoin.png')} - containerStyle={{ borderBottomWidth: 0 }} + avatar={require('../../images/customIcons/coinAdd.png')} + containerStyle={{ borderBottomWidth: 0 }} + hideChevron /> @@ -237,7 +270,7 @@ class Home extends Component { render() { return ( - + {'$' + truncateDecimal(this.state.totalFiatBalance, 2)} Portfolio @@ -258,44 +291,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(Home); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - - fiatBalanceLabel: { - backgroundColor: "transparent", - opacity: 0.89, - marginTop: 15, - marginBottom: 15, - paddingBottom: 0, - paddingTop: 0, - fontSize: 25, - textAlign: "center", - color: "#E9F1F7", - width: 359, - }, - coinItemLabel: { - color: "#E9F1F7", - marginLeft: 10, - }, - balanceSheetLabel: { - width: "100%", - backgroundColor: "#E9F1F7", - opacity: 0.86, - marginTop: 0, - marginBottom: 0, - paddingBottom: 15, - paddingTop: 15, - fontSize: 22, - textAlign: "center", - color: "#232323" - }, - coinList: { - width: "100%", - }, -}); +export default connect(mapStateToProps)(Home); \ No newline at end of file diff --git a/src/containers/Home/Home.styles.js b/src/containers/Home/Home.styles.js new file mode 100644 index 00000000..9b688a3f --- /dev/null +++ b/src/containers/Home/Home.styles.js @@ -0,0 +1,45 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center", + }, + + fiatBalanceLabel: { + backgroundColor: Colors.tertiaryColor, + paddingTop: 40, + fontSize: 60, + textAlign: "center", + color: Colors.quaternaryColor, + width: '100%', + fontFamily:'Avenir-Book', + height: '25%', + fontWeight: 'bold' + }, + coinItemLabel: { + color: Colors.quinaryColor, + marginLeft: 10, + fontFamily:'Avenir-Black', + fontSize: 18, + }, + balanceSheetLabel: { + width: "100%", + backgroundColor: Colors.secondaryColor, + opacity: 0.86, + marginTop: 0, + marginBottom: 0, + paddingBottom: 15, + paddingTop: 15, + fontSize: 25, + textAlign: "left", + color: Colors.quinaryColor, + paddingLeft: 30, + fontFamily:'Avenir-Black', + }, + coinList: { + width: "90%", + }, +}); diff --git a/src/containers/LoadingScreen.js b/src/containers/LoadingScreen/LoadingScreen.js similarity index 65% rename from src/containers/LoadingScreen.js rename to src/containers/LoadingScreen/LoadingScreen.js index 0992cf54..953d0a1d 100644 --- a/src/containers/LoadingScreen.js +++ b/src/containers/LoadingScreen/LoadingScreen.js @@ -10,10 +10,11 @@ import React, { Component } from "react"; import { View, - StyleSheet, Text } from "react-native"; import ProgressBar from 'react-native-progress/Bar'; +import styles from './LoadingScreen.styles'; +import Colors from '../../globals/colors'; export default class LoadingScreen extends Component { constructor(props) { @@ -23,25 +24,9 @@ export default class LoadingScreen extends Component { render() { return ( - + {"Initializing Verus Mobile..."} ); } } -const styles = StyleSheet.create({ - loadingRoot: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center", - justifyContent: "center" - }, - loadingLabel: { - backgroundColor: "transparent", - marginTop: 15, - fontSize: 15, - textAlign: "center", - color: "#E9F1F7", - width: "70%" - }, -}); diff --git a/src/containers/LoadingScreen/LoadingScreen.styles.js b/src/containers/LoadingScreen/LoadingScreen.styles.js new file mode 100644 index 00000000..38c0a41b --- /dev/null +++ b/src/containers/LoadingScreen/LoadingScreen.styles.js @@ -0,0 +1,21 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../globals/colors'; + +export default styles = StyleSheet.create({ + loadingRoot: { + backgroundColor: Colors.tertiaryColor, + flex: 1, + alignItems: "center", + justifyContent: "center" + }, + loadingLabel: { + backgroundColor: "transparent", + marginTop: 15, + fontSize: 18, + textAlign: "center", + color: Colors.quinaryColor, + width: "70%", + fontFamily: 'Avenir-Book', + fontWeight: 'normal' + }, +}); \ No newline at end of file diff --git a/src/containers/Login.js b/src/containers/Login/Login.js similarity index 71% rename from src/containers/Login.js rename to src/containers/Login/Login.js index 8cc1b7d8..0d28256e 100644 --- a/src/containers/Login.js +++ b/src/containers/Login/Login.js @@ -9,14 +9,14 @@ import React, { Component } from "react"; import { Icon, FormLabel, FormInput, FormValidationMessage } from "react-native-elements"; -import Button1 from "../symbols/button1"; +import Button1 from "../../symbols/button1"; import { - View, - StyleSheet, + View, Text, Keyboard, TouchableWithoutFeedback, ActivityIndicator, + Image, } from "react-native"; import { connect } from 'react-redux'; import { @@ -25,8 +25,11 @@ import { everythingNeedsUpdate, fetchActiveCoins, setUpdateIntervalID - } from '../actions/actionCreators'; + } from '../../actions/actionCreators'; import { Dropdown } from 'react-native-material-dropdown'; +import { Verus } from '../../images/customIcons/index'; +import styles from './Login.styles'; +import Colors from '../../globals/colors'; const UPDATE_INTERVAL = 60000 @@ -138,13 +141,16 @@ class Login extends Component { return ( - - Wallet Login + Log in to Wallet { this.setState({selectedAccount: value}) - //this.passwordInput.focus(); + // this.passwordInput.focus(); }} - textColor="#E9F1F7" - selectedItemColor="#232323" - baseColor="#E9F1F7" + textColor={Colors.quinaryColor} + selectedItemColor={Colors.quinaryColor} + baseColor={Colors.quinaryColor} label="Select Account..." + labelTextStyle={{fontFamily: 'Avenir-Book'}} + pickerStyle={{backgroundColor: Colors.tertiaryColor}} + itemTextStyle={{fontFamily: 'Avenir-Book'}} /> @@ -177,19 +186,25 @@ class Login extends Component { - - Enter password: - - this.setState({password: text})} - autoCapitalize={"none"} - autoCorrect={false} - secureTextEntry={true} - shake={this.state.errors.password} - inputStyle={styles.formInput} - ref={(input) => { this.passwordInput = input; }} - /> + + + this.setState({password: text})} + autoCapitalize={"none"} + autoCorrect={false} + secureTextEntry={true} + shake={this.state.errors.password} + inputStyle={styles.formInput} + ref={(input) => { this.passwordInput = input; }} + containerStyle={styles.passwordInputContainer} + clearTextOnFocus + /> + { this.state.errors.password ? @@ -212,17 +227,16 @@ class Login extends Component { : - + - + + Don’t have an account? + Add user + } @@ -239,70 +253,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(Login); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - flexDirection: "column", - justifyContent: "center", - alignItems: "center" - }, - loginLabel: { - backgroundColor: "transparent", - fontSize: 22, - color: "#E9F1F7", - width: "85%", - textAlign: "center" - }, - formLabel: { - textAlign:"left", - marginRight: "auto", - }, - valueContainer: { - width: "85%", - }, - dropDownContainer: { - width: "85%", - alignItems: "center" - }, - formInput: { - width: "100%", - }, - dropDown: { - width: "90%", - marginBottom: 0, - marginTop: 0, - }, - unlockButton: { - height: 45, - width: 130, - marginBottom: 0, - marginTop: 35, - backgroundColor: "#009B72", - }, - addUserButton: { - height: 45, - width: 130, - marginBottom: 100, - marginTop: 10, - backgroundColor: "#2E86AB", - }, - loadingContainer: { - width: 400, - backgroundColor: "transparent", - justifyContent: "center", - paddingBottom: 0, - paddingTop: 0, - marginBottom: 8, - marginTop: 28 - }, - loadingText: { - backgroundColor: "transparent", - opacity: 0.86, - fontSize: 22, - textAlign: "center", - color: "#E9F1F7" - }, -}); +export default connect(mapStateToProps)(Login); \ No newline at end of file diff --git a/src/containers/Login/Login.styles.js b/src/containers/Login/Login.styles.js new file mode 100644 index 00000000..4a7d6c4a --- /dev/null +++ b/src/containers/Login/Login.styles.js @@ -0,0 +1,97 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../globals/colors'; +import { bold } from "ansi-colors"; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + flexDirection: "column", + justifyContent: "center", + alignItems: "center" + }, + loginLabel: { + backgroundColor: "transparent", + fontSize: 22, + color: Colors.quaternaryColor, + width: "85%", + textAlign: "center", + fontFamily: 'Avenir-Medium', + }, + formLabel: { + textAlign: "left", + marginRight: "auto", + color: Colors.quinaryColor, + fontWeight: "200", + }, + valueContainer: { + width: "85%", + }, + dropDownContainer: { + marginTop: "5%", + width: "85%", + alignItems: "center", + }, + formInput: { + width: "100%", + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Book', + }, + dropDown: { + width: "90%", + marginBottom: 0, + marginTop: 0, + }, + unlockButton: { + height: 45, + width: '78%', + alignSelf: 'center', + marginTop: '2%', + marginBottom: 0, + fontSize: 16, + fontFamily: 'Avenir-Black', + fontWeight: '600', + backgroundColor: Colors.linkButtonColor, + }, + loadingContainer: { + width: 400, + backgroundColor: "transparent", + justifyContent: "center", + paddingBottom: 0, + paddingTop: 0, + marginBottom: 8, + marginTop: 28 + }, + loadingText: { + backgroundColor: "transparent", + fontSize: 22, + textAlign: "center", + color: Colors.quinaryColor, + fontFamily: 'Avenir-Book' + }, + buttonContainer: { + width: '100%', + alignSelf: 'center' + }, + signUpTextContainer: { + flexDirection: 'row', + marginVertical: '8%', + alignSelf: 'center', + }, + signUpText: { + color: Colors.linkButtonColor, + fontFamily: 'Avenir-Black', + }, + signUpTextQuestion: { + fontFamily: 'Avenir-Black', + color: Colors.quaternaryColor + }, + passwordContainer: { + width: '90%', + flexDirection: 'row', + alignSelf: 'center' + }, + passwordInputContainer: { + width: '82%', + }, +}); \ No newline at end of file diff --git a/src/containers/SecureLoading.js b/src/containers/SecureLoading/SecureLoading.js similarity index 81% rename from src/containers/SecureLoading.js rename to src/containers/SecureLoading/SecureLoading.js index 3b682478..7a6167a7 100644 --- a/src/containers/SecureLoading.js +++ b/src/containers/SecureLoading/SecureLoading.js @@ -16,15 +16,15 @@ import React, { Component } from "react"; import { View, - StyleSheet, Text, ActivityIndicator, Alert } from "react-native"; import { NavigationActions } from 'react-navigation'; import { connect } from 'react-redux'; -import { signOut } from '../actions/actionCreators'; +import { signOut } from '../../actions/actionCreators'; import { Icon } from "react-native-elements"; +import styles from './SecureLoading.styles' const DEFAULT_TIMEOUT = 30000 const DEFAULT_MESSAGE = "Loading..." @@ -146,58 +146,4 @@ class SecureLoading extends Component { } } -export default connect()(SecureLoading); - -const styles = StyleSheet.create({ - loadingRoot: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center", - justifyContent: "center" - }, - loadingLabel: { - backgroundColor: "transparent", - marginTop: 15, - fontSize: 15, - textAlign: "center", - color: "#E9F1F7", - width: "70%" - }, - root: { - backgroundColor: "#232323", - flex: 1, - }, - infoBox: { - flex: 1, - flexDirection: 'column', - alignSelf: 'center', - justifyContent: 'flex-start', - width: "85%", - }, - infoRow: { - flex: 1, - flexDirection: 'row', - justifyContent: 'space-between', - alignSelf: 'stretch', - marginTop: 10 - }, - infoText: { - fontSize: 16, - color: "#E9F1F7" - }, - linkBox: { - width: "65%", - }, - linkText: { - fontSize: 16, - color: "#2E86AB", - textAlign: "right" - }, - verifiedLabel: { - marginTop: 10, - marginBottom: 15, - fontSize: 22, - textAlign: "center", - color: "#E9F1F7" - }, -}); \ No newline at end of file +export default connect()(SecureLoading); \ No newline at end of file diff --git a/src/containers/SecureLoading/SecureLoading.styles.js b/src/containers/SecureLoading/SecureLoading.styles.js new file mode 100644 index 00000000..5b8e8f50 --- /dev/null +++ b/src/containers/SecureLoading/SecureLoading.styles.js @@ -0,0 +1,56 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../globals/colors' + +export default styles = StyleSheet.create({ + loadingRoot: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center", + justifyContent: "center" + }, + loadingLabel: { + backgroundColor: "transparent", + marginTop: 15, + fontSize: 15, + textAlign: "center", + color: Colors.quaternaryColor, + width: "70%" + }, + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + infoBox: { + flex: 1, + flexDirection: 'column', + alignSelf: 'center', + justifyContent: 'flex-start', + width: "85%", + }, + infoRow: { + flex: 1, + flexDirection: 'row', + justifyContent: 'space-between', + alignSelf: 'stretch', + marginTop: 10 + }, + infoText: { + fontSize: 16, + color: Colors.quaternaryColor + }, + linkBox: { + width: "65%", + }, + linkText: { + fontSize: 16, + color: "#2E86AB", + textAlign: "right" + }, + verifiedLabel: { + marginTop: 10, + marginBottom: 15, + fontSize: 22, + textAlign: "center", + color: Colors.quaternaryColor + }, +}); \ No newline at end of file diff --git a/src/containers/AppInfo.js b/src/containers/Settings/AppInfo/AppInfo.js similarity index 77% rename from src/containers/AppInfo.js rename to src/containers/Settings/AppInfo/AppInfo.js index f2c5c20a..41818c0b 100644 --- a/src/containers/AppInfo.js +++ b/src/containers/Settings/AppInfo/AppInfo.js @@ -8,7 +8,6 @@ import React, { Component } from "react"; import { View, - StyleSheet, Text, ScrollView, Platform, @@ -16,13 +15,14 @@ import { Image, Linking } from "react-native"; +import styles from './AppInfo.styles' const DISCORD_URL = "https://discord.gg/VRKMP2S" const REDDIT_URL = "https://www.reddit.com/r/VerusCoin/" const TWITTER_URL = "https://twitter.com/VerusCoin" const PRIVACY_URL = "https://github.com/VerusCoin/Verus-Mobile/blob/master/PRIVACY.txt" const LICENCE_URL = "https://github.com/VerusCoin/Verus-Mobile/blob/master/LICENCE" -const LOGO_DIR = require('../images/customIcons/verusHeaderLogo.png'); +const LOGO_DIR = require('../../../images/customIcons/Verus.png'); class AppInfo extends Component { @@ -39,11 +39,13 @@ class AppInfo extends Component { render() { return( - - Verus Mobile + + + Verus Mobile + App Version: @@ -98,44 +100,4 @@ class AppInfo extends Component { } } -export default AppInfo; - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - }, - infoBox: { - flex: 1, - flexDirection: 'column', - alignSelf: 'center', - justifyContent: 'flex-start', - width: "85%", - }, - infoRow: { - flex: 1, - flexDirection: 'row', - justifyContent: 'space-between', - alignSelf: 'stretch', - marginTop: 10 - }, - infoText: { - fontSize: 16, - color: "#E9F1F7" - }, - linkBox: { - width: "65%", - }, - linkText: { - fontSize: 16, - color: "#2E86AB", - textAlign: "right" - }, - verifiedLabel: { - marginTop: 10, - marginBottom: 15, - fontSize: 22, - textAlign: "center", - color: "#E9F1F7" - }, -}); \ No newline at end of file +export default AppInfo; \ No newline at end of file diff --git a/src/containers/Settings/AppInfo/AppInfo.styles.js b/src/containers/Settings/AppInfo/AppInfo.styles.js new file mode 100644 index 00000000..8a70b4cc --- /dev/null +++ b/src/containers/Settings/AppInfo/AppInfo.styles.js @@ -0,0 +1,55 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: "white", + flex: 1, + }, + infoBox: { + flex: 1, + flexDirection: 'column', + alignSelf: 'center', + justifyContent: 'flex-start', + width: "85%", + }, + infoRow: { + flex: 1, + flexDirection: 'row', + justifyContent: 'space-between', + alignSelf: 'stretch', + marginTop: 10 + }, + infoText: { + fontSize: 16, + color: Colors.quinaryColor, + fontFamily: 'Avenir-Book' + }, + linkBox: { + width: "65%", + }, + linkText: { + fontSize: 16, + color: "#2E86AB", + textAlign: "right", + fontFamily: 'Avenir-Book' + }, + verifiedLabel: { + marginTop: 10, + marginBottom: 15, + fontSize: 22, + textAlign: "center", + color: Colors.quinaryColor + }, + imageStyle: { + width: '30%', + marginTop: '10%', + resizeMode: 'contain', + alignSelf: 'center' + }, + imageStyleContainer:{ + width: '100%', + backgroundColor: Colors.tertiaryColor, + marginBottom: '10%' + } +}); \ No newline at end of file diff --git a/src/containers/Settings/CoinSettings/CoinSettings.js b/src/containers/Settings/CoinSettings/CoinSettings.js new file mode 100644 index 00000000..423cb277 --- /dev/null +++ b/src/containers/Settings/CoinSettings/CoinSettings.js @@ -0,0 +1,183 @@ +/* + This component allows you to modify coin-specific wallet settings + for each coin. This includes things like level of UTXO verification, + which would be locked to max for coins with custom electrum servers. +*/ + +import React, { Component } from "react"; +import Button1 from "../../../symbols/button1"; +import { + View, + ScrollView, + Keyboard, + TouchableWithoutFeedback, + ActivityIndicator, + Alert +} from "react-native"; +import { NavigationActions } from 'react-navigation'; +import { FormLabel, ButtonGroup } from 'react-native-elements' +import { saveCoinSettings } from '../../../actions/actionCreators'; +import { connect } from 'react-redux'; +import { + NO_VERIFICATION, + MID_VERIFICATION, + MAX_VERIFICATION, + NO_VERIFICATION_DESC, + MID_VERIFICATION_DESC, + MAX_VERIFICATION_DESC, + VERIFICATION_LOCKED +} from '../../../utils/constants' +import styles from './CoinSettings.styles' +import Colors from '../../../globals/colors'; + +class CoinSettings extends Component { + constructor(props) { + super(props); + this.coinID = this.props.navigation.state.params.data + this.verificationLock = this.props.coinSettings[this.coinID].verificationLock + + if (this.props.coinSettings.hasOwnProperty(this.coinID)) { + this.state = { + ...this.props.coinSettings[this.coinID], + errors: { verificationLvl: false }, + loading: false + } + } else { + this.state = { + verificationLvl: MAX_VERIFICATION, + errors: { verificationLvl: false }, + loading: false + }; + } + + this.updateIndex = this.updateIndex.bind(this) + } + + _handleSubmit = () => { + Keyboard.dismiss(); + this.validateFormData() + } + + static navigationOptions = ({ navigation }) => { + return { + title: typeof(navigation.state.params)==='undefined' || + typeof(navigation.state.params.title) === 'undefined' ? + 'undefined': `${navigation.state.params.title} Settings`, + }; + }; + + updateIndex(verificationLvl) { + this.setState({verificationLvl: verificationLvl}) + } + + saveSettings = () => { + this.setState({ loading: true }, () => { + const stateToSave = { + verificationLvl: this.state.verificationLvl, + } + saveCoinSettings(stateToSave, this.coinID) + .then(res => { + this.props.dispatch(res) + this.setState({ ...this.props.coinSettings[this.coinID], loading: false }) + Alert.alert("Success", `${this.coinID} settings saved`) + }) + .catch(err => { + Alert.alert("Error", err.message) + console.warn(err.message) + this.setState({ loading: false }) + }) + }) + } + + handleError = (error, field) => { + let _errors = this.state.errors + _errors[field] = error + + this.setState({errors: _errors}) + } + + back = () => { + this.props.navigation.dispatch(NavigationActions.back()) + } + + //TODO: Add more to this when more options are added + validateFormData = () => { + this.setState({ + errors: {verificationLvl: null} + }, () => { + let _errors = false + + if (!_errors) { + this.saveSettings() + } + }); + } + + render() { + const utxoVerificationBtns = ['Low', 'Mid', 'High'] + + return ( + + + + + + {"Level of UTXO verification:"} + + + + { this.verificationLock ? + VERIFICATION_LOCKED + : + this.state.verificationLvl === NO_VERIFICATION ? + NO_VERIFICATION_DESC + : + this.state.verificationLvl === MID_VERIFICATION ? + MID_VERIFICATION_DESC + : + MAX_VERIFICATION_DESC} + + + + + {this.state.loading ? + + : + + + + + } + + + + ); + } +} + +const mapStateToProps = (state) => { + return { + coinSettings: state.settings.coinSettings, + } +}; + +export default connect(mapStateToProps)(CoinSettings); + diff --git a/src/containers/Settings/CoinSettings/CoinSettings.styles.js b/src/containers/Settings/CoinSettings/CoinSettings.styles.js new file mode 100644 index 00000000..8623be80 --- /dev/null +++ b/src/containers/Settings/CoinSettings/CoinSettings.styles.js @@ -0,0 +1,82 @@ +import { StyleSheet } from "react-native" +import Colors from '../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + fontFamily: 'Avenir-Black', + color: Colors.quaternaryColor, + fontSize: 20, + marginBottom: 20 + }, + keyGenLabel: { + textAlign:"left", + marginRight: "auto", + color: "#2E86AB" + }, + formInput: { + width: "100%", + }, + valueContainer: { + width: "85%", + }, + mainHeader: { + backgroundColor: "transparent", + marginTop: 30, + fontSize: 22, + color: "#E9F1F7", + width: "85%", + textAlign: "center" + }, + wifInput: { + width: "100%", + color: "#009B72" + }, + buttonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-between", + }, + singleButtonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "center", + }, + saveChangesButton: { + height: 46, + backgroundColor: Colors.successButtonColor, + marginTop: 15, + width: '60%', + }, + clearCacheButton: { + height: 46, + backgroundColor: "#2E86AB", + marginTop: 25, + marginBottom: 25 + }, + backButton: { + height: 46, + backgroundColor: Colors.basicButtonColor, + marginTop: 15, + width: '35%' + }, + utxoVerificationDesc: { + textAlign:"left", + marginRight: "auto", + fontFamily: 'Avenir-Book', + fontWeight: 'normal', + }, + bottom: { + flex: 1, + justifyContent: 'flex-end', + alignItems: 'center', + marginBottom: 36 + } +}); \ No newline at end of file diff --git a/src/containers/DeleteProfile.js b/src/containers/Settings/ProfileSettings/DeleteProfile/DeleteProfile.js similarity index 79% rename from src/containers/DeleteProfile.js rename to src/containers/Settings/ProfileSettings/DeleteProfile/DeleteProfile.js index e0886c9e..55cd1948 100644 --- a/src/containers/DeleteProfile.js +++ b/src/containers/Settings/ProfileSettings/DeleteProfile/DeleteProfile.js @@ -8,10 +8,9 @@ */ import React, { Component } from "react"; -import Button1 from "../symbols/button1"; +import Button1 from "../../../../symbols/button1"; import { View, - StyleSheet, Text, Alert, ScrollView, @@ -21,10 +20,12 @@ import { } from "react-native"; import { NavigationActions } from 'react-navigation'; import { FormLabel, FormInput, FormValidationMessage } from 'react-native-elements' -import { deleteUserByID } from '../actions/actionCreators'; +import { deleteUserByID } from '../../../../actions/actionCreators'; import { connect } from 'react-redux'; import AlertAsync from "react-native-alert-async"; -import { checkPinForUser } from '../utils/asyncStore/asyncStore' +import { checkPinForUser } from '../../../../utils/asyncStore/asyncStore' +import Colors from '../../../../globals/colors'; +import styles from './DeleteProfile.styles' class DeleteProfile extends Component { constructor() { @@ -142,7 +143,7 @@ class DeleteProfile extends Component { Enter your password: this.setState({pwd: text})} autoCapitalize={"none"} autoCorrect={false} @@ -176,7 +177,7 @@ class DeleteProfile extends Component { render() { return ( - + {"Delete Profile"} @@ -204,12 +205,12 @@ class DeleteProfile extends Component { @@ -225,65 +226,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(DeleteProfile); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - }, - formLabel: { - textAlign:"left", - marginRight: "auto", - }, - keyGenLabel: { - textAlign:"left", - marginRight: "auto", - color: "#2E86AB" - }, - formInput: { - width: "100%", - }, - valueContainer: { - width: "85%", - }, - switchContainer: { - alignItems: "flex-start", - marginLeft: 18 - }, - wifLabel: { - backgroundColor: "transparent", - marginTop: 50, - fontSize: 22, - color: "#E9F1F7", - width: "85%", - textAlign: "center" - }, - wifInput: { - width: "100%", - color: "#009B72" - }, - buttonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-between", - }, - singleButtonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "center", - }, - addAccountButton: { - height: 46, - backgroundColor: "#2E86AB", - marginTop: 15, - marginBottom: 40 - }, - cancelButton: { - height: 46, - backgroundColor: "rgba(206,68,70,1)", - marginTop: 15, - }, -}); \ No newline at end of file +export default connect(mapStateToProps)(DeleteProfile); \ No newline at end of file diff --git a/src/containers/Settings/ProfileSettings/DeleteProfile/DeleteProfile.styles.js b/src/containers/Settings/ProfileSettings/DeleteProfile/DeleteProfile.styles.js new file mode 100644 index 00000000..a5a5904a --- /dev/null +++ b/src/containers/Settings/ProfileSettings/DeleteProfile/DeleteProfile.styles.js @@ -0,0 +1,70 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Book' + }, + keyGenLabel: { + textAlign:"left", + marginRight: "auto", + color: "#2E86AB" + }, + formInput: { + width: "100%", + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Book' + }, + valueContainer: { + width: "85%", + }, + switchContainer: { + alignItems: "flex-start", + marginLeft: 18 + }, + wifLabel: { + backgroundColor: "transparent", + marginBottom: '25%', + fontSize: 22, + color: Colors.quaternaryColor, + width: "85%", + textAlign: "center", + fontFamily: 'Avenir-Black' + }, + wifInput: { + width: "100%", + color: "#009B72" + }, + buttonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-between", + }, + singleButtonContainer: { + width: "90%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "center", + }, + addAccountButton: { + height: 46, + backgroundColor: Colors.warningButtonColor, + marginTop: 15, + marginBottom: 40, + width: '55%' + }, + cancelButton: { + height: 46, + backgroundColor: Colors.basicButtonColor, + marginTop: 15, + width: '40%' + }, +}); \ No newline at end of file diff --git a/src/containers/DisplaySeed.js b/src/containers/Settings/ProfileSettings/DisplaySeed/DisplaySeed.js similarity index 68% rename from src/containers/DisplaySeed.js rename to src/containers/Settings/ProfileSettings/DisplaySeed/DisplaySeed.js index de028eba..5398e96f 100644 --- a/src/containers/DisplaySeed.js +++ b/src/containers/Settings/ProfileSettings/DisplaySeed/DisplaySeed.js @@ -5,10 +5,9 @@ */ import React, { Component } from "react"; -import Button1 from "../symbols/button1"; +import Button1 from "../../../../symbols/button1"; import { View, - StyleSheet, Text, ScrollView, } from "react-native"; @@ -16,6 +15,7 @@ import { NavigationActions } from 'react-navigation'; import { FormInput } from 'react-native-elements' import { connect } from 'react-redux'; import QRCode from 'react-native-qrcode-svg'; +import styles from './DisplaySeed.styles'; class ResetPwd extends Component { constructor() { @@ -62,7 +62,7 @@ class ResetPwd extends Component { render() { return ( - + Unencrypted Wallet Seed: @@ -85,12 +85,12 @@ class ResetPwd extends Component { @@ -105,53 +105,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(ResetPwd); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - }, - formLabel: { - textAlign:"left", - marginRight: "auto", - }, - formInput: { - width: "100%", - }, - valueContainer: { - width: "85%", - }, - wifLabel: { - backgroundColor: "transparent", - marginTop: 20, - marginBottom: 8, - paddingBottom: 0, - fontSize: 22, - color: "#E9F1F7", - width: "85%", - textAlign: "center" - }, - wifInput: { - width: "100%", - color: "#009B72", - textAlign: "center" - }, - buttonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-between", - }, - addAccountButton: { - height: 46, - backgroundColor: "#2E86AB", - marginTop: 15, - marginBottom: 40 - }, - cancelButton: { - height: 46, - backgroundColor: "rgba(206,68,70,1)", - marginTop: 15, - }, -}); \ No newline at end of file +export default connect(mapStateToProps)(ResetPwd); \ No newline at end of file diff --git a/src/containers/Settings/ProfileSettings/DisplaySeed/DisplaySeed.styles.js b/src/containers/Settings/ProfileSettings/DisplaySeed/DisplaySeed.styles.js new file mode 100644 index 00000000..2e75e1ef --- /dev/null +++ b/src/containers/Settings/ProfileSettings/DisplaySeed/DisplaySeed.styles.js @@ -0,0 +1,56 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + fontFamily: 'Avenir-Book' + }, + formInput: { + width: "100%", + fontFamily: 'Avenir-Book' + }, + valueContainer: { + width: "85%", + }, + wifLabel: { + backgroundColor: "transparent", + marginTop: 20, + marginBottom: 8, + paddingBottom: '10%', + fontSize: 22, + color: Colors.quaternaryColor, + width: "85%", + textAlign: "center", + fontFamily: 'Avenir-Black' + }, + wifInput: { + width: "90%", + color: Colors.successButtonColor, + textAlign: "center", + alignSelf: 'center', + fontFamily: 'Avenir-Book' + }, + buttonContainer: { + width: "65%", + backgroundColor: "transparent", + flexDirection: "column", + justifyContent: "space-between", + }, + addAccountButton: { + height: 46, + backgroundColor: Colors.primaryColor, + marginTop: 15, + marginBottom: 40 + }, + cancelButton: { + height: 46, + backgroundColor: Colors.basicButtonColor, + marginTop: 15, + }, +}); \ No newline at end of file diff --git a/src/containers/ProfileInfo.js b/src/containers/Settings/ProfileSettings/ProfileInfo/ProfileInfo.js similarity index 64% rename from src/containers/ProfileInfo.js rename to src/containers/Settings/ProfileSettings/ProfileInfo/ProfileInfo.js index 2f2fb9ec..1d90afdd 100644 --- a/src/containers/ProfileInfo.js +++ b/src/containers/Settings/ProfileSettings/ProfileInfo/ProfileInfo.js @@ -6,11 +6,11 @@ import React, { Component } from "react"; import { View, - StyleSheet, Text, } from "react-native"; import { Icon } from "react-native-elements" import { connect } from 'react-redux'; +import styles from './ProfileInfo.styles' class ProfileInfo extends Component { render() { @@ -42,41 +42,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(ProfileInfo); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - infoBox: { - flex: 1, - flexDirection: 'column', - alignSelf: 'center', - justifyContent: 'flex-start', - width: "85%", - }, - Icon: { - marginTop: 10, - }, - infoRow: { - flex: 1, - flexDirection: 'row', - justifyContent: 'space-between', - alignSelf: 'stretch', - alignItems: 'flex-start', - marginTop: 10, - }, - infoText: { - fontSize: 16, - color: "#E9F1F7", - }, - profileLabel: { - marginTop: 10, - marginBottom: 15, - fontSize: 22, - textAlign: "center", - color: "#E9F1F7", - } -}); \ No newline at end of file +export default connect(mapStateToProps)(ProfileInfo); \ No newline at end of file diff --git a/src/containers/Settings/ProfileSettings/ProfileInfo/ProfileInfo.styles.js b/src/containers/Settings/ProfileSettings/ProfileInfo/ProfileInfo.styles.js new file mode 100644 index 00000000..4b5e12fa --- /dev/null +++ b/src/containers/Settings/ProfileSettings/ProfileInfo/ProfileInfo.styles.js @@ -0,0 +1,38 @@ +import { StyleSheet } from "react-native"; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: "#232323", + flex: 1, + alignItems: "center" + }, + infoBox: { + flex: 1, + flexDirection: 'column', + alignSelf: 'center', + justifyContent: 'flex-start', + width: "85%", + }, + Icon: { + marginTop: 10, + }, + infoRow: { + flex: 1, + flexDirection: 'row', + justifyContent: 'space-between', + alignSelf: 'stretch', + alignItems: 'flex-start', + marginTop: 10, + }, + infoText: { + fontSize: 16, + color: "#E9F1F7", + }, + profileLabel: { + marginTop: 10, + marginBottom: 15, + fontSize: 22, + textAlign: "center", + color: "#E9F1F7", + } +}); \ No newline at end of file diff --git a/src/containers/ProfileSettings.js b/src/containers/Settings/ProfileSettings/ProfileSettings.js similarity index 78% rename from src/containers/ProfileSettings.js rename to src/containers/Settings/ProfileSettings/ProfileSettings.js index 3bb98dd2..8e6d290d 100644 --- a/src/containers/ProfileSettings.js +++ b/src/containers/Settings/ProfileSettings/ProfileSettings.js @@ -10,12 +10,13 @@ import React, { Component } from "react"; import { ListItem } from "react-native-elements"; import { View, - StyleSheet, Text, TouchableOpacity, ScrollView } from "react-native"; import { connect } from 'react-redux'; +import styles from './ProfileSettings.styles'; +import Colors from '../../../globals/colors'; const RESET_PWD = "ResetPwd" const RECOVER_SEED = "RecoverSeed" @@ -54,13 +55,15 @@ class ProfileSettings extends Component { title={Recover Seed} leftIcon={{name: 'lock-open'}} containerStyle={{ borderBottomWidth: 0 }} + chevronColor={Colors.quaternaryColor} /> this._openSettings(RESET_PWD)}> Reset Password} leftIcon={{name: 'autorenew'}} - containerStyle={{ borderBottomWidth: 0 }} + containerStyle={{ borderBottomWidth: 0}} + chevronColor={Colors.quaternaryColor} /> this._openSettings(REMOVE_PROFILE)}> @@ -68,6 +71,7 @@ class ProfileSettings extends Component { title={Delete Profile} leftIcon={{name: 'delete-forever'}} containerStyle={{ borderBottomWidth: 0 }} + chevronColor={Colors.quaternaryColor} /> @@ -95,42 +99,3 @@ const mapStateToProps = (state) => { }; export default connect(mapStateToProps)(ProfileSettings); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - fiatBalanceLabel: { - backgroundColor: "transparent", - opacity: 0.89, - marginTop: 15, - marginBottom: 15, - paddingBottom: 0, - paddingTop: 0, - fontSize: 25, - textAlign: "center", - color: "#E9F1F7", - width: 359, - }, - coinItemLabel: { - color: "#E9F1F7", - marginLeft: 10, - }, - balanceSheetLabel: { - width: "100%", - backgroundColor: "#E9F1F7", - opacity: 0.86, - marginTop: 0, - marginBottom: 0, - paddingBottom: 15, - paddingTop: 15, - fontSize: 22, - textAlign: "center", - color: "#232323" - }, - coinList: { - width: "100%", - }, -}); diff --git a/src/containers/Settings/ProfileSettings/ProfileSettings.styles.js b/src/containers/Settings/ProfileSettings/ProfileSettings.styles.js new file mode 100644 index 00000000..fab4c0d6 --- /dev/null +++ b/src/containers/Settings/ProfileSettings/ProfileSettings.styles.js @@ -0,0 +1,45 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center" + }, + fiatBalanceLabel: { + backgroundColor: "transparent", + opacity: 0.89, + marginTop: 15, + marginBottom: 15, + paddingBottom: 0, + paddingTop: 0, + fontSize: 25, + textAlign: "center", + color: Colors.quinaryColor, + fontFamily: 'Avenir-Book' + }, + coinItemLabel: { + color: Colors.quinaryColor, + marginLeft: 10, + fontSize: 19, + fontFamily: 'Avenir-Book', + marginVertical: 10 + }, + balanceSheetLabel: { + width: "100%", + backgroundColor: Colors.tertiaryColor, + opacity: 0.86, + marginTop: 0, + marginBottom: 0, + paddingBottom: 15, + paddingTop: 15, + fontSize: 22, + textAlign: "center", + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Black' + }, + coinList: { + width: "90%", + }, +}); \ No newline at end of file diff --git a/src/containers/RecoverSeed.js b/src/containers/Settings/ProfileSettings/RecoverSeed/RecoverSeed.js similarity index 80% rename from src/containers/RecoverSeed.js rename to src/containers/Settings/ProfileSettings/RecoverSeed/RecoverSeed.js index d0124742..7965414b 100644 --- a/src/containers/RecoverSeed.js +++ b/src/containers/Settings/ProfileSettings/RecoverSeed/RecoverSeed.js @@ -10,10 +10,9 @@ */ import React, { Component } from "react"; -import Button1 from "../symbols/button1"; +import Button1 from "../../../../symbols/button1"; import { View, - StyleSheet, Text, Alert, ScrollView, @@ -22,9 +21,11 @@ import { } from "react-native"; import { NavigationActions } from 'react-navigation'; import { FormLabel, FormInput, FormValidationMessage } from 'react-native-elements' -import { checkPinForUser } from '../utils/asyncStore/asyncStore' +import { checkPinForUser } from '../../../../utils/asyncStore/asyncStore' import { connect } from 'react-redux'; import AlertAsync from "react-native-alert-async"; +import styles from './RecoverSeed.styles' +import Colors from "../../../../globals/colors"; class RecoverSeed extends Component { constructor() { @@ -127,11 +128,11 @@ class RecoverSeed extends Component { Recover Wallet Seed - + Enter your account password: this.setState({password: text})} value={this.state.password} autoCapitalize={"none"} @@ -152,12 +153,12 @@ class RecoverSeed extends Component { @@ -173,48 +174,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(RecoverSeed); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - }, - formLabel: { - textAlign:"left", - marginRight: "auto", - }, - formInput: { - width: "100%", - }, - valueContainer: { - width: "85%", - }, - wifLabel: { - backgroundColor: "transparent", - marginTop: 50, - marginBottom: 8, - paddingBottom: 0, - fontSize: 22, - color: "#E9F1F7", - width: "85%", - textAlign: "center" - }, - buttonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-between", - }, - addAccountButton: { - height: 46, - backgroundColor: "#2E86AB", - marginTop: 15, - marginBottom: 40 - }, - cancelButton: { - height: 46, - backgroundColor: "rgba(206,68,70,1)", - marginTop: 15, - }, -}); \ No newline at end of file +export default connect(mapStateToProps)(RecoverSeed); \ No newline at end of file diff --git a/src/containers/Settings/ProfileSettings/RecoverSeed/RecoverSeed.styles.js b/src/containers/Settings/ProfileSettings/RecoverSeed/RecoverSeed.styles.js new file mode 100644 index 00000000..427812a1 --- /dev/null +++ b/src/containers/Settings/ProfileSettings/RecoverSeed/RecoverSeed.styles.js @@ -0,0 +1,53 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Book' + }, + formInput: { + width: "100%", + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Book' + }, + valueContainer: { + width: "85%", + }, + wifLabel: { + backgroundColor: "transparent", + marginTop: '20%', + marginBottom: '30%', + paddingBottom: 0, + fontSize: 22, + color: Colors.quinaryColor, + width: "85%", + textAlign: "center", + fontFamily: 'Avenir-Black' + }, + buttonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-between", + }, + addAccountButton: { + height: 46, + backgroundColor: Colors.successButtonColor, + marginTop: 15, + marginBottom: 40, + width: '55%' + }, + cancelButton: { + height: 46, + backgroundColor: Colors.basicButtonColor, + marginTop: 15, + width: '40%' + }, +}); \ No newline at end of file diff --git a/src/containers/ResetPwd.js b/src/containers/Settings/ProfileSettings/ResetPwd/ResetPwd.js similarity index 84% rename from src/containers/ResetPwd.js rename to src/containers/Settings/ProfileSettings/ResetPwd/ResetPwd.js index cd7ed5b5..ec5a90ce 100644 --- a/src/containers/ResetPwd.js +++ b/src/containers/Settings/ProfileSettings/ResetPwd/ResetPwd.js @@ -7,10 +7,9 @@ */ import React, { Component } from "react"; -import Button1 from "../symbols/button1"; +import Button1 from "../../../../symbols/button1"; import { View, - StyleSheet, Text, Alert, ScrollView, @@ -19,9 +18,11 @@ import { } from "react-native"; import { NavigationActions } from 'react-navigation'; import { FormLabel, FormInput, FormValidationMessage } from 'react-native-elements' -import { resetPwd } from '../actions/actionCreators'; +import { resetPwd } from '../../../../actions/actionCreators'; import { connect } from 'react-redux'; import AlertAsync from "react-native-alert-async"; +import styles from './ResetPwd.styles' +import Colors from '../../../../globals/colors'; class ResetPwd extends Component { constructor() { @@ -137,7 +138,7 @@ class ResetPwd extends Component { render() { return ( - + Reset Password @@ -146,7 +147,7 @@ class ResetPwd extends Component { Enter your current password: this.setState({oldPwd: text})} autoCapitalize={"none"} autoCorrect={false} @@ -168,7 +169,7 @@ class ResetPwd extends Component { Enter a new password (min. 5 characters): this.setState({newPwd: text})} autoCapitalize={"none"} autoCorrect={false} @@ -190,7 +191,7 @@ class ResetPwd extends Component { Confirm new password: this.setState({confirmNewPwd: text})} autoCapitalize={"none"} autoCorrect={false} @@ -210,12 +211,12 @@ class ResetPwd extends Component { @@ -232,48 +233,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(ResetPwd); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - }, - formLabel: { - textAlign:"left", - marginRight: "auto", - }, - formInput: { - width: "100%", - }, - valueContainer: { - width: "85%", - }, - wifLabel: { - backgroundColor: "transparent", - marginTop: 50, - marginBottom: 8, - paddingBottom: 0, - fontSize: 22, - color: "#E9F1F7", - width: "85%", - textAlign: "center" - }, - buttonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-between", - }, - addAccountButton: { - height: 46, - backgroundColor: "#2E86AB", - marginTop: 15, - marginBottom: 40 - }, - cancelButton: { - height: 46, - backgroundColor: "rgba(206,68,70,1)", - marginTop: 15, - }, -}); \ No newline at end of file +export default connect(mapStateToProps)(ResetPwd); \ No newline at end of file diff --git a/src/containers/Settings/ProfileSettings/ResetPwd/ResetPwd.styles.js b/src/containers/Settings/ProfileSettings/ResetPwd/ResetPwd.styles.js new file mode 100644 index 00000000..cff67cbd --- /dev/null +++ b/src/containers/Settings/ProfileSettings/ResetPwd/ResetPwd.styles.js @@ -0,0 +1,52 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Book' + }, + formInput: { + width: "100%", + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Book' + }, + valueContainer: { + width: "85%", + }, + wifLabel: { + backgroundColor: "transparent", + marginBottom: '10%', + paddingBottom: 0, + fontSize: 22, + color: Colors.quinaryColor, + width: "85%", + textAlign: "center", + fontFamily: 'Avenir-Black' + }, + buttonContainer: { + width: "80%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-between", + }, + addAccountButton: { + height: 46, + backgroundColor: Colors.infoButtonColor, + marginTop: 15, + marginBottom: 40, + width: '60%' + }, + cancelButton: { + height: 46, + backgroundColor: Colors.basicButtonColor, + marginTop: 15, + width: '35%' + }, +}); \ No newline at end of file diff --git a/src/containers/SettingsMenus.js b/src/containers/Settings/SettingsMenus.js similarity index 86% rename from src/containers/SettingsMenus.js rename to src/containers/Settings/SettingsMenus.js index df6c04ba..7624a6ce 100644 --- a/src/containers/SettingsMenus.js +++ b/src/containers/Settings/SettingsMenus.js @@ -11,10 +11,11 @@ import { connect } from 'react-redux'; import BottomNavigation, { FullTab } from 'react-native-material-bottom-navigation' -import AppInfo from './AppInfo' -import ProfileSettings from './ProfileSettings' -import WalletSettings from './WalletSettings' +import AppInfo from './AppInfo/AppInfo' +import ProfileSettings from './ProfileSettings/ProfileSettings' +import WalletSettings from './WalletSettings/WalletSettings' import { Icon } from "react-native-elements" +import Colors from '../../globals/colors'; class SettingsMenus extends Component { constructor(props) { @@ -40,7 +41,7 @@ class SettingsMenus extends Component { key: "settings-profile", icon: "account-circle", label: "Profile", - barColor: '#009B72', + barColor: Colors.primaryColor, pressColor: 'rgba(255, 255, 255, 0.16)', screen: "ProfileSettings" }, @@ -48,7 +49,7 @@ class SettingsMenus extends Component { key: "settings-wallet", icon: "account-balance-wallet", label: "Wallet", - barColor: '#EDAE49', + barColor: Colors.infoButtonColor, pressColor: 'rgba(255, 255, 255, 0.16)', screen: "WalletSettings" }, @@ -56,7 +57,7 @@ class SettingsMenus extends Component { key: "settings-info", icon: "info", label: "App Info", - barColor: '#2E86AB', + barColor: Colors.successButtonColor, pressColor: 'rgba(255, 255, 255, 0.16)', screen: "AppInfo" }, @@ -89,7 +90,9 @@ class SettingsMenus extends Component { isActive={isActive} key={tab.key ? tab.key : ''} label={tab.label ? tab.label : ''} + labelStyle={{fontFamily: 'Avenir-Black',paddingLeft: 5}} renderIcon={this.renderIcon(tab.icon)} + style={{flexDirection: 'row', alignSelf: 'center', justifyContent: 'center'}} /> ) diff --git a/src/containers/CoinSettings.js b/src/containers/Settings/WalletSettings/CoinSettings/CoinSettings.js similarity index 76% rename from src/containers/CoinSettings.js rename to src/containers/Settings/WalletSettings/CoinSettings/CoinSettings.js index 1848b69a..dd8d9884 100644 --- a/src/containers/CoinSettings.js +++ b/src/containers/Settings/WalletSettings/CoinSettings/CoinSettings.js @@ -5,10 +5,9 @@ */ import React, { Component } from "react"; -import Button1 from "../symbols/button1"; +import Button1 from "../../../../symbols/button1"; import { View, - StyleSheet, Text, ScrollView, Keyboard, @@ -18,7 +17,7 @@ import { } from "react-native"; import { NavigationActions } from 'react-navigation'; import { FormLabel, ButtonGroup } from 'react-native-elements' -import { saveCoinSettings } from '../actions/actionCreators'; +import { saveCoinSettings } from '../../../../actions/actionCreators'; import { connect } from 'react-redux'; import { NO_VERIFICATION, @@ -28,7 +27,9 @@ import { MID_VERIFICATION_DESC, MAX_VERIFICATION_DESC, VERIFICATION_LOCKED -} from '../utils/constants' +} from '../../../../utils/constants' +import styles from './CoinSettings.styles' +import Colors from '../../../../globals/colors'; class CoinSettings extends Component { constructor(props) { @@ -154,12 +155,12 @@ class CoinSettings extends Component { @@ -179,74 +180,3 @@ const mapStateToProps = (state) => { export default connect(mapStateToProps)(CoinSettings); -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - }, - formLabel: { - textAlign:"left", - marginRight: "auto", - }, - keyGenLabel: { - textAlign:"left", - marginRight: "auto", - color: "#2E86AB" - }, - formInput: { - width: "100%", - }, - valueContainer: { - width: "85%", - }, - mainHeader: { - backgroundColor: "transparent", - marginTop: 30, - fontSize: 22, - color: "#E9F1F7", - width: "85%", - textAlign: "center" - }, - wifInput: { - width: "100%", - color: "#009B72" - }, - buttonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-between", - }, - singleButtonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "center", - }, - saveChangesButton: { - height: 46, - backgroundColor: "#009B72", - marginTop: 15, - }, - clearCacheButton: { - height: 46, - backgroundColor: "#2E86AB", - marginTop: 25, - marginBottom: 25 - }, - backButton: { - height: 46, - backgroundColor: "rgba(206,68,70,1)", - marginTop: 15, - }, - utxoVerificationDesc: { - textAlign:"left", - marginRight: "auto" - }, - bottom: { - flex: 1, - justifyContent: 'flex-end', - alignItems: 'center', - marginBottom: 36 - } -}); \ No newline at end of file diff --git a/src/containers/Settings/WalletSettings/CoinSettings/CoinSettings.styles.js b/src/containers/Settings/WalletSettings/CoinSettings/CoinSettings.styles.js new file mode 100644 index 00000000..7ff29969 --- /dev/null +++ b/src/containers/Settings/WalletSettings/CoinSettings/CoinSettings.styles.js @@ -0,0 +1,76 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + }, + keyGenLabel: { + textAlign:"left", + marginRight: "auto", + color: "#2E86AB" + }, + formInput: { + width: "100%", + }, + valueContainer: { + width: "85%", + }, + mainHeader: { + backgroundColor: "transparent", + marginTop: 30, + fontSize: 22, + color: "#E9F1F7", + width: "85%", + textAlign: "center" + }, + wifInput: { + width: "100%", + color: "#009B72" + }, + buttonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-between", + }, + singleButtonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "center", + }, + saveChangesButton: { + height: 46, + backgroundColor: "#009B72", + marginTop: 15, + }, + clearCacheButton: { + height: 46, + backgroundColor: Colors.successButtonColor, + marginTop: 25, + marginBottom: 25, + width: '60%' + }, + backButton: { + height: 46, + backgroundColor: Colors.basicButtonColor, + marginTop: 15, + width: '35%' + }, + utxoVerificationDesc: { + textAlign:"left", + marginRight: "auto" + }, + bottom: { + flex: 1, + justifyContent: 'flex-end', + alignItems: 'center', + marginBottom: 36 + } +}); \ No newline at end of file diff --git a/src/containers/GeneralWalletSettings.js b/src/containers/Settings/WalletSettings/GeneralWalletSettings/GeneralWalletSettings.js similarity index 73% rename from src/containers/GeneralWalletSettings.js rename to src/containers/Settings/WalletSettings/GeneralWalletSettings/GeneralWalletSettings.js index 2079503b..2c929c0b 100644 --- a/src/containers/GeneralWalletSettings.js +++ b/src/containers/Settings/WalletSettings/GeneralWalletSettings/GeneralWalletSettings.js @@ -5,11 +5,9 @@ */ import React, { Component } from "react"; -import Button1 from "../symbols/button1"; +import Button1 from "../../../../symbols/button1"; import { View, - StyleSheet, - Text, ScrollView, Keyboard, TouchableWithoutFeedback, @@ -18,8 +16,9 @@ import { } from "react-native"; import { NavigationActions } from 'react-navigation'; import { FormLabel, FormInput, FormValidationMessage } from 'react-native-elements' -import { saveGeneralSettings } from '../actions/actionCreators'; +import { saveGeneralSettings } from '../../../../actions/actionCreators'; import { connect } from 'react-redux'; +import styles from './GeneralWalletSettings.styles'; class WalletSettings extends Component { constructor(props) { @@ -127,12 +126,12 @@ class WalletSettings extends Component { @@ -150,71 +149,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(WalletSettings); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - }, - formLabel: { - textAlign:"left", - marginRight: "auto", - }, - keyGenLabel: { - textAlign:"left", - marginRight: "auto", - color: "#2E86AB" - }, - formInput: { - width: "100%", - }, - valueContainer: { - width: "85%", - }, - mainHeader: { - backgroundColor: "transparent", - marginTop: 30, - fontSize: 22, - color: "#E9F1F7", - width: "85%", - textAlign: "center" - }, - wifInput: { - width: "100%", - color: "#009B72" - }, - buttonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-between", - }, - singleButtonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "center", - }, - saveChangesButton: { - height: 46, - backgroundColor: "#009B72", - marginTop: 15, - }, - backButton: { - height: 46, - backgroundColor: "rgba(206,68,70,1)", - marginTop: 15, - }, - utxoVerificationDesc: { - textAlign:"left", - marginRight: "auto", - color: "#2E86AB" - }, - bottom: { - flex: 1, - justifyContent: 'flex-end', - alignItems: 'center', - marginBottom: 36 - }, -}); \ No newline at end of file +export default connect(mapStateToProps)(WalletSettings); \ No newline at end of file diff --git a/src/containers/Settings/WalletSettings/GeneralWalletSettings/GeneralWalletSettings.styles.js b/src/containers/Settings/WalletSettings/GeneralWalletSettings/GeneralWalletSettings.styles.js new file mode 100644 index 00000000..51e18a0f --- /dev/null +++ b/src/containers/Settings/WalletSettings/GeneralWalletSettings/GeneralWalletSettings.styles.js @@ -0,0 +1,75 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Book' + }, + keyGenLabel: { + textAlign:"left", + marginRight: "auto", + color: "#2E86AB" + }, + formInput: { + width: "100%", + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Book' + }, + valueContainer: { + width: "85%", + }, + mainHeader: { + backgroundColor: "transparent", + marginTop: 30, + fontSize: 22, + color: "#E9F1F7", + width: "85%", + textAlign: "center" + }, + wifInput: { + width: "100%", + color: "#009B72" + }, + buttonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-between", + }, + singleButtonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "center", + }, + saveChangesButton: { + height: 46, + backgroundColor: Colors.successButtonColor, + marginTop: 15, + width: '60%' + }, + backButton: { + height: 46, + backgroundColor: Colors.basicButtonColor, + marginTop: 15, + width: '35%' + }, + utxoVerificationDesc: { + textAlign:"left", + marginRight: "auto", + color: "#2E86AB" + }, + bottom: { + flex: 1, + justifyContent: 'flex-end', + alignItems: 'center', + marginBottom: 36 + }, +}); \ No newline at end of file diff --git a/src/containers/WalletSettings.js b/src/containers/Settings/WalletSettings/WalletSettings.js similarity index 84% rename from src/containers/WalletSettings.js rename to src/containers/Settings/WalletSettings/WalletSettings.js index bd7bb355..c3111c57 100644 --- a/src/containers/WalletSettings.js +++ b/src/containers/Settings/WalletSettings/WalletSettings.js @@ -8,7 +8,6 @@ import React, { Component } from "react"; import { ListItem } from "react-native-elements"; import { View, - StyleSheet, Text, TouchableOpacity, ScrollView @@ -16,7 +15,9 @@ import { import AlertAsync from "react-native-alert-async"; import { connect } from 'react-redux'; import { NavigationActions } from 'react-navigation'; -import { clearCacheData } from '../actions/actionCreators' +import { clearCacheData } from '../../../actions/actionCreators'; +import styles from './WalletSettings.styles'; +import Colors from '../../../globals/colors'; const GENERAL_WALLET_SETTINGS = "GeneralWalletSettings" const COIN_SETTINGS = "CoinSettings" @@ -96,6 +97,7 @@ class WalletSettings extends Component { rightIcon={{name: 'close'}} containerStyle={{ borderBottomWidth: 0 }} chevron={false} + chevronColor={Colors.quaternaryColor} /> this._openSettings(GENERAL_WALLET_SETTINGS)}> @@ -103,6 +105,7 @@ class WalletSettings extends Component { title={{"General Settings"}} leftIcon={{name: 'settings-applications'}} containerStyle={{ borderBottomWidth: 0 }} + chevronColor={Colors.quaternaryColor} /> {this.props.activeCoinsForUser.map((coin, index) => { @@ -115,6 +118,7 @@ class WalletSettings extends Component { avatar={coin.logo} roundAvatar containerStyle={{ borderBottomWidth: 0 }} + chevronColor={Colors.quaternaryColor} /> ) @@ -145,42 +149,3 @@ const mapStateToProps = (state) => { }; export default connect(mapStateToProps)(WalletSettings); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - fiatBalanceLabel: { - backgroundColor: "transparent", - opacity: 0.89, - marginTop: 15, - marginBottom: 15, - paddingBottom: 0, - paddingTop: 0, - fontSize: 25, - textAlign: "center", - color: "#E9F1F7", - width: 359, - }, - coinItemLabel: { - color: "#E9F1F7", - marginLeft: 10, - }, - balanceSheetLabel: { - width: "100%", - backgroundColor: "#E9F1F7", - opacity: 0.86, - marginTop: 0, - marginBottom: 0, - paddingBottom: 15, - paddingTop: 15, - fontSize: 22, - textAlign: "center", - color: "#232323" - }, - coinList: { - width: "100%", - }, -}); diff --git a/src/containers/Settings/WalletSettings/WalletSettings.styles.js b/src/containers/Settings/WalletSettings/WalletSettings.styles.js new file mode 100644 index 00000000..5e532379 --- /dev/null +++ b/src/containers/Settings/WalletSettings/WalletSettings.styles.js @@ -0,0 +1,48 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center" + }, + fiatBalanceLabel: { + backgroundColor: "transparent", + opacity: 0.89, + marginTop: 15, + marginBottom: 15, + paddingBottom: 0, + paddingTop: 0, + fontSize: 25, + textAlign: "center", + color: Colors.quaternaryColor, + fontFamily: 'Avenir-Book' + }, + coinItemLabel: { + color: Colors.quaternaryColor, + marginLeft: 10, + fontFamily: 'Avenir-Book', + fontSize: 19, + marginVertical: 10 + }, + balanceSheetLabel: { + width: "100%", + backgroundColor: Colors.tertiaryColor, + opacity: 0.86, + marginLeft:10, + marginTop: 0, + marginBottom: 0, + paddingBottom: 15, + paddingTop: 15, + fontSize: 22, + fontFamily: 'Avenir', + textAlign: "center", + color: Colors.quinaryColor, + fontWeight: 'bold' + }, + coinList: { + width: "90%", + marginVertical: '3%' + }, +}); \ No newline at end of file diff --git a/src/containers/SideMenu.js b/src/containers/SideMenu/SideMenu.js similarity index 75% rename from src/containers/SideMenu.js rename to src/containers/SideMenu/SideMenu.js index b071a596..1fa2fdc7 100644 --- a/src/containers/SideMenu.js +++ b/src/containers/SideMenu/SideMenu.js @@ -4,10 +4,10 @@ */ import React, { Component } from "react"; -import { View, StyleSheet, Text, ScrollView, FlatList, SectionList } from "react-native"; +import { View, Text, ScrollView, FlatList, SectionList } from "react-native"; import { Icon, ListItem } from "react-native-elements"; import PropTypes from 'prop-types'; -import DrawerHeader from '../components/DrawerHeader'; +import DrawerHeader from '../../components/DrawerHeader'; import { connect } from 'react-redux'; import { setActiveCoin, @@ -17,13 +17,14 @@ import { setConfigSection, removeExistingCoin, setUserCoins, - setActiveSectionCustomCoins - } from '../actions/actionCreators' -import { getKeyByValue } from '../utils/objectManip' + setActiveSectionCustomCoins, + setActiveSectionBuySellCrypto, + } from '../../actions/actionCreators' +import { getKeyByValue } from '../../utils/objectManip' import { NavigationActions } from 'react-navigation'; import AlertAsync from "react-native-alert-async"; -import { resolve } from "path"; -import { rejects } from "assert"; +import styles from './SideMenu.styles'; +import { ENABLE_WYRE } from '../../utils/constants'; const APP_INFO = 'App Info' const PROFILE = 'Profile' @@ -138,9 +139,10 @@ class SideMenu extends Component { this.setState({ mainDrawer: false, currentCoinIndex: index })} + titleStyle={{fontFamily: 'Avenir-Black', marginLeft: '15%'}} /> )} keyExtractor={item => item.id} @@ -155,27 +157,43 @@ class SideMenu extends Component { style={styles.coinList} renderItem={({item, index, section}) => ( {this._openCoin(this.props.activeCoinsForUser[this.state.currentCoinIndex], item.name, section)}} /> )} renderSectionHeader={({section: {title}}) => ( {title}} - containerStyle={{ backgroundColor: "#E9F1F7", borderBottomWidth: 0 }} - hideChevron={true} - onPress={() => {return 0}} + title={{title}} + containerStyle={{ backgroundColor: "#E9F1F7", borderBottomWidth: 0 }} + hideChevron + onPress={() => {return 0}} /> - )} - sections={this.sectionExtractor(this.state.currentCoinIndex)} - keyExtractor={(item, index) => item + index} + )} + sections={this.sectionExtractor(this.state.currentCoinIndex)} + keyExtractor={(item, index) => item + index} /> + { ENABLE_WYRE && + { + let navigation = this.props.navigation + this.props.dispatch(setActiveSectionBuySellCrypto('buy-crypto')) + navigation.navigate("BuySellCryptoMenus", {title: "Buy Crypto"}); + }} + /> + } {this._removeCoin(this.props.activeCoinsForUser[this.state.currentCoinIndex].id)}} /> @@ -244,20 +262,22 @@ class SideMenu extends Component { style={styles.coinList} renderItem={({item, index, section}) => ( this.navigateToScreen('AddCoin') : () => this._openCustomCoinMenus()} + textInputStyle={{fontFamily: 'Avenir-Black'}} /> )} renderSectionHeader={({section: {title}}) => ( {title}} + title={{title}} containerStyle={{ backgroundColor: "#E9F1F7", borderBottomWidth: 0 }} - hideChevron={true} + hideChevron /> )} sections={[ @@ -274,17 +294,18 @@ class SideMenu extends Component { style={styles.coinList} renderItem={({item, index, section}) => ( this._openSettings(item)} /> )} renderSectionHeader={({section: {title}}) => ( {title}} + title={{title}} containerStyle={{ backgroundColor: "#E9F1F7", borderBottomWidth: 0 }} - hideChevron={true} + hideChevron /> )} sections={[ @@ -311,24 +332,28 @@ class SideMenu extends Component { {this.renderMainDrawerComponents()} this.setState({ mainDrawer: false, currentCoinIndex: -1 })} + titleStyle={{fontFamily: 'Avenir-Black', marginLeft: '15%'}} /> this.setState({ mainDrawer: false, currentCoinIndex: -2 })} + titleStyle={{fontFamily: 'Avenir-Black', marginLeft: '10%'}} /> ); @@ -339,13 +364,13 @@ class SideMenu extends Component { {"Back"}} + title={{"BACK"}} containerStyle={{ borderBottomWidth: 0 }} - hideChevron={true} + hideChevron leftIcon={ } @@ -378,9 +403,3 @@ const mapStateToProps = (state) => { }; export default connect(mapStateToProps)(SideMenu); - -const styles = StyleSheet.create({ - coinList: { - width: "100%", - }, -}); diff --git a/src/containers/SideMenu/SideMenu.styles.js b/src/containers/SideMenu/SideMenu.styles.js new file mode 100644 index 00000000..5956ba82 --- /dev/null +++ b/src/containers/SideMenu/SideMenu.styles.js @@ -0,0 +1,7 @@ +import { StyleSheet } from "react-native"; + +export default styles = StyleSheet.create({ + coinList: { + width: "100%", + }, +}); \ No newline at end of file diff --git a/src/containers/SignUp.js b/src/containers/SignUp/SignUp.js similarity index 82% rename from src/containers/SignUp.js rename to src/containers/SignUp/SignUp.js index 0dc2e527..74266f7b 100644 --- a/src/containers/SignUp.js +++ b/src/containers/SignUp/SignUp.js @@ -5,11 +5,10 @@ It is crucial that they understand the importance of their seed. */ -import React, { Component } from "react"; -import Button1 from "../symbols/button1"; +import React, { Component } from "react" +import Button1 from "../../symbols/button1" import { View, - StyleSheet, Text, TouchableOpacity, Switch, @@ -17,15 +16,17 @@ import { Keyboard, TouchableWithoutFeedback, Platform -} from "react-native"; -import { NavigationActions } from 'react-navigation'; +} from "react-native" +import { NavigationActions } from 'react-navigation' import { FormLabel, FormInput, FormValidationMessage } from 'react-native-elements' -import { addUser, setUpdateIntervalID } from '../actions/actionCreators'; -import { connect } from 'react-redux'; -import { getKey } from '../utils/keyGenerator/keyGenerator' -import { spacesLeadOrTrail, hasSpecialCharacters } from '../utils/stringUtils' +import { addUser, setUpdateIntervalID } from '../../actions/actionCreators' +import { connect } from 'react-redux' +import { getKey } from '../../utils/keyGenerator/keyGenerator' +import { spacesLeadOrTrail, hasSpecialCharacters } from '../../utils/stringUtils' import AlertAsync from 'react-native-alert-async' -import ScanSeed from '../components/ScanSeed' +import ScanSeed from '../../components/ScanSeed' +import styles from './SignUp.styles'; +import Colors from '../../globals/colors'; class SignUp extends Component { constructor() { @@ -259,7 +260,7 @@ class SignUp extends Component { Wallet passphrase/WIF key (min. 15 characters): this.setState({wifKey: text})} value={this.state.wifKey} autoCapitalize={"none"} @@ -269,12 +270,18 @@ class SignUp extends Component { inputStyle={styles.wifInput} multiline={Platform.OS === 'ios' ? false : true} /> - - - Scan seed from QR - - - + + + Plaintext Passphrase Display: } - - - Generate random passphrase - - Enter a username: this.setState({userName: text})} autoCapitalize={"none"} autoCorrect={false} @@ -322,7 +324,7 @@ class SignUp extends Component { Enter an account password (min. 5 characters): this.setState({pin: text})} autoCapitalize={"none"} autoCorrect={false} @@ -344,7 +346,7 @@ class SignUp extends Component { Confirm account password: this.setState({confirmPin: text})} autoCapitalize={"none"} autoCorrect={false} @@ -403,13 +405,13 @@ class SignUp extends Component { { this.props.accounts.length > 0 && } @@ -429,72 +431,4 @@ const mapStateToProps = (state) => { } }; -export default connect(mapStateToProps)(SignUp); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - }, - formLabel: { - textAlign:"left", - marginRight: "auto", - }, - keyGenLabel: { - textAlign:"left", - marginRight: "auto", - color: "#2E86AB" - }, - scanLabel: { - textAlign:"left", - marginRight: "auto", - color: "#009B72" - }, - formInput: { - width: "100%", - }, - valueContainer: { - width: "85%", - }, - switchContainer: { - alignItems: "flex-start", - marginLeft: 18 - }, - wifLabel: { - backgroundColor: "transparent", - marginTop: 50, - marginBottom: 8, - paddingBottom: 0, - fontSize: 22, - color: "#E9F1F7", - width: "85%", - textAlign: "center" - }, - wifInput: { - width: "100%", - color: "#009B72" - }, - buttonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "space-between", - }, - singleButtonContainer: { - width: "75%", - backgroundColor: "transparent", - flexDirection: "row", - justifyContent: "center", - }, - addAccountButton: { - height: 46, - backgroundColor: "#2E86AB", - marginTop: 15, - marginBottom: 40 - }, - cancelButton: { - height: 46, - backgroundColor: "rgba(206,68,70,1)", - marginTop: 15, - }, -}); \ No newline at end of file +export default connect(mapStateToProps)(SignUp); \ No newline at end of file diff --git a/src/containers/SignUp/SignUp.styles.js b/src/containers/SignUp/SignUp.styles.js new file mode 100644 index 00000000..aeaf7f74 --- /dev/null +++ b/src/containers/SignUp/SignUp.styles.js @@ -0,0 +1,94 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + }, + formLabel: { + textAlign:"left", + marginRight: "auto", + color: Colors.quinaryColor, + fontFamily: 'Avenir-Book', + fontWeight: 'normal' + }, + formInput: { + width: "100%", + fontFamily: 'Avenir-Medium', + color: Colors.quinaryColor, + fontSize: 15, + }, + valueContainer: { + width: "90%", + }, + switchContainer: { + alignItems: "flex-start", + marginLeft: 18 + }, + wifLabel: { + backgroundColor: "transparent", + marginTop: 50, + marginBottom: 8, + paddingBottom: 0, + fontSize: 22, + color: Colors.quaternaryColor, + width: "85%", + textAlign: "center", + fontFamily: 'Avenir-Medium', + }, + wifInput: { + width: "100%", + color: Colors.quaternaryColor, + fontSize: 13, + fontFamily: 'Avenir-Medium', + }, + buttonContainer: { + width: "80%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "space-between", + }, + singleButtonContainer: { + width: "75%", + backgroundColor: "transparent", + flexDirection: "row", + justifyContent: "center", + }, + addAccountButton: { + height: 46, + backgroundColor: Colors.successButtonColor, + marginTop: 15, + marginBottom: 40, + width: '60%' + }, + cancelButton: { + height: 46, + backgroundColor: Colors.basicButtonColor, + marginTop: 15, + width: '35%' + }, + scanSeedButton: { + width: '90%', + marginVertical: '2%', + alignSelf: 'center', + height: 50, + backgroundColor: Colors.linkButtonColor, + marginTop: 15, + }, + generatePassphraseButton: { + width: '90%', + marginVertical: '2%', + alignSelf: 'center', + height: 50, + backgroundColor: Colors.successButtonColor + }, + passphraseDisplayLabel: { + textAlign: 'center', + marginRight: "auto", + color: Colors.quinaryColor, + fontWeight: 'bold', + alignSelf: 'center', + fontSize: 13 + }, +}); \ No newline at end of file diff --git a/src/containers/TransactionDetails.js b/src/containers/TransactionDetails/TransactionDetails.js similarity index 74% rename from src/containers/TransactionDetails.js rename to src/containers/TransactionDetails/TransactionDetails.js index e64d22ee..d27d757e 100644 --- a/src/containers/TransactionDetails.js +++ b/src/containers/TransactionDetails/TransactionDetails.js @@ -4,10 +4,10 @@ */ import React, { Component } from "react"; -import Button1 from "../symbols/button1"; +import Button1 from "../../symbols/button1"; import { View, - StyleSheet, Text, + Text, ScrollView, Image, Linking, @@ -16,16 +16,18 @@ import { Alert } from "react-native"; import { connect } from 'react-redux'; -import { unixToDate } from '../utils/math'; -import { explorers } from '../utils/CoinData'; -import { truncateDecimal } from '../utils/math'; -import { Icon } from 'react-native-elements' +import { unixToDate } from '../../utils/math'; +import { explorers } from '../../utils/CoinData'; +import { truncateDecimal } from '../../utils/math'; +import { Icon } from 'react-native-elements'; +import styles from './TransactionDetails.styles'; +import Colors from '../../globals/colors'; -const SELF = require('../images/customIcons/selfArrow.png') -const OUT = require('../images/customIcons/outgoingArrow.png') -const IN = require('../images/customIcons/incomingArrow.png') -const UNKNOWN = require('../images/customIcons/unknownLogo.png') -const INTEREST = require('../images/customIcons/interestPlus.png') +const SELF = require('../../images/customIcons/selfArrow.png') +const OUT = require('../../images/customIcons/outgoingArrow.png') +const IN = require('../../images/customIcons/incomingArrow.png') +const UNKNOWN = require('../../images/customIcons/unknownLogo.png') +const INTEREST = require('../../images/customIcons/interestPlus.png') class TransactionDetails extends Component { constructor(props) { @@ -140,7 +142,7 @@ class TransactionDetails extends Component { {this.state.activeCoinID === 'BTC' ? this.decodeBtcTxid(this.state.txData.txid) : this.state.txData.txid} - + { explorers[this.state.activeCoinID] && this.openExplorer()} /> @@ -164,60 +166,3 @@ const mapStateToProps = (state) => { }; export default connect(mapStateToProps)(TransactionDetails); - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - infoBox: { - flex: 1, - flexDirection: 'column', - alignSelf: 'center', - justifyContent: 'flex-start', - width: "85%", - }, - infoRow: { - flex: 1, - flexDirection: 'row', - justifyContent: 'space-between', - alignSelf: 'stretch', - marginTop: 10 - }, - infoText: { - fontSize: 16, - color: "#E9F1F7" - }, - addressText: { - fontSize: 16, - color: "#E9F1F7", - width: "65%", - textAlign: "right" - }, - rect: { - height: 1, - width: 360, - backgroundColor: "rgb(230,230,230)" - }, - homeLabel: { - width: 244, - backgroundColor: "transparent", - opacity: 0.86, - marginTop: 5, - marginBottom: 15, - paddingBottom: 0, - fontSize: 22, - textAlign: "center", - color: "#E9F1F7" - }, - explorerBtn: { - alignSelf: "center", - width: 140, - height: 45, - backgroundColor: "rgba(68,152,206,1)", - opacity: 1, - marginTop: 10, - marginBottom: 0 - }, -}); diff --git a/src/containers/TransactionDetails/TransactionDetails.styles.js b/src/containers/TransactionDetails/TransactionDetails.styles.js new file mode 100644 index 00000000..c5be0d4c --- /dev/null +++ b/src/containers/TransactionDetails/TransactionDetails.styles.js @@ -0,0 +1,59 @@ +import { StyleSheet } from "react-native"; +import Colors from '../../globals/colors'; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: Colors.secondaryColor, + flex: 1, + alignItems: "center" + }, + infoBox: { + flex: 1, + flexDirection: 'column', + alignSelf: 'center', + justifyContent: 'flex-start', + width: "85%", + }, + infoRow: { + flex: 1, + flexDirection: 'row', + justifyContent: 'space-between', + alignSelf: 'stretch', + marginTop: 10 + }, + infoText: { + fontSize: 16, + color: Colors.quaternaryColor + }, + addressText: { + fontSize: 16, + color: Colors.quaternaryColor, + width: "65%", + textAlign: "right" + }, + rect: { + height: 1, + width: 360, + backgroundColor: "rgb(230,230,230)" + }, + homeLabel: { + width: 244, + backgroundColor: "transparent", + opacity: 0.86, + marginTop: 5, + marginBottom: 15, + paddingBottom: 0, + fontSize: 22, + textAlign: "center", + color: Colors.quaternaryColor + }, + explorerBtn: { + alignSelf: "center", + width: 140, + height: 45, + backgroundColor: "rgba(68,152,206,1)", + opacity: 1, + marginTop: 10, + marginBottom: 0 + }, +}); \ No newline at end of file diff --git a/src/containers/VerusPay.js b/src/containers/VerusPay/VerusPay.js similarity index 84% rename from src/containers/VerusPay.js rename to src/containers/VerusPay/VerusPay.js index 5c362f88..9ba64c91 100644 --- a/src/containers/VerusPay.js +++ b/src/containers/VerusPay/VerusPay.js @@ -9,16 +9,15 @@ import React, { Component } from "react"; import { View, - StyleSheet, Alert } from "react-native"; import QRCodeScanner from 'react-native-qrcode-scanner'; -import { isJson } from '../utils/objectManip' +import { isJson } from '../../utils/objectManip' import { NavigationActions } from 'react-navigation'; import { connect } from 'react-redux'; -import { namesList, coinsList, findCoinObj } from '../utils/CoinData' -import { getRecommendedBTCFees } from '../utils/httpCalls/callCreators' -import { removeSpaces } from '../utils/stringUtils' +import { namesList, coinsList, findCoinObj } from '../../utils/CoinData' +import { getRecommendedBTCFees } from '../../utils/httpCalls/callCreators' +import { removeSpaces } from '../../utils/stringUtils' import { updateCoinBalances, setUserCoins, @@ -29,10 +28,11 @@ import { setActiveApp, setActiveCoin, setActiveSection - } from '../actions/actionCreators' + } from '../../actions/actionCreators' import Spinner from 'react-native-loading-spinner-overlay'; -import AlertAsync from "react-native-alert-async"; -import { coinsToSats } from '../utils/math' +import DelayedAlert from '../../utils/delayedAlert' +import DelayedAsyncAlert from '../../utils/delayedAsyncAlert' +import { coinsToSats } from '../../utils/math' import { FORMAT_UNKNOWN, ADDRESS_ONLY, @@ -41,8 +41,10 @@ import { INSUFFICIENT_FUNDS, INCOMPLETE_VERUS_QR, ONLY_ADDRESS, - BALANCE_NULL -} from '../utils/constants' + BALANCE_NULL, + PARSE_ERROR +} from '../../utils/constants' +import styles from './VerusPay.styles' class VerusPay extends Component { constructor(props) { @@ -130,7 +132,7 @@ class VerusPay extends Component { } errorHandler = (error) => { - Alert.alert("Error", error); + DelayedAlert("Error", error); this.props.navigation.dispatch(NavigationActions.back()) } @@ -147,60 +149,69 @@ class VerusPay extends Component { } parseCoinURL = (qrString) => { + //TODO: Add support for messages in btc urls as well (&message=Hello) + let fullURL = /^\w{1,30}:\w{33,36}\?amount\=\d*\.{1}\d*/ //:
?amount= let partialURL = /^\w{1,30}:\w{33,36}$/ //:
- - let firstTry = qrString.match(fullURL) - - if(firstTry) { - //parse full URL here - let coinName = firstTry[0].substring(0, firstTry[0].indexOf(':')) - let address = firstTry[0].substring((firstTry[0].indexOf(':') + 1), firstTry[0].indexOf('?')) - let amount = firstTry[0].substring((firstTry[0].indexOf('=') + 1)) - - if (coinName && address && amount) { - //Find coin ticker from coin data here, URL uses full name - - for (coinObj in coinsList) { - if (removeSpaces(coinObj.name).toLowerCase() === coinName.toLowerCase()) { - //Create verusQR compatible data from coin URL - return { - coinTicker: coinObj.id, - address: address, - amount: coinsToSats(Number(amount)) - } - } - } - - this.errorHandler(INCOMPATIBLE_COIN) - return false - } - } else { - let secondTry = qrString.match(partialURL) - - if (secondTry) { - //Parse partial URL here - let coinName = secondTry[0].substring(0, secondTry[0].indexOf(':')) - let address = secondTry[0].substring((secondTry[0].indexOf(':') + 1)) - - for (coinObj in coinsList) { - if (removeSpaces(coinObj.name).toLowerCase() === coinName.toLowerCase()) { - //Create verusQR compatible data from coin URL - return { - coinTicker: coinObj.id, - address: address, - } - } + + try { + let firstTry = qrString.match(fullURL) + + if(firstTry) { + //parse full URL here + let coinName = firstTry[0].substring(0, firstTry[0].indexOf(':')) + let address = firstTry[0].substring((firstTry[0].indexOf(':') + 1), firstTry[0].indexOf('?')) + let amount = firstTry[0].substring((firstTry[0].indexOf('=') + 1)) + + if (coinName && address && amount) { + //Find coin ticker from coin data here, URL uses full name + + for (key in coinsList) { + if (coinsList[key] && removeSpaces(coinsList[key].name).toLowerCase() === coinName.toLowerCase()) { + //Create verusQR compatible data from coin URL + return { + coinTicker: coinsList[key].id, + address: address, + amount: coinsToSats(Number(amount)) + } + } + } + + this.errorHandler(INCOMPATIBLE_COIN) + return false } - - this.errorHandler(INCOMPATIBLE_COIN) - return false } else { - return false - } - } + let secondTry = qrString.match(partialURL) + + if (secondTry) { + //Parse partial URL here + let coinName = secondTry[0].substring(0, secondTry[0].indexOf(':')) + let address = secondTry[0].substring((secondTry[0].indexOf(':') + 1)) + + for (key in coinsList) { + const coinObj = coinsList[key] + + if (removeSpaces(coinObj.name).toLowerCase() === coinName.toLowerCase()) { + //Create verusQR compatible data from coin URL + return { + coinTicker: coinObj.id, + address: address, + } + } + } + + this.errorHandler(INCOMPATIBLE_COIN) + return false + } else { + return false + } + } + } catch (e) { + console.error(e) + this.errorHandler(PARSE_ERROR) + } } cancelHandler = () => { @@ -251,14 +262,14 @@ class VerusPay extends Component { } } else { this.canExitWallet(this.props.activeCoin.id, coinTicker) - .then((res) => { + .then((res) => { if (res) { if (amount === null || amount <= 0) { this.handleMissingAmount(activeCoin, address, memo) } else { if (this.checkBalance(amount, activeCoin)) { this.preConfirm( - activeCoin, + activeCoin, this.props.activeAccount, address, amount, @@ -332,6 +343,9 @@ class VerusPay extends Component { this.errorHandler("Error adding coin") } }) + .catch(err => { + this.errorHandler(err.message) + }) }) } @@ -425,7 +439,7 @@ class VerusPay extends Component { } checkBalance = (amount, activeCoin) => { - if (this.props.balances[activeCoin.id] && this.props.balances[activeCoin.id].result) { + if (activeCoin && this.props.balances[activeCoin.id] && this.props.balances[activeCoin.id].result) { const spendableBalance = this.props.balances[activeCoin.id].result.confirmed - activeCoin.fee if (amount > Number(spendableBalance)) { @@ -437,11 +451,10 @@ class VerusPay extends Component { } else { this.errorHandler(BALANCE_NULL) } - } canExitWallet = (fromTicker, toTicker) => { - return AlertAsync( + return DelayedAsyncAlert( 'Exiting Wallet', 'This invoice is requesting funds in ' + toTicker + ', but you are currently ' + 'in the ' + fromTicker + ' wallet. Would you like to proceed?', @@ -460,7 +473,7 @@ class VerusPay extends Component { } canFillAmount = (memo, address) => { - return AlertAsync( + return DelayedAsyncAlert( 'Missing Amount', 'This invoice does not specify an amount, in order to proceed you ' + 'will need to fill in the amount yourself, would you like to continue?' + @@ -480,7 +493,7 @@ class VerusPay extends Component { } canAddCoin = (coinTicker) => { - return AlertAsync( + return DelayedAsyncAlert( 'Coin Inactive', 'This invoice is requesting funds in ' + coinTicker + ', but you have not ' + 'activated that coin yet, would you like to activate ' + coinTicker + ' and proceed?', @@ -566,7 +579,7 @@ class VerusPay extends Component { addressOnly = (address) => { if (this.props.navigation.state.params && this.props.navigation.state.params.fillAddress) { - Alert.alert("Address Only", ADDRESS_ONLY); + DelayedAlert("Address Only", ADDRESS_ONLY); this.props.navigation.state.params.fillAddress(address) this.props.navigation.dispatch(NavigationActions.back()) } else { @@ -616,15 +629,3 @@ const mapStateToProps = (state) => { }; export default connect(mapStateToProps)(VerusPay); - - -const styles = StyleSheet.create({ - root: { - backgroundColor: "#232323", - flex: 1, - alignItems: "center" - }, - QRCamera: { - height: "100%" - } -}); diff --git a/src/containers/VerusPay/VerusPay.styles.js b/src/containers/VerusPay/VerusPay.styles.js new file mode 100644 index 00000000..968e9232 --- /dev/null +++ b/src/containers/VerusPay/VerusPay.styles.js @@ -0,0 +1,12 @@ +import { StyleSheet } from "react-native"; + +export default styles = StyleSheet.create({ + root: { + backgroundColor: "#232323", + flex: 1, + alignItems: "center" + }, + QRCamera: { + height: "100%" + } +}); diff --git a/src/globals/colors.js b/src/globals/colors.js new file mode 100644 index 00000000..b5e15ba5 --- /dev/null +++ b/src/globals/colors.js @@ -0,0 +1,15 @@ + +const Colors = { + primaryColor: '#3165d4', // verus blue + secondaryColor: '#FFFFFF', // white + tertiaryColor: '#dee5fe', //grey white + quaternaryColor: '#232323', // gray + quinaryColor: 'black', + successButtonColor: '#00B231', + warningButtonColor: '#F22D37', + infoButtonColor: '#F89336', + linkButtonColor: '#4E73DF', + basicButtonColor: 'black', +} + +export default Colors \ No newline at end of file diff --git a/src/images/cryptologo/default/k64.png b/src/images/cryptologo/default/k64.png deleted file mode 100755 index 2fb900f5..00000000 Binary files a/src/images/cryptologo/default/k64.png and /dev/null differ diff --git a/src/images/cryptologo/default/vrsc.png b/src/images/cryptologo/default/vrsc.png index 179593c2..bde05fde 100644 Binary files a/src/images/cryptologo/default/vrsc.png and b/src/images/cryptologo/default/vrsc.png differ diff --git a/src/images/customIcons/Verus.png b/src/images/customIcons/Verus.png new file mode 100644 index 00000000..1aaa9faa Binary files /dev/null and b/src/images/customIcons/Verus.png differ diff --git a/src/images/customIcons/VerusLogo.png b/src/images/customIcons/VerusLogo.png new file mode 100644 index 00000000..515980d3 Binary files /dev/null and b/src/images/customIcons/VerusLogo.png differ diff --git a/src/images/customIcons/add.png b/src/images/customIcons/add.png new file mode 100644 index 00000000..fd40a445 Binary files /dev/null and b/src/images/customIcons/add.png differ diff --git a/src/images/customIcons/aproved.png b/src/images/customIcons/aproved.png new file mode 100644 index 00000000..0217fa6d Binary files /dev/null and b/src/images/customIcons/aproved.png differ diff --git a/src/images/customIcons/bank-building.png b/src/images/customIcons/bank-building.png new file mode 100644 index 00000000..a9cf7b63 Binary files /dev/null and b/src/images/customIcons/bank-building.png differ diff --git a/src/images/customIcons/bank.png b/src/images/customIcons/bank.png new file mode 100644 index 00000000..6507857c Binary files /dev/null and b/src/images/customIcons/bank.png differ diff --git a/src/images/customIcons/bank2.png b/src/images/customIcons/bank2.png new file mode 100644 index 00000000..017ebe2f Binary files /dev/null and b/src/images/customIcons/bank2.png differ diff --git a/src/images/customIcons/bankBuildingBlack.png b/src/images/customIcons/bankBuildingBlack.png new file mode 100644 index 00000000..0c179e27 Binary files /dev/null and b/src/images/customIcons/bankBuildingBlack.png differ diff --git a/src/images/customIcons/buy.png b/src/images/customIcons/buy.png new file mode 100644 index 00000000..81e95ba3 Binary files /dev/null and b/src/images/customIcons/buy.png differ diff --git a/src/images/customIcons/buySell.png b/src/images/customIcons/buySell.png new file mode 100644 index 00000000..95d29516 Binary files /dev/null and b/src/images/customIcons/buySell.png differ diff --git a/src/images/customIcons/calendar.png b/src/images/customIcons/calendar.png new file mode 100644 index 00000000..1bd50e72 Binary files /dev/null and b/src/images/customIcons/calendar.png differ diff --git a/src/images/customIcons/call-answer.png b/src/images/customIcons/call-answer.png new file mode 100644 index 00000000..1e77d159 Binary files /dev/null and b/src/images/customIcons/call-answer.png differ diff --git a/src/images/customIcons/coinAdd.png b/src/images/customIcons/coinAdd.png new file mode 100644 index 00000000..461b74ac Binary files /dev/null and b/src/images/customIcons/coinAdd.png differ diff --git a/src/images/customIcons/email.png b/src/images/customIcons/email.png new file mode 100644 index 00000000..ed54739a Binary files /dev/null and b/src/images/customIcons/email.png differ diff --git a/src/images/customIcons/file.png b/src/images/customIcons/file.png new file mode 100644 index 00000000..3ed21de6 Binary files /dev/null and b/src/images/customIcons/file.png differ diff --git a/src/images/customIcons/home-icon-silhouette.png b/src/images/customIcons/home-icon-silhouette.png new file mode 100644 index 00000000..cb43f069 Binary files /dev/null and b/src/images/customIcons/home-icon-silhouette.png differ diff --git a/src/images/customIcons/index.js b/src/images/customIcons/index.js new file mode 100644 index 00000000..fc079b3d --- /dev/null +++ b/src/images/customIcons/index.js @@ -0,0 +1,39 @@ +import Open from './add.png'; +import Approved from './aproved.png'; +import Pending from './pending.png'; +import Email from './email.png'; +import Phone from './call-answer.png'; +import File from './file.png'; +import BankMain from './piggybank.png'; +import Bank from './bank2.png'; +import BankBuilding from './bank-building.png'; +import User from './user.png'; +import Address from './maps-and-flags.png'; +import Home from './home-icon-silhouette.png'; +import Buy from './buy.png'; +import Sell from './sell.png'; +import Calendar from './calendar.png'; +import Verus from './Verus.png'; +import BankBuildingBlack from './bankBuildingBlack.png'; + +export { + Open, + Approved, + Pending, + Email, + Phone, + User, + File, + Bank, + BankBuilding, + BankMain, + Address, + Home, + Buy, + Sell, + Calendar, + Verus, + BankBuildingBlack +}; + +export default Open; diff --git a/src/images/customIcons/maps-and-flags.png b/src/images/customIcons/maps-and-flags.png new file mode 100644 index 00000000..b5895e9a Binary files /dev/null and b/src/images/customIcons/maps-and-flags.png differ diff --git a/src/images/customIcons/pending.png b/src/images/customIcons/pending.png new file mode 100644 index 00000000..6ae24780 Binary files /dev/null and b/src/images/customIcons/pending.png differ diff --git a/src/images/customIcons/piggybank.png b/src/images/customIcons/piggybank.png new file mode 100644 index 00000000..84ea8e4f Binary files /dev/null and b/src/images/customIcons/piggybank.png differ diff --git a/src/images/customIcons/sell.png b/src/images/customIcons/sell.png new file mode 100644 index 00000000..41dc4db1 Binary files /dev/null and b/src/images/customIcons/sell.png differ diff --git a/src/images/customIcons/user.png b/src/images/customIcons/user.png new file mode 100644 index 00000000..812d3c2a Binary files /dev/null and b/src/images/customIcons/user.png differ diff --git a/src/reducers/authentication.js b/src/reducers/authentication.js index bf305380..bc6bb55f 100644 --- a/src/reducers/authentication.js +++ b/src/reducers/authentication.js @@ -1,12 +1,12 @@ /* The authentication reducer is to contain sensitive account data - while the app is loaded. When the user logs out, or the app is + while the app is loaded. When the user logs out, or the app is completely closed, only the non-sensitive data should persist. */ export const authentication = (state = { accounts: [], - activeAccount: {id: null, wifKey: "", keys: []}, + activeAccount: {id: null, wifKey: "", keys: [], paymentMethods: {}}, unlocked: false, fingerPrint: false, signedIn: false @@ -26,7 +26,10 @@ export const authentication = (state = { case 'UPDATE_ACCOUNT_KEYS': return { ...state, - activeAccount: {id: state.activeAccount.id, wifKey: state.activeAccount.wifKey, keys: action.keys}, + activeAccount: { + ...state.activeAccount, + keys: action.keys + }, }; case 'SIGN_OUT': return { @@ -42,4 +45,4 @@ export const authentication = (state = { default: return state; } -} \ No newline at end of file +} diff --git a/src/reducers/buySellCrypto.js b/src/reducers/buySellCrypto.js new file mode 100644 index 00000000..18913cda --- /dev/null +++ b/src/reducers/buySellCrypto.js @@ -0,0 +1,18 @@ +/* + This reduces contains general navigation and saved form data + for the buy/sell crypto screen +*/ + +export const buySellCrypto = (state = { + activeSection: null +}, action) => { + switch (action.type) { + case 'SET_ACTIVE_SECTION_BUY_SELL_CRYPTO': + return { + ...state, + activeSection: action.activeSection, + }; + default: + return state; + } +} \ No newline at end of file diff --git a/src/reducers/index.js b/src/reducers/index.js index b0d49c98..40831f0b 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -1,11 +1,13 @@ -import { combineReducers } from 'redux' -import { authentication } from './authentication' -import { coins } from './coins' -import { ledger } from './ledger' -import { settings } from './settings' -import { electrum } from './cache/electrum' -import { headers } from './cache/headers' -import { customCoins } from './customCoins' +import { combineReducers } from 'redux'; +import { authentication } from './authentication'; +import { coins } from './coins'; +import { ledger } from './ledger'; +import { settings } from './settings'; +import { electrum } from './cache/electrum'; +import { headers } from './cache/headers'; +import { customCoins } from './customCoins'; +import { buySellCrypto } from './buySellCrypto'; +import { paymentMethods } from './paymentMethods'; export default combineReducers({ authentication, @@ -14,5 +16,7 @@ export default combineReducers({ settings, electrum, headers, - customCoins -}) \ No newline at end of file + customCoins, + buySellCrypto, + paymentMethods, +}); diff --git a/src/reducers/paymentMethods.js b/src/reducers/paymentMethods.js new file mode 100644 index 00000000..9e458044 --- /dev/null +++ b/src/reducers/paymentMethods.js @@ -0,0 +1,180 @@ +const actionToUi = (action) => { + switch (action.type) { + case 'CREATE_WYRE_ACCOUNT': + case 'CREATE_WYRE_ACCOUNT_RESPONSE': + return 'createAccount'; + case 'GET_WYRE_ACCOUNT': + case 'GET_WYRE_ACCOUNT_RESPONSE': + return 'getAccount'; + case 'PUT_WYRE_ACCOUNT': + case 'PUT_WYRE_ACCOUNT_RESPONSE': + return 'putAccount'; + case 'GET_WYRE_CONFIG': + case 'GET_WYRE_CONFIG_RESPONSE': + return 'getConfig'; + case 'CREATE_WYRE_PAYMENT': + case 'CREATE_WYRE_PAYMENT_RESPONSE': + return 'createPayment'; + case 'GET_EXCHANGE_RATES': + case 'GET_EXCHANGE_RATES_RESPONSE': + return 'getExchangeRates'; + case 'GET_TRANSACTION_HISTORY': + case 'GET_TRANSACTION_HISTORY_RESPONSE': + return 'getTransactionHistory' + default: + return ''; + } +}; + +const denormalizeProfileFields = (profileFields) => { + if (!profileFields) return {}; + return profileFields.reduce((obj, item) => { + // eslint-disable-next-line no-param-reassign + obj[item.fieldId] = item; + return obj; + }, {}); +}; + +const isFetching = (state, type, value) => ({ + ...state, + [type]: { + isFetching: value, + } +}); + +const account = (state, action) => { + if (!action.payload.account) return state; + return { + ...action.payload.account, + denormalizedProfileFields: denormalizeProfileFields(action.payload.account.profileFields), + }; +}; + +const wyre = (state, action) => { + console.log(action) + switch (action.type) { + case 'CREATE_WYRE_ACCOUNT': + case 'GET_WYRE_ACCOUNT': + case 'CREATE_WYRE_PAYMENT': + case 'PUT_WYRE_ACCOUNT': + return { + ...state, + ui: isFetching(state.ui, actionToUi(action), true), + }; + case 'CREATE_WYRE_ACCOUNT_RESPONSE': + case 'CREATE_WYRE_PAYMENT_RESPONSE': + return { + ...state, + ui: isFetching(state.ui, actionToUi(action), false), + }; + case 'GET_WYRE_ACCOUNT_RESPONSE': + case 'PUT_WYRE_ACCOUNT_RESPONSE': + return { + ...state, + account: account(state.account, action), + ui: isFetching(state.ui, actionToUi(action), false), + }; + case 'GET_WYRE_CONFIG': + return { + ...state, + ui: isFetching(state.ui, actionToUi(action), false), + config: {}, + }; + case 'GET_WYRE_CONFIG_RESPONSE': + return { + ...state, + ui: isFetching(state.ui, actionToUi(action), false), + config: { + ...action.payload.config + }, + }; + case 'GET_EXCHANGE_RATES': + return { + ...state, + ui: isFetching(state.ui, actionToUi(action), true), + rates: {} + } + case 'GET_EXCHANGE_RATES_RESPONSE': + return { + ...state, + ui: isFetching(state.ui, actionToUi(action), false), + rates: { + ...action.payload.rates + } + } + case 'GET_TRANSACTION_HISTORY': + return { + ...state, + ui: isFetching(state.ui, actionToUi(action), true), + history: [], + } + case 'GET_TRANSACTION_HISTORY_RESPONSE': + return { + ...state, + ui: isFetching(state.ui, actionToUi(action), false), + history: action.payload.history, + } + default: + return state; + } +}; + + + +export const paymentMethods = (state = { + wyre: { + account: { + denormalizedProfileFields: {}, + }, + config: {}, + ui: { + createAccount: { + isFetching: false, + }, + getAccount: { + isFetching: false, + }, + putAccount: { + isFetching: false, + }, + getConfig: { + isFetching: false, + }, + createPayment: { + isFetching: false, + }, + getExchangeRates: { + isFetching: false, + }, + getTransactionHistory: { + isFetching: false, + } + }, + rates: {}, + } +}, action) => { + switch (action.type) { + case 'CREATE_WYRE_ACCOUNT': + case 'CREATE_WYRE_ACCOUNT_RESPONSE': + case 'GET_WYRE_ACCOUNT': + case 'GET_WYRE_ACCOUNT_RESPONSE': + case 'PUT_WYRE_ACCOUNT': + case 'PUT_WYRE_ACCOUNT_RESPONSE': + case 'GET_WYRE_CONFIG': + case 'GET_WYRE_CONFIG_RESPONSE': + case 'CREATE_WYRE_PAYMENT': + case 'CREATE_WYRE_PAYMENT_RESPONSE': + case 'GET_EXCHANGE_RATES': + case 'GET_EXCHANGE_RATES_RESPONSE': + case 'GET_TRANSACTION_HISTORY': + case 'GET_TRANSACTION_HISTORY_RESPONSE': + return { + ...state, + wyre: wyre(state.wyre, action), + }; + default: + return state; + } +}; + +export default paymentMethods; diff --git a/src/reducers/settings.js b/src/reducers/settings.js index 2efa945a..d7cd55ea 100644 --- a/src/reducers/settings.js +++ b/src/reducers/settings.js @@ -14,6 +14,7 @@ export const settings = (state = { generalWalletSettings: { maxTxCount: 10 }, + buySellSettings: {}, //e.g. {'user1': {buySellEnabled: true, wyreData: {}}, 'user2': {buySellEnabled: false, wyreData: {}}} coinSettings: {}, //e.g. {VRSC: {verificationLvl: 2, verificationLock: false}} }, action) => { switch (action.type) { @@ -59,10 +60,15 @@ export const settings = (state = { generalWalletSettings: action.state } case 'SET_COIN_SETTINGS_STATE': - return { - ...state, - coinSettings: action.coinSettings - } + return { + ...state, + coinSettings: action.coinSettings + } + case 'SET_BUY_SELL_SETTINGS_STATE': + return { + ...state, + wyreSettings: action.wyreSettings + } default: return state; } diff --git a/src/selectors/authentication.js b/src/selectors/authentication.js new file mode 100644 index 00000000..931f12e9 --- /dev/null +++ b/src/selectors/authentication.js @@ -0,0 +1,12 @@ +export const selectActiveAccount = (state) => ( + state.authentication.activeAccount +); + +export const selectPaymentMethod = (state, method) => { + const { paymentMethods } = state.authentication.activeAccount; + return paymentMethods && paymentMethods[method]; +}; + +export const selectWyrePaymentMethod = (state) => ( + selectPaymentMethod(state, 'wyre') +); diff --git a/src/selectors/paymentMethods.js b/src/selectors/paymentMethods.js new file mode 100644 index 00000000..1c029e4d --- /dev/null +++ b/src/selectors/paymentMethods.js @@ -0,0 +1,55 @@ +export const selectAccount = (state, method) => ( + state.paymentMethods[method].account +); + +export const selectWyreAccount = (state) => ( + selectAccount(state, 'wyre') +); + +export const selectWyreAccountField = (state, field) => ( + selectAccount(state, 'wyre').denormalizedProfileFields[field] +); + +export const selectAccountIsFetching = (state, action, method) => ( + state.paymentMethods[method].ui[action].isFetching +); + +export const selectWyreCreatePaymentIsFetching = (state) => ( + selectAccountIsFetching(state, 'createPayment', 'wyre') +); + +export const selectWyreGetAccountIsFetching = (state) => ( + selectAccountIsFetching(state, 'getAccount', 'wyre') +); + +export const selectWyreCreateAccountIsFetching = (state) => ( + selectAccountIsFetching(state, 'createAccount', 'wyre') +); + +export const selectWyrePutAccountIsFetching = (state) => ( + selectAccountIsFetching(state, 'putAccount', 'wyre') +); + +export const selectWyreGetConfigIsFetching = (state) => ( + selectAccountIsFetching(state, 'getConfig', 'wyre') +); + +export const selectWyreConfig = (state) => ( + state.paymentMethods.wyre.config +); + +export const selectExchangeRates = (state) => ( + state.paymentMethods.wyre.rates.data +); + +export const selectExchangeRatesIsFetching = (state) => ( + selectAccountIsFetching(state, 'getExchangeRates', 'wyre') +); + +export const selectTransactionHistoryIsFetching = (state) => ( + selectAccountIsFetching(state, 'getTransactionHistory', 'wyre') +); + +export const selectTransactionHistory = (state) => ( + state.paymentMethods.wyre.history +); \ No newline at end of file diff --git a/src/services/wyreService.js b/src/services/wyreService.js new file mode 100644 index 00000000..0a7ed313 --- /dev/null +++ b/src/services/wyreService.js @@ -0,0 +1,215 @@ +import axios from 'axios'; +import crypto from 'crypto'; +import RNFetchBlob from 'rn-fetch-blob'; + +import { WYRE_URL, WYRE_REFERRER_ACCOUNT_ID } from '../utils/constants'; + +const parseError = (error) => ( + error.response ? error.response.data.message : error.toString() +) + +class WyreService { + constructor(url, service) { + this.url = url; + this.service = service; + } + + static build() { + const service = axios.create({ + baseURL: WYRE_URL, + headers: { + 'Content-Type': 'application/json' + } + }); + return new WyreService(WYRE_URL, service); + } + + setHeader = (name, value) => { + this.service.defaults.headers.common[name] = value; + } + + setAuthorizationHeader = (token) => { + this.setHeader('Authorization', `Bearer ${token}`); + } + + submitAuthToken = async (secretKey) => ( + this.service.post( + `${this.url}/v2/sessions/auth/key`, + { secretKey }, + ) + ) + + createAccount = async (key) => { + try { + const wyreAccount = { + type: 'INDIVIDUAL', + country: 'US', + subaccount: false, + referrerAccountId: WYRE_REFERRER_ACCOUNT_ID, + }; + this.setAuthorizationHeader(key); + const { data } = await this.service.post(`${this.url}/v3/accounts`, wyreAccount); + return { + data, + key: key, + }; + } catch (error) { + return { + data: null, + error: parseError(error), + }; + } + } + + getAccount = async (id, key) => { + try { + this.setAuthorizationHeader(key); + const { data } = await this.service.get(`/v3/accounts/${id}`); + return { + data, + error: data.errorCode, + }; + } catch (error) { + return { + data: null, + error: parseError(error), + }; + } + } + + putAccount = async (id, key, updateObj) => { + try { + this.setAuthorizationHeader(key); + const { data } = await this.service.post(`/v3/accounts/${id}`, updateObj); + return { + data, + error: data.errorCode, + }; + } catch (error) { + return { + data: null, + error: parseError(error), + }; + } + } + + uploadDocument = async (id, key, field, uri, type) => { + try { + let { data } = await RNFetchBlob.fetch('POST', `${WYRE_URL}/v3/accounts/${id}/${field}`, { + Authorization: `Bearer ${key}`, + 'Content-Type': type, + }, RNFetchBlob.wrap(uri)); + + if (data !== '') { + data = JSON.parse(data); + } else { + data = {}; + } + + return { + data, + error: data.errorCode, + }; + } catch (error) { + return { + data: null, + error: parseError(error), + }; + } + } + + createPaymentMethod = async (key, publicToken) => { + try { + this.setAuthorizationHeader(key); + const paymentMethod = { + publicToken, + paymentMethodType: 'LOCAL_TRANSFER', + country: 'US', + }; + + const { data } = await this.service.post('/v2/paymentMethods', paymentMethod); + return { + data, + error: data.errorCode, + }; + } catch (error) { + return { + data: null, + error: parseError(error), + }; + } + } + + getPaymentMethods = async (key) => { + try { + this.setAuthorizationHeader(key); + const { data } = await this.service.get('/v2/paymentMethods'); + return { + data: data && data.data, + error: data.errorCode, + }; + } catch (error) { + return { + data: null, + error: parseError(error), + }; + } + } + + createTransfer = async (key, source, fromCurr, fromVal, dest, toCurr) => { + try { + this.setAuthorizationHeader(key); + const transfer = { + source, + sourceCurrency: fromCurr, + sourceAmount: fromVal, + dest, + destCurrency: toCurr, + autoConfirm: true + }; + + const { data } = await this.service.post('/v3/transfers', transfer); + return { + data, + error: data.errorCode, + }; + } catch (error) { + return { + data: null, + error: parseError(error), + }; + } + } + getRates = async () => { + try { + const data = await this.service.get(`${this.url}/v3/rates`) + return { + data: data, + error: false, + }; + } catch (error) { + return { + data: null, + error: parseError(error) + }; + } + } + getTransactions = async (key) => { + try { + this.setAuthorizationHeader(key); + const { data } = await this.service.get(`${this.url}/v3/transfers`) + return { + data: data, + error: false, + }; + } catch (error) { + return { + data: null, + error: parseError(error) + }; + } + } +} + + +export default WyreService; diff --git a/src/store/index.js b/src/store/index.js index a36c491e..456b352a 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,4 +1,5 @@ -import { createStore } from 'redux' +import { createStore, applyMiddleware } from 'redux'; +import thunk from 'redux-thunk'; import rootReducer from '../reducers/index' -export default store = createStore(rootReducer) \ No newline at end of file +export default store = createStore(rootReducer, applyMiddleware(thunk)) diff --git a/src/symbols/button1.js b/src/symbols/button1.js index 739f6516..b8b79b21 100644 --- a/src/symbols/button1.js +++ b/src/symbols/button1.js @@ -2,21 +2,40 @@ import React, { Component } from "react"; import { View, TouchableOpacity, Text, StyleSheet } from "react-native"; export default class button1 extends Component { - + constructor(props) { + super(props); + this.state = { + onPressingInProgress: false, + }; + } static containerStyle = { height: 44, width: 100, defaultHeight: "fixed", defaultWidth: "auto" }; + + _onPress = (e) => { + this.setState({ + onPressingInProgress: true + }, () => { + this.props.onPress(e) + this.setState({ + onPressingInProgress: false + }) + }) + } + + render() { return ( - - + {this.props.buttonContent ? this.props.buttonContent : "Button"} @@ -35,9 +54,11 @@ const styles = StyleSheet.create({ borderRadius: 5 }, buttonContent: { - fontSize: 18, - //fontWeight: "500", - //fontFamily: "Roboto", - color: "#fff" - } + fontSize: 16, + color: "#fff", + fontFamily: 'Avenir-Black', + }, + newOne: { + opacity: 0.7, + }, }); diff --git a/src/symbols/button10.js b/src/symbols/button10.js index 9cddf9f6..0e96a048 100644 --- a/src/symbols/button10.js +++ b/src/symbols/button10.js @@ -2,44 +2,46 @@ import React, { Component } from "react"; import { View, TouchableOpacity, Text, StyleSheet } from "react-native"; export default class button10 extends Component { - // Only for displaying symbol in BuilderX. - static containerStyle = { - height: 36, - width: 100, - defaultHeight: "fixed", - defaultWidth: "auto" - }; - render() { - return ( - - BUTTON - - ); - } + // Only for displaying symbol in BuilderX. + static containerStyle = { + height: 36, + width: 100, + defaultHeight: "fixed", + defaultWidth: "auto" + }; + render() { + return ( < + TouchableOpacity style = { + [styles.root, this.props.style] } > + < + Text style = { styles.buttonContent } > BUTTON < /Text> < + /TouchableOpacity> + ); + } } const styles = StyleSheet.create({ - root: { - elevation: 2, - flexDirection: "row", - alignItems: "center", - justifyContent: "center", - backgroundColor: "#2196F3", - paddingRight: 16, - paddingLeft: 16, - minWidth: 88, - borderRadius: 2, - shadowColor: "#000", - shadowOffset: { - width: 0, - height: 1 + root: { + elevation: 2, + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + backgroundColor: "#2196F3", + paddingRight: 16, + paddingLeft: 16, + minWidth: 88, + borderRadius: 2, + shadowColor: "#000", + shadowOffset: { + width: 0, + height: 1 + }, + shadowOpacity: 0.35, + shadowRadius: 5 }, - shadowOpacity: 0.35, - shadowRadius: 5 - }, - buttonContent: { - fontSize: 14, - fontWeight: "200", - fontFamily: "Roboto", - color: "#fff" - } -}); + buttonContent: { + fontSize: 14, + fontWeight: "200", + fontFamily: "Avenir", + color: "#fff" + } +}); \ No newline at end of file diff --git a/src/symbols/button2.js b/src/symbols/button2.js index cacf7b07..65ed04b7 100644 --- a/src/symbols/button2.js +++ b/src/symbols/button2.js @@ -2,44 +2,46 @@ import React, { Component } from "react"; import { View, TouchableOpacity, Text, StyleSheet } from "react-native"; export default class button2 extends Component { - // Only for displaying symbol in BuilderX. - static containerStyle = { - height: 32, - width: 100, - defaultHeight: "fixed", - defaultWidth: "auto" - }; - render() { - return ( - - BUTTON - - ); - } + // Only for displaying symbol in BuilderX. + static containerStyle = { + height: 32, + width: 100, + defaultHeight: "fixed", + defaultWidth: "auto" + }; + render() { + return ( < + TouchableOpacity style = { + [styles.root, this.props.style] } > + < + Text style = { styles.buttonContent } > BUTTON < /Text> < + /TouchableOpacity> + ); + } } const styles = StyleSheet.create({ - root: { - elevation: 2, - flexDirection: "row", - alignItems: "center", - justifyContent: "center", - backgroundColor: "#3F51B5", - paddingRight: 16, - paddingLeft: 16, - minWidth: 88, - borderRadius: 2, - shadowColor: "#000", - shadowOffset: { - width: 0, - height: 1 + root: { + elevation: 2, + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + backgroundColor: "#3F51B5", + paddingRight: 16, + paddingLeft: 16, + minWidth: 88, + borderRadius: 2, + shadowColor: "#000", + shadowOffset: { + width: 0, + height: 1 + }, + shadowOpacity: 0.35, + shadowRadius: 5 }, - shadowOpacity: 0.35, - shadowRadius: 5 - }, - buttonContent: { - fontSize: 13, - fontWeight: "200", - fontFamily: "Roboto", - color: "#fff" - } -}); + buttonContent: { + fontSize: 13, + fontWeight: "200", + fontFamily: "Avenir", + color: "#fff" + } +}); \ No newline at end of file diff --git a/src/tests/helpers/MockAuthData.js b/src/tests/helpers/MockAuthData.js index 130e85e6..5b5b45b5 100644 --- a/src/tests/helpers/MockAuthData.js +++ b/src/tests/helpers/MockAuthData.js @@ -1,3 +1,5 @@ +import { setFetchParams } from './SetFetchParams' + export const MOCK_USER_OBJ = { id: 'AzureDiamond', seed: 'hunter2', @@ -63,97 +65,59 @@ export const MOCK_USER_OBJ_BALANCE_SMALL_KMD = { } } -export const MOCK_ACTIVE_COINS_FOR_USER = [ - { - id: "VRSC", - name: "Verus Coin", - description: "Verus Coin includes the first proven 51% hash attack resistant proof of power algorithm. The Verus vision is PBaaS, public blockchains as a service, provisioned for conditional rewards by Verus miners and stakers.", - fee: 10000, - users: [ - 'AzureDiamond', - 'Random address with balance of ~3000 VRSC taken from https://dexstats.info/richlist.php?asset=VRSC on July 31st, 2019', - 'VRSC Richlist #2 Address at https://dexstats.info/richlist.php?asset=VRSC as of July 31st, 2019'], - serverList: [ - 'el0.vrsc.0x03.services:10000:tcp', - 'el1.vrsc.0x03.services:10000:tcp', - ], - apps: { - wallet: { - title: 'VRSC Wallet', - data: [ - { - screen: 'Overview', - icon: 'account-balance-wallet', - name: 'Overview', - key: 'wallet-overview', - color: '#2E86AB' - //Blue - }, - { - screen: 'SendCoin', - icon: 'arrow-upward', - name: 'Send', - key: 'wallet-send', - color: '#EDAE49' - //Orange - }, - { - screen: 'ReceiveCoin', - icon: 'arrow-downward', - name: 'Receive', - key: 'wallet-receive', - color: '#009B72' - //Green - } - ] - } - }, - logo: "" +/** + * Returns an active coin object for test users for one function call. The function call + * result will depend on the inputs to this temporary active coin object. + * @param {String} coinID Coin ticker for coin being used. + * @param {Boolean} callsSucceed Determines whether or not server calls made by this active coin will succeed + * @param {Integer} code Determines the code result of each http call made for this active coin. + * @param {*} params The parameter array to be fed to the mock function being used, which depends on the electrum call being made. + * Refer to __mocks__/react-native-fetch/mocked_results to see all the options. + * @param {*} errorMsg (Optional) Error message returned if the call fails with an error. + */ +export const getTempActiveCoin = (coinID, callsSucceed, code, params, errorMsg = '') => {return ({ + id: coinID, + name: "Test Coin", + description: "Coin for testing", + fee: 10000, + users: [ + 'AzureDiamond', + 'Random address with balance of ~3000 VRSC taken from https://dexstats.info/richlist.php?asset=VRSC on July 31st, 2019', + 'VRSC Richlist #2 Address at https://dexstats.info/richlist.php?asset=VRSC as of July 31st, 2019'], + serverList: setFetchParams(callsSucceed, code, params, false, errorMsg), + apps: { + wallet: { + title: 'VRSC Wallet', + data: [ + { + screen: 'Overview', + icon: 'account-balance-wallet', + name: 'Overview', + key: 'wallet-overview', + color: '#2E86AB' + //Blue + }, + { + screen: 'SendCoin', + icon: 'arrow-upward', + name: 'Send', + key: 'wallet-send', + color: '#EDAE49' + //Orange + }, + { + screen: 'ReceiveCoin', + icon: 'arrow-downward', + name: 'Receive', + key: 'wallet-receive', + color: '#009B72' + //Green + } + ] + } }, - { - id: "KMD", - name: "Komodo", - description: "", - fee: 10000, - users: ['AzureDiamond'], - serverList: [ - 'electrum1.cipig.net:10001:tcp', - 'electrum2.cipig.net:10001:tcp', - ], - apps: { - wallet: { - title: 'Komodo Wallet', - data: [ - { - screen: 'Overview', - icon: 'account-balance-wallet', - name: 'Overview', - key: 'wallet-overview', - color: '#2E86AB' - //Blue - }, - { - screen: 'SendCoin', - icon: 'arrow-upward', - name: 'Send', - key: 'wallet-send', - color: '#EDAE49' - //Orange - }, - { - screen: 'ReceiveCoin', - icon: 'arrow-downward', - name: 'Receive', - key: 'wallet-receive', - color: '#009B72' - //Green - } - ] - } - }, - logo: "" - } -] + logo: "" +})} export const MOCK_PIN = '12345' export const MOCK_SEED = 'hunter2' diff --git a/src/tests/helpers/MockServerData.js b/src/tests/helpers/MockServerData.js index 6ab7f9ca..ab1389d7 100644 --- a/src/tests/helpers/MockServerData.js +++ b/src/tests/helpers/MockServerData.js @@ -1,8 +1 @@ -export const MOCK_ELECTRUM_SERVER_OBJ = { - ip: 'el0.vrsc.0x03.services', - port: 10000, - proto: 'tcp' -} - -export const MOCK_PROXY_SERVER_HTTPS = 'el0.vrsc.0x03.services' -export const MOCK_PROXY_SERVER_HTTP = '94.130.225.86:80' \ No newline at end of file +export const MOCK_PROXY_SERVER = 'mock.proxy.server' \ No newline at end of file diff --git a/src/tests/helpers/SetFetchParams.js b/src/tests/helpers/SetFetchParams.js new file mode 100644 index 00000000..fc219162 --- /dev/null +++ b/src/tests/helpers/SetFetchParams.js @@ -0,0 +1,24 @@ +/** + * This function returns an electrum server string or object to be parsed by the jest 'fetch' mock function. The fetch result will + * depend on the inputs here. + * @param {Boolean} success Whether or not the call succeeds. + * @param {Integer} code What http code the call returns with. + * @param {Object} params The object that holds multiple different electrum calls and their paramters, e.g. {server_version: ["ElectrumX 13.0.8", 1.4], getcurrentblock: [140322]}. + * Refer to __mocks__/react-native-fetch/mocked_results to see all the possible commands and parameters for them. + * @param {String} error_msg (Optional) Error message returned if the call fails with an error. + * @param {Boolean} format_server (Optional, default = false) Determines if the test servers will be returned in formatted {ip:<>, port:<>, proto:<>} + * format, or if they will be returned as an array of server strings. Default is array of server strings. + */ +export const setFetchParams = (success, code, params = {}, format_server = false, error_msg = '') => { + const ip_obj = { + success, + code, + params, + format_server, + error_msg + } + + + const test_server_ip = JSON.stringify(ip_obj).replace(/:/g, '|') + return format_server ? {ip: test_server_ip, port: 12345, proto: 'tcp'} : [`${test_server_ip}:12345:tcp`, `${test_server_ip}:12345:tcp`] +} \ No newline at end of file diff --git a/src/utils/CoinData.js b/src/utils/CoinData.js index e95458b6..09d3d173 100644 --- a/src/utils/CoinData.js +++ b/src/utils/CoinData.js @@ -1,7 +1,8 @@ import { electrumServers } from 'agama-wallet-lib/src/electrum-servers'; import { MAX_VERIFICATION } from '../utils/constants' +import Colors from '../globals/colors' -const getDefaultApps = (coinName) => { +const getDefaultApps = (coinName, canBuySell = false) => { return ({ defaultApp: 'wallet', apps: { @@ -13,15 +14,15 @@ const getDefaultApps = (coinName) => { icon: 'account-balance-wallet', name: 'Overview', key: 'wallet-overview', - color: '#2E86AB' - //Blue + color: Colors.primaryColor + //Verus Blue }, { screen: 'SendCoin', icon: 'arrow-upward', name: 'Send', key: 'wallet-send', - color: '#EDAE49' + color: Colors.infoButtonColor //Orange }, { @@ -29,7 +30,7 @@ const getDefaultApps = (coinName) => { icon: 'arrow-downward', name: 'Receive', key: 'wallet-receive', - color: '#009B72' + color: Colors.successButtonColor //Green } ] @@ -40,8 +41,7 @@ const getDefaultApps = (coinName) => { export const explorers = { KMD: 'https://kmdexplorer.io', OOT: 'https://explorer.utrum.io', - VRSC: 'https://explorer.veruscoin.io', - K64: 'https://k64.explorer.dexstats.info' + VRSC: 'https://explorer.veruscoin.io' } export const defaultAssetsPath = { @@ -58,7 +58,6 @@ export const defaultAssetsPath = { zilla: require('../images/cryptologo/default/zilla.png'), ltc: require('../images/cryptologo/default/ltc.png'), ccl: require('../images/cryptologo/default/ccl.png'), - k64: require('../images/cryptologo/default/k64.png'), default: require('../images/cryptologo/default_chain.png') }, }; @@ -85,8 +84,7 @@ export const coinsList = { zec: { id: "ZEC", name: "ZCash", description: "", fee: 10000}, dash: { id: "DASH", name: "Dash", description: "", fee: 10000}, ltc: { id: "LTC", name: "Litecoin", description: "", fee: 30000}, - zilla: { id: "ZILLA", name: "ChainZilla", description: "The native token of Chainzilla Blockchain Solutions. They are a blockchain consulting company that develops easy to use whitelabel blockchain wallets and applications.", fee: 10000}, - k64: { id: "K64", name: "Komodore64", description: "", fee: 10000} + zilla: { id: "ZILLA", name: "ChainZilla", description: "The native token of Chainzilla Blockchain Solutions. They are a blockchain consulting company that develops easy to use whitelabel blockchain wallets and applications.", fee: 10000} }; //To make flatlist render faster @@ -100,7 +98,7 @@ export const findCoinObj = (id, userName) => { if (coinObj) { coinObj.serverList = electrumServers[id.toLowerCase()].serverList; coinObj.logo = defaultAssetsPath.coinLogo[id.toLowerCase()]; - coinObj.users = [userName]; + coinObj.users = userName != null ? [userName] : []; if (!coinObj.apps || Object.keys(coinObj.apps).length === 0) { const DEFAULT_APPS = getDefaultApps(coinObj.name) diff --git a/src/utils/__tests__/int/Ledger.int.test.js b/src/utils/__tests__/int/Ledger.int.test.js index ed2a65d2..e65a4089 100644 --- a/src/utils/__tests__/int/Ledger.int.test.js +++ b/src/utils/__tests__/int/Ledger.int.test.js @@ -1,7 +1,6 @@ jest.setTimeout(60000) import { - MOCK_ACTIVE_COINS_FOR_USER, MOCK_USER_OBJ, MOCK_USER_OBJ_BALANCE_SMALL_VRSC } from '../../../tests/helpers/MockAuthData' @@ -14,18 +13,45 @@ import { fetchTransactionsForCoin } from '../../../actions/actionCreators' +import { + getTempActiveCoin, +} from '../../../tests/helpers/MockAuthData' + +import { proxyServersHttps, proxyServersHttp } from 'agama-wallet-lib/src/electrum-servers' +jest.mock('agama-wallet-lib/src/electrum-servers') + describe('Transaction action creator', () => { it('can fetch and format VRSC transactions for an empty user', () => { - return fetchTransactionsForCoin([], MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_USER_OBJ, MOCK_NEEDS_UPDATE_OBJ.transactions) - .then(res => { + return fetchTransactionsForCoin([], getTempActiveCoin('VRSC', true, 200, {listtransactions: [0], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_USER_OBJ, MOCK_NEEDS_UPDATE_OBJ.transactions) + .then(action => { + expect(action).toHaveProperty('type') + expect(action).toHaveProperty('transactions') + expect(action.transactions).toHaveProperty('VRSC') + expect(action).toHaveProperty('needsUpdateObj') + expect(action.type).toBe('SET_TRANSACTIONS') + expect(Array.isArray(action.transactions)).toBe(true) + expect(typeof action.needsUpdateObj).toBe('object') + + expect(action.transactions.VRSC.length).toBe(0) + expect(typeof action.needsUpdateObj).toBe('object') }) }) it('can fetch and format VRSC transactions for a non empty user', () => { - return fetchTransactionsForCoin([], MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_USER_OBJ_BALANCE_SMALL_VRSC, MOCK_NEEDS_UPDATE_OBJ.transactions) - .then(res => { - console.log(res.transactions) + return fetchTransactionsForCoin([], getTempActiveCoin('VRSC', true, 200, {getblockinfo: [], gettransaction: [], listtransactions: [10], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_USER_OBJ_BALANCE_SMALL_VRSC, MOCK_NEEDS_UPDATE_OBJ.transactions) + .then(action => { + expect(action).toHaveProperty('type') + expect(action).toHaveProperty('transactions') + expect(action.transactions).toHaveProperty('VRSC') + expect(action).toHaveProperty('needsUpdateObj') + + expect(action.type).toBe('SET_TRANSACTIONS') + expect(Array.isArray(action.transactions.VRSC)).toBe(true) + expect(typeof action.needsUpdateObj).toBe('object') + + expect(action.transactions.VRSC.length).toBe(10) + expect(typeof action.needsUpdateObj).toBe('object') }) }) }) \ No newline at end of file diff --git a/src/utils/__tests__/int/getBalances.int.test.js b/src/utils/__tests__/int/getBalances.int.test.js index d27a85f8..f383e1d3 100644 --- a/src/utils/__tests__/int/getBalances.int.test.js +++ b/src/utils/__tests__/int/getBalances.int.test.js @@ -6,11 +6,24 @@ import { } from '../../httpCalls/callCreators' import { - MOCK_ACTIVE_COINS_FOR_USER, + getTempActiveCoin, MOCK_USER_OBJ } from '../../../tests/helpers/MockAuthData' +import { proxyServersHttps, proxyServersHttp } from 'agama-wallet-lib/src/electrum-servers' +jest.mock('agama-wallet-lib/src/electrum-servers') + describe('Balance fetcher for BTC based chains', () => { + const CONFIRMED_BALANCE_VRSC = 2500 + const UNCONFIRMED_BALANCE_VRSC = 3000 + const CONFIRMED_BALANCE_KMD = 10000 + const UNCONFIRMED_BALANCE_KMD = 12345 + + const MOCK_ACTIVE_COINS_FOR_USER = [ + getTempActiveCoin('VRSC', true, 200, {getbalance: [CONFIRMED_BALANCE_VRSC, UNCONFIRMED_BALANCE_VRSC], getcurrentblock: [118329], server_version: ["ElectrumX"]}), + getTempActiveCoin('KMD', true, 200, {getbalance: [CONFIRMED_BALANCE_KMD, UNCONFIRMED_BALANCE_KMD], getcurrentblock: [118329], server_version: ["ElectrumX 13.0.6, 1.4"]}), + ] + it('can get a single balance for a mock user', () => { return getOneBalance({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_USER_OBJ) .then((res) => { diff --git a/src/utils/__tests__/int/getBlockInfo.int.test.js b/src/utils/__tests__/int/getBlockInfo.int.test.js index 8016ce79..792e1470 100644 --- a/src/utils/__tests__/int/getBlockInfo.int.test.js +++ b/src/utils/__tests__/int/getBlockInfo.int.test.js @@ -5,22 +5,24 @@ import { } from '../../httpCalls/callCreators' import { - MOCK_ACTIVE_COINS_FOR_USER, - MOCK_USER_OBJ + getTempActiveCoin, } from '../../../tests/helpers/MockAuthData' +import { proxyServersHttps, proxyServersHttp } from 'agama-wallet-lib/src/electrum-servers' +jest.mock('agama-wallet-lib/src/electrum-servers') + //TODO: Test for different server version behaviour describe('Block info fetcher for BTC based chains', () => { it('can fetch block info with mock user', () => { - return getBlockInfo({}, MOCK_ACTIVE_COINS_FOR_USER[0], 0) + return getBlockInfo({}, getTempActiveCoin('VRSC', true, 200, {getblockinfo: [136264], getcurrentblock: [118329], server_version: ["ElectrumX"]}), 0) .then((res) => { expect(res).toHaveProperty('result') expect(res).toHaveProperty('blockHeight') expect(res).toHaveProperty('serverUsed') expect(res).toHaveProperty('serverVersion') - expect(res.result.block_height).toBe(0) + expect(res.result.block_height).toBe(136264) }) }) }) \ No newline at end of file diff --git a/src/utils/__tests__/int/getMerkle.int.test.js b/src/utils/__tests__/int/getMerkle.int.test.js index 06496f52..07bccf7f 100644 --- a/src/utils/__tests__/int/getMerkle.int.test.js +++ b/src/utils/__tests__/int/getMerkle.int.test.js @@ -6,16 +6,19 @@ import { } from '../../httpCalls/callCreators' import { - MOCK_ACTIVE_COINS_FOR_USER, + getTempActiveCoin, } from '../../../tests/helpers/MockAuthData' +import { proxyServersHttps, proxyServersHttp } from 'agama-wallet-lib/src/electrum-servers' +jest.mock('agama-wallet-lib/src/electrum-servers') + import { MOCK_TX } from '../../../tests/helpers/MockChainInfo' describe('Merkle info fetcher for BTC based chains (root and hashes)', () => { it('can fetch merkle root from specific txid and height', () => { - return getMerkleRoot({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_TX.id, MOCK_TX.height, []) + return getMerkleRoot({}, getTempActiveCoin('VRSC', true, 200, {getmerkle: [204832, '9f01c1d5f7fd67ec40d45e3c81006e18e6239a3b54d6a78e99c2c28cc3915558'], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_TX.id, MOCK_TX.height, []) .then((res) => { expect(res).toHaveProperty('result') expect(res).toHaveProperty('blockHeight') @@ -29,7 +32,7 @@ describe('Merkle info fetcher for BTC based chains (root and hashes)', () => { }) it('can fetch merkle hashes', () => { - return getMerkleHashes({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_TX.id, MOCK_TX.height, []) + return getMerkleHashes({}, getTempActiveCoin('VRSC', true, 200, {getmerkle: [204832, '9f01c1d5f7fd67ec40d45e3c81006e18e6239a3b54d6a78e99c2c28cc3915558'], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_TX.id, MOCK_TX.height, []) .then(res => { expect(res).toHaveProperty('result') expect(res).toHaveProperty('blockHeight') diff --git a/src/utils/__tests__/int/getServerVersion.int.test.js b/src/utils/__tests__/int/getServerVersion.int.test.js index 6e9a3d29..e214bd38 100644 --- a/src/utils/__tests__/int/getServerVersion.int.test.js +++ b/src/utils/__tests__/int/getServerVersion.int.test.js @@ -5,17 +5,21 @@ import { } from '../../httpCalls/electrumCalls/getServerVersion' import { - MOCK_ELECTRUM_SERVER_OBJ, - MOCK_PROXY_SERVER_HTTPS + setFetchParams +} from '../../../tests/helpers/SetFetchParams' + +import { + MOCK_PROXY_SERVER } from '../../../tests/helpers/MockServerData' describe('Server version fetch functions for electrum servers', () => { it ('can fetch and parse a server\'s version', () => { + const mockServer = setFetchParams(true, 200, {server_version: ["ElectrumX 1.13.0", 1.4]}, true) return getServerVersion( - MOCK_PROXY_SERVER_HTTPS, - MOCK_ELECTRUM_SERVER_OBJ.ip, - MOCK_ELECTRUM_SERVER_OBJ.port, - MOCK_ELECTRUM_SERVER_OBJ.proto) + MOCK_PROXY_SERVER, + mockServer.ip, + mockServer.port, + mockServer.proto) .then(res => { expect(res).not.toBeNaN() }) diff --git a/src/utils/__tests__/int/getTransaction.int.test.js b/src/utils/__tests__/int/getTransaction.int.test.js index 7a5be03c..a5ab5a28 100644 --- a/src/utils/__tests__/int/getTransaction.int.test.js +++ b/src/utils/__tests__/int/getTransaction.int.test.js @@ -4,17 +4,20 @@ import { getOneTransaction } from '../../httpCalls/callCreators' -import { - MOCK_ACTIVE_COINS_FOR_USER, -} from '../../../tests/helpers/MockAuthData' - import { MOCK_TX } from '../../../tests/helpers/MockChainInfo' +import { + getTempActiveCoin, +} from '../../../tests/helpers/MockAuthData' + +import { proxyServersHttps, proxyServersHttp } from 'agama-wallet-lib/src/electrum-servers' +jest.mock('agama-wallet-lib/src/electrum-servers') + describe('TxInfo fetcher for BTC based coins', () => { it('can fetch TxInfo for one transaction based on txid', () => { - return getOneTransaction({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_TX.id) + return getOneTransaction({}, getTempActiveCoin('VRSC', true, 200, {gettransaction: ['cfa84868e18825fe626f6ce805ee506ec266e61dfa39ed6d281e037909f480b4'], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_TX.id) .then(res => { expect(res).toHaveProperty('result') expect(res).toHaveProperty('blockHeight') diff --git a/src/utils/__tests__/int/getTransactions.int.test.js b/src/utils/__tests__/int/getTransactions.int.test.js index 8ba36d3c..c66ecdf3 100644 --- a/src/utils/__tests__/int/getTransactions.int.test.js +++ b/src/utils/__tests__/int/getTransactions.int.test.js @@ -5,14 +5,20 @@ import { } from '../../httpCalls/callCreators' import { - MOCK_ACTIVE_COINS_FOR_USER, MOCK_USER_OBJ, MOCK_USER_OBJ_BALANCE_SMALL_VRSC } from '../../../tests/helpers/MockAuthData' +import { + getTempActiveCoin, +} from '../../../tests/helpers/MockAuthData' + +import { proxyServersHttps, proxyServersHttp } from 'agama-wallet-lib/src/electrum-servers' +jest.mock('agama-wallet-lib/src/electrum-servers') + describe('TxList fetcher for BTC based coins', () => { it('can fetch TxList for empty user', () => { - return getOneTransactionList({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_USER_OBJ) + return getOneTransactionList({}, getTempActiveCoin('VRSC', true, 200, {listtransactions: [0], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_USER_OBJ) .then(res => { expect(res).toHaveProperty('result') expect(res).toHaveProperty('blockHeight') @@ -25,26 +31,12 @@ describe('TxList fetcher for BTC based coins', () => { }) it('can fetch TxList for user with small # of transactions', () => { - return getOneTransactionList({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_USER_OBJ_BALANCE_SMALL_VRSC) - .then(res => { - expect(res).toHaveProperty('result') - expect(res).toHaveProperty('blockHeight') - expect(res).toHaveProperty('serverUsed') - expect(res).toHaveProperty('serverVersion') - - expect(res.result).not.toHaveProperty('error') - expect(typeof res.result).toBe('object') - }) - }) - - it('can fetch TxList of size 15 for user with small # of transactions', () => { - return getOneTransactionList({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_USER_OBJ_BALANCE_SMALL_VRSC, 15) + return getOneTransactionList({}, getTempActiveCoin('VRSC', true, 200, {listtransactions: [10], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_USER_OBJ_BALANCE_SMALL_VRSC) .then(res => { expect(res).toHaveProperty('result') expect(res).toHaveProperty('blockHeight') expect(res).toHaveProperty('serverUsed') expect(res).toHaveProperty('serverVersion') - expect(res.result.length).toBe(15) expect(res.result).not.toHaveProperty('error') expect(typeof res.result).toBe('object') diff --git a/src/utils/__tests__/int/getUnspent.int.test.js b/src/utils/__tests__/int/getUnspent.int.test.js index b2cbd4bc..d68d4dfd 100644 --- a/src/utils/__tests__/int/getUnspent.int.test.js +++ b/src/utils/__tests__/int/getUnspent.int.test.js @@ -6,15 +6,21 @@ import { } from '../../httpCalls/callCreators' import { - MOCK_ACTIVE_COINS_FOR_USER, MOCK_USER_OBJ_BALANCE_LARGE_VRSC, MOCK_USER_OBJ_BALANCE_SMALL_VRSC, MOCK_USER_OBJ_BALANCE_SMALL_KMD } from '../../../tests/helpers/MockAuthData' +import { + getTempActiveCoin, +} from '../../../tests/helpers/MockAuthData' + +import { proxyServersHttps, proxyServersHttp } from 'agama-wallet-lib/src/electrum-servers' +jest.mock('agama-wallet-lib/src/electrum-servers') + describe('Unspent utxo fetcher for BTC based coins', () => { it('can fetch unspent VRSC utxos for user', () => { - return getUnspent({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_USER_OBJ_BALANCE_LARGE_VRSC) + return getUnspent({}, getTempActiveCoin('VRSC', true, 200, {listunspent: [10], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_USER_OBJ_BALANCE_LARGE_VRSC) .then(res => { expect(res).toHaveProperty('result') expect(res).toHaveProperty('blockHeight') @@ -26,8 +32,9 @@ describe('Unspent utxo fetcher for BTC based coins', () => { }) }) - it('can fetch unspent VRSC utxos for user in formatted form from large address (>1000 UTXOS) without verification', () => { - return getUnspentFormatted({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_USER_OBJ_BALANCE_LARGE_VRSC, false, false, false) + + it('can fetch unspent VRSC utxos for user in formatted form from large address (1500 UTXOS) without verification', () => { + return getUnspentFormatted({}, getTempActiveCoin('VRSC', true, 200, {getblockinfo: [], getmerkle: [], listunspent: [1500], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_USER_OBJ_BALANCE_LARGE_VRSC, false, false, false) .then(res => { let _utxoList = res.utxoList expect(_utxoList.length).toBeGreaterThan(0) @@ -56,7 +63,7 @@ describe('Unspent utxo fetcher for BTC based coins', () => { }) it('can fetch unspent VRSC utxos for user in formatted form from small address with merkle verification only', () => { - return getUnspentFormatted({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_USER_OBJ_BALANCE_SMALL_VRSC, true, false, false) + return getUnspentFormatted({}, getTempActiveCoin('VRSC', true, 200, {getblockinfo: [], getmerkle: [], listunspent: [10], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_USER_OBJ_BALANCE_SMALL_VRSC, true, false, false) .then(res => { let _utxoList = res.utxoList @@ -85,7 +92,7 @@ describe('Unspent utxo fetcher for BTC based coins', () => { }) it('can fetch unspent VRSC utxos for user in formatted form from small address with txid verification only', () => { - return getUnspentFormatted({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_USER_OBJ_BALANCE_SMALL_VRSC, false, true, false) + return getUnspentFormatted({}, getTempActiveCoin('VRSC', true, 200, {getblockinfo: [], gettransaction: [], listunspent: [10], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_USER_OBJ_BALANCE_SMALL_VRSC, false, true, false) .then(res => { let _utxoList = res.utxoList @@ -114,7 +121,7 @@ describe('Unspent utxo fetcher for BTC based coins', () => { }) it('can fetch unspent VRSC utxos for user in formatted form from small address with txid and merkle verification', () => { - return getUnspentFormatted({}, MOCK_ACTIVE_COINS_FOR_USER[0], MOCK_USER_OBJ_BALANCE_SMALL_VRSC, true, true, false) + return getUnspentFormatted({}, getTempActiveCoin('VRSC', true, 200, {getblockinfo: [], getmerkle: [], gettransaction: [], listunspent: [10], getcurrentblock: [118329], server_version: ["ElectrumX"]}), MOCK_USER_OBJ_BALANCE_SMALL_VRSC, true, true, false) .then(res => { let _utxoList = res.utxoList @@ -142,8 +149,9 @@ describe('Unspent utxo fetcher for BTC based coins', () => { }) }) - it('can fetch unspent KMD utxos for user in formatted form from small address with interest', () => { - return getUnspentFormatted({}, MOCK_ACTIVE_COINS_FOR_USER[1], MOCK_USER_OBJ_BALANCE_SMALL_KMD, false, false, false) + //TODO: Add mock data in for Electrum server versions > 1.4 + /*it('can fetch unspent KMD utxos for user in formatted form from small address with interest', () => { + return getUnspentFormatted({}, getTempActiveCoin('KMD', true, 200, {listunspent: [10], gettransaction: [], getcurrentblock: [118329], server_version: ["ElectrumX 13.0.8", 1.4]}), MOCK_USER_OBJ_BALANCE_SMALL_KMD, false, false, false) .then(res => { let _utxoList = res.utxoList @@ -172,7 +180,7 @@ describe('Unspent utxo fetcher for BTC based coins', () => { }) it('can fetch unspent KMD utxos for user in formatted form from small address without interest', () => { - return getUnspentFormatted({}, MOCK_ACTIVE_COINS_FOR_USER[1], MOCK_USER_OBJ_BALANCE_SMALL_KMD, false, false, true) + return getUnspentFormatted({}, getTempActiveCoin('KMD', 'listunspent', true, 200, [10]), MOCK_USER_OBJ_BALANCE_SMALL_KMD, false, false, true) .then(res => { let _utxoList = res.utxoList @@ -198,5 +206,5 @@ describe('Unspent utxo fetcher for BTC based coins', () => { expect(res).not.toHaveProperty('error') expect(typeof res).toBe('object') }) - }) + })*/ }) \ No newline at end of file diff --git a/src/utils/__tests__/unit/CoinData.unit.test.js b/src/utils/__tests__/unit/CoinData.unit.test.js index 002e0762..e655edb5 100644 --- a/src/utils/__tests__/unit/CoinData.unit.test.js +++ b/src/utils/__tests__/unit/CoinData.unit.test.js @@ -7,6 +7,8 @@ import { MOCK_USER_OBJ } from '../../../tests/helpers/MockAuthData' +jest.unmock('agama-wallet-lib/src/electrum-servers') + describe('Main coin data functions', () => { it('can find coin from pre-existing coins list and create coin obj', () => { let coinObj = findCoinObj('VRSC', MOCK_USER_OBJ.id) diff --git a/src/utils/__tests__/unit/getBlockHeight.unit.test.js b/src/utils/__tests__/unit/getBlockHeight.unit.test.js index 909aa8f3..05a6cd97 100644 --- a/src/utils/__tests__/unit/getBlockHeight.unit.test.js +++ b/src/utils/__tests__/unit/getBlockHeight.unit.test.js @@ -1,13 +1,16 @@ import { - MOCK_ELECTRUM_SERVER_OBJ, - MOCK_PROXY_SERVER_HTTPS + MOCK_PROXY_SERVER } from '../../../tests/helpers/MockServerData' +import { + setFetchParams +} from '../../../tests/helpers/SetFetchParams' + import { getBlockHeight } from '../../httpCalls/callCreators' describe('Function to fetch blockheight', () => { it('can fetch blockheight from specified electrum and proxy server', () => { - return getBlockHeight(MOCK_PROXY_SERVER_HTTPS, MOCK_ELECTRUM_SERVER_OBJ) + return getBlockHeight(MOCK_PROXY_SERVER, setFetchParams(true, 200, {getcurrentblock: [200000]}, true)) .then((res) => { expect(res).toHaveProperty('msg') expect(res).toHaveProperty('result') diff --git a/src/utils/asyncStore/authDataStorage.js b/src/utils/asyncStore/authDataStorage.js index b8d49561..919de02d 100644 --- a/src/utils/asyncStore/authDataStorage.js +++ b/src/utils/asyncStore/authDataStorage.js @@ -25,7 +25,7 @@ export const storeUser = (authData, users) => { resolve(_users); }) .catch(err => reject(err)); - }) + }) }; //Delete user by user ID and return new user array @@ -36,12 +36,12 @@ export const deleteUser = (userID) => { let _users = res ? JSON.parse(res).users : []; if(userID !== null) { let userIndex = _users.findIndex(n => n.id === userID); - + if (userIndex > -1) { _users.splice(userIndex, 1); let _toStore = {users: _users} let promiseArr = [ - AsyncStorage.setItem('userData', JSON.stringify(_toStore)), + AsyncStorage.setItem('userData', JSON.stringify(_toStore)), deleteUserFromCoin(userID, null), _users] return Promise.all(promiseArr) @@ -73,7 +73,7 @@ export const resetUserPwd = (userID, newPwd, oldPwd) => { let _users = res ? JSON.parse(res).users : []; if(userID !== null) { let userIndex = _users.findIndex(n => n.id === userID); - + if (userIndex > -1) { const _oldEncryptedKey = _users[userIndex].encryptedKey const _decryptedKey = decryptkey(oldPwd, _oldEncryptedKey) @@ -88,7 +88,7 @@ export const resetUserPwd = (userID, newPwd, oldPwd) => { Alert.alert("Authentication Error", "incorrect password") return "error"; } - + } else { Alert.alert("Error", "User with ID " + userID + " not found") return "error" @@ -113,6 +113,48 @@ export const resetUserPwd = (userID, newPwd, oldPwd) => { }); }; +export const putUserPaymentMethods = async (user, paymentMethods) => { + const encryptedPaymentMethods = encryptkey(user.wifKey, JSON.stringify(paymentMethods)) + return await putUser(user.id, { + paymentMethods: encryptedPaymentMethods, + }) +} + +export const putUser = (userID, userParams) => { + return new Promise((resolve, reject) => { + AsyncStorage.getItem('userData') + .then(res => { + const _users = res ? JSON.parse(res).users : []; + if(userID !== null) { + let userIndex = _users.findIndex(n => n.id === userID); + + if (userIndex > -1) { + _users[userIndex] = { + ..._users[userIndex], + ...userParams, + } + const _toStore = { users: _users } + const promiseArr = [AsyncStorage.setItem('userData', JSON.stringify(_toStore)), _users] + return Promise.all(promiseArr) + } + } + return 'error' + }) + .then((res) => { + if (res === "error") { + resolve(false); + } else if (Array.isArray(res)) { + let _users = res.pop() + resolve(_users); + } + }) + .catch(err => { + reject(err) + console.warn(err) + }); + }); +}; + //Get array of encrypted user data export const getUsers = () => { let users = {} @@ -123,7 +165,7 @@ export const getUsers = () => { resolve(users.users) }) .catch(err => reject(err)); - }) + }) }; //Set storage to hold encrypted user data @@ -153,7 +195,7 @@ export const checkPinForUser = (pin, userName) => { Alert.alert("Authentication Error", "Please enter a password"); resolve(false); } - + }) .catch(err => { console.warn(err) @@ -163,4 +205,4 @@ export const checkPinForUser = (pin, userName) => { }; export const onSignOut = () => AsyncStorage.removeItem(KEY); -//if user signs out, remove TRUE key \ No newline at end of file +//if user signs out, remove TRUE key diff --git a/src/utils/asyncStore/coinStorage.js b/src/utils/asyncStore/coinStorage.js index 1f4dd550..2585d97f 100644 --- a/src/utils/asyncStore/coinStorage.js +++ b/src/utils/asyncStore/coinStorage.js @@ -1,4 +1,5 @@ import AsyncStorage from '@react-native-community/async-storage'; +import { findCoinObj } from '../CoinData'; // react-native's version of local storage //Clear user from coin, or delete user from all if no coin specified @@ -59,7 +60,7 @@ export const getActiveCoinsList = () => { }); }; -//TODO: For version 0.1.8 update, delete in next version +//TODO: Deprecated, delete export const updateActiveCoinList_v0_1_8_beta = () => { return new Promise((resolve, reject) => { AsyncStorage.getItem('activeCoins') @@ -80,4 +81,33 @@ export const updateActiveCoinList_v0_1_8_beta = () => { }) .catch(err => reject(err)); }); +}; + +//TODO: For version 0.1.9 update +export const updateActiveCoinList_v0_1_9_beta = () => { + return new Promise((resolve, reject) => { + AsyncStorage.getItem('activeCoins') + .then((res) => { + let coinList = [] + let newCoinList = [] + + if (res) { + coinList = JSON.parse(res).coins; + } + + coinList = coinList.map((coin) => { + const newCoinObj = findCoinObj(coin.id, "") + + if (coin.id !== 'K64') { + newCoinList.push({...newCoinObj, users: coin.users}) + } + }) + + return storeCoins(newCoinList) + }) + .then(() => { + resolve(true) + }) + .catch(err => reject(err)); + }); }; \ No newline at end of file diff --git a/src/utils/constants.js b/src/utils/constants.js index 9ca68689..a38772d4 100644 --- a/src/utils/constants.js +++ b/src/utils/constants.js @@ -1,57 +1,128 @@ -//Electrum -export const ELECTRUM_PROTOCOL_CHANGE = 1.4 +// Electrum +export const ELECTRUM_PROTOCOL_CHANGE = 1.4; -//VerusPay -export const FORMAT_UNKNOWN = "QR Data format unrecognized." -export const ADDRESS_ONLY = "Only address detected, please fill out amount field." -export const INCOMPLETE_VERUS_QR = "VerusQR code impartial or incomplete, cannot parse QR data." -export const INSUFFICIENT_FUNDS = "Insufficient funds." -export const INCOMPATIBLE_COIN = "The coin this invoice is requesting is currently incompatible with Verus Mobile." -export const INCOMPATIBLE_APP = "The coin this invoice is requesting does not have send functionality." -export const ONLY_ADDRESS = "This QR Code only contains only an address. Please select a coin and then scan." -export const BALANCE_NULL = "Couldn't fetch balance for coin." +// Wyre integration testing +export const SUPPORTED_FIAT_CURRENCIES = [{ value: 'USD' }]; // Before API is connected, use only USD as so far we only have USD rate data +export const SUPPORTED_CRYPTOCURRENCIES = [{ value: 'BTC' }]; // No support for ETH and ERC20 (DAI) yet +export const SUPPORTED_PAYMENT_METHODS = [{ id: 'US_BANK_ACCT', name: 'US Bank Account', est_time: '5 business days' }]; -//Custom chain form +// VerusPay +export const FORMAT_UNKNOWN = 'QR Data format unrecognized.'; +export const ADDRESS_ONLY = 'Only address detected, please fill out amount field.'; +export const INCOMPLETE_VERUS_QR = 'VerusQR code impartial or incomplete, cannot parse QR data.'; +export const INSUFFICIENT_FUNDS = 'Insufficient funds.'; +export const INCOMPATIBLE_COIN = 'The coin this invoice is requesting is currently incompatible with Verus Mobile.'; +export const INCOMPATIBLE_APP = 'The coin this invoice is requesting does not have send functionality.'; +export const ONLY_ADDRESS = 'This QR Code only contains only an address. Please select a coin and then scan.'; +export const BALANCE_NULL = "Couldn't fetch balance for coin."; +export const PARSE_ERROR = 'Error parsing QR code data.' + +// Custom chain form export const DEFAULT_FEE_DESC = ("A chain's default fee is the fee paid by default to miners every time you send a transaction." + - '\n\n' + "If this number is too low, your transactions will take very long to complete, and may fail. " + - "If it is too high, your transactions could be quicker, but you'll spend a lot in fees." + '\n\n' + "It is recommended that you research the average network " + - "fee for the chain you are trying to add. This number will be used by Verus Mobile if online fee data is unavailable.") -export const ELECTRUM_SERVERS_DESC = ("A chain's electrum servers are full nodes you can connect to securely interact with it's blockchain network." + '\n\n' +"Although you will never share your private key " + - "with the servers entered here, it is important that you either trust them, or use your own if you want a pleasant wallet user experience." + '\n\n' +"If you're using third party servers, " + - "ensure you've done your research. Enter a minimum of two servers in the format:" + '\n\n' + "::.") -export const ADD_COIN_CHECK = ('Please take the time to double check the following things regarding your custom coin ' + - 'information. If you are sure everything is correct, press continue.' + - '\n') -export const REQUIRED_FIELD = "Required field" -export const COIN_ALREADY_ACTIVE = "A coin with this ticker is currently active" -export const TICKER_RESERVED = "This ticker is reserved, try adding this coin through the coin list" -export const NO_SPECIAL_CHARACTERS_NAME = "Name cannot include any special characters" -export const INVALID_AMOUNT = "Invalid amount" -export const DEFAULT_FEE_HIGH_WARNING = "• Your default fee is unusually high. By default, you will pay this fee" + -" every time you send a transaction with this coin. Ensure it is correct." -export const ENTER_AMOUNT_GREATER_THAN_0 = "Enter an amount greater than 0" -export const BAD_SERVER_INPUT_FORMAT = "Not in ip:port:protocol format" -export const BAD_SERVER_PROTOCOL = "Please choose either ssl or tcp as protocol" -export const ELECTRUM_DISCLAIMER_UNREALIZED = "Please confirm" -export const ELECTRUM_DISCLAIMER = "I understand that no developer of this mobile application is responsible for these electrum servers, and I proceed at my own risk." -export const POSSIBLY_UNSUPPORTED_CHAIN = "• This chain\'s key structure may not be recognized by Verus Mobile, and you could run into sending or receiving issues with it if you continue. Make sure you know what you are doing, and proceed at your own risk." + '\n\n' + 'If this number is too low, your transactions will take very long to complete, and may fail. ' + + "If it is too high, your transactions could be quicker, but you'll spend a lot in fees." + '\n\n' + 'It is recommended that you research the average network ' + + 'fee for the chain you are trying to add. This number will be used by Verus Mobile if online fee data is unavailable.'); +export const ELECTRUM_SERVERS_DESC = ("A chain's electrum servers are full nodes you can connect to securely interact with it's blockchain network." + '\n\n' + 'Although you will never share your private key ' + + 'with the servers entered here, it is important that you either trust them, or use your own if you want a pleasant wallet user experience.' + '\n\n' + "If you're using third party servers, " + + "ensure you've done your research. Enter a minimum of two servers in the format:" + '\n\n' + "::."); +export const ADD_COIN_CHECK = ('Please take the time to double check the following things regarding your custom coin ' + + 'information. If you are sure everything is correct, press continue.' + + '\n'); +export const REQUIRED_FIELD = 'Required field'; +export const COIN_ALREADY_ACTIVE = 'A coin with this ticker is currently active'; +export const TICKER_RESERVED = 'This ticker is reserved, try adding this coin through the coin list'; +export const NO_SPECIAL_CHARACTERS_NAME = 'Name cannot include any special characters'; +export const INVALID_AMOUNT = 'Invalid amount'; +export const DEFAULT_FEE_HIGH_WARNING = '• Your default fee is unusually high. By default, you will pay this fee' + + ' every time you send a transaction with this coin. Ensure it is correct.'; +export const ENTER_AMOUNT_GREATER_THAN_0 = 'Enter an amount greater than 0'; +export const BAD_SERVER_INPUT_FORMAT = 'Not in ip:port:protocol format'; +export const BAD_SERVER_PROTOCOL = 'Please choose either ssl or tcp as protocol'; +export const ELECTRUM_DISCLAIMER_UNREALIZED = 'Please confirm'; +export const ELECTRUM_DISCLAIMER = 'I understand that no developer of this mobile application is responsible for these electrum servers, and I proceed at my own risk.'; +export const POSSIBLY_UNSUPPORTED_CHAIN = "• This chain\'s key structure may not be recognized by Verus Mobile, and you could run into sending or receiving issues with it if you continue. Make sure you know what you are doing, and proceed at your own risk."; -//Coin settings -export const NO_VERIFICATION = 0 -export const MID_VERIFICATION = 1 -export const MAX_VERIFICATION = 2 +// Coin settings +export const NO_VERIFICATION = 0; +export const MID_VERIFICATION = 1; +export const MAX_VERIFICATION = 2; export const NO_VERIFICATION_DESC = 'No Verification (Not recommended):\n\nOn this setting, before sending a transaction, none of your funds will be ' + -'cross-verified across different electrum servers, and your existing transactions will not be ' + -'hashed to check against their transaction ID. This is only suggested for huge wallets that ' + -'otherwise wouldn\'t be able to send.' -export const MID_VERIFICATION_DESC = 'Incomplete Verification (Not recommended):\n\nOn this setting, your funds will not be cross verified across multiple ' + -'servers, but you may experience a little quicker transaction sending times. This is not recommended unless ' + -'necessary for usability.' + 'cross-verified across different electrum servers, and your existing transactions will not be ' + + 'hashed to check against their transaction ID. This is only suggested for huge wallets that ' + + 'otherwise wouldn\'t be able to send.'; +export const MID_VERIFICATION_DESC = 'Incomplete Verification (Not recommended):\n\nOn this setting, your funds will not be cross verified across multiple ' + + 'servers, but you may experience a little quicker transaction sending times. This is not recommended unless ' + + 'necessary for usability.'; export const MAX_VERIFICATION_DESC = 'Complete Verification (Highly recommended):\n\nOn this setting, before sending a transaction, your funds will be ' + -'cross verified across at least two different electrum servers, and the transaction IDs of your existing ' + -'transactions will be double-checked through local transaction hashing.' -export const VERIFICATION_LOCKED = 'The verification level settings for this coin have been locked and cannot be changed.' + 'cross verified across at least two different electrum servers, and the transaction IDs of your existing ' + + 'transactions will be double-checked through local transaction hashing.'; +export const VERIFICATION_LOCKED = 'The verification level settings for this coin have been locked and cannot be changed.'; + +// Chain QR +export const INCOMPLETE_CHAIN_QR = 'VerusQR code impartial or incomplete, cannot parse QR data.'; +export const COIN_TICKER_ALREADY_EXISTS = 'already exists in Verus Mobile, and therefore cannot be added as a custom coin.'; + +//Payment Methods +export const ENABLE_WYRE = false; +export const WYRE_URL = 'https://api.testwyre.com'; +export const WYRE_REFERRER_ACCOUNT_ID = 'verus-valu'; -//Chain QR -export const INCOMPLETE_CHAIN_QR = 'VerusQR code impartial or incomplete, cannot parse QR data.' -export const COIN_TICKER_ALREADY_EXISTS = 'already exists in Verus Mobile, and therefore cannot be added as a custom coin.' \ No newline at end of file +export const SUPPORTED_COUNTRIES = ['US']; +export const WYRE_COUNTRIES = [{ value: 'US' }, ]; +export const STATES = [ + { value: 'AL' }, + { value: 'AK' }, + { value: 'AS' }, + { value: 'AZ' }, + { value: 'AR' }, + { value: 'CA' }, + { value: 'CO' }, + { value: 'CT' }, + { value: 'DE' }, + { value: 'DC' }, + { value: 'FM' }, + { value: 'FL' }, + { value: 'GA' }, + { value: 'HI' }, + { value: 'ID' }, + { value: 'IL' }, + { value: 'IN' }, + { value: 'IA' }, + { value: 'KS' }, + { value: 'KY' }, + { value: 'LA' }, + { value: 'ME' }, + { value: 'MD' }, + { value: 'MA' }, + { value: 'MI' }, + { value: 'MN' }, + { value: 'MS' }, + { value: 'MO' }, + { value: 'MT' }, + { value: 'NE' }, + { value: 'NV' }, + { value: 'NH' }, + { value: 'NJ' }, + { value: 'NM' }, + { value: 'NY' }, + { value: 'NC' }, + { value: 'ND' }, + { value: 'OH' }, + { value: 'OK' }, + { value: 'OR' }, + { value: 'PW' }, + { value: 'PA' }, + { value: 'PR' }, + { value: 'RI' }, + { value: 'SC' }, + { value: 'SD' }, + { value: 'TN' }, + { value: 'TX' }, + { value: 'UT' }, + { value: 'VT' }, + { value: 'VA' }, + { value: 'WA' }, + { value: 'WV' }, + { value: 'WI' }, + { value: 'WY' } +]; \ No newline at end of file diff --git a/src/utils/crypto/txDecoder.js b/src/utils/crypto/txDecoder.js index 8cbc9e92..61d8aa62 100644 --- a/src/utils/crypto/txDecoder.js +++ b/src/utils/crypto/txDecoder.js @@ -370,54 +370,65 @@ parseTransactionAddresses = (tx, targetAddress, network, skipTargetAddress) => { } export const formatTx = (transactionObj, targetAddress, network, currentHeight) => { - const txOutDecoded = transactionObj.rawOut ? TxDecoder(transactionObj.rawOut, network) : false + // Check if any txins contain errors, if so, return false (skips transaction when called) + if (transactionObj.rawIns && Array.isArray(transactionObj.rawIns)) { + if (!transactionObj.rawIns.every((txIn) => { + return !txIn.code + })) { + console.log("Error formatting tx:") + console.log(transactionObj) + return false + } + + const txOutDecoded = transactionObj.rawOut ? TxDecoder(transactionObj.rawOut, network) : false - let txInsDecoded = [] + let txInsDecoded = [] - if (transactionObj.rawIns && transactionObj.rawIns.every(item => {return !(item.status && item.status === 'not found')})) { - for (let i = 0; i < transactionObj.rawIns.length; i++) { - txInsDecoded.push(TxDecoder(transactionObj.rawIns[i], network)) + if (transactionObj.rawIns && transactionObj.rawIns.every(item => {return !(item.status && item.status === 'not found')})) { + for (let i = 0; i < transactionObj.rawIns.length; i++) { + txInsDecoded.push(TxDecoder(transactionObj.rawIns[i], network)) + } } - } - let txInputs = [] + let txInputs = [] - if (txOutDecoded) { - for (let i = 0; i < txOutDecoded.inputs.length; i++) { - if(txInsDecoded[i] && txInsDecoded[i].outputs) { - txInputs.push(txInsDecoded[i].outputs[txOutDecoded.inputs[i].n]) + if (txOutDecoded) { + for (let i = 0; i < txOutDecoded.inputs.length; i++) { + if(txInsDecoded[i] && txInsDecoded[i].outputs) { + txInputs.push(txInsDecoded[i].outputs[txOutDecoded.inputs[i].n]) + } + else { + txInputs.push(false) + } } - else { - txInputs.push(false) + + const _parsedTx = { + network: txOutDecoded.network, + format: txOutDecoded.format, + inputs: txInputs, + outputs: txOutDecoded.outputs, + height: transactionObj.height, + timestamp: Number(transactionObj.height) === 0 ? Math.floor(Date.now() / 1000) : transactionObj.timestamp, + confirmations: Number(transactionObj.height) === 0 ? 0 : currentHeight - transactionObj.height, } - } - const _parsedTx = { - network: txOutDecoded.network, - format: txOutDecoded.format, - inputs: txInputs, - outputs: txOutDecoded.outputs, - height: transactionObj.height, - timestamp: Number(transactionObj.height) === 0 ? Math.floor(Date.now() / 1000) : transactionObj.timestamp, - confirmations: Number(transactionObj.height) === 0 ? 0 : currentHeight - transactionObj.height, - } + let formattedTx = parseTransactionAddresses(_parsedTx, targetAddress, network.coin, false) - let formattedTx = parseTransactionAddresses(_parsedTx, targetAddress, network.coin, false) + if (formattedTx.type) { + formattedTx.height = transactionObj.height; + formattedTx.blocktime = transactionObj.timestamp; + formattedTx.hex = transactionObj.rawOut; + formattedTx.inputs = txOutDecoded.inputs; + formattedTx.outputs = txOutDecoded.outputs; + formattedTx.locktime = txOutDecoded.format.locktime; + } - if (formattedTx.type) { - formattedTx.height = transactionObj.height; - formattedTx.blocktime = transactionObj.timestamp; - formattedTx.hex = transactionObj.rawOut; - formattedTx.inputs = txOutDecoded.inputs; - formattedTx.outputs = txOutDecoded.outputs; - formattedTx.locktime = txOutDecoded.format.locktime; + return formattedTx } - - return formattedTx - } - else { + else { + return false + } + } else { return false } - - } \ No newline at end of file diff --git a/src/utils/date.js b/src/utils/date.js new file mode 100644 index 00000000..d42fcb33 --- /dev/null +++ b/src/utils/date.js @@ -0,0 +1,3 @@ +export const parseDate = (date) => { + return (new Date(date).toJSON()).split('T')[0] +} \ No newline at end of file diff --git a/src/utils/delayedAlert.js b/src/utils/delayedAlert.js new file mode 100644 index 00000000..13f7871f --- /dev/null +++ b/src/utils/delayedAlert.js @@ -0,0 +1,9 @@ +import { Alert } from 'react-native'; + +const delayedInvocation = (delay, args) => ( + setTimeout(() => (Alert.alert(...args)), delay) +) + +export default (...args) => ( + delayedInvocation(1000, args) +) diff --git a/src/utils/delayedAsyncAlert.js b/src/utils/delayedAsyncAlert.js new file mode 100644 index 00000000..bcdb8349 --- /dev/null +++ b/src/utils/delayedAsyncAlert.js @@ -0,0 +1,10 @@ +import AlertAsync from "react-native-alert-async"; + +const delay = (ms) => { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +export default async (...args) => { + await delay(1000); + return AlertAsync(...args); +} diff --git a/src/utils/httpCalls/electrumCalls/getBlockInfo.js b/src/utils/httpCalls/electrumCalls/getBlockInfo.js index 9253a93d..89e828e4 100644 --- a/src/utils/httpCalls/electrumCalls/getBlockInfo.js +++ b/src/utils/httpCalls/electrumCalls/getBlockInfo.js @@ -57,6 +57,7 @@ export const getBlockInfo = (oldBlock, coinObj, blockheight) => { }) .catch((err) => { console.log("Caught error in getBlockInfo.js") + console.log(err.stack) reject(err) }) }); diff --git a/src/utils/httpCalls/electrumCalls/getServerVersion.js b/src/utils/httpCalls/electrumCalls/getServerVersion.js index 3d386a5f..93f5285f 100644 --- a/src/utils/httpCalls/electrumCalls/getServerVersion.js +++ b/src/utils/httpCalls/electrumCalls/getServerVersion.js @@ -61,7 +61,7 @@ export const getServerVersion = (proxyServer, ip, port, proto, httpsEnabled) => resolve(arr[0]) }) .catch((err) => { - console.warn(err.message + " in serverVersion.js") + console.warn(err.message + " in getServerVersion.js") reject(err) }) }) diff --git a/src/utils/httpCalls/electrumCalls/getUnspent.js b/src/utils/httpCalls/electrumCalls/getUnspent.js index 9e49a0de..97de3a95 100644 --- a/src/utils/httpCalls/electrumCalls/getUnspent.js +++ b/src/utils/httpCalls/electrumCalls/getUnspent.js @@ -59,7 +59,7 @@ export const getUnspentFormatted = (oldList, coinObj, activeUser, verifyMerkle = let currentHeight let unshieldedFunds = null - if (__DEV__) { + /*if (__DEV__) { if (verifyMerkle) { console.log("verifyMerkle is true, going to verify merkle roots") } @@ -73,7 +73,7 @@ export const getUnspentFormatted = (oldList, coinObj, activeUser, verifyMerkle = if (overrideKmdInterest) { console.log("overridekmdinterest is true, going to override kmd interest calculations") } - } + }*/ return new Promise((resolve, reject) => { @@ -86,7 +86,7 @@ export const getUnspentFormatted = (oldList, coinObj, activeUser, verifyMerkle = if (!_utxoList.length) throw new Error("No valid utxo") - _utxoList.forEach((_utxoItem) => { + _utxoList.forEach((_utxoItem, index) => { if(Number(currentHeight) - Number(_utxoItem.height) !== 0) { formattedUtxos.push({ txid: _utxoItem['tx_hash'], diff --git a/src/utils/httpCalls/electrumCalls/pushTx.js b/src/utils/httpCalls/electrumCalls/pushTx.js index f0f6c689..73f64a5b 100644 --- a/src/utils/httpCalls/electrumCalls/pushTx.js +++ b/src/utils/httpCalls/electrumCalls/pushTx.js @@ -78,7 +78,8 @@ export const txPreflight = (coinObj, activeUser, outputAddress, value, defaultFe vout: utxoList[i].vout, value: Number(utxoList[i].amountSats), interestSats: Number(utxoList[i].interestSats), - verified: utxoList[i].verified ? utxoList[i].verified : false, + verifiedMerkle: utxoList[i].verifiedMerkle, + verifiedTxid: utxoList[i].verifiedTxid }); } else { utxoListFormatted.push({ @@ -86,6 +87,8 @@ export const txPreflight = (coinObj, activeUser, outputAddress, value, defaultFe vout: utxoList[i].vout, value: Number(utxoList[i].amountSats), verified: utxoList[i].verified ? utxoList[i].verified : false, + verifiedMerkle: utxoList[i].verifiedMerkle, + verifiedTxid: utxoList[i].verifiedTxid }); } } @@ -173,7 +176,8 @@ export const txPreflight = (coinObj, activeUser, outputAddress, value, defaultFe if (inputs && inputs.length) { for (let i = 0; i < inputs.length; i++) { - if (!inputs[i].verified) { + //TODO: Warnings for both txid verification and merkle verification + if (!inputs[i].verifiedMerkle) { utxoVerified = false; break; } diff --git a/src/utils/httpCalls/serverTester.js b/src/utils/httpCalls/serverTester.js index 57b0cd18..2b162544 100644 --- a/src/utils/httpCalls/serverTester.js +++ b/src/utils/httpCalls/serverTester.js @@ -25,11 +25,6 @@ export const getGoodServer = (tester, serverList, xtraTesterParams = []) => { let index = Math.floor(Math.random() * serverList.length) return new Promise((resolve) => { - //DELET - if (!serverList[index]) { - console.log("WARNING") - console.log(serverList) - } tester(serverList[index], ...xtraTesterParams) .then((res) => { resolve({ diff --git a/src/utils/navigation/index.js b/src/utils/navigation/index.js index e029e9a0..b0703d31 100644 --- a/src/utils/navigation/index.js +++ b/src/utils/navigation/index.js @@ -2,51 +2,65 @@ import React from "react"; import { StackNavigator, DrawerNavigator } from "react-navigation"; import { StyleSheet, TouchableOpacity, Dimensions } from "react-native"; import { Icon } from "react-native-elements"; +import Colors from '../../globals/colors'; -import SideMenu from '../../containers/SideMenu'; +import SideMenu from '../../containers/SideMenu/SideMenu'; -import Login from '../../containers/Login'; -import Home from '../../containers/Home'; -import AddCoin from '../../containers/AddCoin'; -import SignUp from '../../containers/SignUp'; -import CoinDetails from '../../containers/CoinDetails'; -import TransactionDetails from '../../containers/TransactionDetails'; -import LoadingScreen from '../../containers/LoadingScreen'; -import ConfirmSend from '../../containers/ConfirmSend'; -import SendResult from '../../containers/SendResult'; -import CoinMenus from '../../containers/CoinMenus'; -import VerusPay from '../../containers/VerusPay'; -import SettingsMenus from '../../containers/SettingsMenus'; -import ProfileInfo from '../../containers/ProfileInfo'; -import ResetPwd from '../../containers/ResetPwd'; -import DisplaySeed from '../../containers/DisplaySeed'; -import RecoverSeed from '../../containers/RecoverSeed'; -import DeleteProfile from '../../containers/DeleteProfile'; -import SecureLoading from '../../containers/SecureLoading'; -import CustomChainMenus from '../../containers/CustomChainMenus' -import GeneralWalletSettings from '../../containers/GeneralWalletSettings' -import CoinSettings from '../../containers/CoinSettings' +import Login from '../../containers/Login/Login'; +import Home from '../../containers/Home/Home'; +import AddCoin from '../../containers/AddCoin/AddCoin'; +import SignUp from '../../containers/SignUp/SignUp'; +import CoinDetails from '../../containers/CoinDetails/CoinDetails'; +import TransactionDetails from '../../containers/TransactionDetails/TransactionDetails'; +import LoadingScreen from '../../containers/LoadingScreen/LoadingScreen'; +import ConfirmSend from '../../containers/ConfirmSend/ConfirmSend'; +import SendResult from '../../containers/Coin/SendCoin/SendResult/SendResult'; +import CoinMenus from '../../containers/Coin/CoinMenus'; +import VerusPay from '../../containers/VerusPay/VerusPay'; +import SettingsMenus from '../../containers/Settings/SettingsMenus'; +import ProfileInfo from '../../containers/Settings/ProfileSettings/ProfileInfo/ProfileInfo'; +import ResetPwd from '../../containers/Settings/ProfileSettings/ResetPwd/ResetPwd'; +import DisplaySeed from '../../containers/Settings/ProfileSettings/DisplaySeed/DisplaySeed'; +import RecoverSeed from '../../containers/Settings/ProfileSettings/RecoverSeed/RecoverSeed'; +import DeleteProfile from '../../containers/Settings/ProfileSettings/DeleteProfile/DeleteProfile'; +import SecureLoading from '../../containers/SecureLoading/SecureLoading'; +import CustomChainMenus from '../../containers/CustomChains/CustomChainMenus'; +import GeneralWalletSettings from '../../containers/Settings/WalletSettings/GeneralWalletSettings/GeneralWalletSettings'; +import CoinSettings from '../../containers/Settings/CoinSettings/CoinSettings'; +import BuySellCryptoMenus from '../../containers/BuySellCrypto/BuySellCryptoMenus'; +import SelectPaymentMethod from '../../containers/BuySellCrypto/PaymentMethod/SelectPaymentMethod/SelectPaymentMethod'; +import ManageWyreAccount from '../../containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreAccount'; +import ManageWyreEmail from '../../containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreEmail'; +import ManageWyreCellphone from '../../containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreCellphone'; +import ManageWyreDocuments from '../../containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreDocuments'; +import ManageWyrePaymentMethod from '../../containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyrePaymentMethod'; +import ManageWyrePersonalDetails from '../../containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyrePersonalDetails'; +import ManageWyreProofOfAddress from '../../containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreProofOfAddress'; +import ManageWyreAddress from '../../containers/BuySellCrypto/PaymentMethod/ManageWyreAccount/ManageWyreAddress'; +import SendTransaction from '../../containers/BuySellCrypto/PaymentMethod/SendTransaction/SendTransaction'; -const WALLET = "wallet"; +const WALLET = 'wallet'; const styles = StyleSheet.create({ header_title_noBack: { + fontFamily: 'Avenir-Black', backgroundColor: 'transparent', height: 55, textAlign: 'center', - fontSize: 22, + fontSize: 18, color: "#E9F1F7", - paddingTop: 12, + paddingTop: 15, width: Dimensions.get('window').width // width of both buttons + no left-right padding }, header_title_back: { + fontFamily: 'Avenir-Black', backgroundColor: 'transparent', height: 55, - textAlign: 'center', - fontSize: 22, + textAlign: 'right', + fontSize: 18, color: "#E9F1F7", - paddingTop: 12, + paddingTop: 15, width: Dimensions.get('window').width - 110// width of both buttons + no left-right padding }, @@ -55,127 +69,214 @@ const styles = StyleSheet.create({ } }); -export const MainScreens = +export const MainScreens = StackNavigator({ - Home: { - screen: Home, - navigationOptions: { - title: "Home", - headerLeft: null - } - }, - AddCoin: { - screen: AddCoin, - navigationOptions: { - title: "Add Coin", - } - }, - CoinDetails: { - screen: CoinDetails, - navigationOptions: { - title: "Details", - } - }, - TxDetails: { - screen: TransactionDetails, - navigationOptions: { - title: "Info", - } - }, - ConfirmSend: { - screen: ConfirmSend, - navigationOptions: { - title: "Confirm Send", - } - }, - SendResult: { - screen: SendResult, - navigationOptions: { - title: "Send Result", - headerLeft: null, - headerRight: null, - drawerLockMode: 'locked-closed' - } - }, - DisplaySeed: { - screen: DisplaySeed, - navigationOptions: { - title: "Seed", - headerRight: null, - drawerLockMode: 'locked-closed' - } - }, - CoinMenus: { - screen: CoinMenus, - }, - SettingsMenus: { - screen: SettingsMenus, - }, - VerusPay: { - screen: VerusPay, - navigationOptions: { - title: "VerusPay", - } - }, - ProfileInfo: { - screen: ProfileInfo, - navigationOptions: { - title: "Info", - } - }, - ResetPwd: { - screen: ResetPwd, - navigationOptions: { - title: "Reset", - } - }, - RecoverSeed: { - screen: RecoverSeed, - navigationOptions: { - title: "Recover", - } - }, - GeneralWalletSettings: { - screen: GeneralWalletSettings, - navigationOptions: { - title: "General Wallet Settings" - } - }, - CoinSettings: { - screen: CoinSettings, - }, - DeleteProfile: { - screen: DeleteProfile, - navigationOptions: { - title: "Delete", - } - }, - SecureLoading: { - screen: SecureLoading, - navigationOptions: { - title: "Loading", - headerRight: null, - headerLeft: null, - drawerLockMode: 'locked-closed' - } + Home: { + screen: Home, + navigationOptions: { + title: "Home", + headerLeft: null, + } + }, + AddCoin: { + screen: AddCoin, + navigationOptions: { + title: "Add Coin", + } + }, + CoinDetails: { + screen: CoinDetails, + navigationOptions: { + title: "Details", + } + }, + TxDetails: { + screen: TransactionDetails, + navigationOptions: { + title: "Info", + } + }, + ConfirmSend: { + screen: ConfirmSend, + navigationOptions: { + title: "Confirm Send", + } + }, + SendResult: { + screen: SendResult, + navigationOptions: { + title: "Send Result", + headerLeft: null, + headerRight: null, + drawerLockMode: 'locked-closed' + } + }, + DisplaySeed: { + screen: DisplaySeed, + navigationOptions: { + title: "Seed", + headerRight: null, + drawerLockMode: 'locked-closed' + } + }, + CoinMenus: { + screen: CoinMenus, + }, + SettingsMenus: { + screen: SettingsMenus, + }, + VerusPay: { + screen: VerusPay, + navigationOptions: { + title: "VerusPay", + } + }, + ProfileInfo: { + screen: ProfileInfo, + navigationOptions: { + title: "Info", + } + }, + ResetPwd: { + screen: ResetPwd, + navigationOptions: { + title: "Reset", + } + }, + RecoverSeed: { + screen: RecoverSeed, + navigationOptions: { + title: "Recover", + } + }, + GeneralWalletSettings: { + screen: GeneralWalletSettings, + navigationOptions: { + title: "General Wallet Settings" + } + }, + CoinSettings: { + screen: CoinSettings, + }, + DeleteProfile: { + screen: DeleteProfile, + navigationOptions: { + title: "Delete", + } + }, + SecureLoading: { + screen: SecureLoading, + navigationOptions: { + title: "Loading", + headerRight: null, + headerLeft: null, + drawerLockMode: 'locked-closed' + } + }, + CustomChainMenus: { + screen: CustomChainMenus, + }, + BuySellCryptoMenus: { + screen: BuySellCryptoMenus + }, + SelectPaymentMethod: { + screen: SelectPaymentMethod, + navigationOptions: { + title: 'Select Payment Method', + drawerLockMode: 'locked-closed' + } + }, + ManageWyreAccount: { + screen: ManageWyreAccount, + navigationOptions: { + title: 'Manage Wyre Account', + drawerLockMode: 'locked-closed' + } + }, + ManageWyreEmail: { + screen: ManageWyreEmail, + navigationOptions: { + title: 'Manage Wyre Email', + headerRight: null, + drawerLockMode: 'locked-closed' + } + }, + ManageWyreCellphone: { + screen: ManageWyreCellphone, + navigationOptions: { + title: 'Manage Wyre Cellphone', + headerRight: null, + drawerLockMode: 'locked-closed' + } + }, + ManageWyreDocuments: { + screen: ManageWyreDocuments, + navigationOptions: { + title: 'Upload Documents', + headerRight: null, + drawerLockMode: 'locked-closed' + } + }, + ManageWyrePaymentMethod: { + screen: ManageWyrePaymentMethod, + navigationOptions: { + title: 'Manage Payment Method', + headerRight: null, + drawerLockMode: 'locked-closed' + } + }, + ManageWyrePersonalDetails: { + screen: ManageWyrePersonalDetails, + navigationOptions: { + title: 'Upload Personal Details', + headerRight: null, + drawerLockMode: 'locked-closed' + } + }, + ManageWyreProofOfAddress: { + screen: ManageWyreProofOfAddress, + navigationOptions: { + title: 'Upload Proof of Address', + headerRight: null, + drawerLockMode: 'locked-closed' + } + }, + ManageWyreAddress: { + screen: ManageWyreAddress, + navigationOptions: { + title: 'Manage Wyre Address', + headerRight: null, + drawerLockMode: 'locked-closed' + } + }, + SendTransaction: { + screen: SendTransaction, + navigationOptions: { + title: 'Confirm transaction', + headerRight: null, + drawerLockMode: 'locked-closed', + } + }, + }, { + headerMode: 'screen', + navigationOptions: ({navigation}) => ({ + headerStyle: { + backgroundColor: Colors.primaryColor, }, - CustomChainMenus: { - screen: CustomChainMenus, + headerTitleStyle:{ + fontFamily: 'Avenir-Black', + fontWeight: 'normal', + fontSize: 22, + color: Colors.secondaryColor }, - }, { - headerMode: 'screen', - navigationOptions: ({navigation}) => ({ - headerStyle: { - backgroundColor: '#2E86AB', - }, - headerRight: ( - - navigation.navigate('DrawerOpen')} style={styles.menuButton}> - - ), - gesturesEnabled: false, - headerTintColor: '#E9F1F7', - }), + headerRight: ( + + navigation.navigate('DrawerOpen')} style={styles.menuButton}> + + ), + gesturesEnabled: false, + headerTintColor: Colors.secondaryColor, + }), }) export const SignedOut = StackNavigator({ @@ -267,7 +368,7 @@ export const RootNavigator = (hasAccount, loading, signedIn) => { }, { contentComponent: SideMenu, drawerWidth: 250, - drawerPosition: 'left', + drawerPosition: 'right', drawerOpenRoute: 'DrawerOpen', drawerCloseRoute: 'DrawerClose', drawerToggleRoute: 'DrawerToggle', @@ -276,6 +377,3 @@ export const RootNavigator = (hasAccount, loading, signedIn) => { } ); }; - - - diff --git a/src/utils/paymentMethod.js b/src/utils/paymentMethod.js new file mode 100644 index 00000000..302facda --- /dev/null +++ b/src/utils/paymentMethod.js @@ -0,0 +1,3 @@ +const hasPaymentMethod = (paymentMethod) => paymentMethod.id; + +export default hasPaymentMethod; \ No newline at end of file diff --git a/src/utils/price.js b/src/utils/price.js new file mode 100644 index 00000000..45beffd8 --- /dev/null +++ b/src/utils/price.js @@ -0,0 +1,12 @@ +import { isNumber, truncateDecimal } from './math'; + +export const calculatePrice = (amount, fromCurr, toCurr, rates) => { + let conversion = `${fromCurr}${toCurr}` + const exchangeRate = rates[conversion] + + if (amount.toString() && isNumber(amount) && exchangeRate) { + return truncateDecimal(amount/exchangeRate, 8) + } + + return '-' + } \ No newline at end of file diff --git a/src/utils/seedCrypt.js b/src/utils/seedCrypt.js index 1a979b8b..0f0a2138 100755 --- a/src/utils/seedCrypt.js +++ b/src/utils/seedCrypt.js @@ -23,4 +23,8 @@ export const decryptkey = (cipherKey, string) => { const _regexTest = decryptedKey.match(/^[0-9a-zA-Z ]+$/g); return !_regexTest ? false : decryptedKey; -} \ No newline at end of file +} + +export const decryptGeneral = (cipherKey, string) => ( + aes256.decrypt(cipherKey, string) +) diff --git a/yarn.lock b/yarn.lock index 8938e5fb..740021ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,19 +9,19 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.0.0", "@babel/core@^7.1.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" - integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== +"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" + integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" - "@babel/helpers" "^7.5.5" - "@babel/parser" "^7.5.5" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" - convert-source-map "^1.1.0" + "@babel/generator" "^7.7.7" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.7" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + convert-source-map "^1.7.0" debug "^4.1.0" json5 "^2.1.0" lodash "^4.17.13" @@ -29,133 +29,140 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.0.0", "@babel/generator@^7.4.0", "@babel/generator@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" - integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== +"@babel/generator@^7.0.0", "@babel/generator@^7.4.0", "@babel/generator@^7.7.4", "@babel/generator@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" + integrity sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ== dependencies: - "@babel/types" "^7.5.5" + "@babel/types" "^7.7.4" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" - trim-right "^1.0.1" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== +"@babel/helper-annotate-as-pure@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce" + integrity sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.4" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f" + integrity sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ== dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-explode-assignable-expression" "^7.7.4" + "@babel/types" "^7.7.4" -"@babel/helper-builder-react-jsx@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" - integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== +"@babel/helper-builder-react-jsx@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.4.tgz#da188d247508b65375b2c30cf59de187be6b0c66" + integrity sha512-kvbfHJNN9dg4rkEM4xn1s8d1/h6TYNvajy9L1wx4qLn9HFg0IkTsQi4rfBe92nxrPUFcMsHoMV+8rU7MJb3fCA== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.7.4" esutils "^2.0.0" -"@babel/helper-call-delegate@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" - integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== +"@babel/helper-call-delegate@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801" + integrity sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/helper-hoist-variables" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" -"@babel/helper-create-class-features-plugin@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz#401f302c8ddbc0edd36f7c6b2887d8fa1122e5a4" - integrity sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg== +"@babel/helper-create-class-features-plugin@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz#fce60939fd50618610942320a8d951b3b639da2d" + integrity sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-member-expression-to-functions" "^7.7.4" + "@babel/helper-optimise-call-expression" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-replace-supers" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" -"@babel/helper-define-map@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" - integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== +"@babel/helper-create-regexp-features-plugin@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59" + integrity sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.5.5" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/helper-define-map@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz#2841bf92eb8bd9c906851546fe6b9d45e162f176" + integrity sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg== + dependencies: + "@babel/helper-function-name" "^7.7.4" + "@babel/types" "^7.7.4" lodash "^4.17.13" -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== +"@babel/helper-explode-assignable-expression@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84" + integrity sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg== dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== +"@babel/helper-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" + integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-get-function-arity" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== +"@babel/helper-get-function-arity@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" + integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.4" -"@babel/helper-hoist-variables@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" - integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== +"@babel/helper-hoist-variables@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12" + integrity sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.7.4" -"@babel/helper-member-expression-to-functions@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" - integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== +"@babel/helper-member-expression-to-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" + integrity sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw== dependencies: - "@babel/types" "^7.5.5" + "@babel/types" "^7.7.4" -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" + integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.4" -"@babel/helper-module-transforms@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" - integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== +"@babel/helper-module-transforms@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz#d044da7ffd91ec967db25cd6748f704b6b244835" + integrity sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.5.5" + "@babel/helper-module-imports" "^7.7.4" + "@babel/helper-simple-access" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" lodash "^4.17.13" -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== +"@babel/helper-optimise-call-expression@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" + integrity sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.4" "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" @@ -169,60 +176,60 @@ dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" - integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" - -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== - dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== - dependencies: - "@babel/types" "^7.4.4" - -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" - -"@babel/helpers@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" - integrity sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g== - dependencies: - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" +"@babel/helper-remap-async-to-generator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz#c68c2407350d9af0e061ed6726afb4fff16d0234" + integrity sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.7.4" + "@babel/helper-wrap-function" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-replace-supers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" + integrity sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.7.4" + "@babel/helper-optimise-call-expression" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-simple-access@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294" + integrity sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A== + dependencies: + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-split-export-declaration@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" + integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helper-wrap-function@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace" + integrity sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg== + dependencies: + "@babel/helper-function-name" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helpers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" + integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== + dependencies: + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" "@babel/highlight@^7.0.0": version "7.5.0" @@ -233,381 +240,379 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4", "@babel/parser@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" - integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.4", "@babel/parser@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" + integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== "@babel/plugin-external-helpers@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz#7f4cb7dee651cd380d2034847d914288467a6be4" - integrity sha512-QFmtcCShFkyAsNtdCM3lJPmRe1iB+vPZymlB4LnDIKEBj2yKQLQKtoxXxJ8ePT5fwMl4QGg303p4mB0UsSI2/g== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.7.4.tgz#8aa7aa402f0e2ecb924611cbf30942a497dfd17e" + integrity sha512-RVGNajLaFlknbZLutaP/uv7Q+xmVs2LMlEWFXbcjLnwtBdPqAVpV3nzYIAJqri/VjJCUrhG5nALijtg0aND+XA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-class-properties@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz#a974cfae1e37c3110e71f3c6a2e48b8e71958cd4" - integrity sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz#2f964f0cb18b948450362742e33e15211e77c2ba" + integrity sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.5.5" + "@babel/helper-create-class-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-export-default-from@^7.0.0": - version "7.5.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.5.2.tgz#2c0ac2dcc36e3b2443fead2c3c5fc796fb1b5145" - integrity sha512-wr9Itk05L1/wyyZKVEmXWCdcsp/e185WUNl6AfYZeEKYaUPPvHXRDqO5K1VH7/UamYqGJowFRuCv30aDYZawsg== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.7.4.tgz#890de3c0c475374638292df31f6582160b54d639" + integrity sha512-1t6dh7BHYUz4zD1m4pozYYEZy/3m8dgOr9owx3r0mPPI3iGKRUKUbIxfYmcJ4hwljs/dhd0qOTr1ZDUp43ix+w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.2.0" + "@babel/plugin-syntax-export-default-from" "^7.7.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz#41c360d59481d88e0ce3a3f837df10121a769b39" - integrity sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz#7db302c83bc30caa89e38fee935635ef6bd11c28" + integrity sha512-TbYHmr1Gl1UC7Vo2HVuj/Naci5BEGNZ0AJhzqD2Vpr6QPFWpUmBRLrIDjedzx7/CShq0bRDS2gI4FIs77VHLVQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.2.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.7.4" "@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" - integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz#9f27075004ab99be08c5c1bd653a2985813cb370" + integrity sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.7.4" "@babel/plugin-proposal-optional-catch-binding@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379" + integrity sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" "@babel/plugin-proposal-optional-chaining@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz#ae454f4c21c6c2ce8cb2397dc332ae8b420c5441" - integrity sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw== + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.5.tgz#f0835f044cef85b31071a924010a2a390add11d4" + integrity sha512-sOwFqT8JSchtJeDD+CjmWCaiFoLxY4Ps7NjvwHC/U7l4e9i5pTRNt8nDMIFSOUL+ncFbYSwruHM8WknYItWdXw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.2.0" + "@babel/plugin-syntax-optional-chaining" "^7.7.4" "@babel/plugin-syntax-class-properties@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz#23b3b7b9bcdabd73672a9149f728cd3be6214812" - integrity sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.7.4.tgz#6048c129ea908a432a1ff85f1dc794dc62ddaa5e" + integrity sha512-JH3v5ZOeKT0qqdJ9BeBcZTFQiJOMax8RopSr1bH6ASkZKo2qWsvBML7W1mp89sszBRDBBRO8snqcByGdrMTdMg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-dynamic-import@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" + integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.2.0.tgz#edd83b7adc2e0d059e2467ca96c650ab6d2f3820" - integrity sha512-c7nqUnNST97BWPtoe+Ssi+fJukc9P9/JMZ71IOMNQWza2E+Psrd46N6AEvtw6pqK+gt7ChjXyrw4SPDO79f3Lw== +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.7.4.tgz#897f05808298060b52873fa804ff853540790ea1" + integrity sha512-j888jpjATLEzOWhKawq46UrpXnCRDbdhBd5io4jgwjJ3+CHHGCRb6PNAVEgs+BXIb+dNRAmnkv36zfB992PRVw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" - integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0", "@babel/plugin-syntax-flow@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.4.tgz#6d91b59e1a0e4c17f36af2e10dd64ef220919d7b" + integrity sha512-2AMAWl5PsmM5KPkB22cvOkUyWk6MjUaqhHNU5nSPUl/ns3j5qLfw2SuYP5RbVZ0tfLvePr4zUScbICtDP2CUNw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" - integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz#dab2b56a36fb6c3c222a1fbc71f7bf97f327a9ec" + integrity sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.2.0.tgz#f75083dfd5ade73e783db729bbd87e7b9efb7624" - integrity sha512-lRCEaKE+LTxDQtgbYajI04ddt6WW0WJq57xqkAZ+s11h4YgfRHhVA/Y2VhfPzzFD4qeLHWg32DMp9HooY4Kqlg== +"@babel/plugin-syntax-nullish-coalescing-operator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.7.4.tgz#e53b751d0c3061b1ba3089242524b65a7a9da12b" + integrity sha512-XKh/yIRPiQTOeBg0QJjEus5qiSKucKAiApNtO1psqG7D17xmE+X2i5ZqBEuSvo0HRuyPaKaSN/Gy+Ha9KFQolw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" + integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== +"@babel/plugin-syntax-optional-catch-binding@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6" + integrity sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-optional-chaining@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz#a59d6ae8c167e7608eaa443fda9fa8fa6bf21dff" - integrity sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA== +"@babel/plugin-syntax-optional-chaining@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.7.4.tgz#c91fdde6de85d2eb8906daea7b21944c3610c901" + integrity sha512-2MqYD5WjZSbJdUagnJvIdSfkb/ucOC9/1fRJxm7GAxY6YQLWlUvkfxoNbUPcPLHJyetKUDQ4+yyuUyAoc0HriA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-typescript@^7.2.0": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" - integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== +"@babel/plugin-syntax-typescript@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.7.4.tgz#5d037ffa10f3b25a16f32570ebbe7a8c2efa304b" + integrity sha512-77blgY18Hud4NM1ggTA8xVT/dBENQf17OpiToSa2jSmEY3fWXD2jwrdVlO4kq5yzUTeF15WSQ6b4fByNvJcjpQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-arrow-functions@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12" + integrity sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-async-to-generator@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" - integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba" + integrity sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg== dependencies: - "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-module-imports" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/helper-remap-async-to-generator" "^7.7.4" "@babel/plugin-transform-block-scoped-functions@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b" + integrity sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-block-scoping@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" - integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" + integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" "@babel/plugin-transform-classes@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" - integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec" + integrity sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.7.4" + "@babel/helper-define-map" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-optimise-call-expression" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-replace-supers" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d" + integrity sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-destructuring@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" - integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267" + integrity sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-exponentiation-operator@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9" + integrity sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz#d267a081f49a8705fc9146de0768c6b58dccd8f7" - integrity sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.7.4.tgz#cc73f85944782df1d77d80977bc097920a8bf31a" + integrity sha512-w9dRNlHY5ElNimyMYy0oQowvQpwt/PRHI0QS98ZJCTZU2bvSnKXo5zEiD5u76FBPigTm8TkqzmnUTg16T7qbkA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/plugin-syntax-flow" "^7.7.4" "@babel/plugin-transform-for-of@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc" + integrity sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-function-name@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" - integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1" + integrity sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g== dependencies: - "@babel/helper-function-name" "^7.1.0" + "@babel/helper-function-name" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-literals@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e" + integrity sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-member-expression-literals@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a" + integrity sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-modules-commonjs@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" - integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz#1d27f5eb0bcf7543e774950e5b2fa782e637b345" + integrity sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q== dependencies: - "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-module-transforms" "^7.7.5" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-simple-access" "^7.7.4" babel-plugin-dynamic-import-node "^2.3.0" "@babel/plugin-transform-object-assign@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz#6fdeea42be17040f119e38e23ea0f49f31968bde" - integrity sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.7.4.tgz#a31b70c434a00a078b2d4d10dbd59992fa70afca" + integrity sha512-0TpeUlnhQDwKxPLTIckdaWt46L2s61c/5w5snw1OUod5ehOJywZD98Ha3dFHVjeqkfOFtOTH7cqxddjxUuvcmg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-object-super@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" - integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262" + integrity sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-replace-supers" "^7.7.4" "@babel/plugin-transform-parameters@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz#7a884b2460164dc5f194f668332736584c760007" + integrity sha512-OhGSrf9ZBrr1fw84oFXj5hgi8Nmg+E2w5L7NhnG0lPvpDtqd7dbyilM2/vR8CKbJ907RyxPh2kj6sBCSSfI9Ew== dependencies: - "@babel/helper-call-delegate" "^7.4.4" - "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-call-delegate" "^7.7.4" + "@babel/helper-get-function-arity" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-property-literals@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2" + integrity sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-react-display-name@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" - integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.7.4.tgz#9f2b80b14ebc97eef4a9b29b612c58ed9c0d10dd" + integrity sha512-sBbIvqYkthai0X0vkD2xsAwluBp+LtNHH+/V4a5ydifmTtb8KOVOlrMIk/MYmIc4uTYDnjZUHQildYNo36SRJw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz#583b10c49cf057e237085bcbd8cc960bd83bd96b" - integrity sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.7.4.tgz#8994b1bf6014b133f5a46d3b7d1ee5f5e3e72c10" + integrity sha512-5ZU9FnPhqtHsOXxutRtXZAzoEJwDaP32QcobbMP1/qt7NYcsCNK8XgzJcJfoEr/ZnzVvUNInNjIW22Z6I8p9mg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/plugin-syntax-jsx" "^7.7.4" "@babel/plugin-transform-react-jsx@^7.0.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" - integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.7.tgz#5cbaa7445b4a09f774029f3cc7bb448ff3122a5d" + integrity sha512-SlPjWPbva2+7/ZJbGcoqjl4LsQaLpKEzxW9hcxU7675s24JmdotJOSJ4cgAbV82W3FcZpHIGmRZIlUL8ayMvjw== dependencies: - "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-builder-react-jsx" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/plugin-syntax-jsx" "^7.7.4" "@babel/plugin-transform-regenerator@^7.0.0": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" - integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz#3a8757ee1a2780f390e89f246065ecf59c26fce9" + integrity sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw== dependencies: regenerator-transform "^0.14.0" "@babel/plugin-transform-runtime@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz#a6331afbfc59189d2135b2e09474457a8e3d28bc" - integrity sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w== + version "7.7.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.6.tgz#4f2b548c88922fb98ec1c242afd4733ee3e12f61" + integrity sha512-tajQY+YmXR7JjTwRvwL4HePqoL3DYxpYXIHKVvrOIvJmeHe2y1w4tz5qz9ObUDC9m76rCzIMPyn4eERuwA4a4A== dependencies: - "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-module-imports" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" resolve "^1.8.1" semver "^5.5.1" "@babel/plugin-transform-shorthand-properties@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e" + integrity sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-spread@^7.0.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" - integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578" + integrity sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-sticky-regex@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c" + integrity sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" "@babel/plugin-transform-template-literals@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604" + integrity sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-annotate-as-pure" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-typescript@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz#6d862766f09b2da1cb1f7d505fe2aedab6b7d4b8" - integrity sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.4.tgz#2974fd05f4e85c695acaf497f432342de9fc0636" + integrity sha512-X8e3tcPEKnwwPVG+vP/vSqEShkwODOEeyQGod82qrIuidwIrfnsGn11qPM1jBLF4MqguTXXYzm58d0dY+/wdpg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.5.5" + "@babel/helper-create-class-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-typescript" "^7.2.0" + "@babel/plugin-syntax-typescript" "^7.7.4" "@babel/plugin-transform-unicode-regex@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" - integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" + integrity sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" "@babel/register@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.5.5.tgz#40fe0d474c8c8587b28d6ae18a03eddad3dac3c1" - integrity sha512-pdd5nNR+g2qDkXZlW1yRCWFlNrAn2PPdnZUB72zjX4l1Vv4fMRRLwyf+n/idFCLI1UgVGboUU8oVziwTBiyNKQ== + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.7.7.tgz#46910c4d1926b9c6096421b23d1f9e159c1dcee1" + integrity sha512-S2mv9a5dc2pcpg/ConlKZx/6wXaEwHeqfo7x/QbXsdCAZm+WJC1ekVvL1TVxNsedTs5y/gG63MhJTEsmwmjtiA== dependencies: - core-js "^3.0.0" find-cache-dir "^2.0.0" lodash "^4.17.13" - mkdirp "^0.5.1" + make-dir "^2.1.0" pirates "^4.0.0" - source-map-support "^0.5.9" + source-map-support "^0.5.16" "@babel/runtime@7.0.0-beta.55": version "7.0.0-beta.55" @@ -618,45 +623,54 @@ regenerator-runtime "^0.12.0" "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" - integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.7.tgz#194769ca8d6d7790ec23605af9ee3e42a0aa79cf" + integrity sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA== dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" - integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== +"@babel/template@^7.0.0", "@babel/template@^7.4.0", "@babel/template@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" + integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" - integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" + integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/generator" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" - integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" + integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== dependencies: esutils "^2.0.2" lodash "^4.17.13" to-fast-properties "^2.0.0" +"@callstack/react-theme-provider@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@callstack/react-theme-provider/-/react-theme-provider-3.0.3.tgz#f964dda28cd6e731c3fbcf916b0579c6f9fb2db7" + integrity sha512-B+9JBK7zsND/AdVkjwHvbb4cR05fJofLFG30hOeoXke8WkKAWN36yFljauAhI8qwlXlGFGZMYE1wQvsqBSccrA== + dependencies: + "@types/hoist-non-react-statics" "^3.3.1" + deepmerge "^3.2.0" + hoist-non-react-statics "^3.3.0" + "@callstack/react-theme-provider@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@callstack/react-theme-provider/-/react-theme-provider-1.0.7.tgz#2d2fd1a1d965f36165eaa2e4da28aed1ade75484" @@ -824,15 +838,15 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@react-native-community/async-storage@^1.5.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@react-native-community/async-storage/-/async-storage-1.6.1.tgz#19be07fc1d65c77bdeb20f46108ba12076aad1c5" - integrity sha512-1WA28xfdhG+unkTEk/lXnqI2izv6belo0CYw7UdvaeHm8TIYT6eTmIIdGR7oiCa2xSKEnaPQqRMH6h7gyLNbww== +"@react-native-community/async-storage@^1.5.1", "@react-native-community/async-storage@^1.6.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@react-native-community/async-storage/-/async-storage-1.7.1.tgz#ef2104d865de61ad91bba66613e57e689ff4e6a1" + integrity sha512-/oX/x+EU4xNaqIaC/epVKzO8XghzImPA7l8cLz3USEFmtFiXFjBbTeeIFjjEm/u4/cv38Wi1xMEa10PHIWygRg== "@react-native-community/cli@^1.2.1": - version "1.11.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-1.11.2.tgz#b14967f24a389f5a16889a747345cf0e5757a2f1" - integrity sha512-5NuYd30f5PCTrGUbZLnusZKv5nfTWvTDTRa/3Q4vwdMnUQrhm9sZXWGQ5CnFoQ7cE58EAqhj6/ShXeJF3DZ9uQ== + version "1.12.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-1.12.0.tgz#f4cbc2204af63a87d5736d2fa6a018c1fd5efd44" + integrity sha512-GAs4JgVP8QkEYeZks/T7cCrBuwFJKxd9ksBLRdQ058uvLGkOEeS4g3y4GsVM/9C1zat5h6Z6QwU0h/hj7G3tzg== dependencies: chalk "^1.1.1" commander "^2.19.0" @@ -869,10 +883,17 @@ xcode "^2.0.0" xmldoc "^0.4.0" +"@react-native-community/datetimepicker@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@react-native-community/datetimepicker/-/datetimepicker-2.1.0.tgz#4e3413462cbbe5c48fab6cebd422835031cdf7b9" + integrity sha512-InktUrx0/4JTy1YsgswljgID7oB3L8wkFobRhnLGWPExSsNHeecGW2/nBP31ZaOPHcjVWhpOQMZt0zDpKfGE/Q== + dependencies: + invariant "^2.2.4" + "@react-navigation/core@^3.0.2": - version "3.4.2" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.4.2.tgz#bec563e94fde40fbab3730cdc97f22afbb2a1498" - integrity sha512-7G+iDzLSTeOUU4vVZeRZKJ+Bd7ds7ZxYNqZcB8i0KlBeQEQfR74Ounfu/p0KIEq2RiNnaE3QT7WVP3C87sebzw== + version "3.5.1" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.5.1.tgz#7a2339fca3496979305fb3a8ab88c2ca8d8c214d" + integrity sha512-q7NyhWVYOhVIWqL2GZKa6G78YarXaVTTtOlSDkvy4ZIggo40wZzamlnrJRvsaQX46gsgw45FAWb5SriHh8o7eA== dependencies: hoist-non-react-statics "^3.3.0" path-to-regexp "^1.7.0" @@ -880,9 +901,9 @@ react-is "^16.8.6" "@react-navigation/native@^3.1.1": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-3.5.0.tgz#f5d16e0845ac26d1147d1caa481f18a00740e7ae" - integrity sha512-TmGOis++ejEXG3sqNJhCSKqB0/qLu3FQgDtO959qpqif36R/diR8SQwJqeSdofoEiK3CepdhFlTCeHdS1/+MsQ== + version "3.6.2" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-3.6.2.tgz#3634697b6350cc5189657ae4551f2d52b57fbbf0" + integrity sha512-Cybeou6N82ZeRmgnGlu+wzlV3z5BZQR2dmYaNFV1TNLUGHqtvv8E7oNw9uYcz9Ox5LFbiX+FdNTn2d6ZPlK0kg== dependencies: hoist-non-react-statics "^3.0.1" react-native-safe-area-view "^0.14.1" @@ -897,9 +918,9 @@ inherits "~2.0.1" "@types/babel__core@^7.1.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f" - integrity sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg== + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" + integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -908,9 +929,9 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" - integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== dependencies: "@babel/types" "^7.0.0" @@ -923,12 +944,27 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" - integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012" + integrity sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw== dependencies: "@babel/types" "^7.3.0" +"@types/bn.js@^4.11.3": + version "4.11.5" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.5.tgz#40e36197433f78f807524ec623afcf0169ac81dc" + integrity sha512-AEAZcIZga0JgVMHNtl1CprA/hXX7/wPt79AgR4XqaDt7jyj3QWYw6LPoOiznPtugDmlubUnAahMs2PFxGcQrng== + dependencies: + "@types/node" "*" + +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -949,10 +985,28 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/node@*": + version "13.1.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.1.tgz#6d11a8c2d58405b3db9388ab740106cbfa64c3c9" + integrity sha512-hx6zWtudh3Arsbl3cXay+JnkvVgCKzCWKv42C9J01N2T2np4h8w5X8u6Tpz5mj38kE3M9FM0Pazx8vKFFMnjLQ== + "@types/node@^10.3.2": - version "10.14.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.16.tgz#4d690c96cbb7b2728afea0e260d680501b3da5cf" - integrity sha512-/opXIbfn0P+VLt+N8DE4l8Mn8rbhiJgabU96ZJ0p9mxOkIks5gh6RUnpHak7Yh0SFkyjO/ODbxsQQPV2bpMmyA== + version "10.17.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.13.tgz#ccebcdb990bd6139cd16e84c39dc2fb1023ca90c" + integrity sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg== + +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + +"@types/react@*": + version "16.9.17" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.17.tgz#58f0cc0e9ec2425d1441dd7b623421a867aa253e" + integrity sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" "@types/stack-utils@^1.0.1": version "1.0.1" @@ -960,14 +1014,14 @@ integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== "@types/yargs-parser@*": - version "13.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.0.0.tgz#453743c5bbf9f1bed61d959baab5b06be029b2d0" - integrity sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw== + version "13.1.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" + integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== "@types/yargs@^13.0.0": - version "13.0.2" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.2.tgz#a64674fc0149574ecd90ba746e932b5a5f7b3653" - integrity sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ== + version "13.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.4.tgz#53d231cebe1a540e7e13727fc1f0d13ad4a9ba3b" + integrity sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A== dependencies: "@types/yargs-parser" "*" @@ -990,9 +1044,9 @@ JSONStream@^1.0.3, JSONStream@^1.3.4, JSONStream@^1.3.5: through ">=2.2.7 <3" abab@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" - integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== abbrev@1, abbrev@~1.1.1: version "1.1.1" @@ -1004,6 +1058,13 @@ absolute-path@^0.0.0: resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" integrity sha1-p4di+9rftSl76ZsV01p4Wy8JW/c= +abstract-leveldown@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.1.tgz#f9014a5669b746418e145168dea49a044ae15900" + integrity sha1-+QFKVmm3RkGOFFFo3qSaBErhWQA= + dependencies: + xtend "~4.0.0" + abstract-leveldown@~6.0.0: version "6.0.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz#b4b6159343c74b0c5197b2817854782d8f748c4a" @@ -1021,9 +1082,9 @@ accepts@~1.3.5, accepts@~1.3.7: negotiator "0.6.2" acorn-globals@^4.1.0: - version "4.3.3" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.3.tgz#a86f75b69680b8780d30edd21eee4e0ea170c05e" - integrity sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ== + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== dependencies: acorn "^6.0.1" acorn-walk "^6.0.1" @@ -1053,14 +1114,14 @@ acorn@^5.5.3: integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== acorn@^6.0.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" - integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== acorn@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.0.0.tgz#26b8d1cd9a9b700350b71c0905546f64d1284e7a" - integrity sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== aes-js@3.0.0: version "3.0.0" @@ -1069,7 +1130,7 @@ aes-js@3.0.0: "agama-wallet-lib@git://github.com/VerusCoin/agama-wallet-lib.git#mobile": version "0.3.4" - resolved "git://github.com/VerusCoin/agama-wallet-lib.git#73e541b5d4c830ebdfa2047bb3c8f8e8f5fa80dc" + resolved "git://github.com/VerusCoin/agama-wallet-lib.git#c6cd187e68ecb511922a4562fa0e76b2612d714f" dependencies: bigi "^1.4.2" bip32 "^1.0.2" @@ -1092,7 +1153,7 @@ aes-js@3.0.0: iocane "^1.0.0" js-sha256 "^0.7.1" nodejs-aes256 "^1.0.1" - npm "^6.8.0" + npm "^6.13.4" passwd-strength "git+https://github.com/pbca26/passwd-strength" sha256 "^0.2.0" tx-decoder "git+https://github.com/pbca26/tx-decoder" @@ -1259,6 +1320,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argsarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/argsarray/-/argsarray-0.0.1.tgz#6e7207b4ecdb39b0af88303fa5ae22bda8df61cb" + integrity sha1-bnIHtOzbObCviDA/pa4ivajfYcs= + arr-diff@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" @@ -1304,6 +1370,11 @@ array-filter@~0.0.0: resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= +array-find-index@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + array-map@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" @@ -1334,7 +1405,7 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -art@^0.10.0: +art@^0.10.0, art@^0.10.1: version "0.10.3" resolved "https://registry.yarnpkg.com/art/-/art-0.10.3.tgz#b01d84a968ccce6208df55a733838c96caeeaea2" integrity sha512-HXwbdofRTiJT6qZX/FnchtldzJjS3vkLJxQilc3Xj+ma2MXjY4UAyQ0ls1XZYVnDvVIBiFZbC6QsvtW86TD6tQ== @@ -1405,7 +1476,18 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.1.1: +asyncstorage-down@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/asyncstorage-down/-/asyncstorage-down-4.2.0.tgz#6d126f42e6e4db0a25113e118ff618f2d4534046" + integrity sha512-xTljBjicpnxsoA7yEs6duXFXWEZC0V1Q/PeKcUM7Cd2k2W1XPGfyBY1kPXBxTqR++u6ZuDa5egnU8/E/WkJv4Q== + dependencies: + abstract-leveldown "2.6.1" + argsarray "0.0.1" + d64 "^1.0.0" + ltgt "^2.1.3" + tiny-queue "0.2.0" + +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== @@ -1420,6 +1502,14 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== +axios@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" + integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -1429,7 +1519,32 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-generator@^6.18.0: +babel-core@^6.26.0, babel-core@^6.26.3: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.18.0, babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== @@ -1567,6 +1682,14 @@ babel-helper-replace-supers@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-jest@23.6.0: version "23.6.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" @@ -1987,9 +2110,9 @@ babel-preset-es2015@^6.24.1: babel-plugin-transform-regenerator "^6.24.1" babel-preset-fbjs@^3.0.1, babel-preset-fbjs@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz#c0e6347d3e0379ed84b3c2434d3467567aa05297" - integrity sha512-5Jo+JeWiVz2wHUUyAlvb/sSYnXNig9r+HqGAOSfh5Fzxp7SnAaR/tEGRJ1ZX7C77kfk82658w6R5Z+uPATTD9g== + version "3.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz#a6024764ea86c8e06a22d794ca8b69534d263541" + integrity sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw== dependencies: "@babel/plugin-proposal-class-properties" "^7.0.0" "@babel/plugin-proposal-object-rest-spread" "^7.0.0" @@ -2056,6 +2179,19 @@ babel-preset-stage-3@^6.24.1: babel-plugin-transform-exponentiation-operator "^6.24.1" babel-plugin-transform-object-rest-spread "^6.22.0" +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -2110,7 +2246,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base-64@^0.1.0: +base-64@0.1.0, base-64@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha1-eAqZyE59YAJgNhURxId2E78k9rs= @@ -2128,9 +2264,9 @@ base-x@^1.1.0: integrity sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w= base-x@^3.0.2: - version "3.0.6" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.6.tgz#de047ec95f5f7b99ae63d830a2a894c96538b2cd" - integrity sha512-4PaF8u2+AlViJxRVjurkLTxpp7CaFRD/jo5rPT9ONnKxyhQ8f59yzamEvq7EkriG56yn5On4ONyaG75HLqr46w== + version "3.0.7" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.7.tgz#1c5a7fafe8f66b4114063e8da102799d4e7c408f" + integrity sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw== dependencies: safe-buffer "^5.0.1" @@ -2181,10 +2317,10 @@ bech32@^1.1.2, bech32@^1.1.3: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.3.tgz#bd47a8986bbb3eec34a56a097a84b8d3e9a2dfcd" integrity sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg== -big-integer@^1.6.7: - version "1.6.44" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.44.tgz#4ee9ae5f5839fc11ade338fea216b4513454a539" - integrity sha512-7MzElZPTyJ2fNvBkPxtFQ2fWIkVmuzw41+BZHSzpEq3ymB2MfeKp1+yXl/tS75xCx+WnyV+yb0kp+K1C3UNwmQ== +big-integer@^1.6.44, big-integer@^1.6.7: + version "1.6.48" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" + integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== bigi@^1.1.0, bigi@^1.4.0, bigi@^1.4.2: version "1.4.2" @@ -2192,9 +2328,9 @@ bigi@^1.1.0, bigi@^1.4.0, bigi@^1.4.2: integrity sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU= bin-links@^1.1.2, bin-links@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.6.tgz#30d33e810829305e5e61b90cfcb9a3a4f65eb516" - integrity sha512-b5rV3uVyrlrJWLI3mawUUf5t2f9mCEQm/TqT5zNj6DPYhYDZaNp0AYaYd/CVASkSEklayNDLliZHVdo2J3niPw== + version "1.1.7" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.7.tgz#34b79ea9d0e575d7308afeff0c6b2fc24c793359" + integrity sha512-/eaLaTu7G7/o7PV04QPy1HRT65zf+1tFkPGv0sPTV0tRwufooYBQO3zrcyGgm+ja+ZtBf2GEuKjDRJ2pPG+yqA== dependencies: bluebird "^3.5.3" cmd-shim "^3.0.0" @@ -2208,7 +2344,7 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== -bindings@^1.2.1, bindings@^1.3.0, bindings@^1.5.0: +bindings@^1.3.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== @@ -2469,6 +2605,11 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" @@ -2482,14 +2623,21 @@ boxen@^1.2.1: term-size "^1.2.0" widest-line "^2.0.0" -bplist-creator@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.7.tgz#37df1536092824b87c42f957b01344117372ae45" - integrity sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU= +bplist-creator@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.8.tgz#56b2a6e79e9aec3fc33bf831d09347d73794e79c" + integrity sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA== dependencies: stream-buffers "~2.2.0" -bplist-parser@0.1.1, bplist-parser@^0.1.0: +bplist-parser@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + +bplist-parser@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6" integrity sha1-1g1dzCDLptx+HymbNdPh+V2vuuY= @@ -2696,10 +2844,10 @@ bs58check@^1.0.5: bs58 "^3.1.0" create-hash "^1.1.0" -bser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" - integrity sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg== +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" @@ -2734,18 +2882,18 @@ buffer-xor@^1.0.3: integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" buffer@^5.0.0, buffer@^5.0.2: - version "5.4.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.0.tgz#33294f5c1f26e08461e528b69fa06de3c45cbd8c" - integrity sha512-Xpgy0IwHK2N01ncykXTy6FpCWuM+CJSHoPVBLyNqyrWxsedpLvwsYUhf0ME3WRFNUhos0dMamz9cOS/xRDtU5g== + version "5.4.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" + integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -2855,6 +3003,13 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +can-promise@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/can-promise/-/can-promise-0.0.1.tgz#7a7597ad801fb14c8b22341dfec314b6bd6ad8d3" + integrity sha512-gzVrHyyrvgt0YpDm7pn04MQt8gjh0ZAhN4ZDyCRtGl6YnuuK6b4aiUTD7G52r9l4YNmxfTtEscb92vxtAlL6XQ== + dependencies: + window-or-global "^1.0.1" + capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -3058,7 +3213,7 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -"coinselect@github:bitcoinjs/coinselect": +coinselect@^3.1.11, "coinselect@github:bitcoinjs/coinselect": version "3.1.11" resolved "https://codeload.github.com/bitcoinjs/coinselect/tar.gz/288f24d221e5f1e5beac883043cc706914b2b2bd" @@ -3138,10 +3293,10 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.19.0, commander@^2.9.0, commander@~2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +commander@^2.19.0, commander@^2.9.0, commander@~2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@~2.13.0: version "2.13.0" @@ -3224,11 +3379,9 @@ connect@^3.6.5: utils-merge "1.0.1" console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" @@ -3245,10 +3398,10 @@ convert-hex@~0.1.0: resolved "https://registry.yarnpkg.com/convert-hex/-/convert-hex-0.1.0.tgz#08c04568922c27776b8a2e81a95d393362ea0b65" integrity sha1-CMBFaJIsJ3drii6BqV05M2LqC2U= -convert-source-map@^1.1.0, convert-source-map@^1.4.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== +convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" @@ -3280,9 +3433,9 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= cordova-common@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cordova-common/-/cordova-common-3.2.0.tgz#9a5c9215f817d7a08fbd014bf963c544e1feb671" - integrity sha512-EvlQ6PirfR65hGDoQvsluW00uSS2MTVIRKQ3c1Xvsddx7D5T5JgF3fHWkGik/Y/8yNcpI0zI2NcJyie2z/ak2A== + version "3.2.1" + resolved "https://registry.yarnpkg.com/cordova-common/-/cordova-common-3.2.1.tgz#f4fdbeb40d9049fe28a09fa901756ed66d246661" + integrity sha512-xg0EnjnA6EipxXG8cupdlYQYeDA6+ghbN+Pjq88xN1LInwP6Bo7IyGBdSV5QnfjOvzShF9BBwSxBAv0FOO0C2Q== dependencies: ansi "^0.3.1" bplist-parser "^0.1.0" @@ -3303,15 +3456,10 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.2.2, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.7: - version "2.6.9" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" - integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== - -core-js@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" - integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== +core-js@^2.2.2, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.5.7: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -3366,7 +3514,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.3, create-hmac@^1.1.4, safe-buffer "^5.0.1" sha.js "^2.4.8" -create-react-class@^15.6.3: +create-react-class@^15.6.2, create-react-class@^15.6.3: version "15.6.3" resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg== @@ -3425,6 +3573,37 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +css-in-js-utils@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" + integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== + dependencies: + hyphenate-style-name "^1.0.2" + isobject "^3.0.1" + +css-select@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@^1.0.0-alpha.37: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" + integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" @@ -3437,11 +3616,21 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" +csstype@^2.2.0: + version "2.6.8" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431" + integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA== + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +d64@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d64/-/d64-1.0.0.tgz#4002a87e850cbfc9f9d9706b60fca613a3336e90" + integrity sha1-QAKofoUMv8n52XBrYPymE6MzbpA= + dash-ast@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" @@ -3463,31 +3652,26 @@ data-urls@^1.0.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - debounce@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.1.0, debug@~3.1.0: +debug@3.1.0, debug@=3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -debug@^3.1.0, debug@^3.2.6: +debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -3501,7 +3685,7 @@ debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -3521,10 +3705,24 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-equal@^1.0.0, deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= +deep-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-3.0.0.tgz#c8e4c4d401cba25550a2f0f486a2e75bc5f219a2" + integrity sha512-YX2i9XjJ7h5q/aQ/IM9PEwEnDqETAIYbggmdDB3HLTlSgo1CxPsj6pvhPG68rq6SVE0+p+6Ywsm5fTYNrYtBWw== + dependencies: + is-obj "^1.0.0" + +deep-equal@^1.0.0, deep-equal@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" deep-extend@^0.6.0: version "0.6.0" @@ -3541,6 +3739,11 @@ deepmerge@^2.1.1: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== +deepmerge@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" + integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== + defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -3611,19 +3814,19 @@ depd@~1.1.2: integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= deps-sort@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" - integrity sha1-CRckkC6EZYJg65EHSMzNGvbiH7U= + version "2.0.1" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" + integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== dependencies: JSONStream "^1.0.3" - shasum "^1.0.0" + shasum-object "^1.0.0" subarg "^1.0.0" through2 "^2.0.0" des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -3645,17 +3848,12 @@ detect-indent@~5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= -detective@^5.0.2: +detective@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== @@ -3696,6 +3894,14 @@ dns.js@^1.0.1: resolved "https://registry.yarnpkg.com/dns.js/-/dns.js-1.0.1.tgz#bfc0950d79777728c67500b1c418075e653955ee" integrity sha1-v8CVDXl3dyjGdQCxxBgHXmU5Ve4= +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + dom-walk@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" @@ -3706,6 +3912,16 @@ domain-browser@^1.1.7, domain-browser@^1.2.0: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" @@ -3713,6 +3929,14 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" @@ -3809,10 +4033,10 @@ elliptic@=3.0.3: hash.js "^1.0.0" inherits "^2.0.1" -elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.0.tgz#2b8ed4c891b7de3200e14412a5b8248c7af505ca" - integrity sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg== +elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -3855,10 +4079,15 @@ endent@^1.1.1: fast-json-parse "^1.0.3" objectorarray "^1.0.3" -env-paths@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" - integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA= +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +env-paths@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== envinfo@^5.7.0: version "5.12.1" @@ -3893,42 +4122,21 @@ errorhandler@^1.5.0: escape-html "~1.0.3" es-abstract@^1.17.0-next.1: - version "1.17.0-next.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0-next.1.tgz#94acc93e20b05a6e96dacb5ab2f1cb3a81fc2172" - integrity sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw== + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.1.4" - is-regex "^1.0.4" + is-callable "^1.1.5" + is-regex "^1.0.5" object-inspect "^1.7.0" object-keys "^1.1.1" object.assign "^4.1.0" - string.prototype.trimleft "^2.1.0" - string.prototype.trimright "^2.1.0" - -es-abstract@^1.5.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" - -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -3956,6 +4164,11 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escape-string-regexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3999,16 +4212,16 @@ etag@~1.8.1: integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= ethereumjs-util@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#e9c51e5549e8ebd757a339cc00f5380507e799c8" - integrity sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q== + version "6.2.0" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz#23ec79b2488a7d041242f01e25f24e5ad0357960" + integrity sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ== dependencies: + "@types/bn.js" "^4.11.3" bn.js "^4.11.0" create-hash "^1.1.2" ethjs-util "0.1.6" - keccak "^1.0.2" - rlp "^2.0.0" - safe-buffer "^5.1.1" + keccak "^2.0.0" + rlp "^2.2.3" secp256k1 "^3.0.1" "ethers@git+https://github.com/pbca26/ethers.js": @@ -4070,9 +4283,9 @@ exec-sh@^0.2.0: merge "^1.2.0" exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" - integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== execa@^0.7.0: version "0.7.0" @@ -4225,21 +4438,26 @@ fast-json-parse@^1.0.3: integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.4: +fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-safe-stringify@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== dependencies: - bser "^2.0.0" + bser "2.1.1" fbjs-css-vars@^1.0.0: version "1.0.2" @@ -4399,6 +4617,13 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + for-each@~0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -4551,12 +4776,12 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.3, fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== dependencies: + bindings "^1.5.0" nan "^2.12.1" - node-pre-gyp "^0.12.0" fstream@^1.0.0: version "1.0.12" @@ -4568,11 +4793,16 @@ fstream@^1.0.0: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: +function-bind@^1.1.1, function-bind@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +fuse.js@3.4.5: + version "3.4.5" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.4.5.tgz#8954fb43f9729bd5dbcb8c08f251db552595a7a6" + integrity sha512-s9PGTaQIkT69HaeoTVjwGsLfb8V8ScJLx5XGFcKHg0MqLUH/UZ4EKOtqtXX9k7AFqCGxD1aJmYb8Q5VYDibVRQ== + fwd-stream@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/fwd-stream/-/fwd-stream-1.0.4.tgz#ed281cabed46feecf921ee32dc4c50b372ac7cfa" @@ -4689,7 +4919,19 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.4: +glob@7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" + integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo= + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -4743,7 +4985,7 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.3: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== @@ -4762,10 +5004,15 @@ gud@^1.0.0: resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== -handlebars@^4.1.2, handlebars@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.4.0.tgz#22e1a897c5d83023d39801f35f6b65cf97ed8b25" - integrity sha512-xkRtOt3/3DzTKMOt3xahj2M/EqNhY988T+imYSlMgs5fVhLN2fmKVVj0LtEGmb+3UUYV5Qmm1052Mm3dIQxOvw== +hammerjs@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" + integrity sha1-BO93hiz/K7edMPdpIJWTAiK/YPE= + +handlebars@^4.1.2, handlebars@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" + integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -4839,7 +5086,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.0, has@^1.0.1, has@^1.0.3, has@~1.0.3: +has@^1.0.0, has@^1.0.3, has@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -4885,12 +5132,20 @@ hoist-non-react-statics@^2.2.0, hoist-non-react-statics@^2.3.1, hoist-non-react- integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== hoist-non-react-statics@^3.0.1, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" - integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== + version "3.3.1" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#101685d3aff3b23ea213163f6e8e12f4f111e19f" + integrity sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw== dependencies: react-is "^16.7.0" +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + hosted-git-info@^2.1.4, hosted-git-info@^2.7.1, hosted-git-info@^2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" @@ -4974,7 +5229,12 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" + integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ== + +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5029,7 +5289,7 @@ import-local@^2.0.0: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -5093,6 +5353,13 @@ inline-source-map@~0.6.0: dependencies: source-map "~0.5.3" +inline-style-prefixer@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-5.1.0.tgz#cb63195f9456dcda25cf59743e45c4d9815b0811" + integrity sha512-giteQHPMrApQOSjNSjteO5ZGSGMRf9gas14fRy2lg2buSc1nRnj6o6xuNds5cMTKrkncyrTu3gJn/yflFMVdmg== + dependencies: + css-in-js-utils "^2.0.0" + inquirer@3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" @@ -5153,7 +5420,12 @@ install@^0.12.2: resolved "https://registry.yarnpkg.com/install/-/install-0.12.2.tgz#ea10e9b2cbb5b0484f25080b24b5b34429d9f564" integrity sha512-+7thTb4Rpvs9mnlhHKGZFJbGOO6kyMgy+gg0sgM5vFzIFK0wrCYXqdlaM71Bi289DTuPHf61puMFsaZBcwDIrg== -invariant@^2.2.2, invariant@^2.2.4: +interpret@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invariant@2.2.4, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -5206,6 +5478,11 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -5228,10 +5505,15 @@ is-buffer@^1.1.0, is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.3, is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-buffer@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== is-ci@^1.0.10: version "1.2.1" @@ -5269,9 +5551,9 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== is-descriptor@^0.1.0: version "0.1.6" @@ -5313,7 +5595,7 @@ is-extendable@^0.1.0, is-extendable@^0.1.1: resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= -is-extendable@^1.0.1: +is-extendable@^1.0.0, is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== @@ -5449,12 +5731,12 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= +is-regex@^1.0.4, is-regex@^1.0.5, is-regex@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== dependencies: - has "^1.0.1" + has "^1.0.3" is-retry-allowed@^1.0.0: version "1.2.0" @@ -5985,6 +6267,11 @@ jest@^24.9.0: import-local "^2.0.0" jest-cli "^24.9.0" +jetifier@^1.6.4: + version "1.6.5" + resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.5.tgz#ea87324a4230bef20a9651178ecab978ee54a8cb" + integrity sha512-T7yzBSu9PR+DqjYt+I0KVO1XTb1QhAfHnXV5Nd3xpbXM6Xg4e3vP60Q4qkNU8Fh6PHC2PivPUNN3rY7G2MxcDQ== + js-sha256@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.7.1.tgz#929c4244ecf19d535404c338b19ab693f5cf4b1b" @@ -6104,10 +6391,15 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== dependencies: minimist "^1.2.0" @@ -6150,15 +6442,15 @@ jsqr@^0.2.2: resolved "https://registry.yarnpkg.com/jsqr/-/jsqr-0.2.2.tgz#8c1f0279fb7c94542aaa9e8aeb7c722d523ea092" integrity sha1-jB8Ceft8lFQqqp6K63xyLVI+oJI= -keccak@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" - integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw== +keccak@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-2.1.0.tgz#734ea53f2edcfd0f42cdb8d5f4c358fef052752b" + integrity sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q== dependencies: - bindings "^1.2.1" - inherits "^2.0.3" - nan "^2.2.1" - safe-buffer "^5.1.0" + bindings "^1.5.0" + inherits "^2.0.4" + nan "^2.14.0" + safe-buffer "^5.2.0" kefir@^3.7.3: version "3.8.6" @@ -6310,13 +6602,13 @@ level-fix-range@~1.0.2: string-range "~1.2" level-iterator-stream@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.1.tgz#65c467070c0788fe0d08a0c1ed600c3b9e82bc8d" - integrity sha512-pSZWqXK6/yHQkZKCHrR59nKpU5iqorKM22C/BOHTb/cwNQ2EOZG+bovmFFGcOgaBoF3KxqJEI27YwewhJQTzsw== - dependencies: - inherits "^2.0.1" - readable-stream "^3.0.2" - xtend "^4.0.0" + version "4.0.2" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" + integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== + dependencies: + inherits "^2.0.4" + readable-stream "^3.4.0" + xtend "^4.0.2" level-peek@1.0.6, level-peek@^1.0.6: version "1.0.6" @@ -6559,11 +6851,6 @@ lodash-es@^4.2.1: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= - lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -6572,33 +6859,11 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= -lodash._getnative@*, lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= - lodash._root@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" @@ -6634,11 +6899,6 @@ lodash.padstart@^4.1.0: resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" integrity sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs= -lodash.restparam@*: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -6654,6 +6914,11 @@ lodash.times@^4.3.2: resolved "https://registry.yarnpkg.com/lodash.times/-/lodash.times-4.3.2.tgz#3e1f2565c431754d54ab57f2ed1741939285ca1d" integrity sha1-Ph8lZcQxdU1Uq1fy7RdBk5KFyh0= +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + lodash.union@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" @@ -6669,7 +6934,7 @@ lodash.without@~4.4.0: resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= -lodash@=3.10.1, lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.6.1: +lodash@=3.10.1, lodash@^4.0.0, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.6.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -6701,6 +6966,11 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +ltgt@^2.1.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -6768,6 +7038,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + meant@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d" @@ -7195,12 +7470,7 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.40.0, "mime-db@>= 1.40.0 < 2": - version "1.40.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== - -mime-db@1.42.0: +mime-db@1.42.0, "mime-db@>= 1.40.0 < 2": version "1.42.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== @@ -7217,20 +7487,13 @@ mime-types@2.1.11: dependencies: mime-db "~1.23.0" -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.25" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== dependencies: mime-db "1.42.0" -mime-types@~2.1.24: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== - dependencies: - mime-db "1.40.0" - mime@1.6.0, mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -7263,7 +7526,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.0, minimatch@^3.0.4: +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -7331,17 +7594,24 @@ mixin-deep@^1.2.0: dependencies: minimist "0.0.8" +modal-react-native-web@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/modal-react-native-web/-/modal-react-native-web-0.2.0.tgz#5daaa76213218fd25df739a267b11aed37e8c0c2" + integrity sha512-sC0/jL3ZL4bGtv1VS43TnrH7/FHUqgb7IU3VYWNDzuR223fYlpG5Gc974GsTP172Vi+lnnBL/G70xONmaggxeQ== + dependencies: + warning "^4.0.1" + module-deps@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.1.tgz#cfe558784060e926824f474b4e647287837cda50" - integrity sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A== + version "6.2.2" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.2.tgz#d8a15c2265dfc119153c29bb47386987d0ee423b" + integrity sha512-a9y6yDv5u5I4A+IPHTnqFxcaKr4p50/zxTjcQJaX2ws9tN/W6J6YXnEKhqRyPhl494dkcxx951onSKVezmI+3w== dependencies: JSONStream "^1.0.3" browser-resolve "^1.7.0" cached-path-relative "^1.0.2" concat-stream "~1.6.0" defined "^1.0.0" - detective "^5.0.2" + detective "^5.2.0" duplexer2 "^0.1.2" inherits "^2.0.1" parents "^1.0.0" @@ -7400,7 +7670,7 @@ mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.12.1, nan@^2.13.2, nan@^2.14.0, nan@^2.2.1: +nan@^2.12.1, nan@^2.13.2, nan@^2.14.0: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== @@ -7432,15 +7702,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -7456,6 +7717,13 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-emoji@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" + integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== + dependencies: + lodash.toarray "^4.4.0" + node-fetch-npm@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" @@ -7505,21 +7773,21 @@ node-gyp@^3.8.0: which "1" node-gyp@^5.0.2, node-gyp@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.0.5.tgz#f6cf1da246eb8c42b097d7cd4d6c3ce23a4163af" - integrity sha512-WABl9s4/mqQdZneZHVWVG4TVr6QQJZUC6PAx47ITSk9lreZ1n+7Z9mMAIbA3vnO4J9W20P7LhCxtzfWsAD/KDw== + version "5.0.7" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.0.7.tgz#dd4225e735e840cf2870e4037c2ed9c28a31719e" + integrity sha512-K8aByl8OJD51V0VbUURTKsmdswkQQusIvlvmTyhHlIT1hBvaSxzdxpSle857XuXa7uc02UEZx9OR5aDxSWS5Qw== dependencies: - env-paths "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.1.2" + request "^2.88.0" + rimraf "^2.6.3" + semver "^5.7.1" tar "^4.4.12" - which "1" + which "^1.3.1" node-int64@^0.4.0: version "0.4.0" @@ -7542,22 +7810,6 @@ node-notifier@^5.2.1, node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - nodejs-aes256@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nodejs-aes256/-/nodejs-aes256-1.0.1.tgz#bb68cb3f3591c2888c1a136e9667cc1a8ee15448" @@ -7578,6 +7830,11 @@ nopt@^4.0.1, nopt@~4.0.1: abbrev "1" osenv "^0.1.4" +normalize-css-color@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/normalize-css-color/-/normalize-css-color-1.0.2.tgz#02991e97cccec6623fe573afbbf0de6a1f3e9f8d" + integrity sha1-Apkel8zOxmI/5XOvu/Deah8+n40= + normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -7661,7 +7918,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: semver "^5.6.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.12, npm-packlist@^1.1.6, npm-packlist@^1.4.7: +npm-packlist@^1.1.12, npm-packlist@^1.4.7: version "1.4.7" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.7.tgz#9e954365a06b80b18111ea900945af4f88ed4848" integrity sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ== @@ -7712,7 +7969,7 @@ npm-user-validate@~1.0.0: resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" integrity sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE= -npm@^6.8.0: +npm@^6.13.4: version "6.13.4" resolved "https://registry.yarnpkg.com/npm/-/npm-6.13.4.tgz#1e95b0f311999cf682384c38865dfeb3127203bb" integrity sha512-vTcUL4SCg3AzwInWTbqg1OIaOXlzKSS8Mb8kc5avwrJpcvevDA5J9BhYSuei+fNs3pwOp4lzA5x2FVDXACvoXA== @@ -7735,7 +7992,6 @@ npm@^6.8.0: cmd-shim "^3.0.3" columnify "~1.5.4" config-chain "^1.1.12" - debuglog "*" detect-indent "~5.0.0" detect-newline "^2.1.0" dezalgo "~1.0.3" @@ -7750,7 +8006,6 @@ npm@^6.8.0: has-unicode "~2.0.1" hosted-git-info "^2.8.5" iferr "^1.0.2" - imurmurhash "*" infer-owner "^1.0.4" inflight "~1.0.6" inherits "^2.0.4" @@ -7769,14 +8024,8 @@ npm@^6.8.0: libnpx "^10.2.0" lock-verify "^2.1.0" lockfile "^1.0.4" - lodash._baseindexof "*" lodash._baseuniq "~4.6.0" - lodash._bindcallback "*" - lodash._cacheindexof "*" - lodash._createcache "*" - lodash._getnative "*" lodash.clonedeep "~4.5.0" - lodash.restparam "*" lodash.union "~4.6.0" lodash.uniq "~4.5.0" lodash.without "~4.4.0" @@ -7841,7 +8090,7 @@ npm@^6.8.0: worker-farm "^1.7.0" write-file-atomic "^2.4.3" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2, npmlog@^4.1.2, npmlog@~4.1.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.1.2, npmlog@~4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -7860,6 +8109,13 @@ npmlog@^2.0.4: are-we-there-yet "~1.1.2" gauge "~1.2.5" +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + nullthrows@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" @@ -7871,9 +8127,9 @@ number-is-nan@^1.0.0: integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nwsapi@^2.0.7: - version "2.1.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" - integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== oauth-sign@~0.9.0: version "0.9.0" @@ -7894,15 +8150,15 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: +object-inspect@^1.7.0, object-inspect@~1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== -object-inspect@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== +object-is@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" + integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -7951,6 +8207,13 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" +object.omit@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-3.0.0.tgz#0e3edc2fce2ba54df5577ff529f6d97bd8a522af" + integrity sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ== + dependencies: + is-extendable "^1.0.0" + object.pick@^1.1.1, object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -7996,6 +8259,11 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +opencollective-postinstall@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" + integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== + opencollective@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" @@ -8037,16 +8305,16 @@ optimist@^0.6.1: wordwrap "~0.0.2" optionator@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" - fast-levenshtein "~2.0.4" + fast-levenshtein "~2.0.6" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" - wordwrap "~1.0.0" + word-wrap "~1.2.3" options@>=0.0.5: version "0.0.6" @@ -8086,7 +8354,7 @@ os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -8237,9 +8505,9 @@ parents@^1.0.0, parents@^1.0.1: path-platform "~0.11.15" parse-asn1@^5.0.0: - version "5.1.4" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" - integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -8298,9 +8566,9 @@ pascalcase@^0.1.1: resolved "git+https://github.com/pbca26/passwd-strength#3890ea7d0c5efb2ebaae0c3e93770f62ae7ec4c5" patch-package@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.1.2.tgz#9ed0b3defb5c34ecbef3f334ddfb13e01b3d3ff6" - integrity sha512-5GnzR8lEyeleeariG+hGabUnD2b1yL7AIGFjlLo95zMGRWhZCel58IpeKD46wwPb7i+uNhUI8unV56ogk8Bgqg== + version "6.2.0" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.0.tgz#677de858e352b6ca4e6cb48a6efde2cec9fde566" + integrity sha512-HWlQflaBBMjLBfOWomfolF8aqsFDeNbSNro1JDUgYqnVvPM5OILJ9DQdwIRiKmGaOsmHvhkl1FYkvv1I9r2ZJw== dependencies: "@yarnpkg/lockfile" "^1.1.0" chalk "^2.4.2" @@ -8369,9 +8637,9 @@ path-platform@~0.11.15: integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: isarray "0.0.1" @@ -8530,7 +8798,7 @@ pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" -private@^0.1.6: +private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -8566,9 +8834,9 @@ promise@^7.1.1: asap "~2.0.3" prompts@^2.0.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.2.1.tgz#f901dd2a2dfee080359c0e20059b24188d75ad35" - integrity sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw== + version "2.3.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4" + integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg== dependencies: kleur "^3.0.3" sisteransi "^1.0.3" @@ -8580,7 +8848,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.7.2, prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -8611,15 +8879,10 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: - version "1.6.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.6.0.tgz#60557582ee23b6c43719d9890fb4170ecd91e110" - integrity sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA== - -psl@^1.1.28: - version "1.3.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd" - integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag== +psl@^1.1.24, psl@^1.1.28: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== public-encrypt@^4.0.0: version "4.0.3" @@ -8703,15 +8966,16 @@ qrcode.react@^0.7.1: prop-types "^15.5.8" qr.js "0.0.0" -qrcode@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.1.tgz#2126814985d0dbbd9aee050fc523d319c6a7dc3b" - integrity sha512-3JhHQJkKqJL4PfoM6t+B40f0GWv9eNJAJmuNx2X/sHEOLvMyvEPN8GfbdN1qmr19O8N2nLraOzeWjXocHz1S4w== +qrcode@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.2.0.tgz#330d24313fbf8d429a806091af9525250239e44a" + integrity sha512-wZK0Z0eYmOUDP2tOGzmLdeBn5Npa+4wms9GdvzH7HrywvGUq/Stz0BKUhW4DfmBf1PSrm9dNfdnVDq683Zxvag== dependencies: + can-promise "^0.0.1" dijkstrajs "^1.0.1" isarray "^2.0.1" pngjs "^3.3.0" - yargs "^13.2.4" + yargs "^8.0.2" qs@~6.5.2: version "6.5.2" @@ -8767,7 +9031,7 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -8777,6 +9041,23 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-art@^16.12.0: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-art/-/react-art-16.12.0.tgz#3a0169e4db262f2c663e38488f81a1ba4b0045c6" + integrity sha512-Bsszw6UYZ4C6IbkcvPeEx5qerALTCkHrTbh1x/hF4MmP5Bm8bk1PRfvxSaxC4VZ5HgTHF9FUvHk9jIogXE82Uw== + dependencies: + art "^0.10.1" + create-react-class "^15.6.2" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.18.0" + +react-async-hook@3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/react-async-hook/-/react-async-hook-3.6.1.tgz#aed3e492d87319392865c83ed7cef3609e2a7fef" + integrity sha512-YWBB2feVQF79t5u2raMPHlZ8975Jds+guCvkWVC4kRLDlSCouLsYpQm4DGSqPeHvoHYVVcDfqNayLZAXQmnxnw== + react-clone-referenced-element@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/react-clone-referenced-element/-/react-clone-referenced-element-1.1.0.tgz#9cdda7f2aeb54fea791f3ab8c6ab96c7a77d0158" @@ -8796,19 +9077,19 @@ react-devtools-core@^3.6.0: ws "^3.3.1" react-dom@^16.4.2: - version "16.9.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.9.0.tgz#5e65527a5e26f22ae3701131bcccaee9fb0d3962" - integrity sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" + integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.15.0" + scheduler "^0.18.0" react-is@^16.5.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: - version "16.9.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" - integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: version "3.0.4" @@ -8833,6 +9114,18 @@ react-native-camera@^1.10.1: dependencies: prop-types "^15.6.2" +react-native-country-picker-modal@^1.5.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/react-native-country-picker-modal/-/react-native-country-picker-modal-1.10.0.tgz#ff4a3b73f08d5241f75f9edfaa2ad4cc0b1823f7" + integrity sha512-NkPBF7GJRp1FONiirN0vOLb9q6HKA/S1oIVNQUNGk9lVv5OLJ5Op3XhY7f+Dg4g7tF/M3kMXZWuvRWmKoHrMMQ== + dependencies: + "@callstack/react-theme-provider" "3.0.3" + fuse.js "3.4.5" + modal-react-native-web "0.2.0" + node-emoji "1.10.0" + prop-types "15.7.2" + react-async-hook "3.6.1" + react-native-crypto@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/react-native-crypto/-/react-native-crypto-2.2.0.tgz#c999ed7c96064f830e1f958687f53d0c44025770" @@ -8878,13 +9171,28 @@ react-native-elements@^0.19.1: opencollective "^1.0.3" prop-types "^15.5.8" -react-native-fs@^2.14.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-2.14.1.tgz#61c70a865b5b5bcb020dd4e4befd60a2c20c836f" - integrity sha512-ZcfiwNP+FBgvv2eRk0B62/NI58mbjszjjYvQlP352HLkUqVsK4Ld6X8fdBO1lZAz6SgitUk8WEc9NEciRIt31g== +react-native-fs@~2.15.0: + version "2.15.3" + resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-2.15.3.tgz#1a7757759bfba5b08d4087433bf068fb5fe9a699" + integrity sha512-fKCfFOiRPLj/Pj8G70Qm0kRU51g40uYOee9aqjkY6yZeMG8uD+4rz1/WRi8r9QdJawxZomyhEc/60hVgLVgE3g== dependencies: base-64 "^0.1.0" - utf8 "^2.1.1" + utf8 "^3.0.0" + +react-native-gesture-handler@~1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-1.4.1.tgz#c38d9e57637b95e221722a79f2bafac62e3aeb21" + integrity sha512-Ffcs+SbEbkGaal0CClYL+v7A9y4OA5G5lW01qrzjxaqASp5C8BfnWSKuqYKE00s6bLwE5L4xnlHkG0yIxAtbrQ== + dependencies: + hammerjs "^2.0.8" + hoist-non-react-statics "^2.3.1" + invariant "^2.2.4" + prop-types "^15.7.2" + +react-native-image-picker@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/react-native-image-picker/-/react-native-image-picker-1.1.0.tgz#c2a0523886edb4cf2cdc008ad0a71433142a4d53" + integrity sha512-/KjHf4NNAjl6XM7FQuqvGDz1wB9sRdLf86+2yksLW/QTRR7CitX4TLCM8ZF9CX6Y0MsCTndkZia3zWE+nt/GiA== react-native-level-fs@^3.0.1: version "3.0.1" @@ -8902,9 +9210,9 @@ react-native-loading-spinner-overlay@^1.0.1: prop-types "^15.6.2" react-native-material-bottom-navigation@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/react-native-material-bottom-navigation/-/react-native-material-bottom-navigation-1.0.4.tgz#c9c9bf4a2f8d260a50703a39e01f600cc6cf66d6" - integrity sha512-g/2uaELl8Nhol5AVkFDUT6p4/nfLmTSlipjMrnw2kKBf1NBJuEZ2h/B7E4gg9KtryWPUjYc5Nixd9IwwNH2bLA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/react-native-material-bottom-navigation/-/react-native-material-bottom-navigation-1.0.5.tgz#4552cc8529ba722f044a4a66d7d4deb73d931c82" + integrity sha512-SpbFHH/2cJELZ9z4THE7xMCM8uBBvjqfN3+BB30IfM0144gxHFSVdzFoTj7I2U7jV/cWQbeJ8vRN99ACTlSpwA== dependencies: prop-types "^15.6.1" @@ -8948,9 +9256,9 @@ react-native-material-textfield@^0.12.0: prop-types "^15.5.9" react-native-os@^1.2.1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/react-native-os/-/react-native-os-1.2.5.tgz#4b10b010b8734bb300e8c0017f01bc67cad98e7a" - integrity sha512-cueg5nhzqA9vGwRXzX5/f/95JdhWjy7pNf9r5XW9YEfVf0C36CHzz5LNLrZQqJukmCWoeOEBDmtvllfpXVIpcA== + version "1.2.6" + resolved "https://registry.yarnpkg.com/react-native-os/-/react-native-os-1.2.6.tgz#1bb16d78ccad1143972183a04f443cf1af9fbefa" + integrity sha512-OlT+xQAcvkcnf7imgXiu+myMkqDt4xw2bP5SlVo19hEn5XHBkPMLX7dk3sSGxxncH/ToMDsf1KLyrPabNVtadA== react-native-paper@^2.6.3: version "2.16.0" @@ -8964,10 +9272,17 @@ react-native-paper@^2.6.3: react-lifecycles-compat "^3.0.4" react-native-safe-area-view "^0.12.0" -react-native-permissions@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/react-native-permissions/-/react-native-permissions-1.2.0.tgz#0deb616bf1565c17c91f1cb1f953809b2892c29e" - integrity sha512-+KrP1JZ30RI9p30wsGlGQx22qwiClDnznSQZPpvBMkOIZQ9kXOkLAFXS+vwiHRiiRu/pBMBXYHfI7ng6t2+LbQ== +react-native-permissions@^2.0.2, react-native-permissions@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/react-native-permissions/-/react-native-permissions-2.0.8.tgz#e6d20a7b6e3df5333a3d80cc83024686fa2f49e3" + integrity sha512-qK8Thp+9PTl/YjhKkRr8LPHfX5Evv5Zj/3CmAiqE45qCTB5UbWTKBWUfg3iqfMrjv9nE2rcS1PrIjZCDh6s/gQ== + +react-native-plaid-link@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/react-native-plaid-link/-/react-native-plaid-link-1.4.4.tgz#9836b00b91f652b0c5a8f25085038cf0dc7bc893" + integrity sha512-rwyWNJfUJdnErNchduDFK7OulYl7TZM3NVxX2xOMaNBrsQLU8yDTLm8lCznMRM+mWljvg6Fu7ktp4piqTVgt9A== + dependencies: + object.omit "^3.0.0" react-native-progress@^3.5.0: version "3.6.0" @@ -8977,20 +9292,23 @@ react-native-progress@^3.5.0: prop-types "^15.7.2" react-native-qrcode-scanner@^1.1.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/react-native-qrcode-scanner/-/react-native-qrcode-scanner-1.2.1.tgz#aa3949a77f6eee063a3ca25796a1f0ce17f9c4dd" - integrity sha512-JLX6iCmvUkBmbXcHHjtRS+OFr2onp9IFE9FXSPGZUuXib78afNEIg+qiWJdKfhQvtPKffRf55TH/WHxD3XDwKQ== + version "1.3.1" + resolved "https://registry.yarnpkg.com/react-native-qrcode-scanner/-/react-native-qrcode-scanner-1.3.1.tgz#a90d09b60d993d0eb83c4ab27668f2f8618f33b7" + integrity sha512-oRqIfyUnFYrJi9tyrUxbJr0po3T4TxFSln0fKRlNwnpzcUSf7XCZ95BiDq+OEZFXWVH3T9jJjRywaOI4KzwqUw== dependencies: + "@react-native-community/async-storage" "^1.6.1" + opencollective "^1.0.3" + opencollective-postinstall "^2.0.2" prop-types "^15.5.10" - react-native-permissions "^1.1.1" + react-native-permissions "^2.0.2" react-native-qrcode-svg@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-native-qrcode-svg/-/react-native-qrcode-svg-5.1.2.tgz#1368a1142b7d4916c3d8b1903fd2046185340fd0" - integrity sha512-nQ0x2DHQMC2XI5QDxYMGaUhqZ4UT/o/V1Wr0oet5uZwkfnc8OoPt08dae/tO7VcCG7x3plmmafm7Tsh3g67bHA== + version "5.3.2" + resolved "https://registry.yarnpkg.com/react-native-qrcode-svg/-/react-native-qrcode-svg-5.3.2.tgz#6d82c50f4bd264e8eecc08533b0ac2fade8178d3" + integrity sha512-qXujuIqog2PQ0jLa88emqDy8NcDBF41jRf5Rm/7DEY5wFnIiLrN3p7X+ucFDIIUqWuKB2gKdrb7HDs0eK2aryQ== dependencies: prop-types "^15.5.10" - qrcode "^1.2.0" + qrcode "1.2.0" react-native-randombytes@^3.5.2: version "3.5.3" @@ -9008,9 +9326,9 @@ react-native-safe-area-view@^0.12.0: hoist-non-react-statics "^2.3.1" react-native-safe-area-view@^0.14.1: - version "0.14.7" - resolved "https://registry.yarnpkg.com/react-native-safe-area-view/-/react-native-safe-area-view-0.14.7.tgz#e1dd1c4d25a90677df2c15347fdddb2306ba5971" - integrity sha512-fmuBYpvKDJK33bimo4JXrK2BN2CGw7nof1y1LDRgzqv+FZ3eADSDGshprN8WeQqSZjQ20hJx1CiWk28Edg/v4Q== + version "0.14.8" + resolved "https://registry.yarnpkg.com/react-native-safe-area-view/-/react-native-safe-area-view-0.14.8.tgz#ef33c46ff8164ae77acad48c3039ec9c34873e5b" + integrity sha512-MtRSIcZNstxv87Jet+UsPhEd1tpGe8cVskDXlP657x6rHpSrbrc+y13ZNXrwAgGNNhqQNX7UJT68ZIq//ZRmvw== dependencies: hoist-non-react-statics "^2.3.1" @@ -9039,9 +9357,12 @@ react-native-share@1.2.1: integrity sha512-V9q1FM+LuYJ65qN3k6BLWs17mIbJCzGyMOhF3rb4MIQXdJfCUbtkDX9aaV86PzcsL1EudCA53HVTJBmWPDed0Q== react-native-svg@^9.2.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-9.6.4.tgz#f9ceb228efd07317a5f9c378c6b9c5e13ff50cd0" - integrity sha512-6SlbGx0vlXHyDPQXSpX+8o6bNjxKFNJsISoboAkR7YWW6hdnkMg/HJXCgT6oJC0/ClKtSO7ZPrQcK4HR65kDNg== + version "9.13.6" + resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-9.13.6.tgz#5365fba2bc460054b90851e71f2a71006a5d373f" + integrity sha512-vjjuJhEhQCwWjqsgWyGy6/C/LIBM2REDxB40FU1PMhi8T3zQUwUHnA6M15pJKlQG8vaZyA+QnLyIVhjtujRgig== + dependencies: + css-select "^2.0.2" + css-tree "^1.0.0-alpha.37" react-native-tab-view@^0.0.74: version "0.0.74" @@ -9050,7 +9371,7 @@ react-native-tab-view@^0.0.74: dependencies: prop-types "^15.6.0" -react-native-tab-view@^1.0.0: +react-native-tab-view@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/react-native-tab-view/-/react-native-tab-view-1.4.1.tgz#f113cd87485808f0c991abec937f70fa380478b9" integrity sha512-Bke8KkDcDhvB/z0AS7MnQKMD2p6Kwfc1rSKlMOvg9CC5CnClQ2QEnhPSbwegKDYhUkBI92iH/BYy7hNSm5kbUQ== @@ -9058,9 +9379,9 @@ react-native-tab-view@^1.0.0: prop-types "^15.6.1" react-native-tcp@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/react-native-tcp/-/react-native-tcp-3.3.1.tgz#dfb35ac48356fa8b707dafe69a971feb0845d88b" - integrity sha512-kySTh7oUixfoNHCNAuxjSMjGPYXkg06sgCQOzj1bVInrTNMOSQpYvlKVSSqIorHvus2yvMmYOguTgLffMe65TA== + version "3.3.2" + resolved "https://registry.yarnpkg.com/react-native-tcp/-/react-native-tcp-3.3.2.tgz#b38c153039acac89294caa4991689c003ec62dce" + integrity sha512-zjFmjAvYOsBkR1MF7htuPlk+uOzTykKaeu/eN+I7fkZ7UqBCW+9u/gJgWCv6Tjfn2tGgku6hsEWril4Oy3zJhg== dependencies: base64-js "0.0.8" buffer "^5.0.0" @@ -9069,6 +9390,11 @@ react-native-tcp@^3.3.0: process "^0.11.9" util "^0.10.3" +react-native-text-input-mask@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/react-native-text-input-mask/-/react-native-text-input-mask-1.0.6.tgz#21ca0c1886f5b547e9f6594ba2f4bb50d39fe3a1" + integrity sha512-pCTYEnqiKw1F9VuEwxOt42Roaigilpp0xjb2JhjIeuVlc6Cvf9IqA+vzAXLJTOzoxImOOAasGxrZpTgdFYMvOQ== + react-native-udp@^2.3.1: version "2.6.1" resolved "https://registry.yarnpkg.com/react-native-udp/-/react-native-udp-2.6.1.tgz#ce9f2479f8af6d1bb356cfee69c89cf92fdd50be" @@ -9089,6 +9415,43 @@ react-native-vector-icons@^6.2.0: prop-types "^15.6.2" yargs "^13.2.2" +react-native-web@^0.12.0-rc.1: + version "0.12.0-rc.1" + resolved "https://registry.yarnpkg.com/react-native-web/-/react-native-web-0.12.0-rc.1.tgz#9067325f9931acbc47f7a453b1c2089d8312a1bf" + integrity sha512-tlpeWzn6NbTVJYvT5aNUru38ERXkQGp7yAuJ1WDO9oAlplrCghFvspU/7JKqtYRjzsYxR3w2sQMFIWdgajOQ3A== + dependencies: + array-find-index "^1.0.2" + create-react-class "^15.6.2" + debounce "^1.2.0" + deep-assign "^3.0.0" + fbjs "^1.0.0" + hyphenate-style-name "^1.0.3" + inline-style-prefixer "^5.1.0" + normalize-css-color "^1.0.2" + prop-types "^15.6.0" + react-timer-mixin "^0.13.4" + +react-native-webview@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-8.0.2.tgz#1afac4cd859ab24141490e105d1a27e18e3984a9" + integrity sha512-Higfj0CCPM9N76S3rQsKHKS8Rw5QA7h7UENrREmMarEN/2saZJ+ko0aIVYOlEJ4P9ZhhRLNH/3mWvzmT4spncw== + dependencies: + escape-string-regexp "2.0.0" + invariant "2.2.4" + +react-native-windows@^0.59.0-legacy.1: + version "0.59.0-legacy.1" + resolved "https://registry.yarnpkg.com/react-native-windows/-/react-native-windows-0.59.0-legacy.1.tgz#c050cc88959230d42602f4471ef0142c268d8938" + integrity sha512-2vkG5u2YPZjqQFP1JVJEOmeiaiCBl2Z3cXEhax3I++0DcbqgWcioqn7n+bxPsMOdmLo85aL6E6q93Ivu7l0GQw== + dependencies: + "@react-native-community/cli" "^1.2.1" + chalk "^2.4.1" + glob "^7.1.1" + shelljs "^0.7.8" + username "^3.0.0" + uuid "^2.0.1" + xml-parser "^1.2.1" + react-native@0.59.9: version "0.59.9" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.59.9.tgz#c94ee4fa35121720c05235a2dd6cdd2784bf5177" @@ -9146,23 +9509,22 @@ react-native@0.59.9: yargs "^9.0.0" react-navigation-material-bottom-tabs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/react-navigation-material-bottom-tabs/-/react-navigation-material-bottom-tabs-1.0.0.tgz#4fc3f21c57891e3a5bff88679afd84801d69adb7" - integrity sha512-fmPOt82xYpNYWh7gDdk38ce2TDmKuGnVaC7Pd67Ss62bjZ2CwmX9kOXExThtdY039zDGIcABDq9h65c8TQeTUA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/react-navigation-material-bottom-tabs/-/react-navigation-material-bottom-tabs-1.1.1.tgz#17e12719958c1d6770b3138789608f54d5cb7f57" + integrity sha512-1+F+DZXMoKCN9uewAnOvXCROA693ThS5vTnYRufpAAiZPooLVEAfWyQCNuQIWY0BQIT56/NJJuGC+rIKj/YoAA== dependencies: hoist-non-react-statics "^2.5.0" prop-types "^15.6.0" - react-navigation-tabs "1.0.0" + react-navigation-tabs "~1.2.0" -react-navigation-tabs@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/react-navigation-tabs/-/react-navigation-tabs-1.0.0.tgz#f9fe3eb8b77787551d017d1279ec049c3bed4950" - integrity sha512-2oWPk+XfwHihgdOBhuAuzzU94NPhwdvuzseL30R3VsggunfVB4cUtNiQjRP4rVVpdGgJygQtws1eRbUsQ9cECA== +react-navigation-tabs@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/react-navigation-tabs/-/react-navigation-tabs-1.2.0.tgz#602c147029bb4f1c569b26479ddba534fe3ebb19" + integrity sha512-I6vq3XX4ub9KhWQzcrggznls+2Z2C6w2ro46vokDGGvJ02CBpQRar7J0ETV29Ot5AJY67HucNUmZdH3yDFckmQ== dependencies: hoist-non-react-statics "^2.5.0" prop-types "^15.6.1" - react-lifecycles-compat "^3.0.4" - react-native-tab-view "^1.0.0" + react-native-tab-view "^1.4.1" react-navigation@1.2.1: version "1.2.1" @@ -9186,12 +9548,12 @@ react-proxy@^1.1.7: react-deep-force-update "^1.0.0" react-redux@^5.0.6: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.1.tgz#88e368682c7fa80e34e055cd7ac56f5936b0f52f" - integrity sha512-LE7Ned+cv5qe7tMV5BPYkGQ5Lpg8gzgItK07c67yHvJ8t0iaD9kPFPAli/mYkiyJYrs2pJgExR2ZgsGqlrOApg== + version "5.1.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.2.tgz#b19cf9e21d694422727bf798e934a916c4080f57" + integrity sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q== dependencies: "@babel/runtime" "^7.1.2" - hoist-non-react-statics "^3.1.0" + hoist-non-react-statics "^3.3.0" invariant "^2.2.4" loose-envify "^1.1.0" prop-types "^15.6.1" @@ -9208,6 +9570,11 @@ react-test-renderer@16.5.0: react-is "^16.5.0" schedule "^0.3.0" +react-timer-mixin@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz#75a00c3c94c13abe29b43d63b4c65a88fc8264d3" + integrity sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q== + react-transform-hmr@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" @@ -9356,7 +9723,7 @@ readable-stream@^1.0.26-4, readable-stream@^1.0.27-1, readable-stream@^1.0.33, r isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.4.0: +readable-stream@^3.0.6, readable-stream@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== @@ -9412,6 +9779,13 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + redux-thunk@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" @@ -9490,6 +9864,14 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp.prototype.flags@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -9499,10 +9881,10 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^4.5.4: - version "4.5.5" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.5.tgz#aaffe61c2af58269b3e516b61a73790376326411" - integrity sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ== +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^8.1.0" @@ -9532,9 +9914,9 @@ regjsgen@^0.2.0: integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== regjsparser@^0.1.4: version "0.1.5" @@ -9544,9 +9926,9 @@ regjsparser@^0.1.4: jsesc "~0.5.0" regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + version "0.6.2" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.2.tgz#fd62c753991467d9d1ffe0a9f67f27a529024b96" + integrity sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q== dependencies: jsesc "~0.5.0" @@ -9562,19 +9944,19 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request-promise-core@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" - integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== dependencies: - lodash "^4.17.11" + lodash "^4.17.15" request-promise-native@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" - integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== dependencies: - request-promise-core "1.1.2" + request-promise-core "1.1.3" stealthy-require "^1.1.1" tough-cookie "^2.3.3" @@ -9646,24 +10028,10 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.4, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" - integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.10.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" - integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== - dependencies: - path-parse "^1.0.6" - -resolve@~1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== +resolve@^1.1.4, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1, resolve@~1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" + integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg== dependencies: path-parse "^1.0.6" @@ -9697,7 +10065,7 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -9717,17 +10085,24 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.0.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.3.tgz#7f94aef86cec412df87d5ea1d8cb116a47d45f0e" - integrity sha512-l6YVrI7+d2vpW6D6rS05x2Xrmq8oW7v3pieZOJKBEdjuTF4Kz/iwk55Zyh1Zaz+KOB2kC8+2jZlp2u9L4tTzCQ== +rlp@^2.2.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.4.tgz#d6b0e1659e9285fc509a5d169a9bd06f704951c1" + integrity sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw== dependencies: bn.js "^4.11.1" - safe-buffer "^5.1.1" + +rn-fetch-blob@^0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/rn-fetch-blob/-/rn-fetch-blob-0.11.2.tgz#bdc483bf1b0c3810d457983494a11fbada446679" + integrity sha512-oKszdNtA7vZ56d0Rfr+RDEUexwlZxu/HOqwULa36PRHhQsTO5ia7uKk+va3WzuwYxzhF9e0bY8n3k+GC6Df14A== + dependencies: + base-64 "0.1.0" + glob "7.0.6" "rn-nodeify@github:tradle/rn-nodeify": - version "10.1.0" - resolved "https://codeload.github.com/tradle/rn-nodeify/tar.gz/580705c3ee0227298d0d12dba413f7aa3bb24ebb" + version "10.2.0" + resolved "https://codeload.github.com/tradle/rn-nodeify/tar.gz/300ca4460c3e4ffa01c45b3a122ce182dc1a0c5a" dependencies: "@yarnpkg/lockfile" "^1.0.0" deep-equal "^1.0.0" @@ -9869,10 +10244,10 @@ scheduler@^0.13.3: loose-envify "^1.1.0" object-assign "^4.1.1" -scheduler@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.15.0.tgz#6bfcf80ff850b280fed4aeecc6513bc0b4f17f8e" - integrity sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg== +scheduler@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" + integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -9883,16 +10258,16 @@ scrypt-js@2.0.4: integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== secp256k1@^3.0.1, secp256k1@^3.5.2: - version "3.7.1" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.7.1.tgz#12e473e0e9a7c2f2d4d4818e722ad0e14cc1e2f1" - integrity sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g== + version "3.8.0" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" + integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== dependencies: bindings "^1.5.0" bip66 "^1.1.5" bn.js "^4.11.8" create-hash "^1.2.0" drbg.js "^1.0.1" - elliptic "^6.4.1" + elliptic "^6.5.2" nan "^2.14.0" safe-buffer "^5.1.2" @@ -9995,6 +10370,13 @@ sha@^3.0.0: dependencies: graceful-fs "^4.1.2" +shasum-object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e" + integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg== + dependencies: + fast-safe-stringify "^2.0.7" + shasum@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" @@ -10026,9 +10408,18 @@ shell-quote@1.6.1: jsonify "~0.0.0" shell-quote@^1.6.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.1.tgz#3161d969886fb14f9140c65245a5dd19b6f0b06b" - integrity sha512-2kUqeAGnMAu6YrTPX4E3LfxacH9gKljzVjlkUeSqY0soGwK4KLl7TURXCem712tkhBCeeaFP9QK4dKn88s3Icg== + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shelljs@^0.7.8: + version "0.7.8" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" + integrity sha1-3svPh0sNHl+3LhSxZKloMEjprLM= + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" shellwords@^0.1.1: version "0.1.1" @@ -10046,12 +10437,12 @@ simple-concat@^1.0.0: integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= simple-plist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.0.0.tgz#bed3085633b22f371e111f45d159a1ccf94b81eb" - integrity sha512-043L2rO80LVF7zfZ+fqhsEkoJFvW8o59rt/l4ctx1TJWoTx7/jkiS1R5TatD15Z1oYnuLJytzE7gcnnBuIPL2g== + version "1.1.0" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.1.0.tgz#8354ab63eb3922a054c78ce96c209c532e907a23" + integrity sha512-2i5Tc0BYAqppM7jVzmNrI+aEUntPolIq4fDgji6WuNNn1D/qYdn2KwoLhZdzQkE04lu9L5tUoeJsjuJAvd+lFg== dependencies: - bplist-creator "0.0.7" - bplist-parser "0.1.1" + bplist-creator "0.0.8" + bplist-parser "0.2.0" plist "^3.0.1" simple-swizzle@^0.2.2: @@ -10062,15 +10453,20 @@ simple-swizzle@^0.2.2: is-arrayish "^0.3.1" sisteransi@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.3.tgz#98168d62b79e3a5e758e27ae63c4a053d748f4eb" - integrity sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" + integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== sjcl@^1.0.3: version "1.0.8" resolved "https://registry.yarnpkg.com/sjcl/-/sjcl-1.0.8.tgz#f2ec8d7dc1f0f21b069b8914a41a8f236b0e252a" integrity sha512-LzIjEQ0S0DpIgnxMEayM1rq9aGwGRG4OnZhCdjx7glTaJtf4zRfpg87ImfjSJjoW9vKpagd82McDOwbRT5kQKQ== +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" @@ -10130,20 +10526,27 @@ sorted-union-stream@~2.1.3: stream-iterate "^1.1.0" source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.6, source-map-support@^0.5.9: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.16, source-map-support@^0.5.6: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -10234,11 +10637,11 @@ stack-utils@^1.0.1: integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== stacktrace-parser@^0.1.3: - version "0.1.6" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.6.tgz#c17d466d15ba51bee2f753d064f17327a886ff37" - integrity sha512-wXhu0Z8YgCGigUtHQq+J7pjXCppk3Um5DwH4qskOKHMlJmKwuuUSm+wDAgU7t4sbVjvuDTNGwOfFKgjMEqSflA== + version "0.1.8" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.8.tgz#28b0272bd9aeb41636f0c8265c03ba270c865e1b" + integrity sha512-ig5rHJSdJrAsVqdb3oAI/8C6aQ7dEwJXoy/TIEIOTzdJHssmn12o6RsFoeQSLHoKjq0lX+kqhmnLDpyQTuWiJA== dependencies: - type-fest "^0.3.0" + type-fest "^0.7.1" static-extend@^0.1.1: version "0.1.2" @@ -10370,27 +10773,27 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.trim@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" - integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= +string.prototype.trim@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782" + integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw== dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.0" - function-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" -string.prototype.trimleft@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" - integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== dependencies: define-properties "^1.1.3" function-bind "^1.1.1" -string.prototype.trimright@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" - integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== dependencies: define-properties "^1.1.3" function-bind "^1.1.1" @@ -10518,25 +10921,26 @@ syntax-error@^1.1.1: acorn-node "^1.2.0" tape@^4.8.0: - version "4.11.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.11.0.tgz#63d41accd95e45a23a874473051c57fdbc58edc1" - integrity sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA== + version "4.12.1" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.12.1.tgz#5fe2f0e2ef09ff0ec6f6d37f38300a6016082d91" + integrity sha512-xoK2ariLmdGxqyXhhxfIZlr0czNB8hNJeVQmHN4D7ZyBn30GUoa4q2oM4cX8jNhnj1mtILXn1ugbfxc0tTDKtA== dependencies: - deep-equal "~1.0.1" + deep-equal "~1.1.1" defined "~1.0.0" for-each "~0.3.3" function-bind "~1.1.1" - glob "~7.1.4" + glob "~7.1.6" has "~1.0.3" inherits "~2.0.4" + is-regex "~1.0.5" minimist "~1.2.0" - object-inspect "~1.6.0" - resolve "~1.11.1" + object-inspect "~1.7.0" + resolve "~1.14.1" resumer "~0.0.0" - string.prototype.trim "~1.1.2" + string.prototype.trim "~1.2.1" through "~2.3.8" -tar@^2.0.0, tar@^4, tar@^4.4.10, tar@^4.4.12, tar@^4.4.13, tar@^4.4.8: +tar@^2.0.0, tar@^4.4.10, tar@^4.4.12, tar@^4.4.13, tar@^4.4.8: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -10625,6 +11029,11 @@ timers-browserify@^1.0.1, timers-browserify@^1.4.2: dependencies: process "~0.11.0" +tiny-queue@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.0.tgz#c49fcb5c87555be1b4a5df7eb87101d5b78bc9dc" + integrity sha1-xJ/LXIdVW+G0pd9+uHEB1beLydw= + tiny-relative-date@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" @@ -10774,10 +11183,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-fest@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== typedarray@^0.0.6: version "0.0.6" @@ -10789,9 +11198,9 @@ typeforce@^1.0.0, typeforce@^1.11.1, typeforce@^1.11.3, typeforce@^1.11.5, typef resolved "git+https://github.com/michaeltout/typeforce#c9b0abc33ff006d7a6a6150eff034bc7eb8b07de" ua-parser-js@^0.7.18: - version "0.7.20" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098" - integrity sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw== + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== uglify-es@^3.1.9: version "3.3.9" @@ -10802,11 +11211,11 @@ uglify-es@^3.1.9: source-map "~0.6.1" uglify-js@^3.1.4: - version "3.6.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" - integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== + version "3.7.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.3.tgz#f918fce9182f466d5140f24bb0ff35c2d32dcc6a" + integrity sha512-7tINm46/3puUA4hCkKYo4Xdts+JDaVC9ZPRcG8Xw9R4nhO/gZgUM3TENq8IF4Vatk8qCig4MzP/c8G4u2BkVQg== dependencies: - commander "~2.20.0" + commander "~2.20.3" source-map "~0.6.1" uid-number@0.0.6: @@ -10933,9 +11342,9 @@ unzip-response@^2.0.1: integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= upath@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== update-notifier@^2.3.0, update-notifier@^2.5.0: version "2.5.0" @@ -10993,10 +11402,18 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -utf8@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" - integrity sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY= +username@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/username/-/username-3.0.0.tgz#b3dba982a72b4ce59d52f159fa1aeba266af5fc8" + integrity sha1-s9upgqcrTOWdUvFZ+hrromavX8g= + dependencies: + execa "^0.7.0" + mem "^1.1.0" + +utf8@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" @@ -11047,6 +11464,11 @@ uuid@2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= + uuid@^3.3.2, uuid@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" @@ -11068,9 +11490,9 @@ validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: builtins "^1.0.3" varuint-bitcoin@^1.0.1, varuint-bitcoin@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/varuint-bitcoin/-/varuint-bitcoin-1.1.0.tgz#7a343f50537607af6a3059312b9782a170894540" - integrity sha512-jCEPG+COU/1Rp84neKTyDJQr478/hAfVp5xxYn09QEH0yBjbmPeMfuuQIrp+BUD83hybtYZKhr5elV3bvdV1bA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz#e76c138249d06138b480d4c5b40ef53693e24e92" + integrity sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw== dependencies: safe-buffer "^5.1.1" @@ -11101,9 +11523,9 @@ vm-browserify@0.0.4: indexof "0.0.1" vm-browserify@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" - integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== vm@^0.1.0: version "0.1.0" @@ -11124,6 +11546,13 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +warning@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" @@ -11171,9 +11600,9 @@ whatwg-url@^6.4.1: webidl-conversions "^4.0.2" whatwg-url@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" - integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -11212,7 +11641,17 @@ wif@^2.0.1, wif@^2.0.6: dependencies: bs58check "<3.0.0" -wordwrap@^1.0.0, wordwrap@~1.0.0: +window-or-global@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de" + integrity sha1-2+RboqKRqrxW1iz2bEW3+jIpRt4= + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= @@ -11303,9 +11742,9 @@ ws@^5.2.0: async-limiter "~1.0.0" xcode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.0.0.tgz#134f1f94c26fbfe8a9aaa9724bfb2772419da1a2" - integrity sha512-5xF6RCjAdDEiEsbbZaS/gBRt3jZ/177otZcpoLCjGN/u1LrfgH7/Sgeeavpr/jELpyDqN2im3AKosl2G2W8hfw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe" + integrity sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ== dependencies: simple-plist "^1.0.0" uuid "^3.3.2" @@ -11320,6 +11759,13 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/xml-parser/-/xml-parser-1.2.1.tgz#c31f4c34f2975db82ad013222120592736156fcd" + integrity sha1-wx9MNPKXXbgq0BMiISBZJzYVb80= + dependencies: + debug "^2.2.0" + xmlbuilder@^9.0.7: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" @@ -11333,9 +11779,9 @@ xmldoc@^0.4.0: sax "~1.1.1" xmldom@0.1.x: - version "0.1.27" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== xmlhttprequest@1.8.0: version "1.8.0" @@ -11425,7 +11871,7 @@ yargs@^11.0.0: y18n "^3.2.1" yargs-parser "^9.0.2" -yargs@^13.2.2, yargs@^13.2.4, yargs@^13.3.0: +yargs@^13.2.2, yargs@^13.3.0: version "13.3.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== @@ -11441,6 +11887,25 @@ yargs@^13.2.2, yargs@^13.2.4, yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.1" +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + yargs@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c"