diff --git a/.github/workflows/mobile-build-android.yml b/.github/workflows/mobile-build-android.yml index 55d3e2db9a..690764b922 100644 --- a/.github/workflows/mobile-build-android.yml +++ b/.github/workflows/mobile-build-android.yml @@ -36,6 +36,14 @@ jobs: - name: Install node modules run: yarn install + - name: Bump android versionNumber + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + run: make bump-app-build-number + + - name: Download service account from env + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + run: echo ${{ secrets.GOOGLE_SERVICES_JSON }} | base64 --decode > ./service-account-android-submit.json + - name: Fix gitignore run: npx tsx ./packages/scripts/app-build/fixGitignore.ts @@ -57,7 +65,7 @@ jobs: - name: Build android run: eas build --local --non-interactive --platform=android - - name: EAS Submit aab + - name: Update aab File path run: | AAB_FILE=$(find ./ -name 'build-*.aab' -type f) if [ -z "$AAB_FILE" ]; then @@ -65,9 +73,12 @@ jobs: exit 1 fi - # eas submit --platform=android --path=$AAB_FILE --profile=production echo "AAB_FILE=$AAB_FILE" >> $GITHUB_ENV + - name: EAS Submit Android aab + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + run: eas submit --platform=android --path=${{ env.AAB_FILE }} --profile=production + - name: Upload aab uses: actions/upload-artifact@v3 with: diff --git a/.github/workflows/mobile-build-ios.yml b/.github/workflows/mobile-build-ios.yml index 5281a4f9f5..3959189785 100644 --- a/.github/workflows/mobile-build-ios.yml +++ b/.github/workflows/mobile-build-ios.yml @@ -38,7 +38,7 @@ jobs: - name: Bump ios buildNumber if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} - run: make bump-ios-build-number + run: make bump-app-build-number - name: Fix gitignore run: npx tsx ./packages/scripts/app-build/fixGitignore.ts diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index ae8797f4d8..0000000000 --- a/Cargo.lock +++ /dev/null @@ -1,1025 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "ahash" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bnum" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const_panic" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b" - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "cosmwasm-crypto" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9934c79e58d9676edfd592557dee765d2a6ef54c09d5aa2edb06156b00148966" -dependencies = [ - "digest 0.10.7", - "ecdsa", - "ed25519-zebra", - "k256", - "rand_core 0.6.4", - "thiserror", -] - -[[package]] -name = "cosmwasm-derive" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" -dependencies = [ - "syn 1.0.109", -] - -[[package]] -name = "cosmwasm-schema" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e3a2136e2a60e8b6582f5dffca5d1a683ed77bf38537d330bc1dfccd69010" -dependencies = [ - "cosmwasm-schema-derive", - "schemars", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cosmwasm-schema-derive" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d803bea6bd9ed61bd1ee0b4a2eb09ee20dbb539cc6e0b8795614d20952ebb1" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "cosmwasm-std" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8666e572a3a2519010dde88c04d16e9339ae751b56b2bb35081fe3f7d6be74" -dependencies = [ - "base64", - "bech32", - "bnum", - "cosmwasm-crypto", - "cosmwasm-derive", - "derivative", - "forward_ref", - "hex", - "schemars", - "serde", - "serde-json-wasm", - "sha2 0.10.8", - "static_assertions", - "thiserror", -] - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "cw-storage-plus" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6cf70ef7686e2da9ad7b067c5942cd3e88dd9453f7af42f54557f8af300fb0" -dependencies = [ - "cosmwasm-std", - "schemars", - "serde", -] - -[[package]] -name = "cw-storage-plus" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" -dependencies = [ - "cosmwasm-std", - "schemars", - "serde", -] - -[[package]] -name = "cw-utils" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae0b69fa7679de78825b4edeeec045066aa2b2c4b6e063d80042e565bb4da5c" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw2 0.15.1", - "schemars", - "semver", - "serde", - "thiserror", -] - -[[package]] -name = "cw-utils" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw2 1.1.2", - "schemars", - "semver", - "serde", - "thiserror", -] - -[[package]] -name = "cw2" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5abb8ecea72e09afff830252963cb60faf945ce6cef2c20a43814516082653da" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 0.15.1", - "schemars", - "serde", -] - -[[package]] -name = "cw2" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "schemars", - "semver", - "serde", - "thiserror", -] - -[[package]] -name = "cw721" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20dfe04f86e5327956b559ffcc86d9a43167391f37402afd8bf40b0be16bee4d" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils 0.15.1", - "schemars", - "serde", -] - -[[package]] -name = "cw721" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c4d286625ccadc957fe480dd3bdc54ada19e0e6b5b9325379db3130569e914" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils 1.0.3", - "schemars", - "serde", -] - -[[package]] -name = "cw721-base" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c3ee3b669fc2a8094301a73fd7be97a7454d4df2650c33599f737e8f254d24" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 0.15.1", - "cw-utils 0.15.1", - "cw2 0.15.1", - "cw721 0.15.0", - "schemars", - "serde", - "thiserror", -] - -[[package]] -name = "cw721-metadata-onchain" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6ac509607834958c513ccc679f8c8ba0d6f0a84b495af0568577e883ffee3df" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw2 0.15.1", - "cw721 0.15.0", - "cw721-base", - "schemars", - "serde", -] - -[[package]] -name = "cw721_membership" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "cw721 0.18.0", - "cw721-metadata-onchain", - "schemars", - "serde", - "sylvia", - "thiserror", -] - -[[package]] -name = "der" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dyn-clone" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "ed25519-zebra" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" -dependencies = [ - "curve25519-dalek", - "hashbrown 0.12.3", - "hex", - "rand_core 0.6.4", - "serde", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "forward_ref" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "indexmap" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" -dependencies = [ - "equivalent", - "hashbrown 0.14.3", -] - -[[package]] -name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" - -[[package]] -name = "k256" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2 0.10.8", - "signature", -] - -[[package]] -name = "konst" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d712a8c49d4274f8d8a5cf61368cb5f3c143d149882b1a2918129e53395fdb0" -dependencies = [ - "const_panic", - "konst_kernel", - "konst_proc_macros", - "typewit", -] - -[[package]] -name = "konst_kernel" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac6ea8c376b6e208a81cf39b8e82bebf49652454d98a4829e907dac16ef1790" -dependencies = [ - "typewit", -] - -[[package]] -name = "konst_proc_macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e28ab1dc35e09d60c2b8c90d12a9a8d9666c876c10a3739a3196db0103b6043" - -[[package]] -name = "libc" -version = "0.2.153" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" - -[[package]] -name = "memchr" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ryu" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" - -[[package]] -name = "schemars" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" -dependencies = [ - "dyn-clone", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 1.0.109", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "semver" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" - -[[package]] -name = "serde" -version = "1.0.196" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-cw-value" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75d32da6b8ed758b7d850b6c3c08f1d7df51a4df3cb201296e63e34a78e99d4" -dependencies = [ - "serde", -] - -[[package]] -name = "serde-json-wasm" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.196" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "serde_derive_internals" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "serde_json" -version = "1.0.113" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "sylvia" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f358d505f46900e55154f028f18811961ebb58f7a92954ec03086ffb2b26cf51" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "konst", - "schemars", - "serde", - "serde-cw-value", - "serde-json-wasm", - "sylvia-derive", -] - -[[package]] -name = "sylvia-derive" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bed182fb775d756fdfe7e87174a4e43f1c446c8f9aff1de38a2165dd04b7d805" -dependencies = [ - "convert_case", - "proc-macro-crate", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "toml_datetime" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "typewit" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fb9ae6a3cafaf0a5d14c2302ca525f9ae8e07a0f0e6949de88d882c37a6e24" -dependencies = [ - "typewit_proc_macros", -] - -[[package]] -name = "typewit_proc_macros" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "winnow" -version = "0.5.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5389a154b01683d28c77f8f68f49dea75f0a4da32557a58f68ee51ebba472d29" -dependencies = [ - "memchr", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index 6e61c46f13..0000000000 --- a/Cargo.toml +++ /dev/null @@ -1,3 +0,0 @@ -[workspace] - -members = ["cosmwasm-contracts/*"] diff --git a/Makefile b/Makefile index e7dde61b97..6ff0632dd8 100644 --- a/Makefile +++ b/Makefile @@ -397,7 +397,7 @@ init-weshd-go: cd ./weshd && go install golang.org/x/mobile/cmd/gomobile cd ./weshd && gomobile init -.PHONY: bump-ios-build-number -bump-ios-build-number: +.PHONY: bump-app-build-number +bump-app-build-number: npx tsx packages/scripts/app-build/bumpBuildNumber.ts $(shell echo $$(($$(git rev-list HEAD --count) + 10))) diff --git a/app.config.js b/app.config.js index 9e533a4f7f..ccc5618b6c 100644 --- a/app.config.js +++ b/app.config.js @@ -37,6 +37,7 @@ const config = { backgroundColor: "#FFFFFF", }, package: "com.teritori", + versionCode: "6", }, web: { bundler: "metro", diff --git a/assets/icons/hand.svg b/assets/icons/hand.svg new file mode 100644 index 0000000000..9a7ba014b6 --- /dev/null +++ b/assets/icons/hand.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/points.svg b/assets/icons/points.svg new file mode 100644 index 0000000000..f05d8e7292 --- /dev/null +++ b/assets/icons/points.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/select-Icon.svg b/assets/icons/select-Icon.svg new file mode 100644 index 0000000000..22b3ee5df2 --- /dev/null +++ b/assets/icons/select-Icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/icons/unselect-icon.svg b/assets/icons/unselect-icon.svg new file mode 100644 index 0000000000..c724cf4f70 --- /dev/null +++ b/assets/icons/unselect-icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/cosmwasm-contracts/cw721-membership/Cargo.lock b/cosmwasm-contracts/cw721-membership/Cargo.lock index a5b9b6e030..1a8a754b7c 100644 --- a/cosmwasm-contracts/cw721-membership/Cargo.lock +++ b/cosmwasm-contracts/cw721-membership/Cargo.lock @@ -13,6 +13,18 @@ dependencies = [ "version_check", ] +[[package]] +name = "anyhow" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + [[package]] name = "base16ct" version = "0.2.0" @@ -67,6 +79,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + [[package]] name = "cfg-if" version = "1.0.0" @@ -101,9 +119,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8bb3c77c3b7ce472056968c745eb501c440fbc07be5004eba02782c35bfbbe3" dependencies = [ "digest 0.10.7", - "ecdsa", + "ecdsa 0.16.9", "ed25519-zebra", - "k256", + "k256 0.13.2", "rand_core 0.6.4", "thiserror", ] @@ -172,6 +190,18 @@ dependencies = [ "libc", ] +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-bigint" version = "0.5.5" @@ -207,6 +237,25 @@ dependencies = [ "zeroize", ] +[[package]] +name = "cw-multi-test" +version = "0.16.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "127c7bb95853b8e828bdab97065c81cb5ddc20f7339180b61b2300565aaa99d1" +dependencies = [ + "anyhow", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "derivative", + "itertools", + "k256 0.11.6", + "prost", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "cw-storage-plus" version = "0.15.1" @@ -330,6 +379,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw721-membership" +version = "0.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw721 0.18.0", + "cw721-metadata-onchain", + "schemars", + "serde", + "sylvia", + "thiserror", +] + [[package]] name = "cw721-metadata-onchain" version = "0.15.0" @@ -346,18 +410,13 @@ dependencies = [ ] [[package]] -name = "cw721_membership" -version = "0.1.0" +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "cw721 0.18.0", - "cw721-metadata-onchain", - "schemars", - "serde", - "sylvia", - "thiserror", + "const-oid", + "zeroize", ] [[package]] @@ -408,18 +467,30 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + [[package]] name = "ecdsa" version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der", + "der 0.7.8", "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", ] [[package]] @@ -437,21 +508,47 @@ dependencies = [ "zeroize", ] +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array", + "group 0.12.1", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle", + "zeroize", +] + [[package]] name = "elliptic-curve" version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "base16ct", - "crypto-bigint", + "base16ct 0.2.0", + "crypto-bigint 0.5.5", "digest 0.10.7", - "ff", + "ff 0.13.0", "generic-array", - "group", - "pkcs8", + "group 0.13.0", + "pkcs8 0.10.2", "rand_core 0.6.4", - "sec1", + "sec1 0.7.3", "subtle", "zeroize", ] @@ -462,6 +559,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "ff" version = "0.13.0" @@ -500,13 +607,24 @@ dependencies = [ "wasi", ] +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff", + "ff 0.13.0", "rand_core 0.6.4", "subtle", ] @@ -551,12 +669,33 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.8", +] + [[package]] name = "k256" version = "0.13.2" @@ -564,11 +703,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" dependencies = [ "cfg-if", - "ecdsa", - "elliptic-curve", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "once_cell", "sha2 0.10.8", - "signature", + "signature 2.2.0", ] [[package]] @@ -622,14 +761,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", +] + [[package]] name = "pkcs8" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der", - "spki", + "der 0.7.8", + "spki 0.7.3", ] [[package]] @@ -675,6 +824,29 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prost" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "quote" version = "1.0.33" @@ -699,6 +871,17 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -739,16 +922,30 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct", - "der", + "base16ct 0.2.0", + "der 0.7.8", "generic-array", - "pkcs8", + "pkcs8 0.10.2", "subtle", "zeroize", ] @@ -843,6 +1040,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + [[package]] name = "signature" version = "2.2.0" @@ -853,6 +1060,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + [[package]] name = "spki" version = "0.7.3" @@ -860,7 +1077,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der", + "der 0.7.8", ] [[package]] @@ -881,8 +1098,11 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f358d505f46900e55154f028f18811961ebb58f7a92954ec03086ffb2b26cf51" dependencies = [ + "anyhow", "cosmwasm-schema", "cosmwasm-std", + "cw-multi-test", + "derivative", "konst", "schemars", "serde", diff --git a/cosmwasm-contracts/cw721-membership/Cargo.toml b/cosmwasm-contracts/cw721-membership/Cargo.toml index d6c602b4c7..fba41f8221 100644 --- a/cosmwasm-contracts/cw721-membership/Cargo.toml +++ b/cosmwasm-contracts/cw721-membership/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "cw721_membership" +name = "cw721-membership" version = "0.1.0" edition = "2021" @@ -16,3 +16,6 @@ cw-storage-plus = "1.1.0" thiserror = "1.0.44" cw721 = "0.18.0" cw721-metadata-onchain = { version = "0.15.0", features = ["library"] } + +[dev-dependencies] +sylvia = { version = "0.7.0", features = ["mt"] } diff --git a/cosmwasm-contracts/cw721-membership/Makefile b/cosmwasm-contracts/cw721-membership/Makefile index 20177c7fc1..fb0b08250b 100644 --- a/cosmwasm-contracts/cw721-membership/Makefile +++ b/cosmwasm-contracts/cw721-membership/Makefile @@ -1,8 +1,12 @@ -CODE_ID=13 ADMIN=testnet-adm ADMIN_ADDR=$(shell teritorid keys show $(ADMIN) --keyring-backend test --output json | jq -r .address) -TX_FLAGS=--from $(ADMIN) --chain-id teritori-test-6 --node https://rpc.testnet.teritori.com:443 --gas auto --gas-adjustment 1.3 -y -b sync --output json --keyring-backend test -CONTRACT_ADDRESS=tori1yek2csaaw550wq52v06ztwp2snuxp8epkfzzvqfvkv8g6xfv3nqqzgz3p9 +NODE_FLAG=--node https://rpc.testnet.teritori.com:443 +TX_FLAGS=--from $(ADMIN) --chain-id teritori-test-6 $(NODE_FLAG) --gas auto --gas-adjustment 1.3 -y -b sync --output json --keyring-backend test -o json +QUERY_FLAGS=$(NODE_FLAG) -o json + +# only informative +CODE_ID=43 +CONTRACT_ADDRESS=tori1quf0cu5tlg54aqjd8z54gpvcnh29n6l8qcqmllgrl4gz6jlyn7tsrjllj8 artifacts/cw721_membership.wasm: docker run --rm -v "$(PWD)":/code \ @@ -13,8 +17,13 @@ artifacts/cw721_membership.wasm: .PHONY: deploy.testnet deploy.testnet: artifacts/cw721_membership.wasm - teritorid tx wasm store artifacts/cw721_membership.wasm $(TX_FLAGS) + set -o pipefail; \ + TXHASH=$$(teritorid tx wasm store artifacts/cw721_membership.wasm $(TX_FLAGS) | jq -r .txhash); \ + while ! teritorid query tx $$TXHASH $(QUERY_FLAGS) 2>/dev/null | jq -r '.logs[0].events[] | select(.type=="store_code").attributes[] | select(.key=="code_id").value'; do sleep 1; done .PHONY: instantiate.testnet instantiate.testnet: - teritorid tx wasm instantiate $(CODE_ID) '{ "admin_addr": "$(ADMIN_ADDR)", "mint_royalties": 1000 }' --label Cw721Membership --admin $(ADMIN_ADDR) $(TX_FLAGS) + set -o pipefail; \ + TXHASH=$$(teritorid tx wasm instantiate $(CODE_ID) '{ "admin_addr": "$(ADMIN_ADDR)", "mint_royalties": 1000 }' --label Cw721Membership --admin $(ADMIN_ADDR) $(TX_FLAGS) | jq -r .txhash); \ + while ! teritorid query tx $$TXHASH $(QUERY_FLAGS) 2>/dev/null | jq -r '.logs[0].events[] | select(.type=="instantiate").attributes[] | select(.key=="_contract_address").value'; do sleep 1; done + diff --git a/cosmwasm-contracts/cw721-membership/schema/cw721_membership.json b/cosmwasm-contracts/cw721-membership/schema/cw721-membership.json similarity index 96% rename from cosmwasm-contracts/cw721-membership/schema/cw721_membership.json rename to cosmwasm-contracts/cw721-membership/schema/cw721-membership.json index 115d2e587c..b23821d020 100644 --- a/cosmwasm-contracts/cw721-membership/schema/cw721_membership.json +++ b/cosmwasm-contracts/cw721-membership/schema/cw721-membership.json @@ -1,5 +1,5 @@ { - "contract_name": "cw721_membership", + "contract_name": "cw721-membership", "contract_version": "0.1.0", "idl_version": "1.0.0", "instantiate": { @@ -512,6 +512,34 @@ } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "all_tokens" + ], + "properties": { + "all_tokens": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false } ] } @@ -799,6 +827,24 @@ } } }, + "all_tokens": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "TokensResponse", + "type": "object", + "required": [ + "tokens" + ], + "properties": { + "tokens": { + "description": "Contains all token_ids in lexicographical ordering If there are more than `limit`, use `start_after` in future queries to achieve pagination.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, "channel": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "ChannelResponse", diff --git a/cosmwasm-contracts/cw721-membership/schema/raw/query.json b/cosmwasm-contracts/cw721-membership/schema/raw/query.json index 7d6613b1c7..2cb66d6d81 100644 --- a/cosmwasm-contracts/cw721-membership/schema/raw/query.json +++ b/cosmwasm-contracts/cw721-membership/schema/raw/query.json @@ -216,6 +216,34 @@ } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "all_tokens" + ], + "properties": { + "all_tokens": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false } ] } diff --git a/cosmwasm-contracts/cw721-membership/schema/raw/response_to_all_tokens.json b/cosmwasm-contracts/cw721-membership/schema/raw/response_to_all_tokens.json new file mode 100644 index 0000000000..4728d37e2d --- /dev/null +++ b/cosmwasm-contracts/cw721-membership/schema/raw/response_to_all_tokens.json @@ -0,0 +1,18 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "TokensResponse", + "type": "object", + "required": [ + "tokens" + ], + "properties": { + "tokens": { + "description": "Contains all token_ids in lexicographical ordering If there are more than `limit`, use `start_after` in future queries to achieve pagination.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false +} diff --git a/cosmwasm-contracts/cw721-membership/src/contract.rs b/cosmwasm-contracts/cw721-membership/src/contract.rs index acb9b5578c..468175d533 100644 --- a/cosmwasm-contracts/cw721-membership/src/contract.rs +++ b/cosmwasm-contracts/cw721-membership/src/contract.rs @@ -28,20 +28,20 @@ pub struct Cw721MembershipContract { #[cw_serde] pub struct MembershipConfig { - display_name: String, - description: String, - nft_image_uri: String, - nft_name_prefix: String, - duration_seconds: Uint64, - trade_royalties: u16, // 0-10000 = 0%-100%, - price: Coin, + pub display_name: String, + pub description: String, + pub nft_image_uri: String, + pub nft_name_prefix: String, + pub duration_seconds: Uint64, + pub trade_royalties: u16, // 0-10000 = 0%-100%, + pub price: Coin, } #[cw_serde] pub struct ChannelResponse { - memberships_config: Vec, - mint_royalties: u16, // 0-10000 = 0%-100% - // TODO: tokens_count + pub memberships_config: Vec, + pub mint_royalties: u16, // 0-10000 = 0%-100% + // TODO: tokens_count } #[cw_serde] @@ -215,13 +215,18 @@ impl Cw721MembershipContract { image_uri: membership.nft_image_uri.to_owned(), start_time: ctx.env.block.time.to_owned(), duration_seconds: membership.duration_seconds, - owner_addr: recipient_addr, + owner_addr: recipient_addr.to_owned(), }; self.nfts.save( ctx.deps.storage, (channel_addr.to_owned(), nft_index.into()), &nft, )?; + self.by_owner.save( + ctx.deps.storage, + (recipient_addr, channel_addr.to_owned(), nft_index.into()), + &(), + )?; channel.next_index = channel.next_index.checked_add(Uint64::one())?; self.channels @@ -678,11 +683,11 @@ impl Cw721MembershipContract { ) -> Result { let owner_addr = ctx.deps.api.addr_validate(owner.as_str())?; let limit = limit.map(|limit| limit as usize).unwrap_or(30); - let start_after = match start_after { + let min_bound = match start_after { Some(start_after) => { let (channel_addr, nft_index) = parse_token_id(&start_after)?; let channel_addr = Addr::unchecked(channel_addr.as_str()); - Some((channel_addr, nft_index)) + Some(Bound::exclusive((channel_addr, nft_index))) } None => None, }; @@ -690,12 +695,7 @@ impl Cw721MembershipContract { let tokens: Result, _> = self .by_owner .sub_prefix(owner_addr) - .range( - ctx.deps.storage, - start_after.map(|sa| Bound::exclusive(sa)), - None, - Order::Ascending, - ) + .range(ctx.deps.storage, min_bound, None, Order::Ascending) .take(limit) .map(|item| -> Result { let ((channel_addr, nft_index), _) = item?; @@ -705,6 +705,10 @@ impl Cw721MembershipContract { Ok(TokensResponse { tokens: tokens? }) } + /// With Enumerable extension. + /// Returns all tokens + /// Return type: TokensResponse. + #[msg(query)] pub fn all_tokens( &self, ctx: QueryCtx, @@ -773,7 +777,7 @@ impl Cw721MembershipContract { token_uri: None, extension: NftExtension { name: Some(nft.name), - description: None, + description: Some(nft.description), image: Some(nft.image_uri), animation_url: None, external_url: None, diff --git a/cosmwasm-contracts/cw721-membership/src/lib.rs b/cosmwasm-contracts/cw721-membership/src/lib.rs index ed72987554..ae5b855d2f 100644 --- a/cosmwasm-contracts/cw721-membership/src/lib.rs +++ b/cosmwasm-contracts/cw721-membership/src/lib.rs @@ -1,2 +1,4 @@ pub mod contract; pub mod error; +#[cfg(test)] +pub mod multitest; diff --git a/cosmwasm-contracts/cw721-membership/src/multitest.rs b/cosmwasm-contracts/cw721-membership/src/multitest.rs new file mode 100644 index 0000000000..811f502172 --- /dev/null +++ b/cosmwasm-contracts/cw721-membership/src/multitest.rs @@ -0,0 +1,149 @@ +use cosmwasm_std::{Addr, Coin, Timestamp, Uint128, Uint64}; +use cw721::{NftInfoResponse, TokensResponse}; +use cw721_metadata_onchain::{Metadata, Trait}; +use sylvia::{anyhow::Error, multitest::App}; + +use crate::contract::{ + multitest_utils::CodeId, MembershipConfig, Subscription, SubscriptionResponse, +}; + +#[test] +fn basic_full_flow() { + let app = App::default(); + let code_id = CodeId::store_code(&app); + + let creator = "creator"; + let admin = "admin"; + let channel_owner = "channel_owner"; + let sub_user = "sub_user"; + let mint_royalties = 5; + + app.app_mut() + .init_modules(|router, _, storage| { + router.bank.init_balance( + storage, + &Addr::unchecked(sub_user.to_string()), + vec![Coin::new(1000000, "utori")], + )?; + Ok::<(), Error>(()) + }) + .unwrap(); + + let contract = code_id + .instantiate(admin.to_string(), mint_royalties) + .call(creator) + .unwrap(); + + let memberships_config = vec![MembershipConfig { + display_name: "Channel".to_string(), + description: "Channel description".to_string(), + nft_image_uri: "https://example.com/image.png".to_string(), + nft_name_prefix: "Sub".to_string(), + duration_seconds: Uint64::from(60u32 * 60 * 24 * 7), + price: Coin { + denom: "utori".to_string(), + amount: Uint128::from(1000000u32), + }, + trade_royalties: 20, + }]; + + contract + .upsert_channel(memberships_config.clone()) + .call(channel_owner) + .unwrap(); + + let channel_response = contract.channel(channel_owner.to_string()).unwrap(); + assert_eq!(channel_response.memberships_config, memberships_config); + assert_eq!(channel_response.mint_royalties, mint_royalties); + + contract + .subscribe(channel_owner.to_string(), sub_user.to_string(), 0) + .with_funds(&[Coin { + denom: "utori".to_string(), + amount: Uint128::from(1000000u32), + }]) + .call(sub_user) + .unwrap(); + + let tokens_response = contract.tokens(sub_user.to_string(), None, None).unwrap(); + assert_eq!( + tokens_response, + TokensResponse { + tokens: vec!["channel_owner#1".to_string()] + } + ); + + let all_tokens_response = contract.all_tokens(None, None).unwrap(); + assert_eq!( + all_tokens_response, + TokensResponse { + tokens: vec!["channel_owner#1".to_string()] + } + ); + + let token_info_response = contract.nft_info("channel_owner#1".to_string()).unwrap(); + assert_eq!( + token_info_response, + NftInfoResponse { + token_uri: None, + extension: Metadata { + image: Some("https://example.com/image.png".to_string()), + name: Some("Sub #1".to_string()), + description: Some("Channel description".to_string()), + attributes: Some(vec![ + Trait { + display_type: Some("DISPLAY_TYPE_PROPERTY".to_string()), + trait_type: "Channel address".to_string(), + value: "channel_owner".to_string() + }, + Trait { + display_type: Some("DISPLAY_TYPE_DATE".to_string()), + trait_type: "Starts".to_string(), + value: "1571797419.879305533".to_string() + }, + Trait { + display_type: Some("DISPLAY_TYPE_PROPERTY".to_string()), + trait_type: "Duration in seconds".to_string(), + value: "604800".to_string() + }, + ]), + ..Default::default() + } + } + ); + + // go 6 days into the future + app.update_block(|block| { + block.time = Timestamp::from_seconds(block.time.seconds() + 60 * 60 * 24 * 6); + }); + + let subscription = contract + .subscription(sub_user.to_string(), channel_owner.to_string()) + .unwrap(); + assert_eq!( + subscription, + SubscriptionResponse { + subscription: Some(Subscription { + expiration: Timestamp::from_nanos(1572402219879305533), + level_expiration: Timestamp::from_nanos(1572402219879305533) + }), + level: 1 + } + ); + + // go 2 days into the future + app.update_block(|block| { + block.time = Timestamp::from_seconds(block.time.seconds() + 60 * 60 * 24 * 2); + }); + + let subscription = contract + .subscription(sub_user.to_string(), channel_owner.to_string()) + .unwrap(); + assert_eq!( + subscription, + SubscriptionResponse { + subscription: None, + level: 0 + } + ); +} diff --git a/eas.json b/eas.json index 6dff45df29..87eccb946f 100644 --- a/eas.json +++ b/eas.json @@ -21,7 +21,9 @@ "submit": { "production": { "android": { - "track": "internal" + "track": "internal", + "serviceAccountKeyPath": "./service-account-android-submit.json", + "releaseStatus": "draft" }, "ios": { "appleId": "sakulbudhathoki977@gmail.com", diff --git a/go/pkg/p2e/seasons.go b/go/pkg/p2e/seasons.go index 38478f3716..30e8bef569 100644 --- a/go/pkg/p2e/seasons.go +++ b/go/pkg/p2e/seasons.go @@ -209,4 +209,17 @@ var THE_RIOT_ETHEREUM_SEASONS = []Season{ StartsAt: "2024-02-07T00:00:00", EndsAt: "2024-02-11T00:00:00", }, + // Season 1b + { + ID: "Season 1b - ETH", + GameID: THE_RIOT_GAME_ID, + Denom: "tori", + Decimals: 6, + TotalPrize: 1, + BossName: "Tori Pup", + BossImage: "https://bafkreidzf2kol7hi3lae33fpu6iryfw7mgbp5fbqnyewq64kagykc266h4.ipfs.cf-ipfs.com/", + TopN: 500, + StartsAt: "2024-02-11T00:00:00", + EndsAt: "2024-02-20T00:00:00", + }, } diff --git a/networks.json b/networks.json index dccb38f04e..f98febaa49 100644 --- a/networks.json +++ b/networks.json @@ -10939,7 +10939,7 @@ "featureObjects": [ { "type": "CosmWasmPremiumFeed", - "membershipContractAddress": "tori1yek2csaaw550wq52v06ztwp2snuxp8epkfzzvqfvkv8g6xfv3nqqzgz3p9", + "membershipContractAddress": "tori1quf0cu5tlg54aqjd8z54gpvcnh29n6l8qcqmllgrl4gz6jlyn7tsrjllj8", "mintDenom": "utori" } ], diff --git a/package.json b/package.json index 439de61215..fb7f2e0f6e 100644 --- a/package.json +++ b/package.json @@ -191,7 +191,7 @@ "rimraf": "^5.0.5", "ts-proto": "^1.120.0", "ts-unused-exports": "^10.0.1", - "typescript": "^5.2.2" + "typescript": "^5.3.0" }, "resolutions": { "@gnolang/tm2-js-client@^1.0.0": "patch:@gnolang/tm2-js-client@npm%3A1.0.1#./.yarn/patches/@gnolang-tm2-js-client-npm-1.0.1-9e54bafbb3.patch", diff --git a/packages/components/hub/ProfileButton.tsx b/packages/components/hub/ProfileButton.tsx index 72e568fdf9..6ee1fefbfe 100644 --- a/packages/components/hub/ProfileButton.tsx +++ b/packages/components/hub/ProfileButton.tsx @@ -35,14 +35,23 @@ import { TextInputCustom } from "../inputs/TextInputCustom"; import ModalBase from "../modals/ModalBase"; import { SpacerColumn } from "../spacer"; +import { useTNS } from "@/context/TNSProvider"; import { ButtonsSize } from "@/utils/style/buttons"; export const ProfileButton: React.FC<{ buttonSize?: ButtonsSize; style?: StyleProp; isEdit?: boolean; -}> = ({ style, isEdit, buttonSize = "XL" }) => { + setIsEditProfileModal?: (val: boolean) => void; +}> = ({ + style, + isEdit, + buttonSize = "XL", + setIsEditProfileModal = (val: boolean) => {}, +}) => { const selectedWallet = useSelectedWallet(); + const { setName } = useTNS(); + const network = getNetwork(selectedWallet?.networkId); const { metadata } = useNSUserInfo(selectedWallet?.userId); if (!network?.features.includes(NetworkFeature.NameService)) { @@ -50,37 +59,41 @@ export const ProfileButton: React.FC<{ } if (selectedWallet && metadata?.tokenId) - return ( - + if (isEdit) { + return ( { + const tokenName = metadata?.tokenId?.replace(".tori", ""); + setIsEditProfileModal(true); + setName(tokenName || ""); + }} /> - - ); + ); + } else { + return ( + + + + ); + } return ; }; diff --git a/packages/components/navigation/MiniModeNavigator.tsx b/packages/components/navigation/MiniModeNavigator.tsx index 2063f0ac6b..414cdb37df 100644 --- a/packages/components/navigation/MiniModeNavigator.tsx +++ b/packages/components/navigation/MiniModeNavigator.tsx @@ -10,6 +10,7 @@ import { RootStackParamList } from "../../utils/navigation"; import { neutral00, secondaryColor } from "../../utils/style/colors"; import { TabBarIcon } from "../TabBarIcon"; +import { useOnboardedStatus } from "@/hooks/useOnboardStatus"; import { FeedPostViewScreen } from "@/screens/FeedPostView/FeedPostViewScreen"; import { NFTDetailScreen } from "@/screens/Marketplace/NFTDetailScreen"; import AboutScreen from "@/screens/Mini/About/AboutScreen"; @@ -54,7 +55,6 @@ import { CreateWalletScreen } from "@/screens/Wallet/Screens/CreateWalletScreen" import { ImportWallet } from "@/screens/Wallet/Screens/ImportWallet"; import NativeWallet from "@/screens/Wallet/Screens/NativeWallet"; import { SuccessScreen } from "@/screens/Wallet/Screens/SucessScreen"; -import { ViewSeed } from "@/screens/Wallet/Screens/ViewSeed"; const Stack = createNativeStackNavigator(); const Tab = createBottomTabNavigator(); @@ -94,9 +94,15 @@ const MainTab = () => { ); }; -export const MiniModeNavigator: React.FC = () => { +export const MiniModeNavigator = () => { + const [isLoading, isOnboarded] = useOnboardedStatus(); + + if (isLoading) return null; + return ( - + { options={{ header: () => null }} component={MainTab} /> - null, title: "View Seed" }} - /> { component={NativeWallet} options={{ header: () => null, title: screenTitle("Wallet Create") }} /> - null, title: screenTitle("View Seed") }} - /> >(); @@ -136,6 +136,10 @@ export const NFTMainInfo: React.FC<{ }, [network?.id, nftInfo]); const SelectedTabItemRendering: React.FC = () => { + const sectionContainerStyles: ViewStyle = { + width: width < 600 ? width : 600, + paddingVertical: layout.spacing_x3, + }; switch (selectedTab) { case "about": return ( @@ -231,6 +235,11 @@ export const NFTMainInfo: React.FC<{ default: module.CollapsablePriceHistory, })), ); + const collapsableContainerStyles: ViewStyle = { + width: "100%", + maxWidth: screenContentMaxWidth, + marginBottom: layout.spacing_x2, + }; return ( <> @@ -253,7 +262,7 @@ export const NFTMainInfo: React.FC<{ > @@ -380,13 +389,3 @@ export const NFTMainInfo: React.FC<{ ); }; - -const sectionContainerStyles: ViewStyle = { - width: 600, - paddingVertical: layout.spacing_x3, -}; -const collapsableContainerStyles: ViewStyle = { - width: "100%", - maxWidth: screenContentMaxWidth, - marginBottom: layout.spacing_x2, -}; diff --git a/packages/components/tabs/Tabs.tsx b/packages/components/tabs/Tabs.tsx index 17311ba845..2065303fdb 100644 --- a/packages/components/tabs/Tabs.tsx +++ b/packages/components/tabs/Tabs.tsx @@ -12,6 +12,7 @@ import { ViewStyle, } from "react-native"; +import pointsSVG from "../../../assets/icons/points.svg"; import { gradientColorBlue, gradientColorDarkerBlue, @@ -19,6 +20,7 @@ import { neutral33, neutral77, secondaryColor, + yellowPremium, } from "../../utils/style/colors"; import { fontSemibold14 } from "../../utils/style/fonts"; import { layout } from "../../utils/style/layout"; @@ -30,6 +32,7 @@ import { TertiaryBadge } from "../badges/TertiaryBadge"; import { GradientText } from "../gradientText"; import { SpacerRow } from "../spacer"; +import { useDeveloperMode } from "@/hooks/useDeveloperMode"; import { TabDefinition } from "@/utils/types/tabs"; export const Tabs = ({ @@ -65,7 +68,7 @@ export const Tabs = ({ animated: false, }); }; - + const [developerMode] = useDeveloperMode(); return ( // styles are applied weirdly to ScrollView, so it's better to apply them to a constraining view <> @@ -89,108 +92,128 @@ export const Tabs = ({ {itemsKeys.map((key, index) => { const item = items[key]; const isSelected = selected === key; - return ( - - item.scrollTo - ? scrollTo(item.scrollTo, { offset: -60 }) - : onSelect(key, item) - } - disabled={item.disabled} - style={[ - { - height: "100%", - justifyContent: "center", - marginRight: - index !== itemsKeys.length - 1 ? layout.spacing_x3 : 0, - }, - tabContainerStyle, - ]} - > - + item.scrollTo + ? scrollTo(item.scrollTo, { offset: -60 }) + : onSelect(key, item) + } + disabled={item.disabled} + style={[ + { + height: "100%", + justifyContent: "center", + marginRight: + index !== itemsKeys.length - 1 ? layout.spacing_x3 : 0, + }, + tabContainerStyle, + ]} > - {isSelected && gradientText ? ( - - {item.name} - - ) : ( - - {item.name} - - )} - - {!!item.badgeCount && } - {item.badgeCount ? ( - isSelected ? ( - - ) : ( - - ) - ) : null} - - {item.iconSVG && ( - - - - )} - - {!hideSelector && isSelected && ( - <> - {gradientText ? ( - - ) : ( + + {key === "premium-content" && ( + + + )} + {isSelected && gradientText ? ( + + {item.name} + + ) : ( + + > + {item.name} + )} - - )} - - ); + + {!!item.badgeCount && } + {item.badgeCount ? ( + isSelected ? ( + + ) : ( + + ) + ) : null} + + {item.iconSVG && ( + + + + )} + + {!hideSelector && isSelected && ( + <> + {gradientText ? ( + + ) : ( + + )} + + )} + + ); + } })} diff --git a/packages/contracts-clients/cw721-membership/Cw721Membership.client.ts b/packages/contracts-clients/cw721-membership/Cw721Membership.client.ts index 896b55473c..9c3c7c5d6c 100644 --- a/packages/contracts-clients/cw721-membership/Cw721Membership.client.ts +++ b/packages/contracts-clients/cw721-membership/Cw721Membership.client.ts @@ -6,7 +6,7 @@ import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; import { StdFee } from "@cosmjs/amino"; -import { InstantiateMsg, ExecuteMsg, ExecMsg, Uint64, Uint128, MembershipConfig, Coin, QueryMsg, QueryMsg1, AdminFundsResponse, Expiration, Timestamp, AllNftInfoResponseForMetadata, OwnerOfResponse, Approval, NftInfoResponseForMetadata, Metadata, Trait, ChannelResponse, ChannelFundsResponse, ContractInfoResponse, NumTokensResponse, SubscriptionResponse, Subscription, TokensResponse } from "./Cw721Membership.types"; +import { InstantiateMsg, ExecuteMsg, ExecMsg, Uint64, Uint128, MembershipConfig, Coin, QueryMsg, QueryMsg1, AdminFundsResponse, Expiration, Timestamp, AllNftInfoResponseForMetadata, OwnerOfResponse, Approval, NftInfoResponseForMetadata, Metadata, Trait, TokensResponse, ChannelResponse, ChannelFundsResponse, ContractInfoResponse, NumTokensResponse, SubscriptionResponse, Subscription } from "./Cw721Membership.types"; export interface Cw721MembershipReadOnlyInterface { contractAddress: string; channel: ({ @@ -57,6 +57,13 @@ export interface Cw721MembershipReadOnlyInterface { owner: string; startAfter?: string; }) => Promise; + allTokens: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }) => Promise; } export class Cw721MembershipQueryClient implements Cw721MembershipReadOnlyInterface { client: CosmWasmClient; @@ -75,6 +82,7 @@ export class Cw721MembershipQueryClient implements Cw721MembershipReadOnlyInterf this.nftInfo = this.nftInfo.bind(this); this.allNftInfo = this.allNftInfo.bind(this); this.tokens = this.tokens.bind(this); + this.allTokens = this.allTokens.bind(this); } channel = async ({ @@ -184,6 +192,20 @@ export class Cw721MembershipQueryClient implements Cw721MembershipReadOnlyInterf } }); }; + allTokens = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + all_tokens: { + limit, + start_after: startAfter + } + }); + }; } export interface Cw721MembershipInterface extends Cw721MembershipReadOnlyInterface { contractAddress: string; diff --git a/packages/contracts-clients/cw721-membership/Cw721Membership.types.ts b/packages/contracts-clients/cw721-membership/Cw721Membership.types.ts index 0165397d39..d2154f4bc6 100644 --- a/packages/contracts-clients/cw721-membership/Cw721Membership.types.ts +++ b/packages/contracts-clients/cw721-membership/Cw721Membership.types.ts @@ -126,6 +126,12 @@ export type QueryMsg1 = { start_after?: string | null; [k: string]: unknown; }; +} | { + all_tokens: { + limit?: number | null; + start_after?: string | null; + [k: string]: unknown; + }; }; export interface AdminFundsResponse { funds: Coin[]; @@ -170,6 +176,9 @@ export interface Trait { trait_type: string; value: string; } +export interface TokensResponse { + tokens: string[]; +} export interface ChannelResponse { memberships_config: MembershipConfig[]; mint_royalties: number; @@ -191,7 +200,4 @@ export interface SubscriptionResponse { export interface Subscription { expiration: Timestamp; level_expiration: Timestamp; -} -export interface TokensResponse { - tokens: string[]; } \ No newline at end of file diff --git a/packages/hooks/feed/usePremiumChannel.ts b/packages/hooks/feed/usePremiumChannel.ts index f20f906cc3..dcbf9c7dad 100644 --- a/packages/hooks/feed/usePremiumChannel.ts +++ b/packages/hooks/feed/usePremiumChannel.ts @@ -1,11 +1,6 @@ import { useQuery } from "@tanstack/react-query"; -import { Cw721MembershipQueryClient } from "@/contracts-clients/cw721-membership"; -import { - NetworkFeature, - getNetworkFeature, - mustGetNonSigningCosmWasmClient, -} from "@/networks"; +import { mustGetCw721MembershipQueryClient } from "@/utils/feed/client"; export const usePremiumChannel = ( networkId: string | undefined, @@ -18,19 +13,7 @@ export const usePremiumChannel = ( return null; } - const premiumFeedFeature = getNetworkFeature( - networkId, - NetworkFeature.CosmWasmPremiumFeed, - ); - if (!premiumFeedFeature) { - return null; - } - - const cosmwasmClient = await mustGetNonSigningCosmWasmClient(networkId); - const client = new Cw721MembershipQueryClient( - cosmwasmClient, - premiumFeedFeature.membershipContractAddress, - ); + const client = await mustGetCw721MembershipQueryClient(networkId); try { const channel = await client.channel({ channelAddr: channelAddress }); diff --git a/packages/hooks/feed/usePremiumIsSubscribed.ts b/packages/hooks/feed/usePremiumIsSubscribed.ts new file mode 100644 index 0000000000..bacb977e2a --- /dev/null +++ b/packages/hooks/feed/usePremiumIsSubscribed.ts @@ -0,0 +1,12 @@ +import { usePremiumSubscription } from "./usePremiumSubscription"; + +export const usePremiumIsSubscribed = ( + channelUserId: string | undefined, + subUserId: string | undefined, +) => { + const { data, ...other } = usePremiumSubscription(channelUserId, subUserId); + return { + data: data === undefined ? undefined : !!data?.subscription, + ...other, + }; +}; diff --git a/packages/hooks/feed/usePremiumSubscription.ts b/packages/hooks/feed/usePremiumSubscription.ts new file mode 100644 index 0000000000..292480b2a2 --- /dev/null +++ b/packages/hooks/feed/usePremiumSubscription.ts @@ -0,0 +1,40 @@ +import { useQuery } from "@tanstack/react-query"; + +import { parseUserId } from "@/networks"; +import { mustGetCw721MembershipQueryClient } from "@/utils/feed/client"; + +export const usePremiumSubscription = ( + channelUserId: string | undefined, + subUserId: string | undefined, +) => { + console.log("use premium sub", channelUserId, subUserId); + return useQuery( + ["premium-is-subscribed", channelUserId, subUserId], + async () => { + console.log("fetch sub", channelUserId, subUserId); + + const [network, channelAddr] = parseUserId(channelUserId); + const [, subAddr] = parseUserId(subUserId); + + if (!network || !channelAddr || !subAddr) { + return null; + } + + const client = await mustGetCw721MembershipQueryClient(network.id); + + const tokens = await client.tokens({ owner: subAddr }); + console.log("sub tokens", tokens); + + const allTokens = await client.allTokens({}); + console.log("all sub tokens", allTokens); + + const result = await client.subscription({ + channelAddr, + subAddr, + }); + console.log("got sub", result); + return result; + }, + { staleTime: Infinity }, + ); +}; diff --git a/packages/hooks/useAppMode.ts b/packages/hooks/useAppMode.ts index 476942bccd..ae1389c53f 100644 --- a/packages/hooks/useAppMode.ts +++ b/packages/hooks/useAppMode.ts @@ -3,7 +3,10 @@ import { useDispatch, useSelector } from "react-redux"; import { selectAppMode, setAppMode } from "@/store/slices/settings"; import { AppMode } from "@/utils/types/app-mode"; -export const useAppMode = () => { +export const useAppMode = (): [ + appMode: AppMode, + handleSet: (mode: AppMode) => void, +] => { const appMode = useSelector(selectAppMode); const dispatch = useDispatch(); diff --git a/packages/hooks/useChatActivated.ts b/packages/hooks/useChatActivated.ts new file mode 100644 index 0000000000..b4f095d63e --- /dev/null +++ b/packages/hooks/useChatActivated.ts @@ -0,0 +1,20 @@ +import { useDispatch, useSelector } from "react-redux"; + +import { + selectIsChatActivated, + setIsChatActivated, +} from "@/store/slices/settings"; + +export const useChatActivated = (): [ + isChatActivated: boolean, + (status: boolean) => void, +] => { + const isChatActivated = useSelector(selectIsChatActivated); + const dispatch = useDispatch(); + + const handleSet = (status: boolean) => { + dispatch(setIsChatActivated(status)); + }; + + return [isChatActivated, handleSet]; +}; diff --git a/packages/hooks/useOnboardStatus.ts b/packages/hooks/useOnboardStatus.ts new file mode 100644 index 0000000000..06e9a32a22 --- /dev/null +++ b/packages/hooks/useOnboardStatus.ts @@ -0,0 +1,24 @@ +import AsyncStorage from "@react-native-async-storage/async-storage"; +import { useEffect, useState } from "react"; + +import { safeParseJSON } from "@/utils/sanitize"; + +export function useOnboardedStatus(): [ + isLoading: boolean, + isOnboarded: boolean, +] { + const [isOnboarded, setIsOnboarded] = useState(false); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + getOnboardedStatus(); + }, []); + const getOnboardedStatus = async () => { + const onboarded = await AsyncStorage.getItem("ONBOARDED"); + const isOnboardedStat = safeParseJSON(onboarded as string) as boolean; + + setIsOnboarded(isOnboardedStat); + setIsLoading(false); + }; + return [isLoading, isOnboarded]; +} diff --git a/packages/networks/teritori-testnet/index.ts b/packages/networks/teritori-testnet/index.ts index fe93fad3d6..8099aca859 100644 --- a/packages/networks/teritori-testnet/index.ts +++ b/packages/networks/teritori-testnet/index.ts @@ -31,7 +31,7 @@ export const teritoriTestnetNetwork: NetworkInfo = { { type: NetworkFeature.CosmWasmPremiumFeed, membershipContractAddress: - "tori1yek2csaaw550wq52v06ztwp2snuxp8epkfzzvqfvkv8g6xfv3nqqzgz3p9", + "tori1quf0cu5tlg54aqjd8z54gpvcnh29n6l8qcqmllgrl4gz6jlyn7tsrjllj8", mintDenom: "utori", }, ], diff --git a/packages/screens/DAppStore/query/getFromFile.ts b/packages/screens/DAppStore/query/getFromFile.ts index cbbb0cf826..f325dc3004 100644 --- a/packages/screens/DAppStore/query/getFromFile.ts +++ b/packages/screens/DAppStore/query/getFromFile.ts @@ -63,20 +63,6 @@ export function getAvailableApps(): dAppGroup { selectedByDefault: true, alwaysOn: true, }, - ...(Platform.OS !== "web" - ? { - toriwallet: { - id: "toriwallet", - title: "Tori Wallet", - description: "Wallet", - icon: pathwar, - route: "NativeWallet", - groupKey: "teritori-core-apps", - selectedByDefault: true, - alwaysOn: false, - }, - } - : {}), launchpad: { id: "launchpad", title: "Launchpad", diff --git a/packages/screens/Marketplace/NFTDetailScreen.tsx b/packages/screens/Marketplace/NFTDetailScreen.tsx index 289e4fd5f3..173a5023a5 100644 --- a/packages/screens/Marketplace/NFTDetailScreen.tsx +++ b/packages/screens/Marketplace/NFTDetailScreen.tsx @@ -228,9 +228,11 @@ const Content: React.FC<{ /> )} - - - + {!isMobile && ( + + + + )} { + const selectedWallet = useSelectedNativeWallet(); const [phrase, setPhrase] = useState(); - const getPhrase = async () => { - const _phrase = await getMnemonic(); - setPhrase(_phrase); - }; - useEffect(() => { - getPhrase(); - }, []); + (async () => { + const _phrase = await getMnemonic(selectedWallet?.index || 0); + setPhrase(_phrase); + })(); + }, [selectedWallet?.index]); return ( = ({ navigation, + route, }) => { const { width: windowWidth } = useWindowDimensions(); + const [, handleSet] = useAppMode(); + const [, handleChatSet] = useChatActivated(); + const onActivatePress = () => { navigation.navigate("NativeWallet"); + handleChatSet(true); + handleSet(route.params.appMode); }; + const onNotNowPress = () => { navigation.navigate("NativeWallet"); + handleSet(route.params.appMode); }; return ( = ({ navigation, }) => { const { width, height } = useWindowDimensions(); + const [openModal, setModal] = useState(false); + const [appMode, setAppMode] = useState("mini"); const [activeIndex, setActiveIndex] = useState(0); - const onSelectModePress = () => { - navigation.navigate("ChatActivation"); + + const onNotNowPress = async () => { + await AsyncStorage.setItem("ONBOARDED", "true"); + navigation.navigate("ChatActivation", { appMode }); }; return ( @@ -76,17 +86,74 @@ export const ModeSelectionScreen: ScreenFC<"ModeSelection"> = ({ /> ))} - + > + + setModal(true)} + width={width / 2 - 16} + /> + + + setModal(false)} + innerContainerOptions={{ height: "50%" }} + > + + + + + Mini Mode + + + { + if (value) { + setAppMode("mini"); + } + setAppMode("web3Addict"); + }} + /> + + + + Disabling this will run your app in web3Addict mode. + + + + ); }; diff --git a/packages/screens/Mini/Wallet/DepositTORIScreen.tsx b/packages/screens/Mini/Wallet/DepositTORIScreen.tsx index 6d4c0b1780..5bd69c2ca7 100644 --- a/packages/screens/Mini/Wallet/DepositTORIScreen.tsx +++ b/packages/screens/Mini/Wallet/DepositTORIScreen.tsx @@ -18,6 +18,7 @@ import { } from "@/utils/style/colors"; import { fontMedium13, fontMedium16 } from "@/utils/style/fonts"; import { layout } from "@/utils/style/layout"; +import { tinyAddress } from "@/utils/text"; import { findByBaseDenom } from "@/utils/wallet/chain-registry"; const QR_SIZE = 248; @@ -34,13 +35,12 @@ export const DepositTORIScreen: ScreenFC<"MiniDepositTORI"> = ({ const selectedWallet = useSelectedNativeWallet(); - const accountDetails = { - address: selectedWallet?.address, - token: denom, - }; const onCopyPress = async () => { - await Clipboard.setStringAsync(JSON.stringify(accountDetails)); + await Clipboard.setStringAsync(selectedWallet?.address || ""); setIsCopied(true); + setInterval(() => { + navigation.navigate("MiniWallets"); + }, 2000); }; const selectedToken = findByBaseDenom(denom)?.assets[0]; @@ -70,7 +70,7 @@ export const DepositTORIScreen: ScreenFC<"MiniDepositTORI"> = ({ borderRadius: layout.borderRadius, }} > - + = ({ }} > - {accountDetails.address} + {/*Other wallets don't show account number*/} + {/*Account: {selectedWallet?.index}*/} - {`( ${accountDetails.token.substring( - 0, - 5, - )}...${accountDetails.token.substring( - accountDetails.token.length - 4, - accountDetails.token.length, - )})`} + {tinyAddress(selectedWallet?.address, 30)} = ({ navigation }) => { useCheckAppLock(); + const selectedWallet = useSelectedNativeWallet(); + if (!selectedWallet) { + dispatch(setSelectedNativeWalletIndex(wallets[0].index)); + } const balances = useBalances( selectedWallet?.networkId, @@ -76,8 +86,8 @@ const TokenScreen: ScreenFC<"MiniWallets"> = ({ navigation }) => { title="Deposit" size="medium" onPress={() => - navigation.navigate("MiniSelectToken", { - navigateTo: "MiniDepositTORI", + navigation.navigate("MiniDepositTORI", { + denom: "utori", }) } /> diff --git a/packages/screens/UserPublicProfile/UserPublicProfileScreen.tsx b/packages/screens/UserPublicProfile/UserPublicProfileScreen.tsx index e8d1b37f61..7eb4db5a4c 100644 --- a/packages/screens/UserPublicProfile/UserPublicProfileScreen.tsx +++ b/packages/screens/UserPublicProfile/UserPublicProfileScreen.tsx @@ -9,6 +9,7 @@ import { MentionsPostsUPPScreen } from "./tabScreens/MentionsPostsUPPScreen"; import { MusicUPPScreen } from "./tabScreens/MusicUPPScreen"; import { NFTsUPPScreen } from "./tabScreens/NFTsUPPScreen"; import { PostsUPPScreen } from "./tabScreens/PostsUPPScreen"; +import { PremiumContentScreen } from "./tabScreens/PremiumContentScreen"; import { ProposalsUPPScreen } from "./tabScreens/ProposalsUPPScreen"; import { QuestsUPPScreen } from "./tabScreens/QuestsUPPScreen"; import { VideosUPPScreen } from "./tabScreens/VideosUPPScreen"; @@ -90,6 +91,13 @@ export const UserPublicProfileScreen: ScreenFC<"UserPublicProfile"> = ({ screenContainerOtherProps={screenContainerOtherProps} /> ); + case UppTabKeys.premiumSubscribe: + return ( + + ); case UppTabKeys.mentionsPosts: return ( (); + const { setName } = useTNS(); + + const onCloseModalHandler = () => { + setIsEditProfileModal(false); + setName(""); + }; const items: typeof uppTabItems = Object.entries(uppTabItems).reduce( (o, [key, item]) => { @@ -59,6 +68,7 @@ export const UPPHeader = memo( setIsEditProfileModal(val)} /> + + {isEditProfileModal ? ( + onCloseModalHandler()} /> + ) : null} ); }, diff --git a/packages/screens/UserPublicProfile/components/UPPIntro.tsx b/packages/screens/UserPublicProfile/components/UPPIntro.tsx index 788282636f..2df92a2dad 100644 --- a/packages/screens/UserPublicProfile/components/UPPIntro.tsx +++ b/packages/screens/UserPublicProfile/components/UPPIntro.tsx @@ -1,6 +1,7 @@ import React, { useState } from "react"; import { Linking, useWindowDimensions, View } from "react-native"; +import { PremiumSubscriptionModal } from "./modals/PremiumSubscriptionModal"; import { SubscriptionSetupModal } from "./modals/SubscriptionSetupModal"; import defaultUserProfileBannerPNG from "@/assets/default-images/default-user-profile-banner.png"; @@ -20,9 +21,11 @@ import { SocialButton } from "@/components/buttons/SocialButton"; import { SocialButtonSecondary } from "@/components/buttons/SocialButtonSecondary"; import { ProfileButton } from "@/components/hub/ProfileButton"; import { UserAvatarWithFrame } from "@/components/images/AvatarWithFrame"; +import { usePremiumIsSubscribed } from "@/hooks/feed/usePremiumIsSubscribed"; import { useDeveloperMode } from "@/hooks/useDeveloperMode"; import { useMaxResolution } from "@/hooks/useMaxResolution"; import { useNSUserInfo } from "@/hooks/useNSUserInfo"; +import useSelectedWallet from "@/hooks/useSelectedWallet"; import { accountExplorerLink, parseUserId } from "@/networks"; import { DEFAULT_NAME } from "@/utils/social-feed"; import { @@ -38,7 +41,9 @@ import { tinyAddress } from "@/utils/text"; export const UPPIntro: React.FC<{ userId: string; isUserOwner?: boolean; -}> = ({ userId, isUserOwner }) => { + setIsEditProfileModal?: (val: boolean) => void; +}> = ({ userId, isUserOwner, setIsEditProfileModal = (val) => {} }) => { + const selectedWallet = useSelectedWallet(); const { metadata } = useNSUserInfo(userId); const { copyToClipboard } = useCopyToClipboard(); const socialButtonStyle = { margin: layout.spacing_x0_75 }; @@ -46,10 +51,18 @@ export const UPPIntro: React.FC<{ const { width } = useMaxResolution(); const { width: windowWidth } = useWindowDimensions(); + const { data: isSubscribed } = usePremiumIsSubscribed( + userId, + selectedWallet?.userId, + ); + const [developerMode] = useDeveloperMode(); const [subscriptionSetupModalVisible, setSubscriptionSetupModalVisible] = useState(false); + const [premiumSubscriptionModalVisible, setPremiumSubscriptionModalVisible] = + useState(false); + return ( <> )} - + { + setIsEditProfileModal(val); + }} + /> ) : ( <> + {developerMode && ( + <> + {isSubscribed ? ( + + ) : ( + { + if (isUserOwner) { + setSubscriptionSetupModalVisible(true); + } else { + setPremiumSubscriptionModalVisible(true); + } + }} + /> + )} + + )} + setPremiumSubscriptionModalVisible(false)} + isVisible={premiumSubscriptionModalVisible} + userId={userId} + /> void; +} + +export const AccordionSelectComponent: FC = ({ + item, + networkId, + selectedItem, + onItemSelect, +}) => { + const [isOpen, setIsOpen] = useState(false); + return ( + + + + + { + onItemSelect(item); + }} + > + + + + + + + {item?.display_name || "Tier name"} + + + + + + {prettyPrice(networkId, item?.price.amount, item?.price.denom)} + + { + setIsOpen(!isOpen); + }} + > + + + + + {isOpen && ( + + {item?.description} + + )} + + + ); +}; diff --git a/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionBottom.tsx b/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionBottom.tsx new file mode 100644 index 0000000000..97923bd272 --- /dev/null +++ b/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionBottom.tsx @@ -0,0 +1,152 @@ +import React, { FC } from "react"; +import { View } from "react-native"; + +import { PrimaryButton } from "../../../../components/buttons/PrimaryButton"; +import { layout } from "../../../../utils/style/layout"; + +import { BrandText } from "@/components/BrandText"; +import { CurrencyIcon } from "@/components/CurrencyIcon"; +import { PrimaryBox } from "@/components/boxes/PrimaryBox"; +import { Separator } from "@/components/separators/Separator"; +import { SpacerColumn } from "@/components/spacer"; +import { MembershipConfig } from "@/contracts-clients/cw721-membership"; +import { useBalances } from "@/hooks/useBalances"; +import useSelectedWallet from "@/hooks/useSelectedWallet"; +import { getNativeCurrency } from "@/networks"; +import { prettyPrice } from "@/utils/coins"; +import { neutral33, neutral77, secondaryColor } from "@/utils/style/colors"; +import { + fontMedium14, + fontSemibold14, + fontSemibold20, +} from "@/utils/style/fonts"; + +export const PremiumSubscriptionBottom: FC<{ + networkId: string; + item: MembershipConfig | undefined; + onSubscribe: () => Promise | void; +}> = ({ networkId, item, onSubscribe }) => { + const selectedWallet = useSelectedWallet(); + const balances = useBalances(networkId, selectedWallet?.address); + + const mintDenom = item?.price.denom; + + const nativeCurrency = getNativeCurrency(networkId, mintDenom); + const currencyBalance = balances.find((bal) => bal.denom === mintDenom); + + return ( + + + + + + + Subscription price: + + + + + + {prettyPrice(networkId, item?.price.amount, item?.price.denom)} + + + + + + + Pay by: + + + + + + {nativeCurrency?.displayName} + + + + + + + Balance:{" "} + + {prettyPrice( + networkId, + currencyBalance?.amount || "0", + mintDenom, + )} + + + + + + + + + + ); +}; diff --git a/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionModal.tsx b/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionModal.tsx new file mode 100644 index 0000000000..134cdf68d3 --- /dev/null +++ b/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionModal.tsx @@ -0,0 +1,133 @@ +import React, { useState } from "react"; +import { View } from "react-native"; + +import { AccordionSelectComponent } from "./AccordionSelectComponent"; +import { PremiumSubscriptionBottom } from "./PremiumSubscriptionBottom"; + +import { BrandText } from "@/components/BrandText"; +import { PrimaryBox } from "@/components/boxes/PrimaryBox"; +import { RoundedGradientImage } from "@/components/images/RoundedGradientImage"; +import ModalBase from "@/components/modals/ModalBase"; +import { SpacerColumn } from "@/components/spacer"; +import { useFeedbacks } from "@/context/FeedbacksProvider"; +import { usePremiumChannel } from "@/hooks/feed/usePremiumChannel"; +import { useNSUserInfo } from "@/hooks/useNSUserInfo"; +import useSelectedWallet from "@/hooks/useSelectedWallet"; +import { parseUserId } from "@/networks"; +import { mustGetCw721MembershipSigningClient } from "@/utils/feed/client"; +import { DEFAULT_NAME } from "@/utils/social-feed"; +import { neutral55, neutral77 } from "@/utils/style/colors"; +import { fontBold16, fontMedium14, fontSemibold16 } from "@/utils/style/fonts"; +import { layout } from "@/utils/style/layout"; + +export const PremiumSubscriptionModal: React.FC<{ + onClose: () => void; + isVisible: boolean; + userId: string; +}> = ({ onClose, isVisible, userId }) => { + const { metadata } = useNSUserInfo(userId); + const [network, channelAddress] = parseUserId(userId); + const { data: channel } = usePremiumChannel(network?.id, channelAddress); + const selectedWallet = useSelectedWallet(); + const { wrapWithFeedback } = useFeedbacks(); + + const [selectedItemIndex, setSelectedItemIndex] = useState(0); + const selectedItem = channel?.memberships_config[selectedItemIndex]; + + if (!network?.id || channel === undefined || !network) { + return null; + } + + return ( + { + try { + if (!selectedItem) { + throw new Error("No item selected"); + } + if (!selectedWallet) { + throw new Error("No wallet selected"); + } + const client = await mustGetCw721MembershipSigningClient( + selectedWallet.userId, + ); + await client.subscribe( + { + channelAddr: channelAddress, + membershipKind: selectedItemIndex, + recipientAddr: selectedWallet.address, + }, + undefined, + undefined, + [ + { + amount: selectedItem.price.amount, + denom: selectedItem.price.denom, + }, + ], + ); + } finally { + onClose(); + } + })} + /> + } + > + + + + You're going to subscribe to + + + + + + + + {metadata?.tokenId ? metadata?.public_name : DEFAULT_NAME} + + + @{metadata?.tokenId ? metadata.tokenId : channelAddress} + + + + + {channel?.memberships_config?.map((memberships, index) => { + return ( + { + setSelectedItemIndex(index); + }} + /> + ); + })} + + + ); +}; diff --git a/packages/screens/UserPublicProfile/components/modals/SubscriptionSetupModal.tsx b/packages/screens/UserPublicProfile/components/modals/SubscriptionSetupModal.tsx index e44ac5b7ff..3eae5d4f2c 100644 --- a/packages/screens/UserPublicProfile/components/modals/SubscriptionSetupModal.tsx +++ b/packages/screens/UserPublicProfile/components/modals/SubscriptionSetupModal.tsx @@ -18,19 +18,14 @@ import { SpacerRow } from "@/components/spacer"; import { useFeedbacks } from "@/context/FeedbacksProvider"; import { ChannelResponse, - Cw721MembershipClient, MembershipConfig, } from "@/contracts-clients/cw721-membership"; import { usePremiumChannel } from "@/hooks/feed/usePremiumChannel"; import useSelectedWallet from "@/hooks/useSelectedWallet"; -import { - getKeplrSigningCosmWasmClient, - getNativeCurrency, - getNetworkFeature, - parseUserId, -} from "@/networks"; +import { getNativeCurrency, getNetworkFeature, parseUserId } from "@/networks"; import { NetworkFeature } from "@/networks/features"; import { bigDaySeconds } from "@/utils/big-time"; +import { mustGetCw721MembershipSigningClient } from "@/utils/feed/client"; import { mapTierToFormElement } from "@/utils/feed/premium"; import { neutral22, @@ -301,25 +296,13 @@ const SubscriptionSetupForm: React.FC<{ if (!chainTiers) { throw new Error("Invalid tiers"); } - const sender = selectedWallet?.address; - if (!sender) { + if (!selectedWallet) { throw new Error("No wallet selected"); } - const premiumFeedFeature = getNetworkFeature( - networkId, - NetworkFeature.CosmWasmPremiumFeed, - ); - if (!premiumFeedFeature) { - throw new Error("This network does not support premium feed"); - } - const cosmWasmClient = - await getKeplrSigningCosmWasmClient(networkId); - const client = new Cw721MembershipClient( - cosmWasmClient, - sender, - premiumFeedFeature.membershipContractAddress, - ); + const client = await mustGetCw721MembershipSigningClient( + selectedWallet.userId, + ); await client.upsertChannel({ membershipsConfig: chainTiers, }); diff --git a/packages/screens/UserPublicProfile/tabScreens/PremiumContentScreen.tsx b/packages/screens/UserPublicProfile/tabScreens/PremiumContentScreen.tsx new file mode 100644 index 0000000000..eb07b8ce9f --- /dev/null +++ b/packages/screens/UserPublicProfile/tabScreens/PremiumContentScreen.tsx @@ -0,0 +1,85 @@ +import React, { FC, useState } from "react"; +import { View } from "react-native"; + +import handSVG from "../../../../assets/icons/hand.svg"; +import { ScreenContainer } from "../../../components/ScreenContainer"; +import { UppTabKeys } from "../../../utils/upp"; +import { UppTabScreenProps } from "../UserPublicProfileScreen"; +import { UPPHeader } from "../components/UPPHeader"; +import { UPPScreenContentWrapper } from "../components/UPPScreenContentWrapper"; +import { PremiumSubscriptionModal } from "../components/modals/PremiumSubscriptionModal"; + +import { BrandText } from "@/components/BrandText"; +import { SVG } from "@/components/SVG"; +import { PrimaryBox } from "@/components/boxes/PrimaryBox"; +import { SecondaryButton } from "@/components/buttons/SecondaryButton"; +import { SpacerColumn } from "@/components/spacer"; +import { neutral33, neutralA3, secondaryColor } from "@/utils/style/colors"; +import { fontSemibold13, fontSemibold16 } from "@/utils/style/fonts"; + +export const PremiumContentScreen: FC = ({ + userId, + screenContainerOtherProps, +}) => { + const [premiumSubscriptionModalVisible, setPremiumSubscriptionModalVisible] = + useState(false); + return ( + + + + + + + + + + + No access + + + + + This zone is restricted to Subscribers, to join click below + + + + { + setPremiumSubscriptionModalVisible(true); + }} + /> + + + setPremiumSubscriptionModalVisible(false)} + isVisible={premiumSubscriptionModalVisible} + userId={userId} + /> + + + ); +}; diff --git a/packages/screens/Wallet/Screens/ViewSeed.tsx b/packages/screens/Wallet/Screens/ViewSeed.tsx deleted file mode 100644 index 141a0f1e95..0000000000 --- a/packages/screens/Wallet/Screens/ViewSeed.tsx +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -import {useFeedbacks} from "@/context/FeedbacksProvider"; -import {getValueFor} from "@/hooks/useMobileSecureStore"; -import {ScreenFC} from "@/utils/navigation"; -import {setMnemonic} from "@/hooks/wallet/getNativeWallet"; -import {createMnemonic} from "@/utils/wallet/seed"; - -export const ViewSeed: ScreenFC<"ViewSeed"> = () => { - const { wrapWithFeedback } = useFeedbacks(); - - const createWallet = async () => { - const fromStorage = await getValueFor("mnemonic"); - let mnemonic = ""; - if (fromStorage) { - mnemonic = fromStorage; - } else { - mnemonic = createMnemonic(); - await setMnemonic(mnemonic); - } - }; - - return null; -}; diff --git a/packages/scripts/app-build/bumpBuildNumber.ts b/packages/scripts/app-build/bumpBuildNumber.ts index 2cde0ef4a2..33e5cef210 100644 --- a/packages/scripts/app-build/bumpBuildNumber.ts +++ b/packages/scripts/app-build/bumpBuildNumber.ts @@ -1,16 +1,19 @@ import fs from "fs"; const FILE_PATH = "./app.config.js"; -const buildNumber = process.argv[2]; +const incrementalNumber = process.argv[2]; fs.readFile(FILE_PATH, "utf8", (err, data) => { if (err) { console.error("Error reading app.config.js", err); process.exit(1); } - const regex = /buildNumber: "(\d+)"/; + const regexBuildNumber = /buildNumber: "(\d+)"/; + const regexVersionCode = /versionCode: "(\d+)"/; - const updatedData = data.replace(regex, 'buildNumber: "' + buildNumber + '"'); + const updatedData = data + .replace(regexBuildNumber, 'buildNumber: "' + incrementalNumber + '"') + .replace(regexVersionCode, 'versionCode: "' + incrementalNumber + '"'); fs.writeFile(FILE_PATH, updatedData, "utf8", (err) => { if (err) { diff --git a/packages/store/slices/settings.ts b/packages/store/slices/settings.ts index 33fc37d370..110ae3eedf 100644 --- a/packages/store/slices/settings.ts +++ b/packages/store/slices/settings.ts @@ -32,6 +32,7 @@ const multisigTokensSelectors = multisigTokensAdapter.getSelectors(); interface Settings { appMode: AppMode; + isChatActivated: boolean; selectedNetworkId: string; selectedWalletId: string | undefined; NFTStorageAPI: string; @@ -51,6 +52,7 @@ interface Settings { const initialState: Settings = { appMode: Platform.OS === "web" ? "normal" : "mini", + isChatActivated: false, selectedWalletId: "", selectedNetworkId: "", NFTStorageAPI: process.env.NFT_STORAGE_API || "", @@ -76,6 +78,9 @@ const initialState: Settings = { export const selectAppMode = (state: RootState) => state.settings.appMode; +export const selectIsChatActivated = (state: RootState) => + state.settings.isChatActivated; + export const selectSelectedNetworkId = (state: RootState) => state.settings.selectedNetworkId; @@ -239,6 +244,9 @@ const settingsSlice = createSlice({ setAppMode: (state, action: PayloadAction) => { state.appMode = action.payload; }, + setIsChatActivated: (state, action: PayloadAction) => { + state.isChatActivated = action.payload; + }, setDeveloperMode: (state, action: PayloadAction) => { state.developerMode = action.payload; }, @@ -279,6 +287,7 @@ export const { toggleNetwork, setIsLightTheme, setAppMode, + setIsChatActivated, setDeveloperMode, } = settingsSlice.actions; diff --git a/packages/utils/feed/client.ts b/packages/utils/feed/client.ts new file mode 100644 index 0000000000..08d34b01f3 --- /dev/null +++ b/packages/utils/feed/client.ts @@ -0,0 +1,49 @@ +import { + Cw721MembershipClient, + Cw721MembershipQueryClient, +} from "@/contracts-clients/cw721-membership"; +import { + NetworkFeature, + getKeplrSigningCosmWasmClient, + getNetworkFeature, + mustGetNonSigningCosmWasmClient, + parseUserId, +} from "@/networks"; + +export const mustGetCw721MembershipQueryClient = async (networkId: string) => { + const pmFeature = getNetworkFeature( + networkId, + NetworkFeature.CosmWasmPremiumFeed, + ); + if (!pmFeature) { + throw new Error(`Network ${networkId} does not support premium feed`); + } + const client = await mustGetNonSigningCosmWasmClient(networkId); + const pmClient = new Cw721MembershipQueryClient( + client, + pmFeature.membershipContractAddress, + ); + return pmClient; +}; + +export const mustGetCw721MembershipSigningClient = async (userId: string) => { + const [network, callerAddress] = parseUserId(userId); + if (!network || !callerAddress) { + throw new Error(`Invalid user id ${userId}`); + } + const networkId = network.id; + const pmFeature = getNetworkFeature( + networkId, + NetworkFeature.CosmWasmPremiumFeed, + ); + if (!pmFeature) { + throw new Error(`Network ${networkId} does not support premium feed`); + } + const client = await getKeplrSigningCosmWasmClient(networkId); + const pmClient = new Cw721MembershipClient( + client, + callerAddress, + pmFeature.membershipContractAddress, + ); + return pmClient; +}; diff --git a/packages/utils/navigation.ts b/packages/utils/navigation.ts index 727b9ed6bd..b8449fe405 100644 --- a/packages/utils/navigation.ts +++ b/packages/utils/navigation.ts @@ -3,6 +3,7 @@ import { NativeStackNavigationProp } from "@react-navigation/native-stack"; import React from "react"; import { feedsTabItems } from "./social-feed"; +import { AppMode } from "./types/app-mode"; import { NewPostFormValues } from "./types/feed"; import { Conversation, MessageFriendsTabItem } from "./types/message"; import { uppTabItems } from "./upp"; @@ -128,7 +129,7 @@ export type RootStackParamList = { MiniSelectToken: { navigateTo: RouteName }; MiniDepositTORI: { back?: RouteName; denom: string }; ModeSelection: undefined; - ChatActivation: undefined; + ChatActivation: { appMode: AppMode }; MiniSendTori: { back?: RouteName; denom: string }; MiniSendingTori: { back?: RouteName; diff --git a/packages/utils/style/colors.ts b/packages/utils/style/colors.ts index 5e77a872e8..cb2a1c74fc 100644 --- a/packages/utils/style/colors.ts +++ b/packages/utils/style/colors.ts @@ -6,6 +6,7 @@ export const successColor = "#C8FFAE"; export const errorColor = "#F46F76"; export const yellowDefault = "#FFE768"; +export const yellowPremium = "#F5C900"; export const pinkDefault = "#F46FBF"; export const purpleDark = "#5C26F5"; export const purpleDefault = "#9058EC"; diff --git a/packages/utils/upp.ts b/packages/utils/upp.ts index dbfbdcbedd..edba70fbe5 100644 --- a/packages/utils/upp.ts +++ b/packages/utils/upp.ts @@ -3,6 +3,7 @@ import { TabDefinition } from "@/utils/types/tabs"; export enum UppTabKeys { posts = "", + premiumSubscribe = "premium-content", nfts = "nfts", quests = "quests", mentionsPosts = "mentions-posts", @@ -20,6 +21,10 @@ export const uppTabItems: { [key: string]: TabDefinition } = { name: "Posts", networkFeatures: [NetworkFeature.SocialFeed], }, + [UppTabKeys.premiumSubscribe]: { + name: "Premium Content", + networkFeatures: [NetworkFeature.SocialFeed], + }, [UppTabKeys.nfts]: { name: "NFTs", networkFeatures: [NetworkFeature.NFTMarketplace], diff --git a/yarn.lock b/yarn.lock index ab1902c626..462579d951 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19149,7 +19149,7 @@ __metadata: ts-proto: ^1.120.0 ts-unused-exports: ^10.0.1 tsx: ^4.7.0 - typescript: ^5.2.2 + typescript: ^5.3.0 uuid: ^9.0.0 victory: ^36.6.12 victory-native: ^36.6.8 @@ -19601,7 +19601,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.2.2": +"typescript@npm:^5.3.0": version: 5.3.3 resolution: "typescript@npm:5.3.3" bin: @@ -19621,7 +19621,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@^5.2.2#~builtin": +"typescript@patch:typescript@^5.3.0#~builtin": version: 5.3.3 resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=85af82" bin: