Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5e46db6cd2 | ||
|
|
81a2069d6a | ||
|
|
d7cc6aa90a | ||
|
|
73ef9de339 | ||
|
|
66b3510840 | ||
|
|
c34e073bcd | ||
|
|
5ff854c7c7 | ||
|
|
dea7227c29 | ||
|
|
ab01093a6e | ||
|
|
a35d5f9d15 | ||
|
|
caaba958e3 | ||
|
|
723d99cb40 | ||
|
|
927d67f3ca | ||
|
|
089f42e0e9 | ||
|
|
440e6d2047 | ||
|
|
af9461da74 | ||
|
|
ec54de8f63 | ||
|
|
0d403739f9 | ||
|
|
031626aefc | ||
|
|
b280befe2d | ||
|
|
35845ae3d3 | ||
|
|
d3fefb6238 | ||
|
|
6598ef3466 | ||
|
|
45b9fd4b91 | ||
|
|
9ba0960d71 | ||
|
|
f917782fc1 | ||
|
|
dc86457035 | ||
|
|
a1204d0c80 | ||
|
|
e7887d4fca | ||
|
|
8bab25075b | ||
|
|
706d6a44a4 | ||
|
|
dd5864ff25 | ||
|
|
a1d091ac19 | ||
|
|
e312e3137d | ||
|
|
1def0b7f9e | ||
|
|
7bfd671820 | ||
|
|
afb6109d9f | ||
|
|
a9601ddb86 | ||
|
|
0652d18653 | ||
|
|
f9d697dd2e | ||
|
|
296e28ef1c | ||
|
|
9502229c09 | ||
|
|
5f719ac95b | ||
|
|
0e12360ed8 | ||
|
|
63290fd019 | ||
|
|
ffb5fac6f7 | ||
|
|
c20d6b5782 | ||
|
|
2b52ba2389 | ||
|
|
bc823f9e96 | ||
|
|
3568b20522 | ||
|
|
1900e3038b | ||
|
|
aaf07911c4 | ||
|
|
8448570922 | ||
|
|
e4e9556303 | ||
|
|
3207300e02 | ||
|
|
f0d739291e | ||
|
|
f26c3090c6 | ||
|
|
505b290c6e | ||
|
|
508060f18d | ||
|
|
a3cb837266 | ||
|
|
ae3df0c730 | ||
|
|
d6a999043e | ||
|
|
58d994706f | ||
|
|
213c288cc1 | ||
|
|
114e704b78 | ||
|
|
4cd6ada534 | ||
|
|
1bdbf3e403 | ||
|
|
ef13b4d210 | ||
|
|
8926a7ad4e | ||
|
|
65d76ba9c8 | ||
|
|
399e7d399b | ||
|
|
69a50ff9ab | ||
|
|
152407b903 | ||
|
|
e30ca97184 | ||
|
|
011de1b8ae | ||
|
|
6d43f34cf8 | ||
|
|
e5b7fb13a1 | ||
|
|
b67ecacd8b | ||
|
|
58d358125c | ||
|
|
f5baee5039 | ||
|
|
2b0c498613 | ||
|
|
177b905291 | ||
|
|
4217f558a8 | ||
|
|
a71468f425 | ||
|
|
dd5c30b7a0 | ||
|
|
929925af39 | ||
|
|
880321ccc4 | ||
|
|
1bff966679 | ||
|
|
f770045f89 | ||
|
|
72df44da6c | ||
|
|
273b0064e2 | ||
|
|
9dcf3cde93 | ||
|
|
b6623ae1c3 | ||
|
|
2618201bb3 | ||
|
|
ba3e229d6f | ||
|
|
8cb0ad9285 | ||
|
|
6c7d689a7c | ||
|
|
6a71a1e798 | ||
|
|
3469aca1d8 | ||
|
|
427209c960 | ||
|
|
b71617e490 | ||
|
|
ba8c943046 | ||
|
|
ef042bdc0b | ||
|
|
8628cbbf76 | ||
|
|
0b8509949a | ||
|
|
a7660754fb | ||
|
|
ec528f98cc | ||
|
|
dd0031f68e | ||
|
|
be37b1683e | ||
|
|
710e55002b | ||
|
|
19eda04c90 | ||
|
|
cf9f160de9 | ||
|
|
3dfa7beacd | ||
|
|
4dacc95de6 | ||
|
|
448782b3d3 | ||
|
|
693c41850c | ||
|
|
1bd62f1199 | ||
|
|
2ed25a9f51 | ||
|
|
3b6f3b77cc | ||
|
|
67b646dcca | ||
|
|
d59c9205ea | ||
|
|
c2212af3ff | ||
|
|
da9e6686c6 | ||
|
|
f7ab1ff20c | ||
|
|
956bb813d4 | ||
|
|
807dabf5b2 | ||
|
|
3b652adaf3 | ||
|
|
c22ffb1032 | ||
|
|
2494c61f85 | ||
|
|
073371c4ed | ||
|
|
db848a1f19 | ||
|
|
85a01f5404 | ||
|
|
adaf77ba1b | ||
|
|
7f839f952d | ||
|
|
b29912f7f7 | ||
|
|
fab241f6ac | ||
|
|
594c83013c | ||
|
|
2e94e0e765 | ||
|
|
05ed28b9a2 | ||
|
|
f4530d4d03 | ||
|
|
ed4e227144 | ||
|
|
93ce02b547 | ||
|
|
5bb849f9c1 | ||
|
|
310a1ad5f1 | ||
|
|
a90d8a1439 | ||
|
|
acbd240070 | ||
|
|
c77b350d77 | ||
|
|
2cf0a60977 | ||
|
|
711389365c | ||
|
|
ef5031a4aa | ||
|
|
ab7e9795ce | ||
|
|
7eca3c42d7 | ||
|
|
e307b4faa6 | ||
|
|
4129ca1597 | ||
|
|
31ba933917 | ||
|
|
eea5b4eb0f | ||
|
|
d1016669bb | ||
|
|
4ca7c0b989 | ||
|
|
f6e480344d | ||
|
|
5eed7bd560 | ||
|
|
87f86d3b7b | ||
|
|
8890f25f96 | ||
|
|
651065f0a6 | ||
|
|
b27a53bdee | ||
|
|
2116847fc6 | ||
|
|
965438bc87 | ||
|
|
90ad5f2f77 | ||
|
|
f0827ff624 | ||
|
|
be0ad943ea | ||
|
|
937efc9f4f | ||
|
|
116b4d8812 | ||
|
|
460685212a | ||
|
|
46655dbd48 | ||
|
|
f970834536 | ||
|
|
a4836120e6 | ||
|
|
a364ce1906 | ||
|
|
0c55f1208b | ||
|
|
da6860d693 | ||
|
|
94235aa703 | ||
|
|
5da9efebe3 | ||
|
|
3de7c37d90 | ||
|
|
7c4c520712 | ||
|
|
a8ae933604 | ||
|
|
2abd430e02 | ||
|
|
a99e7f660f | ||
|
|
8268346dfa | ||
|
|
f5df7805ee | ||
|
|
5b08242102 | ||
|
|
f8983ab147 | ||
|
|
067c69cca4 | ||
|
|
77e6f83e2e | ||
|
|
4e0ec35ea5 | ||
|
|
66a4ab5aef | ||
|
|
9d7dcc6ae7 | ||
|
|
46f8d9fdbf | ||
|
|
b22acc3da2 | ||
|
|
e5f9de828d | ||
|
|
3f9817b977 | ||
|
|
503028cb4e | ||
|
|
c7cc9e27a9 | ||
|
|
313181ddb3 | ||
|
|
a07c65d173 | ||
|
|
1431cf80e1 | ||
|
|
1aba1f8000 | ||
|
|
76b1e2a007 | ||
|
|
25d5672355 | ||
|
|
f572f5ef5e | ||
|
|
51178ab1b2 | ||
|
|
a9124d0fd2 | ||
|
|
ee4f6ead12 | ||
|
|
5fecdd7830 | ||
|
|
49b78c0cea | ||
|
|
aee782d468 | ||
|
|
ff02219080 | ||
|
|
9c7c796e02 | ||
|
|
843c015d56 | ||
|
|
174329d098 | ||
|
|
0491038b09 | ||
|
|
ac6a4af207 | ||
|
|
106e9112e0 | ||
|
|
c625e95d5e | ||
|
|
580ecfedc1 | ||
|
|
4cc99c6bb8 | ||
|
|
6a764869a0 | ||
|
|
aff335b305 | ||
|
|
93ed7c15bd | ||
|
|
c57974d9ff | ||
|
|
a7f9a98f48 | ||
|
|
c703e45105 | ||
|
|
8376fedb4b | ||
|
|
d0d8815d4a | ||
|
|
fa9fceb75d | ||
|
|
293fd5fae1 | ||
|
|
9b6b337453 | ||
|
|
37cf8ffe72 | ||
|
|
4f9e38930e | ||
|
|
99e99b0e81 | ||
|
|
83630b28bb | ||
|
|
c7009ff6f7 | ||
|
|
c2f513f67e | ||
|
|
37284051dc | ||
|
|
c1315eca90 | ||
|
|
9f9370f72d | ||
|
|
61da0db9c9 | ||
|
|
325a860916 | ||
|
|
a383cfa39a | ||
|
|
d5e1d3fe65 | ||
|
|
f0d79f3af0 | ||
|
|
09ac3e6a9e | ||
|
|
f3c85c1e7a | ||
|
|
505171cf87 | ||
|
|
f9c3747768 | ||
|
|
9648f741b4 | ||
|
|
e493a2b79c | ||
|
|
8698e13fa1 | ||
|
|
452e54fc19 | ||
|
|
4f094c174d | ||
|
|
7c04bb9076 | ||
|
|
8d3fa3c3d7 | ||
|
|
32393c9091 | ||
|
|
35f152c479 | ||
|
|
37b36d38c7 | ||
|
|
1a77891273 | ||
|
|
63893ff575 | ||
|
|
226aacdeac | ||
|
|
a37dbb57d6 | ||
|
|
4fdfa3e008 | ||
|
|
8d510be72e | ||
|
|
72d592a5a6 |
@@ -31,7 +31,7 @@ reagent.dom/dom-node
|
||||
reagent.dom/force-update-all
|
||||
status-im.multiaccounts.create.core/get-new-key-code
|
||||
status-im.ethereum.decode/string
|
||||
status-im.network.ui.views/mainnet?
|
||||
status-im.ui.screens.network.views/mainnet?
|
||||
status-im.data-store.chats/event->string
|
||||
status-im.mailserver.constants/seven-days
|
||||
status-im.mailserver.constants/connection-timeout
|
||||
@@ -65,7 +65,7 @@ mocks.js-dependencies/emoji-picker
|
||||
mocks.js-dependencies/i18n
|
||||
mocks.js-dependencies/qr-code
|
||||
mocks.js-dependencies/svg
|
||||
mocks.js-dependencies/vector-icons
|
||||
mocks.js-dependencies/icons
|
||||
mocks.js-dependencies/webview
|
||||
mocks.js-dependencies/desktop-linking
|
||||
mocks.js-dependencies/desktop-shortcuts
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{:lint-as {status-im.utils.views/defview clojure.core/defn
|
||||
status-im.utils.views/letsubs clojure.core/let
|
||||
reagent.core/with-let clojkure.core/let
|
||||
status-im.utils.fx/defn clj-kondo.lint-as/def-catch-all
|
||||
quo.react/with-deps-check clojure.core/fn
|
||||
quo.previews.preview/list-comp clojure.core/for
|
||||
|
||||
@@ -27,5 +27,5 @@ ENABLE_QUO_PREVIEW=1
|
||||
MAX_IMAGES_BATCH=5
|
||||
APN_TOPIC=im.status.ethereum.pr
|
||||
COMMUNITIES_ENABLED=1
|
||||
COMMUNITIES_MANAGEMENT_ENABLED=1
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
METRICS_ENABLED=0
|
||||
|
||||
@@ -26,6 +26,7 @@ ENABLE_REFERRAL_INVITE=1
|
||||
MAX_IMAGES_BATCH=5
|
||||
APN_TOPIC=im.status.ethereum.pr
|
||||
VERIFY_TRANSACTION_CHAIN_ID=3
|
||||
COMMUNITIES_ENABLED=1
|
||||
COMMUNITIES_MANAGEMENT_ENABLED=0
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
COMMUNITIES_ENABLED=1
|
||||
COMMUNITIES_MANAGEMENT_ENABLED=1
|
||||
METRICS_ENABLED=0
|
||||
|
||||
@@ -26,6 +26,7 @@ APN_TOPIC=im.status.ethereum.pr
|
||||
BLANK_PREVIEW=0
|
||||
MAX_IMAGES_BATCH=5
|
||||
GOOGLE_FREE=0
|
||||
COMMUNITIES_ENABLED=1
|
||||
COMMUNITIES_MANAGEMENT_ENABLED=0
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
COMMUNITIES_ENABLED=1
|
||||
COMMUNITIES_MANAGEMENT_ENABLED=1
|
||||
METRICS_ENABLED=0
|
||||
|
||||
@@ -22,3 +22,4 @@ MAX_IMAGES_BATCH=5
|
||||
BLANK_PREVIEW=0
|
||||
COMMUNITIES_ENABLED=1
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
METRICS_ENABLED=0
|
||||
|
||||
@@ -18,3 +18,4 @@ PARTITIONED_TOPIC=0
|
||||
ENABLE_ROOT_ALERT=1
|
||||
MAX_IMAGES_BATCH=1
|
||||
ENABLE_REFERRAL_INVITE=0
|
||||
METRICS_ENABLED=0
|
||||
|
||||
@@ -8,10 +8,9 @@ These are just guidelines, not rules. Use your best judgment, and feel free to p
|
||||
|
||||
#### What should I know before I get started?
|
||||
|
||||
* [Mission and Core Values](https://status.im/contribute)
|
||||
* [Principles](https://status.im/contribute/our_principles.html)
|
||||
* [Mission and Principles](https://status.im/about)
|
||||
* [Read our FAQ](https://status.im/docs/FAQs.html)
|
||||
* [Join our Chat](http://join.status.im/chat/public/status-core-dev)
|
||||
* [Developer Introduction](https://status.im/developer_tools/)
|
||||
* [Build Status Yourself](https://status.im/build_status)
|
||||
* [Build Status Yourself](https://status.im/technical/build_status)
|
||||
* [Find issues to work on](https://github.com/status-im/)
|
||||
|
||||
@@ -9,46 +9,27 @@ assignees: ''
|
||||
|
||||
# Bug Report
|
||||
|
||||
## Problem
|
||||
|
||||
An overview of the background required to understand the problem.
|
||||
A problem description.
|
||||
## Problem
|
||||
[comment]: # (A problem description)
|
||||
|
||||
|
||||
#### Expected behavior
|
||||
|
||||
[comment]: # (Describe what you expected to happen. Please include designs if possible.)
|
||||
|
||||
#### Actual behavior
|
||||
|
||||
[comment]: # (Describe what actually happened. Please include screenshots if possible.)
|
||||
|
||||
#### Notes
|
||||
|
||||
For the developer who will be investigating. Is it related to another PR? Tips on where to start?
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
Rules for the future PR to be accepted.
|
||||
|
||||
### Reproduction
|
||||
|
||||
[comment]: # (Describe how we can replicate the bug step by step.)
|
||||
|
||||
- Open Status
|
||||
- ...
|
||||
- Step 3, etc.
|
||||
1) Open Status
|
||||
2)
|
||||
|
||||
### Additional Information
|
||||
|
||||
[comment]: # (Please do your best to fill this out.)
|
||||
- Status version: ...
|
||||
[comment]: # (Android or iOS.)
|
||||
- Operating System: <Android|iOS>
|
||||
- Status version: nightly
|
||||
- Operating System: Android, iOS
|
||||
|
||||
#### Logs
|
||||
|
||||
[comment]: # (if on Android please replicate bug whilst running adb logcat)
|
||||
[comment]: # (Please, add logs/notes if necessary)
|
||||
|
||||
```
|
||||
...
|
||||
```
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
---
|
||||
name: Release umbrella issue
|
||||
about: Release Issue
|
||||
title: 'Mobile release '
|
||||
labels: release
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
Issue to manage mobile release <version>
|
||||
|
||||
### Scope
|
||||
[comment]: # (Add milestone from github)
|
||||
https://github.com/status-im/status-react/milestone/
|
||||
|
||||
- release notes:
|
||||
- release branch:
|
||||
|
||||
|
||||
### Testing info
|
||||
[comment]: # (TestRail info, added by QA)
|
||||
Main test suite:
|
||||
Upgrade (e2e):
|
||||
|
||||
### Builds in TestFlight and PlayStore to push as a release
|
||||
[comment]: # (Will be added by QA after testing approving of build)
|
||||
|
||||
### Process
|
||||
#### 1) Kick-off
|
||||
- [ ] 1. Translation PRs is merged before cutting branch (Jinho)
|
||||
- [ ] 2. Prepare scope of visible changes based on commits history, started from previous release branch cut ([example]( https://notes.status.im/1.14-release-notes?view))
|
||||
- [ ] 3. Update [RELEASES.md](https://github.com/status-im/status-react/blob/develop/RELEASES.md) with release notes (make PR based on previous step)
|
||||
- [ ] 4. Create 1.14.0 release branch and get successful builds (doc is [here](https://github.com/status-im/status-react/blob/develop/doc/RELEASE_GUIDE.md) so, testing can be started)
|
||||
- [ ] 5. Based on release scope, ask for comms (Jonny)
|
||||
- [ ] 6. Make sure that assets (screenshots, video) in stores are up to date. If should be updated, ask @cammellos for help
|
||||
|
||||
#### 2) Testing
|
||||
[comment]: # (Section will be maintained by QA)
|
||||
- [ ] Dogfooding (add notes, if it was held)
|
||||
- [ ] Regression testing for release candidate build
|
||||
- [ ] Upgrade tests
|
||||
- [ ] Fix known blocker(s) found during regression testing
|
||||
|
||||
##### Blockers
|
||||
[comment]: # (Section for blocker issues; should be fixed and merged by release-manager. Remove if no blockers found)
|
||||
- [ ] 1 blocker:
|
||||
|
||||
=============================================================================================
|
||||
|
||||
- [ ] Cherry-pick fix(es) to the release branch
|
||||
- [ ] Verify fix(es) on new release candidate build
|
||||
- [ ] Retest
|
||||
- [ ] Keep release build forever (button in Jenkins)
|
||||
|
||||
#### 3) Submission
|
||||
|
||||
- [ ] 1. Release notes written and added (500 character limit for updates (Android) and PR for [RELEASES.md](https://github.com/status-im/status-react/blob/develop/RELEASES.md) is ready to be merged (from 1.3 step)
|
||||
- [ ] 2. Submit beta version for Android (Open Testing in Play Store)
|
||||
- [ ] 3. Submit iOS build to Apple review ([instruction](https://drive.google.com/file/d/10Cl7PBB7TFPkZiVbfzdFGpfMRP9bxXuq/view?usp=sharing), be careful - low quality of audio)
|
||||
- [ ] 4. Play store content reviewed and updated
|
||||
- [ ] 5. Privacy policy reviewed and updated (ask in channel)
|
||||
- [ ] 6. Countries to be excluded (ask in channel)
|
||||
- [ ] 7. Changes to our FAQ made (should be checked and if any changes needed, ask Jakub to made them)
|
||||
- [ ] 8. Prepare PR for F-droid build ([instruction]( https://github.com/status-im/status-react/blob/develop/doc/FDROID.md))
|
||||
|
||||
#### 4) Before publishing
|
||||
- [ ] 1. Translations for comms available (marketing, ask in the channel)
|
||||
- [ ] 2. Promotional content ready (marketing, ask in channel)
|
||||
- [ ] 3. Upload builds for DO store, https://dev.status.im/ (Jakub)
|
||||
|
||||
#### 5) At time of publishing
|
||||
- [ ] 1. Notify marketing to push comms and blog post (Jonny)
|
||||
- [ ] 2. Publish release to app store and playstore
|
||||
- [ ] 3. Final push to update prod site https://status.im/, [instructions](https://github.com/status-im/infra-docs/blob/master/articles/status_release_upload.md) (Jakub - requires credentials to upload)
|
||||
- [ ] 4. Add the link to the post about the release and publish the release: https://github.com/status-im/status-react/releases (Jakub)
|
||||
- [ ] 5. Merge PR for updating [RELEASES.md](https://github.com/status-im/status-react/blob/develop/RELEASES.md) (from 1.3 step)
|
||||
|
||||
@@ -156,12 +156,31 @@ keystore: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
|
||||
keystore: ##@prepare Generate a Keystore for signing Android APKs
|
||||
@./scripts/generate-keystore.sh
|
||||
|
||||
fdroid-max-watches: SHELL := /bin/sh
|
||||
fdroid-max-watches: ##@prepare Bump max_user_watches to avoid ENOSPC errors
|
||||
sysctl fs.inotify.max_user_watches=524288
|
||||
|
||||
fdroid-nix-dir: SHELL := /bin/sh
|
||||
fdroid-nix-dir: ##@prepare Create /nix directory for F-Droid Vagrant builders
|
||||
mkdir -m 0755 /nix
|
||||
chown vagrant /nix
|
||||
|
||||
fdroid-fix-tmp: SHELL := /bin/sh
|
||||
fdroid-fix-tmp: ##@prepare Fix TMPDIR permissions so Vagrant user is the owner
|
||||
chown -R vagrant "$(TMPDIR)"
|
||||
|
||||
fdroid-build-env: fdroid-max-watches fdroid-nix-dir fdroid-fix-tmp ##@prepare Setup build environment for F-Droud build
|
||||
|
||||
xcode-clean: SHELL := /bin/sh
|
||||
xcode-clean: XCODE_HOME := $(HOME)/Library/Developer/Xcode
|
||||
xcode-clean: ##@prepare Clean XCode derived data and archives
|
||||
rm -fr $(XCODE_HOME)/DerivedData/StatusIm-* $(XCODE_HOME)/Archives/*/StatusIm*
|
||||
|
||||
#----------------
|
||||
# Release builds
|
||||
#----------------
|
||||
release: release-android release-ios ##@build build release for Android and iOS
|
||||
release: release-android release-ios ##@build Build release for Android and iOS
|
||||
|
||||
release-android: export TARGET := default
|
||||
release-android: export BUILD_ENV ?= prod
|
||||
release-android: export BUILD_TYPE ?= nightly
|
||||
release-android: export BUILD_NUMBER ?= $(TMP_BUILD_NUMBER)
|
||||
@@ -169,12 +188,21 @@ release-android: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
|
||||
release-android: export ANDROID_APK_SIGNED ?= true
|
||||
release-android: export ANDROID_ABI_SPLIT ?= false
|
||||
release-android: export ANDROID_ABI_INCLUDE ?= armeabi-v7a;arm64-v8a;x86
|
||||
release-android: keystore ##@build build release for Android
|
||||
release-android: keystore ##@build Build release for Android
|
||||
scripts/release-android.sh
|
||||
|
||||
release-fdroid: export BUILD_ENV = prod
|
||||
release-fdroid: export BUILD_TYPE = release
|
||||
release-fdroid: export ANDROID_APK_SIGNED = false
|
||||
release-fdroid: export ANDROID_ABI_SPLIT = false
|
||||
release-fdroid: export ANDROID_ABI_INCLUDE = armeabi-v7a;arm64-v8a;x86;x86_64
|
||||
release-fdroid: ##@build Build release for F-Droid
|
||||
echo "GOOGLE_FREE=1" >> .env.release
|
||||
scripts/release-android.sh
|
||||
|
||||
release-ios: export TARGET := ios
|
||||
release-ios: export BUILD_ENV ?= prod
|
||||
release-ios: watchman-clean ##@build build release for iOS release
|
||||
release-ios: watchman-clean ##@build Build release for iOS release
|
||||
@git clean -dxf -f target/ios && \
|
||||
$(MAKE) jsbundle-ios && \
|
||||
xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration Release -destination 'generic/platform=iOS' -UseModernBuildSystem=N clean archive
|
||||
@@ -241,15 +269,12 @@ endif
|
||||
lint: export TARGET := clojure
|
||||
lint: ##@test Run code style checks
|
||||
yarn clj-kondo --confg .clj-kondo/config.edn --lint src && \
|
||||
clojure -Sdeps '{:deps {cljfmt {:mvn/version "0.6.7"}}}' \
|
||||
-m cljfmt.main check $$(git diff --diff-filter=d --cached --name-only src && echo src) \
|
||||
--indents indentation.edn
|
||||
TARGETS=$$(git diff --diff-filter=d --cached --name-only src && echo src) && \
|
||||
clojure -Scp "$$CLASS_PATH" -m cljfmt.main check --indents indentation.edn $$TARGETS
|
||||
|
||||
lint-fix: export TARGET := clojure
|
||||
lint-fix: ##@test Run code style checks and fix issues
|
||||
clojure -Sdeps '{:deps {cljfmt {:mvn/version "0.6.7"}}}' \
|
||||
-m cljfmt.main fix src \
|
||||
--indents indentation.edn
|
||||
clojure -Scp "$$CLASS_PATH" -m cljfmt.main fix src --indents indentation.edn
|
||||
|
||||
test: export TARGET := clojure
|
||||
test: ##@test Run tests once in NodeJS
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
|
||||
# Status - a Mobile Ethereum Operating System
|
||||
|
||||
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="80"/>](https://play.google.com/store/apps/details?id=im.status.ethereum)
|
||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" alt="Get it on F-Droid" height="80"/>](https://f-droid.org/packages/im.status.ethereum/)
|
||||
[<img src="doc/github_badge.png" alt="Get it on Github" height="80"/>](https://github.com/status-im/status-react/releases)
|
||||
|
||||
Join us in creating a browser, messenger, and gateway to a decentralized world. Status is a free (libre) open source mobile client targeting Android & iOS built entirely on [Ethereum](https://ethereum.org/) technologies. That's right, no middle men and `go-ethereum` running directly on your device.
|
||||
|
||||
[](https://www.youtube.com/watch?v=oDCSEmS9c3o "Getting started with Status")
|
||||
@@ -24,7 +27,7 @@ Developers are the heart of software and to keep Status beating we need all the
|
||||
Want to learn more about it? Start by reading our [Developer Introduction](https://status.im/developer_tools/) which guides you through the technology stack and start browsing [beginner issues](https://github.com/status-im/status-react/issues?utf8=%E2%9C%93&q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20). Then you can read how to [Build Status](https://status.im/technical/build_status/), which talks about managing project dependencies, coding guidelines and testing procedures.
|
||||
|
||||
- **Community Management**
|
||||
Metcalfe's law states that the value of a network is proportional to the square of the number of connected users of the system - without community Status is meaningless. We're looking to create a positive, fun environment to explore new ideas, experiment and grow the Status community. Building a community takes a lot of work but the people you'll meet and long lasting relationships you form will be well worth it, check out our [Community Principles](https://status.im/contribute/our_principles.html)
|
||||
Metcalfe's law states that the value of a network is proportional to the square of the number of connected users of the system - without community Status is meaningless. We're looking to create a positive, fun environment to explore new ideas, experiment and grow the Status community. Building a community takes a lot of work but the people you'll meet and long lasting relationships you form will be well worth it, check out our [Mission and Community Principles](https://status.im/about)
|
||||
|
||||
- **Specification / Documentation**
|
||||
John Dewey once said "Education is not preparation for life; education is life *itself* ". Developers & Designers need guidance and it all starts from documentation and specifications. Our software is only as good as its documentation, head over to our [docs](https://status.im/docs) and see how you can improve what we have.
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
# Description
|
||||
|
||||
This document explains some of the steps that are involved in relseases.
|
||||
|
||||
## PlayStore Metadata Updates
|
||||
|
||||
You can update Play Store releae metadata using `fastlane android upload_metadata`.
|
||||
|
||||
But that requires credentials necessary for accessing Play Store API. The simpler way is to edit files contained within [`fastlane/metadata`](metadata) and run the following CI job:
|
||||
|
||||
https://ci.status.im/job/status-tools/job/update-playstore-metadata/
|
||||
@@ -1,3 +1,147 @@
|
||||
## 1.14
|
||||
|
||||
### For iOS and Android
|
||||
### Features
|
||||
|
||||
- Highlight posts that mention you ([details](https://github.com/status-im/status-react/pull/12146))
|
||||
- Remove PUK and Pairing Code screen from Keycard onboarding
|
||||
[details](https://github.com/status-im/status-react/pull/12155))
|
||||
- Added unread messages count for messages with mentions in public chats ([details](https://github.com/status-im/status-react/pull/12152))
|
||||
- Sync history setting allowing to sync chat history up to 1 month ([details](https://github.com/status-im/status-react/pull/12166))
|
||||
|
||||
|
||||
### Improvements
|
||||
|
||||
- "My profile" button for simplification of finding own public key ([details](https://github.com/status-im/status-react/pull/12044))
|
||||
- Factory reset option is available on account creation and recovery flows ([details](https://github.com/status-im/status-react/pull/12055))
|
||||
- Allow the creation of recovery/backup Keycard from the login interface ([details](https://github.com/status-im/status-react/pull/12115))
|
||||
- Reset blocked and/or frozen Keycards ([details](https://github.com/status-im/status-react/pull/12127))
|
||||
- Show cached balance ([details](https://github.com/status-im/status-react/pull/12134))
|
||||
|
||||
|
||||
### Bugfixes
|
||||
|
||||
- Pending transactions are stored in the database and shown on history screen after re-login ([details](https://github.com/status-im/status-react/pull/12032))
|
||||
- Multiple fixes for keycard
|
||||
- Fixes for resolving ENS name from chat key ([details](https://github.com/status-im/status-react/pull/12100))
|
||||
|
||||
|
||||
## 1.13
|
||||
|
||||
### For iOS and Android
|
||||
### Features
|
||||
|
||||
- New activity manager https://github.com/status-im/status-react/issues/11958
|
||||
New chats and group chat invitation will appear in a new section, the activity center, where a user will be able to accept or decline the request.
|
||||
https://www.figma.com/file/r59kCQxl6tlC0dHkcAJOpP/Action-center-MVP---Mobile?node-id=2%3A8012 (not fully implemented)
|
||||
|
||||
- Receive messages from contacts only option
|
||||
Under privacy in settings a user will be able to select whether they want to receive messages and group chat invitations from contacts only.
|
||||
|
||||
- Added delivered confirmation for private groups
|
||||
Messages sent to private groups will now be marked as confirmed if at least one of the members received it.
|
||||
|
||||
- New keycard functionalities: reset a keycard, changing PUK of a card, changing pairing code, create a new keycard backup card.
|
||||
|
||||
|
||||
### Improvements
|
||||
|
||||
- Improved UI for starting a new private chat
|
||||
|
||||
|
||||
### Bugfixes
|
||||
|
||||
- Fixed issue with crypto on ramp and requiring camera access
|
||||
- Removed Wyre from list of services in buy crypto feature
|
||||
- Added support for SOCKS token
|
||||
|
||||
|
||||
|
||||
## 1.12
|
||||
### iOS
|
||||
#### Excerpt
|
||||
V1.12 Release - Keycard on iOS, Crypto Onramps, and More
|
||||
|
||||
Keycard can now be used on iOS devices for hardware enforced security to your keys and accounts! Status v1.12 also introduces simpler access to obtaining crypto via onramps providers as well as some key updates to the messaging experience
|
||||
|
||||
##### Added
|
||||
Keycard iOS integration
|
||||
Link previews for our.status.im and medium.om
|
||||
List of Crypto onramps
|
||||
Add “delivered” message confirmations to 1:1 messages
|
||||
Keycard banner on login screen
|
||||
|
||||
#### Fixed
|
||||
UI issue showing up a chat on a paired device when it should not
|
||||
UI issue was showing messages as pending if no one is part of the group chat*
|
||||
Push notification is generated on paired account when you send message to 1-1
|
||||
UI issue for wrong notification when using two paired devices with same accounts
|
||||
Improve keycard login time
|
||||
|
||||
### Android
|
||||
#### Excerpt
|
||||
V1.12 Release - Crypto Onramps and Improved Messaging
|
||||
|
||||
Status v1.12 introduces simpler access to obtaining crypto via onramp providers as well as some key updates to the messaging experience including delivered message confirmations in 1:1 private chats
|
||||
|
||||
##### Added
|
||||
Link previews for our.status.im and medium.om
|
||||
List of Crypto onramps
|
||||
Add “delivered” message confirmations to 1:1 messages
|
||||
Keycard banner on login screen
|
||||
Local notifications for Mentions
|
||||
|
||||
#### Fixed
|
||||
UI issue showing up a chat on a paired device when it should not
|
||||
UI issue was showing messages as pending if no one is part of the group chat*
|
||||
Push notification is generated on paired account when you send message to 1-1
|
||||
UI issue for wrong notification when using two paired devices with same accounts
|
||||
Improve keycard login time
|
||||
|
||||
## 1.11
|
||||
### iOS
|
||||
#### Excerpt
|
||||
V1.11 also makes some improvements to the overall Status experience. Improved compatibility with DApps creates a more seamless experience with your favorite DeFi, NFT, and other decentralized applications. Improvements to Status Nodes and fixes to Android notifications have been made for better performance with private, group chats and public chats.
|
||||
|
||||
Update in the App Store or Google Play if you do not have auto updates enabled.
|
||||
|
||||
For the full changelog, see Github https://github.com/status-im/status-react/milestone/49?closed=1
|
||||
|
||||
#### Added
|
||||
- Add Giphy url support in chat
|
||||
- The Graph (GRT) erc-20 token added to the default list
|
||||
|
||||
#### Changed
|
||||
- Improved compatibility with DApps
|
||||
- Sync with Status Nodes improvements
|
||||
|
||||
#### Fixed
|
||||
- Fixes to Android notifications
|
||||
- UI fixes
|
||||
- Sluggish performance on private group chats bug
|
||||
|
||||
### Android
|
||||
#### Excerpt
|
||||
V1.11 also makes some improvements to the overall Status experience. Improved compatibility with DApps creates a more seamless experience with your favorite DeFi, NFT, and other decentralized applications. Improvements to Status Nodes and fixes to Android notifications have been made for better performance with private, group chats and public chats.
|
||||
|
||||
Update in the App Store or Google Play if you do not have auto updates enabled.
|
||||
|
||||
For the full changelog, see Github https://github.com/status-im/status-react/milestone/49?closed=1
|
||||
|
||||
#### Added
|
||||
- Migrate existing account to Keycard
|
||||
- Add Giphy url support in chat
|
||||
- The Graph (GRT) erc-20 token added to the default list
|
||||
|
||||
#### Changed
|
||||
- Improved compatibility with DApps
|
||||
- Sync with Status Nodes improvements
|
||||
|
||||
#### Fixed
|
||||
- Fixes to Android notifications
|
||||
- UI fixes
|
||||
- Sluggish performance on private group chats bug
|
||||
|
||||
## 1.10
|
||||
### iOS
|
||||
#### Excerpt
|
||||
|
||||
@@ -327,6 +327,14 @@ dependencies {
|
||||
implementation jscFlavor
|
||||
}
|
||||
|
||||
if (googleFree) {
|
||||
implementation(project(':react-native-device-info')) {
|
||||
exclude group: 'com.google.firebase'
|
||||
exclude group: 'com.google.android.gms'
|
||||
exclude group: 'com.android.installreferrer'
|
||||
}
|
||||
}
|
||||
|
||||
// react-native-screens
|
||||
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
|
||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
|
||||
|
||||
@@ -71,7 +71,6 @@
|
||||
</activity>
|
||||
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>
|
||||
<service android:name="im.status.ethereum.pushnotifications.ForegroundService"></service>
|
||||
<service android:name="im.status.ethereum.module.LocalNotificationsService" />
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.provider"
|
||||
|
||||
@@ -26,14 +26,14 @@ import com.facebook.react.ReactRootView;
|
||||
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
|
||||
|
||||
import com.facebook.react.ReactFragmentActivity;
|
||||
import com.facebook.react.ReactActivity;
|
||||
import com.reactnativenavigation.NavigationActivity;
|
||||
import com.facebook.react.modules.core.PermissionListener;
|
||||
import org.devio.rn.splashscreen.SplashScreen;
|
||||
|
||||
import java.util.Properties;
|
||||
import im.status.ethereum.module.StatusThreadPoolExecutor;
|
||||
|
||||
public class MainActivity extends ReactFragmentActivity
|
||||
public class MainActivity extends NavigationActivity
|
||||
implements ActivityCompat.OnRequestPermissionsResultCallback{
|
||||
|
||||
|
||||
@@ -178,14 +178,7 @@ public class MainActivity extends ReactFragmentActivity
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the main component registered from JavaScript.
|
||||
* This is used to schedule rendering of the component.
|
||||
*/
|
||||
@Override
|
||||
protected String getMainComponentName() {
|
||||
return "StatusIm";
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
@@ -242,14 +235,4 @@ public class MainActivity extends ReactFragmentActivity
|
||||
mPermissionListener = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ReactActivityDelegate createReactActivityDelegate() {
|
||||
return new ReactActivityDelegate(this, getMainComponentName()) {
|
||||
@Override
|
||||
protected ReactRootView createRootView() {
|
||||
return new RNGestureHandlerEnabledRootView(MainActivity.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,8 +10,9 @@ import com.facebook.react.PackageList;
|
||||
import com.aakashns.reactnativedialogs.ReactNativeDialogsPackage;
|
||||
import com.facebook.react.ReactApplication;
|
||||
import com.facebook.react.ReactNativeHost;
|
||||
import com.reactnativenavigation.NavigationApplication;
|
||||
import com.reactnativenavigation.react.NavigationReactNativeHost;
|
||||
import com.facebook.react.ReactPackage;
|
||||
import com.facebook.soloader.SoLoader;
|
||||
import com.facebook.react.ReactInstanceManager;
|
||||
|
||||
import java.util.List;
|
||||
@@ -20,9 +21,9 @@ import im.status.ethereum.keycard.RNStatusKeycardPackage;
|
||||
import im.status.ethereum.module.StatusPackage;
|
||||
import im.status.ethereum.pushnotifications.PushNotificationPackage;
|
||||
|
||||
public class MainApplication extends MultiDexApplication implements ReactApplication {
|
||||
public class MainApplication extends NavigationApplication {
|
||||
|
||||
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
|
||||
private final ReactNativeHost mReactNativeHost = new NavigationReactNativeHost(this) {
|
||||
@Override
|
||||
public boolean getUseDeveloperSupport() {
|
||||
return BuildConfig.DEBUG;
|
||||
@@ -54,7 +55,7 @@ public class MainApplication extends MultiDexApplication implements ReactApplica
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
SoLoader.init(this, /* native exopackage */ false);
|
||||
|
||||
WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG_WEBVIEW == "1");
|
||||
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
* Project-wide gradle configuration properties for use by all modules
|
||||
*/
|
||||
ext {
|
||||
RNNKotlinVersion = "1.4.31"
|
||||
buildToolsVersion = project.buildToolsVersion
|
||||
minSdkVersion = Integer.valueOf(project.minSdkVersion)
|
||||
compileSdkVersion = Integer.valueOf(project.compileSdkVersion)
|
||||
@@ -19,6 +20,7 @@ buildscript {
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.31"
|
||||
classpath "com.android.tools.build:gradle:${project.ext.gradlePluginVersion}"
|
||||
// WARNING: Do not place your application dependencies here!
|
||||
// They belong in the individual module build.gradle files.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
library 'status-jenkins-lib@v1.2.18'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
@@ -6,7 +6,7 @@ pipeline {
|
||||
options {
|
||||
timestamps()
|
||||
/* Prevent Jenkins jobs from running forever */
|
||||
timeout(time: 20, unit: 'MINUTES')
|
||||
timeout(time: 30, unit: 'MINUTES')
|
||||
/* Limit builds retained */
|
||||
buildDiscarder(logRotator(
|
||||
numToKeepStr: '10',
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
library 'status-jenkins-lib@v1.2.18'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
@@ -26,7 +26,7 @@ pipeline {
|
||||
booleanParam(
|
||||
name: 'PUBLISH',
|
||||
description: 'Trigger publishing of build results for nightly or release.',
|
||||
defaultValue: params.PUBLISH ?: false,
|
||||
defaultValue: getPublishDefault(params.PUBLISH),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -41,13 +41,13 @@ pipeline {
|
||||
stage('Build') {
|
||||
parallel {
|
||||
stage('iOS') { steps { script {
|
||||
ios = jenkins.Build('status-react/combined/mobile-ios')
|
||||
ios = jenkins.Build('status-react/platforms/ios')
|
||||
} } }
|
||||
stage('Android') { steps { script {
|
||||
apk = jenkins.Build('status-react/combined/mobile-android')
|
||||
apk = jenkins.Build('status-react/platforms/android')
|
||||
} } }
|
||||
stage('Android e2e') { steps { script {
|
||||
apke2e = jenkins.Build('status-react/combined/mobile-android-e2e')
|
||||
apke2e = jenkins.Build('status-react/platforms/android-e2e')
|
||||
} } }
|
||||
}
|
||||
}
|
||||
@@ -88,16 +88,16 @@ pipeline {
|
||||
case 'nightly':
|
||||
/* Create JSON file with newest build URLs */
|
||||
s3.updateBucketJSON(urls, 'latest.json');
|
||||
build(job: 'misc/status.im', wait: false);
|
||||
build(job: 'website/status.im', wait: false);
|
||||
break;
|
||||
case 'release':
|
||||
github.publishReleaseMobile();
|
||||
github.publishReleaseFiles(repo: 'status-react');
|
||||
break;
|
||||
}
|
||||
} }
|
||||
}
|
||||
stage('Run e2e') {
|
||||
when { expression { btype == 'nightly' } }
|
||||
when { expression { btype == 'nightly' && params.PUBLISH } }
|
||||
steps { script {
|
||||
e2eApk = utils.getEnv(apke2e, 'SAUCE_URL')
|
||||
build(
|
||||
@@ -120,3 +120,13 @@ def List genChoices(String previousChoice, List defaultChoices) {
|
||||
choices.add(0, previousChoice)
|
||||
return choices
|
||||
}
|
||||
|
||||
/* Helper that makes PUBLISH default to 'false' unless:
|
||||
* - The build is for a release branch
|
||||
* - A user explicitly specified a value
|
||||
* Since release builds create and re-create GitHub drafts every time. */
|
||||
def Boolean getPublishDefault(Boolean previousValue) {
|
||||
if (env.JOB_NAME.startsWith('status-react/release')) { return true }
|
||||
if (previousValue != null) { return previousValue }
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
library 'status-jenkins-lib@v1.2.18'
|
||||
|
||||
pipeline {
|
||||
agent { label 'macos-xcode-12.3' }
|
||||
agent { label 'macos-xcode-12.5' }
|
||||
|
||||
parameters {
|
||||
string(
|
||||
|
||||
@@ -1,16 +1,26 @@
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
library 'status-jenkins-lib@v1.2.18'
|
||||
|
||||
pipeline {
|
||||
agent { label params.AGENT_LABEL }
|
||||
|
||||
parameters {
|
||||
string(
|
||||
name: 'NIX_CACHE_HOST',
|
||||
description: 'FQDN of Nix binary cache host.',
|
||||
defaultValue: params.NIX_CACHE_HOST ?: 'cache-01.do-ams3.nix.ci.statusim.net'
|
||||
)
|
||||
string(
|
||||
name: 'NIX_CACHE_USER',
|
||||
description: 'Username for Nix binary cache host.',
|
||||
defaultValue: params.NIX_CACHE_USER ?: 'nix-cache'
|
||||
)
|
||||
}
|
||||
|
||||
environment {
|
||||
/* See nix/README.md */
|
||||
NIX_IGNORE_SYMLINK_STORE = 1
|
||||
/* we source .bash_profile to be able to use nix-store */
|
||||
NIX_SSHOPTS = "-o StrictHostKeyChecking=no source .bash_profile;"
|
||||
/* where our /nix/store is hosted */
|
||||
NIX_CACHE_USER = 'nix-cache'
|
||||
NIX_CACHE_HOST = 'master-01.do-ams3.ci.misc.statusim.net'
|
||||
NIX_SSHOPTS = "-o StrictHostKeyChecking=no source .profile;"
|
||||
NIX_CONF_DIR = "${env.WORKSPACE}/nix"
|
||||
}
|
||||
|
||||
@@ -29,7 +39,7 @@ pipeline {
|
||||
stages {
|
||||
stage('Setup') {
|
||||
steps { script {
|
||||
nix.shell('nix-env -i openssh', pure: false)
|
||||
nix.shell('nix-env -i openssh', sandbox: false, pure: false)
|
||||
/* some build targets don't build on MacOS */
|
||||
uname = sh(script: 'uname', returnStdout: true)
|
||||
} }
|
||||
@@ -88,7 +98,8 @@ pipeline {
|
||||
nix.shell("""
|
||||
find /nix/store/ -mindepth 1 -maxdepth 1 -type d \
|
||||
-not -name '*.links' -and -not -name '*-status-react-*' \
|
||||
| xargs nix-copy-closure -v --to ${NIX_CACHE_USER}@${NIX_CACHE_HOST}
|
||||
| xargs nix-copy-closure -v \
|
||||
--to ${params.NIX_CACHE_USER}@${params.NIX_CACHE_HOST}
|
||||
""",
|
||||
pure: false
|
||||
)
|
||||
|
||||
@@ -6,11 +6,11 @@ This folder contains files defininf [Jenkins pipelines](https://jenkins.io/doc/b
|
||||
|
||||
All `Jenkinsfile`s contain the following line:
|
||||
```groovy
|
||||
library 'status-react-jenkins@master'
|
||||
library 'status-jenkins-lib@master'
|
||||
```
|
||||
|
||||
Which loads the used methods - like `nix.shell()` - from a separate private repo:
|
||||
|
||||
https://github.com/status-im/status-react-jenkins
|
||||
https://github.com/status-im/status-jenkins-lib
|
||||
|
||||
This is done to improve security of our CI setup.
|
||||
|
||||
@@ -62,7 +62,7 @@ pipeline {
|
||||
|
||||
withCredentials([
|
||||
usernamePassword(
|
||||
credentialsId: 'status-im-auto-token',
|
||||
credentialsId: 'status-im-auto',
|
||||
usernameVariable: 'GIT_HUB_USER', /* ignored */
|
||||
passwordVariable: 'GIT_HUB_TOKEN'
|
||||
),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
library 'status-jenkins-lib@v1.2.18'
|
||||
|
||||
pipeline {
|
||||
agent { label 'macos' }
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
|
||||
environment {
|
||||
LANG = 'en_US.UTF-8'
|
||||
LANGUAGE = 'en_US.UTF-8'
|
||||
LC_ALL = 'en_US.UTF-8'
|
||||
TARGET = 'ios'
|
||||
FASTLANE_DISABLE_COLORS = 1
|
||||
/* See nix/README.md */
|
||||
NIX_IGNORE_SYMLINK_STORE = 1
|
||||
/* avoid writing to r/o /nix */
|
||||
GEM_HOME = '~/.rubygems'
|
||||
}
|
||||
|
||||
options {
|
||||
timestamps()
|
||||
/* Disable concurrent jobs */
|
||||
disableConcurrentBuilds()
|
||||
/* Prevent Jenkins jobs from running forever */
|
||||
timeout(time: 5, unit: 'MINUTES')
|
||||
/* Don't keep more than 50 builds */
|
||||
buildDiscarder(logRotator(numToKeepStr: '50'))
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Prep') {
|
||||
steps { script {
|
||||
nix.shell(
|
||||
'bundle install --gemfile=fastlane/Gemfile',
|
||||
attr: 'shells.fastlane',
|
||||
)
|
||||
} }
|
||||
}
|
||||
stage('Play Store Update'){
|
||||
steps { script {
|
||||
withCredentials([
|
||||
string(
|
||||
credentialsId: 'SUPPLY_JSON_KEY_DATA',
|
||||
variable: 'GOOGLE_PLAY_JSON_KEY'
|
||||
),
|
||||
]) {
|
||||
nix.shell(
|
||||
'bundle exec --gemfile=fastlane/Gemfile fastlane android upload_metadata',
|
||||
keepEnv: ['FASTLANE_DISABLE_COLORS', 'GOOGLE_PLAY_JSON_KEY'],
|
||||
attr: 'shells.fastlane',
|
||||
pure: false
|
||||
)
|
||||
}
|
||||
} }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* This job runs daily and executes `pod repo update` on MacOS
|
||||
* This is done to avoid issues with out of date repo causing errors like:
|
||||
*
|
||||
* Failed with exit code 1 (in target 'StatusImPR' from project 'StatusIm')
|
||||
**/
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
label params.HOST_LABEL
|
||||
}
|
||||
|
||||
triggers {
|
||||
/* Run daily at 2am */
|
||||
cron('H 2 * * *')
|
||||
}
|
||||
options {
|
||||
timestamps()
|
||||
/* Prevent Jenkins jobs from running forever */
|
||||
timeout(time: 5, unit: 'MINUTES')
|
||||
/* Limit builds retained */
|
||||
buildDiscarder(logRotator(
|
||||
numToKeepStr: '20',
|
||||
))
|
||||
}
|
||||
|
||||
parameters {
|
||||
string(
|
||||
name: 'HOST_LABEL',
|
||||
description: 'Label of host to run on',
|
||||
/* Using startTimeInMillis to randomize which host gets the update. */
|
||||
defaultValue: "macos-0${(currentBuild.startTimeInMillis % 3) + 1}",
|
||||
)
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Update') {
|
||||
steps {
|
||||
sh 'pod repo update'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,8 @@ The app builds defined this way run on servers that generate the unsigned APKs u
|
||||
|
||||
First release of Status app was merged in [fdroid/fdroiddata#7179](https://gitlab.com/fdroid/fdroiddata/-/merge_requests/7179).
|
||||
|
||||
:warning: __WARNING__: Once changes are commited into `fdroiddata` repo they __cannot be changed__.
|
||||
|
||||
# Adding New Versions
|
||||
|
||||
You can find our configuration file at [`metadata/im.status.ethereum.yml`](https://gitlab.com/fdroid/fdroiddata/-/blob/master/metadata/im.status.ethereum.yml)
|
||||
@@ -17,31 +19,31 @@ You can find our configuration file at [`metadata/im.status.ethereum.yml`](https
|
||||
The file defines all the necessary metadata like `SourceCode`, `Website`, or `License`, but the most important key is `Builds`, which looks like this:
|
||||
```yml
|
||||
Builds:
|
||||
- versionName: 1.4.1
|
||||
versionCode: 2020070112
|
||||
- versionName: 1.12.0
|
||||
versionCode: 2021022512
|
||||
commit: cfb825a11b61d312af8cb5d36686af540c31f481
|
||||
sudo:
|
||||
- mkdir -m 0755 /nix
|
||||
- chown vagrant /nix
|
||||
init: ./nix/scripts/setup.sh
|
||||
output: ./result/app-release-unsigned.apk
|
||||
- cd build/im.status.ethereum
|
||||
- make fdroid-build-env
|
||||
init: nix/scripts/setup.sh
|
||||
output: result/app-release-unsigned.apk
|
||||
scanignore:
|
||||
- android/build.gradle
|
||||
scandelete:
|
||||
- ios
|
||||
build: make release-android BUILD_TYPE=release BUILD_NUMBER=2020070112 ANDROID_APK_SIGNED=false
|
||||
build: make release-fdroid BUILD_NUMBER=$$VERCODE$$
|
||||
```
|
||||
It contains a list of objects defining each release of the application. In order to add a new release simply copy a previous release object and adjust the following values:
|
||||
|
||||
* `versionName` - String version like `1.4.1`
|
||||
* `versionCode` - Android `versionCode`. We use a timestamp generated by [a script](../scripts/version/gen_build_no.sh)
|
||||
* `commit` - Specific commit SHA1 from which the given release was built
|
||||
* `BUILD_NUMBER` in `build` step - Same value as `versionCode`
|
||||
* `versionName` - String version like `1.12.0`.
|
||||
* `versionCode` - Android `versionCode`. Normally it is generated from timestamp at build time.
|
||||
* `commit` - Specific commit SHA1 from which the given release was built.
|
||||
|
||||
The `versionCode` should be the same as the one in build that was uplodade to Play Store. It can be found in the build logs or by using:
|
||||
The `versionCode` should be the same as the one in build that was uploaded to Play Store.
|
||||
It can be found in the build logs or by using:
|
||||
```
|
||||
> apkanalyzer manifest version-code StatusIm-v1.4.1.apk
|
||||
2020070112
|
||||
> apkanalyzer manifest version-code StatusIm-Mobile-v1.12.0.apk
|
||||
2021022512
|
||||
```
|
||||
|
||||
At the bottom of the file you should also update the following keys:
|
||||
@@ -51,6 +53,8 @@ At the bottom of the file you should also update the following keys:
|
||||
|
||||
Then submit a merge request to the [fdroid/fdroiddata](https://gitlab.com/fdroid/fdroiddata) repository.
|
||||
|
||||
:warning: __WARNING__: Currently GitLab PR builds will fail due to running as `root` instead of `vagrant` and failing to install Nix.
|
||||
|
||||
# Checking Builds
|
||||
|
||||
The simplest way to test if the app builds via F-Droid is to use the Docker image:
|
||||
@@ -71,24 +75,39 @@ Build it using:
|
||||
```
|
||||
docker build --build-arg=BUILDER_UID=$UID -t statusteam/docker-executable-fdroidserver:latest .
|
||||
```
|
||||
Then clone the [fdroiddata](https://gitlab.com/fdroid/fdroiddata) and [fdroidserver](https://gitlab.com/fdroid/fdroidserver) repos and use it to test the build of a specific Status Android app version: `1.4.1`
|
||||
Then clone the [fdroiddata](https://gitlab.com/fdroid/fdroiddata) and [fdroidserver](https://gitlab.com/fdroid/fdroidserver) repos and use it to test the build of a specific Status Android app version: `1.12.0`
|
||||
```
|
||||
git clone https://gitlab.com/fdroid/fdroidserver
|
||||
git clone https://gitlab.com/fdroid/fdroiddata
|
||||
docker run --rm \
|
||||
-u $UID:$GID \
|
||||
-v $(pwd)/nix:/nix \
|
||||
-v $(pwd)/fdroiddata:/repo \
|
||||
-v $(pwd)/fdroidserver:/fdroidserver \
|
||||
-u $UID:$GID -e USER=vagrant \
|
||||
-v $PWD/fdroiddata:/repo \
|
||||
-v $PWD/fdroidserver:/fdroidserver \
|
||||
statusteam/docker-executable-fdroidserver:latest \
|
||||
build im.status.ethereum:1.4.1
|
||||
build im.status.ethereum
|
||||
```
|
||||
We have to create a user and specify the UID because Nix cannot run as `root` and that is the default user for the F-Droid Docker image. By adding our own user and setting the UID we also make it possible to mount folders like `fdroiddata` and `fdroidserver`.
|
||||
|
||||
You can specify a `--vebose` flag for `build` command for additional information.
|
||||
You can specify a `--verbose` flag for `build` command for additional information.
|
||||
You can provide `--storage-opt size=30G` flag if Docker complains about running out of space.
|
||||
|
||||
You should also run `lint im.status.ethereum` to verify the YAML format is correct.
|
||||
You should also run `lint` and `rewritemeta` for the App ID to verify and fix the YAML metadata formatting.
|
||||
|
||||
# Details
|
||||
|
||||
The original research was done in [#8512](https://github.com/status-im/status-react/issues/8512).
|
||||
|
||||
Normally F-Droid server wants to run Gradle itself, but we do not specify the `gradle` key in order to run `make release-android` ourselves in `build` step.
|
||||
Normally F-Droid server wants to run Gradle itself, but we do not specify the `gradle` key in order to run `make release-fdroid` ourselves in `build` step. We also add `android/build.gradle` to `scanignore` to avoid F-Droid trying to use Gradle directly.
|
||||
|
||||
Once the PR is merged it may take a few days for the F-Droid server farm to build and deploy the new version to their site and app. You can look up the current state of builds [here](https://f-droid.org/wiki/index.php?title=Special:RecentChanges&days=7&from=&hidebots=0&hideanons=1&hideliu=1&limit=500) and look for your App ID and a `deploy` change after it.
|
||||
|
||||
# F-Droid Build
|
||||
|
||||
F-Droid requires submitted applications to be free of non Open Source software. For this reason we need to exclude certain Google libraries at build time.
|
||||
|
||||
This is achieved by setting `GOOGLE_FREE=1` in the `.env.release` file. This affects two things:
|
||||
|
||||
1. [Clojure code conditional](../src/status_im/acquisition/core.cljs) which stops use of `get-referrer`.
|
||||
2. [Gradle build configuration](../android/app/build.gradle) by excluding Google libraries.
|
||||
|
||||
Both are affected by the `.env` file and both are required.
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
# Using IntelliJ IDEA and Cursive
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Install Cursive](#install-cursive)
|
||||
- [Getting Cursive to understand `status-react`](#getting-cursive-to-understand-status-react)
|
||||
- [I get a lot of `cannot be resolved`](#i-get-a-lot-of-cannot-be-resolved)
|
||||
- [REPL!](#repl)
|
||||
- [Connecting to REPL to IntelliJ](#connecting-to-repl-to-intellij)
|
||||
- [Connecting REPL and IntelliJ to `status-react`](#connecting-repl-and-intellij-to-status-react)
|
||||
|
||||
## Install Cursive
|
||||
|
||||
See https://cursive-ide.com/userguide/index.html
|
||||
|
||||
## Getting Cursive to understand `status-react`
|
||||
|
||||
- Add this file to the root of the `status-react` project dir
|
||||
- https://gist.github.com/Samyoul/f71a0593ba7a12d24dd0d5ef986ebbec
|
||||
- Right click and "add as leiningen project"
|
||||
|
||||
<img src="images/IDE_SETUP/1_fake_project_file.png" width=75% />
|
||||
|
||||
## I get a lot of `cannot be resolved`
|
||||
|
||||
Are you getting problems where you get a lot of `cannot be resolved` on everything?
|
||||
|
||||
<img src="images/IDE_SETUP/2_resolve.jpeg" width=75% />
|
||||
|
||||
See https://cursive-ide.com/userguide/macros.html
|
||||
|
||||
- opt+enter (on macOS)
|
||||
- resolve defview as fn and letsubs as let
|
||||
- move selection on resolve and hit enter
|
||||
- and select defn for defview and let for letsubs
|
||||
|
||||
## REPL!
|
||||
|
||||
### Connecting to REPL to IntelliJ
|
||||
|
||||
I had a number of problems connecting to REPL, the solution is as follows:
|
||||
|
||||
At the top of IntelliJ IDEA click on the `Add Configuration...` option:
|
||||
|
||||
<img src="images/IDE_SETUP/3_REPL_1.png" width=75% />
|
||||
|
||||
This will load the following menu:
|
||||
|
||||
<img src="images/IDE_SETUP/4_REPL_2.png" width=75% />
|
||||
|
||||
Click on the `+` icon in the top left corner of the menu.
|
||||
|
||||
Select `Clojure REPL > Remote`
|
||||
|
||||
<img src="images/IDE_SETUP/5_REPL_3.png" width=75% />
|
||||
|
||||
Which will load the following menu
|
||||
|
||||
<img src="images/IDE_SETUP/6_REPL_4.png" width=75% />
|
||||
|
||||
Enter the below options:
|
||||
|
||||
- Name = status-react
|
||||
- Display Name = status-react
|
||||
- Connection type = nREPL
|
||||
- Connection details
|
||||
- Host = 127.0.0.1
|
||||
- Port = 7888
|
||||
|
||||
<img src="images/IDE_SETUP/7_REPL_5.png" width=75% />
|
||||
|
||||
Press `OK`
|
||||
|
||||
Now the below option will be visible.
|
||||
Press the green run button
|
||||
|
||||
<img src="images/IDE_SETUP/8_REPL_6.png" width=75% />
|
||||
|
||||
You should now see an dialog with the following message:
|
||||
|
||||
```shell
|
||||
Connecting to remote nREPL server...
|
||||
Clojure 1.10.1
|
||||
```
|
||||
|
||||
To confirm you have a working connection with REPL enter the following command in the input box below the output:
|
||||
|
||||
```shell
|
||||
(prn 1)
|
||||
```
|
||||
|
||||
Which should output
|
||||
|
||||
```shell
|
||||
(prn 1)
|
||||
1
|
||||
=> nil
|
||||
```
|
||||
|
||||
See below:
|
||||
|
||||
<img src="images/IDE_SETUP/9_REPL_7.png" width=75% />
|
||||
|
||||
### Connecting REPL and IntelliJ to `status-react`
|
||||
|
||||
**The important next step is telling REPL the context in which to interact with the code.**
|
||||
|
||||
Do the following:
|
||||
|
||||
Ensure you have 3 terminals running the following
|
||||
|
||||
- `make run-clojure`
|
||||
- `make run-metro`
|
||||
- `make run-ios` / `make run-android`
|
||||
|
||||
[See the STARTING GUIDE for details](STARTING_GUIDE.md#development)
|
||||
|
||||
Next go back to the REPL input and enter the following commands:
|
||||
|
||||
```clojure
|
||||
(shadow/watch :mobile)
|
||||
(shadow/repl :mobile)
|
||||
```
|
||||
|
||||
See Below
|
||||
|
||||
<img src="images/IDE_SETUP/10_REPL_8.png" width="75%" />
|
||||
|
||||
Which should switch the clj file type target to cljs as shown above
|
||||
|
||||
Finally you are ready to test REPL.
|
||||
|
||||
Create a sample function to evaluate something simple like `(prn "I'm working")`, move your cursor to one of the outer parentheses. Right or `control` click and select the `REPL` option. From there select `Sync files in REPL` and then `Send '...' to REPL'`.
|
||||
|
||||
<img src="images/IDE_SETUP/11_REPL_9.png" width="75%" />
|
||||
|
||||
Alternatively you can use the shortcut commands `⇧⌘M` to sync your files and `⇧⌘P` to send the statement to REPL. You may also need to switch the REPL namespace to match the current file, which can be done manually from the dialogue box or using the `⇧⌘N` shortcut key.
|
||||
|
||||
Following the above should give you the below result:
|
||||
|
||||
<img src="images/IDE_SETUP/12_REPL_10.png" width="75%" />
|
||||
|
||||
🎉 Tada! Working! 🎉
|
||||
|
||||
---
|
||||
|
||||
For additional details on issues you may face when setting up REPL with Cursive [see this document](https://notes.status.im/9Gr7kqF8SzC_SmYK0eB7uQ?view#Connecting-Cursive--IntelliJ-IDEA-to-REPL-Problems)
|
||||
@@ -8,9 +8,14 @@
|
||||
- [ ] Privacy policy reviewed and updated
|
||||
- [ ] App translations for key features merged and tested
|
||||
- [ ] Countries to be excluded
|
||||
- [ ] Changes to our FAQ made
|
||||
|
||||
#### Before publishing
|
||||
- [ ] Translations for comms available
|
||||
- [ ] Promotional content ready
|
||||
- [ ] Update Draft with release on https://github.com/status-im/status-react/releases
|
||||
- [ ] Add release to DO store and [update site](https://notes.status.im/s/status-release-upload#) (Jakub - requires credentials to upload)
|
||||
|
||||
#### At time of publishing
|
||||
- [ ] validate draft release on github release page https://github.com/status-im/status-react/releases
|
||||
- [ ] update https://github.com/status-im/status-react/blob/develop/RELEASES.md with release notes
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
# Description
|
||||
|
||||
This document explains some of the steps that are involved in releases.
|
||||
|
||||
# Release process
|
||||
|
||||
## Coordination
|
||||
|
||||
All the coordination is done in the `#release` channel on discord.
|
||||
|
||||
Release readiness can be tracked by watching an appropriate milestone at [milestones](https://github.com/status-im/status-react/milestones) section in github.
|
||||
|
||||
When release is building you can check the progress in a testrail. Ask @churik for access if you don't have it
|
||||
|
||||
## Preparing branches
|
||||
Special branches should be created at the start of a release process. That can be done manually or with the script
|
||||
|
||||
### Prepare branches with the script
|
||||
|
||||
You can use the script to cut a release branch. No arguments needed, the new release version will be deducted automatically:
|
||||
|
||||
`scripts/cut-release.sh`
|
||||
|
||||
Upon script call two branches will be created:
|
||||
- `release/a.b.x`
|
||||
- `chore/update-release-to-$version`
|
||||
|
||||
The first one is the main release branch. All bugfixes should be cherry-picked from `develop` to it. Jenkins treats that branch specially and prepares release builds from it.
|
||||
|
||||
The second branch only updates the `VERSION` file and all you need to do is to merge it to `develop`. If you have the `gh` command installed, `cut-release` script will automatically create a PR for this.
|
||||
|
||||
### Prepare branches manually
|
||||
|
||||
#### Create a branch
|
||||
|
||||
First, we need to create a release branch cut from develop.
|
||||
The name of the branch should be `release/a.b.x` where `x` is actually `x`, not a variable, and `a` and `b` are the `MAJOR` and `MINOR` version of the app.
|
||||
|
||||
For example, valid branch names are:
|
||||
|
||||
`release/1.12.x` or `release/3.12.x`
|
||||
|
||||
#### Update version
|
||||
|
||||
We need to update the `VERSION` file to reflect the release we want to build.
|
||||
|
||||
|
||||
## Building
|
||||
|
||||
Jenkins will automatically build this branch and create release candidates.
|
||||
Those will go through the QA process and the QA team will let us know when
|
||||
tested successfully.
|
||||
|
||||
## Bugfixes before an app is released
|
||||
|
||||
Because both `status-react` and `status-go` might have newer commits that we don't want to include, bug fixes should be applied separately to develop and the release branch.
|
||||
The best workflow is to send a PR to develop, get it merged, and the cherry-pick on the
|
||||
release branch.
|
||||
|
||||
It is a release manager's responsibility to cherry-pick bugfix from `develop` to release branch. In order to do this, you should be a part of a `release group` on github. Contact @jakubgs to be added.
|
||||
|
||||
If cherry-picking not practical for some reason (i.e develop has diverged significantly from release)
|
||||
other workflows are possible.
|
||||
|
||||
To change status-go, a similar workflow applies.
|
||||
First checkout the tag used in `status-go-version.json` of release branch.
|
||||
|
||||
`git checkout v0.62.3`
|
||||
|
||||
Create a branch on status-go named: `release/vx.y.z+hotfix.w` where (make sure branch name is not the same as the tag)
|
||||
|
||||
`x` is the `MAJOR` version
|
||||
`y` is the `MINOR` version
|
||||
`z` is the `PATCH` version
|
||||
`w` is the `HOTFIX` version
|
||||
|
||||
For example valid names are:
|
||||
|
||||
`release/v0.62.3+hotfix.2`
|
||||
`release/v1.3.4+hotfix.4`
|
||||
|
||||
Once the branch is ready to use and tested successfully, tag the branch:
|
||||
|
||||
`git tag v0.62.3+hotfix.2`
|
||||
|
||||
Push the branch and then the tag to origin:
|
||||
`git push --set-upstream origin release/v0.62.3+hotfix.2`
|
||||
`git push origin v0.62.3+hotfix.2`
|
||||
|
||||
Switch to status-react release branch, and cherry pick the commit you need.
|
||||
|
||||
Once that's done, update the status-react release branch with the new tag:
|
||||
|
||||
`make shell`
|
||||
|
||||
`scripts/update-status-go.sh v0.62.3+hotfix.2`
|
||||
|
||||
And commit and push the changes
|
||||
|
||||
# Hotfix process
|
||||
|
||||
The hotfix process is basically identical to the workflow of a bugfix:
|
||||
|
||||
1) Add the changes on status-react
|
||||
2) Make sure you use a hotfix branch for status-go (unless we are happy to release from develop)
|
||||
3) Update the `VERSION` in status-react
|
||||
@@ -54,7 +54,6 @@ Core namespace must only contain functions that can be called outside of the mod
|
||||
|
||||
### db.cljs
|
||||
|
||||
- must contain specs for the app-db subpart the module modifies
|
||||
- must contain getter and setter functions used by fx producing functions and subscriptions
|
||||
- db logic called by other modules
|
||||
|
||||
@@ -72,21 +71,8 @@ These guidelines make db.cljs namespaces the place to go when making changes to
|
||||
|
||||
### Events
|
||||
|
||||
- all events must be defined in the single `status-im.events` namespace which can be considered as an index of everything going on in the app
|
||||
- events must always be declared with `register-handler-fx`, no `register-handler-db`
|
||||
- events must never use the `trim-v` interceptor
|
||||
- events must only contain a function call defined in a module
|
||||
```clojure
|
||||
(handlers/register-handler-fx
|
||||
:notifications/handle-push-notification-open
|
||||
(fn [cofx [_ event]]
|
||||
(notifications/handle-push-notification-open event cofx)))
|
||||
```
|
||||
- events must use synthetic namespaces:
|
||||
|
||||
- `:module.ui/` for user triggered events
|
||||
- `:module.callback/` for callback events, which are events bringing back the result of an fx to the event loop, the name of the event should end with `-success` or `-error` most of the time. Other possibilities can be `-granted`, `-denied` for instance.
|
||||
- `:module/` for internal events, examples are time based events marked `-timed-out`, external changes marked `-changed` or reception of external events marked `-received`.
|
||||
- all events must be defined in the `core.cljs` namespaces
|
||||
- events must always be declared with `fx/defn` macro
|
||||
|
||||
## Testing flow
|
||||
- All PRs automatically go to "REVIEW" column on [Pipeline for QA](https://github.com/status-im/status-react/projects/7) project on Github. This is our main board for QA / devs interaction
|
||||
|
||||
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 439 KiB |
|
After Width: | Height: | Size: 285 KiB |
|
After Width: | Height: | Size: 180 KiB |
|
After Width: | Height: | Size: 290 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 655 KiB |
|
After Width: | Height: | Size: 203 KiB |
|
After Width: | Height: | Size: 583 KiB |
|
After Width: | Height: | Size: 585 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 118 KiB |
@@ -103,7 +103,7 @@ def asc_api_key()
|
||||
key_id: ENV['FASTLANE_ASC_API_KEY_ID'],
|
||||
issuer_id: ENV['FASTLANE_ASC_API_ISSUER_ID'],
|
||||
key_filepath: ENV['FASTLANE_ASC_API_KEY_FILE_PATH'],
|
||||
duration: 1500, # seconds, session length
|
||||
duration: 1200, # seconds, session length
|
||||
in_house: false,
|
||||
)
|
||||
end
|
||||
@@ -115,7 +115,7 @@ end
|
||||
# if false - read list of devices from AppStoreConnect, and upgrade the provisioning profiles from it
|
||||
# `pr_build`:
|
||||
# if true - uses StatusImPR scheme and postfixed app id with `.pr` to build an app, which can be used in parallel with release
|
||||
# if false - uses StatusIm scheme to build the release app
|
||||
# if false - uses StatusIm scheme to build the release app
|
||||
|
||||
def build_ios_adhoc(readonly: false, pr_build: false)
|
||||
# PR builds should appear as a separate App on iOS
|
||||
@@ -336,24 +336,6 @@ platform :android do
|
||||
)
|
||||
end
|
||||
|
||||
desc 'Upload metadata to Google Play.'
|
||||
desc 'Metadata is always updated when builds are uploaded,'
|
||||
desc 'but this action can update metadata without uploading a build.'
|
||||
desc 'expects GOOGLE_PLAY_JSON_KEY environment variable'
|
||||
lane :upload_metadata do
|
||||
upload_to_play_store(
|
||||
skip_upload_apk: true,
|
||||
skip_upload_changelogs: true,
|
||||
json_key_data: ENV['GOOGLE_PLAY_JSON_KEY'],
|
||||
# These don't matter much as we're not uploading any new builds
|
||||
# and indeed, we're skipping changelogs. This is just so that
|
||||
# the library can find what it thinks it needs and continue with
|
||||
# the work we actually want it to do.
|
||||
track: 'production',
|
||||
version_code: '2020042307'
|
||||
)
|
||||
end
|
||||
|
||||
desc '`fastlane android upload_diawi` - upload .apk to diawi'
|
||||
desc 'expects to have an .apk prepared: `result/app.apk`'
|
||||
desc 'expects to have a diawi token as DIAWI_TOKEN env variable'
|
||||
|
||||
@@ -1,25 +1,26 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (3.0.2)
|
||||
CFPropertyList (3.0.3)
|
||||
addressable (2.7.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
artifactory (3.0.15)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.1.0)
|
||||
aws-partitions (1.383.0)
|
||||
aws-sdk-core (3.109.1)
|
||||
aws-eventstream (1.1.1)
|
||||
aws-partitions (1.442.0)
|
||||
aws-sdk-core (3.113.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.239.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
jmespath (~> 1.0)
|
||||
aws-sdk-kms (1.39.0)
|
||||
aws-sdk-core (~> 3, >= 3.109.0)
|
||||
aws-sdk-kms (1.43.0)
|
||||
aws-sdk-core (~> 3, >= 3.112.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.83.1)
|
||||
aws-sdk-core (~> 3, >= 3.109.0)
|
||||
aws-sdk-s3 (1.93.0)
|
||||
aws-sdk-core (~> 3, >= 3.112.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sigv4 (1.2.2)
|
||||
aws-sigv4 (1.2.3)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
claide (1.0.3)
|
||||
@@ -29,25 +30,28 @@ GEM
|
||||
highline (~> 1.7.2)
|
||||
declarative (0.0.20)
|
||||
declarative-option (0.1.0)
|
||||
digest-crc (0.6.1)
|
||||
rake (~> 13.0)
|
||||
digest-crc (0.6.3)
|
||||
rake (>= 12.0.0, < 14.0.0)
|
||||
domain_name (0.5.20190701)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
dotenv (2.7.6)
|
||||
emoji_regex (3.0.0)
|
||||
excon (0.78.0)
|
||||
faraday (1.1.0)
|
||||
emoji_regex (3.2.2)
|
||||
excon (0.79.0)
|
||||
faraday (1.3.0)
|
||||
faraday-net_http (~> 1.0)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
ruby2_keywords
|
||||
faraday-cookie_jar (0.0.7)
|
||||
faraday (>= 0.8.0)
|
||||
http-cookie (~> 1.0.0)
|
||||
faraday-net_http (1.0.1)
|
||||
faraday_middleware (1.0.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.2.0)
|
||||
fastlane (2.164.0)
|
||||
fastimage (2.2.3)
|
||||
fastlane (2.179.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.3, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
aws-sdk-s3 (~> 1.0)
|
||||
babosa (>= 1.0.3, < 2.0.0)
|
||||
bundler (>= 1.12.0, < 3.0.0)
|
||||
@@ -68,6 +72,7 @@ GEM
|
||||
jwt (>= 2.1.0, < 3)
|
||||
mini_magick (>= 4.9.4, < 5.0.0)
|
||||
multipart-post (~> 2.0.0)
|
||||
naturally (~> 2.2)
|
||||
plist (>= 3.1.0, < 4.0.0)
|
||||
rubyzip (>= 2.0.0, < 3.0.0)
|
||||
security (= 0.1.3)
|
||||
@@ -93,20 +98,35 @@ GEM
|
||||
representable (~> 3.0)
|
||||
retriable (>= 2.0, < 4.0)
|
||||
signet (~> 0.12)
|
||||
google-cloud-core (1.5.0)
|
||||
google-apis-core (0.3.0)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
googleauth (~> 0.14)
|
||||
httpclient (>= 2.8.1, < 3.0)
|
||||
mini_mime (~> 1.0)
|
||||
representable (~> 3.0)
|
||||
retriable (>= 2.0, < 4.0)
|
||||
rexml
|
||||
signet (~> 0.14)
|
||||
webrick
|
||||
google-apis-iamcredentials_v1 (0.3.0)
|
||||
google-apis-core (~> 0.1)
|
||||
google-apis-storage_v1 (0.3.0)
|
||||
google-apis-core (~> 0.1)
|
||||
google-cloud-core (1.6.0)
|
||||
google-cloud-env (~> 1.0)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (1.4.0)
|
||||
google-cloud-env (1.5.0)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
google-cloud-errors (1.0.1)
|
||||
google-cloud-storage (1.29.1)
|
||||
google-cloud-errors (1.1.0)
|
||||
google-cloud-storage (1.31.0)
|
||||
addressable (~> 2.5)
|
||||
digest-crc (~> 0.4)
|
||||
google-api-client (~> 0.33)
|
||||
google-apis-iamcredentials_v1 (~> 0.1)
|
||||
google-apis-storage_v1 (~> 0.1)
|
||||
google-cloud-core (~> 1.2)
|
||||
googleauth (~> 0.9)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (0.14.0)
|
||||
googleauth (0.16.1)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
memoist (~> 0.16)
|
||||
@@ -119,23 +139,23 @@ GEM
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
jmespath (1.4.0)
|
||||
json (2.3.1)
|
||||
json (2.5.1)
|
||||
jwt (2.2.2)
|
||||
memoist (0.16.2)
|
||||
mime-types (3.3.1)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2020.0512)
|
||||
mini_magick (4.10.1)
|
||||
mini_mime (1.0.2)
|
||||
mime-types-data (3.2021.0225)
|
||||
mini_magick (4.11.0)
|
||||
mini_mime (1.1.0)
|
||||
multi_json (1.15.0)
|
||||
multipart-post (2.0.0)
|
||||
nanaimo (0.3.0)
|
||||
naturally (2.2.0)
|
||||
naturally (2.2.1)
|
||||
netrc (0.11.0)
|
||||
os (1.1.1)
|
||||
plist (3.5.0)
|
||||
plist (3.6.0)
|
||||
public_suffix (4.0.6)
|
||||
rake (13.0.1)
|
||||
rake (13.0.3)
|
||||
representable (3.0.4)
|
||||
declarative (< 0.1.0)
|
||||
declarative-option (< 0.2.0)
|
||||
@@ -146,11 +166,12 @@ GEM
|
||||
mime-types (>= 1.16, < 4.0)
|
||||
netrc (~> 0.8)
|
||||
retriable (3.1.2)
|
||||
rexml (3.2.5)
|
||||
rouge (2.0.7)
|
||||
ruby2_keywords (0.0.2)
|
||||
ruby2_keywords (0.0.4)
|
||||
rubyzip (2.3.0)
|
||||
security (0.1.3)
|
||||
signet (0.14.0)
|
||||
signet (0.15.0)
|
||||
addressable (~> 2.3)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
jwt (>= 1.5, < 3.0)
|
||||
@@ -171,6 +192,7 @@ GEM
|
||||
unf_ext
|
||||
unf_ext (0.0.7.7)
|
||||
unicode-display_width (1.7.0)
|
||||
webrick (1.7.0)
|
||||
word_wrap (1.0.0)
|
||||
xcodeproj (1.19.0)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
@@ -180,7 +202,7 @@ GEM
|
||||
nanaimo (~> 0.3.0)
|
||||
xcpretty (0.3.0)
|
||||
rouge (~> 2.0.7)
|
||||
xcpretty-travis-formatter (1.0.0)
|
||||
xcpretty-travis-formatter (1.0.1)
|
||||
xcpretty (~> 0.2, >= 0.0.7)
|
||||
|
||||
PLATFORMS
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{ stdenv, bundlerEnv, ruby, makeWrapper }:
|
||||
{ stdenv, lib, bundlerEnv, ruby, makeWrapper }:
|
||||
|
||||
let
|
||||
fastlane = stdenv.mkDerivation rec {
|
||||
@@ -28,7 +28,7 @@ let
|
||||
export FASTLANE_PLUGINFILE_PATH=$STATUS_REACT_HOME/fastlane/Pluginfile
|
||||
'';
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
meta = with lib; {
|
||||
description = "A tool to automate building and releasing iOS and Android apps";
|
||||
longDescription = "fastlane is a tool for iOS and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application.";
|
||||
homepage = https://github.com/fastlane/fastlane;
|
||||
|
||||
@@ -10,6 +10,16 @@
|
||||
};
|
||||
version = "2.7.0";
|
||||
};
|
||||
artifactory = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0wify8rhjwr5bw5y6ary61vba290vk766cxw9a9mg05yswmaisls";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.0.15";
|
||||
};
|
||||
atomos = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -25,20 +35,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0r0pn66yqrdkrfdin7qdim0yj2x75miyg4wp6mijckhzhrjb7cv5";
|
||||
sha256 = "0jfki5ikfr8ln5cdgv4iv1643kax0bjpp29jh78chzy713274jh3";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.0";
|
||||
version = "1.1.1";
|
||||
};
|
||||
aws-partitions = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1as2xr2yjsylrjys084bm2q90la0nw7rm1cgwx57wcds58i9zrwb";
|
||||
sha256 = "0lm08fmahg3m87vbsfv73iswgvicdwcxfmkzr6v9qshlkg36lafd";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.383.0";
|
||||
version = "1.442.0";
|
||||
};
|
||||
aws-sdk-core = {
|
||||
dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"];
|
||||
@@ -46,10 +56,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0xmppcxq7jm8lffqibkhq257hfwfbv82zm2y1fbhwm3icgxzwlfx";
|
||||
sha256 = "0i3x8p9gymc9977dcdkz5ca6mrmh7ym6p2mrscbh49nfd9gi5zg0";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.109.1";
|
||||
version = "3.113.1";
|
||||
};
|
||||
aws-sdk-kms = {
|
||||
dependencies = ["aws-sdk-core" "aws-sigv4"];
|
||||
@@ -57,10 +67,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0ly1m631qm2ciif7sysbzrgczjvz95ga3g6w6vrzvfdv31jjnl9a";
|
||||
sha256 = "01pd0f4srsa65zl4zq4014p9j5yrr2yy9h9ab17g3w9d0qqm2vsh";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.39.0";
|
||||
version = "1.43.0";
|
||||
};
|
||||
aws-sdk-s3 = {
|
||||
dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"];
|
||||
@@ -68,10 +78,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "021yqghdb1i980vn249hv44jajr0v3hq4ik4r6fqh9kwp04fsbqv";
|
||||
sha256 = "0iy2f9z43pc6fgwmga2cz8nf9gy2pwcw4jib141vp8z8dhylqj94";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.83.1";
|
||||
version = "1.93.0";
|
||||
};
|
||||
aws-sigv4 = {
|
||||
dependencies = ["aws-eventstream"];
|
||||
@@ -79,10 +89,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1ll9382c1x2hp750cilh01h1cycgyhdr4cmmgx23k94hyyb8chv5";
|
||||
sha256 = "1d9zhmi3mpfzkkpg7yw7s9r1dwk157kh9875j3c7gh6cy95lmmaw";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.2";
|
||||
version = "1.2.3";
|
||||
};
|
||||
babosa = {
|
||||
groups = ["default"];
|
||||
@@ -99,10 +109,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1825ll26p28swjiw8n3x2pnh5ygsmg83spf82fnzcjn2p87vc5lf";
|
||||
sha256 = "0ia09r8bj3bjhcfiyr3vlk9zx7vahfypbs2lyrxix9x1jx3lfzq4";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.0.2";
|
||||
version = "3.0.3";
|
||||
};
|
||||
claide = {
|
||||
groups = ["default"];
|
||||
@@ -171,10 +181,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1nygbn680kmya9vnz0pr9681z8lszr2whln0rxk168vaxbcnga8d";
|
||||
sha256 = "118d5p02kdw6a5pi8af12dxma7q3b77zz5q5xjjf5kgp8qh1930a";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.6.1";
|
||||
version = "0.6.3";
|
||||
};
|
||||
domain_name = {
|
||||
dependencies = ["unf"];
|
||||
@@ -202,31 +212,31 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0mjl5g6fv8iyf3nnbfyzd64bhl8l1qxyh452797km1aj4c682ia3";
|
||||
sha256 = "15xqimc9dr9yyrf09dy8g60s65bvgg6xyyr7q74352r9vhwyg357";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.0.0";
|
||||
version = "3.2.2";
|
||||
};
|
||||
excon = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1hi89v53pm2abfv9j8lgqdd7hgkr7fr0gwrczr940iwbb3xv7rrs";
|
||||
sha256 = "1759s0rz6qgsw86dds1z4jzb3fvizqsk11j5q6z7lc5n404w6i23";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.78.0";
|
||||
version = "0.79.0";
|
||||
};
|
||||
faraday = {
|
||||
dependencies = ["multipart-post" "ruby2_keywords"];
|
||||
dependencies = ["faraday-net_http" "multipart-post" "ruby2_keywords"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "16dapwi5pivrl25r4lkr1mxjrzkznj4wlcb08fzkmxnj4g5c6y35";
|
||||
sha256 = "1hmssd8pj4n7yq4kz834ylkla8ryyvhaap6q9nzymp93m1xq21kz";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.0";
|
||||
version = "1.3.0";
|
||||
};
|
||||
faraday-cookie_jar = {
|
||||
dependencies = ["faraday" "http-cookie"];
|
||||
@@ -239,6 +249,16 @@
|
||||
};
|
||||
version = "0.0.7";
|
||||
};
|
||||
faraday-net_http = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1fi8sda5hc54v1w3mqfl5yz09nhx35kglyx72w7b8xxvdr0cwi9j";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.1";
|
||||
};
|
||||
faraday_middleware = {
|
||||
dependencies = ["faraday"];
|
||||
groups = ["default"];
|
||||
@@ -255,21 +275,21 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "11ny2pj0j6pljszrf1w3iqdv2pcl2iwwghjbgcjlizy424zbh0hb";
|
||||
sha256 = "0lgr0vs9kg5622qaf2l3f37b238dncs037fisiygvkbq8sg11i68";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.0";
|
||||
version = "2.2.3";
|
||||
};
|
||||
fastlane = {
|
||||
dependencies = ["CFPropertyList" "addressable" "aws-sdk-s3" "babosa" "colored" "commander-fastlane" "dotenv" "emoji_regex" "excon" "faraday" "faraday-cookie_jar" "faraday_middleware" "fastimage" "gh_inspector" "google-api-client" "google-cloud-storage" "highline" "json" "jwt" "mini_magick" "multipart-post" "plist" "rubyzip" "security" "simctl" "slack-notifier" "terminal-notifier" "terminal-table" "tty-screen" "tty-spinner" "word_wrap" "xcodeproj" "xcpretty" "xcpretty-travis-formatter"];
|
||||
dependencies = ["CFPropertyList" "addressable" "artifactory" "aws-sdk-s3" "babosa" "colored" "commander-fastlane" "dotenv" "emoji_regex" "excon" "faraday" "faraday-cookie_jar" "faraday_middleware" "fastimage" "gh_inspector" "google-api-client" "google-cloud-storage" "highline" "json" "jwt" "mini_magick" "multipart-post" "naturally" "plist" "rubyzip" "security" "simctl" "slack-notifier" "terminal-notifier" "terminal-table" "tty-screen" "tty-spinner" "word_wrap" "xcodeproj" "xcpretty" "xcpretty-travis-formatter"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1mr143fx505iwgci6v9bl4pd6v305wrc4q1s329sjmy67jfbm47w";
|
||||
sha256 = "1wspwgc1q31049a20k2gnzmizdvq4jdmzyd2fnz7r4g68fygj3sj";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.164.0";
|
||||
version = "2.179.0";
|
||||
};
|
||||
fastlane-plugin-clean_testflight_testers = {
|
||||
groups = ["default"];
|
||||
@@ -313,16 +333,49 @@
|
||||
};
|
||||
version = "0.38.0";
|
||||
};
|
||||
google-apis-core = {
|
||||
dependencies = ["addressable" "googleauth" "httpclient" "mini_mime" "representable" "retriable" "rexml" "signet" "webrick"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1jx4jiyfjxd8pxlpi94f07cb5yvljb5rv7i8xzjq2xrrlvdf212a";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.3.0";
|
||||
};
|
||||
google-apis-iamcredentials_v1 = {
|
||||
dependencies = ["google-apis-core"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1gqpxcc0cjv4838q38g3mx9pgk7681w6irr6zwcygvnvbsvbbpsh";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.3.0";
|
||||
};
|
||||
google-apis-storage_v1 = {
|
||||
dependencies = ["google-apis-core"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0q6d5grhrkyfxmzlv0y39i6wzq5ayq1lkp33vfcg9pm8jyzcz7b2";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.3.0";
|
||||
};
|
||||
google-cloud-core = {
|
||||
dependencies = ["google-cloud-env" "google-cloud-errors"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1qjn7vs8f85vxi1nkikbjfja6bv9snrj26vzscjii0cm8n4dy0i1";
|
||||
sha256 = "0amp8vd16pzbdrfbp7k0k38rqxpwd88bkyp35l3x719hbb6l85za";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.5.0";
|
||||
version = "1.6.0";
|
||||
};
|
||||
google-cloud-env = {
|
||||
dependencies = ["faraday"];
|
||||
@@ -330,31 +383,31 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0bjgxyvagy6hjj8yg7fqq24rwdjxb6hx7fdd1bmn4mwd846lci2i";
|
||||
sha256 = "0ajc3w4wqg46ywcbmb5fz1q6gfm6g7874s9h31i1r038kz2bzfag";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.4.0";
|
||||
version = "1.5.0";
|
||||
};
|
||||
google-cloud-errors = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1hvs1x39g77hbdqjxmzcl6gq8160pv3kskvzbbch0ww1np6qwm67";
|
||||
sha256 = "0q3h996b6vl2ryfbm9jwczjcbnwhkpqs6hingxp22rhzk7qxi9z0";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.1";
|
||||
version = "1.1.0";
|
||||
};
|
||||
google-cloud-storage = {
|
||||
dependencies = ["addressable" "digest-crc" "google-api-client" "google-cloud-core" "googleauth" "mini_mime"];
|
||||
dependencies = ["addressable" "digest-crc" "google-apis-iamcredentials_v1" "google-apis-storage_v1" "google-cloud-core" "googleauth" "mini_mime"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1d8yc807dbd4pcwrrg2pdl30hghcnjid55qrjl2shffhzgiyl54h";
|
||||
sha256 = "1bjkwnsii4svw2g09xjqpkq3mck820kj9nhx3vlv7rjmlh3bg68s";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.29.1";
|
||||
version = "1.31.0";
|
||||
};
|
||||
googleauth = {
|
||||
dependencies = ["faraday" "jwt" "memoist" "multi_json" "os" "signet"];
|
||||
@@ -362,10 +415,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0cm60nbmwzf83fzy06f3iyn5a6sw91siw8x9bdvpwwmjsmivana6";
|
||||
sha256 = "1438alhx4n4rdgf6q7ni8qj1b10y8lr9z9spphhjyhacby1ifsjn";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.14.0";
|
||||
version = "0.16.1";
|
||||
};
|
||||
highline = {
|
||||
groups = ["default"];
|
||||
@@ -423,10 +476,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "158fawfwmv2sq4whqqaksfykkiad2xxrrj0nmpnc6vnlzi1bp7iz";
|
||||
sha256 = "0lrirj0gw420kw71bjjlqkqhqbrplla61gbv1jzgsz6bv90qr3ci";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.3.1";
|
||||
version = "2.5.1";
|
||||
};
|
||||
jwt = {
|
||||
groups = ["default"];
|
||||
@@ -464,30 +517,30 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1z75svngyhsglx0y2f9rnil2j08f9ab54b3l95bpgz67zq2if753";
|
||||
sha256 = "1phcq7z0zpipwd7y4fbqmlaqghv07fjjgrx99mwq3z3n0yvy7fmi";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.2020.0512";
|
||||
version = "3.2021.0225";
|
||||
};
|
||||
mini_magick = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0lpq12z70n10c1qshcddd5nib2pkcbkwzvmiqqzj60l01k3x4fg9";
|
||||
sha256 = "1aj604x11d9pksbljh0l38f70b558rhdgji1s9i763hiagvvx2hs";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.10.1";
|
||||
version = "4.11.0";
|
||||
};
|
||||
mini_mime = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1axm0rxyx3ss93wbmfkm78a6x03l8y4qy60rhkkiq0aza0vwq3ha";
|
||||
sha256 = "0kb7jq3wjgckmkzna799y5qmvn6vg52878bkgw35qay6lflcrwih";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.2";
|
||||
version = "1.1.0";
|
||||
};
|
||||
multi_json = {
|
||||
groups = ["default"];
|
||||
@@ -524,10 +577,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0dzqdawqr4agx7zr1fr5zxdwl8vb5rhpz57l1lk7d2y46ha6l4l7";
|
||||
sha256 = "04x1nkx6gkqzlc4phdvq05v3vjds6mgqhjqzqpcs6vdh5xyqrf59";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.0";
|
||||
version = "2.2.1";
|
||||
};
|
||||
netrc = {
|
||||
groups = ["default"];
|
||||
@@ -554,10 +607,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0ra0910xxbhfsmdi0ig36pr3q0khdqzwb5da3wg7y3n8d1sh9ffp";
|
||||
sha256 = "1whhr897z6z6av85x2cipyjk46bwh6s4wx6nbrcd3iifnzvbqs7l";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.5.0";
|
||||
version = "3.6.0";
|
||||
};
|
||||
public_suffix = {
|
||||
groups = ["default"];
|
||||
@@ -574,10 +627,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0w6qza25bq1s825faaglkx1k6d59aiyjjk3yw3ip5sb463mhhai9";
|
||||
sha256 = "1iik52mf9ky4cgs38fp2m8r6skdkq1yz23vh18lk95fhbcxb6a67";
|
||||
type = "gem";
|
||||
};
|
||||
version = "13.0.1";
|
||||
version = "13.0.3";
|
||||
};
|
||||
representable = {
|
||||
dependencies = ["declarative" "declarative-option" "uber"];
|
||||
@@ -611,6 +664,16 @@
|
||||
};
|
||||
version = "3.1.2";
|
||||
};
|
||||
rexml = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.2.5";
|
||||
};
|
||||
rouge = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -626,10 +689,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "17pcc0wgvh3ikrkr7bm3nx0qhyiqwidd13ij0fa50k7gsbnr2p0l";
|
||||
sha256 = "15wfcqxyfgka05v2a7kpg64x57gl1y4xzvnc9lh60bqx5sf1iqrs";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.0.2";
|
||||
version = "0.0.4";
|
||||
};
|
||||
rubyzip = {
|
||||
groups = ["default"];
|
||||
@@ -657,10 +720,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "10g2667fvxnc50hcd1aywgsbf8j7nrckg3n7zjvywmyz82pwmpqp";
|
||||
sha256 = "1vvxmfm9khxp35xs8qxc82i7hakylxbn7kx4apinvxaid6rlq60g";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.14.0";
|
||||
version = "0.15.0";
|
||||
};
|
||||
simctl = {
|
||||
dependencies = ["CFPropertyList" "naturally"];
|
||||
@@ -776,6 +839,16 @@
|
||||
};
|
||||
version = "1.7.0";
|
||||
};
|
||||
webrick = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1d4cvgmxhfczxiq5fr534lmizkhigd15bsx5719r5ds7k7ivisc7";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.7.0";
|
||||
};
|
||||
word_wrap = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -814,9 +887,9 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "15b5c0lxz2blmichfdlabzlbyw5nlh1ci898pxwb661m9bahz3ml";
|
||||
sha256 = "14rg4f70klrs910n7rsgfa4dn8s2qyny55194ax2qyyb2wpk7k5a";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
version = "1.0.1";
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
الحاله هي أداة اتصال خاصة وآمنة. يمكنك الدردشة مع الأصدقاء وتخزين الأصول واستكشاف مستقبل الويب دون استغلالها لبياناتك.
|
||||
|
||||
مع الحاله ، أنت وحدك تتحكم في معلوماتك.
|
||||
|
||||
دردشة
|
||||
تزيل الحاله جهات خارجية مركزية من رسائلك. ليس المحتوى الخاص بك محميًا فحسب ، بل أيضًا البيانات الوصفية الخاصة بك - للحصول على الخصوصية المطلقة.
|
||||
|
||||
المعاملات
|
||||
تخزين الأصول الرقمية في محفظة الحالة الخاصة بك. إرسال الرموز المميزة من الأصدقاء وطلبها أو التعامل مع التطبيقات اللامركزية.
|
||||
|
||||
يكتشف
|
||||
الوصول إلى التطبيقات المستندة إلى الايثريوم على الويب٣ . لعب الألعاب وتبادل الأصول الرقمية وأكثر من ذلك.
|
||||
@@ -1 +0,0 @@
|
||||
الدردشة والتعامل بشكل آمن
|
||||
@@ -1 +0,0 @@
|
||||
الحاله - الاتصالات الخاصة
|
||||
@@ -1,12 +0,0 @@
|
||||
Status ist eine App für private und sichere Kommunikation. Chatten Sie mit Freunden, bewahren Sie Assets auf und erkunden Sie die Zukunft des Internets, ohne Ihre Privatsphäre aufzugeben.
|
||||
|
||||
In Status haben nur Sie die volle Kontrolle über Ihre Informationen.
|
||||
|
||||
CHATTEN
|
||||
Status entfernt unnötige Mittelmänner beim Chatten. Nicht nur ihre Nachrichten sind geschützt, sondern auch auch ihre Metadaten - für ultimative Privatsphäre
|
||||
|
||||
TRANSAKTIONEN
|
||||
Bewahren Sie digitale Assets in Ihrer Status-Wallet auf. Senden und erhalten Sie Tokens von Ihren Freunden oder interagieren Sie mit DApps.
|
||||
|
||||
ERKUNDEN
|
||||
Greifen Sie auf Ethereum-basierte Web3-Apps zu. Spielen Sie Spiele, konvertieren Sie Assets u.v.m.
|
||||
@@ -1 +0,0 @@
|
||||
Chatten und Transaktionen sicher tätigen
|
||||
@@ -1 +0,0 @@
|
||||
Status - Private Kommunikation
|
||||
@@ -1,12 +0,0 @@
|
||||
Status is a private and secure communication tool. Chat with friends, store assets and explore the future of the web without being exploited for your data.
|
||||
|
||||
With Status, you alone control your information.
|
||||
|
||||
CHAT
|
||||
Status removes centralized third parties from your messages. Not only is your content protected, but so is your metadata – for ultimate privacy.
|
||||
|
||||
TRANSACT
|
||||
Store digital assets in your Status wallet. Send and request tokens from friends, or transact with decentralized applications.
|
||||
|
||||
EXPLORE
|
||||
Access Ethereum based applications on web3. Play games, exchange digital assets and more.
|
||||
|
Before Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 534 KiB |
|
Before Width: | Height: | Size: 458 KiB |
|
Before Width: | Height: | Size: 508 KiB |
@@ -1 +0,0 @@
|
||||
Chat and transact securely
|
||||
@@ -1 +0,0 @@
|
||||
Status - Private Communication
|
||||
@@ -1,12 +0,0 @@
|
||||
Status es una herramienta de comunicación segura y privada. Chatea con amigos, almacena activos y explora el futuro de la web sin ser explotado por tu información personal.
|
||||
|
||||
Solo tú controlas tu información, con Status.
|
||||
|
||||
CHAT
|
||||
Status quita de en medio terceros centralizados a tus mensajes. No sólo tu contenido es protegido, sino también tu metadata: por máxima privacidad.
|
||||
|
||||
TRANSFIERE
|
||||
Almacena activos digitales en tu monedero Status (ERC20 and ERC721). Envía y recibe monedas de tus amigos, o transfiere activos con aplicaciónes descentralizadas.
|
||||
|
||||
EXPLORA
|
||||
Accede a aplicaciones basadas en Ethereum de la Web3. Juega, intercambia bienes digitales y más.
|
||||
|
Before Width: | Height: | Size: 547 KiB |
|
Before Width: | Height: | Size: 466 KiB |
|
Before Width: | Height: | Size: 520 KiB |
@@ -1 +0,0 @@
|
||||
Chatea y transfiere de forma segura
|
||||
@@ -1 +0,0 @@
|
||||
Status - Comunicación Privada
|
||||
@@ -1,12 +0,0 @@
|
||||
Ang Status ay isang pribado at ligtas na tool sa komunikasyon. Makipag-chat sa mga kaibigan, mag-imbak ng mga asset at galugarin ang hinaharap ng web nang hindi sinamantala para sa iyong data.
|
||||
|
||||
Sa Status, ikaw lamang ang kumokontrol sa iyong impormasyon.
|
||||
|
||||
Chat
|
||||
Tinatanggal ng Status ang mga sentralisadong third party sa iyong mga mensahe. Hindi lamang protektado ang iyong nilalaman, ngunit gayon din ang iyong metadata - para sa panghuli sa privacy.
|
||||
|
||||
TRANSACT
|
||||
Mag-imbak ng mga digital na assets sa iyong Status wallet. Magpadala at humiling ng mga token mula sa mga kaibigan, o makipag-transaksyon sa mga desentralisadong aplikasyon.
|
||||
|
||||
Siyasatin
|
||||
I-access ang mga aplikasyon na batay sa Ethereum sa web3. Maglaro ng mga laro, makipagpalitan ng mga digital assets at marami pa.
|
||||
@@ -1 +0,0 @@
|
||||
Makipag-chat at makipag-transaksyon nang ligtas
|
||||
@@ -1 +0,0 @@
|
||||
Status - Pribadong Komunikasyon
|
||||
@@ -1,14 +0,0 @@
|
||||
Status est un outil de communication privé et sécurisé. Discutez avec vos amis, stockez vos
|
||||
cryptos et explorez l'avenir du web sans être exploité pour vos données.
|
||||
Avec Status, vous seul contrôlez vos informations.
|
||||
|
||||
COMMUNIQUEZ
|
||||
Status retire toute entité centralisée de l'équation. Non seulement votre contenu est protégé, mais vos metadonnées aussi. Votre vie privée est totalement préservée.
|
||||
|
||||
TRANSACTIONNEZ
|
||||
Stockez des actifs numériques dans votre portefeuille Status. Échangez des tokens avec
|
||||
vos amis et effectuez des transactions à partir d’applications décentralisées.
|
||||
|
||||
EXPLOREZ
|
||||
Accédez à des applications web3 basées sur Ethereum. Jouez, échangez des ressources
|
||||
numériques et plus encore.
|
||||
@@ -1 +0,0 @@
|
||||
Discutez et effectuez des transactions en toute sécurité
|
||||
@@ -1 +0,0 @@
|
||||
Status - Communication Privée
|
||||
@@ -1,12 +0,0 @@
|
||||
Status adalah alat komunikasi pribadi dan aman. Mengobrol dengan teman, menyimpan aset, dan menjelajahi masa depan web tanpa dieksploitasi untuk data Anda.
|
||||
|
||||
Dengan Status, Anda sendirilah yang mengendalikan informasi Anda.
|
||||
|
||||
OBROLAN
|
||||
Status menghapus pihak ketiga yang terpusat dari pesan Anda. Tidak hanya konten Anda dilindungi, tetapi juga metadata Anda - untuk privasi tertinggi.
|
||||
|
||||
MELAKUKAN TRANSAKSI
|
||||
Simpan aset digital di dompet Status Anda. Kirim dan minta token dari teman, atau bertransaksi dengan aplikasi terdesentralisasi.
|
||||
|
||||
JELAJAHI
|
||||
Akses aplikasi berbasis Ethereum di web3. Main game, tukar aset digital, dan lainnya.
|
||||
@@ -1 +0,0 @@
|
||||
Mengobrol dan bertransaksi dengan aman
|
||||
@@ -1 +0,0 @@
|
||||
Status - Komunikasi Pribadi
|
||||
@@ -1,12 +0,0 @@
|
||||
Status è uno strumento per una comunicazione privata e sicura. Chatta con gli amici, deposita cryptovalute, esplora il futuro del web senza rinunciare alla tua privacy.
|
||||
|
||||
Con Status hai il pieno controllo delle informazioni che ti riguardano.
|
||||
|
||||
CHATTA
|
||||
Status rimuove terze parti centralizzate. Non è protetto soltanto il contenuto dei tuoi messaggi, ma anche i tuoi metadati. Status è la app di messaggistica che ti assicura la massima protezione della tua privacy.
|
||||
|
||||
EFFETTUA TRANSAZIONI
|
||||
Conserva asset digitali nel portafoglio di Status. Scambia token con i tuoi amici o effettua transazioni con le applicazioni decentralizzate.
|
||||
|
||||
ESPLORA
|
||||
Accedi alle applicazioni Web3 basate su Ethereum. Gioca, scambia asset digitali e molto altro.
|
||||
|
Before Width: | Height: | Size: 540 KiB |
|
Before Width: | Height: | Size: 478 KiB |
|
Before Width: | Height: | Size: 520 KiB |
@@ -1 +0,0 @@
|
||||
Chatta ed esegui transazioni in modo sicuro
|
||||
@@ -1 +0,0 @@
|
||||
Status - Comunicazione Privata
|
||||
@@ -1,12 +0,0 @@
|
||||
스테이터스는 검열과 감시 없는 안전한 커뮤니케이션 도구입니다. 스테이터스와 함께 여러분의 친구들과 자유롭게 채팅하고, 디지털 자산을 안전하게 보관하거나, 데이터를 유출하지 않는 안전한 웹의 미래를 체험해보세요.
|
||||
|
||||
스테이터스에서 사용되는 모든 데이터의 주권은 여러분에게 있습니다. 여러분의 데이터는 안전하게 보호됩니다.
|
||||
|
||||
채팅
|
||||
스테이터스는 메시징 네트워크에서 제 3의 중개자나 중앙화된 요소를 제거했습니다. 여러분의 채팅은 컨텐츠 뿐만아니라 메타 데이터까지 안전하게 보호됩니다. 최고의 프라이버시를 보장하는 메신저를 활용해보세요.
|
||||
|
||||
거래
|
||||
스테이터스 지갑에 여러분의 디지털 자산을 안전하게 보관해보세요. 친구에게 토큰을 요청하거나 전달할 수 있고, 탈중앙 앱으로 거래를 수행할 수 있습니다.
|
||||
|
||||
체험
|
||||
이더리움 및 Web 3 기반의 다양한 애플리케이션들을 활용해보세요. 게임, 거래소, 디지털 자산 관리 등 다양한 서비스들을 체험해볼 수 있습니다.
|
||||
|
Before Width: | Height: | Size: 514 KiB |
|
Before Width: | Height: | Size: 470 KiB |
|
Before Width: | Height: | Size: 491 KiB |
@@ -1 +0,0 @@
|
||||
검열과 감시 없는 채팅 및 거래
|
||||
@@ -1 +0,0 @@
|
||||
스테이터스 - 안전한 커뮤니케이션
|
||||
@@ -1,12 +0,0 @@
|
||||
Status é uma ferramenta de comunicação segura e privada. Converse com os seus amigos, armazene ativos e explore o futuro da web sem que os seus dados sejam explorados.
|
||||
|
||||
Com a Status, apenas você controlas as suas informações.
|
||||
|
||||
CONVERSA
|
||||
A Status remove terceiros centralizados das suas mensagens. Não é apenas o seu conteúdo que está protegido, mas também os seus metadados - para uma privacidade máxima.
|
||||
|
||||
TRANSACIONA
|
||||
Armazene ativos digitais na sua carteira Status. Envie e solicite tokens aos seus amigos, ou transacione com aplicações descentralizadas.
|
||||
|
||||
EXPLORA
|
||||
Acesse à aplicações baseadas na Ethereum na web3. Joge jogos, troce ativos digitais e muito mais.
|
||||
@@ -1 +0,0 @@
|
||||
Converse e faça transações de uma forma segura
|
||||
@@ -1 +0,0 @@
|
||||
Status - Comunição Privada
|
||||
@@ -1,12 +0,0 @@
|
||||
Status é uma ferramenta de comunicação segura e privada. Conversa com os teus amigos, armazena ativos e explora o futuro da web sem que os teus dados sejam explorados.
|
||||
|
||||
Com a Status, apenas tu controlas as tuas informações.
|
||||
|
||||
CONVERSA
|
||||
A Status remove terceiros centralizados das tuas mensagens. Não é apenas o teu conteúdo que está protegido, mas também os teus metadados - para uma derradeira privacidade.
|
||||
|
||||
TRANSACIONA
|
||||
Armazena ativos digitais na tua carteira Status. Envia e solicita tokens aos teus amigos, ou transaciona com aplicações descentralizadas.
|
||||
|
||||
EXPLORA
|
||||
Acessa a aplicações baseadas na Ethereum na web3. Joga jogos, troca ativos digitais e muito mais.
|
||||