Compare commits
85
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99e6b431ec | ||
|
|
bf0f35b1bd | ||
|
|
18b2eac12e | ||
|
|
47e5d663f9 | ||
|
|
8f7b641fa2 | ||
|
|
d59c25d55f | ||
|
|
5dfd519280 | ||
|
|
6cdc446e44 | ||
|
|
53d32ed6b1 | ||
|
|
dcf76c1aa3 | ||
|
|
e112d8ef5f | ||
|
|
91bee6f75c | ||
|
|
c52d314227 | ||
|
|
ee9f296b1c | ||
|
|
08e5f9eff1 | ||
|
|
817ee53330 | ||
|
|
97da843c9a | ||
|
|
144c754a7a | ||
|
|
f5824251cd | ||
|
|
2ff8850c62 | ||
|
|
f25584d833 | ||
|
|
643121d8cb | ||
|
|
77037da22f | ||
|
|
17d831dace | ||
|
|
76c1a9b25e | ||
|
|
55dc862158 | ||
|
|
a8d36bf497 | ||
|
|
72141e684f | ||
|
|
eae47ec202 | ||
|
|
e335f0b390 | ||
|
|
3f3a8e22ba | ||
|
|
00a9555633 | ||
|
|
366fb7b174 | ||
|
|
bcd8f3ad16 | ||
|
|
777b2bb8da | ||
|
|
f17484f61b | ||
|
|
49a41f4787 | ||
|
|
f65c10502b | ||
|
|
e30ca97372 | ||
|
|
178d62bd27 | ||
|
|
4262d0e8ab | ||
|
|
6f3aa19a04 | ||
|
|
c398c85b0f | ||
|
|
3a728fb112 | ||
|
|
d2fb6c7ee0 | ||
|
|
2ffdeb1fa2 | ||
|
|
a0d9134f7b | ||
|
|
81977475c5 | ||
|
|
813e4ee730 | ||
|
|
5eba373c3c | ||
|
|
c19f170239 | ||
|
|
60ef4fab4b | ||
|
|
47b4ab923b | ||
|
|
05a09d1fa1 | ||
|
|
8bd1c8de95 | ||
|
|
e5ab94f1b2 | ||
|
|
ff82d9c39e | ||
|
|
e1210e90c0 | ||
|
|
ed88170c5d | ||
|
|
32123d2f69 | ||
|
|
a480df4ef5 | ||
|
|
b3361b7d89 | ||
|
|
f7163c748b | ||
|
|
34cf65bfc9 | ||
|
|
88afa09baf | ||
|
|
b358c06a31 | ||
|
|
389a730eff | ||
|
|
4cdbfb6cc6 | ||
|
|
8fe59a0998 | ||
|
|
d4e7e4cd52 | ||
|
|
3de86b09bd | ||
|
|
dc551031fe | ||
|
|
29b02a544c | ||
|
|
3e4cbfeb69 | ||
|
|
8038fc5ceb | ||
|
|
eb1db20161 | ||
|
|
d558c565b0 | ||
|
|
ea58e52dc1 | ||
|
|
624593ec35 | ||
|
|
9d302d8192 | ||
|
|
47428368fd | ||
|
|
4c84dd4a1b | ||
|
|
cfe9d6e539 | ||
|
|
afd92d2df1 | ||
|
|
ba3d4dd4ce |
@@ -38,3 +38,4 @@ SHOW_NOT_IMPLEMENTED_FEATURES=1
|
||||
DELETE_MESSAGE_FOR_ME_UNDO_TIME_LIMIT=10000
|
||||
DELETE_MESSAGE_UNDO_TIME_LIMIT=10000
|
||||
ENABLE_ALERT_BANNER=0
|
||||
ENABLE_JUMP_TO=1
|
||||
|
||||
@@ -36,5 +36,4 @@ STICKERS_TEST_ENABLED=1
|
||||
LOCAL_PAIRING_ENABLED=1
|
||||
FAST_CREATE_COMMUNITY_ENABLED=1
|
||||
TEST_NETWORKS_ENABLED=1
|
||||
SHOW_NOT_IMPLEMENTED_FEATURES=1
|
||||
ENABLE_ALERT_BANNER=1
|
||||
|
||||
+14
-11
@@ -59,7 +59,7 @@ react {
|
||||
/**
|
||||
* Set this to true to Run Proguard on Release builds to minify the Java bytecode.
|
||||
*/
|
||||
def enableProguardInReleaseBuilds = false
|
||||
def enableProguardInReleaseBuilds = true
|
||||
|
||||
/**
|
||||
* The preferred build flavor of JavaScriptCore (JSC)
|
||||
@@ -83,7 +83,6 @@ def jscFlavor = 'org.webkit:android-jsc:+'
|
||||
*/
|
||||
def enableHermes = hermesEnabled.toBoolean();
|
||||
|
||||
|
||||
def getCommitHash = { ->
|
||||
if (project.hasProperty("commitHash")) {
|
||||
return project.commitHash
|
||||
@@ -233,6 +232,7 @@ android {
|
||||
}
|
||||
release {
|
||||
minifyEnabled enableProguardInReleaseBuilds
|
||||
shrinkResources enableProguardInReleaseBuilds
|
||||
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
||||
signingConfig null
|
||||
}
|
||||
@@ -240,10 +240,10 @@ android {
|
||||
initWith release
|
||||
applicationIdSuffix ".pr"
|
||||
versionNameSuffix ".pr"
|
||||
debuggable false
|
||||
debuggable false
|
||||
matchingFallbacks = ["release"]
|
||||
// necessary to make react-native-config's code generation work
|
||||
resValue "string", "build_config_package", "im.status.ethereum"
|
||||
// necessary to make react-native-config's code generation work
|
||||
resValue "string", "build_config_package", "im.status.ethereum"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -277,11 +277,14 @@ dependencies {
|
||||
// The version of react-native is set by the React Native Gradle Plugin
|
||||
implementation("com.facebook.react:react-android")
|
||||
implementation("androidx.core:core-splashscreen:1.0.0")
|
||||
// we don't use hermes for debug but we need its pom file for release builds
|
||||
// https://github.com/status-im/status-mobile/pull/18675
|
||||
implementation("com.facebook.react:hermes-android")
|
||||
// FIXME: implementing both hermes & JSC increases bundle size by ~ 2MB
|
||||
implementation(jscFlavor)
|
||||
|
||||
if (enableHermes) {
|
||||
implementation("com.facebook.react:hermes-android")
|
||||
} else {
|
||||
// https://github.com/status-im/status-mobile/issues/18493
|
||||
// we don't use hermes for debug builds because it crashes too often
|
||||
implementation(jscFlavor)
|
||||
}
|
||||
|
||||
// react-native-screens
|
||||
implementation("androidx.appcompat:appcompat:1.1.0-rc01")
|
||||
@@ -293,7 +296,7 @@ dependencies {
|
||||
implementation("com.github.status-im:function:0.0.1")
|
||||
implementation("com.facebook.fresco:fresco:2.5.0")
|
||||
implementation("com.facebook.fresco:animated-gif:2.5.0")
|
||||
implementation("com.squareup.okhttp3:okhttp-tls:4.9.2")
|
||||
implementation("com.squareup.okhttp3:okhttp-tls:4.11.0")
|
||||
implementation("com.google.prefab:cli:2.0.0")
|
||||
implementation("com.android.tools.build:aapt2:8.1.1-10154469")
|
||||
}
|
||||
|
||||
Vendored
+13
-1
@@ -58,6 +58,9 @@
|
||||
-keep interface okhttp3.** { *; }
|
||||
-dontwarn okhttp3.**
|
||||
|
||||
# to fix : java.security.KeyStoreException: BKS not found
|
||||
-keep class org.bouncycastle.** { *; }
|
||||
|
||||
# okio
|
||||
|
||||
-keep class sun.misc.Unsafe { *; }
|
||||
@@ -75,4 +78,13 @@
|
||||
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
|
||||
**[] $VALUES;
|
||||
public *;
|
||||
}
|
||||
}
|
||||
|
||||
# react-native-config
|
||||
# https://github.com/lugg/react-native-config?tab=readme-ov-file#problems-with-proguard
|
||||
-keep class im.status.ethereum.BuildConfig {*;}
|
||||
|
||||
# react-native-navigation
|
||||
# to fix : java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
|
||||
# at com.reactnativenavigation.views.element.animators.PropertyAnimatorCreator.getChildClass(Unknown Source:13)
|
||||
-keep class com.reactnativenavigation.** {*;}
|
||||
|
||||
@@ -70,8 +70,30 @@
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<!-- Handles http and https URLs for status.app -->
|
||||
<data android:scheme="http" android:host="status.app" />
|
||||
<data android:scheme="https" android:host="status.app" />
|
||||
<!-- Community paths -->
|
||||
<data android:pathPattern="/c/.*" android:host="status.app" android:scheme="http" />
|
||||
<data android:pathPattern="/c/.*" android:host="status.app" android:scheme="https" />
|
||||
<!-- Community channel paths -->
|
||||
<data android:pathPattern="/cc/.*" android:host="status.app" android:scheme="http" />
|
||||
<data android:pathPattern="/cc/.*" android:host="status.app" android:scheme="https" />
|
||||
<!-- User paths -->
|
||||
<data android:pathPattern="/u/.*" android:host="status.app" android:scheme="http" />
|
||||
<data android:pathPattern="/u/.*" android:host="status.app" android:scheme="https" />
|
||||
<!-- Private chat paths -->
|
||||
<data android:pathPattern="/p/.*" android:host="status.app" android:scheme="http" />
|
||||
<data android:pathPattern="/p/.*" android:host="status.app" android:scheme="https" />
|
||||
<!-- Community request paths -->
|
||||
<data android:pathPattern="/cr/.*" android:host="status.app" android:scheme="http" />
|
||||
<data android:pathPattern="/cr/.*" android:host="status.app" android:scheme="https" />
|
||||
<!-- Group chat paths -->
|
||||
<data android:pathPattern="/g/.*" android:host="status.app" android:scheme="http" />
|
||||
<data android:pathPattern="/g/.*" android:host="status.app" android:scheme="https" />
|
||||
<!-- Wallet paths -->
|
||||
<data android:pathPattern="/wallet/.*" android:host="status.app" android:scheme="http" />
|
||||
<data android:pathPattern="/wallet/.*" android:host="status.app" android:scheme="https" />
|
||||
</intent-filter>
|
||||
<intent-filter android:autoVerify="true">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
+5
-5
@@ -1119,14 +1119,14 @@ PODS:
|
||||
- React
|
||||
- ReactNativeCameraKit (14.0.0-beta13):
|
||||
- React-Core
|
||||
- ReactNativeNavigation (7.38.3):
|
||||
- ReactNativeNavigation (7.39.0):
|
||||
- HMSegmentedControl
|
||||
- React-Core
|
||||
- React-CoreModules
|
||||
- React-RCTImage
|
||||
- React-RCTText
|
||||
- ReactNativeNavigation/Core (= 7.38.3)
|
||||
- ReactNativeNavigation/Core (7.38.3):
|
||||
- ReactNativeNavigation/Core (= 7.39.0)
|
||||
- ReactNativeNavigation/Core (7.39.0):
|
||||
- HMSegmentedControl
|
||||
- React-Core
|
||||
- React-CoreModules
|
||||
@@ -1484,7 +1484,7 @@ SPEC CHECKSUMS:
|
||||
FBLazyVector: 56e0e498dbb513b96c40bac6284729ba4e62672d
|
||||
FBReactNativeSpec: 146c741a3f40361f6bc13a4ba284678cbedb5881
|
||||
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
|
||||
glog: 530710e7949eb12c82670bd09e946becf50a3c2a
|
||||
glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2
|
||||
hermes-engine: 1d1835b2cc54c381909d94d1b3c8e0a2f1a94a0e
|
||||
HMSegmentedControl: 34c1f54d822d8308e7b24f5d901ec674dfa31352
|
||||
Keycard: ac6df4d91525c3c82635ac24d4ddd9a80aca5fc8
|
||||
@@ -1551,7 +1551,7 @@ SPEC CHECKSUMS:
|
||||
ReactCommon: 2947b0bffd82ea0e58ca7928881152d4c6dae9af
|
||||
ReactNativeAudioToolkit: de9610f323e855ac6574be8c99621f3d57c5df06
|
||||
ReactNativeCameraKit: d95d3e19c514526a234d9f93c6db7e7f10eef9ea
|
||||
ReactNativeNavigation: 46305e1026fa4cdcf0cfb3822932fc58d090668d
|
||||
ReactNativeNavigation: 679d8c8bf3b8ae98d285bce810964d10da85dbdb
|
||||
RNCAsyncStorage: c913ede1fa163a71cea118ed4670bbaaa4b511bb
|
||||
RNCClipboard: 60fed4b71560d7bfe40e9d35dea9762b024da86d
|
||||
RNCMaskedView: 71fc32d971f03b7f03d6ab6b86b730c4ee64f5b6
|
||||
|
||||
@@ -82,6 +82,8 @@
|
||||
<string>Photos access is required to give you the ability to save images.</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>Photos access is required to give you the ability to send images.</string>
|
||||
<key>NSAppleMusicUsageDescription</key>
|
||||
<string>Status uses Media Library to save and send Images. The Media Library module internally requires permissions to Apple Music</string>
|
||||
<key>UIAppFonts</key>
|
||||
<array>
|
||||
<string>Inter-Bold.otf</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
<dict>
|
||||
<key>com.apple.developer.nfc.readersession.formats</key>
|
||||
<array>
|
||||
<string>NDEF</string>
|
||||
<string>TAG</string>
|
||||
</array>
|
||||
<key>aps-environment</key>
|
||||
|
||||
+13
@@ -75,4 +75,17 @@ class NetworkManager(private val reactContext: ReactApplicationContext) : ReactC
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.recover(rpcParams) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun getConnectionStringForExportingKeypairsKeystores(configJSON: String, callback: Callback) {
|
||||
val jsonConfig = JSONObject(configJSON)
|
||||
val senderConfig = jsonConfig.getJSONObject("senderConfig")
|
||||
val keyUID = senderConfig.getString("loggedInKeyUid")
|
||||
val keyStorePath = utils.getKeyStorePath(keyUID)
|
||||
senderConfig.put("keystorePath", keyStorePath)
|
||||
|
||||
utils.executeRunnableStatusGoMethod(
|
||||
{ Statusgo.getConnectionStringForExportingKeypairsKeystores(jsonConfig.toString()) },
|
||||
callback)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -106,4 +106,22 @@ RCT_EXPORT_METHOD(recover:(NSString *)message
|
||||
callback(@[result]);
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(getConnectionStringForExportingKeypairsKeystores:(NSString *)configJSON
|
||||
callback:(RCTResponseSenderBlock)callback) {
|
||||
|
||||
NSData *configData = [configJSON dataUsingEncoding:NSUTF8StringEncoding];
|
||||
NSError *error;
|
||||
NSMutableDictionary *configDict = [NSJSONSerialization JSONObjectWithData:configData options:NSJSONReadingMutableContainers error:&error];
|
||||
NSMutableDictionary *senderConfig = configDict[@"senderConfig"];
|
||||
NSString *keyUID = senderConfig[@"loggedInKeyUid"];
|
||||
NSURL *multiaccountKeystoreDir = [Utils getKeyStoreDirForKeyUID:keyUID];
|
||||
NSString *keystoreDir = multiaccountKeystoreDir.path;
|
||||
|
||||
[senderConfig setValue:keystoreDir forKey:@"keystorePath"];
|
||||
NSString *modifiedConfigJSON = [Utils jsonStringWithPrettyPrint:NO fromDictionary:configDict];
|
||||
|
||||
NSString *result = StatusgoGetConnectionStringForExportingKeypairsKeystores(modifiedConfigJSON);
|
||||
callback(@[result]);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
+123
-51
@@ -8454,20 +8454,16 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "commons-logging/commons-logging/1.3.1",
|
||||
"path": "commons-logging/commons-logging/1.3.2",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"commons-logging-1.3.1.pom": {
|
||||
"sha1": "4bfde82c8e291f8e31227a91e0c5e428ee113e2d",
|
||||
"sha256": "sha256-jeGLudCI4RAGLLIgVKx4DfW8A0njFzUbjtFuIH//s7g="
|
||||
"commons-logging-1.3.2.pom": {
|
||||
"sha1": "fcfa9f6e411771b8be9bee29e9d318867d3e1bc3",
|
||||
"sha256": "sha256-ZMFGqsSRjMPiHhMij1/kF4VZM7GBN0zML4me8eFWsm0="
|
||||
},
|
||||
"commons-logging-1.3.1-api.jar": {
|
||||
"sha1": "c8395db010f14b2643d838c66703ad7c9325ff3c",
|
||||
"sha256": "sha256-F+1DKWd0Dhql/EJKJGrawLoAamu/2pjKvGkoNRqOuFQ="
|
||||
},
|
||||
"commons-logging-1.3.1.jar": {
|
||||
"sha1": "8cff7dc1e492911f3dd7640ebfb60d6206a1dd40",
|
||||
"sha256": "sha256-lUB7tDN7rWuPsuZHpH+VIZmxUg7ztreTF9H+D8eQuPw="
|
||||
"commons-logging-1.3.2.jar": {
|
||||
"sha1": "3dc966156ef19d23c839715165435e582fafa753",
|
||||
"sha256": "sha256-a4WEJPUYAV8yv80Rg6Nz9Kgn1y0Ca2Ax2gyRzw6PNIk="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -12764,20 +12760,20 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okhttp3/okhttp-tls/4.9.2",
|
||||
"path": "com/squareup/okhttp3/okhttp-tls/4.11.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"okhttp-tls-4.9.2.pom": {
|
||||
"sha1": "dec05ee1b4de176f92a12361b1cc82eb7b45857d",
|
||||
"sha256": "sha256-pzMpEUHs6TYBsocbxdsl3laPLAqVohrGEBOkQdQbDBI="
|
||||
"okhttp-tls-4.11.0.pom": {
|
||||
"sha1": "93518ebb24213d6dcbde8e0c21913e40672f80c3",
|
||||
"sha256": "sha256-0SYiMcXxtb/bVe/7+SXas1/dWlNFEvhsSd3HIGY/IEg="
|
||||
},
|
||||
"okhttp-tls-4.9.2.jar": {
|
||||
"sha1": "2337dfb8b20de9cecd4ea36d54d15a3d85a3f385",
|
||||
"sha256": "sha256-W8xRWQAJ2M/xShfi7i3cQ6J1HOQZmdhiQaNG8JwiB34="
|
||||
"okhttp-tls-4.11.0.jar": {
|
||||
"sha1": "5ac74e5e234dc2d5cd434ac87df377858a2dcf40",
|
||||
"sha256": "sha256-SuTHCSwBeBhSRQabkSdGX9V8dkSF81ev7USlxIoFNf0="
|
||||
},
|
||||
"okhttp-tls-4.9.2.module": {
|
||||
"sha1": "d5ab02f5e49911694f95a23a0a93dd3de27f8dd1",
|
||||
"sha256": "sha256-s001IZvRHujsteSz3Qf0W+iym6Bep5z57dqRYcwlj9E="
|
||||
"okhttp-tls-4.11.0.module": {
|
||||
"sha1": "e790e6e5d0e88f9fc0c70df981e86daf29f411fa",
|
||||
"sha256": "sha256-2m5O5qfdybnUZusr5ScBAmsXms2wClyso08uXTdeSMI="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -12850,6 +12846,25 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okhttp3/okhttp/4.11.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"okhttp-4.11.0.pom": {
|
||||
"sha1": "723ab52cf1ac14363cb36ab084b0af810c095bef",
|
||||
"sha256": "sha256-ei1Cezixfgdtpk7o0hAuZIiNyyOK7l4tukp3UslKP94="
|
||||
},
|
||||
"okhttp-4.11.0.jar": {
|
||||
"sha1": "436932d695b2c43f2c86b8111c596179cd133d56",
|
||||
"sha256": "sha256-7o9r1s0SVwE9dIMw9MoUdjip+8tS+ziNWsk89TQIdF0="
|
||||
},
|
||||
"okhttp-4.11.0.module": {
|
||||
"sha1": "db24464b688785ba9c5765df8b5508a9b8994b40",
|
||||
"sha256": "sha256-VnwltR13eWF0Q5GE11JBK6l+2f22X8cYQNvFVjvrj6g="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okhttp3/parent/3.9.1",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
@@ -12872,6 +12887,25 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okio/okio-jvm/3.2.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"okio-jvm-3.2.0.pom": {
|
||||
"sha1": "749720d97fe3dc16e0d84a05628f4c818b375a85",
|
||||
"sha256": "sha256-XEUflKdr6oYbbvK/hOj1cgBUWWjIZVWr3+0Tx8otSJ0="
|
||||
},
|
||||
"okio-jvm-3.2.0.jar": {
|
||||
"sha1": "332d1c5dc82b0241cb1d35bb0901d28470cc89ca",
|
||||
"sha256": "sha256-tkK670xXAFXeTLPRZnsrFtztkB/4BmNFoGNpGqBgJaQ="
|
||||
},
|
||||
"okio-jvm-3.2.0.module": {
|
||||
"sha1": "09f966bc7d27d5151fa3367e637e098cf7cf4179",
|
||||
"sha256": "sha256-p3jzkIXtar/NaHESmGxjhapXrC2IQLIdlGs8IJXzDqQ="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okio/okio-jvm/3.9.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
@@ -12891,25 +12925,6 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okio/okio-metadata/2.8.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"okio-metadata-2.8.0.pom": {
|
||||
"sha1": "dc508270653b48fd92c98866c5f1ed6e3e033cad",
|
||||
"sha256": "sha256-v8xCxsWC2Zl4UgnmAs30RRoyZJrsbg7CaLdIhOA0QAg="
|
||||
},
|
||||
"okio-metadata-2.8.0.jar": {
|
||||
"sha1": "2a068c26cd04cbd7214ae6a4146c5f5424bdb393",
|
||||
"sha256": "sha256-99w4g86uLh/jQl4bVMXfKLiFfF/QA4G1If2mB5DylSw="
|
||||
},
|
||||
"okio-metadata-2.8.0.module": {
|
||||
"sha1": "a5b10ac12aa5f879996e516be24aaeb9b4459873",
|
||||
"sha256": "sha256-pO72Qb5eVGPSeJw8c2AfmpnzbhN3ygB+MPD+5ToFTNw="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okio/okio-parent/1.13.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
@@ -13026,6 +13041,29 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okio/okio/3.2.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"okio-3.2.0.pom": {
|
||||
"sha1": "85284557b21661be1c4983910fef4e35532e1e34",
|
||||
"sha256": "sha256-i0b1jZua6xF4Nh1YpoZfTa1mWTDF/3tV4LqmHvOpcqE="
|
||||
},
|
||||
"okio-3.2.0-all.jar": {
|
||||
"sha1": "22e2a4f865203033fc0f35fd5892a213d21a4710",
|
||||
"sha256": "sha256-Uf+6hylix9O+0SjfKbDeqz7qMfwjfAoMgVjcmQqEh44="
|
||||
},
|
||||
"okio-3.2.0.jar": {
|
||||
"sha1": "afd4b7185a6976c2ac6bfb7b126c257ee9b3e765",
|
||||
"sha256": "sha256-3KkyyyAptsniZ3D4fbCLFNSB/+gTGlnzaaI4XBG+Ti0="
|
||||
},
|
||||
"okio-3.2.0.module": {
|
||||
"sha1": "32c2edb224d6eeaee24f8086e3ac41b92138fadb",
|
||||
"sha256": "sha256-aB9c7BcN5FuVST6e5wWGjrNa34mO4G+W4i0ZclDBsQQ="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okio/okio/3.9.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
@@ -15897,17 +15935,6 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/apache/commons/commons-parent/67",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"commons-parent-67.pom": {
|
||||
"sha1": "761d110d7313f09bfc20ec1fb1f420da3314958e",
|
||||
"sha256": "sha256-UHrZeCzW5L8io0Eyk2TG2vqqAqsmswy8Z4XPsFlQZ1Y="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/apache/commons/commons-parent/69",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
@@ -20025,6 +20052,21 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.6.10",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"kotlin-stdlib-jdk7-1.6.10.pom": {
|
||||
"sha1": "5da7f12df7646d63f35e8a894157143c93efceb4",
|
||||
"sha256": "sha256-YSIR/5MPW1LHJP92NBfVqigd1+AyXDs1yNGBIKao300="
|
||||
},
|
||||
"kotlin-stdlib-jdk7-1.6.10.jar": {
|
||||
"sha1": "e1c380673654a089c4f0c9f83d0ddfdc1efdb498",
|
||||
"sha256": "sha256-Ku3NxrabM731zCNbzqiOfPZgEUa7a83/2zErus174mE="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.6.20",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
@@ -20235,6 +20277,36 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.6.10",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"kotlin-stdlib-jdk8-1.6.10.pom": {
|
||||
"sha1": "9ad76ce2a9e0473c5d5d4ec01add1b061beb521d",
|
||||
"sha256": "sha256-Q6ZJ+nN7+zX6SvTm3jPi8IpdGRBNdYLqQNvNK2N5Csw="
|
||||
},
|
||||
"kotlin-stdlib-jdk8-1.6.10.jar": {
|
||||
"sha1": "e80fe6ac3c3573a80305f5ec43f86b829e8ab53d",
|
||||
"sha256": "sha256-FFbYLQOeow2EhbAykB9Su/B+fNvoux+HCK0yqFdMQc4="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.6.20",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
"files": {
|
||||
"kotlin-stdlib-jdk8-1.6.20.pom": {
|
||||
"sha1": "6207ba2d7a89316eafea7f135ef1fc17e41c424b",
|
||||
"sha256": "sha256-GEap+GBLC+HHGiEovb2diQJyAnlCf2ItK5pECsmjwwk="
|
||||
},
|
||||
"kotlin-stdlib-jdk8-1.6.20.jar": {
|
||||
"sha1": "dab8089bca6ac0e394c37281ea8cff2f99acd421",
|
||||
"sha256": "sha256-/asb8SDiteerbXiI6evAJOxrjKcpNhKWOV2rY0shNpU="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.8.0",
|
||||
"repo": "https://repo.maven.apache.org/maven2",
|
||||
|
||||
@@ -597,12 +597,13 @@ com.google.test.platform:core-proto:0.0.2-dev
|
||||
com.ibm.icu:icu4j:53.1
|
||||
com.intellij:annotations:12.0
|
||||
com.parse.bolts:bolts-tasks:1.4.0
|
||||
com.squareup.okhttp3:okhttp-tls:4.9.2
|
||||
com.squareup.okhttp3:okhttp-tls:4.11.0
|
||||
com.squareup.okhttp3:okhttp-urlconnection:4.9.2
|
||||
com.squareup.okhttp3:okhttp:4.9.2
|
||||
com.squareup.okio:okio-metadata:2.8.0
|
||||
com.squareup.okio:okio:2.8.0
|
||||
com.squareup.okhttp3:okhttp:4.11.0
|
||||
com.squareup.okio:okio-jvm:3.2.0
|
||||
com.squareup.okio:okio:2.9.0
|
||||
com.squareup.okio:okio:3.2.0
|
||||
com.squareup:javapoet:1.8.0
|
||||
com.squareup:javapoet:1.10.0
|
||||
com.squareup:javapoet:1.13.0
|
||||
|
||||
@@ -528,7 +528,7 @@ https://repo.maven.apache.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.po
|
||||
https://repo.maven.apache.org/maven2/commons-io/commons-io/2.16.1/commons-io-2.16.1.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.1/commons-logging-1.3.1.pom
|
||||
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.3.2/commons-logging-1.3.2.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
|
||||
@@ -806,15 +806,16 @@ https://repo.maven.apache.org/maven2/com/squareup/javapoet/1.8.0/javapoet-1.8.0.
|
||||
https://repo.maven.apache.org/maven2/com/squareup/javapoet/1.10.0/javapoet-1.10.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/javapoet/1.13.0/javapoet-1.13.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp-tls/4.9.2/okhttp-tls-4.9.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp-tls/4.11.0/okhttp-tls-4.11.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp-urlconnection/4.9.2/okhttp-urlconnection-4.9.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/3.9.1/okhttp-3.9.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/3.12.1/okhttp-3.12.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/4.9.2/okhttp-4.9.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/4.11.0/okhttp-4.11.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/parent/3.9.1/parent-3.9.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/parent/3.12.1/parent-3.12.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okio/okio-jvm/3.2.0/okio-jvm-3.2.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okio/okio-jvm/3.9.0/okio-jvm-3.9.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okio/okio-metadata/2.8.0/okio-metadata-2.8.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okio/okio-parent/1.13.0/okio-parent-1.13.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okio/okio-parent/1.15.0/okio-parent-1.15.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okio/okio-parent/1.17.4/okio-parent-1.17.4.pom
|
||||
@@ -823,6 +824,7 @@ https://repo.maven.apache.org/maven2/com/squareup/okio/okio/1.15.0/okio-1.15.0.p
|
||||
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.9.0/okio-3.9.0.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
|
||||
@@ -1032,7 +1034,6 @@ 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/67/commons-parent-67.pom
|
||||
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/69/commons-parent-69.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
|
||||
@@ -1300,6 +1301,7 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.5
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.5.30/kotlin-stdlib-jdk7-1.5.30.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.5.31/kotlin-stdlib-jdk7-1.5.31.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.6.0/kotlin-stdlib-jdk7-1.6.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.6.10/kotlin-stdlib-jdk7-1.6.10.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.6.20/kotlin-stdlib-jdk7-1.6.20.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.8.0/kotlin-stdlib-jdk7-1.8.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.8.20-RC2/kotlin-stdlib-jdk7-1.8.20-RC2.pom
|
||||
@@ -1314,6 +1316,8 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.5
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.5.30/kotlin-stdlib-jdk8-1.5.30.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.5.31/kotlin-stdlib-jdk8-1.5.31.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.6.0/kotlin-stdlib-jdk8-1.6.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.6.10/kotlin-stdlib-jdk8-1.6.10.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.6.20/kotlin-stdlib-jdk8-1.6.20.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.8.0/kotlin-stdlib-jdk8-1.8.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.8.20-RC2/kotlin-stdlib-jdk8-1.8.20-RC2.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.8.21/kotlin-stdlib-jdk8-1.8.21.pom
|
||||
|
||||
@@ -55,7 +55,8 @@ com.android.tools.build:gradle:8.1.1
|
||||
com.google.errorprone:error_prone_annotations:2.7.1
|
||||
com.android.tools.lint:lint-gradle:31.1.1
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0
|
||||
com.android.tools.build:gradle:3.5.4' \
|
||||
com.android.tools.build:gradle:3.5.4
|
||||
com.facebook.react:hermes-android:0.73.5' \
|
||||
>> "${DEPS_LIST}"
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -57,7 +57,7 @@ in {
|
||||
yarn = super.yarn.override { nodejs = super.nodejs-18_x; };
|
||||
openjdk = super.openjdk11_headless;
|
||||
xcodeWrapper = callPackage ./pkgs/xcodeenv/compose-xcodewrapper.nix { } {
|
||||
versions = ["15.1" "15.2"];
|
||||
versions = ["15.1" "15.2" "15.3"];
|
||||
};
|
||||
go = super.go_1_20;
|
||||
clang = super.clang_15;
|
||||
|
||||
+1
-1
@@ -55,7 +55,7 @@
|
||||
"react-native-keychain": "8.1.2",
|
||||
"react-native-linear-gradient": "^2.8.0",
|
||||
"react-native-lottie-splash-screen": "^1.0.1",
|
||||
"react-native-navigation": "7.38.3",
|
||||
"react-native-navigation": "7.39.0",
|
||||
"react-native-orientation-locker": "^1.5.0",
|
||||
"react-native-permissions": "4.1.5",
|
||||
"react-native-reanimated": "3.6.1",
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
# https://github.com/wix/react-native-navigation/issues/7819
|
||||
|
||||
--- ./node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/topbar/button/ButtonPresenter.kt
|
||||
+++ ./node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/topbar/button/ButtonPresenter-patched.kt
|
||||
@@ -194,8 +194,8 @@
|
||||
|
||||
class WixAccessibilityDelegateCompat: AccessibilityDelegateCompat(){
|
||||
override fun onInitializeAccessibilityNodeInfo(
|
||||
- host: View?,
|
||||
- info: AccessibilityNodeInfoCompat?
|
||||
+ host: View,
|
||||
+ info: AccessibilityNodeInfoCompat
|
||||
) {
|
||||
super.onInitializeAccessibilityNodeInfo(host, info)
|
||||
|
||||
@@ -216,4 +216,4 @@
|
||||
}
|
||||
|
||||
|
||||
-}
|
||||
\ No newline at end of file
|
||||
+}
|
||||
@@ -1,19 +0,0 @@
|
||||
# https://github.com/wix/react-native-navigation/issues/7819
|
||||
|
||||
--- ./node_modules/react-native-navigation/lib/android/app/build.gradle
|
||||
+++ ./node_modules/react-native-navigation/lib/android/app/build-patched.gradle
|
||||
@@ -62,11 +62,11 @@
|
||||
}
|
||||
}
|
||||
compileOptions {
|
||||
- sourceCompatibility JavaVersion.VERSION_1_8
|
||||
- targetCompatibility JavaVersion.VERSION_1_8
|
||||
+ sourceCompatibility JavaVersion.VERSION_17
|
||||
+ targetCompatibility JavaVersion.VERSION_17
|
||||
}
|
||||
kotlinOptions {
|
||||
- jvmTarget = JavaVersion.VERSION_1_8
|
||||
+ jvmTarget = JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
flavorDimensions "RNN.reactNativeVersion"
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"meta": {
|
||||
"hostname": "node-01.do-ams3.sites.misc",
|
||||
"timestamp": "2024-02-02T14:48:22.521541",
|
||||
"timestamp": "2024-03-15T00:00:36.865154",
|
||||
"warning": "DO NOT EDIT! Auto generated from Consul. Should only be used at build time."
|
||||
},
|
||||
"fleets": {
|
||||
@@ -82,38 +82,21 @@
|
||||
"boot-01.ac-cn-hongkong-c.eth.staging": "/ip4/47.91.229.44/tcp/30703/ethv4/16Uiu2HAmRnt2Eyoknh3auxh4fJwkRgqkH1gqrWGes8Pk1k3MV4xu"
|
||||
}
|
||||
},
|
||||
"wakuv2.prod": {
|
||||
"waku.sandbox": {
|
||||
"tcp/p2p/waku": {
|
||||
"node-01.do-ams3.wakuv2.prod": "/dns4/node-01.do-ams3.wakuv2.prod.statusim.net/tcp/30303/p2p/16Uiu2HAmL5okWopX7NqZWBUKVqW8iUxCEmd5GMHLVPwCgzYzQv3e",
|
||||
"node-01.gc-us-central1-a.wakuv2.prod": "/dns4/node-01.gc-us-central1-a.wakuv2.prod.statusim.net/tcp/30303/p2p/16Uiu2HAmVkKntsECaYfefR1V2yCR79CegLATuTPE6B9TxgxBiiiA",
|
||||
"node-01.ac-cn-hongkong-c.wakuv2.prod": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.prod.statusim.net/tcp/30303/p2p/16Uiu2HAm4v86W3bmT1BiH6oSPzcsSr24iDQpSN5Qa992BCjjwgrD"
|
||||
"node-01.do-ams3.waku.sandbox": "/dns4/node-01.do-ams3.waku.sandbox.status.im/tcp/30303/p2p/16Uiu2HAmQSMNExfUYUqfuXWkD5DaNZnMYnigRxFKbk3tcEFQeQeE",
|
||||
"node-01.gc-us-central1-a.waku.sandbox": "/dns4/node-01.gc-us-central1-a.waku.sandbox.status.im/tcp/30303/p2p/16Uiu2HAm6fyqE1jB5MonzvoMdU8v76bWV8ZeNpncDamY1MQXfjdB",
|
||||
"node-01.ac-cn-hongkong-c.waku.sandbox": "/dns4/node-01.ac-cn-hongkong-c.waku.sandbox.status.im/tcp/30303/p2p/16Uiu2HAmSJvSJphxRdbnigUV5bjRRZFBhTtWFTSyiKaQByCjwmpV"
|
||||
},
|
||||
"enr/p2p/waku": {
|
||||
"node-01.do-ams3.wakuv2.prod": "enr:-P-4QJI8tS1WTdIQxq_yIrD05oIIW1Xg-tm_qfP0CHfJGnp9dfr6ttQJmHwTNxGEl4Le8Q7YHcmi-kXTtphxFysS11oBgmlkgnY0gmlwhLymh5GKbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1zMy53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMS5kby1hbXMzLndha3V2Mi5wcm9kLnN0YXR1c2ltLm5ldAYfQN4DiXNlY3AyNTZrMaEDbl1X_zJIw3EAJGtmHMVn4Z2xhpSoUaP5ElsHKCv7hlWDdGNwgnZfg3VkcIIjKIV3YWt1Mg8",
|
||||
"node-01.gc-us-central1-a.wakuv2.prod": "enr:-QERuEC0EGWTjg_gYdnuPypJ9LAbB3lml6M8GiRajGegL2iWEj1MJzUMV9X6jXw7mMAQQLozLCTLFT-zv-ELQLPwWdACAYJpZIJ2NIJpcIQieWRsim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEud2FrdXYyLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhA_30kHgQqfXZRioa4J_u5asgXTJ5iw_8w3lEICH4TFu_g3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
|
||||
"node-01.ac-cn-hongkong-c.wakuv2.prod": "enr:-QERuEDABor1lVmSa5ek8of5eBc8jZoxxdleJVLLdMl8UeZHNwhsVp64SFiCT4BRIIfcs7uxTPUCjmWxK_OA1s-FfIW7AYJpZIJ2NIJpcIQI0t7nim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMud2FrdXYyLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhAo0C-VvfgHiXrxZi3umDiooXMGY9FvYj5_d1Q4EeS7eyg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP"
|
||||
"node-01.do-ams3.waku.sandbox": "enr:-QESuEB4Dchgjn7gfAvwB00CxTA-nGiyk-aALI-H4dYSZD3rUk7bZHmP8d2U6xDiQ2vZffpo45Jp7zKNdnwDUx6g4o6XAYJpZIJ2NIJpcIRA4VDAim11bHRpYWRkcnO4XAArNiZub2RlLTAxLmRvLWFtczMud2FrdS5zYW5kYm94LnN0YXR1cy5pbQZ2XwAtNiZub2RlLTAxLmRvLWFtczMud2FrdS5zYW5kYm94LnN0YXR1cy5pbQYfQN4DgnJzkwABCAAAAAEAAgADAAQABQAGAAeJc2VjcDI1NmsxoQOvD3S3jUNICsrOILlmhENiWAMmMVlAl6-Q8wRB7hidY4N0Y3CCdl-DdWRwgiMohXdha3UyDw",
|
||||
"node-01.gc-us-central1-a.waku.sandbox": "enr:-QEkuEBIkb8q8_mrorHndoXH9t5N6ZfD-jehQCrYeoJDPHqT0l0wyaONa2-piRQsi3oVKAzDShDVeoQhy0uwN1xbZfPZAYJpZIJ2NIJpcIQiQlleim11bHRpYWRkcnO4bgA0Ni9ub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEud2FrdS5zYW5kYm94LnN0YXR1cy5pbQZ2XwA2Ni9ub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEud2FrdS5zYW5kYm94LnN0YXR1cy5pbQYfQN4DgnJzkwABCAAAAAEAAgADAAQABQAGAAeJc2VjcDI1NmsxoQKnGt-GSgqPSf3IAPM7bFgTlpczpMZZLF3geeoNNsxzSoN0Y3CCdl-DdWRwgiMohXdha3UyDw",
|
||||
"node-01.ac-cn-hongkong-c.waku.sandbox": "enr:-QEkuEB3WHNS-xA3RDpfu9A2Qycr3bN3u7VoArMEiDIFZJ66F1EB3d4wxZN1hcdcOX-RfuXB-MQauhJGQbpz3qUofOtLAYJpZIJ2NIJpcIQI2SVcim11bHRpYWRkcnO4bgA0Ni9ub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMud2FrdS5zYW5kYm94LnN0YXR1cy5pbQZ2XwA2Ni9ub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMud2FrdS5zYW5kYm94LnN0YXR1cy5pbQYfQN4DgnJzkwABCAAAAAEAAgADAAQABQAGAAeJc2VjcDI1NmsxoQPK35Nnz0cWUtSAhBp7zvHEhyU_AqeQUlqzLiLxfP2L4oN0Y3CCdl-DdWRwgiMohXdha3UyDw"
|
||||
},
|
||||
"wss/p2p/waku": {
|
||||
"node-01.do-ams3.wakuv2.prod": "/dns4/node-01.do-ams3.wakuv2.prod.statusim.net/tcp/8000/wss/p2p/16Uiu2HAmL5okWopX7NqZWBUKVqW8iUxCEmd5GMHLVPwCgzYzQv3e",
|
||||
"node-01.gc-us-central1-a.wakuv2.prod": "/dns4/node-01.gc-us-central1-a.wakuv2.prod.statusim.net/tcp/8000/wss/p2p/16Uiu2HAmVkKntsECaYfefR1V2yCR79CegLATuTPE6B9TxgxBiiiA",
|
||||
"node-01.ac-cn-hongkong-c.wakuv2.prod": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.prod.statusim.net/tcp/8000/wss/p2p/16Uiu2HAm4v86W3bmT1BiH6oSPzcsSr24iDQpSN5Qa992BCjjwgrD"
|
||||
}
|
||||
},
|
||||
"wakuv2.test": {
|
||||
"tcp/p2p/waku": {
|
||||
"node-01.do-ams3.wakuv2.test": "/dns4/node-01.do-ams3.wakuv2.test.statusim.net/tcp/30303/p2p/16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ",
|
||||
"node-01.gc-us-central1-a.wakuv2.test": "/dns4/node-01.gc-us-central1-a.wakuv2.test.statusim.net/tcp/30303/p2p/16Uiu2HAmJb2e28qLXxT5kZxVUUoJt72EMzNGXB47Rxx5hw3q4YjS",
|
||||
"node-01.ac-cn-hongkong-c.wakuv2.test": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.test.statusim.net/tcp/30303/p2p/16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm"
|
||||
},
|
||||
"enr/p2p/waku": {
|
||||
"node-01.do-ams3.wakuv2.test": "enr:-P-4QPLMQ1zIYRAs4-F0mYmMxMihSySRtEIuGHJ_Qd_GL8XqUE78hpVUE97rgwlXnxPkzMJHkWyiNq7DT1fdZSy3QcgBgmlkgnY0gmlwhIbRi9KKbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1zMy53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMS5kby1hbXMzLndha3V2Mi50ZXN0LnN0YXR1c2ltLm5ldAYfQN4DiXNlY3AyNTZrMaEDnr03Tuo77930a7sYLikftxnuG3BbC3gCFhA4632ooDaDdGNwgnZfg3VkcIIjKIV3YWt1Mg8",
|
||||
"node-01.gc-us-central1-a.wakuv2.test": "enr:-QERuEDZcXS5tjppj4TIlOm-TLanjmqx3-uk2kGFvvAQR1NVrklUhiN1JCb5dWucEQ_oDADOb6nG_1mJ5goF5CHneZ-VAYJpZIJ2NIJpcIRomu-Aim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEud2FrdXYyLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhA1giYsmWV9r2yJZYAiMGHJfjLlLeqAuTAokUGPN__pkxg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
|
||||
"node-01.ac-cn-hongkong-c.wakuv2.test": "enr:-QERuEC2LyiXKURIKxNHa7Mj7frsM-lZiAGJ-2mopR3w8LMn2UhKmahZ9RHKV5ehBN1fXbRYqAeiXuOxD9t2igF4PIizAYJpZIJ2NIJpcIQv8tJJim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMud2FrdXYyLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhAhAm-P4q6mWONKcGnbLPU8WXZJ4Qs3AxIbrycvc7PVKsg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP"
|
||||
},
|
||||
"wss/p2p/waku": {
|
||||
"node-01.do-ams3.wakuv2.test": "/dns4/node-01.do-ams3.wakuv2.test.statusim.net/tcp/8000/wss/p2p/16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ",
|
||||
"node-01.gc-us-central1-a.wakuv2.test": "/dns4/node-01.gc-us-central1-a.wakuv2.test.statusim.net/tcp/8000/wss/p2p/16Uiu2HAmJb2e28qLXxT5kZxVUUoJt72EMzNGXB47Rxx5hw3q4YjS",
|
||||
"node-01.ac-cn-hongkong-c.wakuv2.test": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.test.statusim.net/tcp/8000/wss/p2p/16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm"
|
||||
"node-01.do-ams3.waku.sandbox": "/dns4/node-01.do-ams3.waku.sandbox.status.im/tcp/8000/wss/p2p/16Uiu2HAmQSMNExfUYUqfuXWkD5DaNZnMYnigRxFKbk3tcEFQeQeE",
|
||||
"node-01.gc-us-central1-a.waku.sandbox": "/dns4/node-01.gc-us-central1-a.waku.sandbox.status.im/tcp/8000/wss/p2p/16Uiu2HAm6fyqE1jB5MonzvoMdU8v76bWV8ZeNpncDamY1MQXfjdB",
|
||||
"node-01.ac-cn-hongkong-c.waku.sandbox": "/dns4/node-01.ac-cn-hongkong-c.waku.sandbox.status.im/tcp/8000/wss/p2p/16Uiu2HAmSJvSJphxRdbnigUV5bjRRZFBhTtWFTSyiKaQByCjwmpV"
|
||||
}
|
||||
},
|
||||
"waku.test": {
|
||||
@@ -183,9 +166,9 @@
|
||||
"boot-01.ac-cn-hongkong-c.shards.test": "/dns4/boot-01.ac-cn-hongkong-c.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAmGwcE8v7gmJNEWFtZtojYpPMTHy2jBLL6xRk33qgDxFWX"
|
||||
},
|
||||
"enr/p2p/waku/boot": {
|
||||
"boot-01.do-ams3.shards.test": "enr:-QEOuEAuAK49evunDoidpHqcmeVqZz73wt4jwHnHJlmCVBFj6EdIbZ9uH5BnCYKOEPJTns2QJKUR2XLtWyzIspPAfJF9AYJpZIJ2NIJpcISnYxMvim11bHRpYWRkcnO4YAAtNihib290LTAxLmRvLWFtczMuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfAC82KGJvb3QtMDEuZG8tYW1zMy5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc4sAEAQAIABAAIABAIlzZWNwMjU2azGhAt60bRUEoHNuLlnsM12sU2PIQwBwfLIJ8a_ZPEY2-Rnkg3RjcIJ2X4N1ZHCCIyiFd2FrdTIN",
|
||||
"boot-01.gc-us-central1-a.shards.test": "enr:-QEguEC3wjzOk7U5rIqiX32CCD-0_J1cYYGK_YwKSah5di2NTxJUaKQ9B7NMiEQ_-YGm-Eus4SzHtxN_fXEuVaNHql9aAYJpZIJ2NIJpcIQihw1Xim11bHRpYWRkcnO4cgA2NjFib290LTAxLmdjLXVzLWNlbnRyYWwxLWEuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MWJvb3QtMDEuZ2MtdXMtY2VudHJhbDEtYS5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc4sAEAQAIABAAIABAIlzZWNwMjU2azGhAsY6oA0NFskUjopWFN9gwOZP1zZQ4rN5tVXV5CvcTOpDg3RjcIJ2X4N1ZHCCIyiFd2FrdTIN",
|
||||
"boot-01.ac-cn-hongkong-c.shards.test": "enr:-QEguEBb4rlxsdYCIZ8NcAlcjnb2zp4C9JbDsz-01Ix2sKNdWzI79KRFnhlakX-4F8gRYcviDvQL5eEZDOxHTupUW7VXAYJpZIJ2NIJpcIQI2hdMim11bHRpYWRkcnO4cgA2NjFib290LTAxLmFjLWNuLWhvbmdrb25nLWMuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MWJvb3QtMDEuYWMtY24taG9uZ2tvbmctYy5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc4sAEAQAIABAAIABAIlzZWNwMjU2azGhAz-wm0ZPmCicDhRTOGfZ3stBj3O1jyWgsBpKTUcpWu5gg3RjcIJ2X4N1ZHCCIyiFd2FrdTIN"
|
||||
"boot-01.do-ams3.shards.test": "enr:-QEQuEAdkU8UWa5vvRr-uoULGoyWflIOozVUWj-9iUXw7nEo_yWKmDKrYJ_t4rSwbRLobDy8M0mO8HQyDFVfdQxDZQRVAYJpZIJ2NIJpcISnYxMvim11bHRpYWRkcnO4YAAtNihib290LTAxLmRvLWFtczMuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfAC82KGJvb3QtMDEuZG8tYW1zMy5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc40AEAUAAQAgAEAAgAEAiXNlY3AyNTZrMaEC3rRtFQSgc24uWewzXaxTY8hDAHB8sgnxr9k8Rjb5GeSDdGNwgnZfg3VkcIIjKIV3YWt1Mg0",
|
||||
"boot-01.gc-us-central1-a.shards.test": "enr:-QEiuECIDOWRVQAUq2xpm3EUhuLRH1e_WCiLa6-5zmLoyVB-QSkSealvjt5Zb7cEqhU0pIeRaqnX6b8s98BahmG2XaSIAYJpZIJ2NIJpcIQihw1Xim11bHRpYWRkcnO4cgA2NjFib290LTAxLmdjLXVzLWNlbnRyYWwxLWEuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MWJvb3QtMDEuZ2MtdXMtY2VudHJhbDEtYS5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc40AEAUAAQAgAEAAgAEAiXNlY3AyNTZrMaECxjqgDQ0WyRSOilYU32DA5k_XNlDis3m1VdXkK9xM6kODdGNwgnZfg3VkcIIjKIV3YWt1Mg0",
|
||||
"boot-01.ac-cn-hongkong-c.shards.test": "enr:-QEiuEDvfBDIqKRhdBHfGkRLvbYdD8Cja_m8tqWqUG40zXDUSTWejzvi2TL7z4H9gMhy2asTJ0vBTMjpQPj6Te-e2uAFAYJpZIJ2NIJpcIQI2hdMim11bHRpYWRkcnO4cgA2NjFib290LTAxLmFjLWNuLWhvbmdrb25nLWMuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MWJvb3QtMDEuYWMtY24taG9uZ2tvbmctYy5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc40AEAUAAQAgAEAAgAEAiXNlY3AyNTZrMaEDP7CbRk-YKJwOFFM4Z9ney0GPc7WPJaCwGkpNRyla7mCDdGNwgnZfg3VkcIIjKIV3YWt1Mg0"
|
||||
},
|
||||
"wss/p2p/waku/boot": {
|
||||
"boot-01.do-ams3.shards.test": "/dns4/boot-01.do-ams3.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmAR24Mbb6VuzoyUiGx42UenDkshENVDj4qnmmbabLvo31",
|
||||
@@ -201,12 +184,12 @@
|
||||
"store-02.ac-cn-hongkong-c.shards.test": "/dns4/store-02.ac-cn-hongkong-c.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAm9CQhsuwPR54q27kNj9iaQVfyRzTGKrhFmr94oD8ujU6P"
|
||||
},
|
||||
"enr/p2p/waku/store": {
|
||||
"store-01.do-ams3.shards.test": "enr:-QEQuEDom7vBcLEP3ZCvRGPyBVTUJUO5YIyXvxcibag_iq6s5Ux6Zd1_nnqEXqynppYMNOTaTzSetRhmV9IH83j72umYAYJpZIJ2NIJpcISf3_Jeim11bHRpYWRkcnO4YgAuNilzdG9yZS0wMS5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwAwNilzdG9yZS0wMS5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaEC36GkB96EmFufcsRAX3gGW5bZlJwuAc2JB6nq9lUDE8qDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
|
||||
"store-02.do-ams3.shards.test": "enr:-QEQuEAmPituRLmZuwA6z0AT_Vl-KWbb7kpyX7qcWwbjygv_Oxrdu_0kmpShNtauWxhRmaOMOYddv9IwiIS8HujxHvpbAYJpZIJ2NIJpcISf3_Kaim11bHRpYWRkcnO4YgAuNilzdG9yZS0wMi5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwAwNilzdG9yZS0wMi5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaEC0jOth5qhqWd_NmDOAsiPjAiJZMTD-2WzsKsET75PcLCDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
|
||||
"store-01.gc-us-central1-a.shards.test": "enr:-QEiuEBW0x-NQAwfFIgwrwtMRbPpWYRbWzsQ6nMDQK5K8vT8uAph5mlAw-TaeIxw9K2Vc0QuEYzf8-MnOESVyQ-C6ywcAYJpZIJ2NIJpcIQiqsAnim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMS5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMS5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaEDf2gcTbDga3Hgy8gu-bwRUbs7_7Vn2hxudCXPQ0M7cJCDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
|
||||
"store-02.gc-us-central1-a.shards.test": "enr:-QEiuEDjbS1EbRmNA7Gl1F3z_NsTHloyfZp4h0tm5cQmTvo5SlFGIBPPpmB6oycGnVGCHFPmqV_XbJJRO5pObWa5dOHgAYJpZIJ2NIJpcIQiqpoCim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMi5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMi5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaEDWxINW5DCQgYg-U43t2f9dUfpHfZrp2RdL-IomGWtY4KDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
|
||||
"store-01.ac-cn-hongkong-c.shards.test": "enr:-QEiuEDkMIJT5pVMmtzHD5RATLyU0kAG0tKcC3AE3BQe0O6S9R6OsA7PEVaaUg52fA4_I2pwjoW2GroE6uR9a-7Vdfy-AYJpZIJ2NIJpcIQI2kpJim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMS5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMS5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaECZtdI3Wq88fYXHYUShn7AMktB3OaVo98ock70-RSMChiDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
|
||||
"store-02.ac-cn-hongkong-c.shards.test": "enr:-QEiuEBzOdkswwOBobEe-nUvdtALMP8sjV9b_v9rQS4E0QOv2TVdrXRKKrBzOgk8TIXFtdry3RrowN5pTH7vBWl8TPKUAYJpZIJ2NIJpcIQI2nnoim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMi5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMi5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaECzJ3LruqSdw0Ec2FKpAdT22kcWVyBiYvMGim2wRWzkjSDdGNwgnZfg3VkcIIjKIV3YWt1MgM"
|
||||
"store-01.do-ams3.shards.test": "enr:-QESuEBxlk35-NNVnppRQaNSB3fR4M7J7xK3NUYer3z-L9j0uTpg9MatcSEHLUFkf4lt5qxacyBxD6G1w5elhdSgeKo4AYJpZIJ2NIJpcISf3_Jeim11bHRpYWRkcnO4YgAuNilzdG9yZS0wMS5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwAwNilzdG9yZS0wMS5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJzjQAQBQABACAAQACAAQCJc2VjcDI1NmsxoQLfoaQH3oSYW59yxEBfeAZbltmUnC4BzYkHqer2VQMTyoN0Y3CCdl-DdWRwgiMohXdha3UyAw",
|
||||
"store-02.do-ams3.shards.test": "enr:-QESuEC_CCKHt-bfmNcpFhY4_RyzEPfb9qXDzc7-2mo0oTanx2pMNLVkGYQuAWzgS14nGqecJ4qNGnJf0iW6xmk7bvgSAYJpZIJ2NIJpcISf3_Kaim11bHRpYWRkcnO4YgAuNilzdG9yZS0wMi5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwAwNilzdG9yZS0wMi5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJzjQAQBQABACAAQACAAQCJc2VjcDI1NmsxoQLSM62HmqGpZ382YM4CyI-MCIlkxMP7ZbOwqwRPvk9wsIN0Y3CCdl-DdWRwgiMohXdha3UyAw",
|
||||
"store-01.gc-us-central1-a.shards.test": "enr:-QEkuEDdeEvvLl4imez1cjafogCr4Y9TC739Io6U7J78VG6ong2UtkKNADtupsHKArUcc13jCZI_O4z6XnLz6zYLpDn-AYJpZIJ2NIJpcIQiqsAnim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMS5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMS5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJzjQAQBQABACAAQACAAQCJc2VjcDI1NmsxoQN_aBxNsOBrceDLyC75vBFRuzv_tWfaHG50Jc9DQztwkIN0Y3CCdl-DdWRwgiMohXdha3UyAw",
|
||||
"store-02.gc-us-central1-a.shards.test": "enr:-QEkuEA98rxs-uF2s5E1qVW-yg7p7y6JZ5sFCDmeQOvaeQekLwbEO_O68XfOFCmuJsWwmA00HtnnbkAfFaYy0ZhsHWbKAYJpZIJ2NIJpcIQiqpoCim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMi5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMi5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJzjQAQBQABACAAQACAAQCJc2VjcDI1NmsxoQNbEg1bkMJCBiD5Tje3Z_11R-kd9munZF0v4iiYZa1jgoN0Y3CCdl-DdWRwgiMohXdha3UyAw",
|
||||
"store-01.ac-cn-hongkong-c.shards.test": "enr:-QEkuEAIYrY2284THz1f4FkFEr7PIHw5GrBLEd_4UZWMh1aCGUzePYMf-YIaw_-bEqfqRK_1p7RJVgLupl8EaENIUXG3AYJpZIJ2NIJpcIQI2kpJim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMS5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMS5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJzjQAQBQABACAAQACAAQCJc2VjcDI1NmsxoQJm10jdarzx9hcdhRKGfsAyS0Hc5pWj3yhyTvT5FIwKGIN0Y3CCdl-DdWRwgiMohXdha3UyAw",
|
||||
"store-02.ac-cn-hongkong-c.shards.test": "enr:-QEkuECDx1C82BBcVM4UAFnTNTRe8zwX6vIy3iYU3qOyJJZGuDhceqbwVwW_Nc5j6tAUgnotg_jiZiNXoj_tJrFildM4AYJpZIJ2NIJpcIQI2nnoim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMi5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMi5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJzjQAQBQABACAAQACAAQCJc2VjcDI1NmsxoQLMncuu6pJ3DQRzYUqkB1PbaRxZXIGJi8waKbbBFbOSNIN0Y3CCdl-DdWRwgiMohXdha3UyAw"
|
||||
},
|
||||
"wss/p2p/waku/store": {
|
||||
"store-01.do-ams3.shards.test": "/dns4/store-01.do-ams3.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmAUdrQ3uwzuE4Gy4D56hX6uLKEeerJAnhKEHZ3DxF1EfT",
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.9 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.3 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.5 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.8 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.0 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.5 KiB |
@@ -0,0 +1,345 @@
|
||||
Last updated: 2023-09-22
|
||||
|
||||
1. Introduction
|
||||
|
||||
1.1 Who we are
|
||||
|
||||
Status is developing a set of open source projects that use peer-to-peer technologies to help people transact securely, communicate freely, and organise with confidence. Anyone participating in these projects helps to build technology and tools that empowers people to advance their own sovereign communities.
|
||||
|
||||
Whenever “Status” or “we” or “us” or any similar variation, are used in these terms of use (referred to as, just “terms”), we are referring to Status Research & Development GmbH, a Swiss company with its registered office at Baarerstrasse 10, Zug, Switzerland, and includes its “representatives”, which means Status’ affiliates, directors, officers, employees, agents and any other representatives of Status. For the purposes of these terms, “representatives” also includes Status core contributors without prejudice to the other legal categories mentioned.
|
||||
|
||||
Status does not provide any services, such as financial services, to users of Status Software or any third party. Status is not an intermediary, agent, advisor, or custodian, and does not owe you any fiduciary duty.
|
||||
|
||||
1.2 About these terms
|
||||
|
||||
These terms are a contract between you and Status and apply to your use of Status Software. The term “Status Software” as used herein means a software developed by Status and is composed of a secure messaging tool, a crypto wallet, and a Web 3 browser integrated together.
|
||||
|
||||
Please read these terms carefully before using Status Software. By installing or using Status Software on any device, you agree to these terms. If you do not agree, you should not install or use Status Software.
|
||||
|
||||
We would like to draw your attention to certain parts of these terms which are summarised here for your convenience and we ask that you refer to the corresponding provisions below:
|
||||
|
||||
- You are solely responsible for the use of Status Software
|
||||
You are ultimately solely responsible for the use of Status Software. Throughout these terms, we have indicated where you are solely responsible in relation to your use of Status Software, for example, your use of the Wallet, securing your seed phrase and private keys (including backups) and the content you may create and submit through Status Software.
|
||||
|
||||
- Third party services and Web 3
|
||||
When using Status Software, you may access or use Third Party Services or interact with Web 3. We note that Status does not control or operate any of these Third Party Services or Web 3 and that there may be applicable terms and conditions which you should refer to if you choose to interact with them.
|
||||
|
||||
- Acceptable use of Status Software
|
||||
Status adheres to a number of Principles which are reflected in the design and development of Status Software. We ask that you use Status Software in a way that promotes and aligns with the Status Principles, particularly not acting or using Status Software in manner as set out in the relevant provision below.
|
||||
|
||||
- Risks
|
||||
The use of Status Software is not without risk. You should understand the risks involved and how they may affect you. We have listed a number of risks in these terms, such as from your use of the Wallet, the novel and experimental nature of Web 3, the unpredictable and volatile nature of Digital Assets and potential legal, and regulatory and tax implications. The risks listed in these terms are not exhaustive and ultimately, you are solely responsible for evaluating the risks and deciding whether or not to use Status Software.
|
||||
|
||||
- Indemnity
|
||||
You provide Status a broad indemnity from and against any and all claims, damages and expenses, including attorneys’ fees, arising from or related to your use of Status Software.
|
||||
|
||||
- Release and limitation of liability
|
||||
You not only release Status’ liability on a number of items, but also agree that Status’ aggregate liability is limited to EUR 100 (one hundred Euros) or to the maximum extent permitted by law.
|
||||
|
||||
- Arbitration
|
||||
If a dispute arises between you and Status, we will seek to first solve it amicably with you before proceeding to the use of an arbitration administered by the Swiss Chambers’ Arbitration Institution.
|
||||
|
||||
|
||||
2. About Status Software
|
||||
|
||||
2.1 What is Status Software
|
||||
|
||||
At Status, we strive to develop open source software that can serve as a secure communication tool that helps to uphold human rights. Status Software is specifically designed to facilitate the free flow of information, protect the right to private, secure communications and promote the sovereignty of individuals.
|
||||
|
||||
Status Software is composed of a secure messaging tool, a crypto wallet, and a Web 3 browser integrated together. The software developed by Status in this regard is simply called “Status Software” and you can find more details about its development on Status’ GitHub page.
|
||||
|
||||
Status Software is open source client software that is designed to be user-friendly and can be installed or run in a web browser on your local desktop or mobile device. You can use Status Software to interact with and participate in Web 3 protocols, applications and peer to peer networks (referred to in these terms collectively, as “Web 3”). Please note that Status Software is not a blockchain protocol, or a blockchain network, a platform or a web-based platform.
|
||||
|
||||
Status develops Status Software and makes it available for you to run in a web browser or for your local use on your desktop or mobile device. This means that you are solely responsible for your activity and any potential risk or loss you may incur through using the Status Software as further detailed below in these terms.
|
||||
|
||||
2.1.1 Wallet
|
||||
|
||||
Status Software includes a crypto wallet. We will refer to such wallet functionality in these terms as “Wallet”.
|
||||
|
||||
The Wallet is your own personal crypto wallet. This type of wallet is sometimes also called “non-custodial”, “self-custodial” or “self-hosted”, which means you are in complete control of the crypto tokens (the “Digital Assets”) in the Wallet. Status will never have access to or control over your seed phrase, private keys or Digital Assets in your Wallet given its design.
|
||||
|
||||
Using the Wallet, you are able to send, receive and store Digital Assets and connect to and interact with third-party services that enable the exchange of Digital Assets for fiat currency and Web 3, including certain blockchain bridges and decentralised exchanges.
|
||||
|
||||
The Wallet contains the latest security standards, anti-phishing mechanisms and locally generated and stored public and private keys to ensure that your Digital Assets are secured to the highest standards.
|
||||
|
||||
When generating an account, a randomisation process is started on your own device that generates a key pair. Status does not have visibility of or access to your private keys. You are solely responsible for storing and securing your seed phrase and private keys, and creating, storing and securing their backups. If you fail to maintain the appropriate security measures of your private keys, it may result in you losing access to your Wallet and control of any Digital Assets in your Wallet. If you lose or forget your seed phrase or private keys, Status will not be able to help you recover or replace them and further, Status will not be able to assist you with the recovery of your Digital Assets.
|
||||
|
||||
In order to further enhance the security of storing your private keys, you may also choose to store your keys on a keycard, such as the Status Keycard.
|
||||
|
||||
2.1.2 Messaging
|
||||
|
||||
Status Software includes messaging functionality that enables secure communication between users. We will refer to the messaging functionality of Status Software and the Status Community Spaces collectively in these terms, as “Messaging”.
|
||||
|
||||
Messaging uses an open source, peer-to-peer protocol with end-to-end encryption and metadata suppression to protect your messages from third parties (including Status). End-to-end encryption means that only the sender and recipient of a message can read its contents, and no one else. Peer-to-peer communication is accomplished using the Waku peer-to-peer messaging protocol, which relies on a distributed network of nodes instead of a centralised server. This means that there is no central party or server from which messages can be intercepted, modified or blocked. Learn more about Waku and how it works on Waku’s relevant website.
|
||||
|
||||
Within Messaging, you will also be able to participate in Status Community Spaces. This feature allows users to create their own token-gated communities where you can create group chats and engage with your communities, while leveraging the possibilities, functionality and benefits of blockchain technology. You will also be able to create (and join) open and public communities on Status Software that are accessible to other users. We note that content in these open and public communities will be accessible to all other users of Status Software. Nonetheless, all content will still be protected by the same end-to-end encryption utilised in Status Software.
|
||||
|
||||
2.1.2 Web 3 browser
|
||||
|
||||
Status Software also includes a Web 3 browser through which you may access and interact with Web 3, exchanges, marketplaces, games and more. We will refer to the Web 3 browser in these terms as the “Web 3 Browser”.
|
||||
|
||||
|
||||
3. Privacy
|
||||
|
||||
Status uses an open source, peer-to-peer protocol with end-to-end encryption and metadata suppression, which by design, means that Status (and any third party) is unable to and does not collect, store, own, control or have any visibility or means of access to your identity, Wallet, browsing information, any user private keys, Digital Assets, messages, content, history of interactions, transactions, user accounts or any other user information.
|
||||
|
||||
Therefore, Status does not (and cannot) monetise any users’ data or content, such as messages or browser information and Status does have any interest in doing so.
|
||||
|
||||
When generating an account on Status Software, you will have the option to utilise your phone number and certain social media handles such as your Twitter account, to generate an account. While this information is not shared with Status and Status has no access to it, third party service providers may receive it to authenticate your ownership of such accounts. Using your phone number or social media handle, such as on X (formerly known as Twitter), will allow you to find your contacts who are also using Status Software and it will help your contacts to find you. This will allow them to discover and potentially interact with you, if you accept their request to connect, so that you can start building up your network of contacts on Status Software. Please note that this is not required for you to access or utilise Status Software, and you can always choose to generate an account anonymously without utilising your phone number or social media handle.
|
||||
|
||||
In addition, you may opt in to submit certain technical information (also referred to as telemetry) to assist Status with the development of the Status Software, particularly to measure message reliability and bandwidth usage. In any event this technical information is anonymised by Status Software and also protected by end-to-end encryption. We note that even anonymised data can be vulnerable to being potentially compromised, such as by correlation attacks. You should opt in to submit this technical information only if you are willing to accept these risks.
|
||||
|
||||
You acknowledge that an inherent feature of Web 3 is its transparency, particularly in the context of blockchain networks. This means that your public key and wallet address will be visible to others when you engage in transactions on such networks and that third parties may be able to (and for the avoidance of doubt, not through the use of Status Software) connect your public key and wallet address to your identity and determine the Digital Assets you own in your Wallet. You should also be aware that entries on blockchain networks are practically immutable, which means that they generally cannot be deleted or modified by anyone, including Status, even if the transaction turns out to have been made in error or otherwise.
|
||||
|
||||
If you use third party services offered through Status Software, your privacy may not be protected and you will be subject to the privacy terms and conditions of such third parties. Please refer to our full terms regarding third party services below.
|
||||
|
||||
|
||||
Learn more about how we protect your data on Status Software by reading the Status Privacy Statement and relevant security page on the Status website.
|
||||
|
||||
|
||||
4. Using third party services and interacting with Web 3
|
||||
|
||||
When using Status Software, you may access or use third party products, services or tools (“Third Party Services”) and interact with Web 3. Status Software is only one means of interacting with these Third Party Services and Web 3 and you can independently utilise other means and tools to do so as well.
|
||||
|
||||
Your interactions with Web 3 could include many aspects, such as interacting with smart contracts that reside on blockchain networks, for example to swap Digital Assets or use (crypto) bridges, or deploying your own smart contracts through Status Community Spaces. You may also interact with and participate in peer-to-peer networks which could vary in their level of decentralisation, ranging from more centralised networks controlled by a single party to networks governed by decentralised communities.
|
||||
|
||||
You acknowledge when you use Third Party Services or interact with Web 3, that Status does not control or operate any Third Party Service or Web 3. These are products, services or tools that are respectively provided by others or may be operating autonomously, and not by Status.
|
||||
|
||||
Please note that when you use Third Party Services or interact with Web 3 that there may be applicable terms and conditions, including privacy policies which govern your use of Third Party Services or interaction with Web 3. In case of interactions with Web 3, such as decentralised exchanges, there may be in some cases no applicable terms and conditions, and the relevant software code will govern your interactions.
|
||||
|
||||
Please also note that bridges are used to move tokens from one blockchain network to another. When you use a bridge, for example in the course of sending or bridging tokens, Status utilises an algorithm that aims to determine the lowest service fee which the user may incur at the time of a bridge’s use. This algorithm relies on information extracted directly from the relevant blockchain networks. Status is not responsible for the accuracy and correctness of any information that these algorithms may extract from such networks
|
||||
|
||||
You are solely responsible for your use of Third Party Services and your interactions with Web 3. If you have any technical issues or other issues with any of these Third Party Services or Web 3, you should contact the relevant third party or appropriate point of contact directly (if any).
|
||||
|
||||
In principle, Status does not provide any advice, recommendation, support or endorse Third Party Services you may use or any aspect of Web 3 that you may interact with through Status Software. Their integration or availability through Status Software does not imply any support or endorsement by Status. Status may also receive a fee from certain third parties who provide the Third Party Services.
|
||||
|
||||
Please also note that Status participates in the development of other open source projects that utilise peer-to-peer technologies, which you can find more details about on Status’ GitHub page.
|
||||
|
||||
|
||||
5. Nodes
|
||||
|
||||
The use of Status Software on your device will turn it into a node that supports the Waku network.
|
||||
|
||||
In general, by participating in or interacting with Web 3 networks, you may choose or be required to operate a node or perform other functions in support of such a network. Status is not responsible for the operation or functioning of such nodes.
|
||||
|
||||
|
||||
6. Security
|
||||
|
||||
Although security is a top priority for us and many functions of Status Software are privacy-mode by default, we cannot guarantee the full security of Status Software and we are not responsible for alerting you to potential security risks. We intend to continuously update the security measures of Status Software and we will from time to time post updates on the security of Status Software through our communication channels.
|
||||
|
||||
|
||||
7. Content
|
||||
|
||||
At Status, we believe in the sovereignty of individuals and we stand for the cause of personal liberty. We aim to promote social, political, and economic freedoms through Status Software, which is built on the principles of the free flow of information and censorship resistance. Through Status Software, particularly when using Messenger and Status Community Spaces, you will be able to create and interact with various content. We consider content to include anything you (or any other user) create, post, distribute or exchange through Status Software (as well as any future functions that may be added to Status Software), whether its text, links, GIFs, emoji, photos or any other media formats.
|
||||
|
||||
You are solely responsible for any content that you create, post, distribute or submit, messages you exchange or any other activity you may engage in related to your content on or through Status Software and any harm or liability that may result from such content.
|
||||
|
||||
You represent and warrant in respect of such content that:
|
||||
1. your creation, posting, distribution or submission of content does not infringe on any intellectual property or other proprietary rights of any third party; and
|
||||
2. you are the creator and owner or that you have the necessary permissions to create, post, distribute or submit such content through Status Software.
|
||||
|
||||
You acknowledge that Status has no means of monitoring, moderating, removing, modifying or regulating users’ content or activity. Status is further unable to and is not responsible for verifying the accuracy or reliability of such content or activity. While you use Status Software, you may view content that:
|
||||
1. could be offensive, indecent, or otherwise objectionable;
|
||||
2. contains technical inaccuracies, typographical mistakes, and other errors; or
|
||||
3. could violate others’ rights, including but not limited to privacy, publicity, intellectual property, or other proprietary rights.
|
||||
|
||||
|
||||
8. Acceptable use of Status software
|
||||
|
||||
8.1 Adherence to Status Principles
|
||||
|
||||
One of Status’ goals is the widespread adoption of the decentralised web while also staying true to our Principles. These terms are designed to reflect our Principles, while providing important legal protections for Status and setting out guidelines and terms for the Status Software community of users. We ask that you use Status Software in a way that promotes and aligns with the Status Principles.
|
||||
|
||||
8.2 Limitation on certain uses of and acts in Status Software
|
||||
|
||||
You shall not, nor try to, encourage or assist others using Status Software to:
|
||||
1. gain or try to gain unauthorised access to Status Software;
|
||||
2. interfere with or disrupt the integrity, safety, security, availability or performance of Status Software;
|
||||
3. generate accounts on Status Software through unauthorised means;
|
||||
4. install or transmit on or through Status Software, any viruses, worms, malware, Trojan horses, or other harmful or destructive code or content;
|
||||
5. use spam, data mining, or other unsolicited promotional methods, machine generated content, or unethical or unwanted commercial content;
|
||||
6. engage in phishing, spoofing, or similar fraudulent acts;
|
||||
7. knowingly spread misinformation or impersonate another person or legal entity;
|
||||
8. incite, commit or threaten, harm or engage in illegal or inappropriate conduct including stalking, bullying, harassment, intimidation or abuse another individual or group;
|
||||
9. engage in or organise child sexual exploitation of any kind;
|
||||
10. use Status Software, if you are subject to sanctions, or otherwise designated on a list of prohibited or restricted parties as maintained by, the United Nations, the European Union or any of its member states or the Singaporean, Swiss or US government, or intend to interact or transact with such parties;
|
||||
11. violate, misappropriate or infringe the rights of Status, other users of Status Software, or any other third parties in any way, including but not limited to privacy, publicity, intellectual property, confidentiality, property or other rights;
|
||||
12. engage in any activity through Status Software that may be in violation of applicable law, rules or regulations in your jurisdiction;
|
||||
13. interfere, disrupt, negatively affect, or inhibit other users from their use of Status Software; or
|
||||
14. engage in any attack, hack, denial-of-service attack, interference, or exploit of any smart contract in connection with use of Status Software.
|
||||
|
||||
|
||||
9. Fees
|
||||
|
||||
When you use Status Software to interact with Third Party Services or Web 3, you may incur costs and may have to pay various fees, such as service fees, transfer fees, transaction fees, swap fees, bridge fees or network fees. You will be solely liable for any such fees, costs and expenses. Status has no control over and is unable to influence these fees in any manner.
|
||||
|
||||
|
||||
10. Intellectual property and branding
|
||||
|
||||
10.1 Status develops open source software
|
||||
|
||||
We want everyone to benefit from Status Software, so we made it available under free and open source licences. This means that anyone can use, share, and modify the source code, as long as they follow the terms of the applicable licence. We believe in permission-less participation, which means that everyone has the right to participate in the development of our software. The applicable licences can be found on Status’ GitHub page.
|
||||
|
||||
10.2 Respect the Status brand
|
||||
|
||||
Status (and its affiliates as the case may be) owns all the rights to Status brand, including copyrights, domains, trade dress (look and feel), design rights and themes, trademarks, logos, graphics, and other intellectual property. These terms do not grant you any rights to use the Status brand or its intellectual property.
|
||||
|
||||
We love to see creative work from the Status community, but please let us know in advance and in writing if you want to use trademarks, logos, or graphics or modify them from our standard colours and designs. If you write articles, blogs, create websites, or talk about Status, please make sure it is clear that you are not speaking for, on behalf of, or under endorsement by Status.
|
||||
|
||||
To request permission to use our copyrighted material or trademarks or any other intellectual property, such as logos, please contact: marketing@status.im. If we grant you permission, you must follow our guidelines and instructions for using our intellectual property.
|
||||
|
||||
|
||||
11. Risks
|
||||
|
||||
Before you use Status Software, you should understand the risks involved and how they may affect you. The risks listed below are not intended to be exhaustive and may not reflect all the potential risks you could be exposed to from using Status Software.
|
||||
|
||||
You are solely responsible for evaluating the risks and deciding whether or not to use Status Software. By using Status Software, you agree to accept all of the risks identified below, as well as any other risks that a reasonable person should have been aware about. Status is not responsible for notifying you on an ongoing basis about any changes in the risks associated with using Status Software.
|
||||
|
||||
11.1 Wallet
|
||||
|
||||
By using the Wallet, you represent that you have a sufficient understanding about crypto wallets and Digital Assets.
|
||||
|
||||
You acknowledge that Digital Assets stored in the Wallet are at risk of loss due to various factors, including but not limited to: theft, hacking (or other cyber-attacks), malware, technical or human error. You further acknowledge that transactions made through the Wallet are final and cannot be reversed by anyone, including Status. You are solely responsible for the transactions you undertake using Status Software, including verifying the accuracy and legitimacy of your transactions before confirming and proceeding with them.
|
||||
|
||||
Status is not a service provider or an intermediary or custodian. We do not store, control, custody, transfer, or handle any users’ funds or Digital Assets. Transactions are processed by validators, nodes, miners, and other participants on the Web 3 network (and not by Status). We do not have visibility of and cannot interfere with, modify, stop, block, change, reverse, or refund any transactions.
|
||||
|
||||
11.2 Novel and experimental nature of Web 3
|
||||
|
||||
You acknowledge that there are inherent risks related to Web 3, arising from its novel and experimental nature. These risks include but are not limited to security risks (such as hacking and malware or other cyber-attacks, unauthorised access to your Wallet, attacks on blockchain networks, among others), technical risks (such as software errors, vulnerabilities or bugs) or operational risks related to Digital Assets, smart contracts, use of certain services, such as (crypto) bridges and swaps or other aspects and functionalities of Web 3.
|
||||
|
||||
The technology underlying Web 3 is also novel and experimental, as for the most part, it is based on still unproven, emerging and complex technologies, such as blockchain networks, that are developed or operated by third parties and distributed across a series of unaffiliated nodes across the world. As such, these changes and development in this technology may adversely affect your use of Web 3 and even Status Software. It is your sole responsibility to monitor such changes and the potential impact on your use of Web 3 and Status Software.
|
||||
|
||||
Given the novel and experimental nature of Web 3, the laws, rules and regulations, or their interpretation, may change and develop in a manner which could adversely affect your ability to interact with any aspect of Web 3, including deploying smart contracts, as well as creating, using, distributing or purchasing Digital Assets. These rules and regulations vary significantly in maturity across jurisdictions, but are for the most part, still in the early stages of development and may rapidly evolve and as such, their potential impact is subject to significant uncertainty. This could result in adverse consequences to you that may include criminal or civil penalties, including fines. It is your sole responsibility to ensure that you comply with all applicable laws, rules and regulations, including but not limited to, cryptocurrencies, financial markets, securities and anti-money laundering.
|
||||
|
||||
Web 3 is also decentralised to varying degrees and this may lead to a lack of predictability, accountability, or control over Web 3. There is no guarantee that the protocols and networks will function as expected. Changes may occur suddenly, like forks, which may affect Status Software and your experience of using Status Software. Status may decide not to support a forked network in its sole discretion.
|
||||
|
||||
11.3 Unpredictable and volatile nature of Digital Assets
|
||||
|
||||
With Status Software, you can interact with and transact in Digital Assets and their markets. You acknowledge that these markets and Digital Assets are often highly unpredictable and volatile due to multiple factors, such as supply and demand, changes in technology, the regulatory environment, political, natural and economic events in a jurisdiction, and price speculation. In addition, the underlying factors that determine the price of a Digital Asset are often opaque and could be subject to speculation and market manipulation. This means that the value of Digital Assets can be lost in part or in full and you should not interact with Digital Assets unless you have the necessary advice, knowledge, expertise or risk appetite.
|
||||
|
||||
11.4 Potential legal, regulatory and tax implications
|
||||
|
||||
You acknowledge that there may be legal and regulatory implications applicable to you while using Status Software and interacting with Web 3 and that may also adversely impact your use of Status Software.
|
||||
|
||||
You are solely responsible for evaluating the legal and regulatory implications and taking appropriate actions, which could include obtaining any necessary licences, permits or approvals. Additionally, you are solely responsible for any tax implications, such as the payment of any taxes, resulting from your activities conducted through Status Software, including any transactions in Digital Assets.
|
||||
|
||||
|
||||
12. Disclaimers
|
||||
|
||||
Status Software is provided on an “as is” basis. Status does not make any express or implied representations or warranties in relation to Status Software. This includes warranties of merchantability, fitness for use or for a particular purpose, and non-infringement of any copyright or intellectual property rights. In particular, Status makes no representations or warranties:
|
||||
1. about the completeness, accuracy, utility, reliability, suitability or availability of any information provided by Status;
|
||||
2. that Status Software will be operational, secure, safe or free from failures, disruptions, unauthorised access, bugs, errors, or delays, viruses, malicious code or any other technical or security issues;
|
||||
3. regarding the completeness, accuracy, legality, utility, suitability, availability, functionality, timeliness or security of Web 3 or any Third Party Services;
|
||||
4. regarding the value, utility or legality of any Digital Asset;
|
||||
5. regarding the completeness, accuracy, legality, utility, suitability, functionality, security or availability of any smart contract that you may interact with or deploy; or
|
||||
6. regarding the completeness, accuracy, legality, utility, reliability, suitability or availability of any user content.
|
||||
|
||||
|
||||
13. Releases you should read closely
|
||||
|
||||
You release Status from all liability related to any claim, cause of action, controversy, dispute, loss, or damages, known or unknown, related to, arising from, or in any way connected with your use of Status Software. This includes, but is not limited to:
|
||||
1. user error, such as forgotten passwords, incorrectly constructed transactions, or mistyped wallet addresses;
|
||||
2. your inability to access your Wallet or the Digital Assets held in within it, for any reason, such as the loss of your seed phrase or private keys;
|
||||
3. your transactions or transfers of Digital Assets from and to your Wallet;
|
||||
4. any loss of value (in part or full) of your Digital Assets held in your Wallet;
|
||||
5. the failure of your hardware, software, or Internet connection;
|
||||
6. unauthorised access to your account, or your data on or through the Status Software, including any loss of data (such as your wallet address, private key and seed phrase);
|
||||
7. technical or operational errors in or related to Status Software, including underlying code or its functionalities, as well as the code of smart contracts you may deploy;
|
||||
8. any modification, suspension or discontinuance of Status Software or any feature or functionality of Status Software;
|
||||
9. your use of any Third Party Service or aspect of Web 3, including smart contracts and Digital Assets, as well as your interaction with such Third Party Service or Web 3;
|
||||
10. your content or other users’ content;
|
||||
11. any unauthorised third party activities, including without limitation the use of viruses, phishing, brute forcing, or other means of attack against Status Software; and
|
||||
12. any risks identified in these terms or any that a reasonable person should have been aware of in relation to using Status Software.
|
||||
|
||||
|
||||
14. Limitation of liability
|
||||
|
||||
Status will not be held liable to you under any contract, negligence, strict liability, or other legal or equitable theory for any lost profits, cost of procurement for substitute services, or any special, incidental, or consequential damages related to, arising from, or in any way connected with these terms, Status, your use of Status Software, particularly where Status has indicated that it is not responsible. This includes without limitation, your use of SNT or other Digital Assets (creating, distributing, transacting in or otherwise) even if Status has been advised of the possibility of such damages.
|
||||
In any event, Status’ aggregate liability for any claims is limited to EUR 100 (one hundred Euros). This limitation of liability will apply to the extent permitted by applicable law.
|
||||
|
||||
|
||||
15. Indemnity
|
||||
|
||||
You shall indemnify and hold harmless Status from and against any and all claims, damages and expenses, including attorneys’ fees, arising from or related to your use of Status Software. This includes, but is not limited to:
|
||||
1. your breach or alleged breach of these terms;
|
||||
2. any content you create, post, distribute or submit, messages you exchange or any other activity you may engage in related to your content on or through Status Software;
|
||||
3. your use, including any of your activities on or through, Status Software;
|
||||
4. your violation of any laws, rules or regulations;
|
||||
5. your harm to or violation of the rights of any third party, including any privacy, intellectual property, publicity, confidentiality, property or any other rights;
|
||||
6. your use of Third Party Services or any aspect of Web 3; or
|
||||
7. any misrepresentation or fraudulent statements made by you.
|
||||
|
||||
|
||||
16. Restricted jurisdictions
|
||||
|
||||
Status is a Swiss company which makes Status Software available through third party platforms, such as third party app stores, which enables global distribution to potential users.
|
||||
|
||||
You acknowledge that Status Software is not intended for use or distribution in any jurisdiction where such use or distribution of software that is similar or identical to Status Software is prohibited or restricted in any way. Your use of Status Software does not and will not subject Status to such jurisdiction under any circumstance, particularly if there are any prohibitions or restrictions on the use of such software. Status reserves the right to limit the availability of Status Software in any jurisdiction.
|
||||
|
||||
Status does not conduct any business activities (i.e. activities undertaken for the purpose of earning a profit) within the United States of America, District of Columbia, Puerto Rico, the U.S. Virgin Islands, and all other U.S. territories and possessions, as well as all Swiss embargoed countries.
|
||||
|
||||
|
||||
17. Materials provided are solely for informational purposes
|
||||
|
||||
Status provides materials and other information through Status Software for informational purposes only and they may not always be entirely accurate, complete, or current and may also include inaccuracies or typographical errors. You are solely responsible for verifying their adequacy, completeness and accuracy and any reliance you place on such information is at your own risk, including any decisions or actions you may take in this respect. Status is not liable for any loss resulting from your action (or inaction) and decisions based on these materials or any other information.
|
||||
|
||||
You should always conduct your own research and seek independent professional advice if necessary. The materials and other information that Status may provide through Status Software does not constitute financial, legal, tax, or other advice and should not be treated as such.
|
||||
|
||||
Additionally, Status is not responsible for any information, content, or services contained on any third party websites accessible or linked through the Status Software. By linking such third party websites, Status does not represent or imply that it endorses or supports such third party websites or content therein, or that it believes such third party websites and content therein to be accurate, useful or non-harmful. Status has no control over such third party websites and will not be liable for your use of or activities on any third party websites accessed through Status Software. The terms and conditions, including privacy policies, of such third party websites govern your use of their websites.If you access such third party websites through Status Software, it is at your own risk and you are solely responsible for your activities on such third party websites.
|
||||
|
||||
|
||||
18. Governing law and dispute resolution
|
||||
|
||||
18.1 Governing law
|
||||
|
||||
Swiss law governs these terms and any disputes between you and Status, whether in court or arbitration, without regard to conflict of laws provisions.
|
||||
|
||||
18.2 Dispute resolution
|
||||
|
||||
In these terms, “dispute” has the broadest meaning enforceable by law and includes any claim you make against Status or controversy you may have in relation to these terms, with Status or your use of Status Software.
|
||||
|
||||
We prefer arbitration over litigation as we believe it meets our Principle of resolving disputes in the most efficient and cost effective manner. You are bound by the following arbitration clause, which waives your right to litigation and to be heard by a judge. Please note that a court review of an arbitration award is limited. You also waive all your rights to a jury trial (if any) in any and all jurisdictions.
|
||||
|
||||
If a (potential) dispute arises, you must first use your reasonable efforts to resolve it amicably with Status by reaching out to Status’ legal team at legal@status.im. If these efforts do not result in a resolution of such dispute, you shall then send to legal@status.im a written notice of dispute setting out (i) the nature of the dispute, and the claim you are making; and (ii) the remedy you are seeking.
|
||||
|
||||
If you and Status are unable to further resolve this dispute within sixty (60) calendar days of Status receiving this notice of dispute, then any such dispute will be referred to and finally resolved by you and Status through an arbitration administered by the Swiss Chambers’ Arbitration Institution in accordance with the Swiss Rules of International Arbitration for the time being in force, which rules are deemed to be incorporated herein by reference. The arbitral decision may be enforced in any court. The arbitration will be held in Zug, Switzerland, and may be conducted via video conference virtual/online methods if possible. The tribunal will consist of one arbitrator, and all proceedings as well as communications between the parties will be kept confidential. The language of the arbitration will be in English. Payment of all relevant fees in respect of the arbitration, including filing, administration and arbitrator fees will be in accordance with the Swiss Rules of International Arbitration.
|
||||
|
||||
Regardless of any applicable statute of limitations, you must bring any claims within one year after the claim arose or the time when you should have reasonably known about the claim. You also waive the right to participate in a class action lawsuit or a classwide arbitration against Status.
|
||||
|
||||
|
||||
19. What happens if you stop using Status Software
|
||||
|
||||
If, at any time, you no longer agree to these terms, you must immediately stop using Status Software and uninstall it from all your devices. You acknowledge that even after uninstalling Status Software from all your devices, messages (including content) you have sent may still remain on the recipient’s device, blockchain transactions you have may still be recorded on the blockchain, and any smart contracts you have deployed to a blockchain may still remain deployed.
|
||||
|
||||
Even after you have stopped using Status Software, all provisions of these terms which by their nature should survive termination shall survive termination. These provisions include, but are not limited to, warranty disclaimers, indemnity, limitations of liability, dispute resolution, and governing law.
|
||||
|
||||
|
||||
20. General provisions
|
||||
|
||||
20.1 Entire agreement
|
||||
|
||||
These terms, including the underlying open source licences governing the Status Software, cover the entire agreement between you and Status regarding the Status Software. If these terms are considered an offer by Status, acceptance is expressly limited to these terms. Any failure by Status to exercise or enforce any right or provision of these terms will not constitute our waiver of such right or provision.
|
||||
|
||||
20.2 Severability
|
||||
|
||||
If any section of these terms is determined to be unlawful, void, or unenforceable, the unenforceable portion will be deemed to be severed from these terms. Such determination shall not affect the validity and enforceability of any other remaining provisions.
|
||||
|
||||
20.3 Captions and headings
|
||||
|
||||
The captions and headings identifying sections and subsections of these terms are for reference only and do not define, modify, expand, limit, or affect the interpretation of any provisions of these terms. Any illustrative graphics and links to websites are provided for your information and education, and, unless otherwise specifically indicated, they are not included in or part of these terms.
|
||||
|
||||
20.4 Changes to Status Software and terms
|
||||
|
||||
20.4.1 Changes to Status Software
|
||||
|
||||
Status Software is an open source, community-driven project. Users can both request and contribute to feature or functionality development by contacting us directly. Status may change or discontinue some or all features and functionality on Status Software at any time in our sole discretion, including features or support for certain devices. We will not be liable to you or any third party for any modification, suspension, or discontinuation of any features or functionality of Status Software. Any and all new functions added to Status Software are also subject to these terms.
|
||||
|
||||
20.4.2 Notice of changes to the terms
|
||||
|
||||
We reserve the right to modify or replace any part of these terms at any time and in our sole discretion. You are solely responsible for checking Status Software, or the relevant location where these terms are published, periodically for any changes. Your continued use of Status Software following changes to these terms means that you have accepted those changes. If you do not accept such changes, then you must immediately stop using Status Software and uninstall it from your devices.
|
||||
|
||||
20.5 Contact us
|
||||
|
||||
If you have any questions about these terms, please contact us at legal@status.im or through the appropriate means of communication indicated on Status’ website.
|
||||
|
||||
This document is CC-BY-SA.
|
||||
@@ -11,9 +11,11 @@
|
||||
[legacy.status-im.utils.random :as random]
|
||||
[native-module.core :as native-module]
|
||||
[re-frame.core :as re-frame]
|
||||
[react-native.core :as react]
|
||||
[react-native.platform :as platform]
|
||||
[status-im.common.json-rpc.events :as json-rpc]
|
||||
[status-im.common.universal-links :as links]
|
||||
[status-im.config :as config]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contexts.chat.events :as chat.events]
|
||||
[status-im.navigation.events :as navigation]
|
||||
@@ -302,16 +304,18 @@
|
||||
:history [normalized-url]}]
|
||||
(if (links/universal-link? normalized-url)
|
||||
{:dispatch [:universal-links/handle-url normalized-url]}
|
||||
(rf/merge cofx
|
||||
{:db (assoc db
|
||||
:browser/options
|
||||
{:browser-id (:browser-id browser)}
|
||||
:browser/screen-id :browser)}
|
||||
(navigation/pop-to-root :shell-stack)
|
||||
(chat.events/close-chat)
|
||||
(navigation/change-tab :browser-stack)
|
||||
(update-browser browser)
|
||||
(resolve-url nil)))))
|
||||
(if config/show-not-implemented-features?
|
||||
(rf/merge cofx
|
||||
{:db (assoc db
|
||||
:browser/options
|
||||
{:browser-id (:browser-id browser)}
|
||||
:browser/screen-id :browser)}
|
||||
(navigation/pop-to-root :shell-stack)
|
||||
(chat.events/close-chat (:current-chat-id db))
|
||||
(navigation/change-tab :browser-stack)
|
||||
(update-browser browser)
|
||||
(resolve-url nil))
|
||||
(.openURL ^js react/linking (url/normalize-url url))))))
|
||||
|
||||
(rf/defn open-existing-browser
|
||||
"Opens an existing browser with it's history"
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
(ns legacy.status-im.browser.core-test
|
||||
(:require
|
||||
[cljs.test :refer-macros [deftest is testing]]
|
||||
[legacy.status-im.browser.core :as browser]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.url :as url]))
|
||||
|
||||
(defn has-wrong-properties?
|
||||
@@ -21,101 +18,103 @@
|
||||
(some #(when (= (url/normalize-and-decode-url dapp-url) (first (:history %))) (:browser-id %))
|
||||
(vals (get-in result [:db :browser/browsers]))))
|
||||
|
||||
(deftest browser-test
|
||||
(let [dapp1-url "cryptokitties.co"
|
||||
dapp2-url "http://test2.com"]
|
||||
#_(deftest browser-test
|
||||
(let [dapp1-url "cryptokitties.co"
|
||||
dapp2-url "http://test2.com"]
|
||||
|
||||
(testing "user opens a dapp"
|
||||
(let [result-open (browser/open-url {:db {} :now 1} dapp1-url)
|
||||
dapp1-id (get-dapp-id result-open dapp1-url)]
|
||||
(is (= dapp1-id (get-in result-open [:db :browser/options :browser-id]))
|
||||
"browser-id should be dapp1-url")
|
||||
(is (not (has-wrong-properties? result-open
|
||||
dapp1-id
|
||||
{:browser-id dapp1-id
|
||||
:history-index 0
|
||||
:history ["https://cryptokitties.co"]
|
||||
:dapp? false
|
||||
:name (i18n/label :t/browser)}))
|
||||
"some properties of the browser are not correct")
|
||||
(testing "user opens a dapp"
|
||||
(let [result-open (browser/open-url {:db {} :now 1} dapp1-url)
|
||||
dapp1-id (get-dapp-id result-open dapp1-url)]
|
||||
(is (= dapp1-id (get-in result-open [:db :browser/options :browser-id]))
|
||||
"browser-id should be dapp1-url")
|
||||
(is (not (has-wrong-properties? result-open
|
||||
dapp1-id
|
||||
{:browser-id dapp1-id
|
||||
:history-index 0
|
||||
:history ["https://cryptokitties.co"]
|
||||
:dapp? false
|
||||
:name (i18n/label :t/browser)}))
|
||||
"some properties of the browser are not correct")
|
||||
|
||||
(testing "then a second dapp"
|
||||
(let [result-open-2 (browser/open-url {:db (:db result-open)
|
||||
:now 2}
|
||||
dapp2-url)
|
||||
dapp2-id (get-dapp-id result-open-2 dapp2-url)]
|
||||
(is (= dapp2-id (get-in result-open-2 [:db :browser/options :browser-id]))
|
||||
"browser-id should be dapp2 host")
|
||||
(is (not (has-wrong-properties? result-open-2
|
||||
dapp2-id
|
||||
{:browser-id dapp2-id
|
||||
:history-index 0
|
||||
:history ["http://test2.com"]
|
||||
:dapp? false}))
|
||||
"some properties of the browser are not correct")
|
||||
(testing "then a second dapp"
|
||||
(let [result-open-2 (browser/open-url {:db (:db result-open)
|
||||
:now 2}
|
||||
dapp2-url)
|
||||
dapp2-id (get-dapp-id result-open-2 dapp2-url)]
|
||||
(is (= dapp2-id (get-in result-open-2 [:db :browser/options :browser-id]))
|
||||
"browser-id should be dapp2 host")
|
||||
(is (not (has-wrong-properties? result-open-2
|
||||
dapp2-id
|
||||
{:browser-id dapp2-id
|
||||
:history-index 0
|
||||
:history ["http://test2.com"]
|
||||
:dapp? false}))
|
||||
"some properties of the browser are not correct")
|
||||
|
||||
(testing "then removes the second dapp"
|
||||
(let [result-remove-2 (browser/remove-browser {:db (:db result-open-2)} dapp2-id)]
|
||||
(is (= #{dapp1-id}
|
||||
(set (keys (get-in result-remove-2 [:db :browser/browsers]))))
|
||||
"the second dapp shouldn't be in the browser list anymore")))))
|
||||
(testing "then removes the second dapp"
|
||||
(let [result-remove-2 (browser/remove-browser {:db (:db result-open-2)} dapp2-id)]
|
||||
(is (= #{dapp1-id}
|
||||
(set (keys (get-in result-remove-2 [:db :browser/browsers]))))
|
||||
"the second dapp shouldn't be in the browser list anymore")))))
|
||||
|
||||
(testing "then opens the dapp again"
|
||||
(let [result-open-existing (browser/open-existing-browser {:db (:db result-open)
|
||||
:now 2}
|
||||
dapp1-id)
|
||||
dapp1-url2 (str "https://" dapp1-url "/nav2")]
|
||||
(is (not (has-wrong-properties? result-open-existing
|
||||
dapp1-id
|
||||
{:browser-id dapp1-id
|
||||
:history-index 0
|
||||
:history ["https://cryptokitties.co"]
|
||||
:dapp? false
|
||||
:name (i18n/label :t/browser)}))
|
||||
"some properties of the browser are not correct")
|
||||
(is (nil? (browser/navigate-to-next-page result-open-existing))
|
||||
"nothing should happen if user tries to navigate to next page")
|
||||
(is (nil? (browser/navigate-to-previous-page result-open-existing))
|
||||
"nothing should happen if user tries to navigate to previous page")
|
||||
(testing "then opens the dapp again"
|
||||
(let [result-open-existing (browser/open-existing-browser {:db (:db result-open)
|
||||
:now 2}
|
||||
dapp1-id)
|
||||
dapp1-url2 (str "https://" dapp1-url "/nav2")]
|
||||
(is (not (has-wrong-properties? result-open-existing
|
||||
dapp1-id
|
||||
{:browser-id dapp1-id
|
||||
:history-index 0
|
||||
:history ["https://cryptokitties.co"]
|
||||
:dapp? false
|
||||
:name (i18n/label :t/browser)}))
|
||||
"some properties of the browser are not correct")
|
||||
(is (nil? (browser/navigate-to-next-page result-open-existing))
|
||||
"nothing should happen if user tries to navigate to next page")
|
||||
(is (nil? (browser/navigate-to-previous-page result-open-existing))
|
||||
"nothing should happen if user tries to navigate to previous page")
|
||||
|
||||
(testing "then navigates to a new url in the dapp"
|
||||
(let [result-navigate (browser/navigation-state-changed
|
||||
{:db (:db result-open-existing)
|
||||
:now 4}
|
||||
(clj->js {"url" dapp1-url2
|
||||
"loading" false})
|
||||
false)]
|
||||
(is (not (has-wrong-properties? result-navigate
|
||||
dapp1-id
|
||||
{:browser-id dapp1-id
|
||||
:history-index 1
|
||||
:history ["https://cryptokitties.co" dapp1-url2]
|
||||
:dapp? false
|
||||
:name (i18n/label :t/browser)}))
|
||||
"some properties of the browser are not correct")
|
||||
|
||||
(testing "then navigates to previous page"
|
||||
(let [result-previous (browser/navigate-to-previous-page {:db (:db result-navigate)
|
||||
:now 5})]
|
||||
(is
|
||||
(not (has-wrong-properties? result-previous
|
||||
dapp1-id
|
||||
{:browser-id dapp1-id
|
||||
:history-index 0
|
||||
:history ["https://cryptokitties.co" dapp1-url2]
|
||||
:dapp? false
|
||||
:name (i18n/label :t/browser)}))
|
||||
"some properties of the browser are not correct")
|
||||
|
||||
(testing "then navigates to next page")
|
||||
(let [result-next (browser/navigate-to-next-page {:db (:db result-previous)
|
||||
:now 6})]
|
||||
(is (not
|
||||
(has-wrong-properties? result-next
|
||||
(testing "then navigates to a new url in the dapp"
|
||||
(let [result-navigate (browser/navigation-state-changed
|
||||
{:db (:db result-open-existing)
|
||||
:now 4}
|
||||
(clj->js {"url" dapp1-url2
|
||||
"loading" false})
|
||||
false)]
|
||||
(is (not (has-wrong-properties? result-navigate
|
||||
dapp1-id
|
||||
{:browser-id dapp1-id
|
||||
:history-index 1
|
||||
:history ["https://cryptokitties.co" dapp1-url2]
|
||||
:dapp? false
|
||||
:name (i18n/label :t/browser)}))
|
||||
"some properties of the browser are not correct"))))))))))))
|
||||
"some properties of the browser are not correct")
|
||||
|
||||
(testing "then navigates to previous page"
|
||||
(let [result-previous (browser/navigate-to-previous-page {:db (:db result-navigate)
|
||||
:now 5})]
|
||||
(is
|
||||
(not (has-wrong-properties? result-previous
|
||||
dapp1-id
|
||||
{:browser-id dapp1-id
|
||||
:history-index 0
|
||||
:history ["https://cryptokitties.co"
|
||||
dapp1-url2]
|
||||
:dapp? false
|
||||
:name (i18n/label :t/browser)}))
|
||||
"some properties of the browser are not correct")
|
||||
|
||||
(testing "then navigates to next page")
|
||||
(let [result-next (browser/navigate-to-next-page {:db (:db result-previous)
|
||||
:now 6})]
|
||||
(is (not
|
||||
(has-wrong-properties? result-next
|
||||
dapp1-id
|
||||
{:browser-id dapp1-id
|
||||
:history-index 1
|
||||
:history ["https://cryptokitties.co"
|
||||
dapp1-url2]
|
||||
:dapp? false
|
||||
:name (i18n/label :t/browser)}))
|
||||
"some properties of the browser are not correct"))))))))))))
|
||||
|
||||
@@ -1,96 +1,90 @@
|
||||
(ns legacy.status-im.browser.permissions-test
|
||||
(:require
|
||||
[cljs.test :refer-macros [deftest is testing]]
|
||||
[legacy.status-im.browser.core :as browser]
|
||||
[legacy.status-im.browser.core-test :as core.tests]
|
||||
[legacy.status-im.browser.permissions :as permissions]
|
||||
[legacy.status-im.utils.deprecated-types :as types]))
|
||||
(ns legacy.status-im.browser.permissions-test)
|
||||
|
||||
(deftest permissions-test
|
||||
(let [dapp-name "test.com"
|
||||
dapp-name2 "test2.org"
|
||||
cofx {:db (assoc-in (:db (browser/open-url {:db {}} dapp-name))
|
||||
[:profile/profile :public-key]
|
||||
"public-key")}
|
||||
dapp-id (core.tests/get-dapp-id cofx dapp-name)]
|
||||
(testing "dapps permissions are initialized"
|
||||
(is (zero? (count (get-in cofx [:db :dapps/permissions]))))
|
||||
(is (= dapp-id (get-in cofx [:db :browser/options :browser-id]))))
|
||||
#_(deftest permissions-test
|
||||
(let [dapp-name "test.com"
|
||||
dapp-name2 "test2.org"
|
||||
cofx {:db (assoc-in (:db (browser/open-url {:db {}} dapp-name))
|
||||
[:profile/profile :public-key]
|
||||
"public-key")}
|
||||
dapp-id (core.tests/get-dapp-id cofx dapp-name)]
|
||||
(testing "dapps permissions are initialized"
|
||||
(is (zero? (count (get-in cofx [:db :dapps/permissions]))))
|
||||
(is (= dapp-id (get-in cofx [:db :browser/options :browser-id]))))
|
||||
|
||||
(testing "receiving an unsupported permission"
|
||||
(let [result-ask (browser/process-bridge-message cofx
|
||||
(types/clj->json
|
||||
{:type "api-request"
|
||||
:host dapp-name
|
||||
:messageId 0
|
||||
:permission "FAKE_PERMISSION"}))]
|
||||
(is (not (get-in result-ask [:browser/send-to-bridge :isAllowed])))))
|
||||
(testing "receiving an unsupported permission"
|
||||
(let [result-ask (browser/process-bridge-message cofx
|
||||
(types/clj->json
|
||||
{:type "api-request"
|
||||
:host dapp-name
|
||||
:messageId 0
|
||||
:permission "FAKE_PERMISSION"}))]
|
||||
(is (not (get-in result-ask [:browser/send-to-bridge :isAllowed])))))
|
||||
|
||||
(testing "receiving a supported permission"
|
||||
(let [result-ask (browser/process-bridge-message cofx
|
||||
(types/clj->json {:type "api-request"
|
||||
(testing "receiving a supported permission"
|
||||
(let [result-ask (browser/process-bridge-message cofx
|
||||
(types/clj->json {:type "api-request"
|
||||
:host dapp-name
|
||||
:messageId 1
|
||||
:permission "contact-code"}))]
|
||||
(is (= (get-in result-ask [:db :browser/options :show-permission])
|
||||
{:requested-permission "contact-code"
|
||||
:dapp-name "test.com"
|
||||
:message-id 1
|
||||
:yield-control? nil}))
|
||||
(is (zero? (count (get-in result-ask [:db :dapps/permissions]))))
|
||||
|
||||
(testing "then user accepts the supported permission"
|
||||
(let [accept-result (permissions/allow-permission {:db (:db result-ask)})]
|
||||
(is (= (get accept-result :browser/send-to-bridge)
|
||||
{:type "api-response"
|
||||
:messageId 1
|
||||
:isAllowed true
|
||||
:data "public-key"
|
||||
:permission "contact-code"})
|
||||
"the data should have been sent to the bridge")
|
||||
(is (= (get-in accept-result [:db :dapps/permissions])
|
||||
{"test.com" {:dapp "test.com" :permissions ["contact-code"]}})
|
||||
"the dapp should now have CONTACT_CODE permission")
|
||||
|
||||
(testing "then dapp asks for permission again"
|
||||
(let [result-ask-again (browser/process-bridge-message {:db (:db accept-result)}
|
||||
(types/clj->json
|
||||
{:type "api-request"
|
||||
:host dapp-name
|
||||
:messageId 1
|
||||
:messageId 2
|
||||
:permission "contact-code"}))]
|
||||
(is (= (get-in result-ask [:db :browser/options :show-permission])
|
||||
{:requested-permission "contact-code"
|
||||
:dapp-name "test.com"
|
||||
:message-id 1
|
||||
:yield-control? nil}))
|
||||
(is (zero? (count (get-in result-ask [:db :dapps/permissions]))))
|
||||
(is (= (get result-ask-again :browser/send-to-bridge)
|
||||
{:type "api-response"
|
||||
:isAllowed true
|
||||
:messageId 2
|
||||
:data "public-key"
|
||||
:permission "contact-code"})
|
||||
"the response should be immediatly sent to the bridge")))
|
||||
|
||||
(testing "then user accepts the supported permission"
|
||||
(let [accept-result (permissions/allow-permission {:db (:db result-ask)})]
|
||||
(is (= (get accept-result :browser/send-to-bridge)
|
||||
{:type "api-response"
|
||||
:messageId 1
|
||||
:isAllowed true
|
||||
:data "public-key"
|
||||
:permission "contact-code"})
|
||||
"the data should have been sent to the bridge")
|
||||
(is (= (get-in accept-result [:db :dapps/permissions])
|
||||
{"test.com" {:dapp "test.com" :permissions ["contact-code"]}})
|
||||
"the dapp should now have CONTACT_CODE permission")
|
||||
(testing "then user switch to another dapp that asks for permissions"
|
||||
(let [new-dapp (browser/open-url {:db (:db accept-result)} dapp-name2)
|
||||
result-ask2 (browser/process-bridge-message {:db (:db new-dapp)}
|
||||
(types/clj->json
|
||||
{:type "api-request"
|
||||
:host dapp-name2
|
||||
:messageId 3
|
||||
:permission "contact-code"}))]
|
||||
(is (= (get-in result-ask2 [:db :dapps/permissions])
|
||||
{"test.com" {:dapp "test.com" :permissions ["contact-code"]}})
|
||||
"there should only be permissions for dapp-name at that point")
|
||||
(is (nil? (get result-ask2 :browser/send-to-bridge))
|
||||
"no message should be sent to the bridge")
|
||||
|
||||
(testing "then dapp asks for permission again"
|
||||
(let [result-ask-again (browser/process-bridge-message {:db (:db accept-result)}
|
||||
(types/clj->json
|
||||
{:type "api-request"
|
||||
:host dapp-name
|
||||
:messageId 2
|
||||
:permission "contact-code"}))]
|
||||
(is (= (get result-ask-again :browser/send-to-bridge)
|
||||
{:type "api-response"
|
||||
:isAllowed true
|
||||
:messageId 2
|
||||
:data "public-key"
|
||||
:permission "contact-code"})
|
||||
"the response should be immediatly sent to the bridge")))
|
||||
|
||||
(testing "then user switch to another dapp that asks for permissions"
|
||||
(let [new-dapp (browser/open-url {:db (:db accept-result)} dapp-name2)
|
||||
result-ask2 (browser/process-bridge-message {:db (:db new-dapp)}
|
||||
(types/clj->json
|
||||
{:type "api-request"
|
||||
:host dapp-name2
|
||||
:messageId 3
|
||||
:permission "contact-code"}))]
|
||||
(is (= (get-in result-ask2 [:db :dapps/permissions])
|
||||
{"test.com" {:dapp "test.com" :permissions ["contact-code"]}})
|
||||
"there should only be permissions for dapp-name at that point")
|
||||
(is (nil? (get result-ask2 :browser/send-to-bridge))
|
||||
"no message should be sent to the bridge")
|
||||
|
||||
(testing "then user accepts permission for dapp-name2"
|
||||
(let [accept-result2 (permissions/allow-permission {:db (:db result-ask2)})]
|
||||
(is (= (get-in accept-result2 [:db :dapps/permissions])
|
||||
{"test.com" {:dapp "test.com" :permissions ["contact-code"]}
|
||||
"test2.org" {:dapp "test2.org" :permissions ["contact-code"]}})
|
||||
"there should be permissions for both dapps now")
|
||||
(is (= (get accept-result2 :browser/send-to-bridge)
|
||||
{:type "api-response"
|
||||
:isAllowed true
|
||||
:messageId 3
|
||||
:data "public-key"
|
||||
:permission "contact-code"})
|
||||
"the response should be sent to the bridge")))))))))))
|
||||
(testing "then user accepts permission for dapp-name2"
|
||||
(let [accept-result2 (permissions/allow-permission {:db (:db result-ask2)})]
|
||||
(is (= (get-in accept-result2 [:db :dapps/permissions])
|
||||
{"test.com" {:dapp "test.com" :permissions ["contact-code"]}
|
||||
"test2.org" {:dapp "test2.org" :permissions ["contact-code"]}})
|
||||
"there should be permissions for both dapps now")
|
||||
(is (= (get accept-result2 :browser/send-to-bridge)
|
||||
{:type "api-response"
|
||||
:isAllowed true
|
||||
:messageId 3
|
||||
:data "public-key"
|
||||
:permission "contact-code"})
|
||||
"the response should be sent to the bridge")))))))))))
|
||||
|
||||
@@ -97,7 +97,8 @@
|
||||
:deleted :deleted?
|
||||
:deletedForMe :deleted-for-me?
|
||||
:communityId :community-id
|
||||
:albumImagesCount :album-images-count})
|
||||
:albumImagesCount :album-images-count
|
||||
:bridgeMessage :bridge-message})
|
||||
(update :outgoing-status keyword)
|
||||
(update :command-parameters
|
||||
set/rename-keys
|
||||
|
||||
@@ -9,8 +9,7 @@
|
||||
(testing "it returns the default fleets"
|
||||
(is (=
|
||||
#{:eth.prod
|
||||
:eth.staging
|
||||
:eth.test}
|
||||
:eth.staging}
|
||||
(into #{}
|
||||
(keys (node/fleets {})))))))
|
||||
(testing "passing a custom fleet"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
[legacy.status-im.ui.components.react :as react]
|
||||
[re-frame.core :as re-frame]
|
||||
[react-native.platform :as platform]
|
||||
[status-im.config :as config]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.url :as url]))
|
||||
|
||||
@@ -27,10 +28,13 @@
|
||||
(defn browse
|
||||
[link]
|
||||
(show {:title (i18n/label :t/browsing-title)
|
||||
:options [{:label (i18n/label :t/browsing-open-in-status)
|
||||
:action #(re-frame/dispatch [:browser.ui/open-url link])}
|
||||
{:label (i18n/label (platform-web-browser))
|
||||
:action #(.openURL ^js react/linking (url/normalize-url link))}]
|
||||
:options (if config/show-not-implemented-features?
|
||||
[{:label (i18n/label :t/browsing-open-in-status)
|
||||
:action #(re-frame/dispatch [:browser.ui/open-url link])}
|
||||
{:label (i18n/label (platform-web-browser))
|
||||
:action #(.openURL ^js react/linking (url/normalize-url link))}]
|
||||
[{:label (i18n/label (platform-web-browser))
|
||||
:action #(.openURL ^js react/linking (url/normalize-url link))}])
|
||||
:cancel-text (i18n/label :t/browsing-cancel)}))
|
||||
|
||||
(defn browse-in-web-browser
|
||||
|
||||
@@ -601,3 +601,11 @@
|
||||
(.createAccountFromMnemonicAndDeriveAccountsForPaths ^js (account-manager)
|
||||
(types/clj->json mnemonic)
|
||||
#(callback (types/json->clj %))))
|
||||
|
||||
(defn get-connection-string-for-exporting-keypairs-keystores
|
||||
"Generates connection string form status-go for the purpose of exporting keypairs and keystores on sender side"
|
||||
[config-json callback]
|
||||
(log/info "[native-module] Fetching Export Keypairs Connection String"
|
||||
{:fn :get-connection-string-for-exporting-keypairs-keystores
|
||||
:config-json config-json})
|
||||
(.getConnectionStringForExportingKeypairsKeystores ^js (network) config-json callback))
|
||||
|
||||
@@ -10,12 +10,13 @@
|
||||
|
||||
:image - collection image
|
||||
:theme - keyword -> :light/:dark"
|
||||
[{:keys [image size on-load-end on-error] :or {size :size-24}}]
|
||||
[{:keys [image size on-load-start on-load-end on-error] :or {size :size-24}}]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
[rn/view {:style (style/collection-avatar-container theme size)}
|
||||
[fast-image/fast-image
|
||||
{:accessibility-label :collection-avatar
|
||||
:source image
|
||||
:on-load-start on-load-start
|
||||
:on-load-end on-load-end
|
||||
:on-error on-error
|
||||
:style (style/collection-avatar size)}]]))
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
(ns quo.components.avatars.community-avatar.component-spec
|
||||
(:require [quo.components.avatars.community-avatar.view :as community-avatar]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(h/describe "Avatars: Community Avatar"
|
||||
(h/test "should render correctly"
|
||||
(h/render-with-theme-provider
|
||||
[community-avatar/view {:image "mock-image"}])
|
||||
(h/is-truthy (h/get-by-label-text :community-avatar))))
|
||||
@@ -0,0 +1,12 @@
|
||||
(ns quo.components.avatars.community-avatar.style)
|
||||
|
||||
(def ^:private sizes
|
||||
{:size-32 32
|
||||
:size-24 24})
|
||||
|
||||
(defn image
|
||||
[size]
|
||||
(let [size-val (sizes size)]
|
||||
{:border-radius (/ size-val 2)
|
||||
:width size-val
|
||||
:height size-val}))
|
||||
@@ -0,0 +1,23 @@
|
||||
(ns quo.components.avatars.community-avatar.view
|
||||
(:require [quo.components.avatars.community-avatar.style :as style]
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:size {:optional true} [:maybe [:enum :size-32 :size-24]]]
|
||||
[:image :schema.common/image-source]
|
||||
[:container-style {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [size image container-style]}]
|
||||
[rn/image
|
||||
{:source image
|
||||
:accessibility-label :community-avatar
|
||||
:style (merge (style/image size) container-style)}])
|
||||
|
||||
(def view (schema/instrument #'view-internal ?schema))
|
||||
@@ -0,0 +1,14 @@
|
||||
(ns quo.components.avatars.dapp-avatar.component-spec
|
||||
(:require [quo.components.avatars.dapp-avatar.view :as dapp-avatar]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(h/describe "Avatars: dApp Avatar"
|
||||
(h/test "should render correctly without context"
|
||||
(h/render-with-theme-provider
|
||||
[dapp-avatar/view {:image "mock-image"}])
|
||||
(h/is-truthy (h/get-by-label-text :dapp-avatar)))
|
||||
|
||||
(h/test "should render correctly with context"
|
||||
(h/render-with-theme-provider
|
||||
[dapp-avatar/view {:image "mock-image" :network-image "mock-image" :context? true}])
|
||||
(h/is-truthy (h/get-by-label-text :dapp-avatar))))
|
||||
@@ -0,0 +1,23 @@
|
||||
(ns quo.components.avatars.dapp-avatar.style)
|
||||
|
||||
(def ^:const size 32)
|
||||
|
||||
(def container
|
||||
{:height size
|
||||
:width size})
|
||||
|
||||
(def hole-view
|
||||
{:width size
|
||||
:height size})
|
||||
|
||||
(def context
|
||||
{:width 16
|
||||
:height 16
|
||||
:border-radius 8
|
||||
:position :absolute
|
||||
:right -4
|
||||
:bottom -4})
|
||||
|
||||
(def image
|
||||
{:width size
|
||||
:height size})
|
||||
@@ -0,0 +1,42 @@
|
||||
(ns quo.components.avatars.dapp-avatar.view
|
||||
(:require [quo.components.avatars.dapp-avatar.style :as style]
|
||||
[react-native.core :as rn]
|
||||
[react-native.hole-view :as hole-view]
|
||||
[react-native.platform :as platform]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:context? {:optional true} [:maybe :boolean]]
|
||||
[:image :schema.common/image-source]
|
||||
[:network-image {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:container-style {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [context? image network-image container-style]}]
|
||||
[rn/view
|
||||
{:style (merge style/container container-style)
|
||||
:accessibility-label :dapp-avatar}
|
||||
[hole-view/hole-view
|
||||
(cond-> {:holes (if context?
|
||||
[{:x 19
|
||||
:y 19
|
||||
:width 18
|
||||
:height 18
|
||||
:borderRadius 9}]
|
||||
[])
|
||||
:style style/hole-view}
|
||||
platform/android? (assoc :key context?))
|
||||
[rn/image
|
||||
{:source image
|
||||
:style style/image}]]
|
||||
(when context?
|
||||
[rn/image
|
||||
{:source network-image
|
||||
:style style/context}])])
|
||||
|
||||
(def view (schema/instrument #'view-internal ?schema))
|
||||
@@ -0,0 +1,14 @@
|
||||
(ns quo.components.avatars.token-avatar.component-spec
|
||||
(:require [quo.components.avatars.token-avatar.view :as token-avatar]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(h/describe "Avatars: Token Avatar"
|
||||
(h/test "should render correctly without context"
|
||||
(h/render-with-theme-provider
|
||||
[token-avatar/view {:image "mock-image"}])
|
||||
(h/is-truthy (h/get-by-label-text :token-avatar)))
|
||||
|
||||
(h/test "should render correctly with context"
|
||||
(h/render-with-theme-provider
|
||||
[token-avatar/view {:image "mock-image" :network-image "mock-image" :context? true}])
|
||||
(h/is-truthy (h/get-by-label-text :token-avatar))))
|
||||
@@ -0,0 +1,25 @@
|
||||
(ns quo.components.avatars.token-avatar.style)
|
||||
|
||||
(def ^:const size 32)
|
||||
|
||||
(def container
|
||||
{:height size
|
||||
:width size})
|
||||
|
||||
(def hole-view
|
||||
{:width size
|
||||
:height size})
|
||||
|
||||
(def context
|
||||
{:width 16
|
||||
:height 16
|
||||
:border-radius 8
|
||||
:position :absolute
|
||||
:right -4
|
||||
:bottom -4})
|
||||
|
||||
(defn image
|
||||
[type]
|
||||
{:width size
|
||||
:border-radius (if (= type :collectible) 8 0)
|
||||
:height size})
|
||||
@@ -0,0 +1,43 @@
|
||||
(ns quo.components.avatars.token-avatar.view
|
||||
(:require [quo.components.avatars.token-avatar.style :as style]
|
||||
[react-native.core :as rn]
|
||||
[react-native.hole-view :as hole-view]
|
||||
[react-native.platform :as platform]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:type {:optional true} [:enum :asset :collectible]]
|
||||
[:context? {:optional true} [:maybe :boolean]]
|
||||
[:image :schema.common/image-source]
|
||||
[:network-image {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:container-style {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [type context? image network-image container-style]}]
|
||||
[rn/view
|
||||
{:style (merge style/container container-style)
|
||||
:accessibility-label :token-avatar}
|
||||
[hole-view/hole-view
|
||||
(cond-> {:holes (if context?
|
||||
[{:x 19
|
||||
:y 19
|
||||
:width 18
|
||||
:height 18
|
||||
:borderRadius 9}]
|
||||
[])
|
||||
:style style/hole-view}
|
||||
platform/android? (assoc :key context?))
|
||||
[rn/image
|
||||
{:source image
|
||||
:style (style/image type)}]]
|
||||
(when context?
|
||||
[rn/image
|
||||
{:source network-image
|
||||
:style style/context}])])
|
||||
|
||||
(def view (schema/instrument #'view-internal ?schema))
|
||||
@@ -118,7 +118,7 @@
|
||||
:weight :medium
|
||||
:number-of-lines 1
|
||||
:style {:color label-color
|
||||
:opacity (when disabled? 0.3)}}
|
||||
:opacity (when (and disabled? (= theme :dark)) 0.3)}}
|
||||
children]
|
||||
|
||||
(vector? children)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
(ns quo.components.buttons.swap-order-button.component-spec
|
||||
(:require [quo.components.buttons.swap-order-button.view :as swap-order-button]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(h/describe "Buttons: Swap Order Button"
|
||||
(h/test "should render correctly"
|
||||
(h/render-with-theme-provider
|
||||
[swap-order-button/view {:on-press identity}])
|
||||
(h/is-truthy (h/get-by-label-text :swap-order-button)))
|
||||
|
||||
(h/test "should call on-press handler when pressed"
|
||||
(let [on-press (h/mock-fn)]
|
||||
(h/render-with-theme-provider
|
||||
[swap-order-button/view {:on-press on-press}])
|
||||
(h/fire-event :press (h/get-by-label-text :swap-order-button))
|
||||
(h/was-called on-press)))
|
||||
|
||||
(h/test "should not call on-press handler when button is disabled"
|
||||
(let [on-press (h/mock-fn)]
|
||||
(h/render-with-theme-provider
|
||||
[swap-order-button/view {:on-press on-press :disabled? true}])
|
||||
(h/fire-event :press (h/get-by-label-text :swap-order-button))
|
||||
(h/was-not-called on-press))))
|
||||
@@ -0,0 +1,11 @@
|
||||
(ns quo.components.buttons.swap-order-button.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:disabled? {:optional true} [:maybe :boolean]]
|
||||
[:on-press fn?]
|
||||
[:container-style {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
@@ -0,0 +1,18 @@
|
||||
(ns quo.components.buttons.swap-order-button.style
|
||||
(:require [quo.foundations.colors :as colors]))
|
||||
|
||||
(defn container
|
||||
[pressed? disabled? theme]
|
||||
{:width 32
|
||||
:height 32
|
||||
:border-radius 10
|
||||
:border-width 1
|
||||
:opacity (if disabled? 0.3 1)
|
||||
:align-items :center
|
||||
:justify-content :center
|
||||
:border-color (if pressed?
|
||||
(colors/theme-colors colors/neutral-20 colors/neutral-60 theme)
|
||||
(colors/theme-colors colors/neutral-10 colors/neutral-80 theme))
|
||||
:background-color (if pressed?
|
||||
(colors/theme-colors colors/neutral-5 colors/neutral-80 theme)
|
||||
(colors/theme-colors colors/neutral-2_5 colors/neutral-90 theme))})
|
||||
@@ -0,0 +1,28 @@
|
||||
(ns quo.components.buttons.swap-order-button.view
|
||||
(:require [quo.components.buttons.swap-order-button.schema :as swap-order-button.schema]
|
||||
[quo.components.buttons.swap-order-button.style :as style]
|
||||
[quo.components.icon :as icon]
|
||||
[quo.foundations.colors :as colors]
|
||||
quo.theme
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [disabled? on-press container-style]}]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
[pressed? set-pressed] (rn/use-state false)
|
||||
on-press-in (rn/use-callback #(set-pressed true) [])
|
||||
on-press-out (rn/use-callback #(set-pressed false) [])]
|
||||
[rn/pressable
|
||||
{:style (merge (style/container pressed? disabled? theme)
|
||||
container-style)
|
||||
:accessibility-label :swap-order-button
|
||||
:disabled disabled?
|
||||
:on-press on-press
|
||||
:on-press-in on-press-in
|
||||
:on-press-out on-press-out}
|
||||
[icon/icon :i/arrow-down
|
||||
{:size 20
|
||||
:color (colors/theme-colors colors/neutral-100 colors/white theme)}]]))
|
||||
|
||||
(def view (schema/instrument #'view-internal swap-order-button.schema/?schema))
|
||||
@@ -6,24 +6,26 @@
|
||||
|
||||
(h/describe "Drawers: drawer-action"
|
||||
(h/test "default render"
|
||||
(h/render-with-theme-provider [drawer-action/view {}])
|
||||
(h/render-with-theme-provider [drawer-action/view {:accessibility-label :container}])
|
||||
(h/is-truthy (h/query-by-label-text :container)))
|
||||
|
||||
(h/test "on-press-in changes internal state to :pressed"
|
||||
(h/render-with-theme-provider [drawer-action/view {}])
|
||||
(h/render-with-theme-provider [drawer-action/view {:accessibility-label :container}])
|
||||
(h/fire-event :on-press-in (h/get-by-label-text :container))
|
||||
(h/wait-for #(h/has-style (h/query-by-label-text :container)
|
||||
{:backgroundColor (colors/resolve-color :blue :light 5)})))
|
||||
|
||||
(h/test "render default action with state :selected"
|
||||
(h/render-with-theme-provider [drawer-action/view {:state :selected}])
|
||||
(h/render-with-theme-provider [drawer-action/view
|
||||
{:state :selected :accessibility-label :container}])
|
||||
(h/has-style (h/query-by-label-text :container)
|
||||
{:backgroundColor (colors/resolve-color :blue :light 5)})
|
||||
(h/is-truthy (h/query-by-label-text :check-icon)))
|
||||
|
||||
(h/test "call on-press"
|
||||
(let [on-press (h/mock-fn)]
|
||||
(h/render-with-theme-provider [drawer-action/view {:on-press on-press}])
|
||||
(h/render-with-theme-provider [drawer-action/view
|
||||
{:on-press on-press :accessibility-label :container}])
|
||||
(h/fire-event :on-press (h/get-by-label-text :container))
|
||||
(h/was-called on-press)))
|
||||
|
||||
@@ -38,8 +40,9 @@
|
||||
|
||||
(h/test "render :toggle action with state :selected"
|
||||
(h/render-with-theme-provider [drawer-action/view
|
||||
{:action :toggle
|
||||
:state :selected}])
|
||||
{:accessibility-label :container
|
||||
:action :toggle
|
||||
:state :selected}])
|
||||
(h/is-truthy (h/query-by-label-text "toggle-on"))
|
||||
(h/has-style (h/query-by-label-text :container)
|
||||
{:backgroundColor :transparent}))
|
||||
@@ -51,4 +54,5 @@
|
||||
:description "Just a small desc"}])
|
||||
(h/is-truthy (h/query-by-label-text :left-icon))
|
||||
(h/is-truthy (h/query-by-text "Check contact"))
|
||||
(h/has-style (h/query-by-text "Check contact") {:color colors/neutral-100})
|
||||
(h/is-truthy (h/query-by-text "Just a small desc"))))
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
[:=>
|
||||
[:cat
|
||||
[:map {:closed true}
|
||||
[:accessibility-label {:optional true} [:maybe :keyword]]
|
||||
[:type {:optional true} [:maybe [:enum :main :danger]]]
|
||||
[:action {:optional true} [:maybe [:enum :arrow :toggle]]]
|
||||
[:icon {:optional true} [:maybe :keyword]]
|
||||
[:description {:optional true} [:maybe :string]]
|
||||
|
||||
@@ -28,6 +28,23 @@
|
||||
{:flex 1
|
||||
:margin-right 12})
|
||||
|
||||
(defn text
|
||||
[{:keys [theme blur? type]}]
|
||||
(let [base {:weight :medium}
|
||||
theme-with-blur (if blur? :blue theme)
|
||||
matcher [theme-with-blur type]
|
||||
color
|
||||
(case matcher
|
||||
([:dark :main] [:light :main]) (colors/theme-colors colors/neutral-100
|
||||
colors/white
|
||||
theme)
|
||||
[:blur :main] colors/white-70-blur
|
||||
([:dark :danger] [:light :danger]) (colors/theme-colors colors/danger-50
|
||||
colors/danger-60
|
||||
theme)
|
||||
[:blur :danger] colors/danger-60)]
|
||||
(assoc-in base [:style :color] color)))
|
||||
|
||||
(defn- neutral-color
|
||||
[theme blur?]
|
||||
(if blur?
|
||||
@@ -41,8 +58,14 @@
|
||||
:margin-top 1})
|
||||
|
||||
(defn icon-color
|
||||
[{:keys [theme blur?]}]
|
||||
(neutral-color theme blur?))
|
||||
[{:keys [theme blur? type]}]
|
||||
(let [theme-with-blur (if blur? :blue theme)
|
||||
matcher [theme-with-blur type]]
|
||||
(case matcher
|
||||
([:dark :main] [:light :main]) (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
|
||||
[:blur :main] colors/white-70-blur
|
||||
([:dark :danger] [:light :danger]) (colors/theme-colors colors/danger-50 colors/danger-60 theme)
|
||||
[:blur :danger] colors/danger-60)))
|
||||
|
||||
(defn desc
|
||||
[{:keys [theme blur?]}]
|
||||
|
||||
@@ -10,11 +10,13 @@
|
||||
[schema.core :as schema]))
|
||||
|
||||
(defn view-internal
|
||||
[{:keys [action icon description state title on-press
|
||||
customization-color blur?]
|
||||
:or {customization-color :blue
|
||||
blur? false}}]
|
||||
[{:keys [action icon description state title on-press customization-color
|
||||
blur? accessibility-label]
|
||||
action-type :type
|
||||
:or {customization-color :blue
|
||||
blur? false}}]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
action-type (or action-type :main)
|
||||
[pressed? set-pressed] (rn/use-state false)
|
||||
on-press-in (rn/use-callback #(set-pressed true))
|
||||
on-press-out (rn/use-callback #(set-pressed false))]
|
||||
@@ -29,16 +31,21 @@
|
||||
:pressed? pressed?
|
||||
:description? (not-empty description)
|
||||
:blur? blur?})
|
||||
:accessibility-label :container}
|
||||
:accessibility-label accessibility-label}
|
||||
(when icon
|
||||
[icon/icon icon
|
||||
{:accessibility-label :left-icon
|
||||
:container-style (style/left-icon)
|
||||
:color (style/icon-color {:theme theme
|
||||
:type action-type
|
||||
:blur? blur?})}])
|
||||
|
||||
[rn/view {:style (style/text-container)}
|
||||
[text/text {:weight :medium}
|
||||
[rn/view
|
||||
{:style (style/text-container)}
|
||||
[text/text
|
||||
(style/text {:theme theme
|
||||
:type action-type
|
||||
:blur? blur?})
|
||||
title]
|
||||
|
||||
(when (seq description)
|
||||
@@ -61,6 +68,7 @@
|
||||
[icon/icon :i/chevron-right
|
||||
{:accessibility-label :arrow-icon
|
||||
:color (style/icon-color {:theme theme
|
||||
:type action-type
|
||||
:blur? blur?})}]
|
||||
|
||||
(= state :selected)
|
||||
|
||||
@@ -80,10 +80,10 @@
|
||||
(h/is-truthy (h/get-by-text "0x62b...0a5"))
|
||||
(h/is-truthy (h/get-by-label-text :account-avatar)))
|
||||
|
||||
(h/test "component renders in keypair type when keycard? is false"
|
||||
(h/test "component renders keypair type with default label"
|
||||
(h/render-with-theme-provider [quo/drawer-top
|
||||
{:title "Title"
|
||||
:keycard? false
|
||||
:stored nil
|
||||
:icon-avatar :i/placeholder
|
||||
:type :keypair}]
|
||||
theme)
|
||||
@@ -91,10 +91,21 @@
|
||||
(-> (h/expect (h/get-by-translation-text :t/on-device))
|
||||
(.toBeTruthy)))
|
||||
|
||||
(h/test "component renders in keypair type when keycard? is true"
|
||||
(h/test "component renders keypair type when stored on device"
|
||||
(h/render-with-theme-provider [quo/drawer-top
|
||||
{:title "Title"
|
||||
:keycard? true
|
||||
:stored :on-device
|
||||
:icon-avatar :i/placeholder
|
||||
:type :keypair}]
|
||||
theme)
|
||||
(h/is-truthy (h/get-by-text "Title"))
|
||||
(-> (h/expect (h/get-by-translation-text :t/on-device))
|
||||
(.toBeTruthy)))
|
||||
|
||||
(h/test "component renders keypair type when stored on keycard"
|
||||
(h/render-with-theme-provider [quo/drawer-top
|
||||
{:title "Title"
|
||||
:stored :on-keycard
|
||||
:icon-avatar :i/placeholder
|
||||
:type :keypair}]
|
||||
theme)
|
||||
@@ -102,6 +113,17 @@
|
||||
(-> (h/expect (h/get-by-translation-text :t/on-keycard))
|
||||
(.toBeTruthy)))
|
||||
|
||||
(h/test "component renders keypair type when considered missing"
|
||||
(h/render-with-theme-provider [quo/drawer-top
|
||||
{:title "Title"
|
||||
:stored :missing
|
||||
:icon-avatar :i/placeholder
|
||||
:type :keypair}]
|
||||
theme)
|
||||
(h/is-truthy (h/get-by-text "Title"))
|
||||
(-> (h/expect (h/get-by-translation-text :t/import-to-use-derived-accounts))
|
||||
(.toBeTruthy)))
|
||||
|
||||
(h/test "component renders in default-keypair type"
|
||||
(h/render-with-theme-provider [quo/drawer-top
|
||||
{:title "Title"
|
||||
|
||||
@@ -37,16 +37,18 @@
|
||||
nil))
|
||||
|
||||
(defn- keypair-subtitle
|
||||
[{:keys [theme blur? keycard?]}]
|
||||
[{:keys [theme blur? stored]}]
|
||||
[rn/view {:style style/row}
|
||||
[text/text
|
||||
{:size :paragraph-2
|
||||
:weight :regular
|
||||
:style (style/description theme blur?)}
|
||||
(if keycard?
|
||||
(i18n/label :t/on-keycard)
|
||||
(case stored
|
||||
:on-device (i18n/label :t/on-device)
|
||||
:on-keycard (i18n/label :t/on-keycard)
|
||||
:missing (i18n/label :t/import-to-use-derived-accounts)
|
||||
(i18n/label :t/on-device))]
|
||||
(when keycard?
|
||||
(when (= stored :on-keycard)
|
||||
[icons/icon
|
||||
:i/keycard-card
|
||||
{:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
|
||||
@@ -103,14 +105,14 @@
|
||||
description])
|
||||
|
||||
(defn- subtitle
|
||||
[{:keys [type theme blur? keycard? networks description community-name community-logo
|
||||
[{:keys [type theme blur? stored networks description community-name community-logo
|
||||
context-tag-type account-name emoji customization-color full-name profile-picture]}]
|
||||
(cond
|
||||
(= :keypair type)
|
||||
[keypair-subtitle
|
||||
{:theme theme
|
||||
:blur? blur?
|
||||
:keycard? keycard?}]
|
||||
{:theme theme
|
||||
:blur? blur?
|
||||
:stored stored}]
|
||||
|
||||
(= :account type)
|
||||
[account-subtitle
|
||||
@@ -195,7 +197,7 @@
|
||||
(defn view
|
||||
[{:keys [title title-icon type description blur? community-name community-logo button-icon
|
||||
account-name emoji context-tag-type button-type container-style
|
||||
on-button-press on-button-long-press profile-picture keycard? networks label full-name
|
||||
on-button-press on-button-long-press profile-picture stored networks label full-name
|
||||
button-disabled? account-avatar-emoji account-avatar-type customization-color icon-avatar]}]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
[rn/view {:style (merge style/container container-style)}
|
||||
@@ -220,7 +222,7 @@
|
||||
{:type type
|
||||
:theme theme
|
||||
:blur? blur?
|
||||
:keycard? keycard?
|
||||
:stored stored
|
||||
:networks networks
|
||||
:description description
|
||||
:community-name community-name
|
||||
|
||||
@@ -133,8 +133,7 @@
|
||||
:on-focus on-focus
|
||||
:on-blur on-blur
|
||||
:on-change-text on-change}]
|
||||
(when (or (= status :default)
|
||||
(= status :active))
|
||||
(when (empty? value)
|
||||
[rn/view
|
||||
{:style style/buttons-container
|
||||
:accessibility-label :paste-scan-buttons-container}
|
||||
@@ -155,7 +154,9 @@
|
||||
:inner-style (style/accessory-button blur? theme)
|
||||
:on-press on-scan}
|
||||
:main-icons/scan])])
|
||||
(when (= status :typing)
|
||||
(when (or (= status :typing)
|
||||
(and (= status :active)
|
||||
(not-empty value)))
|
||||
[rn/view
|
||||
{:style style/buttons-container
|
||||
:accessibility-label :clear-button-container}
|
||||
@@ -168,7 +169,10 @@
|
||||
{:style style/buttons-container
|
||||
:accessibility-label :loading-button-container}
|
||||
[loading-icon blur? theme]])
|
||||
(when (and (= status :loading) valid-ens-or-address?)
|
||||
(when (and (or (= status :loading)
|
||||
(= status :default))
|
||||
valid-ens-or-address?
|
||||
(not-empty value))
|
||||
[rn/view
|
||||
{:style style/buttons-container
|
||||
:accessibility-label :positive-button-container}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
(ns quo.components.list-items.missing-keypair.component-spec
|
||||
(:require
|
||||
[quo.components.list-items.missing-keypair.view :as missing-keypair]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(def keypair-data
|
||||
{:accounts []
|
||||
:name "Key Pair Name"})
|
||||
|
||||
(def props
|
||||
{:keypair keypair-data
|
||||
:blur? true
|
||||
:on-options-press (fn [])})
|
||||
|
||||
(h/describe "List items: missing keypair item"
|
||||
(h/test "Test item container renders"
|
||||
(h/render-with-theme-provider [missing-keypair/view props])
|
||||
(h/is-truthy (h/get-by-label-text :missing-keypair-item)))
|
||||
(h/test "Test keypair icon renders"
|
||||
(h/render-with-theme-provider [missing-keypair/view props])
|
||||
(h/is-truthy (h/get-by-label-text :icon)))
|
||||
(h/test "Test name renders"
|
||||
(h/render-with-theme-provider [missing-keypair/view props])
|
||||
(h/is-truthy (h/get-by-label-text :name)))
|
||||
(h/test "Test preview-list renders"
|
||||
(h/render-with-theme-provider [missing-keypair/view props])
|
||||
(h/is-truthy (h/get-by-label-text :preview-list)))
|
||||
(h/test "Test options button renders"
|
||||
(h/render-with-theme-provider [missing-keypair/view props])
|
||||
(h/is-truthy (h/get-by-label-text :options-button))))
|
||||
@@ -0,0 +1,25 @@
|
||||
(ns quo.components.list-items.missing-keypair.schema)
|
||||
|
||||
(def ^:private ?base
|
||||
[:map
|
||||
[:blur? {:optional true} [:maybe :boolean]]
|
||||
[:keypair
|
||||
[:map
|
||||
[:key-uid :string]
|
||||
[:name :string]
|
||||
[:accounts
|
||||
[:sequential
|
||||
[:map {:closed true}
|
||||
[:type [:enum :default]]
|
||||
[:emoji :string]
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]]]]]]])
|
||||
|
||||
(def ^:private ?on-option-press
|
||||
[:map
|
||||
[:on-options-press {:optional true} [:maybe fn?]]])
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:cat
|
||||
[:merge ?base ?on-option-press]]
|
||||
:any])
|
||||
@@ -0,0 +1,46 @@
|
||||
(ns quo.components.list-items.missing-keypair.style
|
||||
(:require
|
||||
[quo.foundations.colors :as colors]))
|
||||
|
||||
(defn container
|
||||
[{:keys [blur? theme]}]
|
||||
{:flex-direction :row
|
||||
:align-items :center
|
||||
:flex 1
|
||||
:padding-right 12
|
||||
:padding-left 8
|
||||
:padding-vertical 8
|
||||
:border-radius 12
|
||||
:border-width (if blur? 0 1)
|
||||
:border-color (colors/theme-colors colors/neutral-10
|
||||
colors/neutral-80
|
||||
theme)
|
||||
:background-color (if blur?
|
||||
colors/white-opa-5
|
||||
(colors/theme-colors colors/neutral-2_5
|
||||
colors/neutral-80-opa-40
|
||||
theme))})
|
||||
|
||||
(defn icon-container
|
||||
[{:keys [blur? theme]}]
|
||||
{:border-radius 32
|
||||
:border-width 1
|
||||
:border-color (if blur?
|
||||
colors/white-opa-5
|
||||
(colors/theme-colors colors/neutral-20
|
||||
colors/neutral-80
|
||||
theme))})
|
||||
|
||||
(def name-container
|
||||
{:flex 1
|
||||
:padding-right 16
|
||||
:padding-left 8})
|
||||
|
||||
(def preview-list-container
|
||||
{:padding-right 16})
|
||||
|
||||
(defn options-icon-color
|
||||
[{:keys [theme blur?]}]
|
||||
(if blur?
|
||||
colors/white-opa-70
|
||||
(colors/theme-colors colors/neutral-50 colors/neutral-40 theme)))
|
||||
@@ -0,0 +1,56 @@
|
||||
(ns quo.components.list-items.missing-keypair.view
|
||||
(:require
|
||||
[quo.components.avatars.icon-avatar :as icon-avatar]
|
||||
[quo.components.icon :as icon]
|
||||
[quo.components.list-items.missing-keypair.schema :as component-schema]
|
||||
[quo.components.list-items.missing-keypair.style :as style]
|
||||
[quo.components.list-items.preview-list.view :as preview-list]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(defn- internal-view
|
||||
[{{:keys [accounts name]} :keypair
|
||||
:keys [keypair blur? on-options-press]}]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
on-keypair-options-press (rn/use-callback
|
||||
(fn [event]
|
||||
(on-options-press event keypair))
|
||||
[keypair on-options-press])]
|
||||
[rn/view
|
||||
{:style (style/container {:theme theme
|
||||
:blur? blur?})
|
||||
:accessibility-label :missing-keypair-item}
|
||||
[rn/view
|
||||
{:style (style/icon-container {:theme theme
|
||||
:blur? blur?})
|
||||
:accessibility-label :icon}
|
||||
[icon-avatar/icon-avatar
|
||||
{:size :size-32
|
||||
:icon :i/seed
|
||||
:color :neutral
|
||||
:border? false}]]
|
||||
[rn/view
|
||||
{:style style/name-container
|
||||
:accessibility-label :name}
|
||||
[text/text
|
||||
{:weight :semi-bold}
|
||||
name]]
|
||||
[rn/view
|
||||
{:accessibility-label :preview-list}
|
||||
[preview-list/view
|
||||
{:blur? blur?
|
||||
:type :accounts
|
||||
:size :size-24
|
||||
:number (count accounts)
|
||||
:container-style style/preview-list-container}
|
||||
accounts]]
|
||||
[rn/pressable {:on-press on-keypair-options-press}
|
||||
[icon/icon :i/options
|
||||
{:color (style/options-icon-color
|
||||
{:theme theme
|
||||
:blur? blur?})
|
||||
:accessibility-label :options-button}]]]))
|
||||
|
||||
(def view (schema/instrument #'internal-view component-schema/?schema))
|
||||
@@ -8,8 +8,7 @@
|
||||
(h/render-with-theme-provider component :light))
|
||||
|
||||
(def props
|
||||
{:theme :light
|
||||
:state :default
|
||||
{:state :default
|
||||
:label "Mainnet"
|
||||
:network-image 873
|
||||
:customization-color :blue
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:theme :schema.common/theme]
|
||||
[:network-image :int]
|
||||
[:label :string]
|
||||
[:fiat-value :string]
|
||||
|
||||
@@ -3,39 +3,14 @@
|
||||
[quo.foundations.colors :as colors]
|
||||
[react-native.platform :as platform]))
|
||||
|
||||
(defn- primary-name-top-offset
|
||||
[size]
|
||||
(when (= size 15)
|
||||
(cond platform/ios? 1
|
||||
platform/android? -0.5
|
||||
:else 0)))
|
||||
|
||||
(defn- primary-name-margin-bottom-offset
|
||||
[size]
|
||||
(when (and (= size 15)
|
||||
(or platform/ios? platform/android?))
|
||||
-0.25))
|
||||
|
||||
(defn- primary-name-layout-offsets
|
||||
[size]
|
||||
;; NOTE(seanstrom): We need to sometimes offset the primary-name to align the baseline of the text
|
||||
;; while avoiding shifting elements downward.
|
||||
{:top (primary-name-top-offset size)
|
||||
:margin-bottom (primary-name-margin-bottom-offset size)})
|
||||
|
||||
(defn container
|
||||
[size]
|
||||
{:flex-shrink 1
|
||||
:flex-wrap :nowrap
|
||||
:flex-direction :row
|
||||
:align-items :baseline
|
||||
;; NOTE(seanstrom): Because we're offseting the primary-name we need to inverse the offset on the
|
||||
;; container to avoid shifting elements downward
|
||||
:top (* -1 (primary-name-top-offset size))})
|
||||
|
||||
(def details-container
|
||||
{:flex-direction :row
|
||||
:margin-left 8})
|
||||
(cond->
|
||||
{:flex-shrink 1
|
||||
:flex-wrap :nowrap
|
||||
:flex-direction :row
|
||||
:align-items :center
|
||||
:height (if (= size 15) 22 18)}))
|
||||
|
||||
(defn middle-dot
|
||||
[theme]
|
||||
@@ -48,11 +23,15 @@
|
||||
|
||||
(defn primary-name
|
||||
[muted? theme size]
|
||||
(merge (primary-name-layout-offsets size)
|
||||
{:color (if muted?
|
||||
colors/neutral-50
|
||||
(colors/theme-colors colors/neutral-100 colors/white theme))
|
||||
:flex-shrink 1}))
|
||||
{:color (if muted?
|
||||
colors/neutral-50
|
||||
(colors/theme-colors colors/neutral-100 colors/white theme))
|
||||
;; iOS: primary-name height is 22.3 / 18.7
|
||||
;; Android: primary-name height is 21.8 / 18.5
|
||||
:margin-vertical (if (= size 15)
|
||||
(if platform/ios? -0.15 0)
|
||||
(if platform/ios? -0.35 -0.25))
|
||||
:flex-shrink 1})
|
||||
|
||||
(defn secondary-name
|
||||
[theme]
|
||||
@@ -60,13 +39,9 @@
|
||||
:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)})
|
||||
|
||||
(defn icon-container
|
||||
[is-first?]
|
||||
[is-first? size]
|
||||
{:margin-left (if is-first? 4 2)
|
||||
;; NOTE(seanstrom): Because we're using flex baseline to align elements
|
||||
;; we need to offset the icon container to match the designs.
|
||||
:top (cond platform/ios? 1
|
||||
platform/android? 2
|
||||
:else 0)})
|
||||
:padding-top (if (= size 15) 6 4)})
|
||||
|
||||
(defn time-text
|
||||
[theme]
|
||||
|
||||
@@ -13,7 +13,35 @@
|
||||
[{:keys [primary-name secondary-name style short-chat-key time-str contact? verified? untrustworthy?
|
||||
muted? size]
|
||||
:or {size 13}}]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
|
||||
short-chat-key-component
|
||||
(when (and (not verified?) short-chat-key)
|
||||
[text/text
|
||||
{:weight :monospace
|
||||
:size :label
|
||||
:number-of-lines 1
|
||||
:style (style/chat-key-text theme)}
|
||||
short-chat-key])
|
||||
|
||||
time-str-component
|
||||
(when time-str
|
||||
[text/text
|
||||
{:monospace true
|
||||
:size :label
|
||||
:accessibility-label :message-timestamp
|
||||
:number-of-lines 1
|
||||
:style (style/time-text theme)}
|
||||
time-str])
|
||||
|
||||
middle-dot-seperator-component
|
||||
(when (and short-chat-key-component time-str-component)
|
||||
[text/text
|
||||
{:monospace true
|
||||
:size :label
|
||||
:number-of-lines 1
|
||||
:style (style/middle-dot theme)}
|
||||
middle-dot])]
|
||||
[rn/view
|
||||
{:style (merge (style/container size) style)}
|
||||
[text/text
|
||||
@@ -23,7 +51,7 @@
|
||||
:accessibility-label :author-primary-name
|
||||
:style (style/primary-name muted? theme size)}
|
||||
primary-name]
|
||||
(when (not (string/blank? secondary-name))
|
||||
(when-not (string/blank? secondary-name)
|
||||
[:<>
|
||||
[text/text
|
||||
{:size :label
|
||||
@@ -41,38 +69,22 @@
|
||||
[icons/icon :main-icons2/contact
|
||||
{:size 12
|
||||
:no-color true
|
||||
:container-style (style/icon-container true)}])
|
||||
:container-style (style/icon-container true size)}])
|
||||
(cond
|
||||
verified?
|
||||
[icons/icon :main-icons2/verified
|
||||
{:size 12
|
||||
:no-color true
|
||||
:container-style (style/icon-container contact?)}]
|
||||
:container-style (style/icon-container contact? size)}]
|
||||
untrustworthy?
|
||||
[icons/icon :main-icons2/untrustworthy
|
||||
{:size 12
|
||||
:no-color true
|
||||
:container-style (style/icon-container contact?)}])
|
||||
[rn/view {:style style/details-container}
|
||||
(when (and (not verified?) short-chat-key)
|
||||
[text/text
|
||||
{:weight :monospace
|
||||
:size :label
|
||||
:number-of-lines 1
|
||||
:style (style/chat-key-text theme)}
|
||||
short-chat-key])
|
||||
(when (and (not verified?) time-str short-chat-key)
|
||||
[text/text
|
||||
{:monospace true
|
||||
:size :label
|
||||
:number-of-lines 1
|
||||
:style (style/middle-dot theme)}
|
||||
middle-dot])
|
||||
(when time-str
|
||||
[text/text
|
||||
{:monospace true
|
||||
:size :label
|
||||
:accessibility-label :message-timestamp
|
||||
:number-of-lines 1
|
||||
:style (style/time-text theme)}
|
||||
time-str])]]))
|
||||
:container-style (style/icon-container contact? size)}])
|
||||
|
||||
(when (or short-chat-key-component time-str-component)
|
||||
[rn/view {:style {:width 8}}])
|
||||
|
||||
short-chat-key-component
|
||||
middle-dot-seperator-component
|
||||
time-str-component]))
|
||||
|
||||
@@ -261,7 +261,10 @@
|
||||
{:opacity center-opacity}
|
||||
nil)
|
||||
(style/center-content-container
|
||||
(and (= type :title) (= text-align :center))))
|
||||
(case type
|
||||
:title (= text-align :center)
|
||||
(:dropdown :wallet-networks) true
|
||||
false)))
|
||||
props-with-style (assoc props
|
||||
:center-content-container-style
|
||||
center-content-container-style)]
|
||||
|
||||
@@ -5,18 +5,22 @@
|
||||
(def container-border-radius 12)
|
||||
(def card-image-padding-vertical 3)
|
||||
(def card-image-padding-horizontal 3)
|
||||
(def default-opacity-for-loader 1)
|
||||
(def default-opacity-for-image 0)
|
||||
|
||||
(defn fallback
|
||||
[{:keys [theme]}]
|
||||
{:background-color (colors/theme-colors colors/neutral-2_5 colors/neutral-90 theme)
|
||||
:border-style :dashed
|
||||
:border-color (colors/theme-colors colors/neutral-20 colors/neutral-80 theme)
|
||||
:border-width 1
|
||||
:border-radius container-border-radius
|
||||
:width "100%"
|
||||
:aspect-ratio 1
|
||||
:align-items :center
|
||||
:justify-content :center})
|
||||
[{:keys [theme opacity]}]
|
||||
[{:opacity opacity}
|
||||
{:opacity default-opacity-for-image
|
||||
:background-color (colors/theme-colors colors/neutral-2_5 colors/neutral-90 theme)
|
||||
:border-style :dashed
|
||||
:border-color (colors/theme-colors colors/neutral-20 colors/neutral-80 theme)
|
||||
:border-width 1
|
||||
:border-radius container-border-radius
|
||||
:width "100%"
|
||||
:aspect-ratio 1
|
||||
:align-items :center
|
||||
:justify-content :center}])
|
||||
|
||||
(def collectible-counter
|
||||
{:position :absolute
|
||||
@@ -59,6 +63,15 @@
|
||||
(def card-detail-text
|
||||
{:flex 1})
|
||||
|
||||
(defn card-loader
|
||||
[opacity]
|
||||
[{:opacity opacity}
|
||||
{:position :absolute
|
||||
:opacity default-opacity-for-loader
|
||||
:left 8
|
||||
:align-items :center
|
||||
:flex-direction :row}])
|
||||
|
||||
(def image-view-container
|
||||
{:aspect-ratio 1
|
||||
:border-radius container-border-radius})
|
||||
@@ -83,6 +96,7 @@
|
||||
(defn loading-image
|
||||
[theme]
|
||||
{:position :absolute
|
||||
:opacity default-opacity-for-loader
|
||||
:top 0
|
||||
:bottom 0
|
||||
:left 0
|
||||
@@ -91,8 +105,20 @@
|
||||
:background-color (colors/theme-colors colors/white-70-blur colors/neutral-95-opa-70-blur theme)
|
||||
:z-index 2})
|
||||
|
||||
(defn loading-image-with-opacity
|
||||
[theme opacity]
|
||||
[{:opacity opacity}
|
||||
(loading-image theme)])
|
||||
|
||||
(defn avatar-container
|
||||
[loaded?]
|
||||
{:flex 1
|
||||
:flex-direction :row
|
||||
:opacity (when-not loaded? 0)})
|
||||
[opacity]
|
||||
[{:opacity opacity}
|
||||
{:flex 1
|
||||
:flex-direction :row
|
||||
:opacity default-opacity-for-image}])
|
||||
|
||||
(defn supported-file
|
||||
[opacity]
|
||||
[{:opacity opacity}
|
||||
{:aspect-ratio 1
|
||||
:opacity default-opacity-for-image}])
|
||||
|
||||
@@ -10,13 +10,54 @@
|
||||
[quo.foundations.gradients :as gradients]
|
||||
[quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[react-native.reanimated :as reanimated]
|
||||
[schema.core :as schema]
|
||||
[utils.datetime :as datetime]
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(def timing-options-out 650)
|
||||
(def timing-options-in 1000)
|
||||
(def first-load-time 500)
|
||||
(def cached-load-time 200)
|
||||
(def error-wait-time 800)
|
||||
|
||||
(defn on-load-end
|
||||
[{:keys [load-time set-state loader-opacity image-opacity]}]
|
||||
(reanimated/animate loader-opacity 0 timing-options-out)
|
||||
(reanimated/animate image-opacity 1 timing-options-in)
|
||||
(if (> load-time cached-load-time)
|
||||
(js/setTimeout
|
||||
(fn []
|
||||
(set-state (fn [prev-state]
|
||||
(assoc prev-state :image-loaded? true))))
|
||||
first-load-time)
|
||||
(set-state (fn [prev-state]
|
||||
(assoc prev-state :image-loaded? true)))))
|
||||
|
||||
(defn on-load-error
|
||||
[set-state]
|
||||
(js/setTimeout (fn []
|
||||
(set-state (fn [prev-state] (assoc prev-state :image-error? true))))
|
||||
error-wait-time))
|
||||
|
||||
(defn on-load-avatar
|
||||
[{:keys [load-time set-state loader-opacity avatar-opacity]}]
|
||||
(reanimated/animate loader-opacity 0 timing-options-out)
|
||||
(reanimated/animate avatar-opacity 1 timing-options-in)
|
||||
(if (> load-time cached-load-time)
|
||||
(js/setTimeout
|
||||
(fn []
|
||||
(set-state (fn [prev-state]
|
||||
(assoc prev-state :avatar-loaded? true))))
|
||||
first-load-time)
|
||||
(set-state (fn [prev-state]
|
||||
(assoc prev-state :avatar-loaded? true)))))
|
||||
|
||||
(defn- fallback-view
|
||||
[{:keys [label theme]}]
|
||||
[rn/view
|
||||
{:style (style/fallback {:theme theme})}
|
||||
[{:keys [label theme image-opacity]}]
|
||||
[reanimated/view
|
||||
{:style (style/fallback {:opacity image-opacity
|
||||
:theme theme})}
|
||||
[rn/view
|
||||
[icon/icon :i/sad {:color (colors/theme-colors colors/neutral-40 colors/neutral-50 theme)}]]
|
||||
[rn/view {:style {:height 4}}]
|
||||
@@ -34,77 +75,85 @@
|
||||
[rn/view {:style (style/loading-message theme)}])
|
||||
|
||||
(defn- loading-image
|
||||
[{:keys [theme gradient-color-index]}]
|
||||
[gradients/view
|
||||
{:theme theme
|
||||
:container-style (style/loading-image theme)
|
||||
:color-index gradient-color-index}])
|
||||
[{:keys [theme gradient-color-index loader-opacity]}]
|
||||
[reanimated/view
|
||||
{:style (style/loading-image-with-opacity theme loader-opacity)}
|
||||
[gradients/view
|
||||
{:theme theme
|
||||
:container-style (style/loading-image theme)
|
||||
:color-index gradient-color-index}]])
|
||||
|
||||
(defn- card-details
|
||||
[{:keys [community? avatar-image-src collectible-name theme state set-state]}]
|
||||
[rn/view {:style style/card-details-container}
|
||||
(cond (not (:avatar-loaded? state))
|
||||
[rn/view {:style {:flex-direction :row}}
|
||||
[loading-square theme]
|
||||
[loading-message theme]]
|
||||
|
||||
community?
|
||||
[:<>
|
||||
[preview-list/view
|
||||
{:type :communities
|
||||
:size :size-20}
|
||||
[avatar-image-src]]
|
||||
[rn/view {:style {:width 8}}]
|
||||
[text/text
|
||||
{:size :paragraph-1
|
||||
:weight :semi-bold
|
||||
:style style/card-detail-text}
|
||||
collectible-name]])
|
||||
|
||||
[rn/view
|
||||
{:style (style/avatar-container (:avatar-loaded? state))}
|
||||
[:<>
|
||||
[collection-avatar/view
|
||||
{:size :size-20
|
||||
:on-load-end #(set-state (fn [prev-state] (assoc prev-state :avatar-loaded? true)))
|
||||
:image avatar-image-src}]
|
||||
[rn/view {:style {:width 8}}]]
|
||||
[text/text
|
||||
{:size :paragraph-1
|
||||
:weight :semi-bold
|
||||
:ellipsize-mode :tail
|
||||
:number-of-lines 1
|
||||
:style style/card-detail-text}
|
||||
collectible-name]]])
|
||||
(let [loader-opacity (reanimated/use-shared-value 1)
|
||||
avatar-opacity (reanimated/use-shared-value 0)
|
||||
[load-time set-load-time] (rn/use-state (datetime/now))]
|
||||
[rn/view {:style style/card-details-container}
|
||||
[reanimated/view {:style (style/avatar-container avatar-opacity)}
|
||||
(if community?
|
||||
[preview-list/view
|
||||
{:type :communities
|
||||
:size :size-20}
|
||||
[avatar-image-src]]
|
||||
[collection-avatar/view
|
||||
{:size :size-20
|
||||
:on-start #(set-load-time (fn [start-time] (- (datetime/now) start-time)))
|
||||
:on-load-end #(on-load-avatar {:set-state set-state
|
||||
:load-time load-time
|
||||
:loader-opacity loader-opacity
|
||||
:avatar-opacity avatar-opacity})
|
||||
:image avatar-image-src}])
|
||||
[rn/view {:style {:width 8}}]
|
||||
[text/text
|
||||
{:size :paragraph-1
|
||||
:weight :semi-bold
|
||||
:ellipsize-mode :tail
|
||||
:number-of-lines 1
|
||||
:style style/card-detail-text}
|
||||
collectible-name]]
|
||||
(when (not (:avatar-loaded? state))
|
||||
[reanimated/view {:style (style/card-loader loader-opacity)}
|
||||
[loading-square theme]
|
||||
[loading-message theme]])]))
|
||||
|
||||
(defn- card-view
|
||||
[{:keys [avatar-image-src collectible-name community? counter state set-state
|
||||
gradient-color-index image-src supported-file?]}]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
loader-opacity (reanimated/use-shared-value (if supported-file? 1 0))
|
||||
image-opacity (reanimated/use-shared-value (if supported-file? 0 1))
|
||||
[load-time set-load-time] (rn/use-state (datetime/now))]
|
||||
[rn/view {:style (style/card-view-container theme)}
|
||||
[rn/view {:style {:aspect-ratio 1}}
|
||||
(cond
|
||||
(:image-error? state)
|
||||
[fallback-view
|
||||
{:theme theme
|
||||
:label (i18n/label :t/cant-fetch-info)}]
|
||||
{:image-opacity image-opacity
|
||||
:theme theme
|
||||
:label (i18n/label :t/cant-fetch-info)}]
|
||||
|
||||
(not supported-file?)
|
||||
[fallback-view
|
||||
{:theme theme
|
||||
:label (i18n/label :t/unsupported-file)}]
|
||||
{:image-opacity image-opacity
|
||||
:theme theme
|
||||
:label (i18n/label :t/unsupported-file)}]
|
||||
|
||||
(not (:image-loaded? state))
|
||||
[loading-image
|
||||
{:theme theme
|
||||
{:loader-opacity loader-opacity
|
||||
:theme theme
|
||||
:gradient-color-index gradient-color-index}])
|
||||
(when supported-file?
|
||||
[rn/view {:style {:aspect-ratio 1}}
|
||||
[reanimated/view {:style (style/supported-file image-opacity)}
|
||||
[rn/image
|
||||
{:style style/image
|
||||
:on-load-end #(set-state (fn [prev-state] (assoc prev-state :image-loaded? true)))
|
||||
:on-error #(set-state (fn [prev-state] (assoc prev-state :image-error? true)))
|
||||
:source image-src}]])]
|
||||
{:style style/image
|
||||
:on-load-start #(set-load-time (fn [start-time] (- (datetime/now) start-time)))
|
||||
:on-load-end #(on-load-end {:load-time load-time
|
||||
:set-state set-state
|
||||
:loader-opacity loader-opacity
|
||||
:image-opacity image-opacity})
|
||||
:on-error #(on-load-error set-state)
|
||||
:source image-src}]])]
|
||||
(when (and (:image-loaded? state) (not (:image-error? state)) counter)
|
||||
[collectible-counter/view
|
||||
{:container-style style/collectible-counter
|
||||
@@ -121,30 +170,40 @@
|
||||
(defn- image-view
|
||||
[{:keys [avatar-image-src community? counter state set-state
|
||||
gradient-color-index image-src supported-file?]}]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
loader-opacity (reanimated/use-shared-value (if supported-file? 1 0))
|
||||
image-opacity (reanimated/use-shared-value (if supported-file? 0 1))
|
||||
[load-time set-load-time] (rn/use-state (datetime/now))]
|
||||
[rn/view {:style style/image-view-container}
|
||||
(cond
|
||||
(:image-error? state)
|
||||
[fallback-view
|
||||
{:theme theme
|
||||
:label (i18n/label :t/cant-fetch-info)}]
|
||||
{:image-opacity image-opacity
|
||||
:theme theme
|
||||
:label (i18n/label :t/cant-fetch-info)}]
|
||||
|
||||
(not supported-file?)
|
||||
[fallback-view
|
||||
{:theme theme
|
||||
:label (i18n/label :t/unsupported-file)}]
|
||||
{:image-opacity image-opacity
|
||||
:theme theme
|
||||
:label (i18n/label :t/unsupported-file)}]
|
||||
|
||||
(not (:image-loaded? state))
|
||||
[loading-image
|
||||
{:theme theme
|
||||
{:loader-opacity loader-opacity
|
||||
:theme theme
|
||||
:gradient-color-index gradient-color-index}])
|
||||
(when supported-file?
|
||||
[rn/view {:style {:aspect-ratio 1}}
|
||||
[reanimated/view {:style (style/supported-file image-opacity)}
|
||||
[rn/image
|
||||
{:style style/image
|
||||
:on-load-end #(set-state (fn [prev-state] (assoc prev-state :image-loaded? true)))
|
||||
:on-error #(set-state (fn [prev-state] (assoc prev-state :image-error? true)))
|
||||
:source image-src}]])
|
||||
{:style style/image
|
||||
:on-load-start #(set-load-time (fn [start-time] (- (datetime/now) start-time)))
|
||||
:on-load-end #(on-load-end {:load-time load-time
|
||||
:set-state set-state
|
||||
:loader-opacity loader-opacity
|
||||
:image-opacity image-opacity})
|
||||
:on-error #(on-load-error set-state)
|
||||
:source image-src}]])
|
||||
(when (and (:image-loaded? state) (not (:image-error? state)) counter)
|
||||
[collectible-counter/view
|
||||
{:container-style style/collectible-counter
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
[react-native.core :as rn]))
|
||||
|
||||
(defn view
|
||||
[{:keys [reactions on-press on-long-press add-reaction? on-press-add use-case container-style]}]
|
||||
[{:keys [reactions on-press on-long-press hide-new-reaction-button? on-press-add use-case
|
||||
container-style]}]
|
||||
[rn/view {:style (merge style/container container-style)}
|
||||
(for [emoji-reaction reactions
|
||||
:let [{:keys [emoji emoji-id emoji-reaction-id quantity own]} emoji-reaction]]
|
||||
@@ -19,7 +20,7 @@
|
||||
:on-press #(on-press emoji-reaction)
|
||||
:on-long-press #(on-long-press emoji-reaction)
|
||||
:accessibility-label (str "emoji-reaction-" emoji-id)}])
|
||||
(when add-reaction?
|
||||
(when-not hide-new-reaction-button?
|
||||
[react-selector/view
|
||||
{:on-press on-press-add
|
||||
:state :add-reaction
|
||||
|
||||
@@ -1,12 +1,31 @@
|
||||
(ns quo.components.selectors.reactions-selector.style
|
||||
(:require
|
||||
[quo.foundations.colors :as colors]))
|
||||
[quo.foundations.colors :as colors]
|
||||
[react-native.platform :as platform]))
|
||||
|
||||
(defn container
|
||||
[pressed? theme]
|
||||
{:padding 10
|
||||
:border-radius 12
|
||||
:border-width 1
|
||||
:border-color (colors/theme-colors colors/neutral-20 colors/neutral-80 theme)
|
||||
:background-color (when pressed?
|
||||
(colors/theme-colors colors/neutral-10 colors/neutral-80-opa-40 theme))})
|
||||
(merge
|
||||
{:border-radius 12
|
||||
:border-width 1
|
||||
:border-color (colors/theme-colors colors/neutral-20 colors/neutral-80 theme)
|
||||
:background-color (when pressed?
|
||||
(colors/theme-colors colors/neutral-10 colors/neutral-80-opa-40 theme))}
|
||||
(if platform/ios?
|
||||
{:padding 9.5
|
||||
:padding-horizontal 8}
|
||||
{:padding 8})))
|
||||
|
||||
(def emoji-text-style
|
||||
(merge
|
||||
{:line-height 20
|
||||
:text-align :center}
|
||||
(if platform/ios?
|
||||
{:line-height 20
|
||||
:font-size 17
|
||||
:text-align :center}
|
||||
{:font-size 18
|
||||
:height 24
|
||||
:width 24
|
||||
:text-align :center
|
||||
:text-align-vertical :center})))
|
||||
|
||||
@@ -20,4 +20,6 @@
|
||||
:style (merge (style/container pressed? theme)
|
||||
container-style)
|
||||
:on-press on-press}
|
||||
[rn/text (reactions.resource/system-emojis emoji)]]))
|
||||
[rn/text
|
||||
{:style style/emoji-text-style}
|
||||
(reactions.resource/system-emojis emoji)]]))
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
(def container
|
||||
{:flex-direction :row
|
||||
:flex 1
|
||||
:justify-content :space-between})
|
||||
|
||||
(def right-counter
|
||||
|
||||
@@ -55,8 +55,8 @@
|
||||
:icon-color (style/right-tag-icon-color blur? theme)}]))
|
||||
|
||||
(defn view
|
||||
[{:keys [title right accessibility-label] :as props}]
|
||||
[rn/view {:style style/container}
|
||||
[{:keys [title right accessibility-label container-style] :as props}]
|
||||
[rn/view {:style (merge style/container container-style)}
|
||||
[text/text
|
||||
{:size :heading-1
|
||||
:weight :semi-bold
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:status {:optional true} [:maybe [:enum :default :error]]]
|
||||
[:on-change-text {:optional true} [:maybe fn?]]
|
||||
[:on-inc-press {:optional true} [:maybe fn?]]
|
||||
[:on-dec-press {:optional true} [:maybe fn?]]
|
||||
[:container-style {:optional true} [:maybe :map]]
|
||||
[:min-value {:optional true} [:maybe :int]]
|
||||
[:max-value {:optional true} [:maybe :int]]
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
(ns quo.components.wallet.approval-label.component-spec
|
||||
(:require [quo.components.wallet.approval-label.view :as approval-label]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(h/describe "Wallet: Approval Label"
|
||||
(h/test "with :approve status"
|
||||
(h/render-with-theme-provider
|
||||
[approval-label/view
|
||||
{:status :approve
|
||||
:customization-color :blue
|
||||
:token-value "100"
|
||||
:token-symbol "SNT"}])
|
||||
(h/is-truthy (h/get-by-translation-text :t/approve-amount-symbol {:amount "100" :symbol "SNT"})))
|
||||
|
||||
(h/test "with :approving status"
|
||||
(h/render-with-theme-provider
|
||||
[approval-label/view
|
||||
{:status :approving
|
||||
:customization-color :blue
|
||||
:token-value "50"
|
||||
:token-symbol "DAI"}])
|
||||
(h/is-truthy (h/get-by-translation-text :t/approving-amount-symbol {:amount "50" :symbol "DAI"})))
|
||||
|
||||
(h/test "with :approved status"
|
||||
(h/render-with-theme-provider
|
||||
[approval-label/view
|
||||
{:status :approved
|
||||
:customization-color :blue
|
||||
:token-value "5"
|
||||
:token-symbol "ETH"}])
|
||||
(h/is-truthy (h/get-by-translation-text :t/approved-amount-symbol {:amount "5" :symbol "ETH"})))
|
||||
|
||||
(h/test "on-press event is called when button is pressed"
|
||||
(let [mock-fn (h/mock-fn)]
|
||||
(h/render-with-theme-provider
|
||||
[approval-label/view
|
||||
{:status :approve
|
||||
:customization-color :blue
|
||||
:token-value "11"
|
||||
:token-symbol "DAI"
|
||||
:button-props {:on-press mock-fn}}])
|
||||
(h/fire-event :press (h/get-by-translation-text :t/approve))
|
||||
(h/was-called mock-fn))))
|
||||
@@ -0,0 +1,14 @@
|
||||
(ns quo.components.wallet.approval-label.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:status [:enum :approve :approving :approved]]
|
||||
[:token-value :string]
|
||||
[:token-symbol :string]
|
||||
[:container-style {:optional true} [:maybe :map]]
|
||||
[:button-props {:optional true} [:maybe :map]]
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]]]]
|
||||
:any])
|
||||
@@ -0,0 +1,28 @@
|
||||
(ns quo.components.wallet.approval-label.style
|
||||
(:require [quo.foundations.colors :as colors]))
|
||||
|
||||
(def ^:const top-hole-view-height 24)
|
||||
|
||||
(defn container
|
||||
[customization-color theme]
|
||||
{:background-color (colors/resolve-color customization-color theme 5)
|
||||
:align-items :center
|
||||
:padding-horizontal 12
|
||||
:padding-vertical 8
|
||||
:padding-top (+ 8 top-hole-view-height)
|
||||
:gap 8
|
||||
:border-bottom-left-radius 16
|
||||
:border-bottom-right-radius 16
|
||||
:flex-direction :row})
|
||||
|
||||
(def content
|
||||
{:flex-direction :row
|
||||
:align-items :center
|
||||
:flex 1
|
||||
:padding-vertical 4
|
||||
:gap 4})
|
||||
|
||||
(defn message
|
||||
[theme]
|
||||
{:flex 1
|
||||
:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)})
|
||||
@@ -0,0 +1,70 @@
|
||||
(ns quo.components.wallet.approval-label.view
|
||||
(:require [oops.core :as oops]
|
||||
[quo.components.buttons.button.view :as button]
|
||||
[quo.components.icon :as icon]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.wallet.approval-label.schema :as approval-label.schema]
|
||||
[quo.components.wallet.approval-label.style :as style]
|
||||
[quo.foundations.colors :as colors]
|
||||
quo.theme
|
||||
[react-native.core :as rn]
|
||||
[react-native.hole-view :as hole-view]
|
||||
[schema.core :as schema]
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(def ^:private status-icons
|
||||
{:approve :i/alert
|
||||
:approving :i/pending-state
|
||||
:approved :i/check})
|
||||
|
||||
(def ^:private status-message
|
||||
{:approve :t/approve-amount-symbol
|
||||
:approving :t/approving-amount-symbol
|
||||
:approved :t/approved-amount-symbol})
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [status token-value token-symbol
|
||||
container-style button-props]
|
||||
:as props}]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
customization-color (or (:customization-color props) :blue)
|
||||
[container-width set-container-width] (rn/use-state 0)
|
||||
on-layout (rn/use-callback
|
||||
#(set-container-width
|
||||
(oops/oget % :nativeEvent :layout :width)))]
|
||||
[hole-view/hole-view
|
||||
{:holes [{:x 0
|
||||
:y 0
|
||||
:height style/top-hole-view-height
|
||||
:width container-width
|
||||
:borderBottomStartRadius 16
|
||||
:borderBottomEndRadius 16}]
|
||||
:style {:margin-top (- style/top-hole-view-height)}
|
||||
:on-layout on-layout}
|
||||
[rn/view
|
||||
{:style (merge (style/container customization-color theme)
|
||||
container-style)
|
||||
:accessibility-label :approval-label}
|
||||
[rn/view {:style style/content}
|
||||
[icon/icon
|
||||
(status-icons status)
|
||||
{:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
|
||||
:size 16}]
|
||||
[text/text
|
||||
{:size :paragraph-2
|
||||
:style (style/message theme)}
|
||||
(i18n/label (status-message status)
|
||||
{:amount token-value
|
||||
:symbol token-symbol})]]
|
||||
(when button-props
|
||||
[button/button
|
||||
(merge {:type (if (= status :approve) :primary :grey)
|
||||
:background (when-not (= status :approve) :blur)
|
||||
:customization-color customization-color
|
||||
:size 24}
|
||||
button-props)
|
||||
(i18n/label (if (= status :approve)
|
||||
:t/approve
|
||||
:t/view))])]]))
|
||||
|
||||
(def view (schema/instrument #'view-internal approval-label.schema/?schema))
|
||||
@@ -13,7 +13,7 @@
|
||||
:name "Trip to Vegas"
|
||||
:address "0x0ah...71a"}
|
||||
:networks [{:network-name :ethereum :short-name "eth"}
|
||||
{:network-name :optimism :short-name "opt"}]
|
||||
{:network-name :optimism :short-name "oeth"}]
|
||||
:action :none}])
|
||||
|
||||
(def default-details
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
(ns quo.components.wallet.missing-keypairs.component-spec
|
||||
(:require
|
||||
[quo.components.wallet.missing-keypairs.view :as missing-keypairs]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(def ^:private theme :dark)
|
||||
|
||||
(def props
|
||||
{:blur? true
|
||||
:container-style {}
|
||||
:on-options-press (fn [])
|
||||
:keypairs [{:type :seed
|
||||
:name name
|
||||
:key-uid "123"
|
||||
:accounts [{:customization-color :turquoise
|
||||
:emoji "\uD83C\uDFB2"
|
||||
:type :default}]}]})
|
||||
|
||||
(h/describe "Wallet: Missing key pairs"
|
||||
(h/test "Missing key pair title renders"
|
||||
(h/render-with-theme-provider [missing-keypairs/view props]
|
||||
theme)
|
||||
(h/is-truthy (h/get-by-label-text :title))
|
||||
(h/is-truthy (h/get-by-label-text :t/import-to-use-derived-accounts))))
|
||||
@@ -0,0 +1,28 @@
|
||||
(ns quo.components.wallet.missing-keypairs.style
|
||||
(:require
|
||||
[quo.foundations.colors :as colors]))
|
||||
|
||||
(def container
|
||||
{:border-width 1
|
||||
:border-radius 16
|
||||
:padding 8
|
||||
:border-color colors/warning-50-opa-20
|
||||
:background-color colors/warning-50-opa-5})
|
||||
|
||||
(def title-icon-container
|
||||
{:top 1})
|
||||
|
||||
(def title-info-container
|
||||
{:padding-left 8})
|
||||
|
||||
(def title-container
|
||||
{:align-items :flex-start
|
||||
:flex-direction :row
|
||||
:padding-left 4
|
||||
:padding-bottom 12})
|
||||
|
||||
(defn subtitle
|
||||
[blur? theme]
|
||||
{:color (if blur?
|
||||
colors/white-opa-40
|
||||
(colors/theme-colors colors/neutral-50 colors/neutral-40 theme))})
|
||||
@@ -0,0 +1,53 @@
|
||||
(ns quo.components.wallet.missing-keypairs.view
|
||||
(:require
|
||||
[quo.components.icon :as icon]
|
||||
[quo.components.list-items.missing-keypair.view :as missing-keypair]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.wallet.missing-keypairs.style :as style]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(defn title-view
|
||||
[{:keys [keypairs blur?]}]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
[rn/view
|
||||
{:accessibility-label :title
|
||||
:style style/title-container}
|
||||
[rn/view
|
||||
{:style style/title-icon-container}
|
||||
[icon/icon :i/info
|
||||
{:size 20
|
||||
:color colors/warning-60}]]
|
||||
[rn/view
|
||||
{:style style/title-info-container}
|
||||
[text/text
|
||||
{:weight :medium
|
||||
:style {:color colors/warning-60}}
|
||||
(i18n/label :t/amount-missing-keypairs
|
||||
{:amount (str (count keypairs))})]
|
||||
[text/text
|
||||
{:size :paragraph-2
|
||||
:style (style/subtitle blur? theme)}
|
||||
(i18n/label :t/import-to-use-derived-accounts)]]]))
|
||||
|
||||
(defn- missing-keypair-item
|
||||
[keypair _index _separators
|
||||
{:keys [blur? on-options-press]}]
|
||||
[missing-keypair/view
|
||||
{:keypair keypair
|
||||
:blur? blur?
|
||||
:on-options-press on-options-press}])
|
||||
|
||||
(defn view
|
||||
[{:keys [blur? keypairs container-style on-options-press] :as props}]
|
||||
[rn/view
|
||||
{:style (merge style/container container-style)}
|
||||
[title-view props]
|
||||
[rn/flat-list
|
||||
{:data keypairs
|
||||
:render-fn missing-keypair-item
|
||||
:render-data {:blur? blur?
|
||||
:on-options-press on-options-press}
|
||||
:separator [rn/view {:style {:height 8}}]}]])
|
||||
@@ -48,7 +48,7 @@
|
||||
(when show-optimism?
|
||||
[network-amount
|
||||
{:network :optimism
|
||||
:amount (str (:amount optimism) " " (or (:token-symbol optimism) "OPT"))
|
||||
:amount (str (:amount optimism) " " (or (:token-symbol optimism) "OETH"))
|
||||
:divider? show-arbitrum?
|
||||
:theme theme}])
|
||||
(when show-arbitrum?
|
||||
|
||||
@@ -6,14 +6,16 @@
|
||||
(h/describe "Wallet: Token Input"
|
||||
(h/test "Token label renders"
|
||||
(h/render-with-theme-provider [token-input/view
|
||||
{:token :snt
|
||||
:currency :eur
|
||||
:conversion 1}])
|
||||
{:token :snt
|
||||
:currency :eur
|
||||
:currency-symbol "€"
|
||||
:conversion 1}])
|
||||
(h/is-truthy (h/get-by-text "SNT")))
|
||||
|
||||
(h/test "Amount renders"
|
||||
(h/render-with-theme-provider [token-input/view
|
||||
{:token :snt
|
||||
:currency :eur
|
||||
:conversion 1}])
|
||||
{:token :snt
|
||||
:currency :eur
|
||||
:currency-symbol "€"
|
||||
:conversion 1}])
|
||||
(h/is-truthy (h/get-by-text "€0.00"))))
|
||||
|
||||
@@ -12,30 +12,22 @@
|
||||
{:padding-horizontal 20
|
||||
:padding-bottom 4
|
||||
:height 36
|
||||
:flex-direction :row
|
||||
:justify-content :space-between})
|
||||
:flex-direction :row})
|
||||
|
||||
(defn token-name
|
||||
[theme]
|
||||
{:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
|
||||
:margin-right 8
|
||||
:padding-bottom 2})
|
||||
|
||||
(def token-label-container
|
||||
{:position :absolute
|
||||
:left 40 ; token image size + margin
|
||||
:right 0
|
||||
:bottom 0
|
||||
:top 0
|
||||
:flex-direction :row
|
||||
:align-items :flex-end})
|
||||
:padding-bottom 3})
|
||||
|
||||
(def text-input-container
|
||||
{:position :absolute
|
||||
:top 0
|
||||
:bottom 0
|
||||
:left 40 ; token image size + margin
|
||||
:right 0})
|
||||
{:flex-direction :row
|
||||
:align-items :flex-end})
|
||||
|
||||
(defn input-container
|
||||
[window-width]
|
||||
{:width (- window-width 120)
|
||||
:margin-left 8
|
||||
:margin-right 8})
|
||||
|
||||
(def text-input-dimensions
|
||||
(-> typography/heading-1
|
||||
@@ -54,7 +46,8 @@
|
||||
:color
|
||||
(if error?
|
||||
(colors/resolve-color :danger theme)
|
||||
(colors/theme-colors colors/neutral-100 colors/white theme))))
|
||||
(colors/theme-colors colors/neutral-100 colors/white theme))
|
||||
:flex-shrink 1))
|
||||
|
||||
(defn placeholder-text
|
||||
[theme]
|
||||
|
||||
@@ -9,32 +9,34 @@
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.components.wallet.token-input.schema :as component-schema]
|
||||
[quo.components.wallet.token-input.style :as style]
|
||||
[quo.foundations.common :as common]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]))
|
||||
[schema.core :as schema]
|
||||
[utils.number :as number]))
|
||||
|
||||
(defn fiat-format
|
||||
[currency num-value conversion]
|
||||
(str (get common/currency-label currency) (.toFixed (* num-value conversion) 2)))
|
||||
[currency-symbol num-value conversion]
|
||||
(str currency-symbol (.toFixed (* num-value conversion) 2)))
|
||||
|
||||
(defn crypto-format
|
||||
[num-value conversion crypto-decimals token]
|
||||
(str (.toFixed (/ num-value conversion) (or crypto-decimals 2))
|
||||
(str (number/remove-trailing-zeroes
|
||||
(.toFixed (/ num-value conversion) (or crypto-decimals 2)))
|
||||
" "
|
||||
(string/upper-case (or (clj->js token) ""))))
|
||||
|
||||
(defn calc-value
|
||||
[{:keys [crypto? currency token value conversion crypto-decimals]}]
|
||||
[{:keys [crypto? currency-symbol token value conversion crypto-decimals]}]
|
||||
(let [num-value (if (string? value)
|
||||
(or (parse-double value) 0)
|
||||
value)]
|
||||
(if crypto?
|
||||
(fiat-format currency num-value conversion)
|
||||
(fiat-format currency-symbol num-value conversion)
|
||||
(crypto-format num-value conversion crypto-decimals token))))
|
||||
|
||||
(defn- data-info
|
||||
[{:keys [theme token crypto-decimals conversion networks title crypto? currency amount error?]}]
|
||||
[{:keys [theme token crypto-decimals conversion networks title crypto? currency-symbol amount
|
||||
error?]}]
|
||||
[rn/view {:style style/data-container}
|
||||
[network-tag/view
|
||||
{:networks networks
|
||||
@@ -45,7 +47,7 @@
|
||||
:weight :medium
|
||||
:style (style/fiat-amount theme)}
|
||||
(calc-value {:crypto? crypto?
|
||||
:currency currency
|
||||
:currency-symbol currency-symbol
|
||||
:token token
|
||||
:value amount
|
||||
:conversion conversion
|
||||
@@ -59,20 +61,6 @@
|
||||
:weight :semi-bold}
|
||||
(string/upper-case (or (clj->js text) ""))])
|
||||
|
||||
(defn- token-label
|
||||
[{:keys [theme value text]}]
|
||||
[rn/view
|
||||
{:style style/token-label-container
|
||||
:pointer-events :none}
|
||||
[rn/text-input
|
||||
{:max-length 12
|
||||
:style style/text-input-dimensions
|
||||
:editable false
|
||||
:placeholder "0"
|
||||
:opacity 0
|
||||
:value value}]
|
||||
[token-name-text theme text]])
|
||||
|
||||
(defn input-section
|
||||
[{:keys [on-change-text value value-internal set-value-internal on-selection-change
|
||||
on-token-press]}]
|
||||
@@ -92,36 +80,45 @@
|
||||
(oops/oget "nativeEvent.selection")
|
||||
(js->clj :keywordize-keys true)
|
||||
(on-selection-change))))]
|
||||
(fn [{:keys [token customization-color show-keyboard? crypto? currency value error? selection]
|
||||
(fn [{:keys [token customization-color show-keyboard? crypto? currency value error? selection
|
||||
handle-on-swap]
|
||||
:or {show-keyboard? true}}]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
[rn/view {:style {:flex 1}}
|
||||
[rn/pressable {:on-press on-token-press}
|
||||
[token/view
|
||||
{:token token
|
||||
:size :size-32}]]
|
||||
[rn/pressable
|
||||
{:style style/text-input-container
|
||||
:on-press focus-input}
|
||||
[rn/text-input
|
||||
(cond-> {:style (style/text-input theme error?)
|
||||
:placeholder-text-color (style/placeholder-text theme)
|
||||
:auto-focus true
|
||||
:ref set-ref
|
||||
:placeholder "0"
|
||||
:keyboard-type :numeric
|
||||
:max-length 12
|
||||
:on-change-text handle-on-change-text
|
||||
:selection-color customization-color
|
||||
:show-soft-input-on-focus show-keyboard?
|
||||
:on-selection-change handle-selection-change
|
||||
:selection (clj->js selection)}
|
||||
controlled-input? (assoc :value value)
|
||||
(not controlled-input?) (assoc :default-value value-internal))]]
|
||||
[token-label
|
||||
{:theme theme
|
||||
:text (if crypto? token currency)
|
||||
:value (if controlled-input? value value-internal)}]]))))
|
||||
(let [theme (quo.theme/use-theme)
|
||||
window-width (:width (rn/get-window))]
|
||||
[rn/pressable
|
||||
{:style {:width "100%"
|
||||
:flex-direction :row}
|
||||
:on-press on-token-press}
|
||||
[token/view
|
||||
{:token token
|
||||
:size :size-32}]
|
||||
[rn/view {:style (style/input-container window-width)}
|
||||
[rn/pressable
|
||||
{:style style/text-input-container
|
||||
:on-press focus-input}
|
||||
[rn/text-input
|
||||
(cond-> {:style (style/text-input theme error?)
|
||||
:placeholder-text-color (style/placeholder-text theme)
|
||||
:auto-focus true
|
||||
:ref set-ref
|
||||
:placeholder "0"
|
||||
:keyboard-type :numeric
|
||||
:on-change-text handle-on-change-text
|
||||
:selection-color customization-color
|
||||
:show-soft-input-on-focus show-keyboard?
|
||||
:on-selection-change handle-selection-change
|
||||
:selection (clj->js selection)}
|
||||
controlled-input? (assoc :value value)
|
||||
(not controlled-input?) (assoc :default-value value-internal))]
|
||||
[token-name-text theme (if crypto? token currency)]]]
|
||||
[button/button
|
||||
{:icon true
|
||||
:icon-only? true
|
||||
:size 32
|
||||
:on-press handle-on-swap
|
||||
:type :outline
|
||||
:accessibility-label :reorder}
|
||||
:i/reorder]]))))
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [container-style value on-swap] :as props}]
|
||||
@@ -141,15 +138,8 @@
|
||||
:value-internal value-internal
|
||||
:theme theme
|
||||
:set-value-internal set-value-internal
|
||||
:crypto? crypto?)]
|
||||
[button/button
|
||||
{:icon true
|
||||
:icon-only? true
|
||||
:size 32
|
||||
:on-press handle-on-swap
|
||||
:type :outline
|
||||
:accessibility-label :reorder}
|
||||
:i/reorder]]
|
||||
:handle-on-swap handle-on-swap
|
||||
:crypto? crypto?)]]
|
||||
[divider-line/view {:container-style (style/divider theme)}]
|
||||
[data-info
|
||||
(assoc props
|
||||
|
||||
@@ -5,8 +5,11 @@
|
||||
quo.components.avatars.account-avatar.view
|
||||
quo.components.avatars.channel-avatar.view
|
||||
quo.components.avatars.collection-avatar.view
|
||||
quo.components.avatars.community-avatar.view
|
||||
quo.components.avatars.dapp-avatar.view
|
||||
quo.components.avatars.group-avatar.view
|
||||
quo.components.avatars.icon-avatar
|
||||
quo.components.avatars.token-avatar.view
|
||||
quo.components.avatars.user-avatar.view
|
||||
quo.components.avatars.wallet-user-avatar.view
|
||||
quo.components.banners.banner.view
|
||||
@@ -17,6 +20,7 @@
|
||||
quo.components.buttons.logout-button.view
|
||||
quo.components.buttons.predictive-keyboard.view
|
||||
quo.components.buttons.slide-button.view
|
||||
quo.components.buttons.swap-order-button.view
|
||||
quo.components.buttons.wallet-button.view
|
||||
quo.components.buttons.wallet-ctas.view
|
||||
quo.components.calendar.calendar-day.view
|
||||
@@ -84,6 +88,7 @@
|
||||
quo.components.list-items.community.view
|
||||
quo.components.list-items.dapp.view
|
||||
quo.components.list-items.menu-item
|
||||
quo.components.list-items.missing-keypair.view
|
||||
quo.components.list-items.network-list.view
|
||||
quo.components.list-items.preview-list.view
|
||||
quo.components.list-items.quiz-item.view
|
||||
@@ -165,8 +170,10 @@
|
||||
quo.components.wallet.account-permissions.view
|
||||
quo.components.wallet.address-text.view
|
||||
quo.components.wallet.amount-input.view
|
||||
quo.components.wallet.approval-label.view
|
||||
quo.components.wallet.confirmation-progress.view
|
||||
quo.components.wallet.keypair.view
|
||||
quo.components.wallet.missing-keypairs.view
|
||||
quo.components.wallet.network-amount.view
|
||||
quo.components.wallet.network-bridge.view
|
||||
quo.components.wallet.network-link.view
|
||||
@@ -186,8 +193,11 @@
|
||||
(def account-avatar quo.components.avatars.account-avatar.view/view)
|
||||
(def channel-avatar quo.components.avatars.channel-avatar.view/view)
|
||||
(def collection-avatar quo.components.avatars.collection-avatar.view/view)
|
||||
(def community-avatar quo.components.avatars.community-avatar.view/view)
|
||||
(def dapp-avatar quo.components.avatars.dapp-avatar.view/view)
|
||||
(def group-avatar quo.components.avatars.group-avatar.view/view)
|
||||
(def icon-avatar quo.components.avatars.icon-avatar/icon-avatar)
|
||||
(def token-avatar quo.components.avatars.token-avatar.view/view)
|
||||
(def user-avatar quo.components.avatars.user-avatar.view/user-avatar)
|
||||
(def wallet-user-avatar quo.components.avatars.wallet-user-avatar.view/wallet-user-avatar)
|
||||
|
||||
@@ -201,6 +211,7 @@
|
||||
(def logout-button quo.components.buttons.logout-button.view/view)
|
||||
(def predictive-keyboard quo.components.buttons.predictive-keyboard.view/view)
|
||||
(def slide-button quo.components.buttons.slide-button.view/view)
|
||||
(def swap-order-button quo.components.buttons.swap-order-button.view/view)
|
||||
(def wallet-button quo.components.buttons.wallet-button.view/view)
|
||||
(def wallet-ctas quo.components.buttons.wallet-ctas.view/view)
|
||||
|
||||
@@ -317,6 +328,7 @@
|
||||
(def community-list quo.components.list-items.community.view/view)
|
||||
(def dapp quo.components.list-items.dapp.view/view)
|
||||
(def menu-item quo.components.list-items.menu-item/menu-item)
|
||||
(def missing-keypair quo.components.list-items.missing-keypair.view/view)
|
||||
(def network-list quo.components.list-items.network-list.view/view)
|
||||
(def preview-list quo.components.list-items.preview-list.view/view)
|
||||
(def quiz-item quo.components.list-items.quiz-item.view/view)
|
||||
@@ -434,8 +446,10 @@
|
||||
(def account-permissions quo.components.wallet.account-permissions.view/view)
|
||||
(def address-text quo.components.wallet.address-text.view/view)
|
||||
(def amount-input quo.components.wallet.amount-input.view/view)
|
||||
(def approval-label quo.components.wallet.approval-label.view/view)
|
||||
(def confirmation-progress quo.components.wallet.confirmation-progress.view/view)
|
||||
(def keypair quo.components.wallet.keypair.view/view)
|
||||
(def missing-keypairs quo.components.wallet.missing-keypairs.view/view)
|
||||
(def network-amount quo.components.wallet.network-amount.view/view)
|
||||
(def network-bridge quo.components.wallet.network-bridge.view/view)
|
||||
(def network-routing quo.components.wallet.network-routing.view/view)
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
(ns quo.core-spec
|
||||
(:require
|
||||
quo.components.avatars.account-avatar.component-spec
|
||||
quo.components.avatars.community-avatar.component-spec
|
||||
quo.components.avatars.dapp-avatar.component-spec
|
||||
quo.components.avatars.token-avatar.component-spec
|
||||
quo.components.avatars.user-avatar.component-spec
|
||||
quo.components.banners.banner.component-spec
|
||||
quo.components.browser.browser-input.component-spec
|
||||
@@ -9,6 +12,7 @@
|
||||
quo.components.buttons.logout-button.component-spec
|
||||
quo.components.buttons.predictive-keyboard.component-spec
|
||||
quo.components.buttons.slide-button.component-spec
|
||||
quo.components.buttons.swap-order-button.component-spec
|
||||
quo.components.buttons.wallet-button.component-spec
|
||||
quo.components.buttons.wallet-ctas.component-spec
|
||||
quo.components.calendar.calendar-day.component-spec
|
||||
@@ -95,6 +99,7 @@
|
||||
quo.components.wallet.account-overview.component-spec
|
||||
quo.components.wallet.account-permissions.component-spec
|
||||
quo.components.wallet.amount-input.component-spec
|
||||
quo.components.wallet.approval-label.component-spec
|
||||
quo.components.wallet.confirmation-progress.component-spec
|
||||
quo.components.wallet.keypair.component-spec
|
||||
quo.components.wallet.network-amount.component-spec
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
|
||||
(def ^:private get-network-full-name
|
||||
{:eth :ethereum
|
||||
:opt :optimism
|
||||
:oeth :optimism
|
||||
:arb1 :arbitrum})
|
||||
|
||||
(def ^:private networks-short-name
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
(ns quo.foundations.common)
|
||||
|
||||
(def currency-label
|
||||
{:eur "€"
|
||||
:usd "$"})
|
||||
@@ -8,7 +8,6 @@
|
||||
(defn sheet
|
||||
[{:keys [max-height]}]
|
||||
{:position :absolute
|
||||
:overflow :hidden
|
||||
:bottom 0
|
||||
:left 0
|
||||
:right 0
|
||||
@@ -23,13 +22,22 @@
|
||||
:left 0
|
||||
:right 0})
|
||||
|
||||
(def shell-bg
|
||||
{:position :absolute
|
||||
:background-color (if platform/ios? colors/white-opa-5 colors/neutral-100-opa-90)
|
||||
:left 0
|
||||
:right 0
|
||||
:top 0
|
||||
:bottom 0})
|
||||
(defn shell-bg
|
||||
[blur-background]
|
||||
{:background-color (if blur-background
|
||||
blur-background
|
||||
(if platform/ios? colors/white-opa-5 colors/neutral-100-opa-90))
|
||||
:flex 1})
|
||||
|
||||
(def shell-bg-container
|
||||
{:border-top-left-radius sheet-border-radius
|
||||
:border-top-right-radius sheet-border-radius
|
||||
:left 0
|
||||
:right 0
|
||||
:top 0
|
||||
:bottom 0
|
||||
:position :absolute
|
||||
:overflow :hidden})
|
||||
|
||||
(defn sheet-content
|
||||
[{:keys [theme padding-bottom shell?]}]
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
(defn view
|
||||
[{:keys [hide? insets]}
|
||||
{:keys [content selected-item padding-bottom-override border-radius on-close shell?
|
||||
gradient-cover? customization-color hide-handle? blur-radius]
|
||||
gradient-cover? customization-color hide-handle? blur-radius blur-background]
|
||||
:or {border-radius 12}}]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
{window-height :height} (rn/get-window)
|
||||
@@ -133,12 +133,13 @@
|
||||
{:transform [{:translateY translate-y}]}
|
||||
(style/sheet {:max-height sheet-max-height}))}
|
||||
(when shell?
|
||||
[blur/ios-view
|
||||
{:style style/shell-bg
|
||||
:blur-radius (or blur-radius 20)
|
||||
:blur-amount 32
|
||||
:blur-type :transparent
|
||||
:overlay-color :transparent}])
|
||||
[rn/view {:style style/shell-bg-container}
|
||||
[blur/ios-view
|
||||
{:style (style/shell-bg blur-background)
|
||||
:blur-radius (or blur-radius 20)
|
||||
:blur-amount 32
|
||||
:blur-type :transparent
|
||||
:overlay-color :transparent}]])
|
||||
(when selected-item
|
||||
[rn/view
|
||||
{:on-layout handle-item-height
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
[state]
|
||||
(set-input-error state (upper-limit-exceeded? state)))
|
||||
|
||||
(defn- set-input-value
|
||||
(defn set-input-value
|
||||
[state value]
|
||||
(-> state
|
||||
(assoc :value value)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
(defn view
|
||||
[{:keys [header footer customization-color footer-container-padding header-container-style
|
||||
gradient-cover?]
|
||||
gradient-cover? keyboard-should-persist-taps]
|
||||
:or {footer-container-padding (safe-area/get-top)}}
|
||||
& children]
|
||||
(reagent/with-let [scroll-view-ref (atom nil)
|
||||
@@ -108,7 +108,8 @@
|
||||
:padding-bottom (when @keyboard-did-show?
|
||||
@footer-container-height)}
|
||||
:always-bounce-vertical @keyboard-did-show?
|
||||
:shows-vertical-scroll-indicator false}
|
||||
:shows-vertical-scroll-indicator false
|
||||
:keyboard-should-persist-taps keyboard-should-persist-taps}
|
||||
(into [rn/view {:on-layout set-content-container-height}]
|
||||
children)]
|
||||
[rn/keyboard-avoiding-view
|
||||
|
||||
@@ -128,15 +128,6 @@
|
||||
:user-picture-male4 (js/require "../resources/images/mock2/user_picture_male4.png")
|
||||
:user-picture-male5 (js/require "../resources/images/mock2/user_picture_male5.png")})
|
||||
|
||||
(def services
|
||||
{:latamex (js/require "../resources/images/services/Latamex.png")
|
||||
:moonpay (js/require "../resources/images/services/Moonpay.png")
|
||||
:ramp (js/require "../resources/images/services/Ramp.png")})
|
||||
|
||||
(defn get-service-image
|
||||
[k]
|
||||
(get services k))
|
||||
|
||||
(defn get-mock-image
|
||||
[k]
|
||||
(get mock-images k))
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
(defonce camera-permission-granted? (reagent/atom false))
|
||||
|
||||
(defn- header
|
||||
[{:keys [title subtitle]}]
|
||||
[{:keys [title subtitle share-button?]}]
|
||||
[:<>
|
||||
[rn/view {:style style/header-container}
|
||||
[quo/button
|
||||
@@ -31,16 +31,17 @@
|
||||
:accessibility-label :close-scan-qr-code
|
||||
:on-press #(rf/dispatch [:navigate-back])}
|
||||
:i/close]
|
||||
[quo/button
|
||||
{:icon-only? true
|
||||
:type :grey
|
||||
:background :blur
|
||||
:size 32
|
||||
:accessibility-label :show-qr-button
|
||||
:on-press (fn []
|
||||
(rf/dispatch [:navigate-back])
|
||||
(rf/dispatch [:open-modal :screen/share-shell]))}
|
||||
:i/qr-code]]
|
||||
(when share-button?
|
||||
[quo/button
|
||||
{:icon-only? true
|
||||
:type :grey
|
||||
:background :blur
|
||||
:size 32
|
||||
:accessibility-label :show-qr-button
|
||||
:on-press (fn []
|
||||
(rf/dispatch [:navigate-back])
|
||||
(rf/dispatch [:open-modal :screen/share-shell]))}
|
||||
:i/qr-code])]
|
||||
[quo/text
|
||||
{:size :heading-1
|
||||
:weight :semi-bold
|
||||
@@ -195,7 +196,7 @@
|
||||
true)
|
||||
|
||||
(defn view
|
||||
[{:keys [title subtitle validate-fn on-success-scan error-message]}]
|
||||
[{:keys [title subtitle validate-fn on-success-scan error-message share-button?]}]
|
||||
(let [insets (safe-area/get-insets)
|
||||
qr-code-succeed? (reagent/atom false)
|
||||
qr-view-finder (reagent/atom {})
|
||||
@@ -237,8 +238,9 @@
|
||||
:set-rescan-timeout set-rescan-timeout}])
|
||||
[rn/view {:style (style/root-container (:top insets))}
|
||||
[header
|
||||
{:title title
|
||||
:subtitle subtitle}]
|
||||
{:title title
|
||||
:subtitle subtitle
|
||||
:share-button? share-button?}]
|
||||
(when (empty? @qr-view-finder)
|
||||
[:<>
|
||||
[rn/view {:style style/scan-qr-code-container}]
|
||||
|
||||
@@ -3,12 +3,14 @@
|
||||
[legacy.status-im.chat.models.message :as models.message]
|
||||
[legacy.status-im.mailserver.core :as mailserver]
|
||||
[legacy.status-im.visibility-status-updates.core :as visibility-status-updates]
|
||||
[oops.core :as oops]
|
||||
[status-im.common.pairing.events :as pairing]
|
||||
[status-im.contexts.chat.messenger.messages.link-preview.events :as link-preview]
|
||||
[status-im.contexts.chat.messenger.messages.transport.events :as messages.transport]
|
||||
[status-im.contexts.communities.discover.events]
|
||||
[status-im.contexts.profile.push-notifications.local.events :as local-notifications]
|
||||
[taoensso.timbre :as log]
|
||||
[utils.debounce :as debounce]
|
||||
[utils.re-frame :as rf]
|
||||
[utils.transforms :as transforms]))
|
||||
|
||||
@@ -22,9 +24,12 @@
|
||||
:peers-count peers-count)}
|
||||
(visibility-status-updates/peers-summary-change peers-count))))
|
||||
|
||||
(rf/defn wakuv2-peer-stats
|
||||
[{:keys [db]} peer-stats]
|
||||
{:db (assoc db :peer-stats peer-stats :peers-count (count (:peers peer-stats)))})
|
||||
(rf/reg-event-fx :wakuv2-peer-stats
|
||||
(fn [{:keys [db]} [^js peer-stats-js]]
|
||||
(let [peer-stats (transforms/js->clj peer-stats-js)]
|
||||
{:db (assoc db
|
||||
:peer-stats peer-stats
|
||||
:peers-count (count (:peers peer-stats)))})))
|
||||
|
||||
(rf/defn process
|
||||
{:events [:signals/signal-received]}
|
||||
@@ -35,59 +40,76 @@
|
||||
(let [^js data (.parse js/JSON event-str)
|
||||
^js event-js (.-event data)
|
||||
type (.-type data)]
|
||||
(log/debug "Signal received" event-str)
|
||||
(log/debug "Signal received" {:type type})
|
||||
(log/trace "Signal received" {:payload event-str})
|
||||
(case type
|
||||
"node.login" {:fx [[:dispatch
|
||||
[:profile.login/login-node-signal
|
||||
(transforms/js->clj event-js)]]]}
|
||||
"backup.performed" {:db (assoc-in db
|
||||
[:profile/profile :last-backup]
|
||||
(.-lastBackup event-js))}
|
||||
"envelope.sent" (messages.transport/update-envelopes-status cofx
|
||||
(:ids
|
||||
(js->clj event-js
|
||||
:keywordize-keys
|
||||
true))
|
||||
:sent)
|
||||
"envelope.expired" (messages.transport/update-envelopes-status cofx
|
||||
(:ids
|
||||
(js->clj event-js
|
||||
:keywordize-keys
|
||||
true))
|
||||
:not-sent)
|
||||
"message.delivered" (let [{:keys [chatID messageID]} (js->clj event-js
|
||||
:keywordize-keys
|
||||
true)]
|
||||
(models.message/update-message-status cofx
|
||||
chatID
|
||||
messageID
|
||||
:delivered))
|
||||
"mailserver.changed" (mailserver/handle-mailserver-changed cofx (.-id event-js))
|
||||
"mailserver.available" (mailserver/handle-mailserver-available cofx (.-id event-js))
|
||||
"mailserver.not.working" (mailserver/handle-mailserver-not-working cofx)
|
||||
"discovery.summary" (summary cofx (js->clj event-js :keywordize-keys true))
|
||||
"mediaserver.started" {:db (assoc db :mediaserver/port (.-port event-js))}
|
||||
"wakuv2.peerstats" (wakuv2-peer-stats cofx (js->clj event-js :keywordize-keys true))
|
||||
"messages.new" (messages.transport/sanitize-messages-and-process-response cofx
|
||||
event-js
|
||||
true)
|
||||
"wallet" (rf/dispatch [:wallet/signal-received event-js])
|
||||
"local-notifications" (local-notifications/process cofx
|
||||
(js->clj event-js :keywordize-keys true))
|
||||
"community.found" (link-preview/cache-community-preview-data (js->clj event-js
|
||||
:keywordize-keys
|
||||
true))
|
||||
"status.updates.timedout" (visibility-status-updates/handle-visibility-status-updates
|
||||
cofx
|
||||
(js->clj event-js :keywordize-keys true))
|
||||
"localPairing" (pairing/handle-local-pairing-signals
|
||||
cofx
|
||||
(js->clj event-js :keywordize-keys true))
|
||||
"curated.communities.update" (rf/dispatch [:fetched-contract-communities
|
||||
(js->clj event-js :keywordize-keys true)])
|
||||
"waku.backedup.profile" (rf/dispatch [:profile/update-profile-from-backup
|
||||
(js->clj event-js :keywordize-keys true)])
|
||||
"waku.backedup.settings" (rf/dispatch [:profile/update-setting-from-backup
|
||||
(js->clj event-js :keywordize-keys true)])
|
||||
"wallet"
|
||||
(rf/dispatch [:wallet/signal-received event-js])
|
||||
|
||||
"wakuv2.peerstats"
|
||||
(debounce/debounce-and-dispatch [:wakuv2-peer-stats event-js] 1000)
|
||||
|
||||
"envelope.sent"
|
||||
(messages.transport/update-envelopes-status
|
||||
cofx
|
||||
(:ids (transforms/js->clj event-js))
|
||||
:sent)
|
||||
|
||||
"envelope.expired"
|
||||
(messages.transport/update-envelopes-status
|
||||
cofx
|
||||
(:ids (transforms/js->clj event-js))
|
||||
:not-sent)
|
||||
|
||||
"message.delivered"
|
||||
(let [{:keys [chatID messageID]} (transforms/js->clj event-js)]
|
||||
(models.message/update-message-status cofx chatID messageID :delivered))
|
||||
|
||||
"messages.new"
|
||||
(messages.transport/sanitize-messages-and-process-response cofx event-js true)
|
||||
|
||||
"mailserver.changed"
|
||||
(mailserver/handle-mailserver-changed cofx (oops/oget event-js :id))
|
||||
|
||||
"mailserver.available"
|
||||
(mailserver/handle-mailserver-available cofx (oops/oget event-js :id))
|
||||
|
||||
"mailserver.not.working"
|
||||
(mailserver/handle-mailserver-not-working cofx)
|
||||
|
||||
"discovery.summary"
|
||||
(summary cofx (transforms/js->clj event-js))
|
||||
|
||||
"local-notifications"
|
||||
(local-notifications/process cofx (transforms/js->clj event-js))
|
||||
|
||||
"community.found"
|
||||
(let [community (transforms/js->clj event-js)]
|
||||
(link-preview/cache-community-preview-data community)
|
||||
{:fx [[:dispatch [:discover-community/maybe-found-unknown-contract-community community]]]})
|
||||
|
||||
"status.updates.timedout"
|
||||
(visibility-status-updates/handle-visibility-status-updates cofx (transforms/js->clj event-js))
|
||||
|
||||
"localPairing"
|
||||
(pairing/handle-local-pairing-signals cofx (transforms/js->clj event-js))
|
||||
|
||||
"curated.communities.update"
|
||||
(rf/dispatch [:fetched-contract-communities (transforms/js->clj event-js)])
|
||||
|
||||
"waku.backedup.profile"
|
||||
(rf/dispatch [:profile/update-profile-from-backup (transforms/js->clj event-js)])
|
||||
|
||||
"waku.backedup.settings"
|
||||
(rf/dispatch [:profile/update-setting-from-backup (transforms/js->clj event-js)])
|
||||
|
||||
"mediaserver.started"
|
||||
{:db (assoc db :mediaserver/port (oops/oget event-js :port))}
|
||||
|
||||
"node.login"
|
||||
{:fx [[:dispatch [:profile.login/login-node-signal (transforms/js->clj event-js)]]]}
|
||||
|
||||
"backup.performed"
|
||||
{:db (assoc-in db [:profile/profile :last-backup] (oops/oget event-js :lastBackup))}
|
||||
|
||||
(log/debug "Event " type " not handled"))))
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
args-with-biometric-btn])
|
||||
:on-success #(rf/dispatch [:standard-auth/on-biometric-success on-auth-success])
|
||||
:on-fail (fn [err]
|
||||
(rf/dispatch [:standard-auth/authorize-with-password
|
||||
args-with-biometric-btn])
|
||||
(when on-auth-fail (on-auth-fail err))
|
||||
(rf/dispatch [:standard-auth/on-biometric-fail err]))}]]]}))
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
:on-auth-success on-auth-success
|
||||
:on-auth-fail on-auth-fail
|
||||
:auth-button-label auth-button-label}]))
|
||||
(into [] (concat [theme] dependencies)))]
|
||||
(vec (conj dependencies on-auth-success on-auth-fail)))]
|
||||
[quo/slide-button
|
||||
{:container-style container-style
|
||||
:size size
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
(goog-define ALCHEMY_OPTIMISM_SEPOLIA_TOKEN "")
|
||||
(goog-define WALLET_CONNECT_PROJECT_ID "")
|
||||
|
||||
(def mainnet-rpc-url (str "https://eth-archival.gateway.pokt.network/v1/lb/" POKT_TOKEN))
|
||||
(def mainnet-rpc-url (str "https://eth-archival.rpc.grove.city/v1/" POKT_TOKEN))
|
||||
(def goerli-rpc-url (str "https://goerli-archival.gateway.pokt.network/v1/lb/" POKT_TOKEN))
|
||||
(def mainnet-chain-explorer-link "https://etherscan.io/address/")
|
||||
(def optimism-mainnet-chain-explorer-link "https://optimistic.etherscan.io/address/")
|
||||
@@ -105,32 +105,15 @@
|
||||
(def fast-create-community-enabled?
|
||||
(enabled? (get-config :FAST_CREATE_COMMUNITY_ENABLED "0")))
|
||||
|
||||
(def default-multiaccount
|
||||
{:preview-privacy? blank-preview?
|
||||
:wallet-legacy/visible-tokens {:mainnet #{:SNT}}
|
||||
:currency :usd
|
||||
:appearance 0
|
||||
:profile-pictures-show-to 2
|
||||
:profile-pictures-visibility 2
|
||||
:log-level log-level
|
||||
:webview-allow-permission-requests? false
|
||||
:opensea-enabled? false
|
||||
:link-previews-enabled-sites #{}
|
||||
:link-preview-request-enabled true})
|
||||
|
||||
(defn default-visible-tokens
|
||||
[chain]
|
||||
(get-in default-multiaccount [:wallet-legacy/visible-tokens chain]))
|
||||
|
||||
(def waku-nodes-config
|
||||
{:status.prod
|
||||
["enrtree://AL65EKLJAUXKKPG43HVTML5EFFWEZ7L4LOKTLZCLJASG4DSESQZEC@prod.status.nodes.status.im"]
|
||||
:status.test
|
||||
["enrtree://AIO6LUM3IVWCU2KCPBBI6FEH2W42IGK3ASCZHZGG5TIXUR56OGQUO@test.status.nodes.status.im"]
|
||||
:wakuv2.prod
|
||||
["enrtree://ANEDLO25QVUGJOUTQFRYKWX6P4Z4GKVESBMHML7DZ6YK4LGS5FC5O@prod.wakuv2.nodes.status.im"]
|
||||
:wakuv2.test
|
||||
["enrtree://AO47IDOLBKH72HIZZOXQP6NMRESAN7CHYWIBNXDXWRJRZWLODKII6@test.wakuv2.nodes.status.im"]})
|
||||
:waku.sandbox
|
||||
["enrtree://AIRVQ5DDA4FFWLRBCHJWUWOO6X6S4ZTZ5B667LQ6AJU6PEYDLRD5O@sandbox.waku.nodes.status.im"]
|
||||
:waku.test
|
||||
["enrtree://AOGYWMBYOUIMOENHXCHILPKY3ZRFEULMFI4DOM442QSZ73TT2A7VI@test.waku.nodes.status.im"]})
|
||||
|
||||
(def default-kdf-iterations 3200)
|
||||
|
||||
|
||||
@@ -251,7 +251,7 @@
|
||||
(def regx-community-universal-link #"((^https?://status.app/)|(^status-app://))c/([\x00-\x7F]+)$")
|
||||
(def regx-deep-link #"((^ethereum:.*)|(^status-app://[\x00-\x7F]+$))")
|
||||
(def regx-ens #"^(?=.{5,255}$)([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$")
|
||||
(def regx-multichain-address #"^(?:(?:eth:|arb1:|opt:)(?=:|))*0x[0-9a-fA-F]{40}$")
|
||||
(def regx-multichain-address #"^(?:(?:eth:|arb1:|oeth:)(?=:|))*0x[0-9a-fA-F]{40}$")
|
||||
|
||||
(def regx-address-contains #"(?i)0x[a-fA-F0-9]{40}")
|
||||
(def regx-starts-with-uuid #"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}")
|
||||
@@ -468,13 +468,13 @@
|
||||
|
||||
(def ^:const mainnet-short-name "eth")
|
||||
(def ^:const ethereum-short-name "eth")
|
||||
(def ^:const optimism-short-name "opt")
|
||||
(def ^:const optimism-short-name "oeth")
|
||||
(def ^:const arbitrum-short-name "arb1")
|
||||
|
||||
(def ^:const default-multichain-address-prefix "eth:opt:arb1:")
|
||||
(def ^:const default-multichain-address-prefix "eth:oeth:arb1:")
|
||||
|
||||
(def ^:const mainnet-abbreviated-name "Eth.")
|
||||
(def ^:const optimism-abbreviated-name "Opt.")
|
||||
(def ^:const optimism-abbreviated-name "Oeth.")
|
||||
(def ^:const arbitrum-abbreviated-name "Arb1.")
|
||||
|
||||
(def ^:const mainnet-network-name :mainnet)
|
||||
@@ -506,11 +506,18 @@
|
||||
(def ^:const send-type-stickers-buy 4)
|
||||
(def ^:const send-type-bridge 5)
|
||||
(def ^:const send-type-erc-721-transfer 6)
|
||||
(def ^:const send-type-erc-1155-transfer 7)
|
||||
|
||||
(def ^:const bridge-name-transfer "Transfer")
|
||||
(def ^:const bridge-name-erc-721-transfer "ERC721Transfer")
|
||||
(def ^:const bridge-name-erc-1155-transfer "ERC1155Transfer")
|
||||
(def ^:const bridge-name-hop "Hop")
|
||||
|
||||
(def ^:const wallet-contract-type-uknown 0)
|
||||
(def ^:const wallet-contract-type-erc-20 1)
|
||||
(def ^:const wallet-contract-type-erc-721 2)
|
||||
(def ^:const wallet-contract-type-erc-1155 3)
|
||||
|
||||
(def ^:const alert-banner-height 40)
|
||||
|
||||
(def ^:const status-hostname "status.app")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user