Compare commits

..
64 changed files with 1107 additions and 1431 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.18'
library 'status-jenkins-lib@v1.9.17'
/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.18'
library 'status-jenkins-lib@v1.9.17'
import groovy.json.JsonBuilder
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.18'
library 'status-jenkins-lib@v1.9.17'
pipeline {
agent { label 'linux' }
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.18'
library 'status-jenkins-lib@v1.9.17'
/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.18'
library 'status-jenkins-lib@v1.9.17'
/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
+2 -2
View File
@@ -920,7 +920,7 @@ PODS:
- glog
- RCT-Folly (= 2022.05.16.00)
- React-Core
- react-native-compat (2.17.3):
- react-native-compat (2.11.2):
- glog
- RCT-Folly (= 2022.05.16.00)
- React-Core
@@ -1536,7 +1536,7 @@ SPEC CHECKSUMS:
react-native-blob-util: 600972b1782380a5a7d5db61a3817ea32349dae9
react-native-blur: b2b140d3d65077a1d5d26be62d9415f895592344
react-native-cameraroll: af8eec1e585d053ff485d98ec837f9a8a11b5745
react-native-compat: fd639220cca206df6c74b95df56a1809d78ba5a3
react-native-compat: 3af9add14d349701306d3d052638435f6795ac2c
react-native-config: 5330c8258265c1e5fdb8c009d2cabd6badd96727
react-native-get-random-values: 21325b2244dfa6b58878f51f9aa42821e7ba3d06
react-native-hole-view: 6935448993bac79f2b5a4ad7e9741094cf810679
@@ -35,11 +35,6 @@ class LogManager(private val reactContext: ReactApplicationContext) : ReactConte
return File(pubDirectory, gethLogFileName)
}
private fun getPreLoginLogFile(): File {
val pubDirectory = utils.getPublicStorageDirectory()
return File(pubDirectory, preLoginLogFileName)
}
fun prepareLogsFile(context: Context): File? {
val logFile = getGethLogFile()
@@ -161,7 +156,6 @@ class LogManager(private val reactContext: ReactApplicationContext) : ReactConte
val statusLogFile = File(logsTempDir, statusLogFileName)
val gethLogFile = getGethLogFile()
val requestLogFile = getRequestLogFile()
val preLoginLogFile = getPreLoginLogFile()
try {
if (zipFile.exists() || zipFile.createNewFile()) {
@@ -181,9 +175,6 @@ class LogManager(private val reactContext: ReactApplicationContext) : ReactConte
if (requestLogFile.exists()) {
filesToZip.add(requestLogFile)
}
if (preLoginLogFile.exists()) {
filesToZip.add(preLoginLogFile)
}
val zipped = zip(filesToZip.toTypedArray(), zipFile, errorList)
if (zipped && zipFile.exists()) {
zipFile.setReadable(true, false)
@@ -214,7 +205,6 @@ class LogManager(private val reactContext: ReactApplicationContext) : ReactConte
private const val gethLogFileName = "geth.log"
private const val statusLogFileName = "Status.log"
private const val requestsLogFileName = "api.log"
private const val preLoginLogFileName = "pre_login.log"
private const val logsZipFileName = "Status-debug-logs.zip"
}
}
@@ -35,7 +35,6 @@ RCT_EXPORT_METHOD(sendLogs:(NSString *)dbJson
NSURL *mainGethLogsFile = [rootUrl URLByAppendingPathComponent:@"geth.log"];
NSURL *mainLogsFile = [logsFolderName URLByAppendingPathComponent:@"geth.log"];
NSURL *preLoginLogFile = [rootUrl URLByAppendingPathComponent:@"pre_login.log"];
NSURL *requestsLogFile = [rootUrl URLByAppendingPathComponent:@"api.log"];
@@ -47,10 +46,6 @@ RCT_EXPORT_METHOD(sendLogs:(NSString *)dbJson
if ([fileManager fileExistsAtPath:requestsLogFile.path]) {
[fileManager copyItemAtPath:requestsLogFile.path toPath:[logsFolderName URLByAppendingPathComponent:@"api.log"].path error:nil];
}
if ([fileManager fileExistsAtPath:preLoginLogFile.path]) {
[fileManager copyItemAtPath:preLoginLogFile.path toPath:[logsFolderName URLByAppendingPathComponent:@"pre_login.log"].path error:nil];
}
[SSZipArchive createZipFileAtPath:zipFile.path withContentsOfDirectory:logsFolderName.path];
[fileManager removeItemAtPath:logsFolderName.path error:nil];
+270 -229
View File
@@ -8838,8 +8838,8 @@
"repo": "https://jitpack.io",
"files": {
"reflow-animator-1.0.6.pom": {
"sha1": "d2c5089ae74a366676d9432c401e373b4895858e",
"sha256": "sha256-uanUNC0CwC2YnlQ4rpZBMdp+Is6UF36Y/Iwn6YLLHno="
"sha1": "4fe3d33c764beebdc477d93a590f63dfa38a5f6b",
"sha256": "sha256-MEINlM+8v6LDFGREWswamEl17l26xa4eQHeKPcxbSI8="
},
"reflow-animator-1.0.6.aar": {
"sha1": "36074a3fcb77c2ba12bd2de7dde81441e0c7504f",
@@ -8898,20 +8898,20 @@
},
{
"path": "org/gradle/github-dependency-graph-gradle-plugin/1.3.2",
"path": "org/gradle/github-dependency-graph-gradle-plugin/1.3.1",
"repo": "https://plugins.gradle.org/m2",
"files": {
"github-dependency-graph-gradle-plugin-1.3.2.pom": {
"sha1": "0740a44f4c99d3e2d9fbc2c89afcb195ec66dbdf",
"sha256": "sha256-xaVDODswVgtoaoIAtgCELvnd8IAx8AYdJA+FE3a0Jxs="
"github-dependency-graph-gradle-plugin-1.3.1.pom": {
"sha1": "5d95862731c88c1e9190fa27a7bd2ffe3ab549d7",
"sha256": "sha256-Zk7PNeEBetpWAp4e2rN5A+zn0NDsG3G5kU62uPssiJo="
},
"github-dependency-graph-gradle-plugin-1.3.2.jar": {
"sha1": "ba3d0995475c6aa79048e865d7923bbed20f36a0",
"sha256": "sha256-VdNKG2xBu75P6hSlZaERE3ZxOSSwAaPMjD2EnGSejQA="
"github-dependency-graph-gradle-plugin-1.3.1.jar": {
"sha1": "c905642b753938ef0fa1cda1fc330fae1c4016aa",
"sha256": "sha256-0uYWjgzaasT18c62W6IElG2jW1Oe+X0O/4dflT5E61k="
},
"github-dependency-graph-gradle-plugin-1.3.2.module": {
"sha1": "879866cccedf304d8c484d3bb70eb6d699e9e118",
"sha256": "sha256-nBqz4Xbqelt3YhEAEG9aPzYC0+2MBcM1M+1Ys5PumhQ="
"github-dependency-graph-gradle-plugin-1.3.1.module": {
"sha1": "818778b46a93f8d60f11cfa83c7ecbb2481706d8",
"sha256": "sha256-agfZPNoTEZDEU5USp5slvtvCfm5OxZucX7XuZ9xugzU="
}
}
},
@@ -9052,16 +9052,16 @@
},
{
"path": "commons-codec/commons-codec/1.18.0",
"path": "commons-codec/commons-codec/1.17.1",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"commons-codec-1.18.0.pom": {
"sha1": "2aa7395e4e4d63be2fd4439da7a01527235f76bf",
"sha256": "sha256-dLkW2ksDhMYZ5t1MGN7+iqQ4f3lSBSU8+0u7L0WM3c4="
"commons-codec-1.17.1.pom": {
"sha1": "d187e2d50ab520895df0dcb9d88980ffea50bfa3",
"sha256": "sha256-f6DbTYFQ2vkylYuK6onuJKu00Y4jFqXeU1J4/BMVEqA="
},
"commons-codec-1.18.0.jar": {
"sha1": "ee45d1cf6ec2cc2b809ff04b4dc7aec858e0df8f",
"sha256": "sha256-ugBfMEzvkqPe3iSjitWsm4r8zw2PdYOdbBM4Y0z39uQ="
"commons-codec-1.17.1.jar": {
"sha1": "973638b7149d333563584137ebf13a691bb60579",
"sha256": "sha256-+fbLED8t3DyZqdgK2irnvwaFER/Wv/zLcgM9HaTm/yM="
}
}
},
@@ -9135,20 +9135,20 @@
},
{
"path": "commons-logging/commons-logging/1.3.5",
"path": "commons-logging/commons-logging/1.3.4",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"commons-logging-1.3.5.pom": {
"sha1": "378e7ead6461eabd50a97f6503d061cad0dcae9d",
"sha256": "sha256-zPSjA0b1AnuUlqvVYpCsJtFZq/K+ZN8SZWEdyUALnWg="
"commons-logging-1.3.4.pom": {
"sha1": "e919eab34a66d31a9bbe15ddc563d7d2e6770826",
"sha256": "sha256-1L2jSJKqzL9PrTP8MjqKqQfvnXmYRlnaJJRMCoa/CGU="
},
"commons-logging-1.3.5-api.jar": {
"sha1": "2e234baf9b0fd82e4e2f0db3b9083900fbfe2f36",
"sha256": "sha256-6WjRzl2r6cQzxHbTd+ZSJzD2FttdtdKO2sfEWMtVMdw="
"commons-logging-1.3.4-api.jar": {
"sha1": "de4050262dfa7522365a9e3c76ed8cf4683fcffa",
"sha256": "sha256-X1zVkiUzQHDbaxctBaaFuEei+tY+WxjtAjqqpeErgh8="
},
"commons-logging-1.3.5.jar": {
"sha1": "a3fcc5d3c29b2b03433aa2d2f2d2c1b1638924a1",
"sha256": "sha256-bXp0TkAnZJ+7UIld+Ul9EJ+Yx2amNwYv6NLqu7MUC6Q="
"commons-logging-1.3.4.jar": {
"sha1": "b9fc14968d63a8b8a8a2c1885fe3e90564239708",
"sha256": "sha256-vC3+MvHvBlCeagZRRMGt97Qg6r8RqH8wvRJ/j6ozIBY="
}
}
},
@@ -11836,12 +11836,12 @@
},
{
"path": "com/google/code/gson/gson-parent/2.12.1",
"path": "com/google/code/gson/gson-parent/2.11.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"gson-parent-2.12.1.pom": {
"sha1": "660107b2e76095ef86bbd15c503afe11e5260bfb",
"sha256": "sha256-yeewt+Mb574iaEl5wGgAHGUssRPE5u2JTjm2Q97gf8E="
"gson-parent-2.11.0.pom": {
"sha1": "b32d3bc5c89c852efe4c176df6c3fdeccbe150ef",
"sha256": "sha256-issfO3Km8CaRasBzW62aqwKT1Sftt7NlMn3vE6k2e3o="
}
}
},
@@ -11967,24 +11967,24 @@
},
{
"path": "com/google/code/gson/gson/2.12.1",
"path": "com/google/code/gson/gson/2.11.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"gson-2.12.1.pom": {
"sha1": "d2c3993ff96e5da39a57e5e0b695eda560949b57",
"sha256": "sha256-C1c17IX0UoLx4sdpd5gAQnsVCoFj9AUJOpKAtxyrGXg="
"gson-2.11.0.pom": {
"sha1": "55796dd7cc329027df79e96c4e6631e3c02c93c5",
"sha256": "sha256-wOVHvqmYiI5uJcWIapDnYicryItSdTQ90sBd7Wyi42A="
},
"gson-2.12.1.buildinfo": {
"sha1": "c2e219d4a63eebf78ce409ee8303eb930248f486",
"sha256": "sha256-fNm4d7ep72MLsQq/BeBRdEuam/9hzGJafTURb48yeuY="
"gson-2.11.0.buildinfo": {
"sha1": "4d1c42ee3c07943d8e07fab98bf0491877b4c0c6",
"sha256": "sha256-d6O/J0uIwA+ieS0kkb+yLkeL3OUzOMUcMBHW7nDr0pI="
},
"gson-2.12.1.buildinfo.asc": {
"sha1": "01ba63402708ab4efbd2fa2f4dc5ee7f136b9479",
"sha256": "sha256-M+At44sk0y+mblm7UnhRzYzeO36NPGTpP3rTID/wJjU="
"gson-2.11.0.buildinfo.asc": {
"sha1": "ba50162dd390a51e11a706d62ef9a5d120138337",
"sha256": "sha256-blLhhVcT0w8htC6V6rrqU+CZ3egMLBv5AgE76D+zGIY="
},
"gson-2.12.1.jar": {
"sha1": "4e773a317740b83b43cfc3d652962856041697cb",
"sha256": "sha256-6+4T1ft0d81/HMAQ4MNW34yoBwlxUkjal/eeNcy0++w="
"gson-2.11.0.jar": {
"sha1": "527175ca6d81050b53bdd4c457a6d6e017626b0e",
"sha256": "sha256-V5KNblpu3rKr03cKj5W6RNzkXzsjt6ncKzCcWBVSp4s="
}
}
},
@@ -12199,6 +12199,21 @@
}
},
{
"path": "com/google/errorprone/error_prone_annotations/2.27.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"error_prone_annotations-2.27.0.pom": {
"sha1": "85103026aa50b0e4efafee8f486e3ecd9ebfde31",
"sha256": "sha256-TKWjXWEjXhZUmsNG0eNFUc3w/ifoSqV+A8vrJV6k5do="
},
"error_prone_annotations-2.27.0.jar": {
"sha1": "91b2c29d8a6148b5e2e4930f070d4840e2e48e34",
"sha256": "sha256-JMkjNyxY410LnxagKJKbua7cd1IYZ8J08r0HNd9bofU="
}
}
},
{
"path": "com/google/errorprone/error_prone_annotations/2.36.0",
"repo": "https://repo.maven.apache.org/maven2",
@@ -12335,6 +12350,17 @@
}
},
{
"path": "com/google/errorprone/error_prone_parent/2.27.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"error_prone_parent-2.27.0.pom": {
"sha1": "336f77abf2668b10cae4ab136ea0c8258875de00",
"sha256": "sha256-+oGCnQSVWd9pJ/nJpv1rvQn4tQ5tRzaucsgwC2w9dlQ="
}
}
},
{
"path": "com/google/errorprone/error_prone_parent/2.36.0",
"repo": "https://repo.maven.apache.org/maven2",
@@ -12535,27 +12561,27 @@
},
{
"path": "com/google/guava/guava-parent/33.4.0-jre",
"path": "com/google/guava/guava-parent/33.3.1-jre",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"guava-parent-33.4.0-jre.pom": {
"sha1": "ee79b87abc4ef9b3591db13c59de368c7b03dc79",
"sha256": "sha256-Okme00oNnuDxvMOSMAIaHNTi990EJqtoRPWFRl1B3Nc="
"guava-parent-33.3.1-jre.pom": {
"sha1": "94729a0ed1dc35f623edd13afa6c1c2fe9a15d7c",
"sha256": "sha256-VUQdsn6Iad/v4FMFm99Hi9x+lVhWQr85HwAjNF/VYoc="
}
}
},
{
"path": "com/google/guava/guava-testlib/33.4.0-jre",
"path": "com/google/guava/guava-testlib/33.3.1-jre",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"guava-testlib-33.4.0-jre.pom": {
"sha1": "f92730965d606702deb41eca3afb47396b7a5c6a",
"sha256": "sha256-p+EQNjDV99XYCN3NnbnVhLvVldRW2UxpHOwJDQ7qZ/A="
"guava-testlib-33.3.1-jre.pom": {
"sha1": "12fbde61e46674436b0ec48f9b54fbd5f78f8256",
"sha256": "sha256-4n6bu2lrvSCUeAF1YUO9EazSCFBFSnEILoceA+27PSw="
},
"guava-testlib-33.4.0-jre.jar": {
"sha1": "e849ea71846b5ca96387d543c7ac862f18fe2513",
"sha256": "sha256-JF+agJa8uth2DSga3QKf4klh/pOZ3f6as3srsLCe7WI="
"guava-testlib-33.3.1-jre.jar": {
"sha1": "a2eeefe29ae8a5b2b6d3a318295fa9a1925bdc61",
"sha256": "sha256-j943uKx8GbgmwhbfKvPXEd9JRb/baLPx5qHD9KUng1w="
}
}
},
@@ -12741,20 +12767,20 @@
},
{
"path": "com/google/guava/guava/33.4.0-jre",
"path": "com/google/guava/guava/33.3.1-jre",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"guava-33.4.0-jre.pom": {
"sha1": "5c671f0be7aa66b15ed0ec2e1afb4ee99c8c78e8",
"sha256": "sha256-+pTbQAIt38d1r57PsTDM5RW5b3QNr4LyCvhG2VBUE0s="
"guava-33.3.1-jre.pom": {
"sha1": "5a5628b34628748abcb73144a909ddbea2265ed9",
"sha256": "sha256-MTtn/BPrOwY07acVoSKZcfXem4GIvCgHYoFbg6J18ZM="
},
"guava-33.4.0-jre.jar": {
"sha1": "03fcc0a259f724c7de54a6a55ea7e26d3d5c0cac",
"sha256": "sha256-uRjJin5E2+lOvZ/j5Azdqttak+anjrYAi0LfI3JB5Tg="
"guava-33.3.1-jre.jar": {
"sha1": "852f8b363da0111e819460021ca693cacca3e8db",
"sha256": "sha256-S/Dixa+ORSXJbo/eF6T3MH+X+EePEcTI41oOMpiuTpA="
},
"guava-33.4.0-jre.module": {
"sha1": "edaf59b47aef1afba209dfafe1481ed86ff07f04",
"sha256": "sha256-gg6BfobEk6p6/9bLuZHuYJJbbIt0VB90LLIgcPbyBFk="
"guava-33.3.1-jre.module": {
"sha1": "c99293bbf166d01849489fc6f94a101f79072aa7",
"sha256": "sha256-QYWMhHU/2WprfFESL8zvOVWMkcwIJk4IUGvPIODmNzM="
}
}
},
@@ -12927,12 +12953,12 @@
},
{
"path": "com/google/protobuf/protobuf-bom/4.30.0-RC1",
"path": "com/google/protobuf/protobuf-bom/4.29.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"protobuf-bom-4.30.0-RC1.pom": {
"sha1": "da26e5286a508eb4c29c3294f34d2fb932916cce",
"sha256": "sha256-Gs5LZwG6EhofKfwcjoPgc9pKFKCgex2GkjeMwK+GDYM="
"protobuf-bom-4.29.0.pom": {
"sha1": "5542df7ac3708da8bf30756f4ee6d804d04b8c9b",
"sha256": "sha256-3L/Apl6DmDAE0HFOmL8NIGBwEUVbYhk5cowAkmvIyZk="
}
}
},
@@ -13178,16 +13204,16 @@
},
{
"path": "com/google/protobuf/protobuf-java/4.30.0-RC1",
"path": "com/google/protobuf/protobuf-java/4.29.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"protobuf-java-4.30.0-RC1.pom": {
"sha1": "9b1a4031569c7b624e2e7e0d7bb12fd752f37e39",
"sha256": "sha256-3A0yPW415z4X6ICF0obJblY2xk8N8WcLCULsC8MYass="
"protobuf-java-4.29.0.pom": {
"sha1": "27c4abe9c47f4aed31cf7acff86853a05f7e85f0",
"sha256": "sha256-7cHftEVG5yel+sU/CQUGv6aN2DB65vEHbv+tVy+S16Q="
},
"protobuf-java-4.30.0-RC1.jar": {
"sha1": "fe024780d64bf9edeb16d33974fd06799758a9e5",
"sha256": "sha256-ywRRWEELxFcCkN+AagbwIbYvLB4m7X4dtlczp8PzXoU="
"protobuf-java-4.29.0.jar": {
"sha1": "ffea90ab158435d68de76951857ef5f8b0f98365",
"sha256": "sha256-FpAYUevl6J/oiqrTwmhmNzaVvC4wYnu4kyhH4vX8LnY="
}
}
},
@@ -13307,12 +13333,12 @@
},
{
"path": "com/google/protobuf/protobuf-parent/4.30.0-RC1",
"path": "com/google/protobuf/protobuf-parent/4.29.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"protobuf-parent-4.30.0-RC1.pom": {
"sha1": "bfd3c39ebcb48274c73c80b82a2925b26a2aea80",
"sha256": "sha256-vBZlQhUkJXKX06FCuoKNYc5/hD86HDSonJ4agltkvxQ="
"protobuf-parent-4.29.0.pom": {
"sha1": "c35e0844930aea715cc8f4335fee49223b1fe35c",
"sha256": "sha256-jU6O2nh45revZuPCtvWHE839P7bNsHGS3My2HN0uSTA="
}
}
},
@@ -13626,20 +13652,20 @@
},
{
"path": "com/squareup/okio/okio-jvm/3.10.2",
"path": "com/squareup/okio/okio-jvm/3.9.1",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"okio-jvm-3.10.2.pom": {
"sha1": "bf3c29f09bf646535ba5a72206280bd5d9631d90",
"sha256": "sha256-AP000Iv0YxNiofVSLKpXyuKMosfpOS76My72Vs/anUM="
"okio-jvm-3.9.1.pom": {
"sha1": "32a1fc013a444bd5d7c45346973c102d02dbeb1e",
"sha256": "sha256-VXZInO8kBTNoAPxt6VhUU18zVxpO/lpa0OybmwkNIdU="
},
"okio-jvm-3.10.2.jar": {
"sha1": "6a2cc3acd5a83e66075a2f6c5b0608b6043fa34c",
"sha256": "sha256-/Qp+dsZzHwDpILe8EcBdgjqTIEVDGt1Ujgld4CCmnt4="
"okio-jvm-3.9.1.jar": {
"sha1": "79696e3f4ff05d41ba2b3dc68adb5808a2e5dc53",
"sha256": "sha256-/m/pE3j5v6ewjDhkgozkGABc8orMoS6IR+tlxWXDdQA="
},
"okio-jvm-3.10.2.module": {
"sha1": "e1125ef565c7f5fd6fbf0f925188c81febe1d0ee",
"sha256": "sha256-p4CkJMVx4odVASiuADMjVibf/iFsuNs7ICRkmWrZaPA="
"okio-jvm-3.9.1.module": {
"sha1": "470544322c29b112668d2018c05fd94107b05e26",
"sha256": "sha256-sK+pGSxC18Rj3jjWMlk2xpAdnjtxSXNf/RihHfMQNKs="
}
}
},
@@ -13732,20 +13758,20 @@
},
{
"path": "com/squareup/okio/okio/3.10.2",
"path": "com/squareup/okio/okio/3.9.1",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"okio-3.10.2.pom": {
"sha1": "3d4a51279ef5bc796682828afd74ef3ab54ad543",
"sha256": "sha256-7lbAIUoPqfER2nExxVDo3ICvDL9WCVbBzNosZtdQa0E="
"okio-3.9.1.pom": {
"sha1": "1cd169f2bbe6215607a62447b9e4b64a125b5e56",
"sha256": "sha256-06DDd+epr8zbsCqrXgUNwhL/2pQNvUcOo5cSpDQt8I4="
},
"okio-3.10.2.jar": {
"sha1": "5117e7c820a89b5722cc37fc9152d54131d4cd36",
"sha256": "sha256-3iJdy5APSY2cdVGHpEx043V2vYk62pa4bbYRDiellRM="
"okio-3.9.1.jar": {
"sha1": "3f1067fc8f61b89e013ea121198c49c991d74cbb",
"sha256": "sha256-mcjrvEmV8p3ViwXXVYP8yLlX2yHu64xdiXM/DTSVWJc="
},
"okio-3.10.2.module": {
"sha1": "0e038c29ef477f04b63b0f29847815c52decf3be",
"sha256": "sha256-P94fn79yxsMm1eiktTL0/Z/aLdDLFEK8pODHl9FBI4c="
"okio-3.9.1.module": {
"sha1": "eaa18fe21ddaef8640880e11315ef39757fbc75f",
"sha256": "sha256-m5C0J0pa1gLdV01tS0iQNmOy3ppgufw0AiSCk9hD4SE="
}
}
},
@@ -15233,16 +15259,16 @@
},
{
"path": "io/netty/netty-tcnative-classes/2.0.70.Final",
"path": "io/netty/netty-tcnative-classes/2.0.69.Final",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"netty-tcnative-classes-2.0.70.Final.pom": {
"sha1": "c1e1a8fdfb72675d90886ad28a6949529f798b1a",
"sha256": "sha256-QRtGiEv20l66H2RTU5HsWxCH6Rjg5T0iTkIgoE+zJnU="
"netty-tcnative-classes-2.0.69.Final.pom": {
"sha1": "ee65d639d3c5312a4b6369f0d59504ad0c8dfe0b",
"sha256": "sha256-WdoPlJ4r7on1cR6z4Mb9jPeRTmtwwAfza56waIJDAVw="
},
"netty-tcnative-classes-2.0.70.Final.jar": {
"sha1": "5f75accc769e69f2e6c1e56ba3a08b6c4bcc25f8",
"sha256": "sha256-p5wVeTE9StSKPswdAaJdoG0i1kScO8w2nCMYdJvPVbw="
"netty-tcnative-classes-2.0.69.Final.jar": {
"sha1": "0f018f36b688bafabe4573af230a8b59cf3c0713",
"sha256": "sha256-C7woSMsJnrP29Ow2UBs2AOGChFfNpB1TMGh/YB7gS+8="
}
}
},
@@ -15259,12 +15285,12 @@
},
{
"path": "io/netty/netty-tcnative-parent/2.0.70.Final",
"path": "io/netty/netty-tcnative-parent/2.0.69.Final",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"netty-tcnative-parent-2.0.70.Final.pom": {
"sha1": "b5573ffca02a2c092bdb0f7e5efb7da495523ea4",
"sha256": "sha256-gHWl5UlncBGgcXXZuNqWOli4hLMujhAbdeeBUhc/3DU="
"netty-tcnative-parent-2.0.69.Final.pom": {
"sha1": "ba3c1cc69d48f0196ee84ecd3c5157c52a987931",
"sha256": "sha256-KVMCcZZjdhDIlPMr2nBQk82HaDFcnxpXOVGnXxeGmvw="
}
}
},
@@ -15742,16 +15768,16 @@
},
{
"path": "net/bytebuddy/byte-buddy-agent/1.15.11",
"path": "net/bytebuddy/byte-buddy-agent/1.15.4",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"byte-buddy-agent-1.15.11.pom": {
"sha1": "4015ca3530951c4336155d578de83f0e6b900f8c",
"sha256": "sha256-tfoTlvFHl7jYCIJ+d0O6il8gO0iJvjLklj1EvV7XWag="
"byte-buddy-agent-1.15.4.pom": {
"sha1": "9440b88e2dfa9fb64979d9150453e5535c45e7d3",
"sha256": "sha256-UJEHS07O1v8WbjlDlHRk/0Lac5Y4BC34aDuj6MIJ51U="
},
"byte-buddy-agent-1.15.11.jar": {
"sha1": "a38b16385e867f59a641330f0362ebe742788ed8",
"sha256": "sha256-MW0sB5XCpNTEdW8ub5NJg3x0MKw04Ed+rYdNBfXMGeU="
"byte-buddy-agent-1.15.4.jar": {
"sha1": "58e850dde88f3cf20f41f659440bef33f6c4fe02",
"sha256": "sha256-HXbe/RWaVkuct6lo0N6ic2e4tw6951qWjn7xkhvHXuQ="
}
}
},
@@ -15778,6 +15804,17 @@
}
},
{
"path": "net/bytebuddy/byte-buddy-parent/1.15.4",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"byte-buddy-parent-1.15.4.pom": {
"sha1": "d8cc6c53d8cda7c416764d4e4a74183546e1e5a2",
"sha256": "sha256-lwLCIT4/23CHv9M0tjQ80F9EUIqT64+Uqn2mVKwftI8="
}
}
},
{
"path": "net/bytebuddy/byte-buddy-parent/1.15.10",
"repo": "https://repo.maven.apache.org/maven2",
@@ -15789,17 +15826,6 @@
}
},
{
"path": "net/bytebuddy/byte-buddy-parent/1.15.11",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"byte-buddy-parent-1.15.11.pom": {
"sha1": "80e27b5d9cf8ba40dfd0b8ee8f7915d7237aec6d",
"sha256": "sha256-jcUZ16PnkhEqfNhB6vvsTwDbxjPQha3SDEXwq0dspJY="
}
}
},
{
"path": "net/bytebuddy/byte-buddy/1.11.13",
"repo": "https://repo.maven.apache.org/maven2",
@@ -15830,6 +15856,21 @@
}
},
{
"path": "net/bytebuddy/byte-buddy/1.15.4",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"byte-buddy-1.15.4.pom": {
"sha1": "1bab74a93db543cc550920d0cd7d58d8734bda4d",
"sha256": "sha256-L7uet+1bcChb8EOXvnjcKoUdDcLnSGXYFJfGGomOIb0="
},
"byte-buddy-1.15.4.jar": {
"sha1": "e8bd42992701720649765383ff570f415190b83f",
"sha256": "sha256-Smg9g/8hnyDUTzXKMC2CHgxoQuP6j58e6RPrFvSc7Gw="
}
}
},
{
"path": "net/bytebuddy/byte-buddy/1.15.10",
"repo": "https://repo.maven.apache.org/maven2",
@@ -15845,21 +15886,6 @@
}
},
{
"path": "net/bytebuddy/byte-buddy/1.15.11",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"byte-buddy-1.15.11.pom": {
"sha1": "c625e547e59a502e99eba31c1a5b1c514e8c64f5",
"sha256": "sha256-IFuLJUGWcX6B2tZyu4aacZr8lt8pf5fYEe/+H0NlPa4="
},
"byte-buddy-1.15.11.jar": {
"sha1": "f61886478e0f9ee4c21d09574736f0ff45e0a46c",
"sha256": "sha256-+giZiq4ee9roO94HEsUOhETXHA4MGWuyJHrejUrQ65A="
}
}
},
{
"path": "net/java/dev/jna/jna-platform/5.6.0",
"repo": "https://repo.maven.apache.org/maven2",
@@ -16433,6 +16459,17 @@
}
},
{
"path": "org/apache/apache/32",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"apache-32.pom": {
"sha1": "2e08f841a6fbc946452701faaf5e39a17ac97ef3",
"sha256": "sha256-z9hywOwn9Trmj0PbwP7N7YrddzB5pTr705DkB7Qs5y8="
}
}
},
{
"path": "org/apache/apache/33",
"repo": "https://repo.maven.apache.org/maven2",
@@ -16666,6 +16703,28 @@
}
},
{
"path": "org/apache/commons/commons-parent/71",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"commons-parent-71.pom": {
"sha1": "91d35791f5037779fb320d054ed09cb14925dc32",
"sha256": "sha256-lbe+cPMWrkyiL2+90I3iGC6HzYdKZQ3nw9M4anR6gqM="
}
}
},
{
"path": "org/apache/commons/commons-parent/72",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"commons-parent-72.pom": {
"sha1": "cdfbaff82e756be4cb74d3f09b8fbf8f6b06c79d",
"sha256": "sha256-Q0Xev8dnsa6saKvdcvxn0YtSHUs5A3KhG2P/DFhrIyA="
}
}
},
{
"path": "org/apache/commons/commons-parent/78",
"repo": "https://repo.maven.apache.org/maven2",
@@ -16677,28 +16736,6 @@
}
},
{
"path": "org/apache/commons/commons-parent/79",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"commons-parent-79.pom": {
"sha1": "a2f13e0fa1f22588976e02c39b840653986ba685",
"sha256": "sha256-Yo3zAUis08SRz8trc8euS1mJ5VJqsTovQo3qXUrRDXo="
}
}
},
{
"path": "org/apache/commons/commons-parent/81",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"commons-parent-81.pom": {
"sha1": "4a342190fb243a221636ac0e0b02d3eed07a9908",
"sha256": "sha256-NI1OfBMb5hFMhUpxnOekQwenw5vTZghJd7JP0prQ7bQ="
}
}
},
{
"path": "org/apache/httpcomponents/httpclient/4.1.1",
"repo": "https://repo.maven.apache.org/maven2",
@@ -17434,20 +17471,20 @@
},
{
"path": "org/checkerframework/checker-qual/3.49.0",
"path": "org/checkerframework/checker-qual/3.48.2",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"checker-qual-3.49.0.pom": {
"sha1": "d13e380978f7ccc023bfef031f9d664d52c3877e",
"sha256": "sha256-yEUftI7+1jgbMpFG1PrvtvTYq/E79XLCaosawoCW54A="
"checker-qual-3.48.2.pom": {
"sha1": "95acb8356a028eeb22171b7330f7bb78cf0f9506",
"sha256": "sha256-Sk+LlzEYgyx4SrUIpzAJ2tAt5Nq/0dFJLWa45MC6HRE="
},
"checker-qual-3.49.0.jar": {
"sha1": "54be36cb42c9b991c109e467e2bfa82af4cda44e",
"sha256": "sha256-i52aNuqvfA/CZQPIPNl9jJwPnikTzCpukqwmxzXU3L4="
"checker-qual-3.48.2.jar": {
"sha1": "2a4797df796b23026b8215545b0d2936bacc52af",
"sha256": "sha256-ryPyDJlbL+3jWx66gRd6mmaUTsZ7jk3uGapMwLcQxrU="
},
"checker-qual-3.49.0.module": {
"sha1": "b6e4941f8d6af0d46a496f72d1b8944e0ed8fd5d",
"sha256": "sha256-YA0Z+9XjfemEh8OYBF4UCmUc9brRx5xcl88MyYRMQuQ="
"checker-qual-3.48.2.module": {
"sha1": "cdf30d8d4b97e12fc85e65e1bd55210a1a084b10",
"sha256": "sha256-D2RjlMmz5KL1aitsZ6C0NAkqxrq3pJvC/wGtjKf08NU="
}
}
},
@@ -19864,16 +19901,16 @@
},
{
"path": "org/jetbrains/kotlin/kotlin-reflect/2.1.20-Beta2",
"path": "org/jetbrains/kotlin/kotlin-reflect/2.1.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"kotlin-reflect-2.1.20-Beta2.pom": {
"sha1": "1f22f7def1b72d86f0122e94963556693dcd9054",
"sha256": "sha256-TSmv4VZwoDfXO+C2ohrnzhcbhR5hQPWOERDtz2j/Djo="
"kotlin-reflect-2.1.0.pom": {
"sha1": "6c72cb76dbf12249eec091d5a7d6ea27a27fcc87",
"sha256": "sha256-nNhLPU9xfJYjXkujtydolcz/1V3kEcfOCz97q1Yu/kI="
},
"kotlin-reflect-2.1.20-Beta2.jar": {
"sha1": "9747e5ae1b3b47d83f7a810fbdd603c90cd5b0ad",
"sha256": "sha256-MsWsLXYMzUpOX6IMg2JMSqx4DN7upMURajx3sgHgs4E="
"kotlin-reflect-2.1.0.jar": {
"sha1": "dc3753b59b67d79b7d2f546d51e22a0ec1f082d8",
"sha256": "sha256-tfYI7fqYqM+iNyzBLRitqXS+HFbBCT7/BswGH0/AiLI="
}
}
},
@@ -21514,6 +21551,33 @@
}
},
{
"path": "org/jetbrains/kotlin/kotlin-stdlib/1.9.25",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"kotlin-stdlib-1.9.25.pom": {
"sha1": "cd80842137758a376e09fd243351e10abb0fa13c",
"sha256": "sha256-fcMxikdte5AtDSevm1b2Y+jMQmOi0zrQUMertlpbZ6E="
},
"kotlin-stdlib-1.9.25-all.jar": {
"sha1": "6c69e7b26179394dafd3c90e630ef763b8c1a267",
"sha256": "sha256-zsOLwzAucqiq+c3kNrWpBx7gMx4q0F6E2LuJczTX6dQ="
},
"kotlin-stdlib-1.9.25-common.jar": {
"sha1": "4c7276a1529397ee6389483a408c57a9c6d4ca7d",
"sha256": "sha256-zBF0wWk6JC3Wy8gWpSfEU+BBhJTjbFDNxleL9AFxrNs="
},
"kotlin-stdlib-1.9.25.jar": {
"sha1": "f700a2f2b8f0d6d0fde48f56d894dc722fb029d7",
"sha256": "sha256-+c3Nv/H13oU4CuUml35oNybCqkLbHtbm5Qronklulf0="
},
"kotlin-stdlib-1.9.25.module": {
"sha1": "b36cccb05e35f533bf4a44ce7ba25dca4d356a2b",
"sha256": "sha256-Q+BqZsO3XKPkxcswSWjqg1ImJHuj9WExK9Gepi3oRqc="
}
}
},
{
"path": "org/jetbrains/kotlin/kotlin-stdlib/2.1.0",
"repo": "https://repo.maven.apache.org/maven2",
@@ -21537,29 +21601,6 @@
}
},
{
"path": "org/jetbrains/kotlin/kotlin-stdlib/2.1.20-Beta2",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"kotlin-stdlib-2.1.20-Beta2.pom": {
"sha1": "4f06272e28b5e94f321d4f5e999110a95d93ea05",
"sha256": "sha256-MO2EkKrOoo71CWbghKGSZ/P1JqCL87tkkKUHe7fIgn4="
},
"kotlin-stdlib-2.1.20-Beta2-all.jar": {
"sha1": "919751264e79f13e6ec79f4eef1d5222e6520d31",
"sha256": "sha256-geB9406Esp4U8/3vkC9LxM8dXalZuGffaD++HMVM4eE="
},
"kotlin-stdlib-2.1.20-Beta2.jar": {
"sha1": "98e06078584a3b816315d9baee83d04022f3271c",
"sha256": "sha256-dDREYP6u8bxGO6aeUtUOfbAEn3E4uECxzz+yKom8/Vk="
},
"kotlin-stdlib-2.1.20-Beta2.module": {
"sha1": "42afc0b12293bb6474c45f25c4da99ae6fb16103",
"sha256": "sha256-SnA8ORhx/5f6h1qdImY6A3werSKT5SZ+CDK7U2pMHrY="
}
}
},
{
"path": "org/jetbrains/kotlin/kotlin-tooling-core/1.8.0",
"repo": "https://repo.maven.apache.org/maven2",
@@ -21760,16 +21801,16 @@
},
{
"path": "org/json/json/20250107",
"path": "org/json/json/20240303",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"json-20250107.pom": {
"sha1": "91b62e77c1b5a92b6dc79f8c0c154311e1477c85",
"sha256": "sha256-ph+87jbeXMAb7ZMEYseLwEvBZBCwHZtfEABq8UoRvFY="
"json-20240303.pom": {
"sha1": "78c0fa2a26888461731e26603ef4b19cc53239ca",
"sha256": "sha256-mUuvXYm/TKpc6WjkxOqxNcj5eD7PTSt7Dp0cik3fHk8="
},
"json-20250107.jar": {
"sha1": "a1b5f0b5a1ce018b93a691c57ffc7d141b3a10f1",
"sha256": "sha256-hdTBqxktMRf9Asf/8ewP5jreRc9W3vf+lQ7wYM8G6Z8="
"json-20240303.jar": {
"sha1": "0ebb88e8fb5122b7506d5cf1d69f1ccdb790d22a",
"sha256": "sha256-PPbNaJLjLitMHDng9S9SSKL1s3ZG/fu3mma0a2GEFO0="
}
}
},
@@ -21809,16 +21850,16 @@
},
{
"path": "org/junit/junit-bom/5.12.0-RC2",
"path": "org/junit/junit-bom/5.11.3",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"junit-bom-5.12.0-RC2.pom": {
"sha1": "f7f31a9a73bd214137a5e22c45da37aa8fa893a1",
"sha256": "sha256-9H9ulor+J1iVBQAkFvwfbn78IHHc1HMNSDTUUp/XY+E="
"junit-bom-5.11.3.pom": {
"sha1": "ff35120d66bcbdd05c8b94b57b08b9d30f15c343",
"sha256": "sha256-8T3y5Mrx/rzlZ2Z+fDeBAaAzHVPRMk1uLf467Psfd3Q="
},
"junit-bom-5.12.0-RC2.module": {
"sha1": "49aa327f7c618b489654a7ac980a5647adf95be4",
"sha256": "sha256-5S09WIMqPhrcc3ky5x9gjbj5lefgLRpDmNjdhKDH/2o="
"junit-bom-5.11.3.module": {
"sha1": "cbe8d3c987c55bc57869f232f052c0df0042c32b",
"sha256": "sha256-S/D1PO6nx5D9+9JNujyeBM3FGGQnnuv8V6qkc+vKA4A="
}
}
},
@@ -21914,16 +21955,16 @@
},
{
"path": "org/mockito/mockito-core/5.15.2",
"path": "org/mockito/mockito-core/5.14.2",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"mockito-core-5.15.2.pom": {
"sha1": "199967c4a9531dd9b29ed2ef72fc4b427192466c",
"sha256": "sha256-/tgS0qLznJhHSyoUxjxl+PRxeDtggtyGfAwbYFPGlIA="
"mockito-core-5.14.2.pom": {
"sha1": "2f6476e2e7da6a275ebac685ed983d3f7bee84e3",
"sha256": "sha256-Y45Wpo9JaHm8ig9Tz735xMw5pFtuQ4ozOl6oPAnunP0="
},
"mockito-core-5.15.2.jar": {
"sha1": "87be4b1e0cc5febc07ab3197a8ff3ede56b37a79",
"sha256": "sha256-v0i3Ny2UkdXsiuu0zdGH0VZjkxWZwPvnQQFmzg4eWP8="
"mockito-core-5.14.2.jar": {
"sha1": "f7bf936008d7664e2002c3faf0c02071c8d10e7c",
"sha256": "sha256-IpYUHB4fLhrjXAjTapq0Vj7NZuA1M/6CYwp2TnqkkYI="
}
}
},
+2 -2
View File
@@ -807,7 +807,7 @@ org.glassfish.jaxb:txw2:2.2.11
org.glassfish.jaxb:txw2:2.3.1
org.glassfish.jaxb:txw2:2.3.2
org.gradle.toolchains:foojay-resolver:0.5.0
org.gradle:github-dependency-graph-gradle-plugin:1.3.2
org.gradle:github-dependency-graph-gradle-plugin:1.3.1
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest:2.2
org.jacoco:org.jacoco.core:0.7.4.201502262128
@@ -1021,5 +1021,5 @@ xml-apis:xml-apis:1.4.01
org.gradle.toolchains.foojay-resolver-convention:org.gradle.toolchains.foojay-resolver-convention.gradle.plugin:0.5.0
org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.8.0
com.android.tools.build:gradle:3.5.4
com.facebook.react:hermes-android:0.73.5
com.android.tools.lint:lint-gradle:31.1.1
com.facebook.react:hermes-android:0.73.5
+29 -26
View File
@@ -552,7 +552,7 @@ https://jitpack.io/com/github/wix-playground/reflow-animator/1.0.6/reflow-animat
https://jitpack.io/com/github/yalantis/ucrop/2.2.6-native/ucrop-2.2.6-native.pom
https://jitpack.io/com/github/zacharee/AndroidPdfViewer/4.0.1/AndroidPdfViewer-4.0.1.pom
https://plugins.gradle.org/m2/com/adarshr/gradle-test-logger-plugin/2.0.0/gradle-test-logger-plugin-2.0.0.pom
https://plugins.gradle.org/m2/org/gradle/github-dependency-graph-gradle-plugin/1.3.2/github-dependency-graph-gradle-plugin-1.3.2.pom
https://plugins.gradle.org/m2/org/gradle/github-dependency-graph-gradle-plugin/1.3.1/github-dependency-graph-gradle-plugin-1.3.1.pom
https://plugins.gradle.org/m2/org/gradle/toolchains/foojay-resolver-convention/org.gradle.toolchains.foojay-resolver-convention.gradle.plugin/0.5.0/org.gradle.toolchains.foojay-resolver-convention.gradle.plugin-0.5.0.pom
https://plugins.gradle.org/m2/org/gradle/toolchains/foojay-resolver/0.5.0/foojay-resolver-0.5.0.pom
https://repo.maven.apache.org/maven2/antlr/antlr/2.7.1/antlr-2.7.1.pom
@@ -562,12 +562,12 @@ https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.6/commons-cod
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.9/commons-codec-1.9.pom
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10.pom
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.pom
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.18.0/commons-codec-1.18.0.pom
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.17.1/commons-codec-1.17.1.pom
https://repo.maven.apache.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.pom
https://repo.maven.apache.org/maven2/commons-io/commons-io/2.18.0/commons-io-2.18.0.pom
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.pom
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.pom
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.3.5/commons-logging-1.3.5.pom
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.3.4/commons-logging-1.3.4.pom
https://repo.maven.apache.org/maven2/com/adobe/xmp/xmpcore/6.1.11/xmpcore-6.1.11.pom
https://repo.maven.apache.org/maven2/com/afollestad/material-dialogs/commons/0.9.6.0/commons-0.9.6.0.pom
https://repo.maven.apache.org/maven2/com/afollestad/material-dialogs/core/0.9.6.0/core-0.9.6.0.pom
@@ -726,7 +726,7 @@ https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.8.5/gson
https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.8.6/gson-parent-2.8.6.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.8.9/gson-parent-2.8.9.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.9.1/gson-parent-2.9.1.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.12.1/gson-parent-2.12.1.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.11.0/gson-parent-2.11.0.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.2.4/gson-2.2.4.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.3/gson-2.3.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.7/gson-2.7.pom
@@ -735,7 +735,7 @@ https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5.
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.9.1/gson-2.9.1.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.12.1/gson-2.12.1.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.11.0/gson-2.11.0.pom
https://repo.maven.apache.org/maven2/com/google/crypto/tink/tink/1.3.0-rc2/tink-1.3.0-rc2.pom
https://repo.maven.apache.org/maven2/com/google/crypto/tink/tink/1.7.0/tink-1.7.0.pom
https://repo.maven.apache.org/maven2/com/google/dagger/dagger/2.28.3/dagger-2.28.3.pom
@@ -750,6 +750,7 @@ https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotatio
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.9.0/error_prone_annotations-2.9.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.10.0/error_prone_annotations-2.10.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.11.0/error_prone_annotations-2.11.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.27.0/error_prone_annotations-2.27.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.36.0/error_prone_annotations-2.36.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.0.18/error_prone_parent-2.0.18.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.2.0/error_prone_parent-2.2.0.pom
@@ -762,6 +763,7 @@ https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.9.0/error_prone_parent-2.9.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.10.0/error_prone_parent-2.10.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.11.0/error_prone_parent-2.11.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.27.0/error_prone_parent-2.27.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.36.0/error_prone_parent-2.36.0.pom
https://repo.maven.apache.org/maven2/com/google/flatbuffers/flatbuffers-java/1.12.0/flatbuffers-java-1.12.0.pom
https://repo.maven.apache.org/maven2/com/google/google/1/google-1.pom
@@ -779,8 +781,8 @@ https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/30.1-jre/guav
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/31.0.1-android/guava-parent-31.0.1-android.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/31.0.1-jre/guava-parent-31.0.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/31.1-jre/guava-parent-31.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/33.4.0-jre/guava-parent-33.4.0-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-testlib/33.4.0-jre/guava-testlib-33.4.0-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/33.3.1-jre/guava-parent-33.3.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-testlib/33.3.1-jre/guava-testlib-33.3.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/17.0/guava-17.0.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/22.0/guava-22.0.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/23.0/guava-23.0.pom
@@ -793,7 +795,7 @@ https://repo.maven.apache.org/maven2/com/google/guava/guava/30.1-jre/guava-30.1-
https://repo.maven.apache.org/maven2/com/google/guava/guava/31.0.1-android/guava-31.0.1-android.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/31.0.1-jre/guava-31.0.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/33.4.0-jre/guava-33.4.0-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/33.3.1-jre/guava-33.3.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/listenablefuture/1.0/listenablefuture-1.0.pom
https://repo.maven.apache.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.pom
https://repo.maven.apache.org/maven2/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.pom
@@ -807,7 +809,7 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.13.0/pro
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.17.2/protobuf-bom-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.19.2/protobuf-bom-3.19.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.19.3/protobuf-bom-3.19.3.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/4.30.0-RC1/protobuf-bom-4.30.0-RC1.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/4.29.0/protobuf-bom-4.29.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-javalite/3.17.2/protobuf-javalite-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-javalite/3.19.2/protobuf-javalite-3.19.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util/3.4.0/protobuf-java-util-3.4.0.pom
@@ -824,7 +826,7 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.13.0/pr
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.17.2/protobuf-java-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.19.2/protobuf-java-3.19.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.19.3/protobuf-java-3.19.3.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/4.30.0-RC1/protobuf-java-4.30.0-RC1.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/4.29.0/protobuf-java-4.29.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-lite/3.0.1/protobuf-lite-3.0.1.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.0.0/protobuf-parent-3.0.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.4.0/protobuf-parent-3.4.0.pom
@@ -835,7 +837,7 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.13.0/
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.17.2/protobuf-parent-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.19.2/protobuf-parent-3.19.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.19.3/protobuf-parent-3.19.3.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/4.30.0-RC1/protobuf-parent-4.30.0-RC1.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/4.29.0/protobuf-parent-4.29.0.pom
https://repo.maven.apache.org/maven2/com/google/truth/truth-parent/1.4.4/truth-parent-1.4.4.pom
https://repo.maven.apache.org/maven2/com/google/truth/truth/1.4.4/truth-1.4.4.pom
https://repo.maven.apache.org/maven2/com/google/zxing/core/3.4.1/core-3.4.1.pom
@@ -856,13 +858,13 @@ https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/4.11.0/okhttp-4
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/okio/okio-jvm/3.2.0/okio-jvm-3.2.0.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio-jvm/3.10.2/okio-jvm-3.10.2.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio-jvm/3.9.1/okio-jvm-3.9.1.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio-parent/1.17.4/okio-parent-1.17.4.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/1.17.4/okio-1.17.4.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/2.8.0/okio-2.8.0.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/2.9.0/okio-2.9.0.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/3.2.0/okio-3.2.0.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/3.10.2/okio-3.10.2.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/3.9.1/okio-3.9.1.pom
https://repo.maven.apache.org/maven2/com/sun/activation/all/1.2.0/all-1.2.0.pom
https://repo.maven.apache.org/maven2/com/sun/activation/all/1.2.1/all-1.2.1.pom
https://repo.maven.apache.org/maven2/com/sun/activation/all/1.2.2/all-1.2.2.pom
@@ -969,9 +971,9 @@ https://repo.maven.apache.org/maven2/io/netty/netty-resolver/4.1.52.Final/netty-
https://repo.maven.apache.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-resolver/5.0.0.Alpha2/netty-resolver-5.0.0.Alpha2.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-classes/2.0.70.Final/netty-tcnative-classes-2.0.70.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-classes/2.0.69.Final/netty-tcnative-classes-2.0.69.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-parent/2.0.46.Final/netty-tcnative-parent-2.0.46.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-parent/2.0.70.Final/netty-tcnative-parent-2.0.70.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-parent/2.0.69.Final/netty-tcnative-parent-2.0.69.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-transport/4.1.34.Final/netty-transport-4.1.34.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-transport/4.1.52.Final/netty-transport-4.1.52.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.pom
@@ -1004,15 +1006,15 @@ https://repo.maven.apache.org/maven2/junit/junit/4.13.2/junit-4.13.2.pom
https://repo.maven.apache.org/maven2/me/zhanghai/android/materialprogressbar/library/1.4.2/library-1.4.2.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.11.13/byte-buddy-agent-1.11.13.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.11.19/byte-buddy-agent-1.11.19.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.15.11/byte-buddy-agent-1.15.11.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.15.4/byte-buddy-agent-1.15.4.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.11.13/byte-buddy-parent-1.11.13.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.11.19/byte-buddy-parent-1.11.19.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.15.4/byte-buddy-parent-1.15.4.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.15.10/byte-buddy-parent-1.15.10.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.15.11/byte-buddy-parent-1.15.11.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.11.13/byte-buddy-1.11.13.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.11.19/byte-buddy-1.11.19.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.15.4/byte-buddy-1.15.4.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.15.10/byte-buddy-1.15.10.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.15.11/byte-buddy-1.15.11.pom
https://repo.maven.apache.org/maven2/net/java/dev/jna/jna-platform/5.6.0/jna-platform-5.6.0.pom
https://repo.maven.apache.org/maven2/net/java/dev/jna/jna/5.6.0/jna-5.6.0.pom
https://repo.maven.apache.org/maven2/net/java/jvnet-parent/1/jvnet-parent-1.pom
@@ -1056,6 +1058,7 @@ https://repo.maven.apache.org/maven2/org/apache/apache/16/apache-16.pom
https://repo.maven.apache.org/maven2/org/apache/apache/18/apache-18.pom
https://repo.maven.apache.org/maven2/org/apache/apache/21/apache-21.pom
https://repo.maven.apache.org/maven2/org/apache/apache/23/apache-23.pom
https://repo.maven.apache.org/maven2/org/apache/apache/32/apache-32.pom
https://repo.maven.apache.org/maven2/org/apache/apache/33/apache-33.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.12/commons-compress-1.12.pom
@@ -1075,9 +1078,9 @@ https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/39/common
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/42/commons-parent-42.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/48/commons-parent-48.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/52/commons-parent-52.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/71/commons-parent-71.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/72/commons-parent-72.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/78/commons-parent-78.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/79/commons-parent-79.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/81/commons-parent-81.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.2.6/httpclient-4.2.6.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.5.2/httpclient-4.5.2.pom
@@ -1132,7 +1135,7 @@ https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/2.8.1/che
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/2.11.1/checker-qual-2.11.1.pom
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.5.0/checker-qual-3.5.0.pom
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.pom
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.49.0/checker-qual-3.49.0.pom
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.48.2/checker-qual-3.48.2.pom
https://repo.maven.apache.org/maven2/org/codehaus/codehaus-parent/4/codehaus-parent-4.pom
https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-xml/3.0.9/groovy-xml-3.0.9.pom
https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-xml/3.0.10/groovy-xml-3.0.10.pom
@@ -1282,7 +1285,7 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.6.10/
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.6.20/kotlin-reflect-1.6.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.7.10/kotlin-reflect-1.7.10.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.8.20-RC2/kotlin-reflect-1.8.20-RC2.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/2.1.20-Beta2/kotlin-reflect-2.1.20-Beta2.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/2.1.0/kotlin-reflect-2.1.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.6.20/kotlin-scripting-common-1.6.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.8.0/kotlin-scripting-common-1.8.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.9.0/kotlin-scripting-common-1.9.0.pom
@@ -1391,8 +1394,8 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.8.21/k
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.8.22/kotlin-stdlib-1.8.22.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.0/kotlin-stdlib-1.9.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.22/kotlin-stdlib-1.9.22.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.25/kotlin-stdlib-1.9.25.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/2.1.0/kotlin-stdlib-2.1.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/2.1.20-Beta2/kotlin-stdlib-2.1.20-Beta2.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-core/1.8.0/kotlin-tooling-core-1.8.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-core/1.9.0/kotlin-tooling-core-1.9.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-metadata/1.6.20/kotlin-tooling-metadata-1.6.20.pom
@@ -1406,17 +1409,17 @@ https://repo.maven.apache.org/maven2/org/jetbrains/markdown-jvm/0.2.1/markdown-j
https://repo.maven.apache.org/maven2/org/jetbrains/markdown/0.2.1/markdown-0.2.1.pom
https://repo.maven.apache.org/maven2/org/jetbrains/trove4j/trove4j/20160824/trove4j-20160824.pom
https://repo.maven.apache.org/maven2/org/json/json/20180813/json-20180813.pom
https://repo.maven.apache.org/maven2/org/json/json/20250107/json-20250107.pom
https://repo.maven.apache.org/maven2/org/json/json/20240303/json-20240303.pom
https://repo.maven.apache.org/maven2/org/jsoup/jsoup/1.13.1/jsoup-1.13.1.pom
https://repo.maven.apache.org/maven2/org/jspecify/jspecify/1.0.0/jspecify-1.0.0.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.12.0-RC2/junit-bom-5.12.0-RC2.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.11.3/junit-bom-5.11.3.pom
https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/1.7.7/stax-ex-1.7.7.pom
https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.pom
https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/1.8/stax-ex-1.8.pom
https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/2.1.0/stax-ex-2.1.0.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/3.12.4/mockito-core-3.12.4.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/4.0.0/mockito-core-4.0.0.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/5.15.2/mockito-core-5.15.2.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/5.14.2/mockito-core-5.14.2.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-inline/4.0.0/mockito-inline-4.0.0.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis-parent/3.2/objenesis-parent-3.2.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis-parent/3.3/objenesis-parent-3.3.pom
+1 -15
View File
@@ -6,7 +6,6 @@ readonly FOOJAY_FALLBACK="0.5.0"
readonly KOTLIN_FALLBACK="1.8.0"
readonly TOOLS_FALLBACK="3.5.4"
readonly HERMES_FALLBACK="0.73.5"
readonly GRADLE_LINT_FALLBACK="31.1.1"
GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
cd "${GIT_ROOT}"
@@ -26,28 +25,15 @@ get_version() {
echo "$version"
}
# https://github.com/googlesamples/android-custom-lint-rules/blob/be672cd747ecf13844918e1afccadb935f856a72/docs/api-guide/example.md.html#L112-L129
get_gradle_lint_version() {
gradlePluginVersion=$(get_version "./nix/pkgs/aapt2/default.nix" "version =" $GRADLE_LINT_FALLBACK)
major=$(echo "$gradlePluginVersion" | grep -o "^[0-9]*")
# lintVersion = gradlePluginVersion + 23.0.0
major=$((major + 23))
minor=$(echo "$gradlePluginVersion" | grep -o "\.[0-9]*\." | grep -o "[0-9]*")
patch=$(echo "$gradlePluginVersion" | grep -o "[0-9]*$")
echo "$major.$minor.$patch"
}
foojay_version=$(get_version "./node_modules/@react-native/gradle-plugin/settings.gradle.kts" "foojay.*version" "$FOOJAY_FALLBACK")
kotlin_version=$(get_version "./node_modules/@react-native/gradle-plugin/gradle/libs.versions.toml" "kotlin =" "$KOTLIN_FALLBACK")
tools_version=$(get_version "./patches/BlurView-build.gradle.patch" "gradle:" "$TOOLS_FALLBACK")
hermes_version=$(get_version "./node_modules/react-native/ReactAndroid/gradle.properties" "VERSION_NAME" "$HERMES_FALLBACK")
lint_version=$(get_gradle_lint_version)
cat << EOF
org.gradle.toolchains.foojay-resolver-convention:org.gradle.toolchains.foojay-resolver-convention.gradle.plugin:$foojay_version
org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:$kotlin_version
com.android.tools.build:gradle:$tools_version
com.facebook.react:hermes-android:$hermes_version
com.android.tools.lint:lint-gradle:$lint_version
EOF
+1 -1
View File
@@ -41,7 +41,7 @@ function gen_deps_list() {
# FIXME: Fix for missing packages.
# https://github.com/status-im/status-mobile/issues/15447
function add_deps_hack() {
"${CUR_DIR}/deps_hack.sh" >> "${DEPS_LIST}"
"${CUR_DIR}/deps_versions.sh" >> "${DEPS_LIST}"
}
# Find download URLs for each dependency.
+17 -6
View File
@@ -53,14 +53,25 @@ in {
xcodeWrapper = callPackage ./pkgs/xcodeenv/compose-xcodewrapper.nix { } {
versions = ["16.0" "16.1" "16.2"];
};
go = super.go_1_22;
go = super.go_1_21;
clang = super.clang_15;
buildGoPackage = super.buildGo122Package;
buildGoModule = super.buildGo122Module;
gomobile = callPackage ./pkgs/gomobile {
#FIXME: No Android SDK packages for aarch64-darwin.
androidPkgs = self.androidEnvCustom.compose;
buildGoPackage = super.buildGo121Package;
buildGoModule = super.buildGo121Module;
gomobile = (super.gomobile.overrideAttrs (old: {
patches = [
(self.fetchurl { # https://github.com/golang/mobile/pull/84
url = "https://github.com/golang/mobile/commit/f20e966e05b8f7e06bed500fa0da81cf6ebca307.patch";
sha256 = "sha256-TZ/Yhe8gMRQUZFAs9G5/cf2b9QGtTHRSObBFD5Pbh7Y=";
})
(self.fetchurl { # https://github.com/golang/go/issues/58426
url = "https://github.com/golang/mobile/commit/406ed3a7b8e44dc32844953647b49696d8847d51.patch";
sha256 = "sha256-dqbYukHkQEw8npOkKykOAzMC3ot/Y4DEuh7fE+ptlr8=";
})
];
})).override {
# FIXME: No Android SDK packages for aarch64-darwin.
withAndroidPkgs = stdenv.system != "aarch64-darwin";
androidPkgs = self.androidEnvCustom.compose;
};
# Android environment
-1
View File
@@ -10,7 +10,6 @@ let
pname = "aapt2";
# Warning: This must be the same as gradlePluginVersion android/gradle.properties
# also referenced in nix/deps/gradle/deps_hack.sh
version = "8.1.1-10154469";
pkgPath = "com/android/tools/build/aapt2";
-85
View File
@@ -1,85 +0,0 @@
{
stdenv,
lib,
fetchgit,
fetchurl,
buildGo122Module,
zlib,
makeWrapper,
xcodeenv,
androidenv,
xcodeWrapperArgs ? { },
xcodeWrapper ? xcodeenv.composeXcodeWrapper xcodeWrapperArgs,
withAndroidPkgs ? stdenv.system != "aarch64-darwin",
androidPkgs ? (
androidenv.composeAndroidPackages {
includeNDK = true;
}
),
}:
buildGo122Module {
pname = "gomobile";
version = "0-unstable-2024-12-13";
src = fetchgit {
name = "gomobile";
url = "https://go.googlesource.com/mobile";
rev = "a87c1cf6cf463f0d4476cfe0fcf67c2953d76e7c";
hash = "sha256-7j4rdmCZMC8tn4vAsC9x/mMNkom/+Tl7uAY+5gkSvfY=";
};
vendorHash = "sha256-6ycxEDEE0/i6Lxo0gb8wq3U2U7Q49AJj+PdzSl57wwI=";
CGO_ENABLED = "1";
subPackages = [
"bind"
"cmd/gobind"
"cmd/gomobile"
];
# Fails with: go: cannot find GOROOT directory
doCheck = false;
nativeBuildInputs = [ makeWrapper ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ xcodeWrapper ];
# Prevent a non-deterministic temporary directory from polluting the resulting object files
postPatch = ''
substituteInPlace cmd/gomobile/env.go --replace-quiet \
'tmpdir, err = ioutil.TempDir("", "gomobile-work-")' \
'tmpdir = filepath.Join(os.Getenv("NIX_BUILD_TOP"), "gomobile-work")'
substituteInPlace cmd/gomobile/init.go --replace-quiet \
'tmpdir, err = ioutil.TempDir(gomobilepath, "work-")' \
'tmpdir = filepath.Join(os.Getenv("NIX_BUILD_TOP"), "work")'
# To fix unable to import bind: no Go package in golang.org/x/mobile/bind
substituteInPlace cmd/gomobile/init.go --replace \
'golang.org/x/mobile/cmd/gobind@latest' \
'golang.org/x/mobile/cmd/gobind'
'';
# Necessary for GOPATH when using gomobile.
postInstall = ''
mkdir -p $out/src/golang.org/x
ln -s $src $out/src/golang.org/x/mobile
'';
postFixup = ''
for prog in gomobile gobind; do
wrapProgram $out/bin/$prog \
--suffix GOPATH : $out \
--prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ zlib ]}" \
${lib.optionalString withAndroidPkgs ''
--prefix PATH : "${androidPkgs.androidsdk}/bin" \
--set-default ANDROID_HOME "${androidPkgs.androidsdk}/libexec/android-sdk"
''}
done
'';
meta = {
description = "Tool for building and running mobile apps written in Go";
homepage = "https://pkg.go.dev/golang.org/x/mobile/cmd/gomobile";
license = with lib.licenses; [ bsd3 ];
maintainers = with lib.maintainers; [ jakubgs ];
};
}
+18 -26
View File
@@ -89,11 +89,7 @@
status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_OPTIMISM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_BASE_MAINNET_TOKEN #shadow/env "ALCHEMY_BASE_MAINNET_TOKEN"
status-im.config/ALCHEMY_BASE_SEPOLIA_TOKEN #shadow/env "ALCHEMY_BASE_SEPOLIA_TOKEN"
status-im.config/STATUS_BUILD_ETH_RPC_PROXY_USER #shadow/env "STATUS_BUILD_ETH_RPC_PROXY_USER"
status-im.config/STATUS_BUILD_ETH_RPC_PROXY_PASSWORD #shadow/env
"STATUS_BUILD_ETH_RPC_PROXY_PASSWORD"
status-im.config/STATUS_BUILD_ETH_RPC_PROXY_URL #shadow/env "STATUS_BUILD_ETH_RPC_PROXY_URL"}
status-im.config/ALCHEMY_BASE_SEPOLIA_TOKEN #shadow/env "ALCHEMY_BASE_SEPOLIA_TOKEN"}
:compiler-options {:output-feature-set :es5
;; We disable `:fn-deprecated` warnings because we
;; are managing deprecation via clj-kondo and we
@@ -115,27 +111,23 @@
:chunks {:fleets legacy.status-im.fleet.default-fleet/default-fleets}
:release
{:closure-defines
{status-im.config/POKT_TOKEN #shadow/env "POKT_TOKEN"
status-im.config/INFURA_TOKEN #shadow/env "INFURA_TOKEN"
status-im.config/STATUS_BUILD_PROXY_USER #shadow/env "STATUS_BUILD_PROXY_USER"
status-im.config/STATUS_BUILD_PROXY_PASSWORD #shadow/env "STATUS_BUILD_PROXY_PASSWORD"
status-im.config/OPENSEA_API_KEY #shadow/env "OPENSEA_API_KEY"
status-im.config/MIXPANEL_APP_ID #shadow/env "MIXPANEL_APP_ID"
status-im.config/MIXPANEL_TOKEN #shadow/env "MIXPANEL_TOKEN"
status-im.config/RARIBLE_MAINNET_API_KEY #shadow/env "RARIBLE_MAINNET_API_KEY"
status-im.config/RARIBLE_TESTNET_API_KEY #shadow/env "RARIBLE_TESTNET_API_KEY"
status-im.config/ALCHEMY_ETHEREUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ETHEREUM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ETHEREUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ETHEREUM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ARBITRUM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_OPTIMISM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_BASE_MAINNET_TOKEN #shadow/env "ALCHEMY_BASE_MAINNET_TOKEN"
status-im.config/ALCHEMY_BASE_SEPOLIA_TOKEN #shadow/env "ALCHEMY_BASE_SEPOLIA_TOKEN"
status-im.config/STATUS_BUILD_ETH_RPC_PROXY_USER #shadow/env "STATUS_BUILD_ETH_RPC_PROXY_USER"
status-im.config/STATUS_BUILD_ETH_RPC_PROXY_PASSWORD #shadow/env
"STATUS_BUILD_ETH_RPC_PROXY_PASSWORD"
status-im.config/STATUS_BUILD_ETH_RPC_PROXY_URL #shadow/env "STATUS_BUILD_ETH_RPC_PROXY_URL"}
{status-im.config/POKT_TOKEN #shadow/env "POKT_TOKEN"
status-im.config/INFURA_TOKEN #shadow/env "INFURA_TOKEN"
status-im.config/STATUS_BUILD_PROXY_USER #shadow/env "STATUS_BUILD_PROXY_USER"
status-im.config/STATUS_BUILD_PROXY_PASSWORD #shadow/env "STATUS_BUILD_PROXY_PASSWORD"
status-im.config/OPENSEA_API_KEY #shadow/env "OPENSEA_API_KEY"
status-im.config/MIXPANEL_APP_ID #shadow/env "MIXPANEL_APP_ID"
status-im.config/MIXPANEL_TOKEN #shadow/env "MIXPANEL_TOKEN"
status-im.config/RARIBLE_MAINNET_API_KEY #shadow/env "RARIBLE_MAINNET_API_KEY"
status-im.config/RARIBLE_TESTNET_API_KEY #shadow/env "RARIBLE_TESTNET_API_KEY"
status-im.config/ALCHEMY_ETHEREUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ETHEREUM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ETHEREUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ETHEREUM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ARBITRUM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_OPTIMISM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_BASE_MAINNET_TOKEN #shadow/env "ALCHEMY_BASE_MAINNET_TOKEN"
status-im.config/ALCHEMY_BASE_SEPOLIA_TOKEN #shadow/env "ALCHEMY_BASE_SEPOLIA_TOKEN"}
:compiler-options {:output-feature-set :es6
;;disable for android build as there
;;is an intermittent warning with deftype
@@ -6,17 +6,28 @@
[{:keys [status theme blur?]}]
{:flex-direction :row
:align-self :flex-start
:background-color (when (= status :error)
(colors/theme-colors
(colors/override-color :danger 10 50)
(colors/override-color :danger 10 60)
theme))
:background-color (cond (= status :error)
(colors/theme-colors
(colors/override-color :danger 10 50)
(colors/override-color :danger 10 60)
theme)
(= status :warning)
(colors/theme-colors
(colors/override-color :warning 10 50)
(colors/override-color :warning 10 60)
theme))
:border-width 1
:border-color (cond (= status :error)
(colors/theme-colors
(colors/override-color :danger 20 50)
(colors/override-color :danger 20 60)
theme)
(= status :warning)
(colors/theme-colors
(colors/override-color :warning 20 50)
(colors/override-color :warning 20 60)
theme)
(and blur? (= status :default)) (colors/theme-colors
colors/neutral-80-opa-5
colors/white-opa-5
@@ -35,5 +46,7 @@
[{:keys [status theme networks-shown?]}]
{:padding-left (if networks-shown? 4 0)
:margin-top -1
:color (when (= status :error)
(colors/resolve-color :danger theme))})
:color (cond (= status :error)
(colors/resolve-color :danger theme)
(= status :warning)
(colors/resolve-color :warning theme))})
+29 -32
View File
@@ -9,38 +9,35 @@
[{:keys [db]} {:keys [type action data error] :as event}]
(log/info "local pairing signal received"
{:event event})
(let [{:keys [account password chatKey]} data
role (get-in db [:syncing :role])
receiver? (= role constants/local-pairing-role-receiver)
sender? (= role constants/local-pairing-role-sender)
connection-success? (and (= type
constants/local-pairing-event-connection-success)
(= action
constants/local-pairing-action-connect))
connection-error? (= type
constants/local-pairing-event-connection-error)
error-on-pairing? (contains? constants/local-pairing-event-errors type)
completed-pairing? (and (= type
constants/local-pairing-event-transfer-success)
(= action
constants/local-pairing-action-pairing-installation))
received-account? (and (= type
constants/local-pairing-event-received-account)
(= action
constants/local-pairing-action-pairing-account)
(and (some? account) (some? password)))
multiaccount-data (when received-account?
(merge account
{:password password
:whisper-private-key chatKey}))
navigate-to-syncing-devices? (and (or connection-success? connection-error?) receiver?)
user-in-syncing-devices-screen? (or (= (:view-id db) :screen/onboarding.syncing-progress)
(= (:view-id db) :screen/profile.profiles)
(= (:view-id db)
:screen/onboarding.syncing-progress-intro))
user-in-sign-in-intro-screen? (= (:view-id db) :screen/onboarding.sign-in-intro)
keystore-files-transfer-action? (= action
constants/local-pairing-action-keystore-files-transfer)]
(let [{:keys [account password]} data
role (get-in db [:syncing :role])
receiver? (= role constants/local-pairing-role-receiver)
sender? (= role constants/local-pairing-role-sender)
connection-success? (and (= type
constants/local-pairing-event-connection-success)
(= action
constants/local-pairing-action-connect))
connection-error? (= type
constants/local-pairing-event-connection-error)
error-on-pairing? (contains? constants/local-pairing-event-errors type)
completed-pairing? (and (= type
constants/local-pairing-event-transfer-success)
(= action
constants/local-pairing-action-pairing-installation))
received-account? (and (= type
constants/local-pairing-event-received-account)
(= action
constants/local-pairing-action-pairing-account)
(and (some? account) (some? password)))
multiaccount-data (when received-account?
(merge account {:password password}))
navigate-to-syncing-devices? (and (or connection-success? connection-error?) receiver?)
user-in-syncing-devices-screen? (or (= (:view-id db) :screen/onboarding.syncing-progress)
(= (:view-id db) :screen/profile.profiles)
(= (:view-id db) :screen/onboarding.syncing-progress-intro))
user-in-sign-in-intro-screen? (= (:view-id db) :screen/onboarding.sign-in-intro)
keystore-files-transfer-action? (= action
constants/local-pairing-action-keystore-files-transfer)]
(merge {:db (cond-> db
connection-success?
(assoc-in [:syncing :pairing-status] :connected)
@@ -10,35 +10,16 @@
[utils.re-frame :as rf]
[utils.security.core :as security]))
(defn- partially-operable-accounts?
[accounts]
(->> accounts
vals
(some #(= :partially (:operable %)))
boolean))
(rf/reg-event-fx :standard-auth/migrate-partially-operable-accounts
(fn [{:keys [db]} [{:keys [masked-password on-success]}]]
(let [on-auth-success-callback #(on-success masked-password)
has-partially-operable-accounts? (-> (get-in db [:wallet :accounts])
partially-operable-accounts?)]
{:fx [(if has-partially-operable-accounts?
[:dispatch
[:wallet/make-partially-operable-accounts-fully-operable
{:password masked-password
:on-success on-auth-success-callback
:on-error on-auth-success-callback}]]
[:effects.standard-auth/on-auth-success on-auth-success-callback])]})))
(defn- handle-password-success
[{:keys [migrate-partially-operable-accounts? on-auth-success masked-password]}]
[has-partially-operable-accounts? on-auth-success masked-password]
(let [on-auth-success-callback #(on-auth-success masked-password)]
(rf/dispatch [:standard-auth/set-success true])
(rf/dispatch [:standard-auth/reset-login-password])
(if migrate-partially-operable-accounts?
(rf/dispatch [:standard-auth/migrate-partially-operable-accounts
{:masked-password masked-password
:on-success on-auth-success}])
(if has-partially-operable-accounts?
(rf/dispatch [:wallet/make-partially-operable-accounts-fully-operable
{:password masked-password
:on-success on-auth-success-callback
:on-error on-auth-success-callback}])
(on-auth-success-callback))))
(defn authorize
@@ -61,10 +42,9 @@
{:pin pin
:on-success (fn [{:keys [encryption-public-key]}]
(rf/dispatch [:keycard/disconnect])
(handle-password-success {:migrate-partially-operable-accounts? false
:on-auth-success on-auth-success
:masked-password (security/mask-data
encryption-public-key)}))
(handle-password-success false
on-auth-success
(security/mask-data encryption-public-key)))
:on-failure #(rf/dispatch [:keycard/on-action-with-pin-error
%])}]))}]))}]]
[:effects.biometric/check-if-available
@@ -105,12 +85,7 @@
keycard? (get-in db [:profile/profile :keycard-pairing])]
{:fx [(if keycard?
[:keychain/get-keycard-keys [key-uid on-auth-success]]
[:keychain/get-user-password
[key-uid
(fn [masked-password]
(rf/dispatch [:standard-auth/migrate-partially-operable-accounts
{:masked-password masked-password
:on-success on-auth-success}]))]])
[:keychain/get-user-password [key-uid on-auth-success]])
[:dispatch [:standard-auth/set-success true]]
[:dispatch [:standard-auth/reset-login-password]]]}))
@@ -133,14 +108,15 @@
(defn- bottom-sheet-password-view
[{:keys [on-press-biometric on-auth-success auth-button-icon-left auth-button-label]}]
(fn []
[enter-password/view
{:on-enter-password #(handle-password-success {:migrate-partially-operable-accounts? true
:on-auth-success on-auth-success
:masked-password (security/hash-masked-password
%)})
:on-press-biometrics on-press-biometric
:button-icon-left auth-button-icon-left
:button-label auth-button-label}]))
(let [has-partially-operable-accounts? (rf/sub [:wallet/has-partially-operable-accounts?])]
[enter-password/view
{:on-enter-password #(handle-password-success
has-partially-operable-accounts?
on-auth-success
(security/hash-masked-password %))
:on-press-biometrics on-press-biometric
:button-icon-left auth-button-icon-left
:button-label auth-button-label}])))
(defn authorize-with-keycard
[_ [{:keys [on-complete]}]]
@@ -179,12 +155,6 @@
(when on-close
(on-close success?))))
(rf/reg-fx
:effects.standard-auth/on-auth-success
(fn [on-auth-success]
(when on-auth-success
(on-auth-success))))
(rf/reg-event-fx
:standard-auth/close
(fn [{:keys [db]} [on-close]]
-3
View File
@@ -28,9 +28,6 @@
(goog-define WALLET_CONNECT_PROJECT_ID "87815d72a81d739d2a7ce15c2cfdefb3")
(goog-define MIXPANEL_APP_ID "3350627")
(goog-define MIXPANEL_TOKEN "5c73bda2d36a9f688a5ee45641fb6775")
(goog-define STATUS_BUILD_ETH_RPC_PROXY_USER "")
(goog-define STATUS_BUILD_ETH_RPC_PROXY_PASSWORD "")
(goog-define STATUS_BUILD_ETH_RPC_PROXY_URL "")
(def mainnet-rpc-url (str "https://eth-archival.rpc.grove.city/v1/" POKT_TOKEN))
(def sepolia-rpc-url (str "https://sepolia-archival.rpc.grove.city/v1/" POKT_TOKEN))
+1 -2
View File
@@ -94,8 +94,7 @@
(rf/reg-fx :effects.keycard/login-with-keycard
(fn [{:keys [key-uid password whisper-private-key]}]
(native-module/login-account
(assoc (merge (profile.config/login)
(profile.config/fix-node-config-migration))
(assoc (profile.config/login)
:keyUid key-uid
:password password
:keycardWhisperPrivateKey whisper-private-key))))
@@ -27,7 +27,5 @@
:callback
(fn [{:keys [error]}]
(if (string/blank? error)
(do
(rf/dispatch [:biometric/disable])
(rf/dispatch [:navigate-to :screen/keycard.migrate.success]))
(rf/dispatch [:navigate-to :screen/keycard.migrate.success])
(rf/dispatch [:navigate-to :screen/keycard.migrate.fail])))}]]})))
@@ -18,6 +18,7 @@
[{:type :select
:key :status
:options [{:key :error}
{:key :warning}
{:key :default}]}
{:type :text
:key :title}
+18 -28
View File
@@ -11,9 +11,6 @@
{;; Temporary fix until https://github.com/status-im/status-go/issues/3024 is resolved
:wakuV2Nameserver "8.8.8.8"
:kdfIterations 3200
:ethRpcProxyUser config/STATUS_BUILD_ETH_RPC_PROXY_USER
:ethRpcProxyPassword config/STATUS_BUILD_ETH_RPC_PROXY_PASSWORD
:ethRpcProxyUrl config/STATUS_BUILD_ETH_RPC_PROXY_URL
:statusProxyEnabled config/status-proxy-enabled?
:statusProxyStageName config/status-proxy-stage-name
:statusProxyMarketUser config/STATUS_BUILD_PROXY_USER
@@ -34,35 +31,28 @@
:alchemyBaseMainnetToken config/ALCHEMY_BASE_MAINNET_TOKEN
:alchemyBaseSepoliaToken config/ALCHEMY_BASE_SEPOLIA_TOKEN})
(defn- common-config
[]
{:verifyTransactionURL config/verify-transaction-url
:verifyENSURL config/verify-ens-url
:verifyENSContractAddress config/verify-ens-contract-address
:verifyTransactionChainID config/verify-transaction-chain-id
:wakuV2LightClient true
:wakuV2EnableMissingMessageVerification true
:wakuV2EnableStoreConfirmationForMessagesSent false})
(defn fix-node-config-migration
[]
(common-config))
(defn create
[]
(let [log-enabled? (boolean (not-empty config/log-level))]
(merge
(assoc
(login)
(common-config)
{:deviceName (native-module/get-installation-name)
:rootDataDir (native-module/backup-disabled-data-dir)
:rootKeystoreDir (native-module/keystore-dir)
:logLevel (when log-enabled? config/log-level)
:logEnabled log-enabled?
:logFilePath (native-module/log-file-directory)
:wakuV2Fleet config/fleet
:previewPrivacy config/blank-preview?
:testNetworksEnabled config/test-networks-enabled?})))
:deviceName (native-module/get-installation-name)
:rootDataDir (native-module/backup-disabled-data-dir)
:rootKeystoreDir (native-module/keystore-dir)
:logLevel (when log-enabled? config/log-level)
:logEnabled log-enabled?
:logFilePath (native-module/log-file-directory)
:verifyTransactionURL config/verify-transaction-url
:verifyENSURL config/verify-ens-url
:verifyENSContractAddress config/verify-ens-contract-address
:verifyTransactionChainID config/verify-transaction-chain-id
:wakuV2LightClient true
:wakuV2Fleet config/fleet
;; NOTE: https://github.com/status-im/status-go/pull/5570#discussion_r1690794119
:wakuV2EnableMissingMessageVerification true
:wakuV2EnableStoreConfirmationForMessagesSent false
:previewPrivacy config/blank-preview?
:testNetworksEnabled config/test-networks-enabled?)))
(defn strip-file-prefix
[path]
@@ -8,10 +8,7 @@
(fn [[key-uid hashed-password]]
;;"node.login" signal will be triggered as a callback
(native-module/login-account
(assoc (merge (profile.config/login)
(profile.config/fix-node-config-migration))
:keyUid key-uid
:password hashed-password))))
(assoc (profile.config/login) :keyUid key-uid :password hashed-password))))
(rf/reg-fx :effects.profile/enable-local-notifications
(fn []
@@ -26,22 +26,16 @@
(rf/reg-event-fx :profile.login/local-paired-user
(fn [{:keys [db]}]
(let [{:keys [key-uid password keycard-pairing
whisper-private-key]} (get-in db [:syncing :profile])
login-sha3-password (get-in db [:syncing :login-sha3-password])
password (if-not (nil? login-sha3-password) ;; already logged in
login-sha3-password
password)
masked-password (security/mask-data password)]
{:db (-> db
(assoc-in [:onboarding/profile :password] masked-password)
(assoc-in [:onboarding/profile :syncing?] true))
:fx [(if keycard-pairing
[:effects.keycard/login-with-keycard
{:password password
:whisper-private-key whisper-private-key
:key-uid key-uid}]
[:effects.profile/login [key-uid password]])]})))
(let [{:keys [key-uid password]} (get-in db [:syncing :profile])
login-sha3-password (get-in db [:syncing :login-sha3-password])
password (if-not (nil? login-sha3-password) ;; already logged in
login-sha3-password
password)
masked-password (security/mask-data password)]
{:db (-> db
(assoc-in [:onboarding/profile :password] masked-password)
(assoc-in [:onboarding/profile :syncing?] true))
:effects.profile/login [key-uid password]})))
;; login phase 1: we want to load and show chats faster, so we split login into 2 phases
(rf/reg-event-fx :profile.login/login-existing-profile
@@ -144,9 +144,9 @@
on-change-text (rn/use-callback
(fn [new-value]
(let [trimmed-value (string/trim new-value)]
(set-error (validate (string/lower-case trimmed-value)))
(set-address-or-ens trimmed-value)
(set-ens-address "")
(set-error (validate (string/lower-case trimmed-value)))
(when (validation/ens-name? trimmed-value)
(debounce/debounce-and-dispatch
[:wallet/resolve-ens
@@ -154,15 +154,3 @@
{:db (update-in db [:wallet :ui] dissoc :saved-address)})
(rf/reg-event-fx :wallet/clear-address-to-save clear-address-to-save)
(defn check-remaining-capacity-for-saved-addresses
[{:keys [db]} [{:keys [on-success on-error]}]]
(let [test-networks-enabled? (boolean (get-in db [:profile/profile :test-networks-enabled?]))]
{:fx [[:json-rpc/call
[{:method "wakuext_remainingCapacityForSavedAddresses"
:params [test-networks-enabled?]
:on-success on-success
:on-error on-error}]]]}))
(rf/reg-event-fx :wallet/check-remaining-capacity-for-saved-addresses
check-remaining-capacity-for-saved-addresses)
@@ -103,13 +103,7 @@
(defn- add-address-to-save
[]
(rf/dispatch [:wallet/check-remaining-capacity-for-saved-addresses
{:on-success #(rf/dispatch [:open-modal :screen/settings.add-address-to-save])
:on-error #(rf/dispatch [:toasts/upsert
{:type :negative
:theme :dark
:text (i18n/label
:t/saved-addresses-limit-reached-toast)}])}]))
(rf/dispatch [:open-modal :screen/settings.add-address-to-save]))
(defn view
[]
@@ -64,7 +64,7 @@
[button (assoc params :word (second options))]])
(defn- complete-backup-sheet
[on-success on-try-again]
[on-success]
(let [customization-color (rf/sub [:profile/customization-color])
[checked? set-checked] (rn/use-state false)]
[:<>
@@ -88,10 +88,7 @@
:button-two-label (i18n/label :t/cancel)
:button-two-props {:type :grey
:on-press (fn []
(rf/dispatch [:hide-bottom-sheet])
(when on-try-again
(rf/dispatch [:navigate-back])
(on-try-again)))}}]]))
(rf/dispatch [:hide-bottom-sheet]))}}]]))
(defn view
[]
@@ -126,8 +123,7 @@
{:theme theme
:shell? shell?
:content (fn [] [complete-backup-sheet
on-success
on-try-again])}])))
on-success])}])))
(do
(when (> @incorrect-count 0)
(rf/dispatch [:show-bottom-sheet
@@ -35,12 +35,13 @@
chain-ids (chain/chain-ids db)
params [[address] chain-ids (create-default-filters) limit-per-request]]
{:db (-> db
(update-in [:wallet :activities] dissoc address)
(update-in [:wallet :ui :activity-tab :request] dissoc :request-id)
(update-in [:wallet :ui :activity-tab :request]
assoc
:address address
:loading? true
:remove-all-previous-activites? true))
:address address
:loading? true
:initial-request? true))
:fx [[:json-rpc/call
[{:method "wallet_startActivityFilterSessionV2"
:params params
@@ -68,8 +69,7 @@
has-more? (get-in db [:wallet :ui :activity-tab :request :has-more?])
params [session-id limit-per-request]]
(when (and session-id has-more?)
{:db (assoc-in db [:wallet :ui :activity-tab :request :remove-all-existing-activities?] false)
:fx [[:json-rpc/call
{:fx [[:json-rpc/call
[{:method "wallet_getMoreForActivityFilterSession"
:params params
:on-error [:wallet/log-rpc-error
@@ -80,7 +80,7 @@
:wallet/reset-activities-filter-session
(fn [{:keys [db]}]
(when-let [session-id (get-in db [:wallet :ui :activity-tab :request :request-id])]
{:db (assoc-in db [:wallet :ui :activity-tab :request :remove-all-existing-activities?] true)
{:db (assoc-in db [:wallet :ui :activity-tab :request :initial-request?] true)
:fx [[:json-rpc/call
[{:method "wallet_resetActivityFilterSession"
:params [session-id limit-per-request]
@@ -91,22 +91,21 @@
(rf/reg-event-fx
:wallet/activity-filtering-for-current-account-done
(fn [{:keys [db]} [{:keys [message]}]]
(let [{:keys [address
remove-all-existing-activities?]} (get-in db [:wallet :ui :activity-tab :request])
{:keys [activities offset hasMore]} (transforms/json->clj message)
new-activities (->> activities
(cske/transform-keys
transforms/->kebab-case-keyword)
(collection/index-by :key))
existing-activities (get-in db [:wallet :activities address])
updated-activities (if remove-all-existing-activities?
new-activities
(nested-merge existing-activities new-activities))]
(let [{:keys [address initial-request?]} (get-in db [:wallet :ui :activity-tab :request])
{:keys [activities offset hasMore]} (transforms/json->clj message)
new-activities (->> activities
(cske/transform-keys transforms/->kebab-case-keyword)
(collection/index-by :key))
existing-activities (get-in db [:wallet :activities address])
updated-activities (if initial-request?
new-activities
(nested-merge existing-activities new-activities))]
{:db (-> db
(assoc-in [:wallet :activities address] updated-activities)
(assoc-in [:wallet :ui :activity-tab :request :offset] offset)
(assoc-in [:wallet :ui :activity-tab :request :has-more?] hasMore)
(assoc-in [:wallet :ui :activity-tab :request :loading?] false))})))
(assoc-in [:wallet :ui :activity-tab :request :loading?] false)
(assoc-in [:wallet :ui :activity-tab :request :initial-request?] false))})))
(rf/reg-event-fx
:wallet/activities-filtering-entries-updated
@@ -31,20 +31,11 @@
on-end-reached (rn/use-callback
#(rf/dispatch
[:wallet/get-more-for-activities-filter-session]))]
(cond
(and (empty? activity-list) loading?)
[quo/skeleton-list
{:content :messages
:parent-height (:height (rn/get-window))
:animated? false}]
(and (empty? activity-list) (false? loading?))
(if (and (and (some? loading?) (false? loading?)) (empty? activity-list))
[empty-tab/view
{:title (i18n/label :t/no-activity)
:description (i18n/label :t/empty-tab-description)
:image (resources/get-themed-image :no-activity theme)}]
:else
[rn/section-list
{:sections activity-list
:sticky-section-headers-enabled false
+46 -30
View File
@@ -5,7 +5,7 @@
[clojure.string :as string]
[status-im.constants :as constants]
[status-im.contexts.wallet.collectible.utils :as collectible-utils]
[status-im.contexts.wallet.send.transaction-settings.core :as transaction-settings]
[status-im.contexts.wallet.common.utils.networks :as network-utils]
[status-im.contexts.wallet.send.utils :as send-utils]
[utils.collection :as utils.collection]
[utils.money :as money]
@@ -165,7 +165,10 @@
(defn- add-keys-to-saved-address
[saved-address]
(assoc saved-address :ens? (not (string/blank? (:ens saved-address)))))
(-> saved-address
(assoc :network-preferences-names
(network-utils/network-preference-prefix->network-names (:chain-short-names saved-address)))
(assoc :ens? (not (string/blank? (:ens saved-address))))))
(defn rpc->saved-address
[saved-address]
@@ -228,8 +231,20 @@
(def ^:private precision 6)
(defn from-wei
[wei-amount]
(send-utils/convert-to-gwei wei-amount precision))
(defn new->old-route-path
[new-path]
(tap> {:in :new->old-route-path
:new-path new-path
:suggested-tx-nonce (-> new-path
:suggested-tx-nonce
money/from-hex
money/to-string
js/parseInt)
:suggested-tx-gas-amount (:suggested-tx-gas-amount new-path)})
(let [to-bignumber (fn [k] (-> new-path k money/bignumber))
suggested-levels-for-max-fees-per-gas (:suggested-levels-for-max-fees-per-gas new-path)]
{:approval-fee (to-bignumber :approval-fee)
@@ -241,33 +256,26 @@
:amount-in (:amount-in new-path)
:max-amount-in (:max-amount-in new-path)
:gas-fees {:gas-price "0"
:base-fee (send-utils/convert-to-gwei (:tx-base-fee
new-path)
precision)
:max-priority-fee-per-gas (send-utils/convert-to-gwei (:tx-priority-fee
new-path)
precision)
:l-1-gas-fee (send-utils/convert-to-gwei (:tx-l-1-fee
new-path)
precision)
:base-fee (from-wei (:tx-base-fee new-path))
:tx-priority-fee (from-wei (:tx-priority-fee new-path))
:l-1-gas-fee (from-wei (:tx-l-1-fee new-path))
:eip-1559-enabled true
:tx-max-fees-per-gas (send-utils/convert-to-gwei
(:tx-max-fees-per-gas
new-path)
precision)
:tx-max-fees-per-gas (from-wei (:tx-max-fees-per-gas new-path))
:current-base-fee (from-wei (:current-base-fee new-path))
:suggested-min-priority-fee (from-wei (:suggested-min-priority-fee
new-path))
:suggested-max-priority-fee (from-wei (:suggested-max-priority-fee
new-path))
:suggested-gas-fees-for-setting
{:tx-fee-mode/normal (send-utils/convert-to-gwei
(:low
suggested-levels-for-max-fees-per-gas)
precision)
:tx-fee-mode/fast (send-utils/convert-to-gwei
(:medium
suggested-levels-for-max-fees-per-gas)
precision)
:tx-fee-mode/urgent (send-utils/convert-to-gwei
(:high
suggested-levels-for-max-fees-per-gas)
precision)}}
{:transaction-setting/normal (from-wei
(:low
suggested-levels-for-max-fees-per-gas))
:transaction-setting/fast (from-wei
(:medium
suggested-levels-for-max-fees-per-gas))
:transaction-setting/urgent (from-wei
(:high
suggested-levels-for-max-fees-per-gas))}}
:bridge-name (:processor-name new-path)
:amount-out (:amount-out new-path)
:approval-contract-address (:approval-contract-address new-path)
@@ -275,11 +283,19 @@
:estimated-time (:estimated-time new-path)
:to (:to-chain new-path)
:approval-amount-required (:approval-amount-required new-path)
;; :cost () ;; tbd not used on desktop
:gas-amount (:tx-gas-amount new-path)
:router-input-params-uuid (:router-input-params-uuid new-path)
:tx-fee-mode (transaction-settings/gas-rate->tx-fee-mode (:tx-gas-fee-mode
new-path))}))
:nonce (-> new-path
:tx-nonce
money/from-hex
money/to-string
js/parseInt)
:suggested-tx-nonce (-> new-path
:suggested-tx-nonce
money/from-hex
money/to-string
js/parseInt)
:suggested-tx-gas-amount (:suggested-tx-gas-amount new-path)}))
(defn tokens-never-loaded?
[db]
+13 -14
View File
@@ -57,10 +57,11 @@
(rf/reg-event-fx :wallet/select-account-tab
(fn [{:keys [db]} [tab]]
{:db (assoc-in db [:wallet :ui :account-page :active-tab] tab)
:fx [(if (= tab :activity)
[:dispatch [:wallet/fetch-activities-for-current-account]]
[:dispatch [:wallet/stop-activity-filter-session]])]}))
(let [activity-tab-selected? (= tab :activity)]
{:db (assoc-in db [:wallet :ui :account-page :active-tab] tab)
:fx [(if activity-tab-selected?
[:dispatch [:wallet/fetch-activities-for-current-account]]
[:dispatch [:wallet/stop-activity-filter-session]])]})))
(rf/reg-event-fx :wallet/select-home-tab
(fn [{:keys [db]} [tab]]
@@ -435,16 +436,14 @@
(rf/reg-event-fx
:wallet/start-bridge
(fn [{:keys [db]}]
{:db (assoc-in db [:wallet :ui :send :tx-type] :tx/bridge)
:fx [[:dispatch
[:wallet/wizard-navigate-forward
{:start-flow? true
:flow-id :wallet-bridge-flow}]]]}))
(rf/reg-event-fx
:wallet/set-send-tx-type
(fn [{:keys [db]} [type]]
{:db (assoc-in db [:wallet :ui :send :tx-type] type)}))
(let [view-id (:view-id db)]
(cond-> {:db (assoc-in db [:wallet :ui :send :tx-type] :tx/bridge)}
(= view-id :screen/wallet.accounts)
(assoc :fx
[[:dispatch
[:wallet/wizard-navigate-forward
{:start-flow? true
:flow-id :wallet-bridge-flow}]]])))))
(rf/reg-event-fx :wallet/select-bridge-network
(fn [{:keys [db]} [{:keys [network-chain-id stack-id]}]]
+2 -6
View File
@@ -91,16 +91,12 @@
{:content buy-token/view}]))
on-bridge-press (rn/use-callback
(fn []
;; For a single account, it starts the bridge flow immediately. For
;; multiple accounts, it sets the transaction type and starts the
;; bridge flow after account selection.
(rf/dispatch [:wallet/clean-send-data])
(when-not multiple-accounts?
(rf/dispatch [:wallet/switch-current-viewing-account
first-account-address])
(rf/dispatch [:wallet/start-bridge]))
first-account-address]))
(rf/dispatch [:wallet/start-bridge])
(when multiple-accounts?
(rf/dispatch [:wallet/set-send-tx-type :tx/bridge])
(rf/dispatch [:open-modal :screen/wallet.select-from])))
[multiple-accounts? first-account-address])
on-swap-press (rn/use-callback
+44 -52
View File
@@ -92,7 +92,8 @@
:receiver-network-values receiver-network-values
:network-links network-links
:loading-suggested-routes? false
:enough-assets? true)}))))
:enough-assets? true)
:fx [#_[:dispatch [:wallet/clear-user-tx-settings]]]}))))
(rf/reg-event-fx
:wallet/suggested-routes-error
@@ -664,10 +665,7 @@
:wallet/handle-suggested-routes
(fn [{:keys [db]} [data]]
(let [{send :send swap? :swap} (-> db :wallet :ui)
skip-processing-routes? (:skip-processing-suggested-routes? send)
clean-user-tx-settings? (get-in db
[:wallet :ui :send :custom-tx-settings
:delete-on-routes-update?])]
skip-processing-routes? (:skip-processing-suggested-routes? send)]
(when (or swap? (not skip-processing-routes?))
(let [{error-code :code
:as error} (:ErrorResponse data)
@@ -678,16 +676,13 @@
(log/error "failed to get suggested routes (async)"
{:event :wallet/handle-suggested-routes
:error error-message}))
(merge
(when clean-user-tx-settings?
{:db (update-in db [:wallet :ui :send] dissoc :custom-tx-settings)})
{:fx [[:dispatch
(cond
(and failure? swap?) [:wallet/swap-proposal-error error]
failure? [:wallet/suggested-routes-error error-message]
swap? [:wallet/swap-proposal-success (fix-routes data)]
:else [:wallet/suggested-routes-success (fix-routes data)
enough-assets?])]]}))))))
{:fx [[:dispatch
(cond
(and failure? swap?) [:wallet/swap-proposal-error error]
failure? [:wallet/suggested-routes-error error-message]
swap? [:wallet/swap-proposal-success (fix-routes data)]
:else [:wallet/suggested-routes-success (fix-routes data)
enough-assets?])]]})))))
(rf/reg-event-fx
:wallet/transaction-success
@@ -845,67 +840,64 @@
:fx [[:dispatch [:navigate-back]]]})))
(rf/reg-event-fx
:wallet/init-tx-settings
:wallet/clear-user-tx-settings
(fn [{db :db}]
{:db (-> db
(assoc-in [:wallet :ui :send :custom-tx-settings]
{:max-base-fee {:low 5
:current 8.2
:high 9}
:priority-fee {:low 0.6
:high 5.1
:current 1.1}
:max-gas-amount {:low 30000
:current 31000}
:nonce {:last-transaction 21
:current 22}}))}))
{:db (update-in db [:wallet :ui :send] dissoc :user-tx-settings)}))
(rf/reg-event-fx
:wallet/set-max-base-fee
(fn [{db :db} [value]]
{:db (assoc-in db [:wallet :ui :send :custom-tx-settings :max-base-fee :current] value)}))
{:db (assoc-in db [:wallet :ui :send :user-tx-settings :max-base-fee] value)}))
(rf/reg-event-fx
:wallet/set-priority-fee
(fn [{db :db} [value]]
{:db (assoc-in db [:wallet :ui :send :custom-tx-settings :priority-fee :current] value)}))
{:db (assoc-in db [:wallet :ui :send :user-tx-settings :priority-fee] value)}))
(rf/reg-event-fx
:wallet/set-max-gas-amount
(fn [{db :db} [value]]
{:db (assoc-in db [:wallet :ui :send :custom-tx-settings :max-gas-amount :current] value)}))
{:db (assoc-in db [:wallet :ui :send :user-tx-settings :gas-amount] value)}))
(rf/reg-event-fx
:wallet/set-nonce
(fn [{db :db} [value]]
{:db (assoc-in db [:wallet :ui :send :tx-settings :nonce :current] value)}))
{:db (assoc-in db [:wallet :ui :send :user-tx-settings :nonce] value)}))
(rf/reg-event-fx :wallet/quick-fee-mode-confirmed
(fn [{db :db} [fee-mode]]
(let [gas-rate (transaction-settings/tx-fee-mode->gas-rate fee-mode)
(rf/reg-event-fx :wallet/quick-transaction-settings-confirmed
(fn [{db :db} [confirmed-setting]]
(let [gas-rate (transaction-settings/transaction-setting->gas-rate confirmed-setting)
route (first (get-in db [:wallet :ui :send :route]))
path-tx-identity (send-utils/path-identity route)
params [path-tx-identity gas-rate]]
{:db (assoc-in db [:wallet :ui :send :custom-tx-settings :tx-fee-mode] fee-mode)
:fx [[:json-rpc/call
[{:method "wallet_setFeeMode"
:params params
:on-error (fn [error]
(log/error "failed to set quick transaction settings"
{:event :wallet/quick-fee-mode-confirmed
:error (:message error)
:params params}))}]]
[:dispatch [:wallet/mark-user-tx-settings-for-deletion]]]})))
{:db (assoc-in db [:wallet :ui :send :confirmed-quick-tx-setting] confirmed-setting)
:json-rpc/call [{:method "wallet_setFeeMode"
:params params
:on-error (fn [error]
(log/error "failed to set quick transaction settings"
{:event :wallet/quick-transaction-settings-confirmed
:error (:message error)
:params params}))}]})))
;; There is a delay between the moment when user selected
;; custom settings and the moment when new route arrived
;; with those settings applied. During this delay
;; we should keep user settings for ui. After new route
;; arrived we should clean the settings.
(rf/reg-event-fx :wallet/mark-user-tx-settings-for-deletion
(rf/reg-event-fx :wallet/custom-transaction-settings-confirmed
(fn [{db :db}]
{:db (assoc-in db [:wallet :ui :send :custom-tx-settings :delete-on-routes-update?] true)}))
(let [route (first (get-in db [:wallet :ui :send :route]))
user-tx-settings (get-in db [:wallet :ui :send :user-tx-settings])
path-tx-identity (send-utils/path-identity route)
custom-tx-params (send-utils/path-tx-custom-params user-tx-settings route)
params [path-tx-identity custom-tx-params]]
(tap> {:in :wallet/custom-transaction-settings-confirmed
:custom-tx-params custom-tx-params})
{:json-rpc/call [{:method "wallet_setCustomTxDetails"
:params params
:on-error (fn [error]
(log/error "failed to set custom tx settings"
{:event :wallet/custom-transaction-settings-confirmed
:error (:message error)
:params params}))}]}))
)
(rf/reg-event-fx :wallet.send/set-sign-transactions-callback-fx
@@ -65,9 +65,8 @@
:to {:chain-id 1
:native-currency-symbol "ETH"}
:gas-amount "23487"
:gas-fees {:base-fee "32.325296406"
:max-priority-fee-per-gas "0.011000001"
:eip1559-enabled true}}]
:gas-fees {:base-fee "32.325296406"
:eip1559-enabled true}}]
:wallet/wallet-send-suggested-routes nil
:wallet/wallet-send-receiver-networks [1]
:view-id :screen/wallet.send-input-amount
@@ -182,17 +182,18 @@
[rn/activity-indicator {:style {:flex 1}}]
route-loaded?
[:<>
[quo/button
{:icon-only? true
:type :outline
:size 32
:inner-style {:opacity 1}
:accessibility-label :advanced-button
:container-style {:margin-right 8}
:on-press #(rf/dispatch
[:show-bottom-sheet
{:content transaction-settings/settings-sheet}])}
:i/advanced]
(when (ff/enabled? ::ff/wallet.transaction-params)
[quo/button
{:icon-only? true
:type :outline
:size 32
:inner-style {:opacity 1}
:accessibility-label :advanced-button
:container-style {:margin-right 8}
:on-press #(rf/dispatch
[:show-bottom-sheet
{:content transaction-settings/settings-sheet}])}
:i/advanced])
[data-item
{:title (i18n/label :t/est-time)
:subtitle (i18n/label :t/time-in-mins {:minutes (str estimated-time-min)})}]
@@ -246,10 +247,6 @@
biometric-auth? (= (rf/sub [:auth-method]) constants/auth-method-biometric)
biometric-type (rf/sub [:biometrics/supported-type])]
(hot-reload/use-safe-unmount #(rf/dispatch [:wallet/clean-route-data-for-collectible-tx]))
(rn/use-mount
(fn []
(when (ff/enabled? ::ff/wallet.transaction-params)
(rf/dispatch [:wallet/init-tx-settings]))))
[rn/view {:style {:flex 1}}
[floating-button-page/view
{:footer-container-padding 0
@@ -2,22 +2,13 @@
(:require
[status-im.constants :as constants]))
(def default-transaction-setting :tx-fee-mode/fast)
(def default-transaction-setting :transaction-setting/fast)
(defn tx-fee-mode->gas-rate
[tx-fee-mode]
(case tx-fee-mode
:tx-fee-mode/normal constants/gas-rate-low
:tx-fee-mode/fast constants/gas-rate-medium
:tx-fee-mode/urgent constants/gas-rate-high
:tx-fee-mode/custom constants/gas-rate-custom
(defn transaction-setting->gas-rate
[transaction-setting]
(case transaction-setting
:transaction-setting/normal constants/gas-rate-low
:transaction-setting/fast constants/gas-rate-medium
:transaction-setting/urgent constants/gas-rate-high
:transaction-setting/custom constants/gas-rate-custom
constants/gas-rate-medium))
(defn gas-rate->tx-fee-mode
[gas-rate]
(condp = gas-rate
constants/gas-rate-low :tx-fee-mode/normal
constants/gas-rate-medium :tx-fee-mode/fast
constants/gas-rate-high :tx-fee-mode/urgent
constants/gas-rate-custom :tx-fee-mode/custom
:tx-fee-mode/fast))
@@ -6,25 +6,36 @@
[utils.re-frame :as rf]))
(defn gas-amount-hint-text
[{:keys [current]} lower-limit-exceeded? _upper-limit-exceeded?]
[current {:keys [low high]} _entered-value lower-limit-exceeded? upper-limit-exceeded?]
(cond
lower-limit-exceeded? (i18n/label :t/gas-amount-lower {:current current})
lower-limit-exceeded? (i18n/label :t/gas-amount-lower {:low low})
upper-limit-exceeded? (i18n/label :t/gas-amount-higher {:high high})
:else (i18n/label :t/current-units {:current current})))
(defn gas-amount-hint-status
[_entered-value lower-limit-exceeded? upper-limit-exceeded?]
(if (or lower-limit-exceeded? upper-limit-exceeded?)
:error
:default))
(defn view
[]
(let [suggested-values (rf/sub [:wallet/tx-settings-max-gas-amount])
hint-text (partial gas-amount-hint-text suggested-values)]
(let [spectrum {:low 21000
:high 7920027}
current (rf/sub [:wallet/tx-settings-gas-amount])
hint-text (partial gas-amount-hint-text current spectrum)]
[transaction-settings/custom-setting-screen
{:screen-title (i18n/label :t/max-gas-amount)
:token-symbol :units
:hint-text-fn hint-text
:suggested-values suggested-values
:info-title (i18n/label :t/gas-amount)
:info-content (i18n/label :t/about-gas-amount)
:on-save (fn [new-val]
(rf/dispatch [:wallet/set-max-gas-amount new-val])
(rf/dispatch [:navigate-back])
(rf/dispatch [:show-bottom-sheet
{:content transaction-settings/custom-settings-sheet}]))
:with-decimals? false}]))
{:screen-title (i18n/label :t/max-gas-amount)
:token-symbol :units
:hint-text-fn hint-text
:status-fn gas-amount-hint-status
:current current
:spectrum spectrum
:info-title (i18n/label :t/gas-amount)
:info-content (i18n/label :t/about-gas-amount)
:on-save (fn [new-val]
(rf/dispatch [:wallet/set-max-gas-amount new-val])
(rf/dispatch [:navigate-back])
(rf/dispatch [:show-bottom-sheet
{:content transaction-settings/custom-settings-sheet}]))
:with-decimals? false}]))
@@ -6,25 +6,36 @@
[utils.re-frame :as rf]))
(defn max-base-fee-hint-text
[current lower-limit-exceeded? upper-limit-exceeded?]
[max-base-fee priority-fee _entered-value lower-limit-exceeded? upper-limit-exceeded?]
(cond
upper-limit-exceeded? (i18n/label :t/max-base-fee-higher {:current current})
lower-limit-exceeded? (i18n/label :t/max-base-fee-lower {:current current})
:else (i18n/label :t/fee-current-gwei {:current current})))
upper-limit-exceeded? (i18n/label :t/max-base-fee-higher {:current max-base-fee})
lower-limit-exceeded? (i18n/label :t/max-base-fee-lower {:priority-fee priority-fee})
:else (i18n/label :t/max-base-fee-current {:current max-base-fee})))
(defn input-status
[_entered-value lower-limit-exceeded? upper-limit-exceeded?]
(cond
upper-limit-exceeded? :warning
lower-limit-exceeded? :error
:else :default))
(defn view
[]
(let [suggested-values (rf/sub [:wallet/tx-settings-max-base-fee])
hint-text (partial max-base-fee-hint-text (:current suggested-values))]
(let [max-base-fee (rf/sub [:wallet/tx-settings-max-base-fee])
priority-fee (rf/sub [:wallet/tx-settings-priority-fee])
hint-text (partial max-base-fee-hint-text max-base-fee priority-fee)]
[transaction-settings/custom-setting-screen
{:screen-title (i18n/label :t/max-base-fee)
:token-sybmol :gwei
:hint-text-fn hint-text
:suggested-values suggested-values
:info-title (i18n/label :t/max-base-fee)
:info-content (i18n/label :t/about-max-base-fee)
:on-save (fn [new-val]
(rf/dispatch [:wallet/set-max-base-fee new-val])
(rf/dispatch [:navigate-back])
(rf/dispatch [:show-bottom-sheet
{:content transaction-settings/custom-settings-sheet}]))}]))
{:screen-title (i18n/label :t/max-base-fee)
:token-sybmol :gwei
:hint-text-fn hint-text
:status-fn input-status
:current max-base-fee
:spectrum {:high max-base-fee
:low priority-fee}
:info-title (i18n/label :t/max-base-fee)
:info-content (i18n/label :t/about-max-base-fee)
:on-save (fn [new-val]
(rf/dispatch [:wallet/set-max-base-fee new-val])
(rf/dispatch [:navigate-back])
(rf/dispatch [:show-bottom-sheet
{:content transaction-settings/custom-settings-sheet}]))}]))
@@ -11,14 +11,15 @@
(defn view
[]
(let [{:keys [last-transaction current]} (rf/sub [:wallet/tx-settings-nonce])
suggested-nonce (inc last-transaction)
[input-state set-input-state] (rn/use-state (controlled-input/set-value-numeric
controlled-input/init-state
current))
input-value (controlled-input/input-value input-state)
warning? (> (controlled-input/value-numeric input-state)
suggested-nonce)]
(let [current (rf/sub [:wallet/tx-settings-nonce])
suggested-nonce (rf/sub [:wallet/tx-settings-suggested-nonce])
last-tx-nonce (dec suggested-nonce)
[input-state set-input-state] (rn/use-state (controlled-input/set-value-numeric
controlled-input/init-state
current))
input-value (controlled-input/input-value input-state)
warning? (> (controlled-input/value-numeric input-state)
current)]
[rn/view
{:style {:flex 1}}
[quo/page-nav
@@ -41,7 +42,10 @@
[quo/input
{:type :text
:label (i18n/label :t/type-nonce)
:label-right (i18n/label :t/last-transaction-is {:number last-transaction})
:label-right (i18n/label :t/last-transaction-is
{:number (if (< last-tx-nonce 0)
"-"
last-tx-nonce)})
:editable false
:default-value input-value
:clearable? true
@@ -6,25 +6,62 @@
[utils.re-frame :as rf]))
(defn priority-fee-hint-text
[{:keys [current low high]} lower-limit-exceeded? upper-limit-exceeded?]
[priority-fee spectrum max-base-fee entered-value lower-limit-exceeded? upper-limit-exceeded?]
(cond
upper-limit-exceeded? (i18n/label :t/priority-fee-higher {:low low :high high})
lower-limit-exceeded? (i18n/label :t/priority-fee-lower {:low low :high high})
:else (i18n/label :t/fee-current-gwei {:current current})))
(and upper-limit-exceeded? (> entered-value max-base-fee))
(i18n/label :t/priority-fee-higher-max-base {:max-base-fee max-base-fee})
upper-limit-exceeded?
(i18n/label :t/priority-fee-higher spectrum)
lower-limit-exceeded?
(i18n/label :t/priority-fee-lower spectrum)
:else
(i18n/label :t/priority-fee-current {:current priority-fee})))
(defn priority-fee-hint-status
[max-base-fee entered-value lower-limit-exceeded? upper-limit-exceeded?]
(cond
(and upper-limit-exceeded? (> entered-value max-base-fee))
:error
upper-limit-exceeded?
:warning
lower-limit-exceeded?
:warning
:else
:default))
(comment
(rf/sub [:wallet/tx-settings-gas-fees])
(rf/sub [:wallet/tx-settings-priority-fee])
(rf/sub [:wallet/send-route])
(:gas-fees (first (rf/sub [:wallet/send-route])))
(rf/dispatch [:navigate-back])
)
(defn view
[]
(let [suggested-values (rf/sub [:wallet/tx-settings-priority-fee])
hint-text (partial priority-fee-hint-text suggested-values)]
(let [priority-fee (rf/sub [:wallet/tx-settings-priority-fee])
max-base-fee (rf/sub [:wallet/tx-settings-max-base-fee])
spectrum {:low (rf/sub [:wallet/tx-settings-suggested-min-priority-fee])
:high (rf/sub [:wallet/tx-settings-suggested-max-priority-fee])}
hint-text (partial priority-fee-hint-text priority-fee spectrum max-base-fee)
hint-status (partial priority-fee-hint-status max-base-fee)]
[transaction-settings/custom-setting-screen
{:screen-title (i18n/label :t/priority-fee)
:token-sybmol :gwei
:hint-text-fn hint-text
:suggested-values suggested-values
:info-title (i18n/label :t/priority-fee)
:info-content (i18n/label :t/about-priority-fee)
:on-save (fn [new-val]
(rf/dispatch [:wallet/set-priority-fee new-val])
(rf/dispatch [:navigate-back])
(rf/dispatch [:show-bottom-sheet
{:content transaction-settings/custom-settings-sheet}]))}]))
{:screen-title (i18n/label :t/priority-fee)
:token-sybmol :gwei
:hint-text-fn hint-text
:status-fn hint-status
:current priority-fee
:spectrum spectrum
:info-title (i18n/label :t/priority-fee)
:info-content (i18n/label :t/about-priority-fee)
:on-save (fn [new-val]
(rf/dispatch [:wallet/set-priority-fee new-val])
(rf/dispatch [:navigate-back])
(rf/dispatch [:show-bottom-sheet
{:content transaction-settings/custom-settings-sheet}]))}]))
@@ -5,18 +5,16 @@
[react-native.platform :as platform]
[react-native.safe-area :as safe-area]
[status-im.common.controlled-input.utils :as controlled-input]
[status-im.feature-flags :as ff]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
(defn custom-settings-sheet
[_]
(let [max-base-fee (:current (rf/sub [:wallet/tx-settings-max-base-fee]))
priority-fee (:current (rf/sub [:wallet/tx-settings-priority-fee]))
max-gas-amount (:current (rf/sub [:wallet/tx-settings-max-gas-amount]))
nonce (:current (rf/sub [:wallet/tx-settings-nonce]))
account-color (rf/sub [:wallet/current-viewing-account-color])]
(let [max-base-fee (rf/sub [:wallet/tx-settings-max-base-fee])
priority-fee (rf/sub [:wallet/tx-settings-priority-fee])
max-gas-amount (rf/sub [:wallet/tx-settings-gas-amount])
nonce (rf/sub [:wallet/tx-settings-nonce])]
[rn/view
[quo/drawer-top
{:title (i18n/label :t/custom)}]
@@ -64,18 +62,15 @@
:preview-size :size-32}]}]
[quo/bottom-actions
{:actions :one-action
:button-one-props {:on-press #(rf/dispatch [:hide-bottom-sheet])
:customization-color account-color}
:button-one-props {:on-press (fn []
(rf/dispatch [:wallet/custom-transaction-settings-confirmed])
(rf/dispatch [:hide-bottom-sheet]))}
:button-one-label (i18n/label :t/confirm)}]]))
(defn settings-sheet
[]
(let [current-transaction-setting (rf/sub [:wallet/tx-fee-mode])
account-color (rf/sub [:wallet/current-viewing-account-color])
[transaction-setting set-transaction-setting] (rn/use-state current-transaction-setting)
set-normal #(set-transaction-setting :tx-fee-mode/normal)
set-fast #(set-transaction-setting :tx-fee-mode/fast)
set-urgent #(set-transaction-setting :tx-fee-mode/urgent)]
(let [current-transaction-setting (rf/sub [:wallet/confirmed-quick-tx-setting])
[transaction-setting set-transaction-setting] (rn/use-state current-transaction-setting)]
[rn/view
[quo/drawer-top
{:title (i18n/label :t/transaction-settings)}]
@@ -84,77 +79,63 @@
:data [{:title (str (i18n/label :t/normal) "~60s")
:image-props "🍿"
:description-props {:text (rf/sub [:wallet/wallet-send-transaction-setting-fiat-formatted
:tx-fee-mode/normal])}
:transaction-setting/normal])}
:image :emoji
:description :text
:action :selector
:action-props {:type :radio
:checked? (= :tx-fee-mode/normal transaction-setting)
:customization-color account-color
;; there is an UI isssue in quo/category, it has :on-press event
;; and child radio button has own :on-change. If they are not set
;; to the same action then we are getting inconsistent behaviour
;; when user can click on settings item but cant on radio itself.
;; So duplication is to prevent that until general fix is applied
;; to quo/category
:on-change set-normal}
:on-press set-normal
:action-props {:type :radio
:checked? (= :transaction-setting/normal transaction-setting)}
:on-press #(set-transaction-setting :transaction-setting/normal)
:label :text
:preview-size :size-32}
{:title (str (i18n/label :t/fast) "~40s")
:image-props "🚗"
:description-props {:text (rf/sub [:wallet/wallet-send-transaction-setting-fiat-formatted
:tx-fee-mode/fast])}
:transaction-setting/fast])}
:image :emoji
:description :text
:action :selector
:action-props {:type :radio
:checked? (= :tx-fee-mode/fast transaction-setting)
:on-change set-fast
:customization-color account-color}
:on-press set-fast
:action-props {:type :radio
:checked? (= :transaction-setting/fast transaction-setting)}
:on-press #(set-transaction-setting :transaction-setting/fast)
:label :text
:preview-size :size-32}
{:title (str (i18n/label :t/urgent) "~15s")
:image-props "🚀"
:description-props {:text (rf/sub [:wallet/wallet-send-transaction-setting-fiat-formatted
:tx-fee-mode/urgent])}
:transaction-setting/urgent])}
:image :emoji
:description :text
:action :selector
:action-props {:type :radio
:checked? (= :tx-fee-mode/urgent transaction-setting)
:customization-color account-color
:on-change set-urgent}
:on-press set-urgent
:action-props {:type :radio
:checked? (= :transaction-setting/urgent transaction-setting)}
:on-press #(set-transaction-setting :transaction-setting/urgent)
:label :text
:preview-size :size-32}
(when (ff/enabled? ::ff/wallet.transaction-params)
{:title (i18n/label :t/custom)
:image-props :i/edit
:description-props {:text "Set your own fees and nonce"}
:image :icon
:description :text
:action :arrow
:on-press #(rf/dispatch
[:show-bottom-sheet
{:content custom-settings-sheet}])
:label :text
:preview-size :size-32})]}]
{:title (i18n/label :t/custom)
:image-props :i/edit
:description-props {:text "Set your own fees and nonce"}
:image :icon
:description :text
:action :arrow
:on-press #(rf/dispatch
[:show-bottom-sheet
{:content custom-settings-sheet}])
:label :text
:preview-size :size-32}]}]
[quo/bottom-actions
{:actions :one-action
:button-one-props {:on-press (fn []
(rf/dispatch [:wallet/quick-fee-mode-confirmed
transaction-setting])
(rf/dispatch [:hide-bottom-sheet]))
:customization-color account-color}
:button-one-props {:on-press (fn []
(rf/dispatch [:wallet/quick-transaction-settings-confirmed
transaction-setting])
(rf/dispatch [:hide-bottom-sheet]))}
:button-one-label (i18n/label :t/confirm)}]]))
(defn- hint
[{:keys [error? text]}]
[{:keys [status text]}]
[quo/network-tags
{:title text
:status (when error? :error)}])
:status status}])
(defn info-sheet
[info-title info-content]
@@ -175,23 +156,33 @@
(i18n/label :t/read-more)]]])
(defn custom-setting-screen
[{:keys [screen-title token-symbol hint-text-fn suggested-values info-title info-content on-save
[{:keys [screen-title token-symbol hint-text-fn status-fn current spectrum info-title info-content
on-save
with-decimals?]
:or {with-decimals? true}}]
(let [[input-state set-input-state] (rn/use-state (controlled-input/set-value-numeric
controlled-input/init-state
(:current suggested-values)))
current))
input-value (controlled-input/input-value input-state)
out-of-limits? (controlled-input/input-error input-state)
valid-input? (not (or (controlled-input/empty-value? input-state)
out-of-limits?))]
(rn/use-mount
status (when status-fn
(status-fn
input-value
(controlled-input/lower-limit-exceeded? input-state)
(controlled-input/upper-limit-exceeded? input-state)))
hint-text (when hint-text-fn
(hint-text-fn
input-value
(controlled-input/lower-limit-exceeded? input-state)
(controlled-input/upper-limit-exceeded? input-state)))]
(tap> {:in :custom-setting-screen
:spectrum spectrum})
(rn/use-effect
(fn []
(set-input-state (fn [state]
(-> state
(controlled-input/set-upper-limit (:high suggested-values))
(controlled-input/set-lower-limit (:low suggested-values)))))))
(controlled-input/set-upper-limit (:high spectrum))
(controlled-input/set-lower-limit (:low spectrum))))))
[spectrum])
[rn/view
{:style {:flex 1}}
[quo/page-nav
@@ -212,18 +203,16 @@
:swappable? false
:show-token-icon? false
:value input-value
:error? out-of-limits?
:error? (= status :error)
:currency-symbol token-symbol
:hint-component [hint
{:error? out-of-limits?
:text (hint-text-fn
(controlled-input/lower-limit-exceeded? input-state)
(controlled-input/upper-limit-exceeded? input-state))}]}]
{:status status
:text hint-text}]}]
[rn/view {:style {:flex 1}}]
[quo/bottom-actions
{:actions :one-action
:button-one-label (i18n/label :t/save-changes)
:button-one-props {:disabled? (not valid-input?)
:button-one-props {:disabled? (= status :error)
:on-press #(on-save (controlled-input/value-numeric input-state))}}]
[quo/numbered-keyboard
{:container-style {:padding-bottom (safe-area/get-bottom)}
+16 -3
View File
@@ -1,5 +1,6 @@
(ns status-im.contexts.wallet.send.utils
(:require
[native-module.core :as native-module]
[status-im.constants :as constants]
[status-im.contexts.wallet.common.utils.networks :as network-utils]
[utils.money :as money]))
@@ -250,6 +251,18 @@
[path]
{:routerInputParamsUuid (:router-input-params-uuid path)
:pathName (:bridge-name path)
:chainID (get-in path [:from :chain-id])
:isApprovalTx (:approval-required path)
:communityID nil})
:chainID (get-in path [:to :chain-id])
:isApprovalTx (:approval-required path)})
(defn path-tx-custom-params
[user-tx-settings route]
(let [nonce (or (:nonce user-tx-settings) (:nonce route))
gas-amount (or (:gas-amount user-tx-settings) (:gas-amount route))
priority-fee (or (:priority-fee user-tx-settings) (get-in route [:gas-fees :tx-priority-fee]))
max-base-fee (or (:max-base-fee user-tx-settings) (get-in route [:gas-fees :current-base-fee]))]
{:gasFeeMode constants/gas-rate-custom
:nonce nonce
:gasAmount gas-amount
:maxFeesPerGas (money/to-hex (money/->wei :gwei (money/add max-base-fee priority-fee)))
:priorityFee (money/to-hex (money/->wei :gwei priority-fee))}))
@@ -1,5 +1,4 @@
(ns status-im.contexts.wallet.swap.setup-swap.style
(:require [quo.foundations.colors :as colors]))
(ns status-im.contexts.wallet.swap.setup-swap.style)
(def container
{:flex 1})
@@ -41,22 +40,3 @@
{:height :auto
:min-height 40
:max-height 62})
(defn exchange-rate-loader
[theme]
{:margin-top 16
:width 72
:height 14
:border-radius 6
:background-color (colors/theme-colors colors/neutral-5 colors/neutral-90 theme)})
(def exchange-rate-container
{:margin-top 16
:flex-direction :row})
(def exchange-rate-crypto-label
{:color colors/neutral-50})
(defn exchange-rate-fiat-label
[theme]
{:color (colors/theme-colors colors/neutral-40 colors/neutral-60 theme)})
@@ -343,33 +343,6 @@
(= (:symbol token)
(:symbol asset-to-pay)))}]))
(defn- swap-exchange-rate-view
[]
(let [theme (quo.theme/use-theme)
asset-to-pay (rf/sub [:wallet/swap-asset-to-pay])
asset-to-receive (rf/sub [:wallet/swap-asset-to-receive])
swap-exchange-rate-crypto (rf/sub [:wallet/swap-exchange-rate-crypto])
swap-exchange-rate-fiat (rf/sub [:wallet/swap-exchange-rate-fiat])
loading-swap-proposal? (rf/sub [:wallet/swap-loading-swap-proposal?])]
(cond
loading-swap-proposal?
[rn/view {:style (style/exchange-rate-loader theme)}]
swap-exchange-rate-crypto
[rn/view {:style style/exchange-rate-container}
[quo/text
{:weight :medium
:size :paragraph-2
:style style/exchange-rate-crypto-label}
(i18n/label :t/swap-exchange-rate-in-crypto
{:receive-token-symbol (:symbol asset-to-receive)
:exchange-rate swap-exchange-rate-crypto
:pay-token-symbol (:symbol asset-to-pay)})]
[quo/text
{:weight :medium
:size :paragraph-2
:style (style/exchange-rate-fiat-label theme)}
(str " (" swap-exchange-rate-fiat ")")]])))
(defn view
[]
(let [[pay-input-state set-pay-input-state] (rn/use-state controlled-input/init-state)
@@ -522,7 +495,7 @@
:params {:show-account-balances? true
:asset-symbol (:symbol asset-to-pay)
:network network}}]
[rn/scroll-view {:style style/inputs-container}
[rn/view {:style style/inputs-container}
[pay-token-input
{:input-state pay-input-state
:on-max-press on-max-press
@@ -541,8 +514,7 @@
[receive-token-input
{:input-focused? (not pay-input-focused?)
:on-token-press #(rf/dispatch [:show-bottom-sheet {:content receive-token-bottom-sheet}])
:on-input-focus #(set-pay-input-focused? false)}]
[swap-exchange-rate-view]]
:on-input-focus #(set-pay-input-focused? false)}]]
[rn/view {:style style/footer-container}
(when-not loading-swap-proposal? [alert-banner {:pay-input-error? pay-input-error?}])
(when (or loading-swap-proposal? swap-proposal)
+69 -19
View File
@@ -167,6 +167,7 @@
(when
(= (:chain-id network) bridge-to-chain-id)
network))
networks))))
(rf/reg-sub
@@ -207,38 +208,87 @@
(rf/reg-sub
:wallet/custom-tx-settings
:wallet/confirmed-quick-tx-setting
:<- [:wallet/wallet-send]
:-> :custom-tx-settings)
(fn [send-data]
(or (:confirmed-quick-tx-setting send-data) :transaction-setting/fast)))
(rf/reg-sub
:wallet/tx-settings-fee-mode-user
:<- [:wallet/custom-tx-settings]
:-> :tx-fee-mode)
:wallet/user-tx-settings
:<- [:wallet/wallet-send]
:-> :user-tx-settings)
(rf/reg-sub
:wallet/tx-settings-max-base-fee
:<- [:wallet/custom-tx-settings]
:wallet/tx-settings-max-base-fee-user
:<- [:wallet/user-tx-settings]
:-> :max-base-fee)
(rf/reg-sub
:wallet/tx-settings-priority-fee
:<- [:wallet/custom-tx-settings]
:wallet/tx-settings-priority-fee-user
:<- [:wallet/user-tx-settings]
:-> :priority-fee)
(rf/reg-sub
:wallet/tx-settings-max-gas-amount
:<- [:wallet/custom-tx-settings]
:-> :max-gas-amount)
(rf/reg-sub
:wallet/tx-settings-nonce
:<- [:wallet/custom-tx-settings]
:wallet/tx-settings-nonce-user
:<- [:wallet/user-tx-settings]
:-> :nonce)
(rf/reg-sub
:wallet/tx-fee-mode
:wallet/tx-settings-gas-amount-user
:<- [:wallet/user-tx-settings]
:-> :gas-amount)
(rf/reg-sub
:wallet/tx-settings-gas-amount
:<- [:wallet/send-route]
:<- [:wallet/tx-settings-fee-mode-user]
:<- [:wallet/tx-settings-gas-amount-user]
(fn [[route value-set-by-user]]
(or value-set-by-user (:tx-fee-mode (first route)))))
(or value-set-by-user (:gas-amount (first route)))))
(rf/reg-sub
:wallet/tx-settings-nonce
:<- [:wallet/send-route]
:<- [:wallet/tx-settings-nonce-user]
(fn [[route value-set-by-user]]
(or value-set-by-user (:nonce (first route)))))
(rf/reg-sub
:wallet/tx-settings-gas-fees
:<- [:wallet/send-route]
(fn [route]
(:gas-fees (first route))))
(rf/reg-sub
:wallet/tx-settings-suggested-nonce
:<- [:wallet/send-route]
(fn [route]
(:suggested-tx-nonce (first route))))
(rf/reg-sub
:wallet/tx-settings-priority-fee
:<- [:wallet/tx-settings-gas-fees]
:<- [:wallet/tx-settings-priority-fee-user]
(fn [[gas-fees value-set-by-user]]
(or value-set-by-user (:tx-priority-fee gas-fees))))
(rf/reg-sub
:wallet/tx-settings-max-base-fee
:<- [:wallet/tx-settings-gas-fees]
:<- [:wallet/tx-settings-max-base-fee-user]
(fn [[gas-fees value-set-by-user]]
(or value-set-by-user (:current-base-fee gas-fees))))
(rf/reg-sub
:wallet/tx-settings-suggested-max-priority-fee
:<- [:wallet/tx-settings-gas-fees]
:<- [:wallet/tx-settings-max-base-fee-user]
(fn [[gas-fees value-set-by-user]]
(or value-set-by-user (:suggested-max-priority-fee gas-fees))))
(rf/reg-sub
:wallet/tx-settings-suggested-min-priority-fee
:<- [:wallet/tx-settings-gas-fees]
:<- [:wallet/tx-settings-max-base-fee-user]
(fn [[gas-fees value-set-by-user]]
(or value-set-by-user (:suggested-min-priority-fee gas-fees))))
-40
View File
@@ -333,43 +333,3 @@
:token token-for-fees
:prices-per-token prices-per-token})]
fee-in-fiat)))
(rf/reg-sub
:wallet/swap-exchange-rate-crypto
:<- [:wallet/swap-proposal-amount-in]
:<- [:wallet/swap-asset-to-pay]
:<- [:wallet/swap-proposal-amount-out]
:<- [:wallet/swap-asset-to-receive]
(fn [[amount-in asset-to-pay amount-out asset-to-receive]]
(let [pay-token-decimals (:decimals asset-to-pay)
receive-token-decimals (:decimals asset-to-receive)
amount-in-num (some-> amount-in
(number/hex->whole pay-token-decimals)
(number/to-fixed pay-token-decimals)
(money/->bignumber))
amount-out-num (some-> amount-out
(number/hex->whole receive-token-decimals)
(number/to-fixed receive-token-decimals)
(money/->bignumber))
exchange-rate (when (and amount-in-num amount-out-num)
(money/div amount-in-num amount-out-num))
display-decimals (min pay-token-decimals
constants/min-token-decimals-to-display)]
(when exchange-rate
(number/to-fixed exchange-rate display-decimals)))))
(rf/reg-sub
:wallet/swap-exchange-rate-fiat
:<- [:wallet/swap-exchange-rate-crypto]
:<- [:wallet/swap-asset-to-pay]
:<- [:profile/currency]
:<- [:profile/currency-symbol]
:<- [:wallet/prices-per-token]
(fn [[swap-exchange-rate asset-to-pay currency currency-symbol prices-per-token]]
(when swap-exchange-rate
(let [fiat-value (utils/calculate-token-fiat-value
{:currency currency
:balance swap-exchange-rate
:token asset-to-pay
:prices-per-token prices-per-token})]
(utils/fiat-formatted-for-ui currency-symbol fiat-value)))))
+8
View File
@@ -901,6 +901,14 @@
fee-in-fiat)]
fee-formatted)))))
(rf/reg-sub
:wallet/has-partially-operable-accounts?
:<- [:wallet/accounts]
(fn [accounts]
(->> accounts
(some #(= :partially (:operable %)))
boolean)))
(rf/reg-sub
:wallet/accounts-names
:<- [:wallet/accounts]
@@ -941,6 +941,20 @@
(is (match? (rf/sub [sub-name]) "$0.20"))))
(h/deftest-sub :wallet/has-partially-operable-accounts?
[sub-name]
(testing "returns false if there are no partially operable accounts"
(swap! rf-db/app-db
#(assoc-in % [:wallet :accounts] accounts))
(is (false? (rf/sub [sub-name]))))
(testing "returns true if there are partially operable accounts"
(swap! rf-db/app-db
#(assoc-in %
[:wallet :accounts]
(update accounts "0x2" assoc :operable :partially)))
(is (true? (rf/sub [sub-name])))))
(h/deftest-sub :wallet/zero-balance-in-all-non-watched-accounts?
[sub-name]
(testing "returns true if the balance is zero in all non-watched accounts"
@@ -17,8 +17,6 @@
(defn auth-success-fixtures
[]
(rf/reg-fx :effects.standard-auth/on-auth-success
(fn [on-auth-success] (on-auth-success)))
(rf/reg-fx :effects.biometric/check-if-available
(fn [{:keys [on-success]}] (on-success)))
(rf/reg-event-fx :biometric/authenticate
@@ -34,7 +32,7 @@
(let [on-success-called? (atom false)
args (assoc default-args :on-auth-success #(reset! on-success-called? true))]
(rf/dispatch [:standard-auth/authorize args])
(rf-test/wait-for [:standard-auth/migrate-partially-operable-accounts]
(rf-test/wait-for [:standard-auth/on-biometric-success]
(is @on-success-called?))))))
(defn auth-cancel-fixtures
+5 -3
View File
@@ -143,7 +143,8 @@
(defn to-hex
[^js bn]
(str "0x" (to-string bn 16)))
(when bn
(str "0x" (to-string bn 16))))
(defn from-hex
[hex-str]
@@ -195,8 +196,9 @@
(greater-than-or-equals balance amount)))
(defn- add*
[bn1 n2]
(.add ^js bn1 n2))
[n1 n2]
(when-let [[^js bn1 ^js bn2] (->bignumbers n1 n2)]
(.add ^js bn1 bn2)))
(def add
"Add with defaults, this version is able to receive `nil` and takes them as 0."
+3 -3
View File
@@ -3,7 +3,7 @@
"_comment": "Instead use: scripts/update-status-go.sh <rev>",
"owner": "status-im",
"repo": "status-go",
"version": "chore/bridge-estimated-gas-increase",
"commit-sha1": "5e356ce505da6ca427366ff171733f0317ce3cfe",
"src-sha256": "189k997g3n7kg3bxb2jbyk70wh3d1h01nlxhzq0k9c59b5bvlhab"
"version": "feat/tx-path-new-props",
"commit-sha1": "d2c220fe60bb7817753167184ba70e9b47cfa5be",
"src-sha256": "10n4kf7lb0rm57b3llyalpgv70dp3k560nxxfpb7f0gcc5kpl97q"
}
@@ -1,15 +1,209 @@
import datetime
import re
import time
import pytest
from _pytest.outcomes import Failed
from selenium.common import NoSuchElementException, TimeoutException
from base_test_case import MultipleSharedDeviceTestCase, create_shared_drivers
from tests import marks
from support.api.network_api import NetworkApi
from tests import marks, run_in_parallel
from users import transaction_senders
from views.sign_in_view import SignInView
@pytest.mark.xdist_group(name="new_four_2")
@marks.nightly
@marks.secured
@marks.smoke
class TestWalletMultipleDevice(MultipleSharedDeviceTestCase):
def prepare_devices(self):
self.network_api = NetworkApi()
self.drivers, self.loop = create_shared_drivers(2)
self.sign_in_1, self.sign_in_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
self.sender, self.receiver = transaction_senders['ETH_1'], transaction_senders['ETH_2']
self.sender['wallet_address'] = '0x' + self.sender['address']
self.receiver['wallet_address'] = '0x' + self.receiver['address']
self.loop.run_until_complete(
run_in_parallel(((self.sign_in_1.recover_access, {'passphrase': self.sender['passphrase']}),
(self.sign_in_2.recover_access, {'passphrase': self.receiver['passphrase']}))))
self.home_1, self.home_2 = self.sign_in_1.get_home_view(), self.sign_in_2.get_home_view()
self.sender_username, self.receiver_username = self.home_1.get_username(), self.home_2.get_username()
self.wallet_1, self.wallet_2 = self.sign_in_1.get_wallet_view(), self.sign_in_2.get_wallet_view()
self.wallet_1.wallet_tab.click()
self.wallet_2.wallet_tab.click()
self.network = "Arbitrum"
def _get_balances_before_tx(self):
# ToDo: Arbiscan API is down, looking for analogue
# sender_balance = self.network_api.get_balance(self.sender['wallet_address'])
# receiver_balance = self.network_api.get_balance(self.receiver['wallet_address'])
self.wallet_1.just_fyi("Getting ETH amount in the wallet of the sender before transaction")
self.wallet_1.get_account_element().click()
eth_amount_sender = self.wallet_1.get_asset(asset_name='Ether').get_amount()
self.wallet_2.just_fyi("Getting ETH amount in the wallet of the receiver before transaction")
self.wallet_2.get_account_element().click()
eth_amount_receiver = self.wallet_2.get_asset(asset_name='Ether').get_amount()
# return sender_balance, receiver_balance, eth_amount_sender, eth_amount_receiver
return eth_amount_sender, eth_amount_receiver
def _check_balances_after_tx(self, amount_to_send, sender_balance, receiver_balance, eth_amount_sender,
eth_amount_receiver):
# ToDo: Arbiscan API is down, looking for analogue
# try:
# self.network_api.wait_for_balance_to_be(address=self.sender['wallet_address'],
# expected_balance=sender_balance - amount_to_send)
# except TimeoutException as e:
# self.errors.append("Sender " + e.msg)
# try:
# self.network_api.wait_for_balance_to_be(address=self.receiver['wallet_address'],
# expected_balance=receiver_balance + amount_to_send)
# except TimeoutException as e:
# self.errors.append("Receiver " + e.msg)
def wait_for_wallet_balance_to_update(wallet_view, user_name, initial_eth_amount):
wallet_view.just_fyi("Getting ETH amount in the wallet of the %s after transaction" % user_name)
if user_name == self.sender_username:
exp_amount = round(initial_eth_amount - amount_to_send, 4)
else:
exp_amount = round(initial_eth_amount + amount_to_send, 4)
# for _ in range(12): # ToDo: 120 sec wait time, enable when autoupdate feature is ready
new_eth_amount = round(wallet_view.get_asset(asset_name='Ether').get_amount(), 4)
if user_name == self.sender_username and new_eth_amount <= exp_amount:
return
if user_name == self.receiver_username and new_eth_amount >= exp_amount:
return
self.errors.append(wallet_view,
"Eth amount in the %s's wallet is %s but should be %s" % (
user_name, new_eth_amount, exp_amount))
# ToDo: disable relogin when autoupdate feature is ready
self.home_1.just_fyi("Relogin for getting an updated balance")
self.home_2.just_fyi("Relogin for getting an updated balance")
for _ in range(6): # just waiting 1 minute here to be sure that balances are updated
self.wallet_1.wallet_tab.is_element_displayed()
self.wallet_2.wallet_tab.is_element_displayed()
time.sleep(10)
self.loop.run_until_complete(
run_in_parallel(((self.home_1.reopen_app, {'user_name': self.sender_username}),
(self.home_2.reopen_app, {'user_name': self.receiver_username}))))
self.wallet_1.wallet_tab.wait_and_click()
self.wallet_2.wallet_tab.wait_and_click()
self.wallet_1.set_network_in_wallet(network_name=self.network)
self.wallet_2.set_network_in_wallet(network_name=self.network)
self.loop.run_until_complete(
run_in_parallel(((wait_for_wallet_balance_to_update, {'wallet_view': self.wallet_1,
'user_name': self.sender_username,
'initial_eth_amount': eth_amount_sender}),
(wait_for_wallet_balance_to_update, {'wallet_view': self.wallet_2,
'user_name': self.receiver_username,
'initial_eth_amount': eth_amount_receiver}))))
def _check_last_transaction_in_activity(self, wallet_view, device_time, amount_to_send, sender=True):
wallet_view.get_account_element().click()
wallet_view.activity_tab.click()
wallet_view.just_fyi("Checking the transaction in the activity tab")
current_time = datetime.datetime.strptime(device_time, "%Y-%m-%dT%H:%M:%S%z")
expected_time = "Today %s" % current_time.strftime('%-I:%M %p')
possible_times = [expected_time,
"Today %s" % (current_time + datetime.timedelta(minutes=1)).strftime('%-I:%M %p')]
sender_address_short = self.sender['wallet_address'].replace(self.sender['wallet_address'][5:-3], '...').lower()
receiver_address_short = self.receiver['wallet_address'].replace(self.receiver['wallet_address'][5:-3],
'...').lower()
activity_element = wallet_view.get_activity_element()
try:
if not all((activity_element.header == 'Send' if sender else 'Receive',
activity_element.timestamp in possible_times,
activity_element.amount == '%s ETH' % amount_to_send,
activity_element.from_text == sender_address_short,
activity_element.to_text == receiver_address_short)):
self.errors.append(
wallet_view,
"The last transaction is not listed in activity for the %s, expected timestamp is %s" %
('sender' if sender else 'receiver', expected_time))
except NoSuchElementException:
self.errors.append(wallet_view,
"Can't find the last transaction for the %s" % ('sender' if sender else 'receiver'))
finally:
wallet_view.close_account_button.click_until_presence_of_element(wallet_view.show_qr_code_button)
@marks.testrail_id(727229)
def test_wallet_send_eth(self):
self.wallet_1.set_network_in_wallet(network_name=self.network)
self.wallet_2.set_network_in_wallet(network_name=self.network)
# sender_balance, receiver_balance, eth_amount_sender, eth_amount_receiver = self._get_balances_before_tx()
eth_amount_sender, eth_amount_receiver = self._get_balances_before_tx()
self.wallet_2.close_account_button.click()
self.wallet_2.chats_tab.click()
self.wallet_1.just_fyi("Sending funds from wallet")
amount_to_send = 0.0001
device_time_before_sending = self.wallet_1.driver.device_time
self.wallet_1.send_asset(address='arb1:' + self.receiver['wallet_address'],
asset_name='Ether',
amount=f"{amount_to_send:.4f}",
network_name=self.network)
# ToDo: Arbiscan API is down, looking for analogue
# self.network_api.wait_for_confirmation_of_transaction(address=self.sender['wallet_address'],
# tx_time=device_time_before_sending)
device_time_after_sending = self.wallet_1.driver.device_time
# self._check_balances_after_tx(amount_to_send, sender_balance, receiver_balance, eth_amount_sender,
# eth_amount_receiver)
self._check_balances_after_tx(amount_to_send, None, None, eth_amount_sender, eth_amount_receiver)
# ToDo: enable when issues 20807 and 20808 are fixed
# self.loop.run_until_complete(
# run_in_parallel(((self._check_last_transaction_in_activity, {'wallet_view': self.wallet_1,
# 'device_time': device_time,
# 'amount_to_send': amount_to_send}),
# (self._check_last_transaction_in_activity, {'wallet_view': self.wallet_2,
# 'device_time': device_time,
# 'amount_to_send': amount_to_send,
# 'sender': False}))))
self.errors.verify_no_errors()
@marks.testrail_id(727230)
def test_wallet_send_asset_from_drawer(self):
self.wallet_1.navigate_back_to_wallet_view()
# sender_balance, receiver_balance, eth_amount_sender, eth_amount_receiver = self._get_balances_before_tx()
eth_amount_sender, eth_amount_receiver = self._get_balances_before_tx()
self.wallet_2.close_account_button.click_if_shown()
self.wallet_2.chats_tab.click()
self.wallet_1.just_fyi("Sending asset from drawer")
amount_to_send = 0.0001
device_time_before_sending = self.wallet_1.driver.device_time
self.wallet_1.send_asset_from_drawer(address='arb1:' + self.receiver['wallet_address'],
asset_name='Ether',
amount=f"{amount_to_send:.4f}",
network_name=self.network)
# ToDo: Arbiscan API is down, looking for analogue
# self.network_api.wait_for_confirmation_of_transaction(address=self.sender['wallet_address'],
# tx_time=device_time_before_sending)
device_time_after_sending = self.wallet_1.driver.device_time
# self._check_balances_after_tx(amount_to_send, sender_balance, receiver_balance, eth_amount_sender,
# eth_amount_receiver)
self._check_balances_after_tx(amount_to_send, None, None, eth_amount_sender, eth_amount_receiver)
# ToDo: enable when issues 20807 and 20808 are fixed
# self.loop.run_until_complete(
# run_in_parallel(((self._check_last_transaction_in_activity, {'wallet_view': self.wallet_1,
# 'device_time': device_time,
# 'amount_to_send': amount_to_send}),
# (self._check_last_transaction_in_activity, {'wallet_view': self.wallet_2,
# 'device_time': device_time,
# 'amount_to_send': amount_to_send,
# 'sender': False}))))
self.errors.verify_no_errors()
@pytest.mark.xdist_group(name="new_one_2")
@marks.nightly
@marks.secured
@@ -142,7 +336,7 @@ class TestWalletOneDevice(MultipleSharedDeviceTestCase):
self.wallet_view.slide_button_track.slide()
if not self.wallet_view.password_input.is_element_displayed():
self.errors.append(self.wallet_view, "%s on %s: can't confirm transaction" % (asset, network))
self.errors.append("%s on %s: can't confirm transaction" % (asset, network))
self.wallet_view.click_system_back_button_until_presence_of_element(
element=self.wallet_view.element_by_text('Select token'), attempts=4)
self.wallet_view.click_system_back_button_until_presence_of_element(
@@ -343,7 +537,7 @@ class TestWalletOneDevice(MultipleSharedDeviceTestCase):
network_from, network_to, key))
self.wallet_view.slide_button_track.slide()
if not self.wallet_view.password_input.is_element_displayed():
self.errors.append(self.wallet_view, "%s to %s: can't confirm bridge" % (network_from, network_to))
self.errors.append("%s to %s: can't confirm bridge" % (network_from, network_to))
self.wallet_view.click_system_back_button(times=5)
self.wallet_view.click_system_back_button_until_presence_of_element(
element=self.wallet_view.add_account_button, attempts=6)
@@ -1,185 +0,0 @@
import re
import time
import pytest
from selenium.common import TimeoutException
from base_test_case import MultipleSharedDeviceTestCase, create_shared_drivers
from tests import marks
from users import transaction_senders
from views.sign_in_view import SignInView
@pytest.mark.xdist_group(name="new_one_2")
@marks.nightly
@marks.secured
@marks.smoke
class TestWalletCollectibles(MultipleSharedDeviceTestCase):
def prepare_devices(self):
self.drivers, self.loop = create_shared_drivers(1)
self.sign_in_view = SignInView(self.drivers[0])
self.sender, self.receiver = transaction_senders['ETH_1'], transaction_senders['ETH_2']
self.sender['wallet_address'] = '0x' + self.sender['address']
self.receiver['wallet_address'] = '0x' + self.receiver['address']
self.sign_in_view.recover_access(passphrase=self.sender['passphrase'])
self.home_view = self.sign_in_view.get_home_view()
self.sender_username = self.home_view.get_username()
self.profile_view = self.home_view.profile_button.click()
self.profile_view.switch_network()
self.sign_in_view.sign_in(user_name=self.sender_username)
self.home_view.wallet_tab.click()
self.wallet_view = self.home_view.get_wallet_view()
self.account_name = 'Account 1'
self.sender_short_address = self.sender['wallet_address'].replace(self.sender['wallet_address'][6:-3],
'').lower()
self.receiver_short_address = self.receiver['wallet_address'].replace(self.receiver['wallet_address'][6:-3],
'').lower()
@marks.testrail_id(741839)
def test_wallet_collectibles_balance(self):
self.wallet_view.collectibles_tab.click()
self.wallet_view.set_network_in_wallet('Base')
collectibles = {
"BVL": {"quantity": 2,
"info": {"Account": "Account 1",
"Network": "Base",
"category": "Football Player",
"rank": "Star",
"type": "Modric"}},
"Glitch Punks": {"quantity": 1,
"info": {"Account": "Account 1",
"Network": "Base",
"Race": "Skull Blue",
"Mouth": "Lipstick Green",
"Eyes": "Femme Shade Eyes Variant 3",
"Face": "Pipe",
"Ear Accessory": "Silver Stud Cross Combo",
"Nose": "Bot Nose 3",
"Eye Accessory": "Nouns",
"Head": "Double Spike"}}
}
for collectible_name, data in collectibles.items():
self.wallet_view.just_fyi("Check %s collectible info and image" % collectible_name)
try:
element = self.wallet_view.get_collectible_element(collectible_name)
element.wait_for_element()
except TimeoutException:
self.errors.append(self.wallet_view, "Collectible '%s' is not displayed" % collectible_name)
continue
if element.image_element.is_element_differs_from_template(
'%s_collectible_image_template.png' % collectible_name):
self.errors.append(self.wallet_view, "%s image doesn't match expected template" % collectible_name)
if element.quantity != data['quantity']:
self.errors.append(self.wallet_view, "%s quantity %s doesn't match expected %s" % (
collectible_name, element.quantity, data['quantity']))
self.wallet_view.just_fyi("Check %s collectible expanded info" % collectible_name)
element.click()
if self.wallet_view.expanded_collectible_image.is_element_differs_from_template(
'%s_expanded_collectible_image_template.png' % collectible_name):
self.errors.append(self.wallet_view,
"%s expanded image doesn't match expected template" % collectible_name)
self.wallet_view.driver.swipe(500, 2000, 500, 300)
for item, expected_text in data['info'].items():
try:
text = self.wallet_view.get_data_item_element_text(item)
if text != expected_text:
self.errors.append(self.wallet_view, "%s: shown %s text '%s' doesn't match expected '%s'" % (
collectible_name, item, text, expected_text))
except TimeoutException:
self.errors.append(self.wallet_view, "%s: %s data item is not shown" % (collectible_name, item))
self.wallet_view.click_system_back_button()
self.errors.verify_no_errors()
@marks.testrail_id(741840)
def test_wallet_send_collectible(self):
self.wallet_view.reopen_app(user_name=self.sender_username)
self.wallet_view.send_button.click()
self.wallet_view.address_text_input.send_keys(self.receiver['wallet_address'])
self.wallet_view.continue_button.click()
self.wallet_view.collectibles_tab_on_select_token_view.click()
time.sleep(5)
self.wallet_view.get_collectible_element('BVL').click()
self.wallet_view.amount_input_increase_button.click()
self.wallet_view.confirm_button.click()
expected_text = '2 BVL #47'
for text in [self.account_name, self.sender_short_address, expected_text]:
if not self.wallet_view.from_data_container.get_child_element_by_text(text).is_element_displayed():
self.errors.append(self.wallet_view,
"Text %s is not shown in 'From' container on the Review Send page" % text)
for text in [self.receiver_short_address, expected_text]:
if not self.wallet_view.to_data_container.get_child_element_by_text(text).is_element_displayed():
self.errors.append(self.wallet_view,
"Text %s is not shown in 'To' container on the Review Send page" % text)
data_to_check = {
'Est. time': ' min',
'Max fees': r"[$]\d+.\d+",
'Recipient gets': '2 '
}
for key, expected_value in data_to_check.items():
try:
text = self.wallet_view.get_data_item_element_text(data_item_name=key)
if key == 'Max fees':
if not re.findall(expected_value, text):
self.errors.append(self.wallet_view,
"Max fee is not a number - %s on the Review Send page" % text)
else:
if text != expected_value:
self.errors.append(
self.wallet_view,
"%s text %s doesn't match expected %s on the Review Send page" % (
key, text, expected_value))
except TimeoutException:
self.errors.append(self.wallet_view, "%s is not shown on the Review Send page" % key)
self.wallet_view.slide_button_track.slide()
if not self.wallet_view.password_input.is_element_displayed():
self.errors.append(self.wallet_view, "Can't confirm transaction")
self.wallet_view.click_system_back_button(times=6)
self.errors.verify_no_errors()
@marks.testrail_id(741841)
def test_wallet_collectible_send_from_expanded_info_view(self):
# self.wallet_view.reopen_app(user_name=self.sender_username)
self.wallet_view.collectibles_tab.click()
self.wallet_view.get_collectible_element('Glitch Punks').wait_for_element().click()
self.wallet_view.send_from_collectible_info_button.click()
self.wallet_view.address_text_input.send_keys(self.receiver['wallet_address'])
self.wallet_view.continue_button.click()
expected_text = '1 Glitch Punks #3422'
for text in [self.account_name, self.sender_short_address, expected_text]:
if not self.wallet_view.from_data_container.get_child_element_by_text(text).is_element_displayed():
self.errors.append(self.wallet_view,
"Text %s is not shown in 'From' container on the Review Send page" % text)
for text in [self.receiver_short_address, expected_text]:
if not self.wallet_view.to_data_container.get_child_element_by_text(text).is_element_displayed():
self.errors.append(self.wallet_view,
"Text %s is not shown in 'To' container on the Review Send page" % text)
data_to_check = {
'Est. time': ' min',
'Max fees': r"[$]\d+.\d+",
'Recipient gets': '1 '
}
for key, expected_value in data_to_check.items():
try:
text = self.wallet_view.get_data_item_element_text(data_item_name=key)
if key == 'Max fees':
if not re.findall(expected_value, text):
self.errors.append(self.wallet_view,
"Max fee is not a number - %s on the Review Send page" % text)
else:
if text != expected_value:
self.errors.append(
self.wallet_view,
"'%s' text '%s' doesn't match expected '%s' on the Review Send page" % (
key, text, expected_value))
except TimeoutException:
self.errors.append(self.wallet_view, "%s is not shown on the Review Send page" % key)
self.wallet_view.slide_button_track.slide()
if not self.wallet_view.password_input.is_element_displayed():
self.errors.append(self.wallet_view, "Can't confirm transaction")
self.errors.verify_no_errors()
@@ -1,202 +0,0 @@
import datetime
import time
import pytest
from selenium.common import NoSuchElementException
from base_test_case import MultipleSharedDeviceTestCase, create_shared_drivers
from support.api.network_api import NetworkApi
from tests import marks, run_in_parallel
from users import transaction_senders
from views.sign_in_view import SignInView
@pytest.mark.xdist_group(name="new_four_2")
@marks.nightly
@marks.secured
@marks.smoke
class TestWalletMultipleDevice(MultipleSharedDeviceTestCase):
def prepare_devices(self):
self.network_api = NetworkApi()
self.drivers, self.loop = create_shared_drivers(2)
self.sign_in_1, self.sign_in_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1])
self.sender, self.receiver = transaction_senders['ETH_1'], transaction_senders['ETH_2']
self.sender['wallet_address'] = '0x' + self.sender['address']
self.receiver['wallet_address'] = '0x' + self.receiver['address']
self.loop.run_until_complete(
run_in_parallel(((self.sign_in_1.recover_access, {'passphrase': self.sender['passphrase']}),
(self.sign_in_2.recover_access, {'passphrase': self.receiver['passphrase']}))))
self.home_1, self.home_2 = self.sign_in_1.get_home_view(), self.sign_in_2.get_home_view()
self.sender_username, self.receiver_username = self.home_1.get_username(), self.home_2.get_username()
self.wallet_1, self.wallet_2 = self.sign_in_1.get_wallet_view(), self.sign_in_2.get_wallet_view()
self.wallet_1.wallet_tab.click()
self.wallet_2.wallet_tab.click()
self.network = "Arbitrum"
def _get_balances_before_tx(self):
# ToDo: Arbiscan API is down, looking for analogue
# sender_balance = self.network_api.get_balance(self.sender['wallet_address'])
# receiver_balance = self.network_api.get_balance(self.receiver['wallet_address'])
self.wallet_1.just_fyi("Getting ETH amount in the wallet of the sender before transaction")
self.wallet_1.get_account_element().click()
eth_amount_sender = self.wallet_1.get_asset(asset_name='Ether').get_amount()
self.wallet_2.just_fyi("Getting ETH amount in the wallet of the receiver before transaction")
self.wallet_2.get_account_element().click()
eth_amount_receiver = self.wallet_2.get_asset(asset_name='Ether').get_amount()
# return sender_balance, receiver_balance, eth_amount_sender, eth_amount_receiver
return eth_amount_sender, eth_amount_receiver
def _check_balances_after_tx(self, amount_to_send, sender_balance, receiver_balance, eth_amount_sender,
eth_amount_receiver):
# ToDo: Arbiscan API is down, looking for analogue
# try:
# self.network_api.wait_for_balance_to_be(address=self.sender['wallet_address'],
# expected_balance=sender_balance - amount_to_send)
# except TimeoutException as e:
# self.errors.append("Sender " + e.msg)
# try:
# self.network_api.wait_for_balance_to_be(address=self.receiver['wallet_address'],
# expected_balance=receiver_balance + amount_to_send)
# except TimeoutException as e:
# self.errors.append("Receiver " + e.msg)
def wait_for_wallet_balance_to_update(wallet_view, user_name, initial_eth_amount):
wallet_view.just_fyi("Getting ETH amount in the wallet of the %s after transaction" % user_name)
if user_name == self.sender_username:
exp_amount = round(initial_eth_amount - amount_to_send, 4)
else:
exp_amount = round(initial_eth_amount + amount_to_send, 4)
# for _ in range(12): # ToDo: 120 sec wait time, enable when autoupdate feature is ready
new_eth_amount = round(wallet_view.get_asset(asset_name='Ether').get_amount(), 4)
if user_name == self.sender_username and new_eth_amount <= exp_amount:
return
if user_name == self.receiver_username and new_eth_amount >= exp_amount:
return
self.errors.append(wallet_view,
"Eth amount in the %s's wallet is %s but should be %s" % (
user_name, new_eth_amount, exp_amount))
# ToDo: disable relogin when autoupdate feature is ready
self.home_1.just_fyi("Relogin for getting an updated balance")
self.home_2.just_fyi("Relogin for getting an updated balance")
for _ in range(6): # just waiting 1 minute here to be sure that balances are updated
self.wallet_1.wallet_tab.is_element_displayed()
self.wallet_2.wallet_tab.is_element_displayed()
time.sleep(10)
self.loop.run_until_complete(
run_in_parallel(((self.home_1.reopen_app, {'user_name': self.sender_username}),
(self.home_2.reopen_app, {'user_name': self.receiver_username}))))
self.wallet_1.wallet_tab.wait_and_click()
self.wallet_2.wallet_tab.wait_and_click()
self.wallet_1.set_network_in_wallet(network_name=self.network)
self.wallet_2.set_network_in_wallet(network_name=self.network)
self.loop.run_until_complete(
run_in_parallel(((wait_for_wallet_balance_to_update, {'wallet_view': self.wallet_1,
'user_name': self.sender_username,
'initial_eth_amount': eth_amount_sender}),
(wait_for_wallet_balance_to_update, {'wallet_view': self.wallet_2,
'user_name': self.receiver_username,
'initial_eth_amount': eth_amount_receiver}))))
def _check_last_transaction_in_activity(self, wallet_view, device_time, amount_to_send, sender=True):
wallet_view.get_account_element().click()
wallet_view.activity_tab.click()
wallet_view.just_fyi("Checking the transaction in the activity tab")
current_time = datetime.datetime.strptime(device_time, "%Y-%m-%dT%H:%M:%S%z")
expected_time = "Today %s" % current_time.strftime('%-I:%M %p')
possible_times = [expected_time,
"Today %s" % (current_time + datetime.timedelta(minutes=1)).strftime('%-I:%M %p')]
sender_address_short = self.sender['wallet_address'].replace(self.sender['wallet_address'][5:-3], '...').lower()
receiver_address_short = self.receiver['wallet_address'].replace(self.receiver['wallet_address'][5:-3],
'...').lower()
activity_element = wallet_view.get_activity_element()
try:
if not all((activity_element.header == 'Send' if sender else 'Receive',
activity_element.timestamp in possible_times,
activity_element.amount == '%s ETH' % amount_to_send,
activity_element.from_text == sender_address_short,
activity_element.to_text == receiver_address_short)):
self.errors.append(
wallet_view,
"The last transaction is not listed in activity for the %s, expected timestamp is %s" %
('sender' if sender else 'receiver', expected_time))
except NoSuchElementException:
self.errors.append(wallet_view,
"Can't find the last transaction for the %s" % ('sender' if sender else 'receiver'))
finally:
wallet_view.close_account_button.click_until_presence_of_element(wallet_view.show_qr_code_button)
@marks.testrail_id(727229)
def test_wallet_send_eth(self):
self.wallet_1.set_network_in_wallet(network_name=self.network)
self.wallet_2.set_network_in_wallet(network_name=self.network)
# sender_balance, receiver_balance, eth_amount_sender, eth_amount_receiver = self._get_balances_before_tx()
eth_amount_sender, eth_amount_receiver = self._get_balances_before_tx()
self.wallet_2.close_account_button.click()
self.wallet_2.chats_tab.click()
self.wallet_1.just_fyi("Sending funds from wallet")
amount_to_send = 0.0001
device_time_before_sending = self.wallet_1.driver.device_time
self.wallet_1.send_asset(address='arb1:' + self.receiver['wallet_address'],
asset_name='Ether',
amount=f"{amount_to_send:.4f}",
network_name=self.network)
# ToDo: Arbiscan API is down, looking for analogue
# self.network_api.wait_for_confirmation_of_transaction(address=self.sender['wallet_address'],
# tx_time=device_time_before_sending)
device_time_after_sending = self.wallet_1.driver.device_time
# self._check_balances_after_tx(amount_to_send, sender_balance, receiver_balance, eth_amount_sender,
# eth_amount_receiver)
self._check_balances_after_tx(amount_to_send, None, None, eth_amount_sender, eth_amount_receiver)
# ToDo: enable when issues 20807 and 20808 are fixed
# self.loop.run_until_complete(
# run_in_parallel(((self._check_last_transaction_in_activity, {'wallet_view': self.wallet_1,
# 'device_time': device_time,
# 'amount_to_send': amount_to_send}),
# (self._check_last_transaction_in_activity, {'wallet_view': self.wallet_2,
# 'device_time': device_time,
# 'amount_to_send': amount_to_send,
# 'sender': False}))))
self.errors.verify_no_errors()
@marks.testrail_id(727230)
def test_wallet_send_asset_from_drawer(self):
self.wallet_1.navigate_back_to_wallet_view()
# sender_balance, receiver_balance, eth_amount_sender, eth_amount_receiver = self._get_balances_before_tx()
eth_amount_sender, eth_amount_receiver = self._get_balances_before_tx()
self.wallet_2.close_account_button.click_if_shown()
self.wallet_2.chats_tab.click()
self.wallet_1.just_fyi("Sending asset from drawer")
amount_to_send = 0.0001
device_time_before_sending = self.wallet_1.driver.device_time
self.wallet_1.send_asset_from_drawer(address='arb1:' + self.receiver['wallet_address'],
asset_name='Ether',
amount=f"{amount_to_send:.4f}",
network_name=self.network)
# ToDo: Arbiscan API is down, looking for analogue
# self.network_api.wait_for_confirmation_of_transaction(address=self.sender['wallet_address'],
# tx_time=device_time_before_sending)
device_time_after_sending = self.wallet_1.driver.device_time
# self._check_balances_after_tx(amount_to_send, sender_balance, receiver_balance, eth_amount_sender,
# eth_amount_receiver)
self._check_balances_after_tx(amount_to_send, None, None, eth_amount_sender, eth_amount_receiver)
# ToDo: enable when issues 20807 and 20808 are fixed
# self.loop.run_until_complete(
# run_in_parallel(((self._check_last_transaction_in_activity, {'wallet_view': self.wallet_1,
# 'device_time': device_time,
# 'amount_to_send': amount_to_send}),
# (self._check_last_transaction_in_activity, {'wallet_view': self.wallet_2,
# 'device_time': device_time,
# 'amount_to_send': amount_to_send,
# 'sender': False}))))
self.errors.verify_no_errors()
Binary file not shown.

