Compare commits

...
Author SHA1 Message Date
Brian Sztamfater bd7da02c25 Implement Wallet Connect 2.0
Signed-off-by: Brian Sztamfater <brian@status.im>
2022-03-17 03:46:38 -03:00
jo-mut ece2605cb9 Refactored: edit community chats different screen segments
Signed-off-by: jo-mut <johnmutuku628@gmail.com>
2022-03-17 01:30:40 +03:00
jo-mut 407454859b Refactored: edit community chats different screen segments 2022-03-16 19:59:03 +03:00
andrey 12221ea067 [#13164] Warning 'Registration process has finished in invalid state' is shown for any ENS while typing it in profile
Signed-off-by: andrey <motor4ik@gmail.com>
2022-03-15 09:09:56 +01:00
Churikova Tetiana 2ae875f82a e2e: browser group 2022-03-14 17:20:06 +01:00
Audrius Molis 8e85d15a86 Only create git hook whet it is absent
Signed-off-by: Audrius Molis <masta@dr.com>
2022-03-14 11:57:14 +02:00
andrey 9e126a7399 tabs component
Signed-off-by: andrey <motor4ik@gmail.com>
2022-03-11 13:12:13 +01:00
andrey a0254c0fa8 button component 2022-03-11 13:07:22 +01:00
andrey 72a0df6332 text component 2022-03-11 13:07:21 +01:00
Audrius Molis 08da76c22a Disable chat input for chats with blocked users
Signed-off-by: Audrius Molis <masta@dr.com>
2022-03-10 20:44:48 +02:00
Parvesh Monu 66482863c1 fix screen opens twice on app reopening in ios (#13157) 2022-03-10 19:20:50 +05:30
Churikova Tetiana a3f4673177 e2e: nightly fixes 2022-03-09 17:38:29 +01:00
Churikova Tetiana 55915a9176 e2e: tx users 2022-03-07 22:17:39 +01:00
pavloburykh 891d1e6360 improvements of testing gap 2022-03-07 20:24:49 +02:00
Audrius Molis 1eb956d562 Add changelog from status-go on upgrade #13090
Signed-off-by: Audrius Molis <masta@dr.com>
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2022-03-07 12:46:49 +01:00
Parvesh Monu cf606b921a remove deprecated react-native-dark-mode dependency (#13136) 2022-03-04 19:34:17 +05:30
Parvesh Monu e6f552e785 Fix ios simulator error when notifications enabled (#13145) 2022-03-03 15:54:33 +05:30
Churikova Tetiana 7f007f204f exclude tx 2022-03-01 18:00:51 +01:00
andrey a2497c81e7 [#13116] Load audio messages from http server
Signed-off-by: andrey <motor4ik@gmail.com>
2022-03-01 17:07:40 +01:00
Parvesh Monu 5fd7e35d99 add remote notifications preferences (#13129) 2022-03-01 01:29:40 +05:30
John M. Ngei a71ad6e1a8 stop showing notifications for muted chats
Signed-off-by: John M. Ngei <johnmutuku628@gmail.com>
2022-02-25 22:16:46 +03:00
103 changed files with 3435 additions and 1270 deletions
+1
View File
@@ -36,3 +36,4 @@ COMMUNITIES_MANAGEMENT_ENABLED=1
METRICS_ENABLED=0
DELETE_MESSAGE_ENABLED=1
TWO_MINUTES_SYNCING=1
ENABLE_QUO_PREVIEW=1
+1 -1
View File
@@ -10,7 +10,7 @@ project-board:
automated-tests:
repo-full-name: 'status-im/status-react'
job-full-name: 'end-to-end-tests/status-app-prs'
job-full-name: 'status-react/e2e/status-app-prs'
kickoff-column-name: 'E2E Tests'
github-team:
+2 -1
View File
@@ -168,4 +168,5 @@ project.clj
##appium
test/appium/report/
result.xml
result.xml
test/appium/tests/users.py
+6 -1
View File
@@ -1,4 +1,4 @@
.PHONY: nix-add-gcroots clean nix-clean run-metro test release _list _fix-node-perms _tmpdir-mk _tmpdir-rm
.PHONY: nix-add-gcroots clean nix-clean run-metro test release _list _fix-node-perms _tmpdir-mk _tmpdir-rm _install-hooks
help: SHELL := /bin/sh
help: ##@other Show this help
@@ -124,6 +124,11 @@ _tmpdir-rm: SHELL := /bin/sh
_tmpdir-rm: ##@prepare Remove TMPDIR
rm -fr "$(TMPDIR)"
_install-hooks: SHELL := /bin/sh
_install-hooks: ##@prepare Create prepare-commit-msg git hook symlink
@ln -s -f ../../scripts/hooks/prepare-commit-msg .git/hooks
-include _install-hooks
# Remove directories and ignored files
clean: SHELL := /bin/sh
clean: _fix-node-perms _tmpdir-rm ##@prepare Remove all output folders
+1 -1
View File
@@ -1 +1 @@
1.18.0
1.18.0
+1 -1
View File
@@ -101,7 +101,7 @@ pipeline {
steps { script {
e2eApk = utils.getEnv(apke2e, 'SAUCE_URL')
build(
job: 'end-to-end-tests/status-app-nightly',
job: 'status-react/e2e/status-app-nightly',
parameters: [string(name: 'APK_NAME', value: e2eApk)],
wait: false
)
+6
View File
@@ -48,8 +48,14 @@ pipeline {
credentialsId: 'infura-e2e-token',
variable: 'WEB3_INFURA_PROJECT_ID'
),
file(
credentialsId: "mobile-tests-eth-accounts",
variable: 'TEST_ETH_ACCOUNTS_FILE'
),
]) {
dir('test/appium/tests') {
/* Provide Eth test accounts secrets. */
sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py'
sh """
python3 -m pytest \
--numprocesses 15 \
+6
View File
@@ -85,8 +85,14 @@ pipeline {
credentialsId: 'infura-e2e-token',
variable: 'WEB3_INFURA_PROJECT_ID'
),
file(
credentialsId: "mobile-tests-eth-accounts",
variable: 'TEST_ETH_ACCOUNTS_FILE'
),
]) {
dir('test/appium/tests') {
/* Provide Eth test account secrets. */
sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py'
sh """
python3 -m pytest \
--numprocesses 15 \
+6
View File
@@ -62,8 +62,14 @@ pipeline {
credentialsId: 'infura-e2e-token',
variable: 'WEB3_INFURA_PROJECT_ID'
),
file(
credentialsId: "mobile-tests-eth-accounts",
variable: 'TEST_ETH_ACCOUNTS_FILE'
),
]) {
dir('test/appium/tests') {
/* Provide Eth test accounts secrets. */
sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py'
sh """
python3 -m pytest \
-m "upgrade" \
+1
View File
@@ -1 +1,2 @@
import "node-libs-react-native/globals";
import "./app/index.js";
+32 -8
View File
@@ -2,7 +2,7 @@ PODS:
- boost-for-react-native (1.63.0)
- BVLinearGradient (2.5.6):
- React
- CryptoSwift (1.4.2)
- CryptoSwift (1.4.3)
- DoubleConversion (1.1.6)
- FBLazyVector (0.63.4)
- FBReactNativeSpec (0.63.4):
@@ -206,6 +206,10 @@ PODS:
- React-jsinspector (0.63.4)
- react-native-background-timer (2.2.0):
- React
- react-native-blob-util (0.13.18):
- React-Core
- react-native-blur (0.8.0):
- React
- react-native-camera-kit (8.0.4):
- React
- react-native-cameraroll (4.0.4):
@@ -220,6 +224,10 @@ PODS:
- React-Core
- react-native-netinfo (4.7.0):
- React
- react-native-notifications (4.1.3):
- React-Core
- react-native-randombytes (3.6.1):
- React-Core
- react-native-safe-area-context (2.0.0):
- React
- react-native-shake (3.4.0):
@@ -233,7 +241,7 @@ PODS:
- react-native-status-keycard (2.5.37):
- Keycard
- React
- react-native-webview (11.3.0):
- react-native-webview (11.16.0):
- React-Core
- React-RCTActionSheet (0.63.4):
- React-Core/RCTActionSheetHeaders (= 0.63.4)
@@ -388,8 +396,8 @@ PODS:
- SQLCipher/common (3.4.2)
- SQLCipher/standard (3.4.2):
- SQLCipher/common
- SSZipArchive (2.4.2)
- TOCropViewController (2.6.0)
- SSZipArchive (2.4.3)
- TOCropViewController (2.6.1)
- TouchID (4.4.1):
- React
- Yoga (1.14.0)
@@ -417,12 +425,16 @@ DEPENDENCIES:
- React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
- react-native-background-timer (from `../node_modules/react-native-background-timer`)
- react-native-blob-util (from `../node_modules/react-native-blob-util`)
- "react-native-blur (from `../node_modules/@react-native-community/blur`)"
- react-native-camera-kit (from `../node_modules/react-native-camera-kit`)
- "react-native-cameraroll (from `../node_modules/@react-native-community/cameraroll`)"
- react-native-config (from `../node_modules/react-native-config`)
- react-native-image-resizer (from `../node_modules/react-native-image-resizer`)
- react-native-mail (from `../node_modules/react-native-mail`)
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
- react-native-notifications (from `../node_modules/react-native-notifications`)
- react-native-randombytes (from `../node_modules/react-native-randombytes`)
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
- react-native-shake (from `../node_modules/react-native-shake`)
- "react-native-slider (from `../node_modules/@react-native-community/slider`)"
@@ -517,6 +529,10 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/jsinspector"
react-native-background-timer:
:path: "../node_modules/react-native-background-timer"
react-native-blob-util:
:path: "../node_modules/react-native-blob-util"
react-native-blur:
:path: "../node_modules/@react-native-community/blur"
react-native-camera-kit:
:path: "../node_modules/react-native-camera-kit"
react-native-cameraroll:
@@ -529,6 +545,10 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-mail"
react-native-netinfo:
:path: "../node_modules/@react-native-community/netinfo"
react-native-notifications:
:path: "../node_modules/react-native-notifications"
react-native-randombytes:
:path: "../node_modules/react-native-randombytes"
react-native-safe-area-context:
:path: "../node_modules/react-native-safe-area-context"
react-native-shake:
@@ -621,7 +641,7 @@ CHECKOUT OPTIONS:
SPEC CHECKSUMS:
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
CryptoSwift: a532e74ed010f8c95f611d00b8bbae42e9fe7c17
CryptoSwift: a0799ee936271bd2253a006f1e4523df21845000
DoubleConversion: cde416483dac037923206447da6e1454df403714
FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e
FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e
@@ -642,19 +662,23 @@ SPEC CHECKSUMS:
React-jsiexecutor: 93bd528844ad21dc07aab1c67cb10abae6df6949
React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a
react-native-background-timer: 1f7d560647b40e6a60b01c452ba29c54bf581fc4
react-native-blob-util: 600972b1782380a5a7d5db61a3817ea32349dae9
react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c
react-native-camera-kit: 498a6d111a904834e0824e9073cfadef7303235f
react-native-cameraroll: 88f4e62d9ecd0e1f253abe4f685474f2ea14bfa2
react-native-config: c98128a72bc2c3a1ca72caec0b021f0fa944aa29
react-native-image-resizer: 2f1577efa3bc762597681f530c8e8d05ce0ceeb3
react-native-mail: 8fdcd3aef007c33a6877a18eb4cf7447a1d4ce4a
react-native-netinfo: ddaca8bbb9e6e914b1a23787ccb879bc642931c9
react-native-notifications: 805108822ceff3440644d5701944f0cda35f5b4b
react-native-randombytes: 421f1c7d48c0af8dbcd471b0324393ebf8fe7846
react-native-safe-area-context: 60f654e00b6cc416573f6d5dbfce3839958eb57a
react-native-shake: de052eaa3eadc4a326b8ddd7ac80c06e8d84528c
react-native-slider: 12bd76d3d568c9c5500825db54123d44b48e4ad4
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
react-native-status: 45dbf1302ce3c258b459dfab137cd1c2c68c295d
react-native-status-keycard: 961d01ca190889ddf220206822fd752f8f4f3f7a
react-native-webview: af9990b21a9aeafa8e8347746eb4116c0de086af
react-native-webview: 28a8636d97ee641f2ee8f20492d7a6c269c1d703
React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336
React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b
React-RCTBlob: a97d378b527740cc667e03ebfa183a75231ab0f0
@@ -688,8 +712,8 @@ SPEC CHECKSUMS:
SDWebImageWebPCoder: f93010f3f6c031e2f8fb3081ca4ee6966c539815
secp256k1: f61d67e6fdcb85fd727acf1bf35ace6036db540c
SQLCipher: f9fcf29b2e59ced7defc2a2bdd0ebe79b40d4990
SSZipArchive: e7b4f3d9e780c2acc1764cd88fbf2de28f26e5b2
TOCropViewController: 3105367e808b7d3d886a74ff59bf4804e7d3ab38
SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef
TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863
TouchID: ba4c656d849cceabc2e4eef722dea5e55959ecf4
Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6
+3
View File
@@ -13,4 +13,7 @@ module.exports = {
},
}),
},
resolver: {
extraNodeModules: require('node-libs-react-native'),
},
};
+13 -55
View File
@@ -7324,16 +7324,16 @@
},
{
"path": "com/squareup/okhttp3/okhttp/5.0.0-alpha.4/okhttp-5.0.0-alpha.4",
"path": "com/squareup/okhttp3/okhttp/5.0.0-alpha.5/okhttp-5.0.0-alpha.5",
"host": "https://repo.maven.apache.org/maven2",
"type": "jar",
"pom": {
"sha1": "928427ff8d8c2326263733462bc5f8ea1021b5cb",
"sha256": "11iwhxf9ndkd6qmnb3iim97hm9h20v3fkvr8hnav5ypy44mgxilk"
"sha1": "71c72a769bb69cdac5c01b1baf3d3cea94633c8e",
"sha256": "1als0653nwccdzcmxikdmlqx2i3072p6bqv65w67nj695n5r0bjj"
},
"jar": {
"sha1": "bca0daab030b78fbc74e97e45dd01c6826cf4959",
"sha256": "0s305pbn9rc8y37grz2gmzgmzpi4zdhg9r0sm4fknnimyzdk6j5x"
"sha1": "bb262550c729996d20d3df9f66affc383901a123",
"sha256": "1qpyvqmwrz6zh4q492wflqsr12g1jivikl6qf8paw0zcc3d392xb"
}
},
@@ -7709,34 +7709,6 @@
}
},
{
"path": "com/willowtreeapps/assertk/assertk/0.25/assertk-0.25",
"host": "https://repo.maven.apache.org/maven2",
"type": "jar",
"pom": {
"sha1": "557170cd696a66845f2f97c36b20b372739dff34",
"sha256": "0d6lqsv2j6z9bjzag72bffyswnbbgrz1qcaydm7i2kc34wxz5hjs"
},
"jar": {
"sha1": "c20894404c38109ed837f6f6d254987777a06b0c",
"sha256": "0341gbcpz37abbk61xyfxmj5gjxggpvwpq5s16zrjkkrgx7v1sfi"
}
},
{
"path": "com/willowtreeapps/opentest4k/opentest4k/1.2.2/opentest4k-1.2.2",
"host": "https://repo.maven.apache.org/maven2",
"type": "jar",
"pom": {
"sha1": "e5c64dc093a91d1e2f591d0742798bb8f325b0ea",
"sha256": "1wn81995g9qdnxfgbscrm4a07m565dmk7mnycrw575w6vjjl0sca"
},
"jar": {
"sha1": "cc1388f1517c5fb7b83009abbc2f0eb2883739ef",
"sha256": "0g31fw5nvd09nc3pkgzpiwmbvizbxw2wv0vz76m2xbpy8wh8n9jg"
}
},
{
"path": "de/undercouch/gradle-download-task/3.4.3/gradle-download-task-3.4.3",
"host": "https://repo.maven.apache.org/maven2",
@@ -7794,26 +7766,26 @@
},
{
"path": "jakarta/xml/bind/jakarta.xml.bind-api-parent/4.0.0-RC2/jakarta.xml.bind-api-parent-4.0.0-RC2",
"path": "jakarta/xml/bind/jakarta.xml.bind-api-parent/4.0.0-RC3/jakarta.xml.bind-api-parent-4.0.0-RC3",
"host": "https://repo.maven.apache.org/maven2",
"type": "pom",
"pom": {
"sha1": "89412e0394f9e398e13416fde8da8b3a80fa0fec",
"sha256": "0bpclrb04qff6adkn37rk4zp5y8ky0vjnp5cxyzv8zc8182fhmr1"
"sha1": "a19c03e97865c73e090c628f140bf989c39ca58c",
"sha256": "1h2kffzcpsivg9ash0qn22gfyrv9dzhzymafsnl3rv70rmx571cx"
}
},
{
"path": "jakarta/xml/bind/jakarta.xml.bind-api/4.0.0-RC2/jakarta.xml.bind-api-4.0.0-RC2",
"path": "jakarta/xml/bind/jakarta.xml.bind-api/4.0.0-RC3/jakarta.xml.bind-api-4.0.0-RC3",
"host": "https://repo.maven.apache.org/maven2",
"type": "jar",
"pom": {
"sha1": "894741e8eca308287531b49bd3045e247cd43515",
"sha256": "15qcygb76b7khpgsq94azpfqkfxp50fn0yypmdy3p3rm8bnpbypc"
"sha1": "92e21745056f04ee7fcba97d4560e7844b6ef588",
"sha256": "0cbhwfj5v7hfyx1vpl0hq40100k7yl98i6lnlalh718wmw9rq5fz"
},
"jar": {
"sha1": "79f7ab7d98c0b95bef12d0b33b9b34af415ce222",
"sha256": "18dwxaillwc1bssp0wypjhgg9vygk0p5wcr9j6dh63xk0zd6pkqd"
"sha1": "ecec3b5ac3aaef841a10d83b5546c285d9914028",
"sha256": "0mcij5xnqkq8swvc6fdijjjxbrvp74z23f5jpf9nbqgxbvskjchm"
}
},
@@ -12045,20 +12017,6 @@
}
},
{
"path": "org/jetbrains/kotlin/kotlin-stdlib-common/1.5.30/kotlin-stdlib-common-1.5.30",
"host": "https://repo.maven.apache.org/maven2",
"type": "jar",
"pom": {
"sha1": "850c3ca345e0afacbfaf203f5259e3e1be59df9e",
"sha256": "1g74j6k1lbnljsy2dif47mmc3hrwqch6j6zi1mdp4mh11r812w6d"
},
"jar": {
"sha1": "649ffab7767038323fec0cc41e2d7b0a8f65a378",
"sha256": "1f346x78anwcxyj1lbywjz4vwa66la5sgfyhz3h2514p199srcwf"
}
},
{
"path": "org/jetbrains/kotlin/kotlin-stdlib-common/1.5.31/kotlin-stdlib-common-1.5.31",
"host": "https://repo.maven.apache.org/maven2",
+3 -6
View File
@@ -530,7 +530,7 @@ https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp-urlconnection/3
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/3.9.1/okhttp-3.9.1.pom
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/3.12.1/okhttp-3.12.1.pom
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/3.12.12/okhttp-3.12.12.pom
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/5.0.0-alpha.4/okhttp-5.0.0-alpha.4.pom
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/5.0.0-alpha.5/okhttp-5.0.0-alpha.5.pom
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/parent/3.9.1/parent-3.9.1.pom
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/parent/3.12.1/parent-3.12.1.pom
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/parent/3.12.12/parent-3.12.12.pom
@@ -563,14 +563,12 @@ https://repo.maven.apache.org/maven2/com/tunnelvisionlabs/antlr4-master/4.9.0/an
https://repo.maven.apache.org/maven2/com/tunnelvisionlabs/antlr4-runtime/4.5/antlr4-runtime-4.5.pom
https://repo.maven.apache.org/maven2/com/tunnelvisionlabs/antlr4-runtime/4.9.0/antlr4-runtime-4.9.0.pom
https://repo.maven.apache.org/maven2/com/tunnelvisionlabs/antlr4/4.5/antlr4-4.5.pom
https://repo.maven.apache.org/maven2/com/willowtreeapps/assertk/assertk/0.25/assertk-0.25.pom
https://repo.maven.apache.org/maven2/com/willowtreeapps/opentest4k/opentest4k/1.2.2/opentest4k-1.2.2.pom
https://repo.maven.apache.org/maven2/de/undercouch/gradle-download-task/3.4.3/gradle-download-task-3.4.3.pom
https://repo.maven.apache.org/maven2/de/undercouch/gradle-download-task/4.0.2/gradle-download-task-4.0.2.pom
https://repo.maven.apache.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.pom
https://repo.maven.apache.org/maven2/jakarta/activation/jakarta.activation-api/2.1.0/jakarta.activation-api-2.1.0.pom
https://repo.maven.apache.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api-parent/4.0.0-RC2/jakarta.xml.bind-api-parent-4.0.0-RC2.pom
https://repo.maven.apache.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api/4.0.0-RC2/jakarta.xml.bind-api-4.0.0-RC2.pom
https://repo.maven.apache.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api-parent/4.0.0-RC3/jakarta.xml.bind-api-parent-4.0.0-RC3.pom
https://repo.maven.apache.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api/4.0.0-RC3/jakarta.xml.bind-api-4.0.0-RC3.pom
https://repo.maven.apache.org/maven2/javax/activation/activation/1.1/activation-1.1.pom
https://repo.maven.apache.org/maven2/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.pom
https://repo.maven.apache.org/maven2/javax/annotation/javax.annotation-api/1.2/javax.annotation-api-1.2.pom
@@ -907,7 +905,6 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.10/kotlin-stdlib-common-1.4.10.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.30/kotlin-stdlib-common-1.4.30.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.31/kotlin-stdlib-common-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.30/kotlin-stdlib-common-1.5.30.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.31/kotlin-stdlib-common-1.5.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.6.10/kotlin-stdlib-common-1.6.10.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.2.71/kotlin-stdlib-jdk7-1.2.71.pom
+5 -2
View File
@@ -13,6 +13,7 @@
"dependencies": {
"@react-native-community/async-storage": "^1.11.0",
"@react-native-community/audio-toolkit": "git+https://github.com/tbenr/react-native-audio-toolkit.git#v2.0.3-status-v6",
"@react-native-community/blur": "^3.6.0",
"@react-native-community/cameraroll": "git+https://github.com/status-im/react-native-cameraroll.git#v4.0.4-status.0",
"@react-native-community/clipboard": "^1.2.2",
"@react-native-community/hooks": "^2.5.1",
@@ -20,6 +21,7 @@
"@react-native-community/netinfo": "^4.4.0",
"@react-native-community/push-notification-ios": "^1.4.1",
"@react-native-community/slider": "^3.0.0",
"@walletconnect/client": "^2.0.0-beta.23",
"bignumber.js": "git+https://github.com/status-im/bignumber.js.git#v4.0.2-status",
"buffer": "^5.4.2",
"chance": "^1.1.0",
@@ -30,14 +32,15 @@
"hermes-engine": "0.5.2-rc1",
"hi-base32": "^0.5.0",
"i18n-js": "^3.3.0",
"node-libs-react-native": "^1.2.1",
"qrcode": "^1.4.1",
"react": "16.13.1",
"react-dom": "^16.4.2",
"react-native": "0.63.4",
"react-native-background-timer": "^2.1.1",
"react-native-blob-util": "^0.13.18",
"react-native-camera-kit": "^8.0.4",
"react-native-config": "git+https://github.com/status-im/react-native-config.git#v1.4.2-status",
"react-native-dark-mode": "^0.2.2",
"react-native-device-info": "^7.4.0",
"react-native-dialogs": "^1.0.4",
"react-native-draggable-flatlist": "^3.0.3",
@@ -53,10 +56,10 @@
"react-native-languages": "^3.0.2",
"react-native-linear-gradient": "^2.5.6",
"react-native-mail": "^6.1.1",
"react-native-blob-util": "^0.13.18",
"react-native-navigation": "^7.13.0",
"react-native-notifications": "^4.1.3",
"react-native-permissions": "^2.1.5",
"react-native-randombytes": "^3.6.1",
"react-native-reanimated": "^2.1.0",
"react-native-redash": "^16.0.11",
"react-native-safe-area-context": "^2.0.0",
+5
View File
@@ -22,5 +22,10 @@ module.exports = {
ios: null,
},
},
'@react-native-community/blur': {
platforms: {
android: null,
},
},
},
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 B

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 467 B

After

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 B

+21
View File
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -euo pipefail
if [[ -z $(git diff --cached --name-only -r | grep status-go-version.json) ]]; then
exit 0 # No status-go-version.json changes found.
fi
MERGE_BASE=$(git merge-base -a develop "$(git rev-parse --abbrev-ref HEAD)" develop)
GO_COMMIT_MERGE_BASE=$(git show "${MERGE_BASE}":status-go-version.json | jq -r '."commit-sha1"')
GO_COMMIT_CURRENT=$(jq -r '."commit-sha1"' status-go-version.json)
GITHUB_LINK_PREFIX="https://github.com/status-im/status-go/compare/"
# Link to the current StatusGo changelog being updated.
GITHUB_LINK="${GITHUB_LINK_PREFIX}${GO_COMMIT_MERGE_BASE}...${GO_COMMIT_CURRENT}"
COMMIT_MSG_FILE=$1
# Check if the commit message already contains the link (rebase) and update otherwise insert into line2
if ! grep -qF "${GITHUB_LINK_PREFIX}" "${COMMIT_MSG_FILE}" >/dev/null; then
sed -in "2i${GITHUB_LINK}\n" "${COMMIT_MSG_FILE}"
else
sed -in "s;^${GITHUB_LINK_PREFIX}.*$;${GITHUB_LINK};" "${COMMIT_MSG_FILE}"
fi
+15 -3
View File
@@ -67,7 +67,9 @@
:Properties #{}
:create (fn [])
:configureNext (fn [])}
:requireNativeComponent (fn [] {:propTypes ""})}))
:requireNativeComponent (fn [] {:propTypes ""})
:Appearance {:getColorScheme (fn [])
:addChangeListener (fn [])}}))
(set! js/ReactNative react-native)
@@ -100,7 +102,6 @@
(def safe-area-context (clj->js {:SafeAreaProvider {:_reactNativeIphoneXHelper {:getStatusBarHeight (fn [])}}
:SafeAreaInsetsContext {:Consumer (fn [])}
:SafeAreaView {}}))
(def react-native-dark-mode #js {"eventEmitter" {} "initialMode" {}})
(def back-handler #js {:addEventListener identity
:removeEventListener identity})
@@ -212,6 +213,16 @@
(def react-native-notifications
#js {:Notifications #js {}})
(def react-native-blur
(clj->js {:BlurView {}}))
(def wallet-connect-client #js {:default #js {}
:CLIENT_EVENTS #js {:session #js {:request nil
:created nil
:deleted nil
:proposal nil
:updated nil}}})
;; Update i18n_resources.cljs
(defn mock [module]
(case module
@@ -221,7 +232,6 @@
"react-native-gesture-handler" react-native-gesture-handler
"react-native-safe-area-context" safe-area-context
"react-native-config" config
"react-native-dark-mode" react-native-dark-mode
"react-native-iphone-x-helper" (clj->js {:getStatusBarHeight (fn [])
:getBottomSpace (fn [])})
"react-native-screens" (clj->js {})
@@ -243,12 +253,14 @@
"react-native-linear-gradient" react-native-gradien
"react-native-navigation" react-native-navigation
"@react-native-community/push-notification-ios" push-notification-ios
"@react-native-community/blur" react-native-blur
"react-native-camera-kit" react-native-camera-kit
"rn-emoji-keyboard" rn-emoji-keyboard
"react-native-notifications" react-native-notifications
"react-native-draggable-flatlist" react-native-draggable-flatlist
"./fleets.js" default-fleets
"./chats.js" default-chats
"@walletconnect/client" wallet-connect-client
"../translations/ar.json" (js/JSON.parse (slurp "./translations/ar.json"))
"../translations/de.json" (js/JSON.parse (slurp "./translations/de.json"))
"../translations/en.json" (js/JSON.parse (slurp "./translations/en.json"))
+5 -1
View File
@@ -57,6 +57,8 @@
(defn pressable-hooks [props]
(let [{background-color :bgColor
border-radius :borderRadius
border-color :borderColor
border-width :borderWidth
type :type
disabled :disabled
on-press :onPress
@@ -121,7 +123,9 @@
[animated/view {:style (merge absolute-fill
background
{:background-color background-color
:border-radius border-radius})}]
:border-radius border-radius
:border-color border-color
:border-width border-width})}]
(into [animated/view {:style foreground}]
(react/get-children children))]]]])))
+29 -22
View File
@@ -28,27 +28,31 @@
(defn themes [theme]
(case theme
:main {:icon-color (:icon-04 @colors/theme)
:background-color (:interactive-02 @colors/theme)
:text-color (:text-04 @colors/theme)}
:icon {:icon-color (:icon-01 @colors/theme)
:background-color (:interactive-02 @colors/theme)
:text-color (:text-01 @colors/theme)}
:negative {:icon-color (:negative-01 @colors/theme)
:background-color (:negative-02 @colors/theme)
:text-color (:negative-01 @colors/theme)}
:positive {:icon-color (:positive-01 @colors/theme)
:background-color (:positive-02 @colors/theme)
:text-color (:positive-01 @colors/theme)}
:accent {:icon-color (:icon-05 @colors/theme)
:background-color (:interactive-01 @colors/theme)
:text-color (:text-05 @colors/theme)}
:secondary {:icon-color (:icon-02 @colors/theme)
:background-color (:interactive-02 @colors/theme)
:text-color (:text-02 @colors/theme)}
:disabled {:icon-color (:icon-02 @colors/theme)
:background-color (:ui-01 @colors/theme)
:text-color (:text-02 @colors/theme)}))
:main {:icon-color (:icon-04 @colors/theme)
:background-color (:interactive-02 @colors/theme)
:text-color (:text-04 @colors/theme)}
:icon {:icon-color (:icon-01 @colors/theme)
:background-color (:interactive-02 @colors/theme)
:text-color (:text-01 @colors/theme)}
:negative {:icon-color (:negative-01 @colors/theme)
:background-color (:negative-02 @colors/theme)
:text-color (:negative-01 @colors/theme)}
:positive {:icon-color (:positive-01 @colors/theme)
:background-color (:positive-02 @colors/theme)
:text-color (:positive-01 @colors/theme)}
:accent {:icon-color (:icon-05 @colors/theme)
:background-color (:interactive-01 @colors/theme)
:text-color (:text-05 @colors/theme)}
:secondary {:icon-color (:icon-02 @colors/theme)
:background-color (:interactive-02 @colors/theme)
:text-color (:text-02 @colors/theme)}
:disabled {:icon-color (:icon-02 @colors/theme)
:background-color (:ui-01 @colors/theme)
:text-color (:text-02 @colors/theme)}
:monocromatic {:icon-color (:icon-01 @colors/theme)
:background-color (:ui-background @colors/theme)
:text-color (:text-01 @colors/theme)
:border-color (:ui-01 @colors/theme)}))
(defn button [{:keys [on-press disabled type theme before after
haptic-feedback haptic-type on-long-press on-press-start
@@ -62,7 +66,7 @@
(let [theme' (cond
disabled :disabled
:else theme)
{:keys [icon-color background-color text-color]}
{:keys [icon-color background-color text-color border-color]}
(themes theme')
optional-haptic (fn []
@@ -73,6 +77,9 @@
:type type
:disabled disabled
:accessibility-label accessibility-label}
(when border-color
{:border-color border-color
:border-width 1})
(when on-press
{:on-press (fn []
(optional-haptic)
+6 -2
View File
@@ -20,6 +20,7 @@
(def light-theme
{:positive-01 "rgba(68,208,88,1)" ; Primary Positive, text, icons color
:positive-02 "rgba(78,188,96,0.1)" ; Secondary Positive, Supporting color for success illustrations
:positive-03 "rgba(78,188,96,1)" ; Lighter Positive, Supporting color for success illustrations
:negative-01 "rgba(255,45,85,1)" ; Primary Negative, text, icons color
:negative-02 "rgba(255,45,85,0.1))" ; Secondary Negative, Supporting color for errors illustrations
:warning-01 "rgba(255, 202, 15, 1)"
@@ -46,11 +47,13 @@
:backdrop "rgba(0,0,0,0.4)" ; Backdrop for modals and bottom sheet
:border-01 "rgba(238,242,245,1)"
:border-02 "rgba(67, 96, 223, 0.1)"
:highlight "rgba(67,96,223,0.4)"})
:highlight "rgba(67,96,223,0.4)"
:blurred-bg "rgba(255,255,255,0.3)"})
(def dark-theme
{:positive-01 "rgba(68,208,88,1)"
:positive-02 "rgba(78,188,96,0.1)"
:positive-03 "rgba(78,188,96,1)"
:negative-01 "rgba(252,95,95,1)"
:negative-02 "rgba(252,95,95,0.1)"
:warning-01 "rgba(255, 202, 15, 1)"
@@ -77,7 +80,8 @@
:backdrop "rgba(0,0,0,0.4)"
:border-01 "rgba(37,37,40,1)"
:border-02 "rgba(97,119,229,0.1)"
:highlight "rgba(67,96,223,0.4)"})
:highlight "rgba(67,96,223,0.4)"
:blurred-bg "rgba(0,0,0,0.3)"})
(def theme (reagent/atom light-theme))
+9 -3
View File
@@ -1,8 +1,14 @@
(ns quo.theme
(:require [quo.design-system.colors :as colors]))
(defn set-theme [theme]
(reset! colors/theme (case theme
(def theme (atom nil))
(defn get-theme []
@theme)
(defn set-theme [value]
(reset! theme value)
(reset! colors/theme (case value
:dark colors/dark-theme
colors/light-theme))
(colors/set-legacy-theme-type theme))
(colors/set-legacy-theme-type value))
+144
View File
@@ -0,0 +1,144 @@
(ns quo2.components.button
(:require [quo.react-native :as rn]
[status-im.ui.components.icons.icons :as icons]
[quo2.foundations.colors :as colors]
[quo2.components.text :as text]
[quo.theme :as theme]
[reagent.core :as reagent]))
(def themes {:light {:primary {:icon-color colors/white
:label {:style {:color colors/white}}
:background-color {:default colors/primary-50
:pressed colors/primary-70
:disabled colors/primary-50}}
:secondary {:icon-color colors/primary-50
:label {:style {:color colors/primary-50}}
:background-color {:default colors/primary-50-opa-20
:pressed colors/primary-50-opa-40
:disabled colors/primary-50-opa-20}}
:grey {:icon-color colors/neutral-50
:label {:style {:color colors/black}}
:background-color {:default colors/neutral-40
:pressed colors/neutral-30
:disabled colors/neutral-20}}
:outline {:icon-color colors/neutral-50
:label {:style {:color colors/black}}
:border-color {:default colors/neutral-30
:pressed colors/neutral-40}}
:ghost {:icon-color colors/neutral-50
:label {:style {:color colors/black}}
:background-color {:pr:pressedess colors/neutral-10}}
:danger {:icon-color colors/white
:label {:style {:color colors/white}}
:background-color {:default colors/danger-50
:pressed colors/danger-60
:disabled colors/danger-50}}}
:dark {:primary {:icon-color colors/white
:label {:style {:color colors/white}}
:background-color {:default colors/primary-60
:pressed colors/primary-40
:disabled colors/primary-60}}
:secondary {:icon-color colors/primary-50
:label {:style {:color colors/primary-50}}
:background-color {:default colors/primary-50-opa-20
:pressed colors/primary-50-opa-30
:disabled colors/primary-50-opa-20}}
:grey {:icon-color colors/neutral-40
:label {:style {:color colors/white}}
:background-color {:default colors/neutral-80
:pressed colors/neutral-60
:disabled colors/neutral-80}}
:outline {:icon-color colors/neutral-40
:label {:style {:color colors/white}}
:border-color {:default colors/neutral-70
:pressed colors/neutral-60}}
:ghost {:icon-color colors/neutral-40
:label {:style {:color colors/white}}
:background-color {:pressed colors/neutral-80}}
:danger {:icon-color colors/white
:label {:style {:color colors/white}}
:background-color {:default colors/danger-50
:pressed colors/danger-40
:disabled colors/danger-50}}}})
(defn style-container [type size disabled background-color border-color icon above]
(merge {:height size
:align-items :center
:justify-content :center
:flex-direction (if above :column :row)
:border-radius (if (and icon (#{:primary :secondary :danger} type))
24
(case size
56 12
40 12
32 10
24 8))
:background-color background-color
:padding-horizontal (if icon 0 (case size 56 16 40 16 32 12 24 8))}
(when icon
{:width size})
(when border-color
{:border-color border-color
:border-width 1})
(when disabled
{:opacity 0.3})))
(defn button
"with label
[button opts \"label\"]
opts
{:type :primary/:secondary/:grey/:outline/:ghost/:danger
:size 40/32/24
:icon true/false
:before :icon-keyword
:after :icon-keyword}
only icon
[button {:icon true} :main-icons/close-circle]"
[_ _]
(let [pressed (reagent/atom false)]
(fn [{:keys [on-press disabled type size before after above
on-long-press accessibility-label icon]
:or {type :primary
size 40}}
children]
(let [{:keys [icon-color background-color label border-color]}
(get-in themes [(theme/get-theme) type])
state (cond disabled :disabled @pressed :pressed :else :default)]
[rn/touchable-without-feedback (merge {:disabled disabled
:accessibility-label accessibility-label}
(when on-press
{:on-press (fn []
(on-press))})
(when on-long-press
{:on-long-press (fn []
(on-long-press))})
{:on-press-in (fn []
(reset! pressed true))}
{:on-press-out (fn []
(reset! pressed nil))})
[rn/view {:style (style-container type size disabled (get background-color state) (get border-color state) icon above)}
(when above
[rn/view
[icons/icon above {:color icon-color}]])
(when before
[rn/view
[icons/icon before {:color icon-color}]])
[rn/view
(cond
icon
[icons/icon children {:color icon-color}]
(string? children)
[text/text (merge {:size (when (#{56 24} size) :paragraph-2)
:weight :medium
:number-of-lines 1}
label)
children]
(vector? children)
children)]
(when after
[rn/view
[icons/icon after {:color icon-color}]])]]))))
@@ -0,0 +1,35 @@
(ns quo2.components.segmented-control
(:require [reagent.core :as reagent]
[quo.react-native :as rn]
[quo2.components.tab :as tab]
[quo2.foundations.colors :as colors]
[quo.theme :as theme]))
(def themes {:light {:background-color colors/neutral-20}
:dark {:background-color colors/neutral-80}})
(defn segmented-control [{:keys [default-active on-change]}]
(let [active-tab-id (reagent/atom default-active)]
(fn [{:keys [data size]}]
(let [active-id @active-tab-id]
[rn/view {:flex-direction :row
:background-color (get-in themes [(theme/get-theme) :background-color])
:border-radius (case size
32 10
28 8
24 8
20 6)
:padding 2}
(for [[indx {:keys [label id]}] (map-indexed vector data)]
^{:key id}
[rn/view {:margin-left (if (= 0 indx) 0 2)
:flex 1}
[tab/tab
{:id id
:segmented true
:size size
:active (= id active-id)
:on-press #(do (reset! active-tab-id %)
(when on-change
(on-change %)))}
label]])]))))
+75
View File
@@ -0,0 +1,75 @@
(ns quo2.components.tab
(:require [quo2.foundations.colors :as colors]
[quo.react-native :as rn]
[quo.theme :as theme]
[status-im.ui.components.icons.icons :as icons]
[quo2.components.text :as text]))
(def themes {:light {:default {:background-color colors/neutral-20
:icon-color colors/neutral-50
:label {:style {:color colors/black}}}
:active {:background-color colors/neutral-50
:icon-color colors/white
:label {:style {:color colors/white}}}
:disabled {:background-color colors/neutral-20
:icon-color colors/neutral-50
:label {:style {:color colors/black}}}}
:dark {:default {:background-color colors/neutral-80
:icon-color colors/neutral-40
:label {:style {:color colors/white}}}
:active {:background-color colors/neutral-60
:icon-color colors/white
:label {:style {:color colors/white}}}
:disabled {:background-color colors/neutral-80
:icon-color colors/neutral-40
:label {:style {:color colors/white}}}}})
(defn style-container [size disabled background-color]
(merge {:height size
:align-items :center
:justify-content :center
:flex-direction :row
:border-radius (case size
32 10
28 8
24 8
20 6)
:background-color background-color
:padding-horizontal (case size 32 12 28 12 24 8 20 8)}
(when disabled
{:opacity 0.3})))
(defn tab
"[tab opts \"label\"]
opts
{:type :primary/:secondary/:grey/:outline/:ghost/:danger
:size 40/32/24
:icon true/false
:before :icon-keyword
:after :icon-keyword}"
[_ _]
(fn [{:keys [id on-press disabled size before active accessibility-label]
:or {size 32}}
children]
(let [state (cond disabled :disabled active :active :else :default)
{:keys [icon-color background-color label]}
(get-in themes [(theme/get-theme) state])]
[rn/touchable-without-feedback (merge {:disabled disabled
:accessibility-label accessibility-label}
(when on-press
{:on-press (fn []
(on-press id))}))
[rn/view {:style (style-container size disabled background-color)}
(when before
[rn/view
[icons/icon before {:color icon-color}]])
[rn/view
(cond
(string? children)
[text/text (merge {:size (case size 24 :paragraph-2 20 :label nil)
:weight :medium
:number-of-lines 1}
label)
children]
(vector? children)
children)]]])))
+21
View File
@@ -0,0 +1,21 @@
(ns quo2.components.tabs
(:require [reagent.core :as reagent]
[quo.react-native :as rn]
[quo2.components.tab :as tab]))
(defn tabs [{:keys [default-active on-change]}]
(let [active-tab-id (reagent/atom default-active)]
(fn [{:keys [data size]}]
(let [active-id @active-tab-id]
[rn/view {:flex-direction :row}
(for [{:keys [label id]} data]
^{:key id}
[rn/view {:margin-right (if (= size 32) 12 8)}
[tab/tab
{:id id
:size size
:active (= id active-id)
:on-press #(do (reset! active-tab-id %)
(when on-change
(on-change %)))}
label]])]))))
+33
View File
@@ -0,0 +1,33 @@
(ns quo2.components.text
(:require [quo.react-native :as rn]
[reagent.core :as reagent]
[quo.theme :as theme]
[quo2.foundations.colors :as colors]
[quo2.foundations.typography :as typography]))
(defn text-style [{:keys [size align weight style]}]
(merge (case (or weight :regular)
:regular typography/font-regular
:medium typography/font-medium
:semi-bold typography/font-semi-bold
:bold typography/font-bold
:monospace typography/monospace
:inherit nil)
(case (or size :paragraph-1)
:label typography/label
:paragraph-2 typography/paragraph-2
:paragraph-1 typography/paragraph-1
:heading-2 typography/heading-2
:heading-1 typography/heading-1
:inherit nil)
{:text-align (or align :auto)}
(if (:color style)
style
(assoc style :color (if (= (theme/get-theme) :dark) colors/white colors/black)))))
(defn text []
(let [this (reagent/current-component)
props (reagent/props this)
style (text-style props)]
(into [rn/text {:style style}]
(reagent/children this))))
+176
View File
@@ -0,0 +1,176 @@
(ns quo2.foundations.colors
(:require [clojure.string :as string]))
(defn alpha [value opacity]
(if (string/starts-with? value "#")
(let [hex (string/replace value #"#" "")
r (js/parseInt (subs hex 0 2) 16)
g (js/parseInt (subs hex 2 4) 16)
b (js/parseInt (subs hex 4 6) 16)]
(str "rgba(" r "," g "," b "," opacity ")"))
(let [rgb (string/split value #",")]
(str (string/join "," (butlast rgb)) "," opacity ")"))))
;;;;Neutral
;;Solid
(def neutral-5 "#F5F6F8")
(def neutral-10 "#F0F2F5")
(def neutral-20 "#ECEEF1")
(def neutral-30 "#E7EAEE")
(def neutral-40 "#A1ABBD")
(def neutral-50 "#647084")
(def neutral-60 "#303D55")
(def neutral-70 "#192438")
(def neutral-80 "#131D2F")
(def neutral-90 "#0D1625")
(def neutral-95 "#09101C")
;;50 with transparency
(def neutral-50-opa-5 (alpha neutral-50 0.05))
(def neutral-50-opa-10 (alpha neutral-50 0.1))
(def neutral-50-opa-20 (alpha neutral-50 0.2))
(def neutral-50-opa-30 (alpha neutral-50 0.3))
(def neutral-50-opa-40 (alpha neutral-50 0.4))
;;80 with transparency
(def neutral-80-opa-60 (alpha neutral-80 0.6))
(def neutral-80-opa-70 (alpha neutral-80 0.7))
(def neutral-80-opa-80 (alpha neutral-80 0.8))
(def neutral-80-opa-90 (alpha neutral-80 0.9))
(def neutral-80-opa-95 (alpha neutral-80 0.95))
;;95 with transparency
(def neutral-95-opa-60 (alpha neutral-95 0.6))
(def neutral-95-opa-70 (alpha neutral-95 0.7))
(def neutral-95-opa-80 (alpha neutral-95 0.8))
(def neutral-95-opa-90 (alpha neutral-95 0.9))
(def neutral-95-opa-95 (alpha neutral-95 0.95))
;;;;Black
(def black "#000000")
(def black-opa-5 (alpha black 0.05))
(def black-opa-10 (alpha black 0.1))
(def black-opa-20 (alpha black 0.2))
(def black-opa-30 (alpha black 0.3))
(def black-opa-40 (alpha black 0.4))
(def black-opa-50 (alpha black 0.5))
(def black-opa-60 (alpha black 0.6))
(def black-opa-70 (alpha black 0.7))
(def black-opa-80 (alpha black 0.8))
(def black-opa-90 (alpha black 0.9))
(def black-opa-95 (alpha black 0.95))
;;;;White
(def white "#ffffff")
(def white-opa-5 (alpha white 0.05))
(def white-opa-10 (alpha white 0.1))
(def white-opa-20 (alpha white 0.2))
(def white-opa-30 (alpha white 0.3))
(def white-opa-40 (alpha white 0.4))
(def white-opa-50 (alpha white 0.5))
(def white-opa-60 (alpha white 0.6))
(def white-opa-70 (alpha white 0.7))
(def white-opa-80 (alpha white 0.8))
(def white-opa-90 (alpha white 0.9))
(def white-opa-95 (alpha white 0.95))
;;;;Primary
;;Solid
(def primary-10 "#F8F9FE")
(def primary-20 "#D9DFF9")
(def primary-30 "#ACB9F1")
(def primary-40 "#7F93E9")
(def primary-50 "#4360DF")
(def primary-60 "#3851BB")
(def primary-70 "#2E4198")
(def primary-80 "#233274")
(def primary-90 "#182350")
;;50 with transparency
(def primary-50-opa-5 (alpha primary-50 0.05))
(def primary-50-opa-10 (alpha primary-50 0.1))
(def primary-50-opa-20 (alpha primary-50 0.2))
(def primary-50-opa-30 (alpha primary-50 0.3))
(def primary-50-opa-40 (alpha primary-50 0.4))
;;;;Success
;;Solid
(def success-10 "#F6FBFB")
(def success-20 "#D4EDEB")
(def success-30 "#9FD8D3")
(def success-40 "#6BC2BA")
(def success-50 "#26A69A")
(def success-60 "#208B81")
(def success-70 "#1A7169")
(def success-80 "#145650")
(def success-90 "#08211F")
;;50 with transparency
(def success-50-opa-5 (alpha success-50 0.05))
(def success-50-opa-10 (alpha success-50 0.1))
(def success-50-opa-20 (alpha success-50 0.2))
(def success-50-opa-30 (alpha success-50 0.3))
(def success-50-opa-40 (alpha success-50 0.4))
;;;;Warning
;;Solid
(def warning-10 "#FFFBF9")
(def warning-20 "#FEE9DF")
(def warning-30 "#FDCEBA")
(def warning-40 "#FCB394")
(def warning-50 "#FB8F61")
(def warning-60 "#D37851")
(def warning-70 "#AB6142")
(def warning-80 "#824A32")
(def warning-90 "#5A3323")
;;50 with transparency
(def warning-50-opa-5 (alpha warning-50 0.05))
(def warning-50-opa-10 (alpha warning-50 0.1))
(def warning-50-opa-20 (alpha warning-50 0.2))
(def warning-50-opa-30 (alpha warning-50 0.3))
(def warning-50-opa-40 (alpha warning-50 0.4))
;;;;Danger
;;Solid
(def danger-10 "#FEF9F9")
(def danger-20 "#FADFDE")
(def danger-30 "#F4B9B7")
(def danger-40 "#EE9290")
(def danger-50 "#E65F5C")
(def danger-60 "#C1504D")
(def danger-70 "#9C413F")
(def danger-80 "#783130")
(def danger-90 "#532221")
;;50 with transparency
(def danger-50-opa-5 (alpha danger-50 0.05))
(def danger-50-opa-10 (alpha danger-50 0.1))
(def danger-50-opa-20 (alpha danger-50 0.2))
(def danger-50-opa-30 (alpha danger-50 0.3))
(def danger-50-opa-40 (alpha danger-50 0.4))
;;;;Info
;;Solid
(def info-10 "#F6FCFD")
(def info-20 "#D2EEF4")
(def info-30 "#9DD9E6")
(def info-40 "#67C4D8")
(def info-50 "#20A8C6")
(def info-60 "#1B8DA6")
(def info-70 "#167287")
(def info-80 "#115767")
(def info-90 "#0C3C47")
;;50 with transparency
(def info-50-opa-5 (alpha info-50 0.05))
(def info-50-opa-10 (alpha info-50 0.1))
(def info-50-opa-20 (alpha info-50 0.2))
(def info-50-opa-30 (alpha info-50 0.3))
(def info-50-opa-40 (alpha info-50 0.4))
+31
View File
@@ -0,0 +1,31 @@
(ns quo2.foundations.typography)
(def heading-1 {:font-size 27
:line-height 32.4
:letter-spacing -2.1})
(def heading-2 {:font-size 19
:line-height 25.65
:letter-spacing -1.6})
(def paragraph-1 {:font-size 15
:line-height 21.75
:letter-spacing -0.9})
(def paragraph-2 {:font-size 13
:line-height 18.2
:letter-spacing -0.3})
(def label {:font-size 11
:line-height 15.62
:letter-spacing 0.5})
(def font-regular {:font-family "Inter-Regular"}) ; 400
(def font-medium {:font-family "Inter-Medium"}) ; 500 ff
(def font-semi-bold {:font-family "Inter-SemiBold"}) ; 600
(def font-bold {:font-family "Inter-Bold"}) ; 700
(def monospace {:font-family "InterStatus-Regular"})
+86
View File
@@ -0,0 +1,86 @@
(ns quo2.screens.button
(:require [reagent.core :as reagent]
[quo.react-native :as rn]
[quo.previews.preview :as preview]
[quo.design-system.colors :as colors]
[quo2.components.button :as quo2]))
(def descriptor [{:label "Type:"
:key :type
:type :select
:options [{:key :primary
:value "Primary"}
{:key :secondary
:value "Secondary"}
{:key :grey
:value "Grey"}
{:key :outline
:value "Outline"}
{:key :ghost
:value "Ghost"}
{:key :danger
:value "Danger"}]}
{:label "Size:"
:key :size
:type :select
:options [{:key 56
:value "56"}
{:key 40
:value "40"}
{:key 32
:value "32"}
{:key 24
:value "24"}]}
{:label "Icon:"
:key :icon
:type :boolean}
{:label "Above icon:"
:key :above
:type :boolean}
{:label "After icon:"
:key :after
:type :boolean}
{:label "Before icon:"
:key :before
:type :boolean}
{:label "Disabled:"
:key :disabled
:type :boolean}
{:label "Label"
:key :label
:type :text}])
(defn cool-preview []
(let [state (reagent/atom {:label "Press Me"
:size 40})
label (reagent/cursor state [:label])
before (reagent/cursor state [:before])
after (reagent/cursor state [:after])
above (reagent/cursor state [:above])
icon (reagent/cursor state [:icon])]
(fn []
[rn/view {:margin-bottom 50
:padding 16}
[rn/view {:flex 1}
[preview/customizer state descriptor]]
[rn/view {:padding-vertical 60
:flex-direction :row
:justify-content :center}
[quo2/button (merge (dissoc @state
:theme :before :after)
{:on-press #(println "Hello world!")}
(when @above
{:above :main-icons/close-circle})
(when @before
{:before :main-icons/back})
(when @after
{:after :main-icons/next}))
(if @icon :main-icons/close-circle @label)]]])))
(defn preview-button []
[rn/view {:background-color (:ui-background @colors/theme)
:flex 1}
[rn/flat-list {:flex 1
:keyboardShouldPersistTaps :always
:header [cool-preview]
:key-fn str}]])
+63
View File
@@ -0,0 +1,63 @@
(ns quo2.screens.main
(:require [quo.react-native :as rn]
[quo.theme :as theme]
[quo.design-system.colors :as colors]
[re-frame.core :as re-frame]
[quo2.screens.button :as button]
[quo2.screens.text :as text]
[quo2.screens.tabs :as tabs]
[quo2.screens.segmented :as segmented]
[quo.core :as quo]))
(def screens [{:name :quo2-texts
:insets {:top false}
:component text/preview-text}
{:name :quo2-button
:insets {:top false}
:component button/preview-button}
{:name :quo2-tabs
:insets {:top false}
:component tabs/preview-tabs}
{:name :quo2-segmented
:insets {:top false}
:component segmented/preview-segmented}])
(defn theme-switcher []
[rn/view {:style {:flex-direction :row
:margin-vertical 8
:border-radius 4
:background-color (:ui-01 @colors/theme)
:border-width 1
:border-color (:ui-02 @colors/theme)}}
[rn/touchable-opacity {:style {:padding 8
:flex 1
:justify-content :center
:align-items :center}
:on-press #(theme/set-theme :light)}
[quo/text "Set light theme"]]
[rn/view {:width 1
:margin-vertical 4
:background-color (:ui-02 @colors/theme)}]
[rn/touchable-opacity {:style {:padding 8
:flex 1
:justify-content :center
:align-items :center}
:on-press #(theme/set-theme :dark)}
[quo/text "Set dark theme"]]])
(defn main-screen []
[rn/scroll-view {:flex 1
:padding-vertical 8
:padding-horizontal 16
:background-color (:ui-background @colors/theme)}
[theme-switcher]
[rn/view
(for [{:keys [name]} screens]
^{:key name}
[rn/touchable-opacity {:on-press #(re-frame/dispatch [:navigate-to name])}
[rn/view {:style {:padding-vertical 8}}
[quo/text (str "Preview " name)]]])]])
(def main-screens [{:name :quo2-preview
:insets {:top false}
:component main-screen}])
+48
View File
@@ -0,0 +1,48 @@
(ns quo2.screens.segmented
(:require [quo.react-native :as rn]
[quo.design-system.colors :as colors]
[quo.previews.preview :as preview]
[quo2.components.segmented-control :as quo2]
[reagent.core :as reagent]))
(def descriptor [{:label "Size:"
:key :size
:type :select
:options [{:key 32
:value "32"}
{:key 28
:value "28"}
{:key 24
:value "24"}
{:key 20
:value "20"}]}])
(defn cool-preview []
(let [state (reagent/atom {:size 32})]
(fn []
[rn/view {:margin-bottom 50
:padding 16}
[rn/view {:flex 1}
[preview/customizer state descriptor]]
[rn/view {:padding-vertical 60}
[quo2/segmented-control (merge @state
{:default-active 1
:data [{:id 1 :label "Tab 1"}
{:id 2 :label "Tab 2"}
{:id 3 :label "Tab 3"}
{:id 4 :label "Tab 4"}]
:on-change #(println "Active tab" %)})]]
[rn/view {:padding-vertical 60}
[quo2/segmented-control (merge @state
{:default-active 1
:data [{:id 1 :label "Tab 1"}
{:id 2 :label "Tab 2"}]
:on-change #(println "Active tab" %)})]]])))
(defn preview-segmented []
[rn/view {:background-color (:ui-background @colors/theme)
:flex 1}
[rn/flat-list {:flex 1
:keyboardShouldPersistTaps :always
:header [cool-preview]
:key-fn str}]])
+44
View File
@@ -0,0 +1,44 @@
(ns quo2.screens.tabs
(:require [quo.react-native :as rn]
[quo.design-system.colors :as colors]
[quo.previews.preview :as preview]
[quo2.components.tabs :as quo2]
[reagent.core :as reagent]))
(def descriptor [{:label "Size:"
:key :size
:type :select
:options [{:key 32
:value "32"}
{:key 28
:value "28"}
{:key 24
:value "24"}
{:key 20
:value "20"}]}])
(defn cool-preview []
(let [state (reagent/atom {:size 32})]
(fn []
[rn/view {:margin-bottom 50
:padding 16}
[rn/view {:flex 1}
[preview/customizer state descriptor]]
[rn/view {:padding-vertical 60
:flex-direction :row
:justify-content :center}
[quo2/tabs (merge @state
{:default-active 1
:data [{:id 1 :label "Tab 1"}
{:id 2 :label "Tab 2"}
{:id 3 :label "Tab 3"}
{:id 4 :label "Tab 4"}]
:on-change #(println "Active tab" %)})]]])))
(defn preview-tabs []
[rn/view {:background-color (:ui-background @colors/theme)
:flex 1}
[rn/flat-list {:flex 1
:keyboardShouldPersistTaps :always
:header [cool-preview]
:key-fn str}]])
+51
View File
@@ -0,0 +1,51 @@
(ns quo2.screens.text
(:require [quo.react-native :as rn]
[quo.previews.preview :as preview]
[reagent.core :as reagent]
[quo2.components.text :as quo2]
[quo.design-system.colors :as colors]))
(def descriptor [{:label "Size:"
:key :size
:type :select
:options [{:key :heading-1
:value "Heading 1"}
{:key :heading-2
:value "Heading 2"}
{:key :paragraph-1
:value "Paragraph 1"}
{:key :paragraph-2
:value "Paragraph 2"}
{:key :label
:value "Label"}]}
{:label "Weight:"
:key :weight
:type :select
:options [{:key :regular
:value "Regular"}
{:key :medium
:value "Medium"}
{:key :semi-bold
:value "Semi-bold"}
{:key :bold
:value "Bold"}
{:key :monospace
:value "Monospace"}]}])
(defn cool-preview []
(let [state (reagent/atom {})]
(fn []
[rn/view {:margin-bottom 50
:padding 16}
[preview/customizer state descriptor]
[rn/view {:padding-vertical 60}
[quo2/text @state
"The quick brown fox jumped over the lazy dog."]]])))
(defn preview-text []
[rn/view {:background-color (:ui-background @colors/theme)
:flex 1}
[rn/flat-list {:flex 1
:keyboardShouldPersistTaps :always
:header [cool-preview]
:key-fn str}]])
+1 -1
View File
@@ -139,7 +139,7 @@
(cond
(not public-key) :owned
(string/ends-with? % "0000000000000000000000000000000000000000000000000000000000000000")
:invalid
:invalid-ens
(= % public-key) :connected
:else :connected-with-different-key)
(eip55/address->checksum response)]))
+43 -25
View File
@@ -38,7 +38,7 @@
[status-im.navigation :as navigation]
status-im.notifications-center.core
status-im.pairing.core
status-im.popover.core
[status-im.popover.core :as popover]
status-im.profile.core
status-im.search.core
status-im.signals.core
@@ -52,7 +52,7 @@
status-im.utils.logging.core
[status-im.utils.universal-links.core :as universal-links]
[status-im.utils.utils :as utils]
status-im.visibility-status-popover.core
[status-im.visibility-status-popover.core :as visibility-status-popover]
status-im.visibility-status-updates.core
status-im.waku.core
status-im.wallet.accounts.core
@@ -60,7 +60,9 @@
[status-im.wallet.core :as wallet]
status-im.wallet.custom-tokens.core
[status-im.navigation.core :as navigation.core]
[status-im.multiaccounts.login.core :as login.core]))
[status-im.multiaccounts.login.core :as login.core]
[status-im.signing.core :as signing]
status-im.wallet-connect.core))
(re-frame/reg-fx
:dismiss-keyboard
@@ -115,31 +117,47 @@
(fx/defn system-theme-mode-changed
{:events [:system-theme-mode-changed]}
[{:keys [db] :as cofx} theme]
(let [cur-theme (get-in db [:multiaccount :appearance])
current-tab (get db :current-tab :chat)
view-id (:view-id db)
screen-params (get-in db [:navigation/screen-params view-id])
root-id @navigation.core/root-id]
(let [cur-theme (get-in db [:multiaccount :appearance])
current-tab (get db :current-tab :chat)
view-id (:view-id db)
screen-params (get-in db [:navigation/screen-params view-id])
root-id @navigation.core/root-id
dispatch-later (cond-> []
(= view-id :chat)
(conj {:ms 1000
:dispatch [:chat.ui/navigate-to-chat (:current-chat-id db)]})
(and
(= root-id :chat-stack)
(not-any? #(= view-id %) '(:home :empty-tab :wallet :status :my-profile :chat)))
(conj {:ms 1000
:dispatch [:navigate-to view-id screen-params]})
(some #(= view-id %) navigation.core/community-screens)
(conj {:ms 800 :dispatch
[:navigate-to :community
(get-in db [:navigation/screen-params :community])]})
(= view-id :community-emoji-thumbnail-picker)
(conj {:ms 900 :dispatch
[:navigate-to :create-community-channel
(get-in db [:navigation/screen-params :create-community-channel])]}))]
(navigation.core/dismiss-all-modals)
(when (or (nil? cur-theme) (zero? cur-theme))
(fx/merge cofx
{::multiaccounts/switch-theme (if (= :dark theme) 2 1)
:utils/dispatch-later
(cond-> [{:ms 2000 :dispatch
(if (= view-id :chat)
[:chat.ui/navigate-to-chat (:current-chat-id db)]
[:navigate-to view-id screen-params])}]
(some #(= view-id %) navigation.core/community-screens)
(conj {:ms 1000 :dispatch
[:navigate-to :community
(get-in db [:navigation/screen-params :community])]})
(= view-id :community-emoji-thumbnail-picker)
(conj {:ms 1500 :dispatch
[:navigate-to :create-community-channel
(get-in db [:navigation/screen-params :create-community-channel])]}))}
(bottom-sheet/hide-bottom-sheet)
(merge
{::multiaccounts/switch-theme (if (= :dark theme) 2 1)}
(when (seq dispatch-later)
{:utils/dispatch-later dispatch-later}))
(when (get-in db [:bottom-sheet/show?])
(bottom-sheet/hide-bottom-sheet))
(when (get-in db [:popover/popover])
(popover/hide-popover))
(when (get-in db [:visibility-status-popover/popover])
(visibility-status-popover/hide-visibility-status-popover))
(when (get-in db [:signing/tx])
(signing/discard))
(navigation/init-root root-id)
(when (= root-id :chat-stack)
(navigation/change-tab current-tab))))))
+21 -1
View File
@@ -42,7 +42,8 @@
[status-im.ui.components.react :as react]
[status-im.utils.platform :as platform]
[status-im.ethereum.tokens :as tokens]
[clojure.string :as string]))
[clojure.string :as string]
[status-im.utils.wallet-connect :as wallet-connect]))
(re-frame/reg-fx
::initialize-communities-enabled
@@ -82,6 +83,20 @@
(fn []
(status/start-local-notifications)))
(re-frame/reg-fx
::initialize-wallet-connect
(fn []
(wallet-connect/init
#(re-frame/dispatch [:wallet-connect/client-init %])
#(log/error "[wallet-connect]" %))))
(re-frame/reg-fx
::initialize-wallet-connect
(fn []
(async-storage/get-item
:wallet-connect-enabled?
#(re-frame/dispatch [:multiaccounts.ui/switch-wallet-connect-enabled %]))))
(defn rpc->accounts [accounts]
(reduce (fn [acc {:keys [chat type wallet] :as account}]
(if chat
@@ -343,6 +358,10 @@
[cofx]
{::initialize-transactions-management-enabled nil})
(fx/defn initialize-wallet-connect
[cofx]
{::initialize-wallet-connect nil})
(fx/defn get-node-config-callback
{:events [::get-node-config-callback]}
[{:keys [db] :as cofx} node-config-json]
@@ -377,6 +396,7 @@
(acquisition/login)
(initialize-appearance)
(initialize-communities-enabled)
(initialize-wallet-connect)
(get-node-config)
(communities/fetch)
(logging/set-log-level (:log-level multiaccount))
+17
View File
@@ -86,3 +86,20 @@
[_]
{:hide-select-acc-sheet nil})
(fx/defn hide-wallet-connect-sheet
{:events [:hide-wallet-connect-sheet]}
[_]
{:hide-wallet-connect-sheet nil})
(fx/defn hide-wallet-connect-success-sheet
{:events [:hide-wallet-connect-success-sheet]}
[_]
{:hide-wallet-connect-success-sheet nil})
(fx/defn hide-wallet-connect-app-management-sheet
{:events [:hide-wallet-connect-app-management-sheet]}
[{:keys [db]}]
{:db (-> db
(assoc db :wallet-connect/showing-app-management-sheet? false)
(dissoc :wallet-connect/session-managed))
:hide-wallet-connect-app-management-sheet nil})
+31 -2
View File
@@ -159,7 +159,7 @@
(.events Navigation)
(fn [^js evn]
(let [view-id (keyword (.-componentName evn))]
(when-not (#{"popover" "bottom-sheet" "signing-sheet" "visibility-status-popover"}
(when-not (#{"popover" "bottom-sheet" "signing-sheet" "visibility-status-popover" "wallet-connect-sheet" "wallet-connect-success-sheet" "wallet-connect-app-management-sheet"}
(.-componentName evn))
(re-frame/dispatch [::view-disappeared view-id])
(doseq [[_ {:keys [ref value]}] @quo.text-input/text-input-refs]
@@ -338,6 +338,33 @@
(re-frame/reg-fx :show-bottom-sheet (fn [] (show-overlay "bottom-sheet")))
(re-frame/reg-fx :hide-bottom-sheet (fn [] (dissmiss-overlay "bottom-sheet")))
;; WALLET CONNECT
(defonce wallet-connect-sheet-reg
(.registerComponent Navigation
"wallet-connect-sheet"
(fn [] (gestureHandlerRootHOC views/wallet-connect-comp))
(fn [] views/wallet-connect-comp)))
(defonce wallet-connect-success-sheet-reg
(.registerComponent Navigation
"wallet-connect-success-sheet"
(fn [] (gestureHandlerRootHOC views/wallet-connect-success-comp))
(fn [] views/wallet-connect-success-comp)))
(defonce wallet-connect-app-management-sheet-reg
(.registerComponent Navigation
"wallet-connect-app-management-sheet"
(fn [] (gestureHandlerRootHOC views/wallet-connect-app-management-comp))
(fn [] views/wallet-connect-app-management-comp)))
(re-frame/reg-fx :show-wallet-connect-sheet (fn [] (show-overlay "wallet-connect-sheet")))
(re-frame/reg-fx :hide-wallet-connect-sheet (fn [] (dissmiss-overlay "wallet-connect-sheet")))
(re-frame/reg-fx :show-wallet-connect-success-sheet (fn [] (show-overlay "wallet-connect-success-sheet")))
(re-frame/reg-fx :hide-wallet-connect-success-sheet (fn [] (dissmiss-overlay "wallet-connect-success-sheet")))
(re-frame/reg-fx :show-wallet-connect-app-management-sheet (fn [] (show-overlay "wallet-connect-app-management-sheet")))
(re-frame/reg-fx :hide-wallet-connect-app-management-sheet (fn [] (dissmiss-overlay "wallet-connect-app-management-sheet")))
;; SIGNING
(defonce signing-sheet-reg
@@ -390,7 +417,9 @@
:create-community-channel
:community-emoji-thumbnail-picker
:create-community-category
:community-edit-chats))
:community-edit-chats
:community-edit
:community-reorder-categories))
;; change view-id if it is still same after component is disappeared
;; https://github.com/wix/react-native-navigation/issues/5744#issuecomment-563226820
+1 -2
View File
@@ -143,8 +143,7 @@
{:events [:notifications/switch-error]}
[cofx enabled?]
(multiaccounts.update/multiaccount-update
:remote-push-notifications-enabled? (not enabled?)
{}))
cofx :remote-push-notifications-enabled? (not enabled?) {}))
(fx/defn notification-switch
{:events [::switch]}
+10 -6
View File
@@ -78,16 +78,20 @@
(navigation/change-tab :wallet)
(navigation/pop-to-root-tab :wallet-stack)))
(fx/defn handle-wallet-connect [cofx data]
{:dispatch [:wallet-connect/pair data]})
(fx/defn match-scan
{:events [::match-scanned-value]}
[cofx {:keys [type] :as data}]
(case type
:public-chat (handle-public-chat cofx data)
:group-chat (handle-group-chat cofx data)
:private-chat (handle-private-chat cofx data)
:contact (handle-view-profile cofx data)
:browser (handle-browse cofx data)
:eip681 (handle-eip681 cofx data)
:public-chat (handle-public-chat cofx data)
:group-chat (handle-group-chat cofx data)
:private-chat (handle-private-chat cofx data)
:contact (handle-view-profile cofx data)
:browser (handle-browse cofx data)
:eip681 (handle-eip681 cofx data)
:wallet-connect (handle-wallet-connect cofx data)
{:dispatch [:navigate-back]
:utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
:on-dismiss #(re-frame/dispatch [:pop-to-root-tab :chat-stack])}}))
+7 -1
View File
@@ -12,12 +12,15 @@
[status-im.utils.db :as utils.db]
[status-im.utils.http :as http]
[status-im.chat.models :as chat.models]
[status-im.ethereum.stateofus :as stateofus]))
[status-im.ethereum.stateofus :as stateofus]
[status-im.utils.wallet-connect :as wallet-connect]))
(def ethereum-scheme "ethereum:")
(def uri-schemes ["status-im://" "status-im:"])
(def wallet-connect-scheme "wc:")
(def web-prefixes ["https://" "http://" "https://www." "http://wwww."])
(def web2-domain "join.status.im")
@@ -226,6 +229,9 @@
(http/url? uri)
(cb (match-browser-string uri))
(wallet-connect/url? uri)
(cb {:type :wallet-connect :data uri})
:else
(cb {:type :undefined
:data uri}))))
+15 -6
View File
@@ -268,6 +268,14 @@
(reg-root-key-sub :backup/performing-backup :backup/performing-backup)
;; wallet connect
(reg-root-key-sub :wallet-connect/proposal-metadata :wallet-connect/proposal-metadata)
(reg-root-key-sub :wallet-connect/enabled? :wallet-connect/enabled?)
(reg-root-key-sub :wallet-connect/session-connected :wallet-connect/session-connected)
(reg-root-key-sub :wallet-connect/showing-app-management-sheet? :wallet-connect/showing-app-management-sheet?)
(reg-root-key-sub :wallet-connect/sessions :wallet-connect/sessions)
(reg-root-key-sub :wallet-connect/session-managed :wallet-connect/session-managed)
(re-frame/reg-sub
:communities
:<- [:raw-communities]
@@ -640,9 +648,11 @@
:bottom-sheet
:<- [:bottom-sheet/show?]
:<- [:bottom-sheet/view]
(fn [[show? view]]
:<- [:bottom-sheet/options]
(fn [[show? view options]]
{:show? show?
:view view}))
:view view
:options options}))
(re-frame/reg-sub
:is-contact-selected?
@@ -1033,9 +1043,8 @@
:<- [:chats/current-raw-chat]
:<- [:multiaccount/public-key]
:<- [:communities/current-community]
(fn [[{:keys [group-chat] :as current-chat}
my-public-key
community]]
:<- [:contacts/blocked-set]
(fn [[{:keys [group-chat chat-id] :as current-chat} my-public-key community blocked-users-set]]
(when current-chat
(cond-> current-chat
(chat.models/public-chat? current-chat)
@@ -1051,7 +1060,7 @@
(assoc :show-input? true)
(not group-chat)
(assoc :show-input? true)))))
(assoc :show-input? (not (contains? blocked-users-set chat-id)))))))
(re-frame/reg-sub
:chats/current-chat-chat-view
@@ -43,7 +43,7 @@
:duration 500
:useNativeDriver true})])))
(defn bottom-panel [_ render window-height on-close]
(defn bottom-panel [_ render window-height on-close on-touch-outside show-overlay?]
(let [bottom-anim-value (anim/create-value window-height)
alpha-value (anim/create-value 0)
clear-timeout (atom nil)
@@ -97,8 +97,12 @@
:ignore-offset true}
[react/view {:flex 1}
(when platform/ios?
(when (and platform/ios? show-overlay?)
[react/animated-view {:flex 1 :background-color colors/black-persist :opacity alpha-value}])
(when on-touch-outside
[react/touchable-opacity {:active-opacity 0
:on-press on-touch-outside
:style {:flex 1}}])
[react/animated-view {:style {:position :absolute
:transform [{:translateY bottom-anim-value}]
:bottom 0 :left 0 :right 0}}
@@ -108,6 +112,6 @@
#(do (on-close)
nil)))})))
(views/defview animated-bottom-panel [val signing-view on-close]
(views/defview animated-bottom-panel [val view on-close on-touch-outside show-overlay?]
(views/letsubs [{window-height :height} [:dimensions/window]]
[bottom-panel (when val (select-keys val [:from :contact :amount :token :approve? :message :cancel? :hash])) signing-view window-height on-close]))
[bottom-panel (when val (select-keys val [:from :contact :amount :token :approve? :message :cancel? :hash :name :url :icons :description :topic :relay :self :peer :permissions :state])) view window-height on-close on-touch-outside (if-not (nil? show-overlay?) show-overlay? true)]))
+4 -1
View File
@@ -13,7 +13,8 @@
["@react-native-community/clipboard" :default Clipboard]
["react-native-linear-gradient" :default LinearGradient]
["react-native-navigation" :refer (Navigation)]
["react-native-fast-image" :as FastImage])
["react-native-fast-image" :as FastImage]
["@react-native-community/blur" :as blur])
(:require-macros [status-im.utils.views :as views]))
(def native-modules (.-NativeModules react-native))
@@ -39,6 +40,8 @@
(def linear-gradient (reagent/adapt-react-class LinearGradient))
(def blur-view (reagent/adapt-react-class (.-BlurView blur)))
(defn valid-source? [source]
(or (not (map? source))
(not (contains? source :uri))
+12 -1
View File
@@ -12,4 +12,15 @@
[react/text {:style {:font-weight "500" :color (if active? colors/blue colors/gray) :line-height 22}}
label]]]
(when active?
[react/view {:width 24 :height 3 :border-radius 4 :background-color colors/blue}])])
[react/view {:width 24 :height 3 :border-radius 4 :background-color colors/blue}])])
(defn tab-button [state key label active?]
[react/view {:flex 1 :align-items :center :border-radius 8
:background-color (if active? colors/blue colors/blue-light)}
[react/touchable-highlight {:on-press #(swap! state assoc :tab key)
:accessibility-label (str label "-item-button")
:style {:border-radius 8}
:flex 1}
[react/view {:padding-horizontal 12 :padding-vertical 8}
[react/text {:style {:font-weight "500" :color (if active? colors/white colors/blue) :line-height 22}}
label]]]])
@@ -13,7 +13,8 @@
transactions-management-enabled?
wakuv2-flag
current-fleet
webview-debug]}]
webview-debug
wallet-connect-enabled?]}]
(keep
identity
[{:size :small
@@ -112,7 +113,16 @@
#(re-frame/dispatch
[:multiaccounts.ui/waku-bloom-filter-mode-switched (not waku-bloom-filter-mode)])
:accessory :switch
:active waku-bloom-filter-mode}]))
:active waku-bloom-filter-mode}
{:size :small
:title (i18n/label :t/wallet-connect-2.0)
:accessibility-label :wallet-connect-settings-switch
:container-margin-bottom 8
:on-press
#(re-frame/dispatch
[:multiaccounts.ui/switch-wallet-connect-enabled (not wallet-connect-enabled?)])
:accessory :switch
:active wallet-connect-enabled?}]))
(defn- flat-list-data [options]
(normal-mode-settings-data options))
@@ -130,7 +140,8 @@
communities-enabled? [:communities/enabled?]
transactions-management-enabled? [:wallet/transactions-management-enabled?]
current-log-level [:log-level/current-log-level]
current-fleet [:fleets/current-fleet]]
current-fleet [:fleets/current-fleet]
wallet-connect-enabled? [:wallet-connect/enabled?]]
[list/flat-list
{:data (flat-list-data
{:network-name network-name
@@ -141,6 +152,7 @@
:dev-mode? false
:wakuv2-flag wakuv2-flag
:waku-bloom-filter-mode waku-bloom-filter-mode
:webview-debug webview-debug})
:webview-debug webview-debug
:wallet-connect-enabled? wallet-connect-enabled?})
:key-fn (fn [_ i] (str i))
:render-fn render-item}]))
@@ -9,7 +9,7 @@
[quo.core :as quo]))
(defn bottom-sheet []
(let [{:keys [show? view]} @(re-frame/subscribe [:bottom-sheet])
(let [{:keys [show? view options]} @(re-frame/subscribe [:bottom-sheet])
{:keys [content]
:as opts}
(cond-> {:visible? show?
@@ -40,4 +40,4 @@
(merge key-storage/migrate-account-password))]
[quo/bottom-sheet opts
(when content
[content])]))
[content (when options options)])]))
@@ -10,7 +10,10 @@
[quo.design-system.colors :as colors]
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.components.react :as react]
[status-im.ui.components.slider :as slider]))
[status-im.ui.components.slider :as slider]
["react-native-blob-util" :default ReactNativeBlobUtil]
[status-im.utils.platform :as platform]
[taoensso.timbre :as log]))
(defonce player-ref (atom nil))
(defonce current-player-message-id (atom nil))
@@ -110,25 +113,34 @@
#(update-state (merge params {:error (:message %)}))))))
(update-state (merge params {:seek-to-ms value})))
(defn reload-player [{:keys [message-id state-ref] :as params} base64-data on-success]
(defn download-audio-http [base64-uri on-success]
(-> (.config ReactNativeBlobUtil (clj->js {:trusty platform/ios?}))
(.fetch "GET" (str base64-uri))
(.then #(on-success (.base64 ^js %)))
(.catch #(log/error "could not fetch audio"))))
(defn reload-player [{:keys [message-id state-ref] :as params} audio-url on-success]
;; to avoid reloading player while is initializing,
;; we go ahead only if there is no player or
;; if it is already prepared
(when (or (nil? @player-ref) (audio/can-play? @player-ref))
(when @player-ref
(destroy-player (merge params {:reloading? true})))
(reset! player-ref (audio/new-player
base64-data
{:autoDestroy false
:continuesToPlayInBackground false}
#(seek params 0 true nil)))
(audio/prepare-player
@player-ref
#(when on-success (on-success))
#(update-state (merge params {:error (:message %)})))
(reset! current-player-message-id message-id)
(reset! current-active-state-ref-ref state-ref)
(update-state params)))
(download-audio-http
audio-url
(fn [base64-data]
(reset! player-ref (audio/new-player
(str "data:audio/acc;base64," base64-data)
{:autoDestroy false
:continuesToPlayInBackground false}
#(seek params 0 true nil)))
(audio/prepare-player
@player-ref
#(when on-success (on-success))
#(update-state (merge params {:error (:message %)})))
(reset! current-player-message-id message-id)
(reset! current-active-state-ref-ref state-ref)
(update-state params)))))
(defn play-pause [{:keys [message-id state-ref] :as params} audio]
(if (not= message-id @current-player-message-id)
@@ -10,16 +10,18 @@
[status-im.constants :as constants]
[quo.design-system.colors :as colors]
[status-im.utils.platform :as platform]
[status-im.ui.components.topbar :as topbar]
[status-im.communities.core :as communities]
[status-im.utils.handlers :refer [>evt <sub]]
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.screens.communities.styles :as styles]
[status-im.ui.components.topbar :as topbar]
[status-im.ui.components.react :as react]
[status-im.ui.components.tabs :as tabs]
[status-im.ui.screens.communities.community :as community]
[status-im.ui.screens.home.views.inner-item :as inner-item]))
(def collapse-chats? (reagent/atom false))
(def data (reagent/atom []))
(def state (reagent/atom {:tab :chats}))
(defn show-delete-chat-confirmation [community-id chat-id]
(utils/show-confirmation
@@ -28,13 +30,17 @@
:confirm-button-text (i18n/label :t/delete)
:on-accept #(>evt [:delete-community-chat community-id chat-id])}))
(defn show-delete-catgory-confirmation [community-id category-id]
(defn show-delete-category-confirmation [community-id category-id]
(utils/show-confirmation
{:title (i18n/label :t/delete-confirmation)
:content (i18n/label :t/delete-category-confirmation)
:confirm-button-text (i18n/label :t/delete)
:on-accept #(>evt [:delete-community-category community-id category-id])}))
(defn categories-tab? []
(let [{:keys [tab]} @state]
(= tab :categories)))
(defn chat-item
[{:keys [id community-id] :as home-item} is-active? drag]
(let [chat-id (string/replace id community-id "")
@@ -64,15 +70,15 @@
[rn/view {:accessibility-label :category-item
:style (merge styles/category-item
{:background-color background-color})}
(if category-none?
(if (not (categories-tab?))
[icons/icon :main-icons/channel-category {:color colors/gray}]
[rn/touchable-opacity
{:accessibility-label :delete-category-button
:on-press #(show-delete-catgory-confirmation community-id id)}
:on-press #(show-delete-category-confirmation community-id id)}
[icons/icon :main-icons/delete-circle {:no-color true}]])
[rn/view {:flex 1}
[rn/text {:style {:font-size 17 :margin-left 10 :color colors/black}} name]]
(when (and (not category-none?) @collapse-chats?)
(when (and (not category-none?) (categories-tab?))
[rn/touchable-opacity {:accessibility-label :category-drag-handle
:on-long-press drag
:delay-long-press 100
@@ -121,18 +127,19 @@
(>evt [::communities/reorder-community-category community-id id to]))))
(defn on-drag-end-fn [from to data-js]
(if @collapse-chats?
(if (categories-tab?)
(on-drag-end-category from to data-js)
(when-not (= to 0) (on-drag-end-chat from to data-js))))
(defn reset-data [categories chats]
(reset! data (if @collapse-chats? categories ;; If chats are collapsed then only show categories
(walk/postwalk-replace ;; else, categories and chats
{:chat-id :id}
(reduce (fn [acc category]
(-> acc
(conj category)
(into (get chats (:id category))))) [] categories)))))
(reset! data (if (categories-tab?)
categories
(walk/postwalk-replace
{:chat-id :id}
(reduce (fn [acc category]
(-> acc
(conj category)
(into (get chats (:id category))))) [] categories)))))
(defn draggable-list []
[rn/draggable-flat-list
@@ -144,33 +151,35 @@
:container-style {:margin-bottom 108} ;; after bumping react native version to > 0.64
:on-drag-end-fn on-drag-end-fn}])
(defn chats_and_categories []
(let [{:keys [tab]} @state]
[:<>
[react/view {:flex-direction :row :margin-horizontal 16 :margin-vertical 8
:border-radius 8 :background-color colors/blue-light}
[tabs/tab-button state :chats (i18n/label :t/edit-chats) (= tab :chats)]
[tabs/tab-button state :categories (i18n/label :t/edit-categories) (= tab :categories)]]]))
(defn view []
(let [{:keys [community-id]} (<sub [:get-screen-params])
{:keys [id name images members permissions color]}
(<sub [:communities/community community-id])
sorted-categories (<sub [:communities/sorted-categories community-id])
categories (if @collapse-chats? sorted-categories
(conj sorted-categories
{:id ""
:position (count sorted-categories)
:name (i18n/label :t/none)
:community-id community-id}))
categories (if (categories-tab?)
sorted-categories
(conj sorted-categories
{:id ""
:position (count sorted-categories)
:name (i18n/label :t/none)
:community-id community-id}))
chats (<sub [:chats/sorted-categories-by-community-id community-id])]
(reset-data categories chats)
[:<>
[topbar/topbar
{:modal? true
:content [community/toolbar-content id name color images
{:content [community/toolbar-content id name color images
(not= (:access permissions) constants/community-no-membership-access)
(count members)]}]
(if (and (empty? sorted-categories) (empty? chats))
[community/blank-page (i18n/label :t/welcome-community-blank-message-edit-chats)]
[:<>
[quo/list-item {:size :small
:title (i18n/label :t/rearrange-categories)
:active @collapse-chats?
:accessory :switch
:container-style {:padding-left 10}
:on-press #(reset! collapse-chats? (not @collapse-chats?))}]
[quo/separator]
[draggable-list]])]))
[chats_and_categories]
[draggable-list]])]))
+1 -1
View File
@@ -150,7 +150,7 @@
[help-message-text-element
:t/ens-username-owned
:t/ens-username-connected-with-different-key]
:invalid
:invalid-ens
[help-message-text-element
:t/ens-username-owned
:t/ens-username-registration-invalid]
@@ -71,7 +71,7 @@
:size :small}
name]
[icons/icon
:main-icons/chevron-down
:main-icons/chevron-right
{:color colors/gray
:width 16
:height 22}]])
@@ -13,25 +13,48 @@
(defonce server (reagent/atom ""))
(defn local-notifications []
[:<>
(let [{:keys [enabled]} @(re-frame/subscribe [:notifications/wallet-transactions])]
[quo/separator {:color (:ui-02 @quo-colors/theme)
:style {:margin-vertical 8}}]
[quo/list-header (i18n/label :t/local-notifications)]
[quo/list-item
{:size :small
:title (i18n/label :t/notifications-transactions)
:accessibility-label :notifications-button
:active enabled
:on-press #(re-frame/dispatch
[::notifications/switch-transaction-notifications enabled])
:accessory :switch}])])
(let [{:keys [enabled]} @(re-frame/subscribe [:notifications/wallet-transactions])
{:keys [notifications-enabled?]} @(re-frame/subscribe [:multiaccount])
enabled (and enabled (or platform/ios? notifications-enabled?))]
[quo/list-item
{:size :small
:title (i18n/label :t/notifications-transactions)
:accessibility-label :notifications-button
:active enabled
:disabled (not (or platform/ios? notifications-enabled?))
:on-press #(re-frame/dispatch
[::notifications/switch-transaction-notifications enabled])
:accessory :switch}]))
(defn notifications-settings-ios []
(defn remote-notifications []
(let [{:keys [remote-push-notifications-enabled?
push-notifications-block-mentions?
push-notifications-from-contacts-only?]}
@(re-frame/subscribe [:multiaccount])]
[:<>
[quo/list-item
{:size :small
:title (i18n/label :t/notifications-non-contacts)
:accessibility-label :notifications-button
:active (and remote-push-notifications-enabled?
(not push-notifications-from-contacts-only?))
:disabled (not remote-push-notifications-enabled?)
:on-press #(re-frame/dispatch
[::notifications/switch-non-contacts (not push-notifications-from-contacts-only?)])
:accessory :switch}]
[quo/list-item
{:size :small
:title (i18n/label :t/allow-mention-notifications)
:accessibility-label :notifications-button
:active (and remote-push-notifications-enabled?
(not push-notifications-block-mentions?))
:disabled (not remote-push-notifications-enabled?)
:on-press #(re-frame/dispatch
[::notifications/switch-block-mentions (not push-notifications-block-mentions?)])
:accessory :switch}]]))
(defn notifications-settings-ios []
(let [{:keys [remote-push-notifications-enabled?]} @(re-frame/subscribe [:multiaccount])]
[:<>
[quo/list-item
{:size :small
@@ -43,25 +66,8 @@
[quo/separator {:color (:ui-02 @quo-colors/theme)
:style {:margin-vertical 8}}]
[quo/list-header (i18n/label :t/notifications-preferences)]
[quo/list-item
{:size :small
:title (i18n/label :t/notifications-non-contacts)
:accessibility-label :notifications-button
:active (and remote-push-notifications-enabled?
(not push-notifications-from-contacts-only?))
:on-press #(re-frame/dispatch
[::notifications/switch-non-contacts (not push-notifications-from-contacts-only?)])
:accessory :switch}]
[quo/list-item
{:size :small
:title (i18n/label :t/allow-mention-notifications)
:accessibility-label :notifications-button
:active (and remote-push-notifications-enabled?
(not push-notifications-block-mentions?))
:on-press #(re-frame/dispatch
[::notifications/switch-block-mentions (not push-notifications-block-mentions?)])
:accessory :switch}]
[local-notifications]]))
[local-notifications]
[remote-notifications]]))
(defn notifications-settings-android []
(let [{:keys [notifications-enabled? remote-push-notifications-enabled?]}
@@ -85,7 +91,12 @@
[::notifications/switch
(not remote-push-notifications-enabled?) true])
:accessory :switch}])
[local-notifications]]))
[quo/separator {:color (:ui-02 @quo-colors/theme)
:style {:margin-vertical 8}}]
[quo/list-header (i18n/label :t/notifications-preferences)]
[local-notifications]
(when (and platform/android? (not config/google-free))
[remote-notifications])]))
(defn notifications-settings []
[react/scroll-view {:style {:flex 1}
@@ -15,7 +15,6 @@
[quo.design-system.colors :as colors]
[status-im.ui.components.toolbar :as toolbar]
[status-im.ui.components.keyboard-avoid-presentation :as kb-presentation]
[status-im.utils.platform :as platform]
[reagent.core :as reagent]
[clojure.string :as string]
[quo.components.list.item :as list-item]
@@ -40,14 +39,13 @@
:icon :main-icons/add-contact
:accessibility-label :add-to-contacts-button
:action #(re-frame/dispatch [:contact.ui/add-to-contact-pressed public-key nil ens-name])}])
(when platform/ios?
[{:label (i18n/label (if (or muted? blocked?) :t/unmute :t/mute))
:icon :main-icons/notification
:accessibility-label :mute-chat
:selected muted?
:disabled blocked?
:action (when-not blocked?
#(re-frame/dispatch [::chat.models/mute-chat-toggled public-key (not muted?)]))}])
[{:label (i18n/label (if (or muted? blocked?) :t/unmute :t/mute))
:icon :main-icons/notification
:accessibility-label :mute-chat
:selected muted?
:disabled blocked?
:action (when-not blocked?
#(re-frame/dispatch [::chat.models/mute-chat-toggled public-key (not muted?)]))}]
[{:label (i18n/label (if blocked? :t/unblock :t/block))
:negative true
:selected blocked?
@@ -116,6 +116,13 @@
:accessibility-label :appearance-settings-button
:chevron true
:on-press #(re-frame/dispatch [:navigate-to :quo-preview])}])
(when config/quo-preview-enabled?
[quo/list-item
{:icon :main-icons/appearance
:title "Quo2.0 Preview"
:accessibility-label :appearance-settings-button
:chevron true
:on-press #(re-frame/dispatch [:navigate-to :quo2-preview])}])
[quo/list-item
{:icon :main-icons/appearance
:title (i18n/label :t/appearance)
+10 -4
View File
@@ -119,7 +119,9 @@
[status-im.ui.screens.wallet.accounts-manage.views :as accounts-manage]
[status-im.ui.screens.wallet.buy-crypto.views :as wallet.buy-crypto]
[status-im.ui.screens.wallet.recipient.views :as recipient]
[status-im.ui.screens.wallet.send.views :as wallet.send]))
[status-im.ui.screens.wallet.send.views :as wallet.send]
[quo2.screens.main :as quo2.preview]
[status-im.utils.config :as config]))
(def components
[{:name :chat-toolbar
@@ -903,7 +905,11 @@
:options {:topBar {:visible false}}
:component bug-report/bug-report}]
(when js/goog.DEBUG
(when config/quo-preview-enabled?
quo.preview/screens)
(when js/goog.DEBUG
quo.preview/main-screens)))
(when config/quo-preview-enabled?
quo.preview/main-screens)
(when config/quo-preview-enabled?
quo2.preview/screens)
(when config/quo-preview-enabled?
quo2.preview/main-screens)))
+33 -2
View File
@@ -13,7 +13,8 @@
[quo.design-system.colors :as colors]
[status-im.utils.config :as config]
[status-im.keycard.test-menu :as keycard.test-menu]
[status-im.utils.platform :as platform]))
[status-im.utils.platform :as platform]
[status-im.ui.screens.wallet-connect.session-proposal.views :as wallet-connect]))
(defn get-screens []
(reduce
@@ -112,7 +113,7 @@
(def signing-comp
(reagent/reactify-component
(fn []
^{:key (str "signing-seet" @reloader/cnt)}
^{:key (str "signing-sheet" @reloader/cnt)}
[react/safe-area-provider
[inactive]
[signing/signing]
@@ -128,3 +129,33 @@
[wallet.send.views/select-account]
(when js/goog.DEBUG
[reloader/reload-view])])))
(def wallet-connect-comp
(reagent/reactify-component
(fn []
^{:key (str "wallet-connect-sheet" @reloader/cnt)}
[react/safe-area-provider
[inactive]
[wallet-connect/wallet-connect-proposal-sheet]
(when js/goog.DEBUG
[reloader/reload-view])])))
(def wallet-connect-success-comp
(reagent/reactify-component
(fn []
^{:key (str "wallet-connect-success-sheet" @reloader/cnt)}
[react/safe-area-provider
[inactive]
[wallet-connect/wallet-connect-success-sheet-view]
(when js/goog.DEBUG
[reloader/reload-view])])))
(def wallet-connect-app-management-comp
(reagent/reactify-component
(fn []
^{:key (str "wallet-connect-app-management-sheet" @reloader/cnt)}
[react/safe-area-provider
[inactive]
[wallet-connect/wallet-connect-app-management-sheet-view]
(when js/goog.DEBUG
[reloader/reload-view])])))
@@ -0,0 +1,144 @@
(ns status-im.ui.screens.wallet-connect.session-proposal.styles
(:require [quo.design-system.colors :as colors]))
(defn toolbar-container [background-color]
{:height 36
:border-radius 18
:background-color background-color
:align-items :center
:flex-direction :row
:padding-left 13
:padding-right 6})
(def toolbar-text
{:flex-grow 1
:margin-right 3})
(defn dapp-logo []
{:width 120
:height 120
:resize-mode :cover
:margin-top 31
:border-radius 16
:border-width 2
:border-color (:interactive-02 @colors/theme)
:padding 5})
(def sheet-body-container
{:flex 1
:align-items :center})
(defn acc-sheet []
{:background-color (:ui-background @colors/theme)
:border-top-right-radius 16
:border-top-left-radius 16
:padding-bottom 1})
(defn proposal-sheet-container []
{:background-color (:ui-background @colors/theme)
:width "100%"
:align-items :center
:padding-top 0
:padding-bottom 50
:border-top-right-radius 16
:border-top-left-radius 16})
(defn proposal-sheet-header []
{:flex-direction :row
:align-items :center
:justify-content :center
:height 56
:width "100%"
:border-color colors/gray-lighter
:border-bottom-width 1})
(def proposal-title-container
{:align-items :center
:margin-top 21})
(def message-title
{:margin-top 10
:margin-bottom 14
:margin-horizontal 72.5
:text-align :center})
(defn proposal-buttons-container []
{:width "100%"
:height 76
:border-color colors/gray-lighter
:border-top-width 1
:flex 1
:flex-direction :row
:justify-content :space-between
:align-items :center
:padding-horizontal 16})
(defn success-button-container []
{:width "100%"
:height 76
:border-color colors/gray-lighter
:border-top-width 1
:flex-direction :row
:justify-content :flex-end
:align-items :center
:padding-horizontal 16})
(defn account-container [color account-selected?]
{:height 34
:background-color color
:border-radius 17
:padding-horizontal 10
:justify-content :center
:margin-right 4
:opacity (if account-selected? 1 0.5)})
(def account-selector-container
{:height 80
:width "100%"
:justify-content :center
:padding-horizontal 16})
(def account-selector-wrapper
{:margin-top 40
:width "100%"})
(def account-selector-list
{:height 40
:width "100%"
:margin-top 10})
(def single-account-container
{:width "100%"
:align-items :center
:padding-top 8})
(defn blur-view []
{:position :absolute
:top 60
:left 0
:right 0
:bottom 0
:background-color (:blurred-bg @colors/theme)})
(def shadow
{:width "100%"
:height 50
:opacity 0.3})
(defn management-sheet-header []
{:width "100%"
:flex-direction :row
:padding 16
:align-items :center
:border-bottom-width 1
:border-bottom-color colors/gray-lighter})
(def management-icon
{:width 40
:height 40
:border-radius 20
:margin-right 16})
(def app-info-container
{:flex-direction :column
:flex 1})
@@ -0,0 +1,205 @@
(ns status-im.ui.screens.wallet-connect.session-proposal.views
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [re-frame.core :as re-frame]
[status-im.ui.components.react :as react]
[status-im.i18n.i18n :as i18n]
[status-im.utils.security]
[quo.design-system.colors :as colors]
[quo.core :as quo]
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.components.bottom-panel.views :as bottom-panel]
[status-im.ui.screens.wallet-connect.session-proposal.styles :as styles]
[status-im.ui.components.list.views :as list]
[reagent.core :as reagent]
[clojure.string :as string]
[quo.platform :as platform]))
(def chevron-icon-container-width 24)
(def chevron-icon-container-height 24)
(defn toolbar-selection [{:keys [text background-color on-press]}]
[react/touchable-opacity {:on-press on-press}
[react/view (styles/toolbar-container background-color)
[quo/text {:color :inverse
:weight :medium
:style styles/toolbar-text}
text]
[icons/icon
:main-icons/chevron-down
{:color (:text-05 @colors/theme)
:width chevron-icon-container-width
:height chevron-icon-container-height}]]])
(def show-account-selector? (reagent/atom false))
(defn render-account [{:keys [address name color] :as account} _ _ {:keys [selected-account on-select]}]
(let [account-selected? (= (:address @selected-account) address)]
[react/touchable-without-feedback {:on-press #(do
(reset! selected-account (merge {} account))
(when on-select (on-select)))}
[react/view (styles/account-container color account-selected?)
[quo/text {:color :inverse
:weight (if account-selected? :medium :regular)}
name]]]))
(defn account-selector [accounts selected-account-atom on-select]
[react/view styles/account-selector-container
[quo/text {:size :small} (i18n/label :t/select-account)]
[list/flat-list {:data accounts
:key-fn :address
:render-fn render-account
:render-data {:selected-account selected-account-atom
:on-select on-select}
:horizontal true
:shows-horizontal-scroll-indicator false
:extra-data @selected-account-atom
:style styles/account-selector-list}]])
(defn account-picker [accounts selected-account-atom {:keys [on-press on-select]}]
(if (> (count accounts) 1)
[react/view {:style styles/account-selector-wrapper}
[account-selector accounts selected-account-atom on-select]]
[react/touchable-opacity {:style styles/single-account-container}
[toolbar-selection {:text (:name @selected-account-atom)
:background-color (:color @selected-account-atom)
:on-press on-press}]]))
(defview success-sheet-view [{:keys [topic]}]
(letsubs [visible-accounts [:visible-accounts-without-watch-only]
dapps-account [:dapps-account]
sessions [:wallet-connect/sessions]
managed-session [:wallet-connect/session-managed]]
(let [{:keys [peer state] :as session} (first (filter #(= (:topic %) topic) sessions))
{:keys [accounts]} state
{:keys [metadata]} peer
{:keys [name icons]} metadata
icon-uri (when (and icons (> (count icons) 0)) (first icons))
address (last (string/split (first accounts) #":"))
account (first (filter #(= (:address %) address) visible-accounts))
selected-account-atom (reagent/atom account)]
[react/view (styles/proposal-sheet-container)
[react/view (styles/proposal-sheet-header)
[quo/text {:weight :bold
:size :large}
(i18n/label :t/connection-request)]]
[react/image {:style (styles/dapp-logo)
:source {:uri icon-uri}}]
[react/view styles/sheet-body-container
[react/view styles/proposal-title-container
[quo/text {:weight :bold
:size :large}
name]
[quo/text {:weight :regular
:size :large}
(i18n/label :t/connected)]]]
[account-picker
(vector dapps-account)
selected-account-atom
{:on-press #(do
(re-frame/dispatch [:wallet-connect/manage-app session])
(reset! show-account-selector? true))}]
[quo/text {:weight :regular
:color :secondary
:style styles/message-title}
(i18n/label :t/manage-connections)]
[react/view (styles/success-button-container)
[quo/button
{:theme :accent
:on-press #(do
(reset! show-account-selector? false)
(re-frame/dispatch [:hide-wallet-connect-success-sheet]))}
(i18n/label :t/close)]]
(when managed-session
(if platform/ios?
[react/blur-view {:style (styles/blur-view)
:blurAmount 2
:blurType (if (colors/dark?) :dark :light)}]
[react/view (styles/blur-view)]))])))
(defview app-management-sheet-view [{:keys [topic]}]
(letsubs [sessions [:wallet-connect/sessions]
visible-accounts [:visible-accounts-without-watch-only]]
(let [{:keys [peer state]} (first (filter #(= (:topic %) topic) sessions))
{:keys [accounts]} state
{:keys [metadata]} peer
{:keys [name icons url]} metadata
icon-uri (when (and icons (> (count icons) 0)) (first icons))
account-address (last (string/split (first accounts) #":"))
selected-account-atom (reagent/atom (first (filter #(= (:address %) account-address) visible-accounts)))]
[react/view {:style (merge (styles/acc-sheet) {:background-color "rgba(0,0,0,0)"})}
[react/linear-gradient {:colors ["rgba(0,0,0,0)" "rgba(0,0,0,0.3)"]
:start {:x 0 :y 0} :end {:x 0 :y 1}
:style styles/shadow}]
[react/view (styles/proposal-sheet-container)
[react/view (styles/management-sheet-header)
[react/image {:style styles/management-icon
:source {:uri icon-uri}}]
[react/view styles/app-info-container
[quo/text {:weight :medium} name]
[quo/text {:color :secondary
:number-of-lines 1
:elipsize-mode :tail} url]]
[quo/button
{:type :secondary
:theme :secondary
:on-press #(re-frame/dispatch [:wallet-connect/disconnect topic])}
(i18n/label :t/disconnect)]]
[account-selector
visible-accounts
selected-account-atom
#(re-frame/dispatch [:wallet-connect/change-session-account topic @selected-account-atom])]]])))
(defview session-proposal-sheet [{:keys [name icons]}]
(letsubs [visible-accounts [:visible-accounts-without-watch-only]
dapps-account [:dapps-account]]
(let [icon-uri (when (and icons (> (count icons) 0)) (first icons))
selected-account-atom (reagent/atom dapps-account)]
[react/view (styles/proposal-sheet-container)
[react/view (styles/proposal-sheet-header)
[quo/text {:weight :bold
:size :large}
(i18n/label :t/connection-request)]]
[react/image {:style (styles/dapp-logo)
:source {:uri icon-uri}}]
[react/view styles/sheet-body-container
[react/view styles/proposal-title-container
[quo/text {:weight :bold
:size :large}
(str name " ")]
[quo/text {:weight :regular
:size :large}
(i18n/label :t/wallet-connect-proposal-title)]]]
[account-picker visible-accounts selected-account-atom]
[react/view (merge (styles/proposal-buttons-container) (when (= (count visible-accounts) 1) {:margin-top 12}))
[quo/button
{:type :secondary
:on-press #(re-frame/dispatch [:wallet-connect/reject-proposal])}
(i18n/label :t/reject)]
[quo/button
{:theme :accent
:on-press #(re-frame/dispatch [:wallet-connect/approve-proposal @selected-account-atom])}
(i18n/label :t/connect)]]])))
(defview wallet-connect-proposal-sheet []
(letsubs [proposal-metadata [:wallet-connect/proposal-metadata]]
[bottom-panel/animated-bottom-panel
proposal-metadata
session-proposal-sheet
#(re-frame/dispatch [:hide-wallet-connect-sheet])]))
(defview wallet-connect-success-sheet-view []
(letsubs [session [:wallet-connect/session-connected]]
[bottom-panel/animated-bottom-panel
session
success-sheet-view
#(re-frame/dispatch [:hide-wallet-connect-success-sheet])]))
(defview wallet-connect-app-management-sheet-view []
(letsubs [session [:wallet-connect/session-managed]]
[bottom-panel/animated-bottom-panel
session
app-management-sheet-view
#(re-frame/dispatch [:hide-wallet-connect-app-management-sheet])
#(re-frame/dispatch [:hide-wallet-connect-app-management-sheet])
false]))
+9
View File
@@ -167,3 +167,12 @@
"giphy.com"
"gph.is"
"media.giphy.com"})
(def default-relay-provider "https://relay.walletconnect.com")
(def default-wallet-connect-metadata {:name "Status Wallet"
:description "Status is a secure messaging app, crypto wallet, and Web3 browser built with state of the art technology."
:url "#"
:icons ["https://statusnetwork.com/img/press-kit-status-logo.svg"]})
(def wallet-connect-project-id "87815d72a81d739d2a7ce15c2cfdefb3")
+9 -6
View File
@@ -1,13 +1,16 @@
(ns status-im.utils.theme
(:require ["react-native-dark-mode" :as react-native-dark-mode]
[oops.core :refer [oget ocall]]))
(:require ["react-native" :refer (Appearance)]
[oops.core :refer [ocall]]))
(def event-emitter (oget react-native-dark-mode "eventEmitter"))
(def initial-mode (atom (oget react-native-dark-mode "initialMode")))
(def initial-mode (atom (ocall Appearance "getColorScheme")))
;; Note - don't use value returned by change listener
;; https://github.com/facebook/react-native/issues/28525
(defn add-mode-change-listener [callback]
(ocall event-emitter "on" "currentModeChanged" #(do (reset! initial-mode %)
(callback (keyword %)))))
(ocall Appearance "addChangeListener" #(let [mode (ocall Appearance "getColorScheme")]
(when-not (= mode @initial-mode)
(reset! initial-mode mode)
(callback (keyword mode))))))
(defn is-dark-mode []
(= @initial-mode "dark"))
+28
View File
@@ -0,0 +1,28 @@
(ns status-im.utils.wallet-connect
(:require ["@walletconnect/client" :refer [CLIENT_EVENTS] :default WalletConnectClient]
["@react-native-community/async-storage" :default AsyncStorage]
[clojure.string :as string]
[status-im.utils.config :as config]))
(defn init [on-success on-error]
(-> ^js WalletConnectClient
(.init (clj->js {:controller true
:projectId config/wallet-connect-project-id
:logger "debug"
:metadata config/default-wallet-connect-metadata
:storageOptions {:asyncStorage ^js AsyncStorage}}))
(.then on-success)
(.catch on-error)))
(defn session-request-event [] (.-request (.-session CLIENT_EVENTS)))
(defn session-created-event [] (.-created (.-session CLIENT_EVENTS)))
(defn session-deleted-event [] (.-deleted (.-session CLIENT_EVENTS)))
(defn session-proposal-event [] (.-proposal (.-session CLIENT_EVENTS)))
(defn session-updated-event [] (.-updated (.-session CLIENT_EVENTS)))
(defn url? [url]
(string/starts-with? url "wc:"))
+273
View File
@@ -0,0 +1,273 @@
(ns status-im.wallet-connect.core
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.constants :as constants]
[status-im.ethereum.core :as ethereum]
[status-im.utils.fx :as fx]
[status-im.signing.core :as signing]
[status-im.utils.wallet-connect :as wallet-connect]
[status-im.browser.core :as browser]
[taoensso.timbre :as log]
[status-im.async-storage.core :as async-storage]
[status-im.utils.config :as config]
[status-im.utils.types :as types]))
(fx/defn switch-wallet-connect-enabled
{:events [:multiaccounts.ui/switch-wallet-connect-enabled]}
[{:keys [db]} enabled?]
(merge
{::async-storage/set! {:wallet-connect-enabled? enabled?}
:db (cond-> db
(not enabled?)
(dissoc :wallet-connect/client)
:always
(assoc :wallet-connect/enabled? enabled?))}
(when enabled? {:wc-2-init nil})))
(fx/defn proposal-handler
{:events [:wallet-connect/proposal]}
[{:keys [db] :as cofx} request-event]
(let [proposal (types/js->clj request-event)
proposer (:proposer proposal)
metadata (:metadata proposer)]
{:db (assoc db :wallet-connect/proposal proposal :wallet-connect/proposal-metadata metadata)
:show-wallet-connect-sheet nil}))
(fx/defn session-connected
{:events [:wallet-connect/created]}
[{:keys [db]} session]
(let [session (types/js->clj session)
client (get db :wallet-connect/client)]
(log/debug "[wallet connect] session created - " session)
{:show-wallet-connect-success-sheet nil
:db (assoc db :wallet-connect/session-connected session :wallet-connect/sessions (types/js->clj (.-values (.-session client))))}))
(fx/defn manage-app
{:events [:wallet-connect/manage-app]}
[{:keys [db]} session]
(let [session (types/js->clj session)]
{:db (assoc db :wallet-connect/session-managed session :wallet-connect/showing-app-management-sheet? true)
:show-wallet-connect-app-management-sheet nil}))
(fx/defn request-handler
{:events [:wallet-connect/request]}
[{:keys [db] :as cofx} request-event]
(let [request (types/js->clj request-event)
params (:request request)
pending-requests (or (:wallet-connect/pending-requests db) [])
new-pending-requests (conj pending-requests request)
client (get db :wallet-connect/client)
topic (:topic request)]
{:db (assoc db :wallet-connect/pending-requests new-pending-requests)
:dispatch [:wallet-connect/request-received request]}))
(fx/defn request-handler-test
{:events [:wallet-connect/request-test]}
[{:keys [db] :as cofx}]
{:show-wallet-connect-sheet nil})
(defn subscribe-to-events [wallet-connect-client]
(.on wallet-connect-client (wallet-connect/session-request-event) #(re-frame/dispatch [:wallet-connect/request %]))
(.on wallet-connect-client (wallet-connect/session-created-event) #(re-frame/dispatch [:wallet-connect/created %]))
(.on wallet-connect-client (wallet-connect/session-deleted-event) #(re-frame/dispatch [:wallet-connect/update-sessions]))
(.on wallet-connect-client (wallet-connect/session-updated-event) #(re-frame/dispatch [:wallet-connect/update-sessions]))
(.on wallet-connect-client (wallet-connect/session-proposal-event) #(re-frame/dispatch [:wallet-connect/proposal %])))
(re-frame/reg-fx
:wc-2-init
(fn []
(wallet-connect/init
#(re-frame/dispatch [:wallet-connect/client-init %])
#(log/error "[wallet-connect]" %))))
(re-frame/reg-fx
:wc-2-subscribe-to-events
(fn [client]
(subscribe-to-events client)))
(re-frame/reg-fx
:wc-2-client-approve-proposal
(fn [[client proposal response]]
(-> ^js client
(.approve (clj->js {:proposal proposal :response response}))
(.then #(log/debug "[wallet-connect] session proposal approved"))
(.catch #(log/error "[wallet-connect] session proposal approval error:" %)))))
(re-frame/reg-fx
:wc-2-client-reject-proposal
(fn [[client proposal]]
(-> ^js client
(.reject (clj->js {:proposal proposal}))
(.then #(log/debug "[wallet-connect] session proposal rejected"))
(.catch #(log/error "[wallet-connect] " %)))))
(re-frame/reg-fx
:wc-2-client-disconnect
(fn [[client topic]]
(-> ^js client
(.disconnect (clj->js {:topic topic}))
(.then #(log/debug "[wallet-connect] session disconnected - topic " topic))
(.catch #(log/error "[wallet-connect] " %)))))
(re-frame/reg-fx
:wc-2-change-session
(fn [[client topic accounts]]
(-> ^js client
(.update (clj->js {:topic topic
:state {:accounts accounts}}))
(.then #(log/debug "[wallet-connect] session topic " topic " changed to account " (first accounts)))
(.catch #(log/error "[wallet-connect] " %)))))
(re-frame/reg-fx
:wc-2-change-session
(fn [[client topic accounts]]
(-> ^js client
(.update (clj->js {:topic topic
:state {:accounts accounts}}))
(.then #(log/debug "[wallet-connect] session topic " topic " changed to account " (first accounts)))
(.catch #(log/error "[wallet-connect] " %)))))
(re-frame/reg-fx
:wc-2-pair
(fn [[client uri]]
(.pair client (clj->js {:uri uri}))))
(re-frame/reg-fx
:wc-2-respond
(fn [[client response]]
(.respond client (clj->js response))))
(fx/defn approve-proposal
{:events [:wallet-connect/approve-proposal]}
[{:keys [db]} account]
(let [client (get db :wallet-connect/client)
proposal (get db :wallet-connect/proposal)
topic (:topic proposal)
permissions (:permissions proposal)
blockchain (:blockchain permissions)
proposal-chain-ids (map #(last (string/split % #":")) (:chains blockchain))
available-chain-ids (map #(get-in % [:config :NetworkId]) (vals (get db :networks/networks)))
supported-chain-ids (filter (fn [chain-id] #(boolean (some #{chain-id} available-chain-ids))) proposal-chain-ids)
address (:address account)
accounts (map #(str "eip155:" % ":" (ethereum/normalized-hex address)) supported-chain-ids)
;; TODO: Check for unsupported
metadata (get db :wallet-connect/proposal-metadata)
response {:state {:accounts accounts}
:metadata config/default-wallet-connect-metadata}]
{:hide-wallet-connect-sheet nil
:wc-2-client-approve-proposal [client proposal response]}))
(fx/defn reject-proposal
{:events [:wallet-connect/reject-proposal]}
[{:keys [db]} account]
(let [client (get db :wallet-connect/client)
proposal (get db :wallet-connect/proposal)]
{:hide-wallet-connect-sheet nil
:wc-2-client-reject-proposal client}))
(fx/defn change-session-account
{:events [:wallet-connect/change-session-account]}
[{:keys [db]} topic account]
(let [client (get db :wallet-connect/client)
sessions (get db :wallet-connect/sessions)
session (first (filter #(= (:topic %) topic) sessions))
permissions (:permissions session)
blockchain (:blockchain permissions)
proposal-chain-ids (map #(last (string/split % #":")) (:chains blockchain))
address (:address account)
available-chain-ids (map #(get-in % [:config :NetworkId]) (vals (get db :networks/networks)))
supported-chain-ids (filter (fn [chain-id] #(boolean (some #{chain-id} available-chain-ids))) proposal-chain-ids)
accounts (map #(str "eip155:" % ":" (ethereum/normalized-hex address)) supported-chain-ids)]
{:db (assoc db :wallet-connect/showing-app-management-sheet? false)
:hide-wallet-connect-app-management-sheet nil
:wc-2-change-session [client topic accounts]}))
(fx/defn disconnect-session
{:events [:wallet-connect/disconnect]}
[{:keys [db]} topic]
(let [client (get db :wallet-connect/client)]
{:hide-wallet-connect-app-management-sheet nil
:hide-wallet-connect-success-sheet nil
:wc-2-client-disconnect [client topic]
:db (-> db
(assoc :wallet-connect/sessions (types/js->clj (.-values (.-session client))))
(dissoc :wallet-connect/session-managed))}))
(fx/defn pair-session
{:events [:wallet-connect/pair]}
[{:keys [db]} {:keys [data]}]
(let [client (get db :wallet-connect/client)
wallet-connect-enabled? (get db :wallet-connect/enabled?)]
(merge
{:dispatch [:navigate-back]}
(when wallet-connect-enabled?
{:db (assoc db :wallet-connect/scanned-uri data)
:wc-2-pair [client data]}))))
(fx/defn wallet-connect-client-initate
{:events [:wallet-connect/client-init]}
[{:keys [db] :as cofx} client]
{:db (assoc db :wallet-connect/client client :wallet-connect/sessions (types/js->clj (.-values (.-session client))))
:wc-2-subscribe-to-events client})
(fx/defn update-sessions
{:events [:wallet-connect/update-sessions]}
[{:keys [db] :as cofx}]
(let [client (get db :wallet-connect/client)]
{:db (-> db
(assoc :wallet-connect/sessions (types/js->clj (.-values (.-session client))))
(dissoc :wallet-connect/session-managed))}))
(fx/defn wallet-connect-complete-transaction
{:events [:wallet-connect.dapp/transaction-on-result]}
[{:keys [db]} message-id topic result]
(let [client (get db :wallet-connect/client)
response {:topic topic
:response {:jsonrpc "2.0"
:id message-id
:result result}}]
{:db (assoc db :wallet-connect/response response)
:wc-2-respond [client response]}))
(fx/defn wallet-connect-send-async
[cofx {:keys [method params id] :as payload} message-id topic]
(let [message? (browser/web3-sign-message? method)
dapps-address (get-in cofx [:db :multiaccount :dapps-address])
accounts (get-in cofx [:db :multiaccount/visible-accounts])
typed? (and (not= constants/web3-personal-sign method) (not= constants/web3-eth-sign method))]
(if (or message? (= constants/web3-send-transaction method))
(let [[address data] (cond (and (= method constants/web3-keycard-sign-typed-data)
(not (vector? params)))
;; We don't use signer argument for keycard sign-typed-data
["0x0" params]
message? (browser/normalize-sign-message-params params typed?)
:else [nil nil])]
(when (or (not message?) (and address data))
(signing/sign cofx (merge
(if message?
{:message {:address address
:data data
:v4 (= constants/web3-sign-typed-data-v4 method)
:typed? typed?
:pinless? (= method constants/web3-keycard-sign-typed-data)
:from address}}
{:tx-obj (-> params
first
(update :from #(or % dapps-address))
(dissoc :gasPrice))})
{:on-result [:wallet-connect.dapp/transaction-on-result message-id topic]
:on-error [:wallet-connect.dapp/transaction-on-error message-id topic]}))))
(when (#{"eth_accounts" "eth_coinbase"} method)
(wallet-connect-complete-transaction cofx message-id topic (if (= method "eth_coinbase") dapps-address [dapps-address]))))))
(fx/defn wallet-connect-send-async-read-only
[{:keys [db] :as cofx} {:keys [method] :as payload} message-id topic]
(wallet-connect-send-async cofx payload message-id topic))
(fx/defn process-request
{:events [:wallet-connect/request-received]}
[{:keys [db] :as cofx} session-request]
(let [pending-requests (get db :wallet-connect/pending-requests)
{:keys [topic request]} session-request
{:keys [id]} request]
(wallet-connect-send-async-read-only cofx request id topic)))
+3 -3
View File
@@ -3,7 +3,7 @@
"_comment": "Instead use: scripts/update-status-go.sh <rev>",
"owner": "status-im",
"repo": "status-go",
"version": "v0.94.7",
"commit-sha1": "b559c561d80a3b8b131b81d82e2bfda3ae387824",
"src-sha256": "0ak0zb3bq3jwlrvqcvf8fycdxvgls61qi2bmp8xi81952andk27w"
"version": "v0.94.10",
"commit-sha1": "598b83757cc8b27e3374e50de02187eacf0d4280",
"src-sha256": "0ncywjmpng7zdx707j45yxzj0m06c24mi0lgk3d2yzbp7gx3cygz"
}
+23
View File
@@ -0,0 +1,23 @@
# E2E tests requirements
### Environment variables
- WEB3_INFURA_PROJECT_ID
- ETHERSCAN_API_KEY
1) If running on SauceLab emulators:
- SAUCE_USERNAME
- SAUCE_ACCESS_KEY
2) If running with Testrail (`--testrail_report=True` param):
- TESTRAIL_PASS
- TESTRAIL_USER
## Other
Userdata is stored in `tests.users` module (`test/appium/tests/users.py`, which is not committed to repo).
So to launch e2e you need to copy `users.py` to `test/appium/tests/` to prevent `ImportError`
If you are external contributor, you can contact us at [error-reports@status.im](mailto:error-reports@status.im) to get `users.py`
More info on local setup for e2e can be found [here](https://notes.status.im/setup-e2e)
+4 -4
View File
@@ -10,8 +10,8 @@ from os import environ
import tests
import support.api.web3_api as w3
class NetworkApi(object):
class NetworkApi(object):
def __init__(self):
self.network_url = 'http://api-ropsten.etherscan.io/api?'
@@ -148,9 +148,9 @@ class NetworkApi(object):
pass
def faucet_backup(self, address):
self.log("Trying to get funds from %s" % self.faucet_backup_address)
address = "0x" + address
w3.donate_testnet_eth(address=address, amount=0.005, inscrease_default_gas_price=10)
self.log("Trying to get funds from %s" % self.faucet_backup_address)
address = "0x" + address
w3.donate_testnet_eth(address=address, amount=0.005, inscrease_default_gas_price=10)
def get_donate(self, address, external_faucet=False, wait_time=300):
initial_balance = self.get_balance(address)
+1 -1
View File
@@ -102,7 +102,7 @@ class BaseTestReport:
@staticmethod
def get_jenkins_link_to_rerun_e2e(branch_name="develop", pr_id="", apk_name="", tr_case_ids=""):
return 'https://ci.status.im/job/end-to-end-tests/job/status-app-prs-rerun/parambuild/' \
return 'https://ci.status.im/job/status-react/job/e2e/job/status-app-prs-rerun/parambuild/' \
'?BRANCH_NAME=%s&APK_NAME=%s&PR_ID=%s&TR_CASE_IDS=%s' % (branch_name, apk_name, pr_id, tr_case_ids)
def get_sauce_final_screenshot_url(self, job_id):
+2
View File
@@ -100,6 +100,7 @@ class TestrailReport(BaseTestReport):
test_cases['critical'] = 730
test_cases['medium'] = 736
test_cases['upgrade'] = 881
## tests pr
test_cases['public_chat'] = 50654
test_cases['one_to_one_chat'] = 50655
test_cases['group_chat'] = 50656
@@ -108,6 +109,7 @@ class TestrailReport(BaseTestReport):
test_cases['wallet'] = 50661
test_cases['send_tx'] = 50662
test_cases['keycard_tx'] = 50663
test_cases['browser'] = 50812
test_pr = list()
for key in test_cases:
if key != 'medium' and key != 'upgrade':
@@ -9,6 +9,7 @@ from tests.users import basic_user, transaction_senders, recovery_users
@pytest.mark.xdist_group(name="onboarding_1")
@marks.critical
class TestOnboardingOneDeviceMerged(MultipleSharedDeviceTestCase):
@classmethod
@@ -24,7 +25,6 @@ class TestOnboardingOneDeviceMerged(MultipleSharedDeviceTestCase):
cls.username = cls.profile.default_username_text.text
@marks.testrail_id(700742)
@marks.critical
def test_onboarding_home_initial_popup(self):
self.home.home_button.double_click()
texts = ["chat-and-transact", "invite-friends"]
@@ -39,7 +39,6 @@ class TestOnboardingOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700743)
@marks.critical
def test_onboarding_share_contact_address(self):
self.profile = self.home.profile_button.click()
@@ -68,7 +67,6 @@ class TestOnboardingOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700744)
@marks.critical
def test_onboarding_share_wallet_address(self):
self.home.just_fyi("Copying wallet address")
wallet = self.home.wallet_button.click()
@@ -96,7 +94,6 @@ class TestOnboardingOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700745)
@marks.critical
def test_onboarding_backup_seed_phrase_restore_same_login_logcat(self):
self.home.just_fyi("Check that badge on profile about back up seed phrase is presented")
if self.home.profile_button.counter.text != '1':
@@ -144,7 +141,6 @@ class TestOnboardingOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700746)
@marks.critical
def test_onboarding_cant_sign_in_with_invalid_password_logcat(self):
self.home.profile_button.click()
self.profile.logout()
@@ -168,7 +164,6 @@ class TestOnboardingOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700747)
@marks.critical
def test_onboarding_add_new_multiaccount_username_by_position_pass_validation(self):
self.home.profile_button.click()
self.profile.logout()
@@ -227,8 +222,9 @@ class TestOnboardingOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@pytest.mark.xdist_group(name="recover_1")
class TestRecoverOneDeviceMerged(MultipleSharedDeviceTestCase):
@pytest.mark.xdist_group(name="restore_1")
@marks.critical
class TestRestoreOneDeviceMerged(MultipleSharedDeviceTestCase):
@classmethod
def setup_class(cls):
cls.user = transaction_senders['A']
@@ -240,8 +236,7 @@ class TestRecoverOneDeviceMerged(MultipleSharedDeviceTestCase):
cls.home = cls.sign_in.recover_access(passphrase=cls.passphrase, password=cls.password)
@marks.testrail_id(700748)
@marks.critical
def test_recover_uppercase_whitespaces_seed_phrase_special_char_passw_logcat(self):
def test_restore_uppercase_whitespaces_seed_phrase_special_char_passw_logcat(self):
profile = self.home.profile_button.click()
public_key, username = self.sign_in.get_public_key_and_username(return_username=True)
@@ -258,8 +253,7 @@ class TestRecoverOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700749)
@marks.critical
def test_recover_set_up_wallet_sign_phrase(self):
def test_restore_set_up_wallet_sign_phrase(self):
wallet = self.sign_in.wallet_button.click()
wallet.just_fyi("Initiating some transaction so the wallet signing phrase pop-up appears")
@@ -308,8 +302,7 @@ class TestRecoverOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700750)
@marks.critical
def test_recover_validation_seed_phrase_field(self):
def test_restore_validation_seed_phrase_field(self):
validations = [
{
'case': 'empty value',
@@ -10,7 +10,8 @@ class TestCreateAccount(SingleDeviceTestCase):
@marks.critical
def test_restore_account_migrate_multiaccount_to_keycard(self):
sign_in = SignInView(self.driver)
seed = basic_user['passphrase']
user = transaction_senders['ETH_ADI_STT_2']
seed = user['passphrase']
home = sign_in.recover_access(passphrase=seed)
profile = home.profile_button.click()
profile.privacy_and_security_button.click()
@@ -29,7 +30,7 @@ class TestCreateAccount(SingleDeviceTestCase):
self.errors.append("Get a keycard banner is not shown on login screen for ordinary multiaccount")
sign_in.options_button.click()
sign_in.manage_keys_and_storage_button.click()
if not sign_in.element_by_text(basic_user['username']).is_element_displayed():
if not sign_in.element_by_text(user['username']).is_element_displayed():
self.driver.fail("Default username is not shown when migrating multiaccount to keycard!")
home.just_fyi("Checking validation of seed phrase during migration")
@@ -78,15 +79,15 @@ class TestCreateAccount(SingleDeviceTestCase):
sign_in.just_fyi('Check that after migration wallet address matches expected')
address = wallet.get_wallet_address()
if address != '0x%s' % basic_user['address']:
if address != '0x%s' % user['address']:
self.errors.append('Restored address %s does not match expected' % address)
sign_in.just_fyi('Check that after migration username and public key match expected')
public_key, default_username = sign_in.get_public_key_and_username(return_username=True)
profile = sign_in.get_profile_view()
if public_key != basic_user['public_key']:
if public_key != user['public_key']:
self.errors.append('Public key %s does not match expected' % public_key)
if default_username != basic_user['username']:
if default_username != user['username']:
self.errors.append('Default username %s does not match expected' % default_username)
profile.logout()
@@ -97,14 +98,14 @@ class TestCreateAccount(SingleDeviceTestCase):
self.errors.append("Get a keycard banner is shown on migrated keycard multiaccount")
keycard.one_button.wait_for_visibility_of_element(10)
keycard.enter_default_pin()
if not sign_in.home_button.is_element_displayed(10):
if not sign_in.home_button.is_element_displayed(30):
self.driver.fail('Keycard user is not logged in')
sign_in.just_fyi('Check that can add another wallet account and send transaction')
home.wallet_button.click()
wallet.add_account(account_name="another_keycard_account", keycard=True)
transaction_amount_added = wallet.get_unique_amount()
wallet.send_transaction(amount=transaction_amount_added, recipient=transaction_senders['B']['address'],
wallet.send_transaction(amount=transaction_amount_added, recipient=transaction_senders['ETH_8']['address'],
keycard=True, sign_transaction=True)
self.driver.reset()
home = sign_in.recover_access(passphrase=seed)
@@ -303,12 +304,14 @@ class TestCreateAccount(SingleDeviceTestCase):
@marks.testrail_id(6311)
@marks.medium
@marks.transaction
def test_same_seed_added_inside_multiaccount_and_keycard(self):
sign_in = SignInView(self.driver)
recipient = "0x" + transaction_senders['G']['address']
recipient = "0x" + transaction_senders['ETH_7']['address']
user = transaction_senders['ETH_ADI_STT_3']
sign_in.just_fyi('Restore keycard multiaccount and logout')
sign_in.recover_access(passphrase=basic_user['passphrase'], keycard=True)
sign_in.recover_access(passphrase=user['passphrase'], keycard=True)
profile_view = sign_in.profile_button.click()
profile_view.logout()
@@ -332,7 +335,7 @@ class TestCreateAccount(SingleDeviceTestCase):
wallet.enter_your_password_input.send_keys(common_password)
account_name = 'subacc'
wallet.account_name_input.send_keys(account_name)
wallet.enter_seed_phrase_input.set_value(basic_user['passphrase'])
wallet.enter_seed_phrase_input.set_value(user['passphrase'])
wallet.add_account_generate_account_button.click()
wallet.get_account_by_name(account_name).click()
@@ -352,9 +355,9 @@ class TestCreateAccount(SingleDeviceTestCase):
wallet.send_transaction(amount=transaction_amount_keycard, recipient=recipient, keycard=True,
sign_transaction=True)
sign_in.just_fyi('Check both transactions from keycard multiaccount and from added account in network')
for amount in [transaction_amount_keycard, transaction_amount_added]:
self.network_api.find_transaction_by_unique_amount(basic_user['address'], amount)
sign_in.just_fyi("Checking '%s' tx" % amount)
self.network_api.find_transaction_by_unique_amount(user['address'], amount)
self.errors.verify_no_errors()
@@ -585,74 +588,3 @@ class TestCreateAccount(SingleDeviceTestCase):
self.errors.verify_no_errors()
class TestKeycardCreateMultiaccountMultipleDevice(MultipleDeviceTestCase):
@marks.testrail_id(5689)
@marks.critical
def test_keycard_create_login_restore_unlock_same_seed(self):
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
device_1.just_fyi("Create keycard account and save seed phrase")
device_1.accept_tos_checkbox.enable()
device_1.get_started_button.click()
device_1.generate_key_button.click_until_presence_of_element(device_1.next_button)
device_1.next_button.click_until_absense_of_element(device_1.element_by_translation_id("intro-wizard-title2"))
keycard_flow = device_1.keycard_storage_button.click()
keycard_flow.confirm_pin_and_proceed()
seed_phrase = keycard_flow.backup_seed_phrase()
device_1.maybe_later_button.wait_for_visibility_of_element(30)
device_1.maybe_later_button.click_until_presence_of_element(device_1.lets_go_button)
device_1.lets_go_button.click_until_absense_of_element(device_1.lets_go_button)
device_1.profile_button.wait_for_visibility_of_element(30)
device_2.just_fyi("Restore same multiaccount from seed phrase on another device")
device_2.recover_access(seed_phrase)
device_1.just_fyi('Check that after creating keycard account balance is 0, not ...')
wallet_1 = device_1.wallet_button.click()
wallet_address = wallet_1.get_wallet_address()
wallet_1.wallet_button.double_click()
if wallet_1.status_account_total_usd_value.text != '0':
self.errors.append("Account USD value is not 0, it is %s" % wallet_1.status_account_total_usd_value.text)
public_key, default_username = device_1.get_public_key_and_username(return_username=True)
profile_1 = device_1.get_profile_view()
profile_1.logout()
profile_1.just_fyi('Check that can login with keycard account')
device_1.multi_account_on_login_button.wait_for_visibility_of_element(5)
device_1.multi_account_on_login_button.click()
if not keycard_flow.element_by_text_part(default_username).is_element_displayed():
self.errors.append("%s is not found on keycard login screen!" % default_username)
keycard_flow.enter_default_pin()
if not device_1.home_button.is_element_displayed(10):
self.errors.append('Keycard user is not logged in')
device_2.just_fyi("Check username and wallet address on another device")
wallet_2 = device_2.wallet_button.click()
wallet_address_2 = wallet_2.get_wallet_address()
wallet_2.wallet_button.double_click()
if wallet_address != wallet_address_2:
self.errors.append('Wallet address on restored multiaccount is not equal to created keycard multiaccount')
public_key_2, default_username_2 = device_2.get_public_key_and_username(return_username=True)
if public_key != public_key_2:
self.errors.append('Public key on restored multiaccount is not equal to created keycard multiaccount')
if default_username_2 != default_username:
self.errors.append('Username on restored multiaccount is not equal to created keycard multiaccount')
device_1.just_fyi('Unlock keycard multiaccount at attempt to restore same multiaccount from seed')
device_1.profile_button.click()
profile_1.logout()
device_1.access_key_button.click()
device_1.enter_seed_phrase_button.click()
device_1.seedphrase_input.click()
device_1.seedphrase_input.set_value(seed_phrase)
device_1.next_button.click()
device_1.element_by_translation_id("unlock", uppercase=True).click()
keycard_flow.enter_default_pin()
device_1_home = device_1.home_button.click()
device_1_home.plus_button.click()
if not device_1_home.start_new_chat_button.is_element_displayed():
self.errors.append("Can't proceed using account after it's re-recover twice.")
self.errors.verify_no_errors()
@@ -80,7 +80,7 @@ class TestProfileSingleDevice(SingleDeviceTestCase):
from views.send_transaction_view import SendTransactionView
send_tx = SendTransactionView(self.driver)
send_tx.amount_edit_box.set_value('0')
send_tx.set_recipient_address(ens_user['address'])
send_tx.set_recipient_address(transaction_senders['ETH_7']['address'])
send_tx.next_button.click()
send_tx.set_up_wallet_when_sending_tx()
send_tx.advanced_button.click()
@@ -391,40 +391,6 @@ class TestProfileSingleDevice(SingleDeviceTestCase):
self.errors.append("Support channel is not suggested for requesting a feature")
self.errors.verify_no_errors()
@marks.testrail_id(5738)
@marks.high
def test_dapps_permissions(self):
home = SignInView(self.driver).create_user()
account_name = home.status_account_name
home.just_fyi('open Status Test Dapp, allow all and check permissions in Profile')
web_view = home.open_status_test_dapp()
dapp = home.dapp_tab_button.click()
profile = home.profile_button.click()
profile.privacy_and_security_button.click()
profile.dapp_permissions_button.click()
profile.element_by_text(test_dapp_name).click()
if not profile.element_by_text(account_name).is_element_displayed():
self.errors.append('Wallet permission was not granted')
if not profile.element_by_translation_id("chat-key").is_element_displayed():
self.errors.append('Contact code permission was not granted')
profile.just_fyi('revoke access and check that they are asked second time')
profile.revoke_access_button.click()
profile.back_button.click()
profile.dapp_tab_button.click()
web_view.open_tabs_button.click()
web_view.empty_tab_button.click()
dapp.open_url(test_dapp_url)
if not dapp.element_by_text_part(account_name).is_element_displayed():
self.errors.append('Wallet permission is not asked')
if dapp.allow_button.is_element_displayed():
dapp.allow_button.click(times_to_click=1)
if not dapp.element_by_translation_id("your-contact-code").is_element_displayed():
self.errors.append('Profile permission is not asked')
self.errors.verify_no_errors()
@marks.testrail_id(5368)
@marks.medium
@@ -585,11 +551,9 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase):
@marks.testrail_id(6636)
@marks.medium
@marks.flaky
def test_show_profile_picture_of_setting_online_indicator(self):
self.create_drivers(2)
home_1, home_2 = SignInView(self.drivers[0]).create_user(), SignInView(self.drivers[1]).create_user(
enable_notifications=True)
home_1, home_2 = SignInView(self.drivers[0]).create_user(), SignInView(self.drivers[1]).create_user(enable_notifications=True)
profile_1, profile_2 = home_1.profile_button.click(), home_2.profile_button.click()
public_key_1, default_username_1 = profile_1.get_public_key_and_username(return_username=True)
public_key_2, default_username_2 = profile_2.get_public_key_and_username(return_username=True)
@@ -621,6 +585,7 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase):
profile_1.just_fyi('Check profile image is in mentions because now user was added in contacts')
one_to_one_chat_2.add_to_contacts.click()
one_to_one_chat_2.send_message("hey")
one_to_one_chat_2.chat_message_input.set_value('@' + default_username_1)
one_to_one_chat_2.chat_message_input.click()
if not one_to_one_chat_2.user_profile_image_in_mentions_list(
@@ -628,12 +593,17 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase):
self.errors.append('Profile picture was not updated in 1-1 chat mentions list')
one_to_one_chat_2.get_back_to_home_view()
profile_1.just_fyi('Send message to user to move it to online state')
profile_1.home_button.double_click()
one_to_one_chat_1 = home_1.get_chat(default_username_2).click()
one_to_one_chat_1.send_message('hey')
profile_1.just_fyi('Check profile image is updated in Group chat view')
profile_2 = one_to_one_chat_2.profile_button.click()
profile_2.contacts_button.click()
profile_2.element_by_text(default_username_1).click()
profile_2.online_indicator.wait_for_visibility_of_element(180)
if not profile_2.profile_picture.is_element_image_similar_to_template(logo_online):
if not profile_2.profile_picture.is_element_image_similar_to_template('new_profile_online.png'):
self.errors.append('Profile picture was not updated on user Profile view')
profile_2.close_button.click()
[home.home_button.click() for home in (profile_2, home_1)]
@@ -648,8 +618,7 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase):
group_chat_1 = home_1.get_chat(group_chat_name).click()
group_chat_1.join_chat_button.click()
group_chat_1.send_message(group_chat_message)
if not group_chat_2.chat_element_by_text(group_chat_message).member_photo.is_element_image_similar_to_template(
logo_default):
if not group_chat_2.chat_element_by_text(group_chat_message).member_photo.is_element_image_similar_to_template(logo_default):
self.errors.append('User profile picture was not updated in message Group chat view')
home_2.put_app_to_background()
@@ -10,6 +10,7 @@ from support.utilities import get_merged_txs_list
@pytest.mark.xdist_group(name="wallet_management_1")
@marks.critical
class TestWalletManagementDeviceMerged(MultipleSharedDeviceTestCase):
@classmethod
@@ -27,7 +28,6 @@ class TestWalletManagementDeviceMerged(MultipleSharedDeviceTestCase):
'STT': cls.wallet.get_asset_amount_by_name('STT')}
@marks.testrail_id(700756)
@marks.critical
def test_wallet_tx_history_copy_tx_hash_on_lte(self):
self.wallet.accounts_status_account.click()
address = wallet_users['D']['address']
@@ -79,7 +79,6 @@ class TestWalletManagementDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700759)
@marks.critical
def test_wallet_add_account_generate_new(self):
self.wallet.just_fyi("Switching off LTE mode and navigating to home view")
self.wallet.driver.set_network_connection(6)
@@ -117,7 +116,6 @@ class TestWalletManagementDeviceMerged(MultipleSharedDeviceTestCase):
self.drivers[0].fail('Delete account option is shown on added account "On Status Tree"!')
@marks.testrail_id(700758)
@marks.critical
def test_wallet_manage_assets(self):
asset = "HND"
self.sign_in.just_fyi("Getting back to main wallet view")
@@ -146,7 +144,6 @@ class TestWalletManagementDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700760)
@marks.critical
def test_wallet_add_delete_watch_only_account(self):
self.wallet.get_back_to_home_view()
self.wallet.accounts_status_account.swipe_left_on_element()
@@ -195,7 +192,6 @@ class TestWalletManagementDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700761)
@marks.critical
def test_wallet_add_hide_unhide_account_private_key(self):
self.wallet.get_back_to_home_view()
if not self.wallet.add_account_button.is_element_displayed(3):
@@ -256,7 +252,6 @@ class TestWalletManagementDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700762)
@marks.critical
@marks.skip
# TODO: skipped due to #13016
def test_wallet_add_account_seed_phrase_collectibles_mainnet_rinkeby(self):
@@ -303,6 +298,7 @@ class TestWalletManagementDeviceMerged(MultipleSharedDeviceTestCase):
self.wallet.accounts_status_account.swipe_left_on_element()
account_button.click()
self.wallet.collectibles_button.click()
self.wallet.element_by_translation_id("display-collectibles").scroll_and_click()
collectible_amount = self.wallet.get_collectibles_amount()
collectible_amount.wait_for_visibility_of_element(30)
if collectible_amount.text != '1':
@@ -364,7 +360,6 @@ class TestWalletManagementDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700766)
@marks.high
def test_wallet_fetching_balance_after_offline_insufficient_funds_errors(self):
self.sign_in.driver.reset()
sender = wallet_users['E']
@@ -11,7 +11,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase):
@marks.critical
@marks.transaction
def test_send_eth_in_1_1_chat_transaction_push(self):
sender = transaction_senders['B']
sender = transaction_senders['ETH_7']
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
home_1 = device_1.recover_access(passphrase=sender['passphrase'], enable_notifications=True)
@@ -99,7 +99,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase):
@marks.critical
@marks.transaction
def test_request_and_receive_stt_in_1_1_chat_offline(self):
sender = transaction_senders['L']
sender = transaction_senders['ETH_STT_3']
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
asset_name = 'STT'
@@ -171,7 +171,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase):
@marks.critical
@marks.transaction
def test_decline_transactions_in_1_1_chat_push_notification_changing_state(self):
sender = transaction_senders['B']
sender = transaction_senders['ETH_8']
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
home_1 = device_1.recover_access(passphrase=sender['passphrase'], enable_notifications=True)
@@ -222,7 +222,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase):
@marks.medium
@marks.transaction
def test_network_mismatch_for_send_request_in_1_1_chat(self):
sender = transaction_senders['D']
sender = transaction_senders['ETH_1']
self.create_drivers(2)
sign_in_1, sign_in_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
sign_in_1.recover_access(passphrase=sender['passphrase'])
@@ -273,7 +273,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase):
def test_send_eth_to_ens_in_chat(self):
self.create_drivers(2)
sign_in_1, sign_in_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
sender, reciever = transaction_senders['E'], ens_user
sender, reciever = transaction_senders['ETH_3'], ens_user
home_1, home_2 = sign_in_1.recover_access(sender['passphrase']), sign_in_2.recover_access(
reciever['passphrase'])
@@ -1,11 +1,9 @@
from tests import marks
from tests.base_test_case import MultipleDeviceTestCase, SingleDeviceTestCase, MultipleSharedDeviceTestCase, create_shared_drivers
from tests.users import transaction_senders, ens_user
from tests.users import transaction_senders, ens_user, chat_users
from views.sign_in_view import SignInView
from views.chat_view import ChatView
import random
import emoji
import pytest
class TestGroupChatMultipleDevice(MultipleDeviceTestCase):
@@ -253,21 +251,41 @@ class TestCommandsSingleDevices(SingleDeviceTestCase):
def test_cant_add_more_twenty_participants_to_group_chat(self):
sign_in = SignInView(self.driver)
home = sign_in.create_user()
users = [transaction_senders['A'], transaction_senders['B'], transaction_senders['C'], transaction_senders['D'],
transaction_senders['E'], transaction_senders['F'], transaction_senders['G'], transaction_senders['H'],
transaction_senders['I'], transaction_senders['K'], transaction_senders['L'], transaction_senders['M'],
transaction_senders['N'], transaction_senders['O'], transaction_senders['P'], transaction_senders['Q'],
transaction_senders['R'], transaction_senders['S'], transaction_senders['T'], transaction_senders['U'],
]
users = [chat_users['A'],
chat_users['B'],
transaction_senders['ETH_8'],
transaction_senders['ETH_1'],
transaction_senders['ETH_2'],
transaction_senders['ETH_7'],
transaction_senders['ETH_STT_3'],
transaction_senders['ETH_STT_ADI_1'],
transaction_senders['C'],
transaction_senders['F'],
transaction_senders['G'],
transaction_senders['H'],
transaction_senders['I'],
transaction_senders['M'],
transaction_senders['N'],
transaction_senders['Q'],
transaction_senders['R'],
transaction_senders['S'],
transaction_senders['T'],
transaction_senders['U']]
usernames = []
home.just_fyi('Add 20 users to contacts')
profile = home.profile_button.click()
profile.contacts_button.click()
chat = home.get_chat_view()
for user in users:
home.add_contact(user['public_key'])
profile.add_new_contact_button.click()
chat.public_key_edit_box.click()
chat.public_key_edit_box.set_value(user['public_key'])
chat.confirm_until_presence_of_element(profile.add_new_contact_button)
usernames.append(user['username'])
home.get_back_to_home_view()
home.just_fyi('Create group chat with max amount of users')
profile.home_button.click()
chat = home.create_group_chat(usernames, 'some_group_chat')
home.just_fyi('Verify that can not add more users via group info')
@@ -12,7 +12,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase):
@marks.critical
@marks.transaction
def test_keycard_send_eth_in_1_1_chat(self):
sender = transaction_senders['E']
sender = transaction_senders['ETH_2']
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
home_1 = device_1.recover_access(passphrase=sender['passphrase'], keycard=True)
@@ -82,7 +82,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase):
@marks.medium
@marks.transaction
def test_keycard_request_and_receive_stt_in_1_1_chat_offline_opened_from_push(self):
sender = transaction_senders['D']
sender = transaction_senders['ETH_STT_1']
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
@@ -166,7 +166,7 @@ class TestCommandsSingleDevices(SingleDeviceTestCase):
@marks.transaction
def test_keycard_send_eth_to_ens(self):
sign_in = SignInView(self.driver)
sender = transaction_senders['E']
sender = transaction_senders['ETH_4']
home = sign_in.recover_access(sender['passphrase'], keycard=True)
wallet = home.wallet_button.click()
wallet.home_button.click()
@@ -1002,7 +1002,7 @@ class TestMessagesOneToOneChatSingle(SingleDeviceTestCase):
@marks.testrail_id(6322)
@marks.medium
def test_can_scan_different_links_with_universal_qr_scanner(self):
user = transaction_senders['L']
user = transaction_senders['ETH_STT_3']
home = SignInView(self.driver).recover_access(user['passphrase'])
wallet = home.wallet_button.click()
wallet.home_button.click()
@@ -4,7 +4,6 @@ from views.sign_in_view import SignInView
class TestBrowsing(SingleDeviceTestCase):
@marks.testrail_id(5395)
@marks.medium
def test_back_forward_refresh_navigation_history_kept_after_relogin(self):
@@ -39,7 +38,7 @@ class TestBrowsing(SingleDeviceTestCase):
element_on_start_page = dapp.element_by_text('Select a token')
web_page = dapp.open_url(url)
dapp.allow_button.click()
element_on_start_page.click()
element_on_start_page.scroll_and_click()
# when bottom sheet is opened, elements by text couldn't be found
element_on_start_page.wait_for_invisibility_of_element(20)
@@ -48,142 +47,6 @@ class TestBrowsing(SingleDeviceTestCase):
if not element_on_start_page.is_element_displayed(30):
self.driver.fail("Page failed to be refreshed")
@marks.testrail_id(6210)
@marks.high
def test_open_blocked_secure_not_secure_inlalid_offline_urls(self):
home = SignInView(self.driver).create_user()
dapp = home.dapp_tab_button.click()
for url in ('metamask.site', 'cryptokitties.domainname'):
dapp.just_fyi('Checking blocked website %s' % url)
dapp_detail = dapp.open_url(url)
dapp_detail.element_by_translation_id('browsing-site-blocked-title')
if dapp_detail.browser_refresh_page_button.is_element_displayed():
self.errors.append("Refresh button is present in blocked site")
dapp_detail.go_back_button.click()
dapp_detail.open_tabs_button.click()
dapp.element_by_text_part(url[:8]).click()
dapp_detail.continue_anyway_button.click()
if dapp_detail.element_by_text('This site is blocked').is_element_displayed():
self.errors.append("Failed to open Dapp after 'Continue anyway' tapped for %s" % url)
dapp_detail.open_tabs_button.click()
dapp_detail.empty_tab_button.click()
dapp.just_fyi('Checking connection is not secure warning')
web_page = dapp.open_url('http://www.dvwa.co.uk')
web_page.url_edit_box_lock_icon.click_until_presence_of_element(
web_page.element_by_translation_id("browser-not-secure"))
dapp_detail.open_tabs_button.click()
dapp_detail.empty_tab_button.click()
for url in ('https://www.bbc.com', 'https://instant.airswap.io'):
dapp.just_fyi('Checking connection is secure for %s' % url)
web_page = dapp.open_url(url)
web_page.wait_for_d_aap_to_load()
web_page.url_edit_box_lock_icon.click_until_presence_of_element(
web_page.element_by_translation_id("browser-secure"))
dapp_detail.open_tabs_button.click()
dapp_detail.empty_tab_button.click()
dapp.just_fyi('Checking opening invalid link')
# home.dapp_tab_button.double_click()
browsing_view = dapp.open_url('invalid.takoe')
browsing_view.element_by_translation_id("web-view-error").wait_for_element(20)
browsing_view.dapp_tab_button.double_click()
dapp.just_fyi('Checking offline state')
home.toggle_airplane_mode()
dapp_detail.open_tabs_button.click()
dapp_detail.empty_tab_button.click()
browsing_view = dapp.open_url('status.im')
offline_texts = ['Unable to load page', 'ERR_INTERNET_DISCONNECTED']
for text in offline_texts:
browsing_view.element_by_text_part(text).wait_for_element(15)
home.toggle_airplane_mode()
browsing_view.browser_refresh_page_button.click_until_presence_of_element(
browsing_view.element_by_text_part('An Open Source Community'))
self.errors.verify_no_errors()
@marks.testrail_id(5390)
@marks.high
def test_delete_close_all_tabs(self):
home_view = SignInView(self.driver).create_user()
dapp_view = home_view.dapp_tab_button.click()
urls = {
'google.com': 'Google',
'status.im': 'Status - Private',
'bbc.com': 'bbc.com'
}
for url in urls:
browsing_view = dapp_view.open_url(url)
browsing_view.open_tabs_button.click()
browsing_view.empty_tab_button.click()
home_view.just_fyi('Close one tab, relogin and check that it is not reappearing')
browsing_view.remove_tab(name=urls['bbc.com'])
home_view.relogin()
home_view.dapp_tab_button.click()
browsing_view.open_tabs_button.click()
if browsing_view.element_by_text_part(urls['bbc.com']).is_element_displayed():
self.errors.append('Closed tab is present after re-login')
home_view.just_fyi('Close all tabs via "Close all", relogin and check that it is not reappearing')
browsing_view.close_all_button.click()
home_view.relogin()
home_view.dapp_tab_button.click()
browsing_view.open_tabs_button.click()
for url in urls:
if browsing_view.element_by_text_part(urls[url]).is_element_displayed():
self.errors.append('Closed tab %s present after re-login after "Close all"' % url)
self.errors.verify_no_errors()
@marks.testrail_id(6633)
@marks.high
def test_browser_managing_bookmarks(self):
home_view = SignInView(self.driver).create_user()
dapp_view = home_view.dapp_tab_button.click()
home_view.just_fyi('Add some url to bookmarks with default name')
browsing_view = dapp_view.open_url('status.im')
default_bookmark_name = browsing_view.add_to_bookmarks()
browsing_view.browser_previous_page_button.click()
if not browsing_view.element_by_text(default_bookmark_name).is_element_displayed():
self.errors.append("Bookmark with default name is not added!")
home_view.just_fyi('Add some url to bookmarks with custom name')
custom_name = 'Custom BBC'
dapp_view.open_url('bbc.com')
browsing_view.add_to_bookmarks(custom_name)
browsing_view.open_tabs_button.click()
browsing_view.empty_tab_button.click()
if not browsing_view.element_by_text(custom_name).is_element_displayed():
self.driver.fail("Bookmark with custom name is not added!")
home_view.just_fyi('Check deleting bookmark on long tap and that it is deleted after relogin')
dapp_view.browser_entry_long_press(custom_name)
dapp_view.delete_bookmark_button.click()
if browsing_view.element_by_text(custom_name).is_element_displayed():
self.errors.append("Bookmark with custom name is not deleted!")
profile_view = dapp_view.profile_button.click()
profile_view.relogin()
profile_view.dapp_tab_button.click()
if browsing_view.element_by_text(custom_name).is_element_displayed():
self.errors.append("Bookmark with custom name is reappeared after relogin!")
home_view.just_fyi('Check "Edit bookmark" and "Open in new tab"')
edited_name = 'My Fav Status'
dapp_view.browser_entry_long_press(default_bookmark_name)
dapp_view.edit_bookmark_button.click()
browsing_view.edit_bookmark_name(edited_name)
if not browsing_view.element_by_text(edited_name).is_element_displayed():
self.driver.fail("Edited bookmark name is not shown!")
dapp_view.browser_entry_long_press(edited_name)
dapp_view.open_in_new_tab_button.click()
browsing_view.options_button.click()
if not browsing_view.element_by_translation_id('remove-favourite').is_element_displayed():
self.errors.append("Remove favourite is not shown on added bookmark!")
self.errors.verify_no_errors()
@marks.testrail_id(5424)
@marks.medium
def test_open_url_with_non_english_text_connect_revoke_wallet_new_tab_open_chat_options(self):
@@ -8,7 +8,6 @@ from views.sign_in_view import SignInView
class TestDeepLinks(SingleDeviceTestCase):
@marks.testrail_id(5441)
@marks.medium
def test_open_user_profile_using_deep_link(self):
@@ -6,14 +6,15 @@ import emoji
import pytest
from dateutil import parser
from tests import marks
from tests.base_test_case import MultipleDeviceTestCase, SingleDeviceTestCase, create_shared_drivers, \
from tests import marks, test_dapp_name, test_dapp_url
from tests.base_test_case import MultipleDeviceTestCase, create_shared_drivers, \
MultipleSharedDeviceTestCase
from views.sign_in_view import SignInView
from selenium.common.exceptions import NoSuchElementException
@pytest.mark.xdist_group(name="public_chat_2")
@marks.critical
class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
@classmethod
@@ -33,8 +34,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
cls.chat_1.send_message(cls.text_message)
@marks.testrail_id(5313)
@marks.critical
def test_public_message_send_check_timestamps_while_on_different_tab(self):
def test_public_chat_message_send_check_timestamps_while_on_different_tab(self):
message = self.text_message
self.chat_2.dapp_tab_button.click()
sent_time_variants = self.chat_1.convert_device_time_to_chat_timestamp()
@@ -49,8 +49,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700734)
@marks.critical
def test_public_message_edit(self):
def test_public_chat_message_edit(self):
message_before_edit, message_after_edit = self.text_message, "Message AFTER edit 2"
self.chat_1.edit_message_in_chat(message_before_edit, message_after_edit)
for chat in (self.chat_1, self.chat_2):
@@ -61,8 +60,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700735)
@marks.critical
def test_public_message_delete(self):
def test_public_chat_message_delete(self):
message_to_delete = 'delete me, please'
self.chat_1.send_message(message_to_delete)
self.chat_1.delete_message_in_chat(message_to_delete)
@@ -72,8 +70,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700719)
@marks.critical
def test_public_emoji_send_copy_paste_reply(self):
def test_public_chat_emoji_send_copy_paste_reply(self):
emoji_name = random.choice(list(emoji.EMOJI_UNICODE))
emoji_unicode = emoji.EMOJI_UNICODE[emoji_name]
emoji_message = emoji.emojize(emoji_name)
@@ -100,8 +97,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(5360)
@marks.critical
def test_public_unread_messages_counter(self):
def test_public_chat_unread_messages_counter(self):
self.chat_1.send_message('пиу')
home_1 = self.chat_1.home_button.click()
message = 'test message'
@@ -114,8 +110,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700718)
@marks.critical
def test_public_unread_messages_counter_for_mentions_relogin(self):
def test_public_chat_unread_messages_counter_for_mention_relogin(self):
message = 'test message2'
[chat.home_button.double_click() for chat in (self.chat_1, self.chat_2)]
chat_element = self.home_1.get_chat('#' + self.public_chat_name)
@@ -140,8 +135,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(5319)
@marks.critical
def test_public_delete_chat_long_press(self):
def test_public_chat_delete_chat_long_press(self):
[chat.home_button.double_click() for chat in (self.chat_1, self.chat_2)]
self.home_1.delete_chat_long_press('#%s' % self.pub_chat_delete_long_press)
self.home_2.just_fyi("Send message to deleted chat")
@@ -154,8 +148,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.drivers[0].fail('Deleted public chat reappears after relogin')
@marks.testrail_id(700736)
@marks.critical
def test_public_link_send_open(self):
def test_public_chat_link_send_open(self):
[chat.home_button.double_click() for chat in (self.chat_1, self.chat_2)]
[home.get_chat('#' + self.public_chat_name).click() for home in (self.home_1, self.home_2)]
url_message = 'http://status.im'
@@ -166,8 +159,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.drivers[0].fail('URL was not opened from public chat')
@marks.testrail_id(700737)
@marks.critical
def test_public_links_with_previews_github_youtube_twitter_gif_send_enable(self):
def test_public_chat_links_with_previews_github_youtube_twitter_gif_send_enable(self):
[chat.home_button.double_click() for chat in (self.chat_1, self.chat_2)]
[home.get_chat('#' + self.public_chat_name).click() for home in (self.home_1, self.home_2)]
giphy_url = 'https://giphy.com/gifs/this-is-fine-QMHoU66sBXqqLqYvGO'
@@ -210,8 +202,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(6270)
@marks.critical
def test_public_mark_all_messages_as_read(self):
def test_public_chat_mark_all_messages_as_read(self):
[chat.home_button.double_click() for chat in (self.chat_1, self.chat_2)]
self.home_2.get_chat('#' + self.public_chat_name).click()
self.chat_2.send_message(self.text_message)
@@ -231,8 +222,9 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@pytest.mark.xdist_group(name="public_chat_1")
class TestPublicChatOneDeviceMerged(MultipleSharedDeviceTestCase):
@pytest.mark.xdist_group(name="public_chat_browser_1")
@marks.critical
class TestPublicChatBrowserOneDeviceMerged(MultipleSharedDeviceTestCase):
@classmethod
def setup_class(cls):
@@ -244,8 +236,7 @@ class TestPublicChatOneDeviceMerged(MultipleSharedDeviceTestCase):
cls.chat = cls.home.join_public_chat(cls.public_chat_name)
@marks.testrail_id(5675)
@marks.critical
def test_public_fetch_more_history(self):
def test_public_chat_fetch_more_history(self):
self.home.just_fyi("Check that can fetch previous history for several days")
device_time = parser.parse(self.drivers[0].device_time)
yesterday = (device_time - timedelta(days=1)).strftime("%b %-d, %Y")
@@ -287,8 +278,7 @@ class TestPublicChatOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(5396)
@marks.critical
def test_public_navigate_to_chat_when_relaunch(self):
def test_public_chat_navigate_to_chat_when_relaunch(self):
text_message = 'some_text'
self.home.home_button.double_click()
self.home.get_chat('#%s' % self.public_chat_name).click()
@@ -298,8 +288,7 @@ class TestPublicChatOneDeviceMerged(MultipleSharedDeviceTestCase):
self.drivers[0].fail("Not navigated to chat view after reopening app")
@marks.testrail_id(700738)
@marks.critical
def test_public_tag_message(self):
def test_public_chat_tag_message(self):
tag_message = '#wuuut'
self.home.home_button.double_click()
self.home.get_chat('#%s' % self.public_chat_name).click()
@@ -316,7 +305,6 @@ class TestPublicChatOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700739)
@marks.critical
def test_public_chat_open_using_deep_link(self):
self.drivers[0].close_app()
chat_name = self.home.get_random_chat_name()
@@ -327,6 +315,164 @@ class TestPublicChatOneDeviceMerged(MultipleSharedDeviceTestCase):
except (AssertionError, NoSuchElementException):
self.driver.fail("Public chat '%s' is not opened" % chat_name)
@marks.testrail_id(702072)
def test_browser_blocked_url(self):
dapp = self.home.dapp_tab_button.click()
for url in ('metamask.site', 'cryptokitties.domainname'):
dapp.just_fyi('Checking blocked website %s' % url)
dapp_detail = dapp.open_url(url)
dapp_detail.element_by_translation_id('browsing-site-blocked-title')
if dapp_detail.browser_refresh_page_button.is_element_displayed():
self.errors.append("Refresh button is present in blocked site")
dapp_detail.go_back_button.click()
dapp_detail.open_tabs_button.click()
dapp.element_by_text_part(url[:8]).click()
dapp_detail.continue_anyway_button.click()
if dapp_detail.element_by_text('This site is blocked').is_element_displayed():
self.errors.append("Failed to open Dapp after 'Continue anyway' tapped for %s" % url)
dapp_detail.open_tabs_button.click()
dapp_detail.empty_tab_button.click()
self.errors.verify_no_errors()
@marks.testrail_id(702073)
def test_browser_connection_is_secure_not_secure_warning(self):
dapp = self.home.dapp_tab_button.click()
web_page = dapp.open_url('http://www.dvwa.co.uk')
web_page.url_edit_box_lock_icon.click_until_presence_of_element(
web_page.element_by_translation_id("browser-not-secure"))
web_page.open_tabs_button.click()
web_page.empty_tab_button.click()
dapp.just_fyi('Checking connection is secure for Airswap')
web_page = dapp.open_url('https://instant.airswap.io')
web_page.wait_for_d_aap_to_load()
web_page.url_edit_box_lock_icon.click_until_presence_of_element(
web_page.element_by_translation_id("browser-secure"))
web_page.open_tabs_button.click()
web_page.empty_tab_button.click()
@marks.testrail_id(702074)
def test_browser_invalid_url(self):
dapp = self.home.dapp_tab_button.click()
browsing_view = dapp.open_url('invalid.takoe')
browsing_view.element_by_translation_id("web-view-error").wait_for_element(20)
@marks.testrail_id(702075)
def test_browser_offline(self):
dapp = self.home.dapp_tab_button.click()
self.home.toggle_airplane_mode()
browsing_view = dapp.open_url('status.im')
offline_texts = ['Unable to load page', 'ERR_INTERNET_DISCONNECTED']
for text in offline_texts:
browsing_view.element_by_text_part(text).wait_for_element(15)
self.home.toggle_airplane_mode()
browsing_view.browser_refresh_page_button.click_until_presence_of_element(
browsing_view.element_by_text_part('An Open Source Community'))
@marks.testrail_id(702076)
def test_browser_delete_close_tabs(self):
dapp = self.home.dapp_tab_button.click()
urls = {
'google.com': 'Google',
'status.im': 'Status - Private',
'bbc.com': 'bbc.com'
}
for url in urls:
web_page = dapp.open_url(url)
web_page.open_tabs_button.click()
web_page.empty_tab_button.click()
self.home.just_fyi('Delete one tab')
web_page.remove_tab(name=urls['bbc.com'])
if web_page.element_by_text_part(urls['bbc.com']).is_element_displayed():
self.errors.append('Closed tab is present after deletion')
self.home.just_fyi('Close all tabs via "Close all", relogin and check that it is not reappearing')
web_page.close_all_button.click()
self.home.reopen_app()
web_page.dapp_tab_button.click()
web_page.open_tabs_button.click()
if web_page.element_by_text_part(urls['status.im']).is_element_displayed():
self.errors.append('Tabs are not closed or reappeared after re-login!')
self.errors.verify_no_errors()
@marks.testrail_id(702077)
def test_browser_bookmarks_create_edit_remove(self):
dapp = self.home.dapp_tab_button.click()
self.home.just_fyi('Add some url to bookmarks with default name')
web_page = dapp.open_url('status.im')
default_bookmark_name = web_page.add_to_bookmarks()
web_page.browser_previous_page_button.click()
if not web_page.element_by_text(default_bookmark_name).is_element_displayed():
self.errors.append("Bookmark with default name is not added!")
self.home.just_fyi('Add some url to bookmarks with custom name')
custom_name = 'Custom BBC'
dapp.open_url('bbc.com')
web_page.add_to_bookmarks(custom_name)
web_page.open_tabs_button.click()
web_page.empty_tab_button.click()
if not web_page.element_by_text(custom_name).is_element_displayed():
self.driver.fail("Bookmark with custom name is not added!")
self.home.just_fyi('Checking "Open in new tab"')
dapp.browser_entry_long_press(custom_name)
dapp.open_in_new_tab_button.click()
web_page.options_button.click()
if not web_page.element_by_translation_id('remove-favourite').is_element_displayed():
self.errors.append("Remove favourite is not shown on added bookmark!")
dapp.click_system_back_button()
self.home.just_fyi('Check deleting bookmark')
web_page.open_tabs_button.click()
web_page.empty_tab_button.click()
dapp.browser_entry_long_press(custom_name)
dapp.delete_bookmark_button.click()
if web_page.element_by_text(custom_name).is_element_displayed():
self.errors.append("Bookmark with custom name is not deleted!")
self.home.just_fyi('Check "Edit bookmark" and "Open in new tab"')
edited_name = 'My Fav Status'
dapp.browser_entry_long_press(default_bookmark_name)
dapp.edit_bookmark_button.click()
web_page.edit_bookmark_name(edited_name)
if not web_page.element_by_text(edited_name).is_element_displayed():
self.driver.fail("Edited bookmark name is not shown!")
self.errors.verify_no_errors()
@marks.testrail_id(702078)
def test_browser_web3_permissions_testdapp(self):
self.home.home_button.double_click()
self.home.just_fyi('open Status Test Dapp, allow all and check permissions in Profile')
web_view = self.home.open_status_test_dapp()
dapp = self.home.dapp_tab_button.click()
profile = self.home.profile_button.click()
profile.privacy_and_security_button.click()
profile.dapp_permissions_button.click()
profile.element_by_text(test_dapp_name).click()
if not profile.element_by_text(self.home.status_account_name).is_element_displayed():
self.errors.append('Wallet permission was not granted')
if not profile.element_by_translation_id("chat-key").is_element_displayed():
self.errors.append('Contact code permission was not granted')
profile.just_fyi('revoke access and check that they are asked second time')
profile.revoke_access_button.click()
profile.back_button.click()
profile.dapp_tab_button.click()
web_view.open_tabs_button.click()
web_view.empty_tab_button.click()
dapp.open_url(test_dapp_url)
if not dapp.element_by_text_part(self.home.status_account_name).is_element_displayed():
self.errors.append('Wallet permission is not asked')
if dapp.allow_button.is_element_displayed():
dapp.allow_button.click(times_to_click=1)
if not dapp.element_by_translation_id("your-contact-code").is_element_displayed():
self.errors.append('Profile permission is not asked')
self.errors.verify_no_errors()
class TestPublicChatMultipleDevice(MultipleDeviceTestCase):
@@ -436,23 +582,76 @@ class TestPublicChatMultipleDevice(MultipleDeviceTestCase):
@marks.testrail_id(700727)
@marks.medium
def test_gap_in_public_chat(self):
def test_gap_in_public_chat_and_no_gap_in_1_1_and_group_chats(self):
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
home_1, home_2 = device_1.create_user(), device_2.create_user()
message = "testing gap"
chat_name = home_1.get_random_chat_name()
message_1 = "testing gap"
message_2 = "testing no gap"
pub_chat_name = home_1.get_random_chat_name()
group_chat_name = home_1.get_random_chat_name()
public_key_1, username_1 = home_1.get_public_key_and_username(True)
public_key_2, username_2 = home_2.get_public_key_and_username(True)
profile_1 = home_1.profile_button.click()
profile_1.sync_settings_button.click()
profile_1.sync_history_for_button.click()
profile_1.element_by_translation_id("two-minutes").click()
home_1.home_button.click()
chat_1, chat_2 = home_1.join_public_chat(chat_name), home_2.join_public_chat(chat_name)
chat_1.send_message("HI")
[home.home_button.click() for home in (home_1, home_2)]
home_1.just_fyi("Creating 1-1 chat and sending message from device 1")
one_to_one_chat_1 = home_1.add_contact(public_key_2)
one_to_one_chat_1.send_message("HI")
home_1.get_back_to_home_view()
home_1.just_fyi("Creating group chat and sending message from device 1")
group_chat_1 = home_1.create_group_chat([username_2], group_chat_name)
group_chat_1.send_message("HI")
home_1.get_back_to_home_view()
home_1.just_fyi("Creating public chat and sending message from device 1")
pub_chat_1, pub_chat_2 = home_1.join_public_chat(pub_chat_name), home_2.join_public_chat(pub_chat_name)
pub_chat_1.send_message("HI")
device_1.toggle_airplane_mode()
chat_2.send_message(message)
home_2.just_fyi("Joining public chat by device 2 and sending message")
pub_chat_2.send_message(message_1)
home_2.get_back_to_home_view()
home_2.just_fyi("Joining 1-1 chat by device 2 and sending message")
# one_to_one_chat_element = home_2.get_chat(username_1, wait_time=10)
# one_to_one_chat_2 = one_to_one_chat_element.click()
one_to_one_chat_2 = home_2.add_contact(public_key_1)
one_to_one_chat_2.send_message(message_2)
home_2.get_back_to_home_view()
home_2.just_fyi("Joining Group chat by device 2 and sending message")
# home_2.notifications_button.click()
# group_chat_2 = home_2.get_chat_from_activity_center_view(group_chat_name).click()
group_chat_2 = home_2.get_chat(group_chat_name).click()
group_chat_2.join_chat_button.click()
group_chat_2.send_message(message_2)
# Waiting for 3 minutes and then going back online
sleep(180)
device_1.toggle_airplane_mode()
chat_1.element_by_translation_id("fetch-messages").wait_and_click(60)
if not chat_1.chat_element_by_text(message).is_element_displayed():
device_1.driver.fail("Test message has not been fetched")
home_1.just_fyi("Checking gap in public chat and fetching messages")
if pub_chat_1.chat_element_by_text(message_1).is_element_displayed(10):
self.errors.append("Test message has been fetched automatically")
pub_chat_1.element_by_translation_id("fetch-messages").wait_and_click(60)
if not pub_chat_1.chat_element_by_text(message_1).is_element_displayed(10):
self.errors.append("Test message has not been fetched")
home_1.get_back_to_home_view()
home_1.just_fyi("Checking that there is no gap in 1-1/group chat and messages fetched automatically")
for chat in [home_1.get_chat(username_2), home_1.get_chat(group_chat_name)]:
chat_view = chat.click()
if chat_view.element_by_translation_id("fetch-messages").is_element_displayed(10):
self.errors.append("Fetch messages button is displayed in {}} chat".format(chat.user_name_text.text))
if not chat_view.chat_element_by_text(message_2).is_element_displayed(10):
self.errors.append("Message in {} chat has not been fetched automatically".format(chat.user_name_text.text))
chat_view.back_button.click()
self.errors.verify_no_errors()
+3 -3
View File
@@ -1,7 +1,7 @@
from tests import marks, pytest_config_global, test_dapp_name, staging_fleet, mailserver_hk, mailserver_ams, \
mailserver_gc
from tests.base_test_case import SingleDeviceTestCase, MultipleDeviceTestCase
from tests.users import upgrade_users, transaction_recipients, basic_user, ens_user
from tests.users import upgrade_users, transaction_recipients, basic_user, ens_user, transaction_senders
from views.sign_in_view import SignInView
import views.upgrade_dbs.chats.data as chat_data
import views.upgrade_dbs.dapps.data as dapp_data
@@ -209,7 +209,7 @@ class TestUpgradeApplication(SingleDeviceTestCase):
@marks.testrail_id(695810)
def test_keycard_upgrade(self):
user = basic_user
user = transaction_senders['ETH_STT_ADI_1']
sign_in = SignInView(self.driver)
home = sign_in.recover_access(passphrase=user['passphrase'], keycard=True)
wallet = home.wallet_button.click()
@@ -226,7 +226,7 @@ class TestUpgradeApplication(SingleDeviceTestCase):
home.just_fyi('Check that can sign transaction in STT from wallet')
transaction_amount = wallet.get_unique_amount()
wallet.send_transaction(amount=transaction_amount, asset_name='STT', sign_transaction=True, keycard=True,
recipient=transaction_recipients['I']['address'])
recipient=transaction_senders['ETH_STT_1']['address'])
self.network_api.find_transaction_by_unique_amount(user['address'], transaction_amount, token=True)
wallet.just_fyi('Check that transaction is appeared in transaction history')
@@ -1,127 +0,0 @@
from tests import marks, unique_password, common_password
from tests.base_test_case import SingleDeviceTestCase
from tests.users import transaction_senders
from views.sign_in_view import SignInView
class TestTransactionDApp(SingleDeviceTestCase):
@marks.testrail_id(5309)
@marks.critical
@marks.transaction
def test_request_stt_from_dapp(self):
sender = transaction_senders['K']
home = SignInView(self.driver).recover_access(sender['passphrase'], unique_password)
wallet = home.wallet_button.click()
wallet.scan_tokens()
initial_amount_stt = wallet.get_asset_amount_by_name('STT')
status_test_dapp = home.open_status_test_dapp()
status_test_dapp.wait_for_d_aap_to_load()
status_test_dapp.assets_button.click()
status_test_dapp.request_stt_button.wait_for_element(60)
send_transaction = status_test_dapp.request_stt_button.click()
if not send_transaction.onboarding_message.is_element_displayed(30):
self.driver.fail('It seems onboarding screen is not shown.')
home.ok_got_it_button.click()
home.cancel_button.click()
send_transaction = status_test_dapp.request_stt_button.click()
send_transaction.sign_transaction(unique_password)
status_test_dapp.wallet_button.click()
send_transaction.just_fyi('Verify that wallet balance is updated')
wallet.wait_balance_is_changed('STT', initial_amount_stt, scan_tokens=True)
send_transaction.just_fyi('Check logcat for sensitive data')
values_in_logcat = send_transaction.find_values_in_logcat(password=unique_password)
if values_in_logcat:
self.driver.fail(values_in_logcat)
@marks.testrail_id(5342)
@marks.critical
@marks.transaction
def test_sign_message_and_2tx_in_batch_and_transactions_filters_from_daap(self):
password = 'password_for_daap'
home = SignInView(self.driver).recover_access(passphrase=transaction_senders['W']['passphrase'],
password=password)
wallet = home.wallet_button.click()
status_test_dapp = home.open_status_test_dapp()
status_test_dapp.wait_for_d_aap_to_load()
status_test_dapp.transactions_button.click()
wallet.just_fyi("Checking signing message")
send_transaction = status_test_dapp.sign_message_button.click()
status_test_dapp.set_up_wallet_when_sending_tx()
if not send_transaction.element_by_text("Test message").is_element_displayed():
self.errors.append("No message shown when signing!")
send_transaction.enter_password_input.send_keys(password)
send_transaction.sign_button.click()
if not status_test_dapp.element_by_text_part('Signed message').is_element_displayed():
self.errors.append('Message was not signed')
send_transaction.just_fyi('Check logcat for sensitive data')
values_in_logcat = send_transaction.find_values_in_logcat(password=password)
if values_in_logcat:
self.errors.append("When signing message from dapp: %s" % values_in_logcat)
wallet.just_fyi("Checking send 2 txs in batch")
status_test_dapp.send_two_tx_in_batch_button.scroll_to_element()
send_transaction = status_test_dapp.send_two_tx_in_batch_button.click()
send_transaction.sign_transaction(password)
if not send_transaction.sign_with_password.is_element_displayed(10):
self.driver.fail('Second send transaction screen did not appear!')
send_transaction.sign_transaction(password)
wallet.just_fyi("Checking send 2 txs one after another")
status_test_dapp.send_two_tx_one_by_one_button.scroll_to_element()
send_transaction = status_test_dapp.send_two_tx_one_by_one_button.click()
send_transaction.sign_transaction(password)
if not send_transaction.sign_with_password.is_element_displayed(20):
self.driver.fail('Second send transaction screen did not appear!')
send_transaction.sign_transaction(password)
wallet.just_fyi("Checking test filters")
status_test_dapp.test_filters_button.scroll_and_click()
for element in status_test_dapp.element_by_text('eth_uninstallFilter'), status_test_dapp.ok_button:
if element.is_element_displayed(10):
self.driver.fail("'Test filters' button produced an error")
self.errors.verify_no_errors()
@marks.testrail_id(5784)
@marks.medium
@marks.transaction
def test_sign_typed_message_deploy_simple_contract_request_pub_key_from_dapp(self):
user = transaction_senders['W']
home = SignInView(self.driver).recover_access(passphrase=user['passphrase'])
home.just_fyi("Checking requesting public key from dapp")
status_test_dapp = home.open_status_test_dapp(allow_all=False)
status_test_dapp.status_api_button.click_until_presence_of_element(status_test_dapp.request_contact_code_button)
status_test_dapp.request_contact_code_button.click_until_presence_of_element(status_test_dapp.deny_button)
status_test_dapp.deny_button.click()
if status_test_dapp.element_by_text(user['public_key']).is_element_displayed():
self.errors.append('Public key is returned but access was not allowed')
status_test_dapp.request_contact_code_button.click_until_presence_of_element(status_test_dapp.deny_button)
status_test_dapp.allow_button.click()
if not status_test_dapp.element_by_text(user['public_key']).is_element_displayed():
self.errors.append('Public key is not returned')
status_test_dapp.get_empty_dapp_tab()
home.wallet_button.click()
home.just_fyi("Checking sign typed message")
home.open_status_test_dapp(allow_all=True)
status_test_dapp.transactions_button.click_until_presence_of_element(status_test_dapp.sign_typed_message_button)
send_transaction = status_test_dapp.sign_typed_message_button.click()
send_transaction.enter_password_input.send_keys(common_password)
send_transaction.sign_button.click_until_absense_of_element(send_transaction.sign_button)
if not status_test_dapp.element_by_text_part('0xde3048417e5881acc9ca8466ab0b3e2f9f96').is_element_displayed(30):
self.errors.append("Hash of signed typed message is not shown!")
home.just_fyi("Checking deploy simple contract")
send_transaction = status_test_dapp.deploy_contract_button.click()
send_transaction.sign_transaction()
if not status_test_dapp.element_by_text('Contract deployed at: ').is_element_displayed(180):
self.errors.append('Contract was not created')
for text in ['Call contract get function',
'Call contract set function', 'Call function 2 times in a row']:
status_test_dapp.element_by_text(text).scroll_to_element()
self.errors.verify_no_errors()
@@ -7,11 +7,12 @@ from views.sign_in_view import SignInView
@pytest.mark.xdist_group(name="keycard_tx_1")
@marks.critical
class TestKeycardTxOneDeviceMerged(MultipleSharedDeviceTestCase):
@classmethod
def setup_class(cls):
cls.user = transaction_senders['P']
cls.address = '0x%s' % basic_user['address']
cls.user = transaction_senders['ETH_STT_ADI_1']
cls.address = '0x%s' % transaction_senders['ETH_7']['address']
cls.drivers, cls.loop = create_shared_drivers(1)
cls.sign_in = SignInView(cls.drivers[0])
@@ -24,7 +25,6 @@ class TestKeycardTxOneDeviceMerged(MultipleSharedDeviceTestCase):
cls.initial_balances[asset] = cls.wallet.get_asset_amount_by_name(asset)
@marks.testrail_id(700767)
@marks.critical
def test_keycard_send_tx_eth(self):
wallet = self.home.wallet_button.click()
transaction_amount = wallet.get_unique_amount()
@@ -39,7 +39,6 @@ class TestKeycardTxOneDeviceMerged(MultipleSharedDeviceTestCase):
self.wallet.wait_balance_is_changed('ETH', initial_balance=self.initial_balances['ETH'])
@marks.testrail_id(700768)
@marks.critical
def test_keycard_relogin_after_restore(self):
self.sign_in.just_fyi('Check that username and public key match expected')
public_key, default_username = self.sign_in.get_public_key_and_username(return_username=True)
@@ -58,7 +57,6 @@ class TestKeycardTxOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700769)
@marks.critical
@marks.transaction
def test_keycard_send_tx_sign_message_request_stt_testdapp(self):
self.home.home_button.double_click()
@@ -107,7 +105,6 @@ class TestKeycardTxOneDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700770)
@marks.critical
def test_keycard_wallet_recover_pairing_check_balance_after_offline_tx_history(self):
user = transaction_senders['A']
self.sign_in.toggle_airplane_mode()
@@ -156,6 +153,73 @@ class TestKeycardTxOneDeviceMerged(MultipleSharedDeviceTestCase):
transactions_details.close_button.click()
self.errors.verify_no_errors()
@marks.testrail_id(5689)
def test_keycard_create_account_unlock_same_seed(self):
self.sign_in.driver.reset()
self.sign_in.just_fyi("Create keycard account and save seed phrase")
self.sign_in.accept_tos_checkbox.enable()
self.sign_in.get_started_button.click()
self.sign_in.generate_key_button.click_until_presence_of_element(self.sign_in.next_button)
self.sign_in.next_button.click_until_absense_of_element(self.sign_in.element_by_translation_id("intro-wizard-title2"))
keycard_flow = self.sign_in.keycard_storage_button.click()
keycard_flow.confirm_pin_and_proceed()
seed_phrase = keycard_flow.backup_seed_phrase()
self.sign_in.maybe_later_button.wait_for_visibility_of_element(30)
self.sign_in.maybe_later_button.click_until_presence_of_element(self.sign_in.lets_go_button)
self.sign_in.lets_go_button.click_until_absense_of_element(self.sign_in.lets_go_button)
self.sign_in.profile_button.wait_for_visibility_of_element(30)
self.sign_in.just_fyi('Check that after creating keycard account balance is 0, not ...')
wallet_1 = self.sign_in.wallet_button.click()
wallet_address = wallet_1.get_wallet_address()
wallet_1.wallet_button.double_click()
if wallet_1.status_account_total_usd_value.text != '0':
self.errors.append("Account USD value is not 0, it is %s" % wallet_1.status_account_total_usd_value.text)
public_key, default_username = self.sign_in.get_public_key_and_username(return_username=True)
profile_1 = self.sign_in.get_profile_view()
profile_1.logout()
profile_1.just_fyi('Check that can re-login with keycard account after account creation')
self.sign_in.multi_account_on_login_button.wait_for_visibility_of_element(5)
self.sign_in.multi_account_on_login_button.click()
if not keycard_flow.element_by_text_part(default_username).is_element_displayed():
self.errors.append("%s is not found on keycard login screen!" % default_username)
keycard_flow.enter_default_pin()
if not self.sign_in.home_button.is_element_displayed(10):
self.errors.append('Keycard user is not logged in')
self.sign_in.just_fyi('Unlock keycard multiaccount at attempt to restore same multiaccount from seed')
self.sign_in.profile_button.click()
profile_1.logout()
self.sign_in.access_key_button.click()
self.sign_in.enter_seed_phrase_button.click()
self.sign_in.seedphrase_input.click()
self.sign_in.seedphrase_input.set_value(seed_phrase)
self.sign_in.next_button.click()
self.sign_in.element_by_translation_id("unlock", uppercase=True).click()
keycard_flow.enter_default_pin()
device_1_home = self.sign_in.home_button.click()
device_1_home.plus_button.click()
if not device_1_home.start_new_chat_button.is_element_displayed():
self.errors.append("Can't proceed using account after it's re-recover twice.")
self.sign_in.just_fyi("Restore same multiaccount from backed up seed phrase on another device")
self.sign_in.driver.reset()
self.sign_in.recover_access(seed_phrase)
self.sign_in.just_fyi("Check username and wallet address on restored account")
wallet_2 = self.sign_in.wallet_button.click()
wallet_address_2 = wallet_2.get_wallet_address()
wallet_2.wallet_button.double_click()
if wallet_address != wallet_address_2:
self.errors.append('Wallet address on restored multiaccount is not equal to created keycard multiaccount')
public_key_2, default_username_2 = self.sign_in.get_public_key_and_username(return_username=True)
if public_key != public_key_2:
self.errors.append('Public key on restored multiaccount is not equal to created keycard multiaccount')
if default_username_2 != default_username:
self.errors.append('Username on restored multiaccount is not equal to created keycard multiaccount')
self.errors.verify_no_errors()
class TestTransactionWalletSingleDevice(SingleDeviceTestCase):
@@ -251,7 +315,7 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase):
@marks.medium
@marks.transaction
def test_keycard_sign_typed_message_deploy_simple_contract(self):
sender = transaction_senders['W']
sender = transaction_senders['ETH_6']
home = SignInView(self.driver).recover_access(sender['passphrase'], keycard=True)
wallet = home.wallet_button.click()
status_test_dapp = home.open_status_test_dapp()
@@ -263,7 +327,7 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase):
send_transaction.sign_with_keycard_button.click()
keycard_view = send_transaction.sign_with_keycard_button.click()
keycard_view.enter_default_pin()
if not keycard_view.element_by_text_part('0xde3048417').is_element_displayed():
if not keycard_view.element_by_text_part('0x6df0ce').is_element_displayed():
self.errors.append('Typed message was not signed')
wallet.just_fyi("Checking deploy simple contract")
@@ -3,18 +3,20 @@ import string
import pytest
from tests import marks, common_password
from tests.base_test_case import SingleDeviceTestCase, MultipleDeviceTestCase, MultipleSharedDeviceTestCase, create_shared_drivers
from tests.users import transaction_senders, basic_user, wallet_users, ens_user_ropsten, ens_user, transaction_recipients
from tests.base_test_case import SingleDeviceTestCase, MultipleDeviceTestCase, MultipleSharedDeviceTestCase,\
create_shared_drivers
from tests.users import transaction_senders, basic_user, wallet_users, ens_user_ropsten, ens_user
from views.send_transaction_view import SendTransactionView
from views.sign_in_view import SignInView
@pytest.mark.xdist_group(name="send_tx_1")
@marks.critical
class TestSendTxDeviceMerged(MultipleSharedDeviceTestCase):
@classmethod
def setup_class(cls):
cls.user = transaction_senders['S']
cls.recipient_address = '0x%s' % basic_user['address']
cls.user = transaction_senders['ETH_ADI_STT_3']
cls.recipient_address = '0x%s' % transaction_senders['ETH_7']['address']
cls.drivers, cls.loop = create_shared_drivers(1)
[cls.amount_adi, cls.amount_eth, cls.amount_stt] = ['0.000%s' % str(random.randint(100, 999)) + '1' for _ in range(3)]
cls.sign_in = SignInView(cls.drivers[0])
@@ -29,7 +31,6 @@ class TestSendTxDeviceMerged(MultipleSharedDeviceTestCase):
cls.wallet.send_transaction(amount=cls.amount_adi, recipient=cls.recipient_address, asset_name='ADI')
@marks.testrail_id(700763)
@marks.critical
@marks.transaction
def test_send_tx_eth_check_logcat(self):
self.wallet.just_fyi('Check that transaction is appeared in tx history')
@@ -44,7 +45,6 @@ class TestSendTxDeviceMerged(MultipleSharedDeviceTestCase):
self.wallet.driver.fail(values_in_logcat)
@marks.testrail_id(700764)
@marks.critical
@marks.transaction
def test_send_tx_token_7_decimals(self):
asset = 'ADI'
@@ -54,10 +54,58 @@ class TestSendTxDeviceMerged(MultipleSharedDeviceTestCase):
self.network_api.find_transaction_by_hash(transaction_adi)
self.wallet.wait_balance_is_changed(asset, initial_balance=self.initial_balances[asset])
@marks.testrail_id(700765)
@marks.critical
@marks.testrail_id(5342)
@marks.transaction
def test_send_tx_custom_token_18_decimals(self):
def test_send_tx_sign_message_2tx_in_batch_tx_filters_request_stt_testdapp(self):
self.wallet.home_button.click()
status_test_dapp = self.home.open_status_test_dapp()
status_test_dapp.wait_for_d_aap_to_load()
self.wallet.just_fyi("Checking request STT")
status_test_dapp.assets_button.click()
status_test_dapp.request_stt_button.wait_for_element(60)
send_transaction = status_test_dapp.request_stt_button.click()
send_transaction.sign_transaction()
self.wallet.just_fyi("Checking signing message")
status_test_dapp.transactions_button.click()
send_transaction = status_test_dapp.sign_message_button.click()
send_transaction.enter_password_input.set_value(common_password)
send_transaction.sign_button.click()
if not status_test_dapp.element_by_text_part('Signed message').is_element_displayed():
self.errors.append('Message was not signed')
send_transaction.just_fyi('Check logcat for sensitive data')
values_in_logcat = send_transaction.find_values_in_logcat(password=common_password)
if values_in_logcat:
self.errors.append("When signing message from dapp: %s" % values_in_logcat)
self.wallet.just_fyi("Checking send 2 txs in batch")
status_test_dapp.send_two_tx_in_batch_button.scroll_to_element()
send_transaction = status_test_dapp.send_two_tx_in_batch_button.click()
send_transaction.sign_transaction()
if not send_transaction.sign_with_password.is_element_displayed(10):
self.errors.append('Second send transaction screen did not appear!')
send_transaction.sign_transaction()
self.wallet.just_fyi("Checking send 2 txs one after another")
status_test_dapp.send_two_tx_one_by_one_button.scroll_to_element()
send_transaction = status_test_dapp.send_two_tx_one_by_one_button.click()
send_transaction.sign_transaction()
if not send_transaction.sign_with_password.is_element_displayed(20):
self.errors.append('Second send transaction screen did not appear!')
send_transaction.sign_transaction()
self.wallet.just_fyi("Checking test filters")
status_test_dapp.test_filters_button.scroll_and_click()
for element in status_test_dapp.element_by_text('eth_uninstallFilter'), status_test_dapp.ok_button:
if element.is_element_displayed(10):
self.errors.append("'Test filters' button produced an error")
self.errors.verify_no_errors()
@marks.testrail_id(700765)
@marks.transaction
def test_send_tx_custom_token_18_decimals_invalid_password(self):
contract_address, name, symbol, decimals = '0x101848D5C5bBca18E6b4431eEdF6B95E9ADF82FA', 'Weenus 💪', 'WEENUS', '18'
self.home.wallet_button.double_click()
@@ -77,17 +125,46 @@ class TestSendTxDeviceMerged(MultipleSharedDeviceTestCase):
self.wallet.asset_by_name(symbol).scroll_to_element()
if not self.wallet.asset_by_name(symbol).is_element_displayed():
self.errors.append('Custom token is not shown on Wallet view')
send_tx = self.wallet.send_transaction_from_main_screen.click()
send_tx.select_asset_button.click()
asset_button = send_tx.asset_by_name(symbol)
send_tx.select_asset_button.click_until_presence_of_element(
send_tx.eth_asset_in_select_asset_bottom_sheet_button)
asset_button.click()
send_tx.amount_edit_box.click()
send_tx.amount_edit_box.set_value(self.amount_eth)
send_tx.set_recipient_address(self.recipient_address)
send_tx.sign_transaction_button.click()
if self.wallet.sign_in_phrase.is_element_displayed():
self.wallet.set_up_wallet_when_sending_tx()
send_tx.just_fyi('Check that can not sign tx with invalid password')
self.wallet.next_button.click_if_shown()
self.wallet.ok_got_it_button.click_if_shown()
send_tx.sign_with_password.click_until_presence_of_element(send_tx.enter_password_input)
send_tx.enter_password_input.click()
send_tx.enter_password_input.send_keys('wrong_password')
send_tx.sign_button.click()
if send_tx.element_by_text_part('Transaction sent').is_element_displayed():
self.errors.append('Transaction was sent with a wrong password')
self.wallet.just_fyi("Check that can send tx with custom token")
self.wallet.send_transaction(asset_name=symbol, amount=self.amount_eth, recipient=self.recipient_address)
send_tx.enter_password_input.click()
send_tx.enter_password_input.clear()
send_tx.enter_password_input.send_keys(common_password)
send_tx.sign_button.click_until_absense_of_element(send_tx.sign_button)
send_tx.ok_button.wait_for_element(120)
if not self.wallet.element_by_translation_id("transaction-sent").is_element_displayed():
self.errors.append("Tx is not sent!")
send_tx.ok_button.click()
# TODO: disabled due to 10838 (rechecked 23.11.21, valid)
# transactions_view = wallet.transaction_history_button.click()
# transactions_view.transactions_table.find_transaction(amount=amount, asset=symbol)
self.errors.verify_no_errors()
@marks.testrail_id(700757)
@marks.critical
def test_send_tx_set_recipient_options_invalid_password(self):
def test_send_tx_set_recipient_options(self):
nickname = 'my_some_nickname'
account_name = 'my_acc_name'
account_address = '0x8c2E3Cd844848E79cFd4671cE45C12F210b630d7'
@@ -189,22 +266,51 @@ class TestSendTxDeviceMerged(MultipleSharedDeviceTestCase):
if send_tr.enter_recipient_address_text.text != send_tr.get_formatted_recipient_address(
'0x' + basic_user['address']):
self.errors.append('QR scanned address that was added to favourites was not resolved correctly')
send_tr.just_fyi('Check that can not sign tx with invalid password')
self.wallet.next_button.click_if_shown()
self.wallet.ok_got_it_button.click_if_shown()
send_tr.sign_with_password.click_until_presence_of_element(send_tr.enter_password_input)
send_tr.enter_password_input.click()
send_tr.enter_password_input.send_keys('wrong_password')
send_tr.sign_button.click()
if send_tr.element_by_text_part('Transaction sent').is_element_displayed():
wallet.driver.fail('Transaction was sent with a wrong password')
self.errors.verify_no_errors()
class TestTransactionWalletSingleDevice(SingleDeviceTestCase):
@marks.testrail_id(5784)
@marks.medium
@marks.transaction
def test_sign_typed_message_deploy_simple_contract_request_pub_key_from_dapp(self):
user = transaction_senders['ETH_5']
home = SignInView(self.driver).recover_access(passphrase=user['passphrase'])
home.just_fyi("Checking requesting public key from dapp")
status_test_dapp = home.open_status_test_dapp(allow_all=False)
status_test_dapp.status_api_button.click_until_presence_of_element(status_test_dapp.request_contact_code_button)
status_test_dapp.request_contact_code_button.click_until_presence_of_element(status_test_dapp.deny_button)
status_test_dapp.deny_button.click()
if status_test_dapp.element_by_text(user['public_key']).is_element_displayed():
self.errors.append('Public key is returned but access was not allowed')
status_test_dapp.request_contact_code_button.click_until_presence_of_element(status_test_dapp.deny_button)
status_test_dapp.allow_button.click()
if not status_test_dapp.element_by_text(user['public_key']).is_element_displayed():
self.errors.append('Public key is not returned')
status_test_dapp.get_empty_dapp_tab()
home.wallet_button.click()
home.just_fyi("Checking sign typed message")
home.open_status_test_dapp(allow_all=True)
status_test_dapp.transactions_button.click_until_presence_of_element(status_test_dapp.sign_typed_message_button)
send_transaction = status_test_dapp.sign_typed_message_button.click()
send_transaction.enter_password_input.send_keys(common_password)
send_transaction.sign_button.click_until_absense_of_element(send_transaction.sign_button)
if not status_test_dapp.element_by_text_part('0x1673d96e836').is_element_displayed(30):
self.errors.append("Hash of signed typed message is not shown!")
home.just_fyi("Checking deploy simple contract")
send_transaction = status_test_dapp.deploy_contract_button.click()
send_transaction.sign_transaction()
if not status_test_dapp.element_by_text('Contract deployed at: ').is_element_displayed(240):
self.errors.append('Contract was not created')
for text in ['Call contract get function',
'Call contract set function', 'Call function 2 times in a row']:
status_test_dapp.element_by_text(text).scroll_to_element()
self.errors.verify_no_errors()
@marks.testrail_id(5429)
@marks.medium
def test_set_currency(self):
@@ -540,7 +646,7 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase):
@marks.transaction
@marks.medium
def test_custom_gas_settings(self):
sender = wallet_users['B']
sender = transaction_senders['ETH_7']
sign_in = SignInView(self.driver)
sign_in.recover_access(sender['passphrase'])
wallet = sign_in.wallet_button.click()
@@ -653,8 +759,8 @@ class TestTransactionWalletMultipleDevice(MultipleDeviceTestCase):
@marks.medium
@marks.transaction
def test_can_send_all_tokens_via_max_option(self):
sender = transaction_senders['V']
receiver = transaction_recipients['K']
sender = transaction_senders['ETH_STT_2']
receiver = transaction_senders['ETH_1']
self.create_drivers(2)
device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
home_1, home_2 = device_1.recover_access(sender['passphrase']), device_2.recover_access(receiver['passphrase'])
@@ -8,6 +8,7 @@ from views.chat_view import ChatView
# TODO: moved here until resolve of 13048
@pytest.mark.xdist_group(name="group_chat_3")
@marks.critical
class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
@classmethod
@@ -41,8 +42,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
cls.chats[0].send_message(cls.message_before_adding)
@marks.testrail_id(3994)
@marks.critical
def test_group_pn_system_messages_when_invited(self):
def test_group_chat_push_system_messages_when_invited(self):
self.homes[1].just_fyi("Check system messages in PNs")
self.homes[1].put_app_to_background()
self.homes[1].open_notification_bar()
@@ -73,8 +73,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700731)
@marks.critical
def test_group_join_send_text_messages_pn(self):
def test_group_chat_join_send_text_messages_push(self):
message_to_admin = self.message_to_admin
[self.homes[i].home_button.double_click() for i in range(3)]
self.homes[1].get_chat(self.chat_name).click()
@@ -105,8 +104,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(700732)
@marks.critical
def test_group_add_new_member_activity_centre(self):
def test_group_chat_add_new_member_activity_centre(self):
[self.homes[i].home_button.double_click() for i in range(3)]
self.homes[0].get_chat(self.chat_name).click()
self.chats[0].add_members_to_group_chat([self.usernames[2]])
@@ -126,8 +124,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(3998)
@marks.critical
def test_group_offline_pn(self):
def test_group_chat_offline_pn(self):
[self.homes[i].home_button.double_click() for i in range(3)]
chat_name = 'for_offline_pn'
self.homes[0].create_group_chat([self.usernames[1], self.usernames[2]], chat_name)
@@ -163,8 +160,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(5756)
@marks.critical
def test_group_decline_invite_chat_highligted(self):
def test_group_chat_decline_invite_chat_highligted(self):
chat_name = 'for_invited'
left_system_message = self.chats[0].leave_system_message(self.usernames[1])
[self.homes[i].home_button.double_click() for i in range(3)]
@@ -193,8 +189,7 @@ class TestPublicChatMultipleDeviceMerged(MultipleSharedDeviceTestCase):
self.errors.verify_no_errors()
@marks.testrail_id(3997)
@marks.critical
def test_group_leave_relogin(self):
def test_group_chat_leave_relogin(self):
self.drivers[2].quit()
[self.homes[i].home_button.double_click() for i in range(2)]
self.homes[0].home_button.double_click()
+1 -1
View File
@@ -81,7 +81,7 @@ def get_capabilities_sauce_lab():
desired_caps['deviceName'] = 'Android GoogleAPI Emulator'
desired_caps['deviceOrientation'] = "portrait"
desired_caps['commandTimeout'] = 600
desired_caps['idleTimeout'] = 600
desired_caps['idleTimeout'] = 800
desired_caps['unicodeKeyboard'] = True
desired_caps['automationName'] = 'UiAutomator2'
desired_caps['setWebContentDebuggingEnabled'] = True
-404
View File
@@ -1,404 +0,0 @@
basic_user = dict()
basic_user['passphrase'] = "tree weekend ceiling awkward universe pyramid glimpse raven pair lounge grant grief"
basic_user['username'] = "Royal Defensive Solenodon"
basic_user['public_key'] = "0x042e0309b5f6bedee93a1b984af08f89a101aff62d01ddd0a1c8f4a1d4db3b91e648c914019d09de9f07dd" \
"baacb77fdf07e89b5e0d60e9a8df05b75f213661fcad"
basic_user['address'] = "f184747445c3B85CEb147DfB136067CB93d95F1D"
basic_user['special_chars_password'] = " !\"#$Á%Ö&'()*+Í, -./:ä;<=>?@[\\]^_`{|}~ "
ens_user = dict()
ens_user['passphrase'] = "fashion quality know robust copy neck stand embody entry task orient suggest"
ens_user['username'] = "Legal Vibrant Indianabat"
ens_user['public_key'] = "0x04359bb3e73cba0b815d71e562670ad00bb5d2db0d16cd1c4c92c668b61fde2274d6e487fcdffe66f913b3fea2a" \
"3058f53ce7946c2b501aa61a9ca8a883df72dc9"
ens_user['ens'] = 'statuse2e.eth'
ens_user['ens_upgrade'] = 'statuse2e'
ens_user['ens_another'] = 'status-another-ens-e2e.eth'
ens_user['address'] = '0x1eE3058Bd300246B4B20E687Efc9Eba81FF7814b'
user_mainnet = dict()
user_mainnet['passphrase'] = "gallery zoo inspire work used slush deliver surface adjust struggle lazy virtual"
user_mainnet['mainnet'] = {
'ETH': 0.000372125264,
'SNT': 60,
'DGD': 0.00001
}
user_mainnet['xdai'] = '0.0002 xDAI'
user_mainnet['bsc'] = '0.00001 BNB'
ens_user_ropsten = dict()
ens_user_ropsten['ens'] = 'nastya'
ens_user_ropsten['username'] = 'Thoughtful Stupendous Graywolf'
ens_user_ropsten['address'] = '0x58d8c3D70ce4FA4b9fb10a665C8712238746F2ff'
ens_user_ropsten['public_key'] = '0x045efbcc044e5ae21ac3cf111ea6df6186e0cc50a2cd747f52a56d19ce516e683c66cb47f4b0a211108' \
'59aea9592dfba1e0bf4af11ff3eab995f844b3673643bf1'
ens_user_message_sender = dict()
ens_user_message_sender['ens'] = 'ensmessenger'
ens_user_message_sender['username'] = 'Glaring Plush Arkshell'
ens_user_message_sender['passphrase'] = 'tribe life dune clog throw situate robust gospel panic blanket timber eagle'
ens_user_message_sender['address'] = '0x75fF623fe856012b0667876582038A63F4004184'
ens_user_message_sender[
'public_key'] = '0x0471e18b2a9867161383919d85741389a829299ae0833c23e003818c1222942f5dddcbb792daee7c88' \
'e8a30ee44c00d03240a971d90d76ed8200b75572241da9ef'
dummy_user = dict()
dummy_user['username'] = "Vain Wordy Hagfish"
dummy_user['passphrase'] = "near broom kiss excess sad switch slab melt trade crash spare dinner"
dummy_user['public_key'] = "0x04596348471aa19d31c8503fa00f95abd0fc3ca908668817284b52b7ced95f966cc13457254aa908aa8e64" \
"a2748453accf9d358b8d7a1448597201c664dc280e37"
dummy_user['address'] = "0xdF6Bc71206d7ea89ec905a7f5ce8Ff34C85eB04e"
upgrade_users = dict()
upgrade_users['chats'] = dict()
upgrade_users['chats']['passphrase'] = 'identify level pink lift choose winner hour onion style festival rather salmon'
upgrade_users['chats']['public_key'] = '0x045d8a344ffee0c5ce187d0248a9b8ffc4a12493c9d9e8b9a395f38' \
'825ebe55ac2350d9e7090e39e6c8d7020aaa799aefe563f1db5b6151370eae246558772ad9e'
upgrade_users['chats']['username'] = 'Rapid Gleeful Cheetah'
wallet_users = dict()
wallet_users['A'] = dict()
wallet_users['A']['passphrase'] = "heavy earn fence pool drift balcony act coast stairs basic juice hip"
wallet_users['A']['username'] = "Equatorial Navyblue Tegus"
wallet_users['A']['address'] = "c8f8b3376814d0dfe61e4b9eaf7970697c24f6b2"
wallet_users['A']['public_key'] = "0x04fa759cc29261fd7779cf8b3566de61e3fb22aca4699a0a77a930a4f5af83b6f922a9cd67" \
"9a957fdab86e277e4bb7ec90f7998d21fc16690397d3783b8d8711e1"
wallet_users['B'] = dict()
wallet_users['B']['passphrase'] = "unknown endless ill average shell foil kitchen runway left race neither exhaust"
wallet_users['B']['username'] = "Bulky Able Firecrest"
wallet_users['B']['address'] = "0F3EFF5CacEe63045be97281316457fb78dd659E"
wallet_users['B']['public_key'] = "0x04f3c372522a087bd6895a67b669601e6b6825b2ee7add5942d10efd1c3c836a1d9a677d94d33" \
"895833b6ebe523f0fe5965f73558da58520a3f9c7a00e73f75d61"
wallet_users['C'] = dict()
wallet_users['C']['passphrase'] = "purchase ensure mistake crystal person similar shaft family shield clog risk market"
wallet_users['C']['username'] = "Mellow Virtual Nubiangoat"
wallet_users['C']['address'] = "8DcE052cCda2F6F6B555759cEe6957e04A6dDf5B"
wallet_users['C']['public_key'] = "0x040e562b69362e7e57492bca50b6095acfa636c48b85eef2bc0e4180b6e99fc5e73f45c3" \
"40837da01728d4585695fda7f1de2ed193a1dd4080291d90812e1cae77"
wallet_users['C']['private_key'] = '7800C28310576645BBF6BF6355F7AA4CEC659B1713AF7E7713E1A33097A3DDF6'
# Do not use this user for send/receive transactions
wallet_users['D'] = dict()
wallet_users['D']['passphrase'] = "hen mango since lottery laundry flag report whisper cycle rate festival carry"
wallet_users['D']['username'] = "Competent Rectangular Albino"
wallet_users['D']['address'] = "80B663E82657Caf5657ce79b11aEaEDa02C6CD92"
wallet_users['D']['public_key'] = "0x04f79d02bab51efe903645e74b23df471b041ce3c964a5cf376c7ae572039569af7cf934d094e" \
"86b2177db49b6943d0c8720550e39868ef5c7108ebffb5522b140"
wallet_users['E'] = dict()
wallet_users['E']['passphrase'] = "record sphere illegal section blame swing wreck estate celery same excite summer"
wallet_users['E']['username'] = "Wry Shiny Damselfly"
wallet_users['E']['address'] = "0x3e2e4077753d3c229a9ae332b9ca46958945e2f6"
wallet_users['E']['public_key'] = "0x044cf0620ec3ea0aba9fb0e19cb42a6fbd6b4e74f234f0da82580564817b238cc6434745d31" \
"fa1649927ba48adfa7c95991fd51940bc00a71e80b095db5b107f1b"
wallet_users['E']['collectibles'] = {
'Coins & Steel Exclusive Item Skin V2': '1',
'Coins & Steel Founder Aura': '1',
'CryptoKittiesRinkeby': '2',
'KudosToken V7': '1',
}
wallet_users['F'] = dict()
wallet_users['F']['passphrase'] = "jazz human replace save wreck merry evolve oval black expose clutch sword"
wallet_users['F']['username'] = "Dual Sour Galapagostortoise"
wallet_users['F']['address'] = "0x8A4339aE98df2B2e51E37631C8B4F853048D4556"
wallet_users['F']['public_key'] = "0x049d0b39d95b20114fac79c3173a36c60a126c060dce52bba4128ab9a3885f0f058f2af9c92099" \
"315eb564412b718d8bfe697a4425e4bc603063abd4f5c45f8e57"
# Users used in chats. E.g. as members of a group chat
chat_users = dict()
chat_users['A'] = dict()
chat_users['A']['passphrase'] = "canoe edit leg exit game glue blame electric bar now box point"
chat_users['A']['username'] = "Petty Mediumaquamarine Avians"
chat_users['A']['address'] = "0x5626db866676d70f5fa58366d8df3b1053b8d9cc"
chat_users['A']['public_key'] = "0x0445c001a3b365b55304e2cd23b8418a8381786d96be01a69cf7569786086a2a4c7b2a602ea" \
"355c85225ae1e7b0444a666fefe9902b465414e6c0ef0b5997b073a"
chat_users['B'] = dict()
chat_users['B']['passphrase'] = "found ridge build seven whisper enact weekend nation during law external december"
chat_users['B']['username'] = "Repentant Velvety Adeliepenguin"
chat_users['B']['address'] = "0xB094A8c0A3F71e3246C3eD89a51f81008c800088"
chat_users['B']['public_key'] = "0x0439a66cd420082741147ef8b1ab9c8d8558d21f2cc3cb4099fd0aa5507c5d8bdb94ded8beccfa" \
"2812f6b641de9f9c31fa62379af6d148fdec45335196b2e6307b"
transaction_senders = dict()
transaction_senders['A'] = dict()
transaction_senders['A']['passphrase'] = \
'night fortune spider version version armed amused winner matter tonight cave flag'
transaction_senders['A']['username'] = 'Darkorchid Clueless Ewe'
transaction_senders['A']['address'] = 'efca4fd47b98b9f01c4eef4827e576a01459728a'
transaction_senders['A']['public_key'] = "0x046c0ec05e1f13481af0e3d9cc7869e6f1b64306adcfb325827518c66f4ea3dafbd18de3" \
"0269f95aadcf3aae40a27075505b625c1cd08b41a335b318bf3fe7ca21"
transaction_senders['B'] = dict()
transaction_senders['B']['passphrase'] = \
"quality walk globe dune rally distance fragile year turn horror sample lobster"
transaction_senders['B']['username'] = "New Awesome Tenrec"
transaction_senders['B']['address'] = "a456a6bde144695879a754b19dd13e9f75ea43f2"
transaction_senders['B']['public_key'] = "0x04b9687c94bc9d573d7455d9fed1039253b1fa063afda5ca3280de605208c760202479645" \
"ff84755d5bf20cc029daa0881c94cab9a65bdfe9568849efe4ac707e3"
transaction_senders['C'] = dict()
transaction_senders['C']['passphrase'] = "potato labor object reward minor casino dismiss size flame task winter report"
transaction_senders['C']['username'] = "Breakable Productive Prayingmantis"
transaction_senders['C']['address'] = "549b9bcd069d720390a6819ff8b3d9dd252fa3be"
transaction_senders['C']['public_key'] = "0x048536ec9fcc25e879920fb548a484de5be64b4a93a0b16c6d78deb1d140ac636ed3ca1" \
"d86e17a75f83422ab651f0743c162ffb006707721719e02d2cbd5f54d51"
transaction_senders['D'] = dict()
transaction_senders['D']['passphrase'] = "weekend unable empty crime blind rhythm crunch answer travel coast silly like"
transaction_senders['D']['username'] = "Indelible Dapper Hoatzin"
transaction_senders['D']['address'] = "616874dc6cc2810cdc930dea26496fcf217d58ca"
transaction_senders['D']['public_key'] = "0x044764a9ba22bb4ae355619ca3824ee66b9f704c7fc08280e6305112bf80fd96b2fcd73" \
"d0dd570471986c229c077c8053ee47784416eb6604d52e41f8f9d566ef8"
transaction_senders['E'] = dict()
transaction_senders['E'][
'passphrase'] = "sea ill guard bounce gesture tomato walnut fitness plastic affair oven transfer"
transaction_senders['E']['username'] = "Fatal Metallic Imperialeagle"
transaction_senders['E']['address'] = "f7cb60839c0de25e37be0391c33bb34a8f0f8414"
transaction_senders['E']['public_key'] = "0x04db6128352e5c2d05ee5a6556848453cf3a7af34e94b3e20a302de684e9906461e38adf" \
"51c39e1abf20f5ae7f418e0383633e08d7acee31d4aaee0473af2e6ed8"
transaction_senders['F'] = dict()
transaction_senders['F']['passphrase'] = "style case lazy pole general section dawn royal slice evoke crowd boat"
transaction_senders['F']['username'] = "Lightsalmon Wry Umbrette"
transaction_senders['F']['address'] = "a94a2a7584620677d290549a96046e59a18f09ef"
transaction_senders['F']['public_key'] = "0x044f13fa489032ad7fefd82a5d9dedc40ab3787096ef2870848a7537b26c5262ea7a29b" \
"53026d1cbf992b99bce5d0609a933a06f89fb6206606b34a43c1f160e35"
transaction_senders['G'] = dict()
transaction_senders['G']['passphrase'] = "load other time gadget fury sudden gossip hurry entry curtain jaguar inflict"
transaction_senders['G']['username'] = "Acidic Focused Xantus"
transaction_senders['G']['address'] = "876c331d60aedd175ca78cb6a50eaeb9681a1868"
transaction_senders['G']['public_key'] = "0x04885bb487d9e8c3b51f963e564669118f7a9bead224df5334dd3242d463dc0420b2c1e" \
"2dfced6dc9dca1a36771584e2edb83da39edaaae969616254f26da5b07a"
transaction_senders['H'] = dict()
transaction_senders['H']['passphrase'] = "age three camp tip jump radio copper merry mention top panther motor"
transaction_senders['H']['username'] = "Fine Huge Beagle"
transaction_senders['H']['address'] = "762d87f77c88048281ddad78501fcfe0700f08ce"
transaction_senders['H']['public_key'] = "0x042b9be3f4887d0504ebc31f42e809919641e95ed98ba9b643961019ad6af7bc258064d" \
"ca2ca860f182e4f528a9be3d969e4536f04f3e4e1b9203e16b57508ec1b"
transaction_senders['I'] = dict()
transaction_senders['I']['passphrase'] = "six runway asthma blur secret rebuild parent logic horror decline rib buyer"
transaction_senders['I']['username'] = "Finished Infatuated Whiteeye"
transaction_senders['I']['address'] = "0887afe0ee3e1b195f596350bb04bba034514af9"
transaction_senders['I']['public_key'] = "0x04e61e616f881383e807cd1fb714fa2e06b5ad1cb6cd7b97a9265da2ad9a133ee750954a" \
"6c4da3635f2e406b310f6e294ca94ea3a686287a1276e4e86612886f8e"
transaction_senders['K'] = dict()
transaction_senders['K']['passphrase'] = "fly west avoid depend tape direct foster off cry crucial blame elegant"
transaction_senders['K']['username'] = "Decimal Healthy Harpyeagle"
transaction_senders['K']['address'] = "6a4dd6e2dcef1139cd04e6a24c19ded819340f85"
transaction_senders['K']['public_key'] = "0x044ab7a9d8f6f146a52534327bd301e85afe02b61108a03cd5afdd1c555f7268e46cb8ac" \
"37636f3590f9fed80a1124d78be041d010dba61d09f6278dee272dc661"
transaction_senders['L'] = dict()
transaction_senders['L']['passphrase'] = "road rabbit tuna bacon man raccoon equal note cream rescue core chunk"
transaction_senders['L']['username'] = "Funny Lavish Goldfinch"
transaction_senders['L']['address'] = "002881321fd06d77ba2deed035140631f49506be"
transaction_senders['L']['public_key'] = "0x04dfe571200b1cf05b1f743f5730a833da60b46de9437d29c0573c4970ba8e8e5980f76b" \
"80aa71a7e66b54235e869ade8f91dfde925d06ef3b2397fa007540dd34"
transaction_senders['M'] = dict()
transaction_senders['M']['passphrase'] = "thank fruit brisk pond opera census grid husband claw sight chunk arena"
transaction_senders['M']['username'] = "Wellgroomed Impartial Cornsnake"
transaction_senders['M']['address'] = 'bd4e3eede0f942b843a031007190c08cab373248'
transaction_senders['M']['public_key'] = "0x04d52c290fbd4f32bba82e5efa673d8f6aaf698f99ed16266662acd0cd583ee534703c547" \
"a06e24b4a2244c6788e2e92f22aa95f0ad999d07e6b993c9274132e13"
transaction_senders['N'] = dict()
transaction_senders['N']['passphrase'] = "label ill slender audit atom love vote snap edit program climb beyond"
transaction_senders['N']['username'] = "Immaculate Aqua Banteng"
transaction_senders['N']['address'] = 'd117188dbf1c160074cc4850a1d140286fdfc831'
transaction_senders['N']['public_key'] = "0x04331e35cdb205e201502719edb97c307f5f997dd58aa68d9f6378188f4ed8ccf0b3908e" \
"f0151f60aa639c3652937e9df30f1c0c1b8b43f922167c5c0447dda6b5"
transaction_senders['O'] = dict()
transaction_senders['O']['passphrase'] = "you salmon ticket antique spray panther flee neck scale mad trial exile"
transaction_senders['O']['username'] = "Wavy Yellow Rainbowfish"
transaction_senders['O']['address'] = '45798efe501340efbe265bce950f9ddcad8d7ce5'
transaction_senders['O']['public_key'] = "0x045925e701303feb8c1c98be2c9825e2c1c7005a0da7ab509d2d989e1d837c064fc8e06be" \
"51b417113f55cfe147cf7413c4016df748c29a6fd2efe20b2d8f59a05"
transaction_senders['P'] = dict()
transaction_senders['P']['passphrase'] = "warm beach mind real stay oil evil giggle core tilt paddle invest"
transaction_senders['P']['username'] = "Grave Able Arcticfox"
transaction_senders['P']['address'] = "9164f86170290ba3080e37d19d1953d3c5945913"
transaction_senders['P']['public_key'] = "0x04a7d3e9f637325f6195607ec5b60d1198487da9f172cc717729fa475f6ea682a93dc56" \
"f00bbb3652e014d9569da5bf3de0e1ba98884fcb64d3ca5a724eb24cfbc"
transaction_senders['Q'] = dict()
transaction_senders['Q']['passphrase'] = "junior forum symptom twin route scare source cycle extra engage worth prison"
transaction_senders['Q']['username'] = "Jealous Third Howlermonkey"
transaction_senders['Q']['address'] = "e9fd13b1bcfff497f21b28e141fa2e5049ebcee4"
transaction_senders['Q']['public_key'] = "0x044cee9f6c12a46da7142d5fa3cc29e34f1a82d22435cebcd73d41981a73577cd31adc38b" \
"b6b747dfa75857d452b94630b4672b80e6fc8d6974421b95fcf9d6513"
transaction_senders['R'] = dict()
transaction_senders['R']['passphrase'] = "ahead warrior poet radio image topic wasp clever banner angry age quality"
transaction_senders['R']['username'] = "Icky Tan Flickertailsquirrel"
transaction_senders['R']['address'] = "d54bf6c67e349bf889fd5d411a8c410b3a4cc099"
transaction_senders['R']['public_key'] = "0x04ec7a5b6cd54a2d7aa7f156013870e8c7559a14239752dfbe879167b3deb55fc713da44d" \
"096fd2e02aac143cb8999139ebd4a07b7e7c1fd72cc192a2a2f576682"
transaction_senders['S'] = dict()
transaction_senders['S']['passphrase'] = \
"tree capable picnic swap venture correct open enforce assault news inform pear"
transaction_senders['S']['username'] = "Cyan Intent Meadowlark"
transaction_senders['S']['address'] = "061fae3dd75beab5855f584837ca0c0a8e84f5c1"
transaction_senders['S']['public_key'] = "0x04579ab8085e685a6ab1dee8435b05bcb04c8332d22f96ecc7300da95e7565c8e4a950a6f" \
"b1809db7590ad87d28c7aec58632e8870cb642df839252e356010a9eb"
transaction_senders['T'] = dict()
transaction_senders['T']['passphrase'] = \
"describe adult cat kidney disagree stick timber unaware yellow jungle leave warrior"
transaction_senders['T']['username'] = "Faithful Specific Brownbutterfly"
transaction_senders['T']['address'] = "7e33ab11ae8ca21e8d3c15ceb74b6cc429834b5b"
transaction_senders['T']['public_key'] = "0x04cd6e1b7c76bd7abe54c8cd30fb1be6a08233d9c77b298700c3983d812c98698963c9db" \
"4b0c4648de69237e9e140397258f3e3bdd526a11a37c64c477be4953fa"
transaction_senders['U'] = dict()
transaction_senders['U']['passphrase'] = "club script position scare face medal already quality company flat item pill"
transaction_senders['U']['username'] = "Qualified Gifted Prayingmantis"
transaction_senders['U']['address'] = "b92496fffd668c2de08694623303456aa98cdf33"
transaction_senders['U']['public_key'] = "0x048f6828bad09baabbead08de7fc9672d6d15d6433e7941d99322bf0f61f3b5891a2bf740" \
"2027fd46896b869d46ae85c7096d4a47d7184682fa14bee7bb772f29a"
transaction_senders['V'] = dict()
transaction_senders['V']['passphrase'] = "true bus equip ensure speed blame universe renew gasp clip glide unaware"
transaction_senders['V']['username'] = "Likely Imaginary Hound"
transaction_senders['V']['address'] = "785acde6058a670e674aa0f66ccbabe98bbce7b1"
transaction_senders['V']['public_key'] = "0x04ebd187fba2169f7544fc5c1cee4f486c2d498d94f42ed4b570420b6e926da163bc514b" \
"7f3b234bcad3062a48cacf51411d2f7e4dfd079d8eabdfd12f0ee774f6"
transaction_senders['W'] = dict()
transaction_senders['W']['passphrase'] = \
"setup portion luxury fatigue unhappy position pioneer sell angry trust hat magic"
transaction_senders['W']['username'] = "Stable Blueviolet Stonefly"
transaction_senders['W']['address'] = "d5de9a58a3eab0643ecbd01729312215ef647a4d"
transaction_senders['W']['public_key'] = "0x04e801e4cf211a7846fdd96c6591cf75f5c37cb8df6b1bd5c9e4471b6b3f7f2936d29dc93" \
"4820ea0fabd460b90aef3b66c7b1552baf60146ba8fc354c2fa22b3cf"
transaction_senders['X'] = dict()
transaction_senders['X']['passphrase'] = "denial lend kit learn jacket mail ceiling crack affair stool spike sound"
transaction_senders['X']['username'] = "Polite Experienced Hackee"
transaction_senders['X']['address'] = "0xc9cf2ff3ca98a91f2e3dfc35a13cf8425ecaf082"
transaction_senders['X']['public_key'] = "0x04907b745916c763613654a9a679c6b04da97c142c2ad1f08ebe9412e9745fd9721d5237b" \
"9374a2b3217da001c50481e83467cb98b1a9bd1ed50501638db1f08bd"
transaction_senders['Y'] = dict()
transaction_senders['Y']['passphrase'] = "slight thunder cup divorce hawk paper blush memory shaft extend laundry bone"
transaction_senders['Y']['username'] = "Navajowhite Goldenrod Rasbora"
transaction_senders['Y']['address'] = "0x2a5ed44a7092404ae08369ffde6e54ce47e3761c"
transaction_senders['Y']['public_key'] = "0x04245454f9fe931133388a228bd9ed98e36ad1969f76a027bf92d3a0f26a44ee168a2c790" \
"35d4d1c49b0b932b2f093c3636a11bb8d893f4d719e4d61d9bd52f278"
transaction_senders['Z'] = dict()
transaction_senders['Z']['passphrase'] = "congress club image core lens hope clever transfer tiny true alien favorite"
transaction_senders['Z']['username'] = "Ill Brisk Cleanerwrasse"
transaction_senders['Z']['address'] = "29ff033fa04f5ba4192823ddbf23f8397809995c"
transaction_senders['Z']['public_key'] = "0x04563c506aaf728a37e19b00dd3db3d0e44acd01069191a68e4063ed09bc47e91eac5e0c" \
"7c77fae568960ec9ce7f1ba7b49d3b930389e387665dcde213c344eafc"
transaction_recipients = dict()
transaction_recipients['A'] = dict()
transaction_recipients['A']['passphrase'] = "lesson pull call also fork credit cycle spray purity force sail hub"
transaction_recipients['A']['username'] = "Genuine Sane Islandcanary"
transaction_recipients['A']['address'] = 'd630b1224683a438582e3e14e35ba5e03513eaab'
transaction_recipients['A']['public_key'] = "0x040f0b01746f3bad9887ffcd6f2099382b0713bcbaa00883709200b17fc65563d9278" \
"200ac1e095e0c5993e95427b44aa93e981798b19b4256f1058125518ec07b"
transaction_recipients['B'] = dict()
transaction_recipients['B']['passphrase'] = "night grit town donate length zoo meat collect vapor brush topic check"
transaction_recipients['B']['username'] = "Glass Poised Spoonbill"
transaction_recipients['B']['address'] = "1fc705a336a0a2e48eb3c953ce577e591f2767ad"
transaction_recipients['B']['public_key'] = "0x0476459f2e03920dec063bab5e7e85443bda598a97746cab7eb306d9bcb99fe2548af" \
"301922bc84030ad181876401faef0eda4019fdae1a5cc1b41435536317906"
transaction_recipients['C'] = dict()
transaction_recipients['C']['passphrase'] = "pig public focus dream mango match use aunt machine potato depend toilet"
transaction_recipients['C']['username'] = "Concrete Khaki Velvetcrab"
transaction_recipients['C']['address'] = "702995aa7dc6aad543661aab35494f4986022659"
transaction_recipients['C']['public_key'] = "0x04547d1bdec51a73b4df80c2a6bfa873e38f9c6f5ebeb71ab0350e3baf6e545b34a888" \
"f34e5e26889a79cbb4b28d32c82fce052788172328a3ddb59970978de14f"
transaction_recipients['D'] = dict()
transaction_recipients['D']['passphrase'] = "dog smooth myth loud unveil excite chimney cousin rain license cross palm"
transaction_recipients['D']['username'] = "Blushing Occasional Nudibranch"
transaction_recipients['D']['address'] = "e71c43413559e40ebcb602fb95c33662926cc000"
transaction_recipients['D']['public_key'] = "0x041ff79cb8e5a8280bcc80d9d28810ae08c96b3558238e0c87f806baffdd3fbeccde9a" \
"041c745fc15ffa7ec428a135edb11ff32104e054de644194509c733e5269"
transaction_recipients['E'] = dict()
transaction_recipients['E']['passphrase'] = "private dial force harsh crunch bottom draw fish image used notable school"
transaction_recipients['E']['username'] = "Devoted Frank Alpineroadguidetigerbeetle"
transaction_recipients['E']['address'] = "5c1d183ca67f651d864a2c88318c05dc0e32f188"
transaction_recipients['E']['public_key'] = "0x0429f5d1588be860c24ff57b699366bf5e3e25fc697be5e204adfd4cd438de42db5f2" \
"a6fd860b7431a3c91f5f2e1bc8703c0e92b8beb19c8979c1e11550b9e7ce6"
transaction_recipients['F'] = dict()
transaction_recipients['F']['passphrase'] = "gather please ritual cactus plunge cruel foil armor sock topic fence urge"
transaction_recipients['F']['username'] = "Pretty Super Myna"
transaction_recipients['F']['address'] = "81e0b035fe73f4f1aefeb5c75537c7d9b423149f"
transaction_recipients['F']['public_key'] = "0x04adbd5386508ecfb493d663f3c197aeebc2e3953492680489ee66d5d208e573c20eb" \
"4f0cead0c5634f29df6921f08f8fb5b3cb8a15cb91330d58d37b3358783e6"
transaction_recipients['G'] = dict()
transaction_recipients['G']['passphrase'] = \
"spray tired dentist case please list occur envelope they across picture spatial"
transaction_recipients['G']['username'] = "Acrobatic Foolish Marabou"
transaction_recipients['G']['address'] = "b1f8b0db0f12e45d7712625bc53535235d245a9f"
transaction_recipients['G']['public_key'] = "0x04659aa00141aa2f9a0658f56427f3ee06abb7218f5c8a5c6afd377581fde3c474645" \
"334f7cfd2faeac627e65536dca578bc0bad3f91bba0862de5ebac98ef4eeb"
transaction_recipients['H'] = dict()
transaction_recipients['H']['passphrase'] = \
"rail change device celery metal husband panda avoid often shiver payment real"
transaction_recipients['H']['username'] = "Prudent Big Nerka"
transaction_recipients['H']['address'] = "0xe9676a57a28800d83301d9d3f9c77fd2e933609c"
transaction_recipients['H']['public_key'] = "0x042b6405c7a4c34342c950cfb330f779ab27f49bc58f35e204fd927abda4706f1b9367" \
"cd68166661a62266447ecfe4f320280174e87f3c7867a3c6583c1933ab5a"
transaction_recipients['I'] = dict()
transaction_recipients['I']['passphrase'] = \
"engine equal wisdom saddle icon spring express limit surprise salute unique rose"
transaction_recipients['I']['username'] = "Teal Sienna Perch"
transaction_recipients['I']['address'] = "0x4e6c60f344b13d730682f0a6d8ae1255c75e730e"
transaction_recipients['I']['public_key'] = "0x041f67fd8c2c4fd2ece77b51a72bb9e31ba8848af8585b4c7e8fcf8f77a750faa868" \
"ada014c77fcb11b9a5342e188d8892b669320dc4f9e6283fb7bdf1dd33897a"
transaction_recipients['J'] = dict()
transaction_recipients['J']['passphrase'] = "estate add believe wonder riot used brain wing lecture misery order echo"
transaction_recipients['J']['username'] = "Seashell Amazing Gemsbuck"
transaction_recipients['J']['address'] = "0xa03a75b7888cac24b35b4d1f5924406f3b491795"
transaction_recipients['J']['public_key'] = "0x04e7e481932714c1a13ffb29fc79446ee9f30d27b4dec47af9dcd20c68a771c2520a0e" \
"7a80804ff59a750693492a65be9682d0b850b4080d976cf9e43ff37ec841"
transaction_recipients['K'] = dict()
transaction_recipients['K'][
'passphrase'] = "core orphan clerk involve trade admit exhibit valid short canvas disorder world"
transaction_recipients['K']['username'] = "Upright Authorized Waterstrider"
transaction_recipients['K']['address'] = "0x6a1aC3a7a5A064FF6E0f169E0d384703245556b4"
transaction_recipients['K']['public_key'] = "0x04d1c98a6e25a7ea0241349a41709c5dc51c7c1d59224076d13d1ebe16671eedc8f" \
"3b23ab95db679a9124752ed77339424034fd9a12f0184894c0d7a25710d2f3c"
recovery_users = {
"radar blur cabbage chef fix engine embark joy scheme fiction master release":
"0xaC39b311DCEb2A4b2f5d8461c1cdaF756F4F7Ae9",
"fruit wave dwarf banana earth journey tattoo true farm silk olive fence":
"0x31a4aD7593D06D049b3Cc07aB5430264Bf7e069f",
"board flee heavy tunnel powder denial science ski answer betray cargo cat":
"0x7B9BC6897BbbEbD5e3F1D71e1d0Af035F35a714a",
"vessel ladder alter error federal sibling chat ability sun glass valve picture":
"0x93bb483bD2D0190d48778bA21F7D85F793bBcEd0",
"legal winner thank year wave sausage worth useful legal winner thank yellow":
"0x58A57ed9d8d624cBD12e2C467D34787555bB1b25",
"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon "
"abandon abandon abandon abandon abandon abandon abandon abandon abandon art":
"0xF278cF59F82eDcf871d630F28EcC8056f25C1cdb",
"legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner "
"thank year wave sausage worth title":
"0x2f826cb22E80a2c40f149Ecb92b2Fa5ecBf67170"
}
+1 -1
View File
@@ -506,7 +506,7 @@ class BaseView(object):
@staticmethod
def get_unique_amount():
return '0.00%s' % datetime.now().strftime('%-d%-H%-M%-S').strip('0')
return '0.000%s' % datetime.now().strftime('%-d%-H%-M%-S').strip('0')
@staticmethod
def get_random_chat_name():
+2 -2
View File
@@ -58,8 +58,8 @@ class DappsView(BaseView):
from views.web_views.base_web_view import BaseWebView
web_view = BaseWebView(self.driver)
if not self.enter_url_editbox.is_element_displayed():
web_view.open_tabs_button.wait_and_click()
web_view.open_new_tab_plus_button.click()
web_view.open_tabs_button.click_if_shown()
web_view.open_new_tab_plus_button.click_if_shown()
self.enter_url_editbox.wait_for_visibility_of_element(20)
self.enter_url_editbox.click()
self.enter_url_editbox.send_keys(url)
Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

+1 -1
View File
@@ -280,7 +280,7 @@ class HomeView(BaseView):
if user_names_to_add:
for user_name in user_names_to_add:
if len(user_names_to_add) > 5:
chat_view.search_by_keyword(user_name[:4])
chat_view.search_by_keyword(user_name[:5])
chat_view.get_username_checkbox(user_name).click()
chat_view.search_input.clear()
else:
+2 -2
View File
@@ -25,11 +25,11 @@ dapps = {
}
}
wallets = {
'default' : {
'default': {
'name': 'Ethereum account1',
'address': '0x%s' % transaction_recipients['K']['address']
},
'generated' : {
'generated': {
'name': 'dapp',
'address': '0x6a0e09b209eEa2a448B2361dD27c06Fc1f316e6c'
},
+4 -1
View File
@@ -235,8 +235,11 @@ class WalletView(BaseView):
if not asset_value.is_element_displayed():
self.element = asset_value.scroll_to_element()
try:
return float(asset_value.text.split()[0])
value = float(asset_value.text.split()[0])
self.driver.info("%s value is %s" % (asset, value))
return value
except ValueError:
self.driver.info("No value for %s" % asset)
return 0.0
def asset_by_name(self, asset_name):

Some files were not shown because too many files have changed in this diff Show More