Before

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

-29
View File
@@ -1,7 +1,6 @@
import time
import pytest
from selenium.common import NoSuchElementException
from tests import common_password
from views.base_element import Button, EditBox, Text, BaseElement
@@ -31,24 +30,6 @@ class AssetElement(Button):
pytest.fail("Cannot get %s amount" % self.asset_name)
class CollectibleItemElement(Button):
def __init__(self, driver, collectible_name):
self.collectible_name = collectible_name
self.locator = "//*[@content-desc='collectible-list-item']//*[contains(@text,'%s')]/../.." % collectible_name
super().__init__(driver=driver, xpath=self.locator)
self.image_element = BaseElement(self.driver, xpath=self.locator + "//android.widget.ImageView")
@property
def quantity(self):
counter_element = BaseElement(
self.driver, xpath=self.locator + "//*[@content-desc='collectible-counter']/android.widget.TextView")
try:
return int(counter_element.text.strip('x'))
except NoSuchElementException:
return 1
class ActivityElement(BaseElement):
def __init__(self, driver, index: int):
self.locator = "(//*[@content-desc='wallet-activity'])[%s]" % index
@@ -130,13 +111,11 @@ class WalletView(BaseView):
# Sending transaction
self.address_text_input = EditBox(self.driver, accessibility_id='address-text-input')
self.collectibles_tab_on_select_token_view = Button(self.driver, accessibility_id='Collectibles')
self.amount_input = EditBox(self.driver, xpath="//android.widget.EditText")
self.from_network_text = Text(
self.driver, xpath="(//*[@content-desc='loading']/following-sibling::android.widget.TextView)[1]")
self.confirm_button = Button(self.driver, accessibility_id='button-one')
self.done_button = Button(self.driver, accessibility_id='done')
self.amount_input_increase_button = Button(self.driver, accessibility_id='amount-input-inc-button')
# Review Send and Review Bridge screens
self.from_data_container = ConfirmationViewInfoContainer(self.driver, label_name='from')
@@ -174,11 +153,6 @@ class WalletView(BaseView):
self.passphrase_word_number_container = Text(
self.driver, xpath="//*[@content-desc='number-container']/android.widget.TextView")
# Collectible view
self.expanded_collectible_image = BaseElement(
self.driver, xpath="//*[@content-desc='expanded-collectible']//android.widget.ImageView")
self.send_from_collectible_info_button = Button(self.driver, accessibility_id="icon, Send")
def set_network_in_wallet(self, network_name: str):
self.network_drop_down.click()
Button(self.driver, accessibility_id="%s, label-component" % network_name.capitalize()).click()
@@ -192,9 +166,6 @@ class WalletView(BaseView):
element.scroll_to_element(down_start_y=0.89, down_end_y=0.8)
return element
def get_collectible_element(self, collectible_name: str):
return CollectibleItemElement(driver=self.driver, collectible_name=collectible_name)
def select_asset(self, asset_name: str):
Button(driver=self.driver,
xpath="//*[@content-desc='token-network']/android.widget.TextView[@text='%s']" % asset_name).click()
+13 -10
View File
@@ -4,11 +4,11 @@
"about-gas-amount": "AKA gas limit. Refers to the maximum number of computational steps (or units of gas) that a transaction can consume. It represents the complexity or amount of work required to execute a transaction or smart contract.\n\nThe gas limit is a cap on how much work the transaction can do on the blockchain. If the gas limit is set too low, the transaction may fail due to insufficient gas.",
"about-key-storage-content": "Status will never access your private key. Be sure to backup your seed phrase. If you lose your phone it is the only way to access your keys.",
"about-key-storage-title": "About key storage",
"about-max-base-fee": "When your transaction gets included in the block, any difference between your max base fee and the actual base fee will be refunded.",
"about-max-base-fee": "When your transaction gets included in the block, any difference between your max base fee and the actual base fee will be refunded.\n\nNote: the ETH amount shown for this value is calculated: max base fee (in GWEI) * max gas amount.",
"about-names-content": "No one can pretend to be you! Youre anonymous by default and never have to reveal your real name. You can register a custom name for a small fee.",
"about-names-title": "Names cant be changed",
"about-nonce": "Transaction counter ensuring transactions from your account are processed in the correct order and cant be replayed. Each new transaction increments the nonce by 1, ensuring uniqueness and preventing double-spending.\n\nIf a transaction with a lower nonce is pending, higher nonce transactions will remain in the queue until the earlier one is confirmed.",
"about-priority-fee": "AKA miner tip. A voluntary fee you can add to incentivise miners or validators to prioritise your transaction.\n\nThe higher the tip, the faster your transaction is likely to be processed, especially curing periods of higher network congestion.",
"about-priority-fee": "AKA miner tip. A voluntary fee you can add to incentivise miners or validators to prioritise your transaction.\n\nThe higher the tip, the faster your transaction is likely to be processed, especially during periods of higher network congestion.\n\nNote: the ETH amount shown for this value is calculated: Priority fee (in GWEI) * Max gas amount",
"about-sharing-data": "About sharing data",
"accent-colour": "Accent colour",
"accent-colour-updated": "Accent colour updated",
@@ -1111,7 +1111,9 @@
"from-label": "From",
"gas-amount": "Gas amount",
"gas-amount-limit": "Gas amount limit",
"gas-amount-lower": "Too low. Recommended: {{current}} UNITS",
"gas-amount-lower": "Too low. Minimum: {{low}}",
"gas-amount-higher": "Too high. Maximum: {{high}}",
"gas-amount-current": "Current: {{current}}",
"gas-limit": "Gas limit",
"gas-price": "Gas price",
"gas-used": "Gas used",
@@ -1591,9 +1593,10 @@
"master-account": "Master account",
"max": "Max: {{number}}",
"max-2-decimals": "Max. 2 decimals",
"max-base-fee": "Max base fee",
"max-base-fee-higher": "Higher than necessary. Current: {{current}} GWEI",
"max-base-fee-lower": "Too low. Current: {{current}} GWEI ",
"max-base-fee": "Max base fee",
"max-base-fee-current": "Current: {{current}}",
"max-base-fee-higher": "Higher than necessary (current: {{current}})",
"max-base-fee-lower": "Lower than priority fee: {{priority-fee}}",
"max-fee": "Max fee",
"max-fees": "Max fees",
"max-gas-amount": "Max gas amount",
@@ -2068,8 +2071,10 @@
"principles": "Principles",
"priority": "Priority",
"priority-fee": "Priority fee",
"priority-fee-higher": "More than necessary. Current: {{low}} - {{high}} GWEI",
"priority-fee-lower": "Too low. Current: {{low}} - {{high}} GWEI",
"priority-fee-higher": "Higher than necessary: {{low}} - {{high}}",
"priority-fee-higher-max-base": "Higher than max base fee: {{max-base-fee}}",
"priority-fee-lower": "Lower than suggested: {{low}} - {{high}}",
"priority-fee-current": "Current: {{current}}",
"privacy": "Privacy",
"privacy-and-security": "Privacy and security",
"privacy-photos": "Profile Photo Privacy",
@@ -2279,7 +2284,6 @@
"saved-address-network-preference-selection-description": "Only change if you know which networks the address owner is happy to to receive funds on",
"saved-address-removed": "Saved address removed",
"saved-addresses": "Saved addresses",
"saved-addresses-limit-reached-toast": "Limit of 20 saved addresses reached. Remove a saved address to add a new one.",
"saving-keys-to-device": "Saving keys to device...",
"say-hi": "Say hi",
"scan-an-account-qr-code": "Scan an account QR code",
@@ -2567,7 +2571,6 @@
"sun": "Sun",
"swap": "Swap",
"swap-details": "Swap details",
"swap-exchange-rate-in-crypto": "1 {{receive-token-symbol}} ≈ {{exchange-rate}} {{pay-token-symbol}}",
"swap-failed": "Swap failed",
"swapped-to": "Swapped {{pay-amount}} {{pay-token-symbol}} to {{receive-amount}} {{receive-token-symbol}}",
"swapping-to": "Swapping {{pay-amount}} {{pay-token-symbol}} to {{receive-amount}} {{receive-token-symbol}}",