From 046e57c5988433a30d60ec5ae0df1348cfedd31d Mon Sep 17 00:00:00 2001 From: David Adegoke <64401859+Blazebrain@users.noreply.github.com> Date: Sun, 4 Oct 2026 12:22:05 +0100 Subject: [PATCH] Add Robinhood Chain (#3398) * fix android CI * feat: Add Robinhood Chain, all major flows done. minor issue now is our providers don't support it yet as its still pretty early, two weeks from launch * feat: Add Robinhood Chain, all major flows done. minor issue now is our providers don't support it yet as its still pretty early, two weeks from launch * Cleanup * auto-reformat * fix ui issue and contact listing for tokens * fix: missing icons and crash for fee priority in settings * chore: cleanup * fixes from feedbacks * fix: review issues and sync to latest dev feat: switch history api to etherscan, add history toggle to privacy settings, exclude robETH from exchange pickers, skip tokens discovery for chains that moralis hasn't indexed, add tests * fix: address Robinhood review comments * fix: show Solana token icons in history * fix: address review comments and default Robinhood to PublicNode * fix: revert filter and refuse unmapped networks in provider --------- Co-authored-by: Robert Malikowski --- .github/workflows/pr_test_build_linux.yml | 1 + .github/workflows/reusable-build.yml | 1 + .../workflows/reusable-integration-test.yml | 1 + android/app/src/main/AndroidManifestBase.xml | 3 + assets/images/robinhood_chain_mono.svg | 3 + assets/images/stocks/amd.png | Bin 0 -> 5301 bytes assets/images/stocks/asml.png | Bin 0 -> 8223 bytes assets/images/stocks/baba.png | Bin 0 -> 10571 bytes assets/images/stocks/cost.png | Bin 0 -> 5868 bytes assets/images/stocks/ddog.png | Bin 0 -> 6395 bytes assets/images/stocks/dell.png | Bin 0 -> 1645 bytes assets/images/stocks/f.png | Bin 0 -> 32734 bytes assets/images/stocks/intu.png | Bin 0 -> 15207 bytes assets/images/stocks/lulu.png | Bin 0 -> 19166 bytes assets/images/stocks/mu.png | Bin 0 -> 10893 bytes assets/images/stocks/nu.png | Bin 0 -> 4179 bytes assets/images/stocks/qcom.png | Bin 0 -> 8784 bytes assets/images/stocks/rivn.png | Bin 0 -> 13465 bytes assets/images/stocks/shop.png | Bin 0 -> 17639 bytes assets/images/stocks/sofi.png | Bin 0 -> 22674 bytes assets/images/stocks/tsm.png | Bin 0 -> 24451 bytes assets/images/stocks/ttwo.png | Bin 0 -> 16107 bytes assets/images/stocks/ups.png | Bin 0 -> 35839 bytes assets/images/stocks/wday.png | Bin 0 -> 16301 bytes assets/images/usdg_icon.png | Bin 0 -> 2979 bytes assets/robinhood_node_list.yml | 23 + cakewallet.bat | 2 +- cw_core/lib/card_design.dart | 18 +- cw_core/lib/crypto_currency.dart | 22 +- cw_core/lib/currency_for_wallet_type.dart | 12 + cw_core/lib/erc20_token.dart | 3 + cw_core/lib/node.dart | 2 + cw_core/lib/node_legacy.dart | 1 + cw_core/lib/node_list.dart | 7 +- cw_core/lib/wallet_type.dart | 17 +- cw_core/lib/wallet_type.part.dart | 5 + cw_evm/lib/clients/evm_chain_client.dart | 40 +- cw_evm/lib/clients/robinhood_client.dart | 42 ++ cw_evm/lib/evm_chain_client_factory.dart | 3 + cw_evm/lib/evm_chain_default_tokens.dart | 68 ++- cw_evm/lib/evm_chain_registry.dart | 30 ++ cw_evm/lib/evm_chain_wallet.dart | 44 +- cw_evm/lib/tokens/robinhood_tokens.dart | 407 ++++++++++++++++++ cw_evm/lib/utils/evm_chain_utils.dart | 123 +++--- cw_evm/test/robinhood_tokens_test.dart | 91 ++++ cw_solana/lib/solana_client.dart | 11 +- cw_solana/lib/solana_wallet.dart | 30 ++ ios/Runner/InfoBase.plist | 20 + lib/buy/dfx/dfx_buy_provider.dart | 1 + lib/buy/robinhood/robinhood_buy_provider.dart | 1 + lib/core/address_validator.dart | 3 + lib/core/seed_validator.dart | 1 + lib/core/wallet_creation_service.dart | 1 + lib/di.dart | 1 + lib/entities/default_settings_migration.dart | 7 + lib/entities/node_check.dart | 1 + lib/entities/preferences_key.dart | 2 + lib/entities/priority_for_wallet_type.dart | 1 + lib/evm/cw_evm.dart | 7 +- .../provider/changenow_exchange_provider.dart | 3 + .../near_Intents_exchange_provider.dart | 3 + .../provider/sideshift_exchange_provider.dart | 2 + .../provider/swaptrade_exchange_provider.dart | 50 ++- lib/new-ui/pages/send_page.dart | 5 +- .../multi_network_currency_picker.dart | 3 +- .../receive_page/receive_info_box.dart | 5 +- .../receive_page/receive_token_display.dart | 4 +- lib/reactions/wallet_connect.dart | 5 + lib/reactions/wallet_utils.dart | 3 + .../screens/contact/contact_list_page.dart | 9 +- .../dashboard/widgets/menu_widget.dart | 5 + .../settings/connection_sync_page.dart | 8 + .../chain_service/eth/evm_chain_id.dart | 2 + .../wallet_connect_key_service.dart | 3 + lib/store/settings_store.dart | 28 ++ lib/utils/qr_util.dart | 4 + lib/utils/token_utilities.dart | 10 +- .../advanced_privacy_settings_view_model.dart | 2 + .../dashboard/balance_view_model.dart | 1 + .../dashboard/dashboard_view_model.dart | 1 + .../dashboard/home_settings_view_model.dart | 10 +- .../dashboard/transaction_list_item.dart | 1 + .../exchange/exchange_trade_view_model.dart | 4 +- .../exchange/exchange_view_model.dart | 4 + .../node_create_or_edit_view_model.dart | 1 + .../restore/wallet_restore_from_qr_code.dart | 1 + lib/view_model/send/fees_view_model.dart | 5 +- lib/view_model/send/output.dart | 4 +- lib/view_model/send/send_view_model.dart | 3 + .../settings/connection_sync_view_model.dart | 12 + .../settings/other_settings_view_model.dart | 1 + .../transaction_details_view_model.dart | 2 + .../wallet_address_list_view_model.dart | 6 + lib/view_model/wallet_keys_view_model.dart | 3 + lib/view_model/wallet_new_vm.dart | 1 + lib/view_model/wallet_restore_view_model.dart | 4 + .../wallet_switcher_view_model.dart | 8 - pubspec_base.yaml | 1 + .../balance_card_backgrounds/robinhood.svg | 12 + res/pictures/balance_card_icons/robinhood.svg | 3 + .../card_icons/chain_icons/robinhood.svg | 4 + res/pictures/card_icons/og_icons/rob-og.svg | 4 + .../card_icons/outline_icons/rob-outline.svg | 3 + .../card_icons/symbol_icons/rob-symbol.svg | 3 + res/pictures/chain_badges/robinhood.svg | 3 + res/pictures/crypto_full_icons/robinhood.svg | 4 + res/values/strings_ar.arb | 1 + res/values/strings_bg.arb | 1 + res/values/strings_cs.arb | 1 + res/values/strings_de.arb | 1 + res/values/strings_en.arb | 1 + res/values/strings_es.arb | 1 + res/values/strings_fa.arb | 1 + res/values/strings_fr.arb | 1 + res/values/strings_gn.arb | 1 + res/values/strings_ha.arb | 1 + res/values/strings_hi.arb | 1 + res/values/strings_hr.arb | 1 + res/values/strings_hy.arb | 1 + res/values/strings_id.arb | 1 + res/values/strings_it.arb | 1 + res/values/strings_ja.arb | 1 + res/values/strings_ko.arb | 1 + res/values/strings_my.arb | 1 + res/values/strings_nl.arb | 1 + res/values/strings_pl.arb | 1 + res/values/strings_pt.arb | 1 + res/values/strings_pt_BR.arb | 1 + res/values/strings_ru.arb | 1 + res/values/strings_th.arb | 1 + res/values/strings_tl.arb | 1 + res/values/strings_tr.arb | 1 + res/values/strings_uk.arb | 1 + res/values/strings_ur.arb | 1 + res/values/strings_vi.arb | 1 + res/values/strings_yo.arb | 1 + res/values/strings_zh.arb | 1 + scripts/android/pubspec_gen.sh | 2 +- scripts/ios/app_config.sh | 2 +- scripts/linux/app_config.sh | 2 +- scripts/macos/app_config.sh | 2 +- tool/configure.dart | 14 +- tool/utils/secret_key.dart | 1 + 143 files changed, 1214 insertions(+), 159 deletions(-) create mode 100644 assets/images/robinhood_chain_mono.svg create mode 100644 assets/images/stocks/amd.png create mode 100644 assets/images/stocks/asml.png create mode 100644 assets/images/stocks/baba.png create mode 100644 assets/images/stocks/cost.png create mode 100644 assets/images/stocks/ddog.png create mode 100644 assets/images/stocks/dell.png create mode 100644 assets/images/stocks/f.png create mode 100644 assets/images/stocks/intu.png create mode 100644 assets/images/stocks/lulu.png create mode 100644 assets/images/stocks/mu.png create mode 100644 assets/images/stocks/nu.png create mode 100644 assets/images/stocks/qcom.png create mode 100644 assets/images/stocks/rivn.png create mode 100644 assets/images/stocks/shop.png create mode 100644 assets/images/stocks/sofi.png create mode 100644 assets/images/stocks/tsm.png create mode 100644 assets/images/stocks/ttwo.png create mode 100644 assets/images/stocks/ups.png create mode 100644 assets/images/stocks/wday.png create mode 100644 assets/images/usdg_icon.png create mode 100644 assets/robinhood_node_list.yml create mode 100644 cw_evm/lib/clients/robinhood_client.dart create mode 100644 cw_evm/lib/tokens/robinhood_tokens.dart create mode 100644 cw_evm/test/robinhood_tokens_test.dart create mode 100644 res/pictures/balance_card_backgrounds/robinhood.svg create mode 100644 res/pictures/balance_card_icons/robinhood.svg create mode 100644 res/pictures/card_icons/chain_icons/robinhood.svg create mode 100644 res/pictures/card_icons/og_icons/rob-og.svg create mode 100644 res/pictures/card_icons/outline_icons/rob-outline.svg create mode 100644 res/pictures/card_icons/symbol_icons/rob-symbol.svg create mode 100644 res/pictures/chain_badges/robinhood.svg create mode 100644 res/pictures/crypto_full_icons/robinhood.svg diff --git a/.github/workflows/pr_test_build_linux.yml b/.github/workflows/pr_test_build_linux.yml index fb5232f19..0dc126afb 100644 --- a/.github/workflows/pr_test_build_linux.yml +++ b/.github/workflows/pr_test_build_linux.yml @@ -270,6 +270,7 @@ jobs: echo "const polygonScanApiKey = '${{ secrets.POLYGON_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart + echo "const alchemyApiKey = '${{ secrets.ALCHEMY_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const nowNodesApiKey = '${{ secrets.EVM_NOWNODES_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const blinkApiKey = '${{ secrets.BLINK_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const ankrApiKey = '${{ secrets.ANKR_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart diff --git a/.github/workflows/reusable-build.yml b/.github/workflows/reusable-build.yml index 846264dcc..b56b538c4 100644 --- a/.github/workflows/reusable-build.yml +++ b/.github/workflows/reusable-build.yml @@ -315,6 +315,7 @@ jobs: echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const nowNodesApiKey = '${{ secrets.EVM_NOWNODES_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const blinkApiKey = '${{ secrets.BLINK_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart + echo "const alchemyApiKey = '${{ secrets.ALCHEMY_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const ankrApiKey = '${{ secrets.ANKR_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart echo "const chainStackApiKey = '${{ secrets.CHAIN_STACK_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart diff --git a/.github/workflows/reusable-integration-test.yml b/.github/workflows/reusable-integration-test.yml index e5a91aeb9..9c4c24603 100644 --- a/.github/workflows/reusable-integration-test.yml +++ b/.github/workflows/reusable-integration-test.yml @@ -157,6 +157,7 @@ jobs: echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const nowNodesApiKey = '${{ secrets.EVM_NOWNODES_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart + echo "const alchemyApiKey = '${{ secrets.ALCHEMY_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const blinkApiKey = '${{ secrets.BLINK_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const ankrApiKey = '${{ secrets.ANKR_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart echo "const chainStackApiKey = '${{ secrets.CHAIN_STACK_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart diff --git a/android/app/src/main/AndroidManifestBase.xml b/android/app/src/main/AndroidManifestBase.xml index a1d72a66d..11a4822e0 100644 --- a/android/app/src/main/AndroidManifestBase.xml +++ b/android/app/src/main/AndroidManifestBase.xml @@ -117,6 +117,9 @@ + + + diff --git a/assets/images/robinhood_chain_mono.svg b/assets/images/robinhood_chain_mono.svg new file mode 100644 index 000000000..7f56d1bda --- /dev/null +++ b/assets/images/robinhood_chain_mono.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/stocks/amd.png b/assets/images/stocks/amd.png new file mode 100644 index 0000000000000000000000000000000000000000..d46e2abbeaa03a037b4c5d21aea95e167d342b4a GIT binary patch literal 5301 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 literal 0 HcmV?d00001 diff --git a/assets/images/stocks/asml.png b/assets/images/stocks/asml.png new file mode 100644 index 0000000000000000000000000000000000000000..654ec82882a728fa41a80664a59de8357520b800 GIT binary patch literal 8223 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 C5*5Gz literal 0 HcmV?d00001 diff --git a/assets/images/stocks/baba.png b/assets/images/stocks/baba.png new file mode 100644 index 0000000000000000000000000000000000000000..33830abaa9bebbaedb362d46f94531f98e419643 GIT binary patch literal 10571 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 Q)*T6_Agc<3NSlTJKfS92X8-^I literal 0 HcmV?d00001 diff --git a/assets/images/stocks/cost.png b/assets/images/stocks/cost.png new file mode 100644 index 0000000000000000000000000000000000000000..412f340ab7844eb4dc1b1fdd31a3850278dedefa GIT binary patch literal 5868 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 literal 0 HcmV?d00001 diff --git a/assets/images/stocks/f.png b/assets/images/stocks/f.png new file mode 100644 index 0000000000000000000000000000000000000000..e928f6a660fb6ea1195fbab969c40628f5e010f8 GIT binary patch literal 32734 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%0A;0@OxW%kS90~|{-D_Cu)KYSE* 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 Z=994YzVgqxd0r7gk&{u9E|oNd|3A}h)xrP( literal 0 HcmV?d00001 diff --git a/assets/images/stocks/rivn.png b/assets/images/stocks/rivn.png new file mode 100644 index 0000000000000000000000000000000000000000..f692f9cf609fce128a32f9103d5deb0685d6c9b5 GIT binary patch literal 13465 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 HwxIt3aY$5q literal 0 HcmV?d00001 diff --git a/assets/images/stocks/shop.png b/assets/images/stocks/shop.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d3d81b7af1592f9d51f0728dd2cf8d701a2310 GIT binary patch literal 17639 zcmXtgWk6e9ux)UPOL6zMxVr~;x8h#3EfjYR?i6nW#oe8v#UZ%61b4Ta@4b6}BNxQ^*Tz8?(jw}91)4NpXU?jcIx4DZIi0Ry-E@cVramxrKPv{z!%Ast98|LO5`<0 zvkJYNxz^(oDn2UJlb?PE4irE$OOLsFRdz&q_U^)!a~%EKae*?A02`{j)QC?&e3B1< zZ46pPEJd!bqGg^W8$=zYkC5NIsZUYSzmXYw%gL`$e**aza0t7&*gi4~I-n+cV@W4)>-W69u zw_?oF423wJdFFNHT4C0xA(5KK-ggK z(-)!hm<|7xm4#`61(yufpsf8v;3ci|`#BT!0dN!lOVA0>rnC2CyI*NSCfQL~`hnUE zPZaGJm6pL4+s{Id7t&Bi(Z&N&_t;chXX`O=-bW9 zW)rzKi;wcS@MuK)2q!Tf$WZ;JsO;R7B~ec?dKO%b)VCZt>xaQWvGJ-*EU!!lCzR8D z@IEF^HO5>P1vlV>+A)E{zi1VcHG2nlzVU}!hZDGEXWbYfm`CV%5J%Et>%7DNLa0<$2waP*(EQ7-xh?x-Ccuqe0Wox(Wc2^$}*)NyWmGwABZ@k zAAoM=W{1rx*4`lPvpl%+yj0T`@#-IPUqlbt$WIU^;GaD%rGxFstX7RbU3KZ-u;%9I zJ%A1@$mqRs%boFzZL5`5k!hQwi43MX{8prblVU z5?e=L75j5q3Dz0wrsfV9yHDAPEARrWDhDG6(!g}-8i%XBN|cK`S3pRL2JqmIBqB~ClbCD3>b8G1@DuZ+K#Gj}V2f9f4NPS9LLO+Ps^{*w>%bHV| z-QSfp6a762@(7C;(>uA;>iIVs5h=fRu`E%I+%8T1+E=y}F3ebwG#{{6x9}H5Wr;O!83NaEd4Vu2^ms$>yJsKl zKN5ar=00TvkDls%TN~*^w^cC|6@QOUsJC;|_-U99U`%E9R0Y?Lut7zccUPrL!x#eO zZ+-A1xQ84ol!+PNs`?ws(HXNz=y7ga&<;aQn3_1DNO;dj8R_Lql)wCJcqwo>K$W=7 z3{@sy^s+md;T}Z;H&;Qar-g_n%`WS4Vg2)t$Eb6mN&MqV1WxwYn$*mK($;3&h$ews zFIv*pyEb0P>Y6%kty1?Wf!)T?^*>2xxr_MBxnj2-4;g^4Dq5Po8#gD9zCUSHx)j5; zg8N-R1Qx_HZyIF&(znWbvQ-X}IcTIXy>t6Mp-o47B@IrF59vX20@V*7{L*Tz%t>3fLiVzlVTGz)7$~4QG4l6nniHL=x|< zvmV^?km@6)VSGBCheUYi&#n5oC}}5XNwNCQ=N-eI=ROg&NEx+!T^Q zQdN`gl4IQ5`g$+)?M_PdY_@O91Y9|E`ewr9zqX}gOZi5Juh=!lw@Cxr4@I7zE0mbg zc30g6aa-R#?3fzA*)>d76&kmH)BEs6Y2{%bJ#rVwQ(C0uYNPE@z5nRdqH|;HRjv>( zDv@Y(H7?FeOcm($INGjrq*||+w7PXZZiUwcKUsG4>dM^fF;=dS`iAyr!iLQ0zrB$$ zE?RFNyZ+NK6E(d%bJV#r%CycEV+W?dFGM{B_A zg<2&^-qfK&YXr6bT9`6b-D6$2LKzX&TaLf)>Qri25gKzYBGgxXe$BJoVy(PAHM%!& z*^v|(mKxHCYT=f*Jl5k3h3jylPKytBb>H;f_}=SWV*1#)zxE?)Nd4km9ZXo?aq!EH z%kX%w6Y##c@|#CD4+kr9VtzEAb%kBmSy6H+S!>ckdk`Bs9`+Ia-C8@Q}L-gt|KI#~)n6-TJjJ4?`U{Zo{U|~n{AHnzUt65U&Aq337j>lP=WpTmn z5eQW;fH$mj5y9`8?phqJ!=-2wbUhYtb8X2zqb?t#ynWO-chhwDRn&EqWIXizG0N|L zy)0ib>QJE#$ksXE!``>pl+vHR6PYOeLV?3L{8onMOi;eYMb{+N`4PJ$Wkz*S*H?iV zE_<;75CGjv*I{1gd;+_egdl;hp+PIOfox~NP}7nPvi+UP$^+G0@w(B?aw3U)|MZ_6 zRA!S-b>H2vz2Dpri|4eOroXtIEFB>G2jQW$citeM| zA6<8;`%)}y5MRkUdhz320@=tH-gKg^U@JM-Ei2%R61MS6j^Z3xZBZn0rW&NUb;;~{ z{LRg>*=-fal6vMZeXKfRQB(_Jvg(_AvQahcpwr#SPl~!60qD?%se&5b$us zdwx?;RNe};w(xBl@s7c6pYdO%NbdA9(?88!__wchiTF{RJ_u|%?=I}&v9V#^KsO?j z9N=MmgD!f&|F$Lwi=vR9Bn$*zbOimE#FOqT{5H;vl2^AUtFMk9{Ew%|Ni3aR=6)A} zfK48Iqxvl+C(+D`T^)kuk>$IyNOw{M9v&y?zs6O9Z5LA%W}QU4bqtMN8_XWH^zIH> z&h|*UT!<(pjC7V!!#+@LlttP(+SWGBd;Ic`#}2M$XGOY;(w_JpU3su3{)>qW|Kf}h zf>Sx{jrv2XVXB7w<1G(oo-LbYXONOch-=mGKyxaACOXZ>DlkT zZAno*RH#VU?l;#d27ZPO^)Dg`{tq5vSnF0egm=WAbb#%qvqOoOQx{51eU^IGp>U+q z_*@eq?&hODfcAhj0n9MQ5u})t3QwcUxpXAvW3uhFE9PvD&>Mk{NgKa6EO?+j_OG{9CsJ=z%EDh%*fqXY~Z7Dj(9jCTQCk00x?pdmbbs` za-Em(4|lWucfjs^)$3Gt>bC^ai`(mxoN&U2&_sB|0IYGlhuih1Hd{W)7J61IdyACWl;!eE*QZ`7X zOlwClD>k7cD`D$21D3|7!f>O9R5rVnX(XD`Y?q2-nHgMKIFyJQL|-?&h@M>c%b#^J zy(1L%vsVow*zkZ#txK&DE1a05rwhB?wQeBP=sDZbKC=;qOb85Rx%J z_RxD1^=@@djH|NJ3}8ZOfhq0$w%tS#Pfnfnv@RcvQZzaI+R6-iM%jIeEl=AOW@%)K z1tr-;4KtSG2}bl&?OB2*P@qYtrh_uJugI-nsybB-*9G%`d0}-Ydb`Q%XrBbF-MooO zDi|Sce;4!kW6R@%U3K|)nC+n*+m%}y-4TvrCN^F&YxExoAHZeN3l7h`+v zBC3NBW{SA3wzQ`WwHakbX6F4?NBL#E?QUfyyp)=#8@+GsjVi>CD=c2SxXxCsv>5A0 z)KJq^wEFHh!xeZL!RNF)^eBff;G^>n7Sm#;pg4dC(VXU9A zye>N|McdkX^yGNsMdjuH<9YSl2Yjo|R`l$~xRfpp{^cKmrU*in?|6#)+F|8pg!Lan z_-A7rwn92#q?RwsH_h}?f$QMrc$PwOgR53ZiwRHQH# z`Bv8-r{TkP=37~|Drj$J$9AMe6vm=viA9fyE8^d$O66L!Vi>A&(@O<3FAYA-<6Ygg zMh}xJB@2;*NBr^h-5Hq6hKqDYp1-~`QU>R7Tr*T*H8J1*zM?)~X3H~_GA?ZvQOVJq5A-j^fezu&C??#~BrA2hZ(22qN^k z68Q`sp+pbjD+&y4GkPa)0Z#qp=}*SbogF;qF8Gy$0C}}3-YIh_(Zv5)pOr( z#`(o!uatDRL2FBciz0zUK~x#t`q+mbz&2H>Ny(2s1}E(D*<+#TpaXci+>|?Dq1h|t zu=!_>OSN)l#4^ILrLUh!OYx8NSr>*z;{~-Ic4g)(-aQC@6ZnC=JV*Zs0($K4GFK1U z7W%aTzSp63I@}iMa7mgk{An+>!*5k|=;H#T>y?HQ1am4<7INwj#4E)%xSXg5q1|w> zY5N5=;s=W=C|vJMEq~$l`b1v5rVdL)ajX`)cNl7!lF(bY5eLdD@28dEs46L>7yUMw zDmAD>op6);gD9&W0Rf8DF%P&BpFh+gB5^tIo^q9=5wDIGn!jdn$bfBP`|NSS2#L=U zj9$T?cB*Daado%FkLp%IWEom(I^^G6v875j)-^a6#oIay&uB;HDJYU-h42{QG~SNm z@Q>zw?qJOPfe2ovfBgF4zYJWLOTz@tv~i!K-b-1#t5V}?Ai#C47@vQjcE&Dn2G4OG z&Kbu=&`wS=>pXwioH?|XrJ_oP{)?T|^w>>rAd3uKSY5VEO$tp1wH;MbpA%!(NQ`5^FHWK^9=@~ z<9nOiTcNBR;|K7!$jE9Ly!JZjUY*u+(~jmNx;m#SpT?;l)I$@ZPo>ol#D_V{y9bRt zXmyurdFJD0|FLr-yapfdsUd|A=cF>wq@MCmbilIoF)>!=@Lj6 zs+s!7c@WU4xEE7O({))6nY`hFU94mej-UOib%(Z^l6W|m1Wv3?;b&SQq7CKgAO^$f zD%*~5rpH8#r(c`*Xz%C7cue01|}C#NcPP)m@HK>9>#gm;Kr z5FYDCPDwX(tYxRIy+2KQZ>)v_HwFAQAU5n7VA&Np`bWLM57-GGV;5xtd+9yYdMSki z_*;8pfSS1HpZIbw`(j$(Y_+W{z+7VeOCub+!AbxgU9XPg3All?vK+(tYw`F3~2;XgBS$@M2rcH-H1O-fmJBSC0 z%M!9c2>MCWs;rk)@LDk2X?eh{)!0aaX)KMinkNwC7yzgB8v@`u0kOf?0Nv8j18NQW z%loxTv1N!F-e#Rq!R!?yWN1~Fk>cb$8Q9A(1EM?hNsER`P*jA{F zfSJZI_2as{-l$l;PuAqp1@BUOM0Yu9gHp~C!9o4dW}sygIMugPD}BP4><9d~>oK&v zf~N6w_q6ATSYHAvvY#=R6Gz|`TrTf^D_NS4o#c4nsz1F^U-ixJA}p#Ps{JgTn8<@eG8B@ycYJ1AQ=y2*A~)oF+?A8q%Ctj&(D6lBsGSvh z-tcQ|IsOIjR@mTQr9cgA)=n5QhN#E3*@z$Q=W?A~0p>6YisRmPP3}P~G%?5v; zn+vVbut3EDaqjnb$hNr=@RfTCdarwThott9p1k<|&Rl&I&cQsXcIZd^Ugk00s-SNFUEQ|?qDskB1 z2lM7x)}ln@k8-?8!)?_h-b{*mZ4~&dh`N^Euyg~ss7}^or5A}DfKAKIyB7xT;bc3- z_F&{|A8e3&l4@isK9c7qVvw>_}qTYX4(FxmN163O*w8( zIbxhQYxxb%ET6FR4 z1E$kmT?}J7VzcV;N;0zb>AiIsqli@bblDn<@jC9e6C01iU#EX3J0A7#_j%OxF!dkKR8tsTOxUlsc^XD2S8XJHC1I3zVFnZYHo?Q)lUSl_hQ31>o<)wD-|4!gS3=(rCejnmn zNxofAb2?APLzr&fqvE!~eJ$W$+4ot|zv{PqMPZj^sktuR^?dfeyUl$#cRyO=M=OM_ zWh<)vd%2X?JK#$!yu8Pc!PIusCE{%U9oZfEq@&~LN`6L4)2z4U=NzX1zLkchn$CZp zAm3~IkL8?;*`|Fk5K^gh!0EH^O)#h`;=;;!y=rrlzoD^_|6ukm$|1d?PsiVJJ#sEz zzohS6upRvShtr3c3G-}LNu`|K)OMpCkJfqSqugwYz-Hig{H1Wg8(pP6)pY=pj`7bung1<1xnMTr*$x z`oUqKs98jz3!#sqJBy-)@Y1+>r7}-!!zWRT6i$U}E9O~j{XDgXU%N)p?f1rrE!G^C z947{D8}k>S>Akl`_-eOW;7~P2((i25gXD;Jy+u!!wf$Q5j?3tGg<%U{Cpl1hb6`9H z5XD?i)zoE^PWZB>&_O*{MsIUN9!fr;Rq6Q(3Pdi&2Ynjw8I_dI3( z%Tre4Mjq93PxbtlH&OSqzvHU|XfCt(otJ0yt{lu+r~0nOV^jzwRUSDoKR||8Ud3uV zr9;KMJ-FUKu=((@k@^cGTj%b_qv5N`gvTzmHxUx#jq>|8S-8s(1si$)0rf{0&a7A> zCcylldDo`}a-zZ`VMj`Kiz1nRYZGvoY~Z{YrFSjdL957ouN#)H!1&lgur$|+1B2t6CePa z$E6qDW!+idrFr`#RtG$CTnf~FIbJc8MvRJ~gp{FE(H6GR4sQWcZdAy^6pBVe+!8?Z zm#?=(HK)=4EWtjUN^XGQ`_)&$&a?G^)mA46vhWumd&MVDjf8vudN=`-E)3$YbAKJa zj&B^rSf%YXwm-kJS6@x~WRA>Ao3Y><<1QpEDk=L|eRB_^TtKAbhDn!w@{J$VS0J#q zNf{Y<#X1=G?=~y;GS;~PuPz^BBhrNM4r^Un%7_(c3?2sXGGSv9nBTmiUkAlLiv`%M z#y^u7S^Vx3fRIg1onQ59eaVaBn}fir+jHumseH`87mxq0yWsIvb1A8(2a?D#RxaquaCq(F1ec|@5q zl*d+F!0F)4;9}mz3+>FWL8|N_zb#vzQ3$vF2N|V-SlumAE5d9@a52scq%`>A6Nndb z`h4+d%>f!wgSEC;U7H)5d@|2B#{(YoBKaE5uBxDhgjxMaMGORd4qRNx5gRFMEzlex zJob(^tz(C0WhI@~;V5euEb;ocWxGGOTEZ+3hZ>ItQCdOb|A?c8VrJS``aZUmsJHf? z9MDvHn-I1UA^xCPL#?V(@yNL}GBF{$RU{4ci_Nm!d-@EIzYIh%LVRQ3Zg5)b)mmGt zc#`nQr~c0=pIY-!!ynYO2g8@y`~_*pIWMt{2GrB-qsFGV;W<^@0DNR~e+tgqWs;A; znH^j(5f7rFcwldzT-xh#dTdM8z5$Uerq{-gV)vrASMOzi!M%auNIcnjHz!gQ;CfP$ z@^>PYl0@ugur65U+5;||q`@TbmwqRIdakQCAxYlJs#8F>&$6EHcB`^l&IPsb9>}?0 zvJLZUxM)_4Z0sUZ0Foi8v>JvYX%$&ub@}=*%uOkoS3m7W5rHsfRO7wvd+hS6sV92D zC^84C`~a=iw_Drhb^srqQhWuAzsj1N#px<(V>8Avg|z#(UdBWuI!?^Q(uvJRkNG&L zH`vqM3+xlEz8^^3&}V8D@gfQi5W3&U?C;lz;luw5D+cyVP|Z{Ag)uc?6;=F-)>&w8 zW@(n_)QHmyky>A0o%*T-s>XSoH};Ryi|~ad;<0jF76o^2|2Ama4GP#=qYuJ_aQ4amwq*gPfSGuYdO27U-~*`zZ2`^iG90% z6)E_txFCBW;Z}xpB2_Hz={uJhAmczyr+B?ZK<8wzh# zxmR+7%HQS)i#dRY+|S;zsO9iGeff9eu0#W7SVzBuyQd*#?ZkhrX@L!nqZmMp(Fdrya z1{E+74wVs^`_UoENp>B*s^TUhf4m(KH=p85BVkoctE&*_P&wR32=o{vWG!HOz>=IO z@_}}5uv$IuwDRw=(OYO*+zT#* zAQ!dttG&2%A#<&52-UGC$(jERd;wjoL8~0KNu+b#ZyAnpQ?a(&Ub`4CAPghvoTpHK zMF2?e2q=1BNo)?9QZrlYht}9SE*Xb4HNA=l#0b>6#Y(i}7^CWD+^^W4>DSSaZc}iA zi2_8X(i%MeMk79|@(3+uj9VEIvQfM^tX9pp9#)N7Jq)>}`u ztk*@HT!x8jZboEl=cc_wF>G8!M&MM>rPh&}5ygM^VOkFJGT!8Lwcx6I&jP2jT)1e^ zhfB~Hyu>vuh5LVven%)KdH5vP13deSB5ZOQ&_=a5&ZJrl^`!Hb4Zok=$|~Ij6G8BB z!R+3CQl?p}EvUa7=$6_5sX4H+kyzZq)({d2VwuS^jlMj-rM14xcg-a5nhd_e=4B*nK<~pvTg~d2NO}?u0$gf7W+R8Rc0RCtdSZ6(5pLO6v&a#-!Qw zKl_%Vv|$GXyJu1T>nxlIaiZkD*^Y%u1)XIGf1!JwqoW0;)8y);jdK;4riE4)v2DWM zHd0;JoaRbVDFClCHnr_tvb&0>^~jW^$U_i6IOMNiom0_7S0^pFYJpbjdTO|55m+CI zstB}INEj|)E_VZ^+Gkpn44yoZ8Rhoubu@hSKx*>SLpk(#valEMu5a+b8uPk;%$%ZR z{-Q7G0cQW~5i~uw*P12&Y$)C4j?0kWGaSh+UB`x)I4KihB9*mtw>ic-VR6-II0zuR z&}{s#O|0gND@vD>Yb4UZ2&S2EXL`(MM*pr&=8v9Gb5`{{N{s<^M`k18B;#T-Dko^E zRoc%~X=C29v5s%65DuJq->&n+;lwL3+q4yio@Lh5bu=hx)cek`q~SCx4=o=}LDOoF zl*eg1>Of#atTG|Z(Cbj;eEydR-Qn#-s47aQAzwZp*TqO27LYztER8@(FmR!{Evc(H zPE5dMP=z>C)MQ>;#V~ObD5&CuS-kxGp))2VvhG6OP11KG!^<64^ygd-bT>7ONNQ3G zpbBxYa9~eQI3bOTR?UqQD=8XSxohp)HXFgxcFd-_(sO|c29o*Q6@JAw)g!C%(O3nU z=o;$-2-tBFX{1C@9`hw|UeDaU1k$%SfW(gyDtGhAVwb|$FI1)ctOJ{Ty#@K$rP#IK zeDNqM1Pv?>>G*ZKaCoR`_#y!i^iDYza9R{2@bl~Rae>LUI?thAwE_6eM0BB3zKHap zqVqO-H{ng3P{|iBN0`goV2?d_D{et0r4q>gL(R>q=7f*d5HC9U_~%#%_rzUZAJa13 zqrsndR$Mw)S*Bvq6L)icJJLU!>4mz}_rT(*YosmAe8!;Hjl*Z2^k1e4IO6kGbFvzP z)yMCM`Jr;JR@gOr>UBSOUXsWF z1LR#fsy6>k1?&A0Z)7BYLM70&y7rvD4O0!TnEEHkex~&@kgb=OIRDX)thbi&uYL4A zT|vU{#r5ky;#o(pd#p4gk+QwbE3HcNEIq=0T)ui^dF{7l@*AbhkP*{7fo!M7031lM zyc?sYP?BQ?j7Sh07dZG-AoMuU7tOD8WATz!bfNLW%(+WTRs|$N3rNghvtj@F`O1)f zuL9=PvQMN)TfB&h@jzSJ66pk_jwED@sgkRNZby|2-gz<^O>*GBBE6M3~b`NL%FOEyw5OiSd?r+2CR-X&}GeN;J& zx{51!#+zwYD5)tbWiK-H15)!D2AT%vbTX0Ra$q{h3{BT+#Qx{ttME0%bkUK?qRX2I zvA^PLZw5S@Xo?=~csYpeSj@Tle06-Za9ZvR-WhGseMAxBnZW@&YlT}_2%E2LP(6Ha zF(8n(3V)^I>G*<@Yy4zc|CDI~f8fa=6ls8y>$exzTEayfwifam=D9NTk!~L8GgV@R zPUU{zM}_sfe|dFAniyW{O_$qG7yX?=blr1*SidT{J^W@m*VI+LazgiS|1EjeJ(&u% zKJC$qNntc_;fNnfSD=AG_jt~iE(duRp^VX*!)c_%U^*7j3uU)xBp2HP2t~Ydr2!S8 zJRHwlI*fs(>R+BU1pIs~(+}-^`yksHsKl#J_;aAK!}GPmXj6wSw}W5({#A=T7v$V9 z)i^`{x(Lp4&_l#jPQbioXl<)bl&GY3ipn~?Y!jX4MSLiFAtxCc7-C)Abn0GT&xt_b z+`uE72R3aaaDz@iw*9dwSxYwI2aC5}_K?r+EuGxKDV|R;AJD&#Ye&hb><*Xc*>L_;3b)XKjfB%`GLMe9rHK&?aXy%<-VEY`{~&1fi~h%H9|#gZ;;tIsqrkNqscl=T zG)~W4Tn2nf@{jpQiI6!?5tCctNy{z1<@`^IC@W{rk}iRksLCvgD-xQJBH9n`~^D*o^W0 zZ$Rwa^u2yc1u7Yvm=~k$^?2-;(8cgV*8AmfLG{H2Ns1pcKGomjYn(7_DVI(bj_NO* z7@Fof$m6nemky=fkW=-D8Ua?y;*+`RkcYG0I`)D4%_cg*sP)53zsL2pj^1-M-EBXa zCPRo#&D4x_)4WL4e*JV96rGtJ>Oxc^e9a@0W-VM{-@FwQ@oZiK*16?(>R(^aLW!^9 zHDp9A;9mo=A(lx^rWEbXh!NpX)96lxLE~X>ay^CecaXwRyW5QsfuCjHj=~qi<1w;OVV#00^pcNm^V0KrM~&!n5l|hZE=IgNnJAuaXkwx{ z`P}<@H*$=^j6L`N=m#QmRk!9roSYFO>_| zG~U*bX?oY>xsb{*kqm~LYq<4)g`%l;b}Qr!<@vU`ZkXc~-=wuw*LFo8^-%aW)~VLY zkP2Fd(-%HNZov=sL(C3+e^;p$^>pkD4N8mk2;f+|*21N}*ToJfAQg_@2!C{K%gB zch9e(m4PAUAe)Wk>pzW&W@vWvh;8ZR)8|v07!$l;C_vNLGiK>7yfB`%egv!JLU;r#Fwey0Nc8wqu7PUHn0;;E@Ez4j}U>eN+2Fd+EWw@*QY~r3g~rII5-`eZ7jocE8w} zN`dxQ#V8Fcj{C-<;>Qp&tLD0ydJRZR2CeH@=N(Eq{G+M&#QNQ^O}(=@cd_gp#!_u$ z>}oijn8pL(>n{PBu!hPn=NSixE{U|VkQ@HI$0PyOf=80?u6ZV8V5~*eG&!&$IV`oZ z-7~UU@D*)RKr{wZZm%VTY5TZa?sNjb1xE8ZD+AL6`DEWoy8$}5p!`bCr4JR9S6b5q z9ep_goz%Mu7BMru3$9lFXQN2aEJD4-Ea~9gboVsa9-}p0qT_~xPdkI@hBU$@wsXE3ge`rd$8oX~-4K8DcH-f4 za(-}oEJ&OTUz#NkW9iRtYDpRn;NbAB7*t?*J>!jxCMA#f1j~3WC!XxSx48X1`Zp1` zGB#{%J(uiwiikCSUx~qONqKs(Qr_L3zk6es2}0f+zN8kculnh8DV{Tfx|^@CuuO#O z;=;PQSydgFa7^Y%5?wd<^O*Qz1D=bMAK&5Gc}Rn3VkBG5(6~KS!^R^&FZN402_)~S zt7m5b!4vP7LkNYk=n>N**RyjK7po?ZNz}n&lZ3TWRVQy&y17FynVH|3GU6A-$s4>l zXa>*sZmW~;HTJUC*6t4o9VQpV66wgInL>OCJIyYT-0jTd@Wsw`9&!JyMes z=g;x2ZNoT9$IR%t)HPjh6NkUNFiu@Zk}{GI*DhvGHk|G(3Ac{3_UzBQ2S2veZ*MOD zlsu0{7GkF}?3i1pK~-rgRkI>k&Edd_u5kIp8W6_!h+M~!J_foyGuJt<&1c;{E2D#~ zu9LsZ#gA5SOYJpH*5b(CVBA$&SF?@ZOO6!?>UMJ1!#xM|Q2&D=+xIqBZQ)N>**6N@ z+4;GrI22zNgJ#L7uEl#myGeFHl#9)B3^Ciy9o{^9LFXmhj?#^Epf*N=juJv|B7@qB z+)W!s{*xaHmcy5x?A8%^L0Bv7F5+L*O_D1RrOC$T(=?GvrN8b-&2%UfecpJZzNyV0 z1@(Z%vY7Ur7_BYdIO(-C{US!);v{DN4>h{A`%4nX@&MMo$|)fP1~||fgxUC`F;~N5 zk)bM{3e3T|3nvju-Dht9+`aWuTrbQo4}qq z33qyO$h*$>M6U+^4kvdA{T~v%GjaSBRJwA8Xpvx?-2Vf2Kh2x< z>P0iwx7T+m9)y>3{}r|Ak%;9P#^(rDN`Z~5f_~=wC^zEESDkkFq7vCzU+S8zs4qo5 zcJ>yW@jhtAU4PouaNT9IJZQdeY}NbwKe+aqT@uGNBMR-vGKur3A31$SkPIY<&%|iO ztQ+rCDD+QiSWB?oN7N#qj|F0>xUe9Vb`Zs*zD%?=1ou zhGlwMIBZQX8yB`2i)$luTq9$skZDvJ1ENU7MHF2l=^j30=Sy;xY$1e%;|1ict`T3htgU!%I z52N=*RAOU!Ih+ShB3~j=z5s#oEjbLV7X}Ek=QwIo_<_^9o`J+xfZ-PvqjT$C?||UG zf!llI{`fPWV7!j8)KI2j=dzp%0*W5S$7EQquio3Zzpq(~IUoE{&gQfG(iDW*9_O2; z+^>K~{c9yMglLQSD1*ykWn{ONujhWp_A8+<4t@LdZ-uZKej=29qi*>;eV6+S!U!MU z-%*S#C_@$O5COS@l0;-1P8s3mxy!Z|c?T!QHp`o_uc2muekd!zPP&S=uJ73Cc}C4O zLuBh{&O1Qgp2|mxh%}$||Ie`R!Rf`sB6BhW*+oU0Za-CEU}izlbxnMe#t!fEske8f z=h5gt%I&FWg(B%PkdO=^BqnohLA$gzzFCD;D6WOT_5oC3td4!AW)VlNMTCqIk;IW( zV~XPS98cm8@TdMABK#}jUN5Sw1LBV0^tR}5?rqce(s~Yt0FQPIub)ggUw8QZqUcaQ z#)-Y2bgga$uO=auCGB)|3a_+|!%kT>T=vU714Qt%fQh()X~J(Pz+qGP z8CzX$TvW6mAVVwdf@RZG@IRZmSK1GMTZ_pFA?Y35tzqv}YL%fmlE`ZtYG!6ZxAH6I~Bfc%V>$6HYL-@K>m?UsP%LTA(F z?=&pn5uTxpArfXp&`1w&pQ8)yBndpI)jeH*phb$|j}zybJhS*f>7 zOw%h2T4ish&2@Al;Q3f8=uK;5m_z8|8t@l0BA%B_lm4W01E^)hxyqkqg#?cfGU9-S z_B$$dlhnMCA9kGWwF@-?){qf_adUGl?>xdo<*rM6NT@$y&!hflN8x%Lx7zRlJE~&$ z4#xYUGMD)2|Hl^?O1!6<&{8QS!4CqiwT|G{EMFvzSZ8$Debdp8H-e2xZ;D4k(JWPQ zr%OF0s9{5K)!VD|WR<4A4kt{TF}6Q}?2kWDLFs27$os|`C210%u<;TN7mrBhVdqMJ zrVksc|2+^GIbQ(~?BV?D=s-J30srm@-sk=MECN+#K|Kth!{1Q0P(-4+h5r)~Qn08? zgou{|#nUe95r5n=TU{@W#{D+9ULDC6doC9=c08?z3ejUY9QkxZ@Jo#P6h-3oXe6c+ zI2bwWI@vmEre!AqJ067cd8od4Z0lw0zv2@EwO;j8n9B9|`zn1nYmYo7Zr_t!mS`!G zZ~aVCSj0@Y<{!8*5$zJ5ajAnl6A7hd1{`fs5%JjW44I1ClI&B7+*U8`XEA?cMX>?T zMt_#+NeH&B-_tv^iR$3AIaaqybefo?hNI#!Nl$(>ql6n!r{x-=I*c4J5dJQMl9YVj zl5?NbKYjQkOsE}~&RY+8m?}_%xTF9}UhDYe$DdW_Cc)*I>GogKNEiAN*+}OlfX@J# z)iw1XzU8p+Kn1t1Y2|zZ;s!UHliNvkM2lbnt|S#X%RLSYcb1TGYA|=V8!24J&tEwD ziD%bv`lD1K>P5kv%NanF_eiCBX7^OK^Zq1pNKGEsyO#`xJ zfkp46khznHkLlI%{$A#;Kf|HAhXY%36t3wIHWY7n*>W1^C=OlwSRieOt}Q+mRH+rc z^8QEYq{A^Z^lGm`Jb~Up0-HYwuPYn$pE*f&@0>@97n zH}p|Jgb~2ywCq|MDV>zMC?A0cf5C5%qb~A*(tSF9ctJpm6w;Jq5jO0=QT#?`n&KM^ zY_@90gW;XzwQ3=CY8w+{vf5CPl%QB4xy4SxuQf9acyj;(0_vq4oPFU{ycj(e@Cz+U zga{>-9+zLEo8j2UAhS7x93X>tkteGW-}oU(S}vMJ`hM|rHl{9%e?=^T zK_i9s(@9_p&JJP0X6?;G4Ckw~8_63ceV3#miNJC7=C58=Dj~;b+9}^Ms#aPz@mq<) zYK3bF^{MLdT8{w+uPh(T%SR5WYJm(?CIp_CzX#OcIKQI>ea2`W^o5K3$sojuPRovq zRTg6$^;fJ2;RdVC(@5id3r0YkO}ZN1d>E$pj>kDLmGpjX;3>Rrs&mI-7K!xZS$KoW zsS|3aVFzdubE@l=D9U zj{|W0v$u z2-_^<5}l<3IolL!77A_k`FJgeH#zL0A<2rZq z$Gh5m$?0l`nl3CzQ&~O(rU3#N4x*t99!kJafZ`(ZkD-XpfW-oj)ry^h=#91x@9P#T z_9i)O2dtL%FI`*KH53;^)o}`hEZQV`$j}+4A(gy3+}5o2NpjhoPF8$QQbiJ3#2|o2 z5yYu1-vSVgpcr)ii7L_MqAlRF+i<{U74ND(ezDE#eb26-k(}1AH*P~ib#Zk}T=JVl zHw<63HKe#0qVIRcDYnKGrJ=*7SZp0uh3$hZq>fP;XA+6inR&E7Ac%pV|3-u8b{ksl zcG_gM(u;~m{nM`2_Wj9rulKWEDIKvw>=S2`Npx-b6;slrGf?K*@qL8HF_vICU1jww z`2zrOpQF!y{ZD_HNg-m2#t(vSL?>o2`2hAP3bi;LRByMS&T6Hn-`axrW0lZdO+b_A zF-6VD7`yae7xhw;l14!A2x5QapOcwHKVqZ;>|&x60?P+L4!y~*4bfTdSyUowC(r?v zx!!K0{SF6zVX?70HNEAv;>*KJc@&wE30;dx^w6A7Z5T4sQfX|E)q~UL{}7e1fhX}EyTRp;Z$}zto*SmI;s{;USAJ@6J-!h zq9@8o>(I|-?_8eL(cIo!c;Sx#EJ#ND<$ffi0n5OjjJ_~+|Ar((f}O>NB|EuXf*qXP^vA<`szObk=(7%829zHUs(bSO#&I^-&^ zWGVtV5HyIH2T4aDW()?96G#N$?uafYuhoVYiy}T(nb-MLe#fEEL5Bl7T3hygvUKLg zrr1GFUrSA*>x-``9e@k~n%^tmr3%&M^;%M3W0!?FQ-v7D(gm0xul`PEra>o?|C>Z- z89%MVZlfJS!Fo@J@1Keyc3K>Cn38#S>BhSKFz7vYv?qc|^k|Pjg6fyfKc%k?x3zkD z+me$VHml8I^N=?MUW@>Xu?#VqNFBXnmv{KVLu$LtMsE=Fik3F6cEHzeaamh-CRaE9 i^&0pR6vCjo{r>?Sp!Rb3k9bM|0000PyA07*naRCr$Ooe6Z*)%C|e_cvKlal@?&3a!=FTDz!ZCZMLSbzds2N@fUZvF@#F zt=81G)^6ImRTNBSK&!NMuZmk#$V^bIwSTpB0~g#EK!mLGyZ`ehAcRRW?>9>_Gs!#0 zbJW~--@W&}JHNNw`@OSqp z5g-mC?Wp@HBJZHQf#}OP&RcY}ub`}aIg`h)0MR_sZE!`IGsnl$aT~Hh*G34HxSb=2 z`$i!$3P;O{s}HB7-RE|G7FT%}jju#XSK)J45%2hvx|+7ZRKU2=z_t3O62_G6MF|I@ z&bJV@Mfn24NJzM}mu42>CxBU~i*aNgKKDM35B$#ylcJ!FG;fJ32jQ?6Dmx>50oVfA zz@uGTfe%pLMfe}Mk5SU`0LRySR1|jds>Jl^rBr-Bq9OV;)_i=d{M;6fD@dPLDz1XWLnbLc8F7M+_UpRuYjxjjSk%;~f80(#hbr0kG z&jL3<$0JmXdYehRnB72ewR&~f{^>0#ad$;^8p`1arMXd3IzZ>*#%CbTGgK~lk4cl_ zxfv@DxK3{xMMe2IL{0)d4rIeDOVx$45Y-ttzQEv#T~%$b2O9+vlooVbx#6k0-|3;Dap}bJ=rQQ zqOXHIiOUQ^RZ*mfw)PDRcgENGBb0rBujKBB^K-MhsJ@5DGbp#vR(c21cJIv9TxQ?V zXSa+b?(U1o<-pFl5Znmu@$mQvon7bRbiFj#XQj04VSY5njQJ8J@r%Hj1iAWp+e)W# zMDC&8{W&8ydAVSBP4)F9j5}m!=sFwK$%vHOS|Iy$@*?8?jCP*nq<}e+X0>I{(N%>= z>=580;9G-hv|enatU`DYxR{{-zge|nE}2CZj78nc5R7eewkt~G$J6}UE=PEPxc-8= z0=pZT75x$_zeLr1lty{H%gEJ?n+xTC5!XLc7q~T>gJj3ir$4z3l_lqcb1G{V}0{xe(32HtXq~a67L?*cZgy znCEjdr_(o4uBLM2wV57|(qBQ5xf|e)ybyQR=w&xQ`PB|z>0c3c&EbAJ z3kFG>#T~@|cLH^F0~fAnqOU5y-T>smvsv19>!YK_QSN5>vf~FLD5QrF=2jiK4dq)| zSgXddA3}8=uJa-#@&TeB)84h5jW%uP#lLk?U+-cfKezd;jM9xaz*oL0>TZGKjt1Ei zP3(TZoUzlZIU322sq;5_nJs%qpV7QMrOw?5yLlNPKWY0p_bc~PS$aH^c3+-z*{^Hb zkPXXB#M$?AKGuK^u%3Ng9;USG`41n4Ua&dh-UUoZe>_=+x{GnRf!Eq2)Mps0 zUSIF9{eFAmbAAM3f^tlla(cl|iF3Pq60dj6vOR9vIeJ6W);JY+B8ly~U7z$VJor78 z2FA4gFz1Of;h4DrHrw?ag|802DZ3@mILIu5{<@q?WIjk`&KR0H*s#malS$)p7@eNHCI2C5C9_86o-2qik)7fhdlq%crkH) z)4obqd4Q?k`Y>x^UO#VBHY_m#CEI6>XJIk=0O|Y&wR^prRk0(nlYtvO@-)d$G1PZB zq46Jk?3-P36GQP<K6mM+lglsLcS_^S6k z^vf-2xaA1Y8&-p_*pKCMHSMM6_LTwGhohVAM9c4SILCgZJfh6{qp|*&V88@jWY!|{ zPXy-%ko0a_GaEghdYfpkiwOBm=yYan`n@Bl9QCxP5Nva6jb20Ll5_GhxBlkXw zmaQ<^DevKvJ(ygzBqIgFv7aFP(VBYXAvmEJZOfPO zt%s!jveErDHz~(stj*%OxA1z$l(fgR9w-Zh=7S4&Aqhw@%jW)$+JFhA?g81*i=#&m z1nvYWtl)o3Go($XbmF?z)K!~pqPG@~?g?Vl<$NBTm%1pXxif?cb)Z<~{2^`9L^l zP8qG+{tay6a-heY1KMbpm`*<*!- z6WE(p23o9b`F$XJTPSTvUZbm{hN*kM)$@zq*iwh1H}_K{)bH zyHr<`BCN*{sy0XQb++!|n0e#<_TcDSa6c$BX)XOxN*wOS=wEOW=SbV2hruy_evEnt zLH{u+MG3cj57ED+q+3gHI6?ot9_aIz)MUPmJJ7sP)L066FF}9e60ds!&YZs!rM{t8 z%E;1My^#F}UHKhC`}G|k-90IbhHy-~SL-fiblaBwrUsjMgfF&SgL0}BbLC@}kJ^?q zcg$|8sny^)A~GSe;{L-D+%mpFyKKAi<&bZ7#K;5WE9n(5(@O4Pu>vy6Tacwc2Bdd`gcNsWBcr5ido>AKoA?K z=9Mg4x_QoW-#saoMdAdaZOa3|{#IN~(URBZ9wG?rC$DoZis92PM9TQ5}wL_h#h| zL=L64%Iq+EHUksot1!g}Epsrs&!*mnFA(ZPl2nU%V%#F7#3n~0uKSz9hz8c^A1ONw z6C_(e^=LwYJCpv<*n9{g|H!*Slleb~aYUz5+Y5YGc)^zu*FH>EIhc^&oMnr%g`*E6 zVh3QNdWz84{4*TqR|9E{qPaj;&LreFWqx|La4dvif{(HU+&_@BGpJ)JsuvIn{66`| zGrBL1*k`%L-EUG?{qI55CYOVIOO*Pf5N^2vQTyb8TncZ^J8uGPeofGyTzjrDdM=Iu zHyCbdSm1XA{XH_T5hvm06E7ScH*gQ@z*@p-1&jlhb?G@Y7nF zv!z^5$e)~k8fm#4)G`)3&9RHE+vnRny^&xb`NI>Aoq=$*wc5*;Zp@hn=XVKbYh`*N zY>b|WBX(%Is?9<;_DFXb+2Q8d0;*v`fhkG-A~93b{7ldMhC3Jw+(OVlImr~^*hL7x zwl>kCw#tmFt5^><2!xH%<8b6wtC5xe3X$lOAjSFKXk~?rh;Cz1)d|!~PaukL>^j6U zOf#e5i?OrZMX)Nl07E!dk8r8A#>#XCkhnmGw>8spB$e$dg8HxQ8NWKs0i{Fa2jX165vsA+s?BBaDd@Tzt>YGBO zZQ?k&0Y`uzLAbDqC&mey(XEc3@vWk~I`0NEH*8M9e21aT`{%V$&k}0mc zBU7qhOOnpi&hqitaKQ%8^VWA#OLsc8DavRE(qKb`O^P(tNX$TU zjkPjH0!C`-wng`rZi=k5j{X}$a;!mbhEZLCBl`%mTSgMsxd>HO1{@~pwt&GR5BW{z zUvJF>B0UfC)ts2CSbt%aPguV63w=6gWApVmPVy^9pGKA-!7BUs_?%2umYF874tN~o zOO~7$<8x~SRkM8$BT{SGahS|lz|{~_dP%2TW1UF!Hy{@d8_Sag`iEw2n70qU5>v6n za{JCJEFZONQGr87S`J2C1N~+TAs*!;-LKnVo}z3#Oa6<40KIj65Z zGRj<*eR4!W-@wm`?Sso*9-eF!<)?)F32=&aiYz|0H9q%o(4A5myI2WqE)$gh5%SxW zuMIEQ9NhnSI#U*_ZTr{jGkosXIHCFt8}%g|i>cRFBIO5!{I}ci&r6y}%fCT)^B~*D z#I0AG)VIX1}Y8Ni4%_>PThp$Xt=((4JWvywzJYe$UikT z;cAM={N2H4c2s57ec(CbzJsXS)1apoPMh;W8Li9yfH>ZutCdG-`{;0{9k#0H7v20< zT}_)cqxv~zjN9&gkWH-nd^Jed|Pl){R5Rt zE@aXq6IY+#E&Sx3NXZ=UQL8$SiX}Dc>X_{4v!Y)@r3KhLzpXIP(rFv5W!}F$iJemO z*FX$p*QNvap&V%Yq%~d}+O;eEvZHsuRbGQ6>Us~iZVPmv?g@md|DKjXx}y(&i^zFt^)J>= zs+LsYgO!=#=t zTD^x7-ZF1f;w5ha8y4#t^Q4#Z0Bxm5Fm3lvPyN;>j>P^8?3@vgl${Ia4&`kY%^gF1 zeNSM`l=`hl5RTr8$Z=k~B|>SG%Lw`F)99PKF0)&{N?adB(n*LCmyY;uoRo~L(|62p zH_D``HZs)HS38Ku_oHrtiAc(if&tWYgoo;Nt1%G<4|#{W-zFZ+h$7x1)C#wKKPUmT)y` zh*k()gr8CCH^wuc%FLRHZW>!*A`pkRP2oSp+s1o(z39*Kk?8RtvpsKfyLq}OA0WHd?Myjn^R(^d$#5+j6nYi7qg;Pq1{9& z_ft9YC?@UFkrn+76LT!;DtQ=5)T6h{!phpew)UB98A)WXQd2tXzGmd3V-rdeb9YQC9gs z#K|OH!R*?W;_9`0xZ-!5ci_sb%ejVOxY>`$bP#iAW5Ui;`(p3HbP(6c)CK<5pRB2w zClD>RI~@^&Aw5Lm;PqYN&e108Cub8KX|4si9%N`-cy>SgT*#t_uFm)ZuCGbCDfSi0 zFzBduC^Y>~?whF2AETiAytD3+C(Hv3w^~CgAEZi0lLSGUD02ANv#Wwu@37 zgHk)Xk)*!fVTS`Qz!6jX%C1j_8VqW8aYEFNkK|m2#^xX4IHqu5asPmt=PdXop{idb z6}!l`k-ehD_CLOHq)wDp;8E1Qm6aWHJyn2dd}H^JH>twpOLC+@`uq#8G z{y4q&G;gSzZgvK)UV<<(+w2F4Uu&YC`KN8a^0d{>rm&HgAAtVea~NqhWymfs1KoTZ z_|E9-8LhA3ygT}uGyB*BjzGkmV+-Rlsjpuo)mB{hJJe0c-Nl>LWUHxzcL-eJrqBA2OX9WTA3!AYAfs%| zN_gQI=rjcn4k|#Kn!EM4aP-%dZ`_b>Oh*QezIq0(Yub>F%C7)9&GVcL*1q4ok*ofg z_Oga_ejPpQ>9xbm`5RGE@_R%JE3ruB9+0VCx0PPalNP;s-fI8sEKFg{Lb?kPp26)p zI@6C)=8nGR>pttLBXHew5vpw`Vi5ei4RkKb<%9xH*~&R+bhDyIqL}*-vt!EAT;)WY z7m4$G>Uyb}mXqN!U>aHQ9dIuJCT8)OD+7W0=xR`Lac`iq{7+2s2+Gk5%j_vdGz7er~jJ5XZR|Ni()Qi{h-uNUbGulsj8?L_TLr$~BYZpCliknOUqPDb?EEP! zS3F(N4&K9PD$I#hu#&wgk>8>0nr)l*&rg?v)We9GEV{FG&~MbUp}dLu++yz$Y*2PK zj`OoYfaZ2Vp9J?jS}UH*wu7%RQEnZ5%_zp0J0A2+;v9my0Ytt5Y?Y09TFt|RSS~^N zH@H!Re-cbizR%)#gU`y?bnO1)aXA#n@gw>T167q}!P-Ec2YnjRhj?$r!#Pd#$g=RB z*)=q60u@K%$N`9&dyyS-vvbnVK%N2S;mTdSKK|KUBi#&)qp!8N5P5C{vV0`*@^2yT z5eNqWV>}x)0SCnYA@VpbchkX(Z0vr@qyn$V;dyncFtd3>+>(tc@7fD|$AEkXG|en7 zZ9|=>(D*%wdoL^bkWue`nl{{%XMOUZgSnw^Teb;t-){Ka$*7ohx^YI5DF&VB8Iar1 z_)KC`4X;-2HhH*%@KFQMEtjb1rWCt98=iPfYQH* z@CHlerGhWBlhMlQr?bg8>>M+WxT*W5V^Fq6WE83UBED{f-$Y!0C#bQj`D%ZF@G7qU z2l4%TFrOXs!_l)eAH!^HETBUDFNFF_%{|6|d`)bmDl8gvSMp*hEcfwYyN`;}Za>h3zh{hitde{O3Wr1NwA1F%?k27q6 zLA1cIqYt9-hld`vz(84GFdbdEb>Zf8v~Ca1)`&9-VLM#i4v|d}DMz&&F+ls;i8#wq z{RokFzv2XOP9RCPbL|tpW(Ky1!g?B8D$%9h0A96+)Z$u4G}7FwG8nIXeSA@ z6!$ameF}U`S=UG0@y`4FtpMth4fJfAxESIlchJLD6cZqIJZHs5tB;1 zu8mEgQP=7xp$?FC&<{~e-LCujSRWtKPngpeZcKUm@i;yc=(Q^%rkIJrd^7*7L2m7B z&6;?1^VHS>#`z8AoV$|A)U?M|}u2`n2eVHjf0KI1|+y=LOPecv|IS|-B%cFjZY7@%6xK50z_pKBzi3Ha}X1yX%K#LyjBy7)gbY_kIQUUb^S48Na=n|ntf%=S!RQZgK_u~ z=)~@*p}}k>q?75mC5^ms|9=WL5u>T8gf}ZEA{sgOfSGfmtR7QYuQjbNoPDgrud? zjOMRV=G+3h%ite>Qfgqn@E?L+L@;1VZ4c;;a!Tn8fw>f}_*y;UI~{Z&&fr#Jr6B4+ zd6X4SEvNThCDnG2^c^z+VCXvs;i5d+`q=8dhVFS(&LlMc@w~ZBHZVscH=TwfzeqpT z)TV5@ho+&1(`GmNGI8`b2m=F zb99y*$BBEqlpUrSa0$26AZqFlY+FD(&SZrXuO3`N$bU^b*6{A=1`p1M*`C#;Ghkl! zG4RhK=M&#*CUs-m21Ul%E!*L8CFn8sU!6gb)N)XH36(m6d$tS;zI&ny@aO{&%nx`r z(Tpth&k30#{0<%QOM<(3D(URa(Yu}eevqBI6YYztbtTI8Eb?ER?Wc{DR+`bgJ*Dz@ zL=3K;w>e44ya$2VGnyYVgHu+K^RvI|hae$B{s+8?nFZ=_>?9;nXwgKo6;CslpCYrU z9evJXTB6q!U*!Mcc1RRc|_LHb^+RbBh-|{C>t(lur>}@2>XA z{}I>!;FkOsUHTRyKV7~KB$O~Gx+yE!7LlU@N_(8a?x-53vi)=>)qG|nik+i(CrCUD2Gp_WzU1rKNlg^k#f1F7 z&G`l0O-av@sFqZQojz|K!|_{{UuX$Yfj z7E-@722&q?K*;|{#=KH7h&0!NV`4cfQjr$;-_6D6HH7@<*yxek(Gw+?DrbR7LK!mc zQ(X6Wrd0nkXBy90xG}9A4Tu=Krk;o11ThyhBF$*Lf#qA?%bE6NbglI2E_5&npEDJ7 zcaRJUYU&$k*WrZr`j6Gv=@8AFzdNPA`@EmYJ>G(+BU|qJTtI8-RjF>{Q!lV^%O!}K z5;pk~J(N3>_2m31>K>GnxNd`YKT6Cck-1$@JqPP+oVeN62Z-y%tl09uS$FXD$D6)z z1QqSOfn0%zDP`ncX2Vl?1*haNYIATKfAf=HrKI#pVDo`mAbBy4>I&5P9#g9NjZW-u z!h~?k;h=Z)mu)t%k->t85i+@~SnbYPb>BFoGj!dE>O9tc!#-qN9CRkZK=!JdHqQGtPRV1C$ma9fW>O+Qcw{40FU1!y8ie5kgE>5L!K*GH*$M?ZFsk3&cQ1>xkO zYPBAEyBxt3|2-Mo;-;3ZD0iPo{o}dbnbBNkse2hys;|yihHNr0shujnMht$ur`AT7 zdk9mj%@1B?ZPtQ`sIh69$BE2F&!^r7;9?pff4DcHdUy12^e9B;nA0cHt{3^9WV#ZQG$wx=71?poe74 zrx+NR4??`-n@rvNt@YJOcJ%2FZ%oAo4gSX(Zo5Yyabs=U;%LcXgm!;0=kNKp z67@%SYttyY%IAW7%buMsMO;6%6THX7&w6qjDE%**VNEo9VGD!OtW%YJnNnqnIDX!G zI{Nf`M^L%>zfzwe3q$9uOR4&ELV;g-PJU@@J^;se2dDv!uxPRp+_MMEbA+diWu+;5y(W4NW`X zt1uUcw(!#*fV(Tf>JL)N+8rG8Vj53+DOnd4f$|n5CHru~9*c}#YaKn(at`Ppib~mB zDPwTIL)EdA>>HcEh~pT#EmG1N0@b<5iem^K=qcCOiuXVg8L00a4)_C({Md3>gFANu z!NA{A($9(pP-#v{H%#Dydji4g+txa|nV4}0yt2BwN0v=gFmL4^^p?vAR$ZF1Lqp3C z@VT=<>>{>Y_rQWgRPD_WH_sbKiSH##-A!ohOhW$D0b1R;7nh~9{V;*~a6CjPURqU#MZ@bz4B>AwF$AhSO5y0*9j!L~5TA0Cl+I++ZM^9}5%wJ*4GMjjIGyn^=1I7F>mH7oFh&FNINa7)p#N+750KJt zP`mrPeHtvWOFGc}-2$dr1d$xSvjIlTK7qnbI>Nt{Ee9p87pdgD|3;>2x%7G9+@zIR%| zI5|@=3yf#Cj3lm)AsC3P)Xfww2>HL?Ct)OdJjgAn84W#(KEF$<53tyOsL;@~HNJ`_ z$e<+6(6g)Azu!o(s_(3}S+Q%-L^`KM(|^)hc2rhVH!ViZIf>cTj6HA$LY>t{$zaU2 zeY``T1q)`y?m#&z=W-X<0MFCfRwK-uzY`_C1;}tHp~v}sjiBF@eNJu(1k&xEM`UL^ zo{7Q-zp{6b^#f_VyjekkfA(1cO*heJhl@SJ67?oNf9K8XN z>>;QOvQ7g${4oUmcl5C+@3OjWHmRtgfTpi692T zdANDDfc(mA-5&i3ca;!>EuK25 zLwJB%znv3!7BEjbM55C{erPGpKM4B2mqZ(G`5mI?S@IYrTh{_AbA@os)M2*GA09Sf z4-4oO1bYEFG$^maAMK2#_Yw>gH+pHL<#JG4Fvy1q`jay#BQ4j0o@Qs$VXB_XRAc5c z?oC89uf{PHZL4}Mp}-l*U!VCGAwJ7(ranP1uuoB&Z&vIg)N=B8XBhrtG z+D^GrPW9jBi~eR-%I@S!$h_t&*Ac8r4vJ}Pz8J^(rIqN)e+c<^v!X3jqQ= zhHPKevk3)E4es?8Wy@ql4UoP~4fzfh&8@UXtSLleds<`eEd;A4C#l&OJr_rQUx?}t zy3DF`%o+U}#5Vb2&_&L^02##&=%ijzQ5s{1<6zKI%B%!#m#qsLBQBMak=QGMBzO8AOSqc&gyY>KZ%qI-kbRhkjHzzI@2{;x@fm=*mJDrRRe z+`L&Jj>h*FZfV((xVr#kQ*Zr;I<>q+u&Vdl@|kyUM9G#fSU+2;dlR8*+sLuPGJH6C zAtJUZxNV5;OKmT^n>lmJXdCm1eG!bz&6L4MAoIbq#Xa(FYMp0Q0461}{#RA6)S0uj?y1ePJmTou<5(Em*{-w07>yw7q(V=!!(| z1xdbtVW>J~< z)`g?!>M*;-advviLW1M>?6cNfcMic#cD#nER$Jf+T1)p|0}fe_kQ%;t*mi3yu!MNq z9@N#m*QZHtesT*+N|#vOyqlbKH+~p(6Yei66E`k61joJCE}p>P+RNF5s*;~8*BIq5 zbGKx~$i)aFipoy8R7UlernX(TqZ^SkN53kdpChq#7YE=2Tl%P*QDUEid3;&a&+c2M|5S`G&78zpyr zq10_6RQ;WPWmPo+UY8?s;h^Z0g+T}Sg6~Cw{#}gN>pJ=w2qtWExTUgy>-!p0_Ix1~ z8I7^(?qYzlVM^Krfkar;dSbst4D1*UF4g_7l=IQYw}BpMCy2PHdm*7f>d3bQ#-Z54 zXxj~6oK$AZeGWnYRXrX3mZ!%N?=sa|))pKXpr4-s8YWxQ`8Yv;jTJLfZ@zrg(>T^I z8t>C3-(hOii&p&em8fBU6^_qf=GmU5SD`wAP~h2=D%CetFt+>+L@WwpBy%g2wUz}r zKLWRA4WjPaFM6Wf%_e_GhMzC`S!|ue-RfQeA^Ym&Ep*fT3g6Ky!b(aH$Pwk+W6Wwf3w8f!8Sf3sE4Um$o&R-P z(ei?>@u|IV;szDhF7&rs=z9tJy+dh*qn9C)j24?0h8S!ibRiWRS2Jmsjx~}b=Sw%t z+Xu&IqPog65;qHnjEu(bx3k65V6yxl(i#6ECr()5S+4NBF-VC?TJZqutdG(9@nI>S z@H`8XqYjB$@ba{`P-^J_{T@NTd29F9%y=R%WV}wjjruut9xv|>kfR7z^@zzxcJ#<| z8=x!iKqMKUFHNHqLAMU#dPGLmP9w2X0E2sG0Yttw}*wPsQdw``~|_?R(h9v0D454x5O1w8{k`>MpKs4 zAvkTisH@7aG|fcnC=n392Yn1_9F>a+RbAn+Uov^P`Fn_CKt9rJ z7RR_WIS*{NL@dIUgaW-{-}mk4-9_ikK0l3L%VIGeT?iLY>%THV`aj!vj_mS0<@w&>4i=3(j{3E?ml+G(9j|aZBIc&q>)CQ8>fVP_@*5Ms zoUttFFqpn@V=6n%SHs*nc)49)J(|9WtKVTt^=s)2-)o=g3rA4V@d)C1XOT4#29=R& z8?JLWbyW}dB}eLoW`Yxxn+NN5GkpVQxT{b;q|@Dlld9iHUxq$YuBgwC?+^EuWNh4Y7Uj z@c>YflD4=AI&ryxDczy2={x$>uavXNM<#)zZ;*xJGMv$730)lFIf%oH9l9?(&6{&t zp`0et1b7~pgOtvscK6=F8obEVJFU>rvL8N9M)hEX4boz1QgI!0dmPHezzGE7fhP^nU&cYWzt5+b+Y&-gOO&c<@;$oC@v-eTTwvd+m z`ul-bn(1i!0VmfOaFdkH-q8)K#HC03eTeL39nP6jguEeW#nrQ!G6-m_jm>p9&NYzc zwzzK-ny0yUK%WPB4dgB0Q$#yabr7}!8H=mC;K;67`mtG8nmEc|3HfUWe3oao{2ABO zE6{$5XyoaxvVUW_D9=&SwXc^SPH&EG1TZ+=8%*77=hU6*=UkQt4*Zs(cvH=?xUTu=j2QAB}X`cK;1 zPqF=yuQ7>tM_PaEJOL%J@k7sQq_QEJUzXtKm@)i@H zOM%kn-HP%nLVkm;Gq^1rGZk2`@Q@onxbpTnx^$p=3ybHTl+MQ}eMe8c2X9)7V9En; z?bSM|@0YxCOo!e;9m#nF{r^p;cTW0*qXq@_3PkoU&9eAq6dDS&ab1D(3ucL=57EZr$Zvzt2B+knoLGdw{INPS8zCt+Q6&nGRaxL zaCBQl?gR{2rFl8ZeC_8<*v}c8JC;{b-%(c3W&OyL9c2xwNJ(V~Ra3uuOz!nha|H92 zEAlXI{BouQ<_$=oNt&Xre$qS|Q3J#MwRG7GNI#RHBJx{WORi_y?%4@z&4u8J8V1Wx z27U&zO)iGW8c)?_pytQ^8bX1$Gv%8dM_(gFB0k;-mw0c_r?Yz;SV^3-sPi{wYP13E zU#|{hV`kfV3Wy0-$?lx>ri|?tO6dfhM~8EK##v|sX;gFU++ zATQ9>c|241${KcH_7$8n$H%H|t8wH6RKAC>nYE7DCsb4oIKj=d%dG{q7}vFh30NAp z-?zXw6);a#mZ-AXH)w*RDTe5pGG2N;ZJ#_`FyI(HY}!=9*vcxH0My-&_6eo~1~|zSQ}Ae$2nLq55xd&L>nge{c+tgHdm78bxRM)rcInI(*i=z30|9 zy46@?(-%N~O0eotL{bMgrD1}BP=-Vy$1*nnvL8YX=$CU4aMKAGxTZ%E+sW3l=%A-_ zrZFLQT~ug{jzgRp961nm_w@$hWH(ATm3h{QKZW@2N8LwhD|@y$?W)48<}ahZ8kGHk zeGp8A;avELc`9o`#1yzNVXV*Cgt2;=we@Lpp+stVBC)TadR(H)rpopRB`D@=??V!X z?M<#VzjWqyH;zabCN5p%8B}lM<0XIPCzH~HBuXuDep6f-tz=U@0!K~)zMa^Higer4 z%R)7mm1rkIC(0WLw-7IBpl;8;Ys}@hWzv`K$~l#6KIQ<>5W+ry!BFg8r+u%{^~W=7 z)~r`^?rul;AF8u)+h+-6>eIvC6)0pxX#w7Zjk^oP&PxTO#A>C zL!oWJ3S3!+@CkAEL&WzM9Us13kmp11^JL#+MszdEWJg>bhsYSv?SQRTquOkUChY29 za+pO{V%}&S`54!I8{|zyUq{_nSv+A0^7I9~!arJ%M! z<6l5zW1tkJ6iGO^fp=Poqf1fV2i~SDzKE`hMaB6}o|#D#&y=?=+?-Xb#!+528rL1w z9rY3|t@^*{y;q@=9^hl%){BTx=PWVENagf%j&eu(O$_?-K2 zod;R|@n@WQu!-IrupQOFIl2jlb-VV*=j;cJ2fmu90%My%(bq(G_cwtaucNdeJVu8; zk`tKbfnIF=jo0w(COGYTBl?|06jwI{vq@>qV$-D{3vk`}_@s&QB@37|$s`CBZ)<#N z7o=-H95GdO0*M%e>^6hz_Y|fCwGFts|VwwD(+c}d&Y@@>Sueh^BA zFGk%T6RN&Dmv+gGqZ?F@!?xWU*QrJH$ic%w)6YO20&Zc^+`IA;WWr{4yHiznM+l}y4Qy`z4DUg>Xwmg>K=zH1}Vvu9`m##>U%SqR-)F6 zsLaCE+oXem=noH)PYG*>m*7O>fC*h^gqJ`H9}4 z`UyxQbp4so#5c2P$gJ}+Xeg^zOuqJS!T& zm2(jcI7)dsZq^|nuypU&o zA#QEiiY~n;y-K!&rI9JytH0#Fw|>dr^6u4?({|~%Zq6C)D{pDu?6>z%+-tnjg^lIC3eqRZpb* zbx+^Xe?NBvwitOU4yOFCx0dli#@lfHQk$FP4w;x2FjEGDTrl<1JzWZ=Z;iArjZzPn z0E>+8M{vTz)WkWa=&rJAUJ24)>p2$DlD+vD9Z%42s_=Sl=_!A6%UAK~pAq>^fntyM zG?dD}apON6w5@z1humx_by@=4peUNYi#q31`Q~2-Yy^Nbd;Clb{ozV`TzhJG)Y83RBTL{vw0#GUiFKJn8>=_ zfUl<=?wMpMeIxN)6bwA!#fWLsh9B7h9vI>095%QfVN%*W^1tH>gbR4B?WO?f zpy9@xk2BZjX*J8K8Zhm4kzOq{pCS;(W39k4Da0eA_O-!oE?oGFGc&FkB zM2|xaf~OcTzx0~$B3*JMbycsV#~?+ohNcRfih6|ei{8oCn&Lg;UB~6Lm}O)00XWWV zV2hm0TmCWaK;#Tw8$TlzzF%rbHwdGnu0ySSNM-4cOv*utp>WG&aA#!nW0baHYdYro&ZAcWO}OmdIf+h;G=B}8|0L3y z2P`Kn<4MQ@16hX4eoU!)raxw>9X%Yq1d)rqM-e4rqFYe?1C<;9lS#Xnw7h|9CbFz` zxhWiB-uTnJIFtyZTTi5>#w5vPr!_Qx1E1WV_qD&WqwV@!OwqsxS=@GbR?q8AO(ncp z@gTy!xe+_hxvH8wu7mok(bm7C&x#&|$^&VsDKeX`)|08LF;LBe+aj^sfbXXvgre>w zLRmUnUO#VBHY_o}ykpalCI7qF-b$pdo!b zx+zl=uXqqm6a=tuCRjq~NQoUfXp>ukbxN-h2i0?7P^V$6$ENc5fM%zvEYEfBgF854D)S=$Y zDS9qJzsVrWtc7C_BN#A~EVV(oyU3F4yvd@rov2UVMfdLL;RSxgHJL~rvU~IcAV@GU zH(OHYgwOP*QB;=S15)MTD`0TIj!av(L{5NnC+LAW(Wwxbn&%-`YpKhi2xd5D$|afd z$2l%ESx^SPnni8rtp8C;cJ#zH*SQPP1FY5Su7PH5Qx{nG8BD_Pye}gqG4NEVBzho-$=R;-*0IQ`l}}jZeuW=Zn~#LI7LIOXi=Dl#7`#eMywSjvk!Rng|$}k2x$l+dZx$|-^!77t<;;luZcYz$?t<#X8 zHU$XJCKR~Vv$m1g&j3$hptfV!-YMGh8(=!cb+2Jc^;zqVo9yV}=o5(Ssbi{!KcUxJI_M6=@lDOWFP;DiDH`?s? ztf7-k-1Vx_cj9oE75|}0q^KN4sLCE3(F7ccnw*QFe$(De)7Ic5t~FF5 z8DP6Ph#YOT-VC;tx`#5Q`bjJLd?kuJwx7xvU-||1%4fJo*3i`&^ zM!`O4^i?XB>}-|JT0f_Zv7_I$w`m4q6?WIx=rrTa295KXB@ zcRYJ)+oxodrv%x%Am{{+Sp!tDc40@N$Aa8$x7f7{pMI%mFw?`)JrOa_iFUW*s@Jmk zp|euLM@M2NsxaLgfjnJ_IT6c5ApVq4wE>Cfr>W2wy#mKE$w0#`l?9YJg#3w!&~+XC zQ80)xR&6Fh|4CMqg+P=zwv2fUQOiq6{TIIYew;9IX`kwKzt_JBlH$i>sBYKSvz*97 z)K>K$XOMXM6%+7eVjzZFY74BSL&un8vTjE=s4*qJx9ouP3|NHkP=e!&t6Imb1rt%% z_P(K$uFh{Tb*~<8l|AgbV%ENLWBw#p1aeQ(xbA0#WxmeH|GnOuZtQ8(}iF z{#&{oJrX?;WQL_$uhA~mc>$(qDX=wJBxXWXEi>KZGJ;i?_RiZt3%4{SQZk2|7Ymp( zrAdkIy*11~8=vngFARq~t#Ugd|8Z*^Jpxi|Wt4UH{Z{maL==wQ)Ljw9qN)6cP?dqQ zN^Uo`Y(=^I><~>wwJ=^^Byu~!svq>pU{-8CYWWnJffU8nRiCAGWsQ(1f|$tVwR=mB zyT?&iZPGrAuQkL@!Qnc)BaF$nk8eY;m+;NVg56Q~5d>3{e7M~L>XN$y4fQ-RMvx~#d_(`Q$F7)&>G`>r(<+2ih9nQ0<7w9lWPYakrqsGy1 zY1xsunq-tsQ=3TNBpBE}HC=&HbSJx*a8pQx6Kfm7Ysj@(Al?$;= zp1SMSP&XkNn6n{vG`CeMfO2Y!mIYPtyqw)FdekqmN zg#31wc4^3y7hNLJH$W_-19cW5e<-OQR-`2i8q5oQ3QGu6yX{0m{&14m;n=ScE-EZ_ z@Py> z#NaasRwc(Dgk$EC^whrCWqi%yP0qricDcQINhNK=El=1-+1ZUWgs3hc=>J_0ee3HT#vV8Wp>7D-A$zJS_Y2|XD-g@`q`ET* zRhvo}#oN4XyC2~rJv=EtJra$A_>0#_xztQABN*rzh?H>j18znnl*^IxpLe>iEBd$) zZuuRe=UFMK`Zq#>Vy+Vg;pUl$Gu6%>JW8b=#-#NsTZUt?;dtymESPGKtz1sXZ_s1b zHdSF(i$O3t(Q00XiF#T zeI#bmeeKTqRs#(oBB7pI|N2Ksvrf%(rFpg-Zk{cmj|q*j^KlY2q*FJMC#kI}?)dF+ z^kGD7;e+p^V&pMNRcMCOQ&X>{-YFE-3kU^%pY-Q&%byVKfrFOrAldJi?v^_HlJsHL zyM%7Y+(xS*m6r+miyNma9DNm$FIw3HZs*>&PT+5o;yviY(OVHY&XUJ4+2ZUQdKHfJC^?ksXqr!E7(`jR(D-CR6AS=K&lZlJj)+x>;J!8s)&N3-Xn>py zt@3lh;F>wUr>)UdDA|?Z9;T>U@wJBN&iI^#pmrg!$VCLJev@Q~NbJYJmBnYE9BX9i z1K@s_(1hgtfpGLFBvI9OxOufeTu%@hVmshtKCrD_e>uI^fCjtH`ArpRIT+LwTChw; z@qM4#J?A8UeOkVU=wI`(##(;wEMz6(`!=R ziP^eaVr%O^2?h@JHdcX9N1D$8$6N&2fke9TuQ6r93%xk{1jKy+WWxf{JU_%#T}CBe zNP4a`(wRJjQr~jxxycWW@Hczs zqn9CaiDmZ{xO|r>{$@-1!XT?}Dq(EJ`yTMZZzt&Q9SvoU`e}; z^KkmTe(}x1u`3XUQ&nvzUunl}+kv{8_xkKIYyM8C??2XeD7Ir4Go8v$2~}Ou?dVNS zCA?Mn7URA6fNE^fHx2!uJ-C3w}nhf4WDua`#aju46cdw5Y=tq?`{4YljVxUb*!*f~B9 z8}nz-)2z4_G*K3!?UZK-`FA&FSf?aY^qU~_5k^?qNBJKevQJUKK8Is>AehutyW4h^ zvk6tDMmq_|E?phXWyjab@I^_~fyklMRy~|jyIBj4L|yX)I^6oVfP!->!SOfrbo7R% zP4HDb2-x0gcA|Plui=V?GzE>(eQ|gYq{K>W6VxG{Um>{n;*|8=cOUly!_RE}8OtD* zww3P6wB60~S^v#E2bapCVT9dOhSCq{>Z(~&WMsXv$T@-|>Z?bsFj=f^J_od*RIc2ntUX1XCqOd{sm2m&R zy>pL|s=DL&=bYImh`hG6QHo%JG?JJo50^zMU<5It2CAeg?C{Jctre}cC6$s5gtn;` zDLxX6ahdVa6s4^okRTQ;yE{N>sa0b_fyAy*iy(+Rc46oKn%`Yk*zb!-t2@SOAH$fIrFQ9zcqsVL)RTk(YE5@=4rmDZXA;#5;yHje4$ z%dE<_g8uvJYd9Bq$2$g@yUG^`(}<3K+ZBgwZ?T%u7}cGnmv>S{nRYwnWy%|WEmj@H zM6^Q66_k+{oHNI1WDIjk+Xt&`kJAe1V6CcMzIocEU6~42X=EDZWi2q|+X}jt?TIHA z`O?+h!;r%mrZUq5n7uzS3AcCEo?h5935?Oadhgb7!wc*$t)Nn&n0z)}Gg7Z08AE-J z?AqPMsU%vqq)oYOFT2)z8r$&%mPfsGzij%5{FOchlbJH&^o4uA_(hMu+Z|5r0OQYy zq=hNS`##Z;*$JH!PiRQ0>Mb4-Q=3^O2S^qVXZB6U17Db`>N|+oH&WxJ2VNnU2I{MC z59{kjwJF-+XBSOskw(g02{m@VwVcLD-pTA+wUk-Qw^O@()#ojClW#YMpwVJcqN6n< zE_+&h=OA!41iBRBJVbO%8buGzvmsvl3>d9V?)@c^Jsb>=5=CUO=00YYdIJu*)XK5M zJPfK9WvGP^xDpa&DO3(YSkhi-dixh{)vA1oZ+sF^C>(!H(+x2XQ=k7D6)m3-{w4~k zcdX_fjI9db&(<1doB90s-OX-_v?!{2X9%`nGlqd_&6C@Mm8WZ|fA4-OD$b?7m6aO{ z>DA{AkcpS|52(lf*b9G<(%i==Sez6%ONR4uZzI~lDN9I#8rG>tb_ThS+Ky#QQ zW+m2s59r}_*jN3`2Q(IpXU@%^`XAfQh?f%M5Y$lOt++*K3unnhBD-mHCWPvaeR;># zIHD!CZ^!{taQFwIFQlZ5V@~__vD8mUP0p}Jzd}BON?PniBghtTM7Fd6ItYKuO*2+) zEy5Pugt1Tgi1ceojT-^SOv=k%3!O|&3&t!AVlfV#mX4k9C`of4vps~m`lTygdoP$* zEPO9M=#cA~2F+2p%_ zEb%;st_>U3#1sdSZPXu~;zc#~F6fnO3K-b`ajaSFoB6E=xH#CR4srG&yoD{?K>6?w zea*YN=38JVVwi$uFyb1xdXy#rRBp)!kS-l^Nc`vAqj=^D?oTWf-e9%L6`(+hwdK#{2_h zFOK;S*iSHxrx7beq&p7%Fy@;egTV|3`iFc(`r3$7pFcnSSB4MDR&5_ZxBNdMqQyD8 z+Lv8_&{r_C^rt>J5>D56;&nicuwAV=2zx;8CR%pT>*o9m`kD_4IDO(_EWhqD?hHYr z-BwV4atRf8q)wIe%3ZJhV!H=m8eaw(>vc$0^t*@}^yQzFr@~?y@}KIEFL`T*#J2Rs zbXy57VvhfNo)rwf2ob_ol4qmLxvkC*iNP6ARWp-_c@j)+S31>bBAh39^Wf5q7~Z^| z#+uq<&Jf4AHimRn5U;Cdrk@)}A&(Osqrixr+u{ku71S4KZo4zJrk-JKPaCI$sAkI7*3b%IXbG{3y@tWD# zxlIFVuI@bv%k#k3JC~TitDnVTAr1Mfg1(M|3wkrn?&Y-40{3D}QQ)m~M+U^YuH1Hi%b`fXFj|+IPHF z6AD0EYNw8`Nt<#4#CeeDn1rv9tvZKuiI&$E(?=#?t=3WVibR?Y-NDCdAdIySQP|^E zrVl$Ae4-4GjMZKXYV>q|gfWE~UM&r?+? zh2==(*)S?Ng(K+ArxCB|2WBaP0^)rw)I&;tvXclKX-qzH$uiC9uM_SJvFh=d$Pz?G zX5r=3(BO6C)i31!@khelcm`*CsaD;wYG1lNK>kAp2|J&GX80S@xQOUj#Y7CHg)8Vv zlIre*6T=Yu2qF(;i4kNYNv9IdzL(Wsoc4~?jpc5<6^Z;DgXSG{wi`~XwpNj}Pt#!c zW`%vjuQ=!{v?O^W)>hr-Fk08zF)NsL%NC5u{>nG0PE*4?2Np~MQ-L)%gIhDLqj;*BW*;H) zHYAr59lJLbxjFKG!|GjQG08_U=si_~T}Sb>>7K&BNXm13)bM7e449eUkbdEZ>>fz+ zTq)SOAmcO0NcD&R6GS7U{z6H~0qz>okRun)JDG~C^Ks!o94W=vxd`7$BM%|Px}qx2 zdL;4+dGap%ZaI{ZSat8a&rDCX&iCjw2+M6?W&xuz$5Y*c>;|KrfNBoZ?e|q2GXMuN zFX*j_(%=vp?g2X)<6^S+bBkMuZ%e2~vYo)7dg4LE*@k1*GP_K{4KJ_e8t%+AjGL1^ z2uumk+n?H`C9*_~lgEIgVBW{b2F@log_=^DD<>1%ITT5L7whWr*8wG9dU{6lY2K%X zdn3m&M(^n%x4wa6|IF;te|ID+I$qG5ceiFugwF?*kmvLx&wc}OhJhW7;|y@iO*aYu zRp)?IvnSCSYVw$9WN07|2vbo(<~{KK@ZSps3HTdzY$yi2!F_x$F9oWe zd~*N-y#p!ANNRsFJvKqsCeS1AY{~|lcU|(27mMcd zmMxC%BxW_2#wARetapC7#H?gL#yDoT!`aX6@BJdcQ?sVmb-Q-Pjgztjwm`SKCo-=O zz#K%2VSCpEk|~G{gE)oM6d=kJ1R>_K>S{W{;lj2_aEvxt?0`>Zk_@pr1V#{qHbJBT zqB}H02*QINbku@ykO(J)Jprx`u`3k#^g`%auP<8%>?GFm|IO~4-pi7Lge1yf;$UNtD98#vi3W9(Swuu6 zytue{ZgMg~laXLNmYBn;y1Lr!nhvStwcdy>qU4)f`5XT!HmihXyJX|H43F-iezJdU+j%BY&5&(SGw;E z&D@;)850#1CDGHE@ z7D^*JDor)HZcr4<#cxj(&mR2SNt7tkDpP|&3;QEQH8nL`f?ma4);pqsIoi5Aw?x6l zUL3Ki7eNZ!a*db!_`YV*Om*eOF(m=sOfJ^8?tKhoD(9`z^LADv=G4yNp<#c2e{p(4 z!^ioj`%4kM^7r9X5DwE0k}xDpsdn!Z1jlox5SNGP+p`VJyMJ4Z`nB(v^{V5Hnq9V5 zemOd6XlUqrdS0a^B_(y!(9pah;(Wc5whgLBk2>IK3`V({f{y40^ikQ9n;Lw7uXBEL z!*0~(d4NZ!l&X==s0seAoDor0#$d%wYGGmVZ&qER(C2JD6AiWzaEa-6eTdj3<7jcgsN@F@)P#{pq49Q^jU8IPg@4FPK?O#Y&DJbjKeSe zCMVM7mBhCqMCa${jhzBcf123-{@d!O;^N|pgsX)6x7mG?UU}<<3(Id-KUmK?ts`Gr zUXD*6+v6*FUv7YU4n3suuUby(I#larIb zaa*I2@!Iw5eb*7Op0VToCg#s?@VE8hyy}71AdZv=i9szV%E!k?f&ve(Ubc7|YLLfF zMRqoGs1VW}3u&&~VhxCs6IpW=-~dkR5($$`doqnBWBcxWXQ|1V++%-o;*kve@cMEq zamr9t^*AN*8rS6f2aTxAA>0Ec@P&6`J0XjguwO22cY?vQ(nh1VF*DScwBX7MF zzbmCNPvuKcULP$Av=iZnh?A!~t*M5%tjJomzCPb>v|3KgmZ`sjA^Y)==_B^*5LU3* zGo*~L!>Y+?*{`j&_4?Dxlkbh~R356!7;t}J!-h_?M10tFEA@NZT3Qe!f?fhN0VD{a z{ffzTHjr8bELLT%3ZE2czb4Qrryb7JNk_(nqY-|^BIQN^igHVI>Fz7aRUG`oe1#s@ zhdu;ur=LNVJ56h{zFi-xdt^1)cs`_+@a(gbQ1^W${hB z8ckzagl6*C{&ihz`;~gyH;Vd2mjo9^`mvMVQ%)WAYOUSp<7@2cLw{c%j9*&7=hXOh zX=w>nanYSXWv4=&8d^mTcJXKpu&FZq^}w!Q3y~Y=1h;TSL#A5%Jsm?_j^VebXWu^6 ze(0yB6#c|0Up8BXgkx_aVB5J$4P`shx_GRlO&KNfI+*$XaCI=7EZ}O|z#v=jdJ8F2 zD?DoX)9i|myy5opbT8)D8Hf}dY4%Zp6&Gd?pDV@X1GkOn`*#}4@M9{< z)i|7|<$fH67+KKsH8I@lX&5p#5iRMV#q8-tWrj3@-{EH^u0?v_I@NuCezB?C^n^dU)%K&m-n&Y?!N+|0ny~!RbZ){?)3M8 zo(FT_9)zEM9lh<)ES3xX1)KlHv)=8S`**~7qgX)L^Kd*nak6_iXuZ*1i`RbUi-5YP zCod7Z@rY_DLAp{@XOr)x%_&80pYHiyVMdL99XOFfEVQPk#=P}FY;Jv5gd;VINj~5X zsO8!Uy_&%1!+93Jt(B4`ANwXn-QVxPCM^OVfrYJ#f`a0@-g>MwRe=_x)#5z}MMNYp zofub@TFR8FJ=>_hq5XitQ<$yDawlnxg~JNWUNG>l2rf&&Ok7Yz1U>XDq+7zn&#!N7 z&7_tH`)plq(#gfmYbXB`te2Q0Px=%VV+`)Pt?cbtW857{hCdZz94hgp4!SE-&+8c- zMHTw^7s1k^o%3($<>gqxJN9?s85tRwJjq-eV;LNUx)qxBR*JoTh{(ucEA5}6@j`t^ z@+E6#-Or-q;;c5hK9iFJc&1#ln36J~N4Thl(00#R$j`J5gWcJ_zC6dy`sM_y`t0yI z%=M(P=n2+d(mfcRsh!|ZD8Xrkr?f{hB;4i7vU8x#IpjsnNwF}xH)+xQYP6q?ph+r` zb0{QCzX*u==3YwI95E-g?kwYgYdBrL?&&4BOIav`#bZ@le8g8M<9zpU?U(?OVWOo) zXv~#x+w9qDX=z~xt=j@%{HrYrqP{L{X zKaAFHbpF$X{^7$1_!R0T8(&vpTo|Q1%gOK`of^~6ec!k&W1jx?W5?Ow(c{7l;9+xX z1VetarK%BwvBYLUSFmY8kS&}>>I!SNOaX&8Te$DRdjMg}@#$4Y0B-e}-g*-O_#QHB zZp#X1wL7T$KR|A#5D!o=mq<&i*#N!-?v(BgMbxV{{Pp|ShyDnRjb#As7Qn)5zf!8q zZ;qFdC@J&HP*G7m_uQB&*bmG^p!RgGj%DwiIo>z^@B}Udqi!XMt63~$$`B&peF0Fy zTJv78jGRnIY;2-yj;GC(2d-0>O~GtthiWFbbvgzqH!b;^5wP^AmG3F@4t>uVM1_^` zYBd=Pv6?o*1_AtOhZD@7Z#p+)fsVGVce$*!%>wKqWn+3e`CzrR0mYMrF0&pFn!#!y zwdfncq*c1=3rqwjD2So_w@vig(;|xJ&yQh;^A$BY{LY5cKpAlEexL)d`JMc#M7RQ& zQXjCV(><>g2KASHfN&yszfT>-J8(qsD+HM1^DnopzHOkmw=0i4Ux-53!MOzPBP{L! z%(Tg(6XjrFVxMKv5CLCDWjJ{^Od8%N@ zVNfQ#1&}CFufpFtT;!$(6-ME$w0F4v`Js{iB3w$c?hSqliYG3t(MtfFJA`mBpgI23 zABi==3lax)*)9B81bY@mt1_BZ8*gMb*p$OqZL*@+0z&}) zZoWAj91L*&Ah_a2$!>NU^kM5JzN%oDK~~i-iIXZq zm9hs4)0iSAfF^aMIp^sv+G{8yDo#q%dGxHyW+JP@H_BXUT>R_D(zA0#McmB2o)CCr zUXmG00nC*T4>NB?yf?j|=qh=l2DRhe&oAT@;#fUNg`TN@)qx@JM{yA7sWF}`H$-N` z6!{{pid68EEo`Rp-V#$%sv{aC(_*JNY}hPF1Y$z;;7IgKRWi@_ey5G4i}`yu2y3Af z0qoG-d^1I%Xc8S0lTMxa>UdcziA^r9!7}J2!H~}Z?J!YRR(|Uo{#Dy+ek7Sjw@R`K zDL%=_d|UD27#z*`mGg@Rb)8&Mn{Jg-@{jx32u$)89~4y*1kW}<+GU%EEoI(w9Mo`n zCFYc*(l_V#2cNwT=Wr1o3?w8F#ORxHI9WKDg~=wDSEm~hUw37!MZFFQsHv%;EnFsv zmkiWH8n0Ru;+XAFsK(9qV5}s->ludroS8Z3AJo9X=9zUXTl|5-y8mx=F)}MM$CJns zoJ2$?+I@>#a;A#k3#^n^jWvMZzF?_bqaJ>h*3Xkpx&DT`3Gh+C2}z7Gufu zB4*T(dD%3NV_!5gL34P(5uojTjcc6(b+8uqxXAWUlmv_~#ev z5Xu9hQ)Nj%T?AnRZCwttuBWmPc;w&gW?ih{XLNMBG}7i%1kd_QXq6POJ+D!-vk}^6 zkXekbzb?G+e3^QMZq;9>rP`3{8MpIoSzH)3bk;eJ2iytZP){f5)&k{1R9(9JBe53&hUlehY`jVU=&&xtl{8iZ4*`QEEj-=-F2bue zr0j#L1vx^)g|VfAEk8lr$@`5U`utDER9afGnIrR^0~%FkGE$WKjQF6 zaDo+6=-tP8scu#P{1poNWMQ{Am7m}It9({Io@|gQENL*G15q^ai;gnU)_qEkw*NSv zKNiO0hJGs37za!N4iA7l659bHe5KuDwG$~PuEMzrJr1?*D!>xxFc?|PC2=WfrTi7&D*4hhy5U@YL1+d;l%$ z-sgv-nw&{;rWTY@Gu+4!dh|mh@vqayl$2za{-7%mPQFd=YZ!)^FqA3gsKxM?Lp+Pl z&r~tWljJyhgd10fIh^B>TBt@s=MA8@FYw5Jn5}pE537=#to*{iiY|4XZmj|U(k4~j zawDS4Kl0CFO_4(yb8YkfqFZcS+`un#0nJh=x=(0##N{Rf3EOIvzFzR;8zoHCF~!}Ysy$#FoXQmeW8-Oj)Hv5XuU?M}bz%|7XX z!nS;IFXq$po#C|<0;5-W#Mym%F14E&#a915V4N5iyxQxq!=VYH2!ATXG;eKX$IwFW)?Pg{G^20Qzn9_REqZ z!Da|O(;>DvGfSHLLZv~A|GxLnHixb*7Quz(Lq11@BRxY#hcdAdA*yj|!+u0*Q;5-<6;e-X9P(H~CDrRe>@H!*%Y*bR(c6g_C9&%ziuB zdK!{OiMImswHHKGG-5Fn&1%?Z+Wz^G-{%;|q6U{Qlin5$RqYnmAzvR1S|LP)haqn! z0gBEMPMFcvX{JOGK1P9>_ALM=V?0CFC0U32;0HirYW~om(xpzWUkWTt)SVL>oLi|7hbh=Lg3b7ku&2xAXUt^q&|a^K@RQT)vQw#A;2_OZ$%?0uCbH8>Lq| z=x9}wOf=pZpsEkyTAX)2P1O!_W58;HJ2156Nfi*RrS&(7(4A{mp{C7+NZg=oz^qxQ zQ_f)D-C+lJ#sexB%@Z$>gws42Ab5PUqZNx0=Xr&RRwz&d$T^ZXItD}nXaxf* zL+Z~Tcta!4vN3-@KNrz}J2yINHH{)Qdg{S9l$2IuLp7G(*M~Z+Mr{NGP&_;x6by{r zqJgi8UJl267m;ObnMvI|2bHtTQdpu=$9xt_Rc76JmddEDCtv?A0<1{Li$J*OADu;w zYK|Z-ElD!jeX;-Tsd3(1)9o&@>s9prBhh_ZN+2oMDlC!%*FQesH()OIGp(T1EjBr= zp>?VazZLod;PGqDN_0^*8r?-iiRkVpn$#bd8{I+qKX1t5sSaPMq$AvH9lK=eRRNa> zdDvy#tN`SiM?97P@%fi|Zzy(kBj9ydMq-d&_{`iqOAy+t2taGV9vnY}LE}zH7~N7^ zk)r1 zB-7uc`R9C{av7ICd&f^;AAyRA!aN2j55aW&`~>38*mY@IvKfYkh8^1)T)QYc$vEyp z)UY3Udez2Tho^gcbW1sbfq}+(QsHQ*f2rucuC{(e|LPUxEVof4DuqvF-@Df7pONi$ zxi>aErc!*1BWVANhD(m>hV1@9E5C%ELb36~Z|QYAspyrYZ`M+kqJ9ZqxQdI41pTUv zCxf<2oCP~8AR*vT41otMRj7;<= zdq7D#b6d|vV)i)Eq8QIZ+w7g9>dF57<-Sz_d~`TTW-RahM798jHvn(Dk7{IEP7zd# zzloPIJc-QLA?IS~OkA&H@ECQYGYZFuNDp0k&{b6y+n8?RO5@fGA~Um%6@acj;$W-s z4n^BuO?k;NB;ngiMRnR-#ql5tpBSs<2=+EPF1lD+S?!X5wsaF7F~(f@p!jbsw68%n zKM+(fgT0jf=>*a<#IRwHd!h7ROq!R6I!ANmv&q03*_P?@RuXGzq-ju87XTzVhHkig3z1> z@Aff{Jb0ueXf|lJ9o1nHga!5<>+B$k%MvVqRu}UJDSe+Xx&^m>?8hNPlGYczHF`Zp zyqe0R8GnU)5%VVaRq?66w-+u>3NE^VhqhIeicK5zHNY45-wmel?NMxJ_o@Mx%uc}Rmu*#6|mpzsN*H^;xu8I$z-hQpTCyXcW^V+9ZSe@9JGl0KJ4nqoy zk4CJ}4V$;emoL#q>r{zJ==3WzxplGIsH1UROri2vs{N1y7teYa5Wyzg@II9&*6!zG z_0|$4@`tEc_&HQ_FX3S8)(c2^PtkmZ+r);%JR>iuZ=wq(^rO`j7C%3clP89!=Cpph zClh;(QMX-@q~8c>zf1)4=!3S zUJ~Hj)OaU>%se!KiKj=*nUG+9tc?=zKybPLVE&R`_3y3_(bdQR{fdl`nR@FV*MRFX z)}Vn6&$@HcuA9K4jRVB?mtpl=xyC07Of(|7ux&bX6kquMM-;4Mb4+sr zrJhk-d3F;>o#8LdQrV9qN@-szW$LU%qT)bpl2sAno2cF@`5``f)rDqbXN5t;X#CXN z<)W+ts63NuEjLf3dE{3x(a&VNI?R&WTQ47sNyxW8f}aOJ2gTW4!>41CB9-0Za&~+| zeLlh=S?`h^zkEj`wPAm3kRHLCXrE8Vu0R{Cf%K^#>`L-33Ne({JkPGczYl`{P2g<^ zLkirp&?bH4&sKzSbyf&*%e~WbQQ1d+oPbs9Gprwh4%S@IYgg%WhjI?^LZ!5(9GdUl zwxiV>)Pl6r`)$wlvBYjng)4`t~k_t(*3(=G$f>2MwV>vsD z7-gRnr#ncEo2$cU+gmx{D502|(+YxtXjzsFh3#jFo8$spmD7-N^gqSYStX|YKY7_my) zn}9bc$J2O$;(5Pafo#L>s5Z)w+Njtm+8hOv+-9)3g7W2ix?hWGi+N}@H9;qknKW4C zkZkJb4BGoEGIQ5j^H&|}EemfJnk6?#H?m-xmoSv*AB;G^4x{;7nh-EJTVOaF6(nITHQilRIW z!$q}wzx_bW-n-l*rN;7!EG6ZqmcL+){`d*|dwQ*cqdZaRr-fXN*EZyc=Chs|r0E4X z#R4CX(8^KG0r&sQ0!aA^vV99*l0vLR5;pCSSv|y55d7zF;cHGDDm*!{!*~W z@UoP3e6n@32*-FduXckZEkkR{aXv`1@_|u1sS^`^?f_e==x_~xGWIWIJ7={acBQ}F zSje+x5yxcbm%`F5xxS$@w=h#0H1TcpIrdqh+?p_q4(Mzs^mJr46r2YIe_%g_9SLsB z7__+4XR4=^groQRUURDmKQXL-3IC1`o6E~k&ly+{f96!!Lul?P<7WdmCJodhxgE3%=ij2$j6^ zlf}F{BnVRnj_BK9Fcl#}D_mu$Vq^UnXb92VgnN5@GE~((n7l-E6l8BWc-p6-0%RT# zi=#sNN2rqYF8O(e*bY}Q>pxf)VDHA=+tUxNy~Wy*@2_^0pA422UjgK#8j`0UYL(0i z%OWn%8giCaSru3WlXs;n+oeo`5K2nihBiKEP%=tUi0yap3mRisA13!llH4vjRaVv9rpjg_ z@L-AR{50LYb|0yMOS7Y8ID_5N-Hz8dU$o)Jr^fI$%}z9GKQB0KW|tWhG_>s{3qTg_ z(T1zw=YGWOr5ZVHM@lp6YJ!ocGO@e5tda|ZH1jAZ^O8HzW%GVzCvCjq5-e0>5d{gQ zSZOoCt!O*gWjt(@Fp|{P`pM3bUd5WjDLBMDm6lW-1@BFngkHXE^hSgm=-iRi zwg6(kXypkMt;c@4lGaZ$W&z|?WCEx{AUq+F<~?~K4jAY*1n~5A@A&EX6A;^>=!c`F ziAK9%atv!8q!}9i&x^ZMM8|4O+w!{z>-u-q5}lo$Mku4?odM_IcnSpb0;1Yx96?;) z4$i`WbE`a*0n;|$OL`z0@>JNMmChl|jrVKHYyi|MR(9QToT`5=;MTU>5f4k^)%{b3=CW5g&y-4n{5k48o! zDCUcGv&T|vHQzjc;o`hi@*XM~nxhD>5B4{;6NnlQrBb_$JP!MBW#9}GRC z{Ma;{XGr;(b$UokBY98iTjN5_q)iEv$`~e% zwkwgm$;0lFTk+12W|cfWTl@iUc3b9PSGkPe>5Id-3;|jq$kIS(v)+;Ac;z+q*sEk~ zu-QvsLIz**#I>up^(AcU*DE%O=?tbkGm-={vfxBE;v<{{gGkxsT5-c6!oVG?%yEY- zB;cXB#gjMLUoYaPrN~^a5T*&z&AvBFX|zcCY6tvvh{Qkh3E@vNG9e5jW`>`wrZ-yK zZ>12a%1sH|^Cd#s^l>rrxZt@BuT$`REH4iEc=umIUY}&mUDiT~NspI!)jySI0Mu9r zd?uB3xik6u3T~FCts+-!d%;C!e84_h&nBI|oPdiiwtrYHR4C{zUK~%Y#UL66kmKM8 z_Liy%gllbnQ-1=|8lRcU-rqs`s}t;;f$rc^;fMz(m?kXNt0eQb7=i zWUMION5`|)N3t_X14b#)bba)9iitpDu6mS|K5c?bGJj%%ns`aka(MeX@A;cvBQLM* ztJByOAjU3nCNE-}$A+X#VlE2*D%#gf6)c?$ER>UF#9X=fO}n2`aI%aJ?hQ5* zj6~Amb7c2~+G2F(3njA#Y%$> z&NRpEw2NrXNU+^0(+-Ufc0hac>PtB^Pn>4S_IHy+pYOS-!pHrGq z+BZU3)jQ$a?XJluQ1SIZZtz;!d}0#D8!TxB4+_bj4W=_EF|%=_p9&W}$gaxaav!=p z_I@{Je}|)j{lG<78Z9t{S7=)iKH@gV^fOOJI!}T9W&`Z|D!>HocmZ-Z9b83G-|+Z6 zdFMpFgu!3%;Te>fc)KY59k*bEDyK5SO)A{76HFJ=LppOeezH^;BC;RpLQJd28IXnV z*K8jj5v;z)gi$T7mRNB?|1=MeeCRI_|Hn`ypBT9{h;B4Ya+}j=h1&8~0>$2?23wxE zA~^6_m_f4&8)e{;$XPHjv?_Wu6Q4p7TS6s}srghuEpKQya%$^ppx%gl=kfySdb7h* z-0His$FwyN@j)zO)F^+--M0?h7}5VE`>5POi`a-gwD?RYJ6UdYv@2XsmT-{%$;^z{7d41 zaD{DT7LUZm^OwrIcYD_*={*yzuSdW2kuc-Y+(RS8mPC-<1T@_HJh9S8R**=>hgNBt z2;)k@*>C^t9V^t|b3H<-!AB=PH*CcQW%9%Me)qYXrrv~jET`a;9Q@91)NykSME70( zvKcXl;g_iBStyTbcByOULBEwk2~Ega;>O1=c7jjTYz12SJPZtFB*+EctVs^5GSvQv z($i|-1Ek=(X1}Dccw2Llqi6)RH{!Ek6Z+n7)ocDL>n-m1XFBj)VS)v(_F~Z1nD#cQ z`6`~{cCXNG$yoMI|LnD5Be3Uh%cy9{)t}d&x?S+WV0evs8`UKp#;LlWsjB4kJP4m- zs@h8+a8@EdZ|X%`XE8nfLT-93J6vzXFs7W1=D&Ye>U*Btvl2n~tEqyNjWSdkeuh;q z6Vc_ky9H-&;4*fwFt}32fEwJmj_K9plMz_n#M+IiJ%#d(2}xnoDF>^0(}{?*>(f(h zA@jL$v;C6;FK-uQA#$$4MM(6#J5v@!|GU9@1>aHNn^YcBouu&hhFs7MR=+nUk!7RG zY#kLRGxx7f!xitwPpN|H;B3Z17T54Qm}tE#B-;PB02003k%(Faqtv~*`?M%*wB@2lp%Wh>G^@xONI|! z7CA;2#SqKGe_NqL4}{uIV@Wf{_xrZ#y}ohds%bG%SX`u16gZx(O6#}&B+8&NkOM#T zc53j`vV|uq65kOduRTB>&k!rtD-LH+*|YT+ka`uA(!reoXdH?N)FeX5YJblpMnH6+ zAREr$JdAGy4MIL?a^s9aM0a}NekM%3>c2GAS&F|KA$kgQBJ}Fn3m^KvM28+n9vult zaobRfZs6NWz~j{|8k-dS&?3JHdyv*F8;U&HXFz`F+l$JST6A1!SUyI&2}_ysRLBwc zsEe=qzyh_@tCqjwXsRkm;3?~I2M;NeO%0tntTu6428eYjN*Kl8MXxlHW%y)I5lxDiilZ7ZYno zPD-;K$psmy$otvPW=L?>wbW78tObKB#n$a*YoSyfe5FHfp%2%~_j79>)3J8vtby@;U8sTl?C>o7 z)wg?PTplm_ci^`H?rS_`Fe?bA>k?SlV$L9WM4;y+QOrgiI3&&0_FColV z^;u9sy?PUDDOhW}f4a8ONd0VQc*rJK&FAjp>I!P0qVhtc)jDKmrQqs2Yd~yLrFBs5MSk zWwozFkXsSIWTrj`bURoZ+Z$pV;@jkNVMk-(7%=ep76aS5%e80mIR<|6idGiTI7)J! zS=S?57_9Q+8;_t-B*+!|h;-EsgpoShsr{l(r+_f{G|;)mKGXP#54B#P9y<-w3NT>F z*pkU;LSets6sUrYE&gb?X_!xHohiU_nSWhU8zR;i@7M@@#H5jr4~>mQFTq3AlX##y zV0uqnv=NC-xljWnuaQAt?H`<&w7_eGZt)=RTiA3lDx8TzT%xYV%%;Oy8{ZqiK=@W5 z8J~Tdbh%VM@X0QpTai|SWw+&fQg62}{s^;P575G_wV$QOpcEG+jZ%$0zt~fr+^JB_ z=3fowEPY=#Rk%9ZkYr!gGNtNw_W{#&)oz_c`1}0{dh|Y}B%6B^D^a8->&#}qj zBD}vv`}t}!RNDAM)|J;e%0K?_+a6ur5YUl!hq%s^L>JtUY08)9Dr}E@+dV(G6IdRm zFF4xu$T?U>rIM96oFWu+Cz?;lZ~7r#n(4y(Gtyu6C|it}f?^WY?R}?$e|+QlkG!Fc zE7u2942-#r){l`lFS(U3pM)t!av(n8jxq?|l!9&rs3H1{KxU!Qp|zdi;<~jbN#vH= zrZ08iZeMpbab+bTE*4$hyw$7@qw8!LUchw?PuqpCO+GQR6U4>yxpH0UeWt9XF`3w~ zWnAnV!8hj>cF4{q^^{x$ljyeDVpazWYs16xK!#UvMd@FIQzc8nU@H$DG~Vd8>Q58j z_h8ThXziQc?IxFn&4g^|h5@_ja#^fK`ju=nf@=)Hz=$o}()p&i2hncEA|b-VxNlUZ zm^#9Pt#EO->ntJaBep&Ufu-Ch^>6hURHc6j@@Y@!e-fEO+~V)~IP$Iq^BIvlg{QF2 zI20%*Vy=&Wfz*Nu1lx6mEQ{96Z)^)Z;J29?bHk|97jOM%05E+~{1wZ3i zSu1@f{S>0=^w1yZJ0CJzg=FiGiF{Tpxj^)8bZ!q~Tk7&TRQAY-C->OFLIFp@7O zGIGM@vdsMB_8F;!VMN;Sgf&fSx>h`gXezwY>Kxmg*l@bIY*O-g6_FY$u^6-dQ;e73 zaU&x2WPy%R<;U<9nsSI~l_B56+R@_vz=5Zh^IhXaVt{S|{4u{iiINg~niHvTfXshw zAM~NgdNdf1O@Vo@3?laS*P~N0$Z8Cq#@Q>TlNEt})zG$^_Cg~+qL`aOH~9V3z>+&K z*P`fkm&DQk&2{3j$Tuy+IyxbhY=mLOSLG(H1_GEY8nN1^$HT!dFoZQJqb}zoo=jpG z-snXaJkr(m_4PB!4WBHVGh*9;qvurEKfgh;Rg-!G>*L&aW%?gToyyCqeqDwx8_Q@& z7N}?0Pue%v>J3)4UmM+$$0+`qmqJ~^*8O-F5dX_U1w+Jli#2xDF9^ccV%OAeJ9)}s{SY|+W) zZ@4{Ob5t8u@_R=UqNZsMWYZG+PK65m33^P%=#G~#*Vg<=XI5$PcfJ3TxO8Lo?vAF^ z0Re^G$!9JNnX3W&D3e-kpr%&Zj?B6x?V{0|?5ACj6T`9h$A{Gg64CpMDr=Rf$*Puc_QhVpvyP{&n4WPQvbUG_C>xafd7{*7>-zE>0YTv$$$iF0CH)oNvlKx+=LD0 zQ*aM~rqDYhjnOl}Q0dqMGNH@&7wPw9tR zQqPoG1WW#|sLEixL7LbbOEOrn`YUTgk|eh>J8H>keW=|)DCV$gHNbX581m8@Ts`mJ z%rRX&WXMTy-@w@_x>fJNl**R1WuT#v#kDgs)%_vt0e4w{7ag$@muV+sC=lOu3VzlLm zbyb&w)BGjarSnVjC%NXAIJF3_nfcheLNSaQwu}{}dpf*QH)B}X;$Uon^sP&Ignw!A zhsP#o_-j@pT4$JH-VR-o3EDgkL`u_cRa|^D&${qT-F=4@{D3}EF~S4sfit%>fVJ<2 z{!N@~%t=AZ3j6TQQCwWy_g;ZbO|nMg;|`XUz`3_&P7cn^=Z`sTnkaIEtTXe}wE_-v zC@wDa&gL@-C54?nXQrNqbEwPp=W-cx3JNF-HOAqnr+Id-r(!wI`pX;pS3OOB^L4L7 zUOYEhx9$?Dz*1Sl53Ap(F+|nNT2LqUuL2TUKXi^P8&~i$TniTRNykiS-j4yXHX#pr z;2A6gMYe!rzHr0%>IR}e&_fWVfBex)ltQY68%kQfc;rB-00R~^y*$>JphbeuYH#Fn zT}&pdI^&$i09md9dhb!;Xdx7*HARXctB6V~ZJ?k~0Hw9yuCVNJu_(-g{8k`>d#2mn z`<_%rmbXwJs+G1ZT80+BuKaLE$|>3iL~2a6SsFzCaDs^IG-)oGr! zPMQ1OLC6}Wqvh>&g&jb~xNi*a!{jx$pJcOxUw+8(tvXF306ar=7kC&==*BQt_^%VU zC6LQEjf){kP+)s6OMWqIA?-_V!NAvl8I{>+a*ymtva4iT;iSRLSnQOr`fP%2L`?RSt0 zaAr%R<;3TYt`25dctT?*!9Q_+tnfgB;J+zhkfcm9mDbJO z5{DD}#wW-ng^f*3O)0qt;>i-f@R5Va?S95|b$*a=j9K0+%D^Y?1fI}&BX7!xi=AuN zAXCFff1RZoMd@IKLoh!VT}v*~cl^vHZs-2IS@ONte}MJ{|12m7h9_A zU@U(T!P8g5i-*4{Yi-|^3$wV#NE z;NiyLrL*GwgHb~|(9oAZA*q-Idp*0UJtt*;_qCmYAK<9Qc8e(h?lq##O}O?SaZrV_ z#Cp#0NyKX_dP0M&5^i-8LAOm6aJWG@ADN8$w{*r)+9d6_e|7?!Z}eL~liQT^lgQTy zU}9ySGyfsrQl}KQc4w_qL*ZsBij0>6 zAsXsle)Gm-*+J$Hif5#K$`;Z{#K(Hj$qKBA-!1jZ$Z3#m2@ zs1&^?;A%lpmq~XD)b2suMQ&M??1BqD5Ucq>jKWEo`Ka4`GmNZXOBVdLB;3y|@Eu=c zW3}$Dm5?ATN~B_KsqJsZV^n_A9s?@h(B#-~2DPYrQ^5CbB>|{cCY+SM=;y=|Y!&TH zP>y_wL{a}h>EkE5g{m%st8RHcQPL&ylrj}XBu|ggz3m?H zahkwlVq1A9@`+zAI}S+EJlDeHQP>Qon>1~0krz#j3Lmm7o4Phg#256jCvtDK--R?j*mh3#MFb7Vh$aYHPzp;UbZNW1TU4k{J(e;qwo(QovE*Rq4Zj3I_Z zr5YH*)9u|P-0J$kelIoKW9~J_r&yyd*ODG`;TNC@_+Lqji|G##j9}kxg>5Z#^3c+2 zn#5(YBKb{Z2}(G!cPzMkS>I5a5+ZXF5!eY7=VXBAr?RN5(n+GM0)EAU71 zo=@Fyk0$J`U)^&=v9MmrGgb7r7KSFw<qVHnL2v8IKLP@ddie9@kB$R4Ka7)gxs^}*RZ0EsLj-~e_jX~Ny5rjX%d&-# z)vtt6*9M>kG$xm9GA3zC3;UTRJIK@1DgO1i^d;DX0b(uQOEkZE^113nmzxPNsU&zis z$!KHu^3+Q&24a1!DZy%OLpD#J=fam~^?|20WcNhM{&k{+Y-22eZcB}Y%Aup9YVkYb zBBVs6jL`C()yxj~WugLdiya)@YO*WcpRs{o++(&Fjh8)fU-qjf~JhBA75)>UAP#&YVA z`C62tErtwf-EwMzc(Qj((^%+wRXr_K{YhGdp)ayHo-f!1?e6#y=6`aTS`L5jx#jS{ zC(w*$^yZZQKJ<*r8;O{37a12jf$!Jcv3j0Gr!uy;2AnvYj0;g zD-JE@WoZI;KAS7SMzq+6MyfnEmY)Xf^pPUR$X6l#uq{fA=u%#tHq%)N--wZQ_yV!) zz=W{b`tVxHC5BA;Z@(b6ioI3rrlH|7ej(Awz=QTvNdXyh4o0p<^f&+h|&rK6-Qy*?x znr>1<+O3i`QB&yD7o3UA`JLymO|`}5_)-HVfX%G48)@LUm@W`6qBeyCb&V&Dlq}SA zYpiC@FU1y*^FXRsN)vqMpT}l<=Y9{XwL-fx7V>zvV2f+P#8`rPHJ6(9Zp|m-guI|q z?=g&N5HRfD2;q@+cjI1<{rjJC&iX5=FKXO0(%qdyegFZH5*WG_q#IN~VgyGiX({RM zA*F_tly0QETT}+=kQDeH-|u?=iuc!9>(09OoO|~_S? z6N9so`MwgU>0$Q5HyerlT{a8y!raJa(ursnq|XUqS7gfO&rb$CXxtXe@EsO-c_8`$ zeZZ)D?_t9PO~_5T0l$>QH2Nn}9tQLgsJtHgZOFC{Cf&|LqQC+dMf{u1>f-G^I?-2z z*H_y)qlRbt)AlysBT1X4RDQ|nJP)#;DEM~Y-&ya=@J%BXEzy?W1?&2?l~vQhEhadT z2K!$8XQ!caHfSooQ3pr=K{e#Q{K_fdN%<^EIQ>KVjKt#UcTvKIp>A)3dzvPz59bqG zwi>BXVG_=%!xhLIN$W$$2<~nL>IT9&rlEP<-XKo67_|@aa+fr7|S&v_jfiRLV8`IlfnY zSyppdtBQD1l`+{5lgIFq>W8nzVX(7r`e-gzt)U0!*@WmlEV*JiP6 z?ZiRjUvFjICO8h^qBT{86A83R=ZO8DVB@TSkx%8bUGyT>s*y z4_bCr)>G1sWAxDl{B`-9f|-NafR6U8As?;BP?kL9C%R=(iF)5*$NgQb*XggH;_sfV zwt9)`ARY%QZ$UZ>>ISc})6@fX^CaJslc~mVjEs{UknAQrVa z7aA4tys4KZ6qyhsF3)ZB#x*)hmG~R-dFU4f3!V(Ik7E9o=55}|9LR~X{hgika(uj& zbA^j>E{Cz~u)ECyLhR{*JK@FIg~gsqJD)R2FRVYf=c?;AijMtShTN+a(&1LMWQTsM zL<73z&OJ@d3Tp=tXFRWnZ+d+qenXU^xeRNe(A^7(0|ApzXQQg%*1l2PlH+^Y-Hatt z>V=<+i(Qo-x+O~u{lE1gZ?<of+IBy94#FYbQT9uzHWm26;|hUt#Hxh!ni)m-qsYj*^k{(*eO54DmwL6MFHWI*%u-B=L>nOxjJ!nqk)_$1y;>5fb zZ|sgl5*lV$teqv?L?!12&3p0JMYww68FP9RhhG};Jc*YHs{%4mi!WFyBQ4A?Jj3Ri zA~P2!lb?ogRjTJHE9^@{@>)AVUtqAB=PAxZz3AjY?2H`cAns!`=-tkb$>K>zHXF{k z!IGA%Q0hpuY-$pQdBxQf!BI8AspX5@m3kU)Q(hD5_xM~F)Xi3(S*{z8D>&aN)!Zh@ zc)wM*i(Zy|x;yj}-&I_slCS7KW_IVO@Pni0y92b4Hd)v$i>!C=pu@Yp1u{wZA8H8I z;;@4Q-;!}e@ZWYhd}wzx?~=!qK{>v41fvepN^gfkT6Pj!4^#M9;M-zIo<@gFV5T>% z4mzG6HED-Hzkev&>Y0;5KsMIU2XbMA0HJF@Z#;I=%pdZxwphMb;liCqh8X+9=JILS zejQ>Mkhu!83;%!e1-?YFe!#JfI9A;P%rHnEa&!w62bTvehjFsfFhYWlSh!pBF3S^* zMnaVwI|=+;{8DM^W;{YY>gS99)uon*x;;eA~Y*j%y!3VmU9=;Q^_E>Q{U!EQ6j1C8*c$ zIdS_$y5WvDo6wjxl|rU=r9=wlQ??*2U}f+;?d|JxV-Lp0r`%{CkYFSAiJpP&NYvmt zl5c7H-(5ilEExdyup!S)&G=J<%2q4=YNIPSJSOJX2hNWPIXNs4l-iWlIfgvRg9jVN z9&)#5i5s-|1Oz=r(G16LZ_atXZ#*Coelz9Z<~@!GpBlGfE*X>zR;LVA8eyQNogqwf zU|P5!uVy1$V8zMUMnn);hZYm!dWWVSZ4sE&J1@HL^hYzCGL#mAghFrWba9RIj$RjW z)0<5Unt5LUIJ0!i77G+`A>4`zQ^>h4UE+4)wI2yi12xFk!610Iw&eFBFCce$+)tO? z5plwoR4&pVO-?$TJDbR@|9yA*AVMfU0|jgek7o_}63t!PrK{&?Ra@bCN))srD}W;8 zN()6W_KQg|p#{7ZjT|^qvmvCkD2VmEf-Dq8_3IMDpq`GRYV^_#z=JVYdn!{>ajRCAl{ zA37w;F|iZ%#Pi6yIWQf!QwBp7CvZMv{)3}@ar2)_{o=7}P(ZN((v*A=zze*jx63+? z()lD1%^(p&@ZbRt!A695z~ARy9ZI>{>-j%*$bXr5|@f5w=owQ46Y?RpY_!Z^Z#%)=3Oq>H~CU~+0 zz-Cqf0LRNXMd#H2r+DOss}eQCd^MEH@A3KBRzGu{xIZi1LX(5w560mC6>n#|F z0=W4-Bin9iY$RIbc)a?}@R3ap zRUD^!(`LO|*#tElp+hUaiBh`P{FI+8z=NLW?H%FaY23STu`C!X8vU=r~*td&m_Dv`_f0UdD3)1*$RZ z9$no$0!M=Ei&@eh#9!Tiejn^+ku zHPumzeFQY5)Kt;lL?a;#QHNaqUcc{wIi^P~MdM1FT};;V2 zxE@|n?bSY9up?(<6QGSBgX%$f^R_`HntpI_PCZ(=`8DvcY%Zvm?v(w1{)r9`k9Rqv zmp&p<2FO}OE5C{eY4i1(aDQc^L0ldu9nKE3GOn~Rz^rhKm$He+{<|#Ir=b++6(Upa zWH04qZzDx&@jMH_9h$DrJF>QFfAge!y^sm3_T|l33FncZZ516?1<#LEQlEXGL1OgT zzd7unc~SLD%+eNvTwR4HTk;*beJqm>1$l^OvT`c3EcPi`W{mM0u|NXtG2kru!F|Q8 zopGddBIdTg@>QRPkx?rFN~tfUZ(f>ic&&*mHT$y|uv=BKet$h5J>hz;r^gj@39@{m z*gpGnqYSjNmozIKK9E_3jA?$75A&4+65>uLzlPP$O?#H=kB$y1#1v{hN4;Y#hf|+O z__*xkW2ed4nP$9no%%xc$d&57cwQ z1>%Wlu!F1b6+;F73r0B@C`zW3v2!4{(FHOiC-jXMI5sDVt=z+COaZF#?8<+^w`uZ; zP`6)L`G0X~5%|}tD!;D3S7vLiUWzzP_v|=zeTh&*jOOQgPvLtDH3f&|Cbj17+eH)O zK)nU@IYe;NQNT-wpx@rCfA!qalcRr?J~@S$Ek7vwb9{7m#+iFR^I4N70-8q}XsLtc zt%7M$VQ2^ZN;UjOm06{e4r*UT(y71p4e!~Hq$L}|Uq33-Jq5iag5c$~-UQj;|AD_Z z=bZ*(S?mE6H!uu_%f-4<;fQY2>8kh({Y2@nACE;FL6JWgeEJ2Px&p_{vhO}qAA66U z?25a8ECcxY8Bnwg64-bAe0l?W`${=iKhj%-uoebZ{`IHk@Do-FrdJ=i(v@<}aL$0{ zC2qUG4dNfmAEZA7syIk$0b|zYPJFG4@1GFopAei0$HHP_bp!#( z`+b#_>neN4T!^~$==sSBJyZ`0C2aimO)W-5`2`^aqBr(XmyC=oHy{awMV(}9kJA(7 zI)^nzKI!BQA6JWx&=Rqv$I0*Cmzei4EUvD4tt_YN}zcUuEPse{&6@0-O*!tN~^mf_z?TYiM6^zSQn}^R(PpWDQ*f z{Yu>^>TFhT+H!Zbl&M=$QJ<;sfEn@ly9f1GEbb`WyF1i!0RuutLsl)qtYI%r#GlRY zGQP0waypgP)3*E4ZQ;w1gm$ik%dzYu=K|~$xo2&$Z;1wGf}hQwFBc%{|!oZPra&?D|&LHVY`S z{np_6jFY#;TU1zx6+-*^V6Cm?Q~1#HvQ6}_Klz}zghHIyY2r?EDM3LPHnuq)+SF16 zw^!0qL!1oJ{kWjv!ZRmaqh2hTyXb=vxm1jQVVCu{=*URT!Qo+_hb8?``@9P(DdwN^ zk@yY)DkhMJqN3Y$(JHc2xSO{=g9%){hp3(W z?QQFMRhBYUj~^JV9)}2Vaq;?Fp!1{kyb&c!pW!xD{p+Tj7d(vw4dGXyK8`@d#aYWc zLa3X)r({WzCj_Y@#rgS>F2LO6Wnp0<9r5k1q>SSeL;iSE*@W8)OcyxF>{V1$&cIUh z2Sk}IY47IUwaNHU=fkzO?2wQUf01-8wMAz+pKVgSxyh<`26@4$G2unnI5>VX_G4KR zRTeG%P>*MMsVON-)Whcg2@1YGL@g91Gda2|9S%WpA&mE&9v&CtVDY2uKSWh}sj6!1 z&CSi_kB#X#KX6FkV69kaZl3VjqWr$Q>m$O?&o9HqrVyrdH%>#dfh|hF`{W6NT1bU! z<4$`JG#ebp#Jp^Zj*gxi85ya}&(F85UHseihRW-ZNt>UB%l_u7Ha9odm*J6fxN$SQ zbn{C5Pyp_N&omqX8k?66SGrK%IyySbz#bwRUCrJ} z?cEn&fwWGvr#}^VG)afl^S(zfczb?u*i8|He@|2tn&}(&m&`o>$&ym1*vIIsCJ9F^ zw!eP;n#X6p@?2L_<3vhY`fccPXC^Hv^>yv@&MgBN?65-g)re;mY*R%hBR`AuqaBQ9 z#Y5s=o4WS)+B=kt162|3m{8x&Ea#dhR0ex$hP-8Z8Dyz@*Cofk?zY9L3j(`4K0bc_ z#)h>z1Ls8VD+JK+s59(oDO!k^YRjcL4d@7uD07Gu8(WCW{8u1D?YD%a@n|`xt{0!{ zc#1+44ConO?k2qF`TQ}G;5`1qg@}mAB{?~n=kx@ROuY3dGBgmKz(OY64lcDC+S%DD zRxnwj7!RE>(A3ndt?=(B7OV-SdOwIH-?3g(I5{R0>hfu6NIAJUEV%c(ONpN9u`n}Za2Z`v>9G7VW5}piW;0L!`%{H6n}t7NAK~_BrmDKSdj6{QTU8B> zPZcN|XXo+~q6TkUdzJ>wt()EhR8t~H1Dh1C@Vi0XkG`9u$L0@V`k_Fd3Me0r& zc^pgx#>Vd{x3Y0)DJo*JeZ>O0+hyRHv$L>ZS{u-uF@K}5<3vDUk->wI^{1etOHadOd=Zm2v4JLK7ujv8LC?hj7q5-&g=H1=h&jjGxvCUf+9bdjo z84j725j{tFeu#~V+5;T>_O_s)pg(K=czwHqa!jX>iwR1oD75^`q^ql|6CqAd5ZKzG zjvfn~6AyWuJzu8n2fNKum`S;1ucy@-IA6L56Th9ejlHNgfTGlB1C`hzx(H`)z-X`a zk&r(djqH(?5i~|&#yW)qBg9EbNeRjH^tA6&eumS1Uj_mTCg^~tf`S72&+YB`nYp6`4QYw=MtlY1$eZ-h$%d$*rx`qiroU6JeGpPl&Frt^_F4 zx7U@HI*O9z9ktv#l6q|ia95b1VnSRVlD+IW9g`M4Jw26;CnSr_OH(?vOmiK~GG&GqqGAe)nbOqlt?Re1``5NfI)RDMq ztDg8Nns|*>w8?t;&nA0M$-uDN;dkq8CKBAP?~*G0!A#A}F38E=*Vd89a8|kuLOm@1x`oB|K3po*FIIs-AYn?Xs=Exoe>)8Kuj`Md z-ha6Pb|(x+)dR~6dJ*jz;^b!_bh>;!__e&)7W%Sf!7C*zOW?|vM-=!VFigRAzl3Nm z0?btwwV>&XS_-GMmi`zqf#MKdJ*U-Y!ss5qMn<%DR-Mcm^$ZNC0OFtZlx-Wl*ZZKS zw6dbAYCuo&`TM5*)@q`0gb8Xamfvu;wPJebm8z1`$Qg^=U6|Eft=@gpReb$+JhKRC z`Rbyp_njGbBN=mdQX~7ffq7llu9Wjn-(K%G)F(_VF7hTNC*uJKBYcmVcwV zyZxLS&rKb7xbTUI^9B<|oEADv1gWomOwwIE%+%DvONb7dlc}g0mYl$KoTz4tgXO1` z=*cd}rx5+3@TE@Xos=3gVLraH&&|!(*P~{Q|CtD+XevD)jYY*|SA!{Ql04ykZlUy9 zQI5sKBRgy$@pehq77hJkuE$B@9o{H6MY>OK>_G67`V+*0Y};eF72#QfKWE(99F1R} zGL}EZnXH`8$xl4PY=bI)@4%f$sSZuZL`HVVx&UC+snfH6tGoQW?rqO`_E~h-Hk@!5LW0-ylZf!pcpmC<5K^}&R-g{_PAmnwEMKb zV9{fNLC9qyu>QjPjXDpBPbMj`ho&`44|+Uac9e!?ZTSr7uPZO6l@{=Zqs+MS zB)J~w5wEe)JF$*qVobuhNV+YpnwkiIEAV+*%kHjI?Hw;xURS9Yog>S2lw#AQGGo7p zA@)bx?^AR!OD#Tx#RuyUmEnM*&W^(mJpM@`#V~Gi!!6H7q6FY%nnAn#wHE`VF zH3V9}%&=wR-HMs^d6vMGHTzI5upEL>a_h^LNAla+oFm=?_bZHC&2u_1xY{&X8yfId zp{o!_?MJ@3|6{}Kpj(q~k9f;BjuVu5-7w6@kNNU-84GhAROnyYIceg*lAumO%H_W2 z?08;IR5n3%njvkAp(RfZ#$UkPc?7FY9o*+=Q_cMU>EAZ)WA^o_M3`)ufmI((U0Fw| J5^5dv{{VqLJ}LkJ literal 0 HcmV?d00001 diff --git a/assets/images/stocks/ttwo.png b/assets/images/stocks/ttwo.png new file mode 100644 index 0000000000000000000000000000000000000000..9683ab1bb488ab0b6ecb3ff98645a216dbe7dee2 GIT binary patch literal 16107 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 X%%;nO4*y%$4k9HcFIppP81(-E)Fuuj literal 0 HcmV?d00001 diff --git a/assets/images/stocks/ups.png b/assets/images/stocks/ups.png new file mode 100644 index 0000000000000000000000000000000000000000..188668f223af4687720219998289404ab0d2dd24 GIT binary patch literal 35839 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 literal 0 HcmV?d00001 diff --git a/assets/images/stocks/wday.png b/assets/images/stocks/wday.png new file mode 100644 index 0000000000000000000000000000000000000000..64eaf939c7dffd56117b28f4bbc152b5bbeca5ef GIT binary patch literal 16301 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 literal 0 HcmV?d00001 diff --git a/assets/images/usdg_icon.png b/assets/images/usdg_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6d8b8d60a45598f463f36dd661d22d30e23e78 GIT binary patch literal 2979 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[Color(0xFF6259FF), Color(0xFF3B20E6)], @@ -323,6 +325,15 @@ class CardDesign { backgroundType: CardDesignBackgroundTypes.svgFull, imagePath: "assets/new-ui/balance_card_backgrounds/bnb.svg"); + static const robinhoodSpecial = CardDesign( + gradient: const LinearGradient( + colors: [Color(0xFF5AA438), Color(0xFF2E6B1E)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter), + colors: CardColorCombination.light, + backgroundType: CardDesignBackgroundTypes.svgFull, + imagePath: "assets/new-ui/balance_card_backgrounds/robinhood.svg"); + CardDesign withGradient(Gradient gradient) => CardDesign( gradient: gradient, colors: preferredColorCombinations[gradient] ?? colors, @@ -357,6 +368,7 @@ class CardDesign { CryptoCurrency.arbEth: _CurrencyIconNames(ticker: 'arb', longName: 'arbitrum'), CryptoCurrency.baseEth: _CurrencyIconNames(ticker: 'base', longName: 'base', chainFile: 'base_icon'), + CryptoCurrency.robEth: _CurrencyIconNames(ticker: "rob", longName: "robinhood"), CryptoCurrency.bch: _CurrencyIconNames(ticker: 'bch', longName: 'bitcoin_cash', chainFile: 'bitcoin-cash'), CryptoCurrency.btc: _CurrencyIconNames(ticker: 'btc', longName: 'bitcoin', outlineFile: 'BTC'), @@ -409,6 +421,7 @@ class CardDesign { arbitrum, zec, bnb, + robinhood, ethSpecial, btcSpecial, xmrSpecial, @@ -423,7 +436,8 @@ class CardDesign { zanoSpecial, arbitrumSpecial, zecSpecial, - bnbSpecial + bnbSpecial, + robinhoodSpecial, ]; static CardDesign forCurrencySpecial(CryptoCurrency currency) { @@ -453,6 +467,7 @@ class CardDesign { CryptoCurrency.zec: zec, CryptoCurrency.dcr: dcr, CryptoCurrency.bnb: bnb, + CryptoCurrency.robEth: robinhood, }; static const Map specialDesignsForCurrencies = { @@ -474,6 +489,7 @@ class CardDesign { CryptoCurrency.arbEth: arbitrumSpecial, CryptoCurrency.zec: zecSpecial, CryptoCurrency.bnb: bnbSpecial, + CryptoCurrency.robEth: robinhoodSpecial, }; static Map preferredColorCombinations = { diff --git a/cw_core/lib/crypto_currency.dart b/cw_core/lib/crypto_currency.dart index 09ead9151..678228916 100644 --- a/cw_core/lib/crypto_currency.dart +++ b/cw_core/lib/crypto_currency.dart @@ -143,6 +143,7 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen CryptoCurrency.arbEth, CryptoCurrency.usdcArb, CryptoCurrency.usdtArb, + CryptoCurrency.robEth, ]; static const havenCurrencies = [ @@ -974,6 +975,16 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen name: 'ltcmweb', iconPath: 'assets/new-ui/crypto_full_icons/litecoin.svg', decimals: 8); + static const robEth = CryptoCurrency( + title: "ETH", + tag: "ROB", + fullName: "Ethereum", + raw: 111, + name: "robeth", + iconPath: "assets/new-ui/crypto_full_icons/ethereum.svg", + decimals: 18, + flatIconPath: "assets/new-ui/balance_card_icons/robinhood.svg", + chainIconPath: "assets/new-ui/chain_badges/robinhood.svg"); static final Map _rawCurrencyMap = [ ...all, @@ -999,7 +1010,14 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen ...zcashCurrencies ].fold>({}, (acc, item) { if (item.fullName != null) { - acc.addAll({item.fullName!.toLowerCase(): item}); + final fullName = item.fullName!.toLowerCase(); + final existing = acc[fullName]; + + // Mainnet ETH and the L2 ETHs share the "Ethereum" full name, + // so we make the untagged coin keeps the name + if (existing == null || existing.tag != null) { + acc[fullName] = item; + } } return acc; }); @@ -1025,6 +1043,8 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen 'base': baseEth, 'arbitrum': arbEth, 'bsc': bnb, + "rob": robEth, + "robinhood": robEth, }; static CryptoCurrency deserialize({required int raw}) { diff --git a/cw_core/lib/currency_for_wallet_type.dart b/cw_core/lib/currency_for_wallet_type.dart index c31aa5b26..c4f1f289d 100644 --- a/cw_core/lib/currency_for_wallet_type.dart +++ b/cw_core/lib/currency_for_wallet_type.dart @@ -26,6 +26,8 @@ CryptoCurrency walletTypeToCryptoCurrency(WalletType type, {bool isTestnet = fal return CryptoCurrency.arbEth; case WalletType.bsc: return CryptoCurrency.bnb; + case WalletType.robinhood: + return CryptoCurrency.robEth; case WalletType.bitcoinCash: return CryptoCurrency.bch; case WalletType.nano: @@ -66,6 +68,8 @@ CryptoCurrency getCryptoCurrencyByChainId(int chainId) { return CryptoCurrency.arbEth; case 56: return CryptoCurrency.bnb; + case 4663: + return CryptoCurrency.robEth; default: return CryptoCurrency.eth; } @@ -85,6 +89,8 @@ int? getChainIdByCryptoCurrency(CryptoCurrency currency) { return 42161; case CryptoCurrency.bnb: return 56; + case CryptoCurrency.robEth: + return 4663; default: return null; } @@ -109,6 +115,10 @@ String getCryptoCurrencyIconForWalletListItem(WalletType type, return "assets/new-ui/crypto_full_icons/base.svg"; } + if (type == WalletType.robinhood) { + return "assets/new-ui/crypto_full_icons/robinhood.svg"; + } + return walletTypeToCryptoCurrency(type, isTestnet: isTestnet, chainId: chainId).iconPath ?? ""; } @@ -133,6 +143,8 @@ String? symbolIconPathForWalletType(WalletType type) { return "$prefix/bch-symbol.svg"; case WalletType.polygon: return "$prefix/pol-symbol.svg"; + case WalletType.robinhood: + return "$prefix/rob-symbol.svg"; case WalletType.solana: return "$prefix/sol-symbol.svg"; case WalletType.tron: diff --git a/cw_core/lib/erc20_token.dart b/cw_core/lib/erc20_token.dart index 69c278e7b..0132183b1 100644 --- a/cw_core/lib/erc20_token.dart +++ b/cw_core/lib/erc20_token.dart @@ -15,6 +15,7 @@ class Erc20Token extends CryptoCurrency { this.id = 0, this.walletName, this.chainId, + Set groups = const {}, }) : _enabled = enabled, super( name: symbol.toLowerCase(), @@ -24,6 +25,7 @@ class Erc20Token extends CryptoCurrency { iconPath: iconPath, decimals: decimal, isPotentialScam: isPotentialScam, + groups: groups, ); Erc20Token.copyWith( @@ -51,6 +53,7 @@ class Erc20Token extends CryptoCurrency { iconPath: icon, decimals: other.decimal, isPotentialScam: other.isPotentialScam, + groups: other.groups, ); Erc20Token.fromMap(Map map) diff --git a/cw_core/lib/node.dart b/cw_core/lib/node.dart index 78faba142..0686e5d4e 100644 --- a/cw_core/lib/node.dart +++ b/cw_core/lib/node.dart @@ -292,6 +292,7 @@ class Node { case WalletType.polygon: case WalletType.base: case WalletType.bsc: + case WalletType.robinhood: case WalletType.arbitrum: case WalletType.solana: case WalletType.tron: @@ -353,6 +354,7 @@ class Node { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.solana: case WalletType.tron: case WalletType.dogecoin: diff --git a/cw_core/lib/node_legacy.dart b/cw_core/lib/node_legacy.dart index 848b771f5..f81eb0068 100644 --- a/cw_core/lib/node_legacy.dart +++ b/cw_core/lib/node_legacy.dart @@ -183,6 +183,7 @@ class Node extends HiveObject with Keyable { case WalletType.polygon: case WalletType.base: case WalletType.bsc: + case WalletType.robinhood: case WalletType.arbitrum: case WalletType.solana: case WalletType.tron: diff --git a/cw_core/lib/node_list.dart b/cw_core/lib/node_list.dart index 899d1ed98..e9e154d31 100644 --- a/cw_core/lib/node_list.dart +++ b/cw_core/lib/node_list.dart @@ -61,6 +61,9 @@ Future> loadDefaultNodes(WalletType type) async { case WalletType.bsc: path = 'assets/bsc_node_list.yml'; break; + case WalletType.robinhood: + path = "assets/robinhood_node_list.yml"; + break; case WalletType.banano: case WalletType.none: path = ''; @@ -126,6 +129,7 @@ Future> loadAllDefaultNodes() async { final arbitrumNodes = await loadDefaultNodes(WalletType.arbitrum); final zcashNodes = await loadDefaultNodes(WalletType.zcash); final bscNodes = await loadDefaultNodes(WalletType.bsc); + final robinhoodNodes = await loadDefaultNodes(WalletType.robinhood); return moneroNodes + bitcoinElectrumServerList + @@ -143,7 +147,8 @@ Future> loadAllDefaultNodes() async { baseNodes + arbitrumNodes + zcashNodes + - bscNodes; + bscNodes + + robinhoodNodes; } Future resetToDefault() async { diff --git a/cw_core/lib/wallet_type.dart b/cw_core/lib/wallet_type.dart index 5ccfbbc23..906a3e73f 100644 --- a/cw_core/lib/wallet_type.dart +++ b/cw_core/lib/wallet_type.dart @@ -24,6 +24,7 @@ const walletTypes = [ WalletType.arbitrum, WalletType.zcash, WalletType.bsc, + WalletType.robinhood, ]; const electrumWalletTypes = [ @@ -38,7 +39,8 @@ const evmWalletTypes = [ WalletType.polygon, WalletType.base, WalletType.arbitrum, - WalletType.bsc + WalletType.bsc, + WalletType.robinhood ]; // @HiveType(typeId: WALLET_TYPE_TYPE_ID) @@ -102,6 +104,9 @@ enum WalletType { // @HiveField(19) bsc, + + // @HiveField(20) + robinhood, } int serializeToInt(WalletType type) { @@ -144,6 +149,8 @@ int serializeToInt(WalletType type) { return 17; case WalletType.bsc: return 18; + case WalletType.robinhood: + return 19; case WalletType.none: return -1; } @@ -189,6 +196,8 @@ WalletType deserializeFromInt(int raw) { return WalletType.zcash; case 18: return WalletType.bsc; + case 19: + return WalletType.robinhood; default: throw Exception('Unexpected token: $raw for WalletType deserializeFromInt'); } @@ -234,6 +243,8 @@ String walletTypeToString(WalletType type) { return 'Zcash'; case WalletType.bsc: return 'BNB Smart Chain'; + case WalletType.robinhood: + return "Robinhood Chain"; case WalletType.none: return ''; } @@ -259,6 +270,7 @@ String walletTypeToDisplayName(WalletType type) => switch (type) { WalletType.arbitrum => 'Arbitrum', WalletType.zcash => 'Zcash', WalletType.bsc => 'BNB Smart Chain', + WalletType.robinhood => "Robinhood Chain", WalletType.none => '' }; @@ -282,6 +294,7 @@ String walletTypeToDisplayTicker(WalletType type) => switch (type) { WalletType.arbitrum => 'ARB', WalletType.zcash => 'ZEC', WalletType.bsc => 'BNB', + WalletType.robinhood => "", WalletType.none => '' }; @@ -327,6 +340,8 @@ WalletType? _cryptoCurrencyToWalletType(CryptoCurrency type) { return WalletType.dogecoin; case CryptoCurrency.zec: return WalletType.zcash; + case CryptoCurrency.robEth: + return WalletType.robinhood; default: return null; } diff --git a/cw_core/lib/wallet_type.part.dart b/cw_core/lib/wallet_type.part.dart index 2451e1cfa..eb89fa1ed 100644 --- a/cw_core/lib/wallet_type.part.dart +++ b/cw_core/lib/wallet_type.part.dart @@ -53,6 +53,8 @@ class WalletTypeAdapter extends TypeAdapter { return WalletType.zcash; case 19: return WalletType.bsc; + case 20: + return WalletType.robinhood; default: return WalletType.monero; } @@ -121,6 +123,9 @@ class WalletTypeAdapter extends TypeAdapter { case WalletType.bsc: writer.writeByte(19); break; + case WalletType.robinhood: + writer.writeByte(20); + break; } } diff --git a/cw_evm/lib/clients/evm_chain_client.dart b/cw_evm/lib/clients/evm_chain_client.dart index de3f9726e..1d5651294 100644 --- a/cw_evm/lib/clients/evm_chain_client.dart +++ b/cw_evm/lib/clients/evm_chain_client.dart @@ -57,7 +57,7 @@ class EVMChainClient { } if (response.statusCode >= 200 && response.statusCode < 300 && jsonResponse['status'] != 0) { - final res = (jsonResponse['result'] as List); + final res = jsonResponse["result"] as List; res.removeWhere((e) => e['value'] == '0'); // Filter out spam native transactions below 0.00001 ETH (10000000000000 wei) @@ -175,17 +175,31 @@ class EVMChainClient { try { Uri? rpcUri; bool isModifiedNodeUri = false; + final nodeHost = Uri.parse("https://${node.uriRaw}").host; + final pathSegments = + (node.path ?? "").split("/").where((segment) => segment.isNotEmpty).toList(); - if (node.uriRaw.contains('nownodes.io')) { + if (nodeHost.endsWith(".nownodes.io") && pathSegments.isEmpty) { isModifiedNodeUri = true; String nowNodeApiKey = secrets.nowNodesApiKey; if (nowNodeApiKey.isEmpty) { - printV('NowNodes API key is empty, cannot connect to ${node.uriRaw}'); + printV("NowNodes API key is empty, cannot connect to ${node.uriRaw}"); return false; } rpcUri = Uri.https(node.uriRaw, '/$nowNodeApiKey'); + } else if (nodeHost.endsWith(".g.alchemy.com") && + (pathSegments.isEmpty || (pathSegments.length == 1 && pathSegments.first == "v2"))) { + isModifiedNodeUri = true; + String alchemyApiKey = secrets.alchemyApiKey; + + if (alchemyApiKey.isEmpty) { + printV("Alchemy API key is empty, cannot connect to ${node.uriRaw}"); + return false; + } + + rpcUri = Uri.https(node.uriRaw, "/v2/$alchemyApiKey"); } _client = Web3Client(isModifiedNodeUri ? rpcUri!.toString() : node.uri.toString(), client); @@ -318,6 +332,7 @@ class EVMChainClient { currency == CryptoCurrency.baseEth || currency == CryptoCurrency.arbEth || currency == CryptoCurrency.bnb || + currency == CryptoCurrency.robEth || contractAddress != null); final isNativeToken = [ @@ -325,7 +340,8 @@ class EVMChainClient { CryptoCurrency.maticpoly, CryptoCurrency.baseEth, CryptoCurrency.arbEth, - CryptoCurrency.bnb + CryptoCurrency.bnb, + CryptoCurrency.robEth ].contains(currency); // Get nonce with "pending" block tag to include pending transactions @@ -540,18 +556,20 @@ class EVMChainClient { } } - Future getErc20Token(String contractAddress, String chainName) async { + Future getErc20Token(String contractAddress, String? chainName) async { try { - final token = await getErc20TokenFromMoralis(contractAddress, chainName); + if (chainName != null) { + final token = await getErc20TokenFromMoralis(contractAddress, chainName); - if (token == null || token.name.isEmpty || token.symbol.isEmpty) { - return await getErcTokenInfoFromNode(contractAddress, chainName); + if (token != null && token.name.isNotEmpty && token.symbol.isNotEmpty) { + return token; + } } - return token; + return await getErcTokenInfoFromNode(contractAddress); } catch (e) { try { - return await getErcTokenInfoFromNode(contractAddress, chainName); + return await getErcTokenInfoFromNode(contractAddress); } catch (e) { return null; } @@ -598,7 +616,7 @@ class EVMChainClient { ); } - Future getErcTokenInfoFromNode(String contractAddress, String chainName) async { + Future getErcTokenInfoFromNode(String contractAddress) async { final erc20 = ERC20(address: EthereumAddress.fromHex(contractAddress), client: _client!); final name = await erc20.name(); final symbol = await erc20.symbol(); diff --git a/cw_evm/lib/clients/robinhood_client.dart b/cw_evm/lib/clients/robinhood_client.dart new file mode 100644 index 000000000..fe4215198 --- /dev/null +++ b/cw_evm/lib/clients/robinhood_client.dart @@ -0,0 +1,42 @@ +import "package:cw_evm/clients/evm_chain_client.dart"; +import "package:flutter/foundation.dart"; +import "package:web3dart/web3dart.dart"; + +class RobinhoodClient extends EVMChainClient { + RobinhoodClient() : super(chainId: 4663); + + @override + Transaction createTransaction({ + required EthereumAddress from, + required EthereumAddress to, + required EtherAmount amount, + EtherAmount? maxPriorityFeePerGas, + Uint8List? data, + int? maxGas, + EtherAmount? gasPrice, + EtherAmount? maxFeePerGas, + int? nonce, + }) { + EtherAmount? finalGasPrice = gasPrice; + + if (gasPrice == null && maxFeePerGas != null) { + finalGasPrice = maxFeePerGas; + } + + return Transaction( + from: from, + to: to, + value: amount, + data: data, + maxGas: maxGas, + gasPrice: finalGasPrice, + nonce: nonce, + ); + } + + @override + Uint8List prepareSignedTransactionForSending(Uint8List signedTransaction) => signedTransaction; + + @override + int get chainId => 4663; +} diff --git a/cw_evm/lib/evm_chain_client_factory.dart b/cw_evm/lib/evm_chain_client_factory.dart index bd55af384..d20a84adc 100644 --- a/cw_evm/lib/evm_chain_client_factory.dart +++ b/cw_evm/lib/evm_chain_client_factory.dart @@ -1,6 +1,7 @@ import 'package:cw_evm/clients/arbitrum_client.dart'; import 'package:cw_evm/clients/base_client.dart'; import 'package:cw_evm/clients/bsc_client.dart'; +import "package:cw_evm/clients/robinhood_client.dart"; import 'package:cw_evm/clients/ethereum_client.dart'; import 'package:cw_evm/clients/polygon_client.dart'; import 'package:cw_evm/clients/evm_chain_client.dart'; @@ -32,6 +33,8 @@ class EVMChainClientFactory { return ArbitrumClient(); case 56: return BSCClient(); + case 4663: + return RobinhoodClient(); default: return EVMChainClient(chainId: chainId); } diff --git a/cw_evm/lib/evm_chain_default_tokens.dart b/cw_evm/lib/evm_chain_default_tokens.dart index ba5ecb353..abad65627 100644 --- a/cw_evm/lib/evm_chain_default_tokens.dart +++ b/cw_evm/lib/evm_chain_default_tokens.dart @@ -1,28 +1,56 @@ -import 'package:cw_core/erc20_token.dart'; -import 'package:cw_evm/tokens/arbitrum_tokens.dart'; -import 'package:cw_evm/tokens/base_tokens.dart'; -import 'package:cw_evm/tokens/bsc_tokens.dart'; -import 'package:cw_evm/tokens/ethereum_tokens.dart'; -import 'package:cw_evm/tokens/polygon_tokens.dart'; +import "package:cw_core/erc20_token.dart"; +import "package:cw_evm/tokens/arbitrum_tokens.dart"; +import "package:cw_evm/tokens/base_tokens.dart"; +import "package:cw_evm/tokens/bsc_tokens.dart"; +import "package:cw_evm/tokens/ethereum_tokens.dart"; +import "package:cw_evm/tokens/polygon_tokens.dart"; +import "package:cw_evm/tokens/robinhood_tokens.dart"; /// Default ERC20 tokens for each EVM chain and utility methods for interacting with them class EVMChainDefaultTokens { - static List getDefaultTokensByChainId(int chainId) { - return switch (chainId) { - 1 => EthereumTokens.tokens, - 137 => PolygonTokens.tokens, - 8453 => BaseTokens.tokens, - 42161 => ArbitrumTokens.tokens, - 56 => BSCTokens.tokens, - _ => [], - }; + static List getDefaultTokensByChainId(int chainId) => switch (chainId) { + 1 => EthereumTokens.tokens, + 137 => PolygonTokens.tokens, + 8453 => BaseTokens.tokens, + 42161 => ArbitrumTokens.tokens, + 56 => BSCTokens.tokens, + 4663 => RobinhoodTokens.tokens, + _ => [], + }; + + static List getDefaultTokenAddresses(int chainId) => + getDefaultTokensByChainId(chainId).map((token) => token.contractAddress).toList(); + + static List getDefaultTokenSymbols(int chainId) => + getDefaultTokensByChainId(chainId).map((token) => token.symbol.toUpperCase()).toList(); + + static final Map> _iconPathsByAddress = {}; + + static String? getDefaultIconPathByAddress(int chainId, String contractAddress) { + final iconPaths = _iconPathsByAddress.putIfAbsent(chainId, () { + final paths = {}; + + for (final token in getDefaultTokensByChainId(chainId)) { + final iconPath = token.iconPath; + + if (iconPath != null && iconPath.isNotEmpty) { + paths[token.contractAddress.toLowerCase()] = iconPath; + } + } + + return paths; + }); + + return iconPaths[contractAddress.toLowerCase()]; } - static List getDefaultTokenAddresses(int chainId) { - return getDefaultTokensByChainId(chainId).map((token) => token.contractAddress).toList(); - } + static Set getDefaultGroupsByAddress(int chainId, String contractAddress) { + for (final token in getDefaultTokensByChainId(chainId)) { + if (token.contractAddress.toLowerCase() == contractAddress.toLowerCase()) { + return token.groups; + } + } - static List getDefaultTokenSymbols(int chainId) { - return getDefaultTokensByChainId(chainId).map((token) => token.symbol.toUpperCase()).toList(); + return const {}; } } diff --git a/cw_evm/lib/evm_chain_registry.dart b/cw_evm/lib/evm_chain_registry.dart index e3c660d24..0f6a431f3 100644 --- a/cw_evm/lib/evm_chain_registry.dart +++ b/cw_evm/lib/evm_chain_registry.dart @@ -190,6 +190,36 @@ class EvmChainRegistry { WalletType.bsc, 'BSC', ); + + // Robinhood Chain + _registerChain( + const ChainConfig( + chainId: 4663, + name: "Robinhood Chain", + shortCode: "robinhood", + caip2: "eip155:4663", + nativeCurrency: CryptoCurrency.robEth, + capabilities: ChainCapabilities( + supportsERC20: true, + supportsEIP1559: true, + supportsInternalTx: true, + supportsSubscriptions: false, + supportsENS: false, + ), + defaultRpcEndpoints: [ + "rpc.mainnet.chain.robinhood.com", + ], + explorerUrls: [ + "https://robinhoodchain.blockscout.com", + ], + feeModel: FeeModel( + type: FeeType.eip1559, + defaultGasLimit: 21000, + ), + ), + WalletType.robinhood, + "ROB", + ); } void _registerChain( diff --git a/cw_evm/lib/evm_chain_wallet.dart b/cw_evm/lib/evm_chain_wallet.dart index 93a3b9759..ae65a8878 100644 --- a/cw_evm/lib/evm_chain_wallet.dart +++ b/cw_evm/lib/evm_chain_wallet.dart @@ -323,6 +323,10 @@ abstract class EVMChainWalletBase isPotentialScam: token.isPotentialScam, walletName: walletInfo.name, chainId: selectedChainId, + groups: EVMChainDefaultTokens.getDefaultGroupsByAddress( + selectedChainId, + token.contractAddress, + ), ); } @@ -339,14 +343,16 @@ abstract class EVMChainWalletBase ); } - String _getUSDCContractAddress() { + String? _getUSDCContractAddress() { return switch (selectedChainId) { 1 => "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", 137 => "0x2791bca1f2de4661ed88a30c99a7a9449aa84174", 8453 => "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", 42161 => "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", 56 => "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - _ => throw Exception("Unsupported chain ID: $selectedChainId"), + // Robinhood Chain does not have USDC so using USDG in its place + 4663 => "0x5fc5360d0400a0fd4f2af552add042d716f1d168", + _ => null, }; } @@ -355,10 +361,13 @@ abstract class EVMChainWalletBase try { await _client.getBalance(_evmChainPrivateKey.address); - final usdcContractAddress = Erc20Token( - name: "USDC", symbol: "USDC", contractAddress: _getUSDCContractAddress(), decimal: 6); + final usdcAddress = _getUSDCContractAddress(); + if (usdcAddress != null) { + final usdcContractAddress = + Erc20Token(name: "USDC", symbol: "USDC", contractAddress: usdcAddress, decimal: 6); - await _client.fetchERC20Balances(_evmChainPrivateKey.address, usdcContractAddress); + await _client.fetchERC20Balances(_evmChainPrivateKey.address, usdcContractAddress); + } return true; } catch (e) { @@ -544,7 +553,10 @@ abstract class EVMChainWalletBase final address = walletAddresses.address; if (address.isEmpty) return MoralisDiscoveryResult.empty; - final chainName = EVMChainUtils.getDefaultTokenSymbol(selectedChainId).toLowerCase(); + final chainName = EVMChainUtils.getMoralisChainName(selectedChainId); + if (chainName == null) { + return MoralisDiscoveryResult.empty; + } final walletTokens = await _client.fetchWalletTokensFromMoralis(address, chainName); if (walletTokens.isEmpty) return MoralisDiscoveryResult.empty; @@ -988,6 +1000,7 @@ abstract class EVMChainWalletBase 56 => CryptoCurrency.bnb, 8453 => CryptoCurrency.baseEth, 42161 => CryptoCurrency.arbEth, + 4663 => CryptoCurrency.robEth, _ => CryptoCurrency.eth, }; @@ -1403,11 +1416,18 @@ abstract class EVMChainWalletBase String? iconPath; if ((token.iconPath == null || token.iconPath!.isEmpty) && !token.isPotentialScam) { - try { - iconPath = CryptoCurrency.all - .firstWhere((element) => element.title.toUpperCase() == token.symbol.toUpperCase()) - .iconPath; - } catch (_) {} + iconPath = EVMChainDefaultTokens.getDefaultIconPathByAddress( + selectedChainId, + token.contractAddress, + ); + + if (iconPath == null || iconPath.isEmpty) { + try { + iconPath = CryptoCurrency.all + .firstWhere((element) => element.title.toUpperCase() == token.symbol.toUpperCase()) + .iconPath; + } catch (_) {} + } } else if (!token.isPotentialScam) { iconPath = token.iconPath; } @@ -1448,7 +1468,7 @@ abstract class EVMChainWalletBase await transactionHistory.save(); } - Future getErc20Token(String contractAddress, String chainName) async { + Future getErc20Token(String contractAddress, String? chainName) async { try { return await _client.getErc20Token(contractAddress, chainName); } catch (e) { diff --git a/cw_evm/lib/tokens/robinhood_tokens.dart b/cw_evm/lib/tokens/robinhood_tokens.dart new file mode 100644 index 000000000..45d543e32 --- /dev/null +++ b/cw_evm/lib/tokens/robinhood_tokens.dart @@ -0,0 +1,407 @@ +import "package:cw_core/crypto_currency.dart"; +import "package:cw_core/currency_groups.dart"; +import "package:cw_core/erc20_token.dart"; + +class RobinhoodTokens { + static List get tokens { + final tokens = [ + Erc20Token( + name: "Global Dollar", + symbol: "USDG", + contractAddress: "0x5fc5360d0400a0fd4f2af552add042d716f1d168", + decimal: 6, + enabled: true, + iconPath: "assets/images/usdg_icon.png", + ), + Erc20Token( + name: "Ethena USDe", + symbol: "USDe", + contractAddress: "0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34", + decimal: 18, + enabled: true, + ), + Erc20Token( + name: "WETH", + symbol: "WETH", + contractAddress: "0x0bd7d308f8e1639fab988df18a8011f41eacad73", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Apple", + symbol: "AAPL", + contractAddress: "0xaf3d76f1834a1d425780943c99ea8a608f8a93f9", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/apple.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "AMD", + symbol: "AMD", + contractAddress: "0x86923f96303d656e4aa86d9d42d1e57ad2023fdc", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/amd.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Amazon", + symbol: "AMZN", + contractAddress: "0x12f190a9f9d7d37a250758b26824b97ce941bf54", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/amznx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "ASML Holding NV", + symbol: "ASML", + contractAddress: "0x47f93d52cbec7c6d2cfc080e154002370a60daea", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/asml.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Broadcom", + symbol: "AVGO", + contractAddress: "0x156e175dd063a8ce274c50654ef40e0032b3fbcf", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/avgox.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Alibaba", + symbol: "BABA", + contractAddress: "0xad25ac6c84d497db898fa1e8387bf6af3532a1c4", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/baba.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Coinbase", + symbol: "COIN", + contractAddress: "0x6330d8c3178a418788df01a47479c0ce7ccf450b", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/coinx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Costco", + symbol: "COST", + contractAddress: "0x4ea005168d7f09a7a0ba9d1def21a479950e44c2", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/cost.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Circle Internet Group", + symbol: "CRCL", + contractAddress: "0xdf0992e440dd0be65bd8439b609d6d4366bf1cb5", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/crclx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Datadog", + symbol: "DDOG", + contractAddress: "0x27c99fbde9d0d2aa4f4bfb4943f237843ddf6958", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/ddog.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Dell", + symbol: "DELL", + contractAddress: "0x941ae714ec6d8130c7b75d67160ca08f1e7d11dd", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/dell.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Ford Motor", + symbol: "F", + contractAddress: "0x25c288e6d899b9bc30160965ad9644c67e73be0c", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/f.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "GameStop", + symbol: "GME", + contractAddress: "0x1b0e319c6a659f002271b69db8a7df2f911c153e", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/gmex.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Alphabet Class A", + symbol: "GOOGL", + contractAddress: "0x2e0847e8910a9732eb3fb1bb4b70a580adad4fe3", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/googlx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Intel", + symbol: "INTC", + contractAddress: "0xc72b96e0e48ecd4dc75e1e45396e26300bc39681", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/intcx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Intuit", + symbol: "INTU", + contractAddress: "0x56d23bee5f41a7120170b0c603dae30128e460e9", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/intu.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Eli Lilly", + symbol: "LLY", + contractAddress: "0x8005d266423c7ea827372c9c864491e5786600ea", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/llyx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Lululemon", + symbol: "LULU", + contractAddress: "0x4e62068525ab11fe768e29dfd00ef909b9803016", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/lulu.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Meta Platforms", + symbol: "META", + contractAddress: "0xc0d6457c16cc70d6790dd43521c899c87ce02f35", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/metax.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Marvell Technology", + symbol: "MRVL", + contractAddress: "0x62fd0668e10d8b72339be2dcf7643001688ff13b", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/mrvlx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Microsoft", + symbol: "MSFT", + contractAddress: "0xe93237c50d904957cf27e7b1133b510c669c2e74", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/msftx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Strategy Inc.", + symbol: "MSTR", + contractAddress: "0xec262a75e413fafd0df80480274532c79d42da09", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/mstrx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Micron Technology", + symbol: "MU", + contractAddress: "0xff080c8ce2e5feadaca0da81314ae59d232d4afd", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/mu.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Netflix", + symbol: "NFLX", + contractAddress: "0xe0444ef8bf4ed74f74fd73686e2ddf4c1c5591e8", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/nflxx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Nu", + symbol: "NU", + contractAddress: "0x408c14038a04f7bd235329e26d2bf569ee20e250", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/nu.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "NVIDIA", + symbol: "NVDA", + contractAddress: "0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/nvdax.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Oracle", + symbol: "ORCL", + contractAddress: "0xb0992820e760d836549ba69bc7598b4af75dee03", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/orclx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Palantir Technologies", + symbol: "PLTR", + contractAddress: "0x894e1ec2d74ffe5aef8dc8a9e84686accb964f2a", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/pltrx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Qualcomm", + symbol: "QCOM", + contractAddress: "0x0f17206447090e464c277571124dd2688e48aea9", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/qcom.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Invesco QQQ", + symbol: "QQQ", + contractAddress: "0xd5f3879160bc7c32ebb4dc785f8a4f505888de68", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/qqqx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Rivian Automotive", + symbol: "RIVN", + contractAddress: "0xb1bf26c1d20ff267a4f93550d1e0d06ac40a114b", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/rivn.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Shopify", + symbol: "SHOP", + contractAddress: "0xf53f66751b1eff985311b693531e3290f600c410", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/shop.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "SoFi Technologies", + symbol: "SOFI", + contractAddress: "0x98e75885157c80992a8d41b696d8c9c6fb30a926", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/sofi.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "SPDR S&P 500 ETF Trust", + symbol: "SPY", + contractAddress: "0x117cc2133c37b721f49de2a7a74833232b3b4c0c", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/spyx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Tesla", + symbol: "TSLA", + contractAddress: "0x322f0929c4625ed5bad873c95208d54e1c003b2d", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/tslax.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Taiwan Semiconductor Manufacturing", + symbol: "TSM", + contractAddress: "0x58ffe4a942d3885baa22d7520691f611ef09e7aa", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/tsm.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Take-Two Interactive Software", + symbol: "TTWO", + contractAddress: "0x5e81213613b6b86eab4c6c50d718d34359459786", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/ttwo.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "UPS", + symbol: "UPS", + contractAddress: "0xf23250dac154d05bb671cb0d0ebef3c635c79ce2", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/ups.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "Workday", + symbol: "WDAY", + contractAddress: "0x82da4646242e1d962e96e932269dc644c94a9caa", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/wday.png", + groups: const {CurrencyGroups.tokenizedStock}, + ), + Erc20Token( + name: "ExxonMobil Holdings Corporation", + symbol: "XOM", + contractAddress: "0xf9b46d3d1b22199d4d1025a9cedb540a33f1a2d5", + decimal: 18, + enabled: false, + iconPath: "assets/images/stocks/xomx.webp", + groups: const {CurrencyGroups.tokenizedStock}, + ), + ]; + + return tokens.map((token) { + String? iconPath; + if (token.iconPath?.isEmpty ?? true) { + try { + iconPath = CryptoCurrency.all + .firstWhere((element) => element.title.toUpperCase() == token.symbol.toUpperCase()) + .iconPath; + } catch (_) {} + } else { + iconPath = token.iconPath; + } + + return Erc20Token.copyWith(token, icon: iconPath, tag: "ROB"); + }).toList(); + } +} diff --git a/cw_evm/lib/utils/evm_chain_utils.dart b/cw_evm/lib/utils/evm_chain_utils.dart index 39e52d50b..5a7611a31 100644 --- a/cw_evm/lib/utils/evm_chain_utils.dart +++ b/cw_evm/lib/utils/evm_chain_utils.dart @@ -3,19 +3,22 @@ import "package:web3dart/web3dart.dart" show EtherAmount, EtherUnit; /// Utility class for chain-specific EVM chain operations class EVMChainUtils { - static int getTotalPriorityFee(EVMChainTransactionPriority priority, int chainId) => switch (chainId) { - 1 => _ethereumPriorityFee(priority), - 137 => _polygonPriorityFee(priority), - 8453 => _basePriorityFee(priority), - 56 => _ethereumPriorityFee(priority), - 42161 => 0, // Arbitrum doesn't use priority fees - _ => _ethereumPriorityFee(priority), - }; + static int getTotalPriorityFee(EVMChainTransactionPriority priority, int chainId) => + switch (chainId) { + 1 => _ethereumPriorityFee(priority), + 137 => _polygonPriorityFee(priority), + 8453 => _basePriorityFee(priority), + 56 => _ethereumPriorityFee(priority), + 42161 => 0, // Arbitrum doesn't use priority fees + 4663 => 0, // Robinhood Chain (Arbitrum Orbit) doesn't use priority fees + _ => _ethereumPriorityFee(priority), + }; static bool hasPriorityFee(int chainId) => switch (chainId) { - 42161 => false, // Arbitrum doesn't use priority fees - _ => true, - }; + 42161 => false, // Arbitrum doesn't use priority fees + 4663 => false, // Robinhood Chain (Arbitrum Orbit) doesn't use priority fees + _ => true, + }; static int computeBufferedMaxFeePerGasWei({ required int? gasBaseFee, @@ -34,52 +37,67 @@ class EVMChainUtils { } static String getTransactionHistoryFileName(int chainId) => switch (chainId) { - 1 => "transactions.json", // Ethereum - 137 => "polygon_transactions.json", - 8453 => "base_transactions.json", - 42161 => "arbitrum_transactions.json", - 56 => "bsc_transactions.json", - _ => "transactions_$chainId.json", // Generic format for other chains - }; + 1 => "transactions.json", // Ethereum + 137 => "polygon_transactions.json", + 8453 => "base_transactions.json", + 42161 => "arbitrum_transactions.json", + 56 => "bsc_transactions.json", + 4663 => "robinhood_transactions.json", + _ => "transactions_$chainId.json", // Generic format for other chains + }; /// Get scan provider preference key for a wallet type static String getScanProviderPreferenceKey(int chainId) => switch (chainId) { - 1 => "use_etherscan", - 137 => "use_polygonscan", - 8453 => "use_base_scan", - 42161 => "use_arbitrum_scan", - 56 => "use_bscscan", - _ => "use_etherscan", - }; + 1 => "use_etherscan", + 137 => "use_polygonscan", + 8453 => "use_base_scan", + 42161 => "use_arbitrum_scan", + 56 => "use_bscscan", + 4663 => "use_robinhood_scan", + _ => "use_etherscan", + }; static String getDefaultTokenTag(int chainId) => switch (chainId) { - 1 => "ETH", - 137 => "POL", - 8453 => "BASE", - 42161 => "ARB", - 56 => "BSC", - _ => "ETH", - }; + 1 => "ETH", + 137 => "POL", + 8453 => "BASE", + 42161 => "ARB", + 56 => "BSC", + 4663 => "ROB", + _ => "ETH", + }; static String getFeeCurrency(int chainId) => switch (chainId) { - 1 => "ETH", - 137 => "POL", - 8453 => "ETH", - 42161 => "ETH", - 56 => "BNB", - _ => "ETH", - }; + 1 => "ETH", + 137 => "POL", + 8453 => "ETH", + 42161 => "ETH", + 56 => "BNB", + 4663 => "ETH", + _ => "ETH", + }; static String getDefaultTokenSymbol(int chainId) => switch (chainId) { - 1 => "ETH", - 137 => "POL", - 8453 => "BASE", - 42161 => "ARBITRUM", - 56 => "BSC", - _ => "ETH", - }; + 1 => "ETH", + 137 => "POL", + 8453 => "BASE", + 42161 => "ARBITRUM", + 56 => "BSC", + 4663 => "ETH", + _ => "ETH", + }; - static int _ethereumPriorityFee(EVMChainTransactionPriority priority) => EtherAmount.fromInt(EtherUnit.gwei, priority.tip).getInWei.toInt(); + static String? getMoralisChainName(int chainId) => switch (chainId) { + 1 => "eth", + 137 => "polygon", + 8453 => "base", + 42161 => "arbitrum", + 56 => "bsc", + _ => null, + }; + + static int _ethereumPriorityFee(EVMChainTransactionPriority priority) => + EtherAmount.fromInt(EtherUnit.gwei, priority.tip).getInWei.toInt(); // Polygon priority fee calculation (minimum 25 gwei + additional based on priority) static int _polygonPriorityFee(EVMChainTransactionPriority priority) { @@ -98,9 +116,10 @@ class EVMChainUtils { } static int _basePriorityFee(EVMChainTransactionPriority priority) => switch (priority) { - EVMChainTransactionPriority.fast => EtherAmount.fromInt(EtherUnit.mwei, 5).getInWei.toInt(), - EVMChainTransactionPriority.medium => EtherAmount.fromInt(EtherUnit.mwei, 3).getInWei.toInt(), - EVMChainTransactionPriority.slow => EtherAmount.fromInt(EtherUnit.mwei, 1).getInWei.toInt(), - _ => EtherAmount.fromInt(EtherUnit.mwei, 1).getInWei.toInt(), - }; + EVMChainTransactionPriority.fast => EtherAmount.fromInt(EtherUnit.mwei, 5).getInWei.toInt(), + EVMChainTransactionPriority.medium => + EtherAmount.fromInt(EtherUnit.mwei, 3).getInWei.toInt(), + EVMChainTransactionPriority.slow => EtherAmount.fromInt(EtherUnit.mwei, 1).getInWei.toInt(), + _ => EtherAmount.fromInt(EtherUnit.mwei, 1).getInWei.toInt(), + }; } diff --git a/cw_evm/test/robinhood_tokens_test.dart b/cw_evm/test/robinhood_tokens_test.dart new file mode 100644 index 000000000..d4a39ed2f --- /dev/null +++ b/cw_evm/test/robinhood_tokens_test.dart @@ -0,0 +1,91 @@ +import "package:cw_core/currency_groups.dart"; +import "package:cw_evm/tokens/robinhood_tokens.dart"; +import "package:cw_evm/utils/evm_chain_utils.dart"; +import "package:flutter_test/flutter_test.dart"; + +void main() { + group("RobinhoodTokens integrity", () { + final tokens = RobinhoodTokens.tokens; + final addressPattern = RegExp(r"^0x[0-9a-f]{40}$"); + + test("token list is non-empty", () => expect(tokens.isNotEmpty, isTrue)); + + test("every contract address is a lowercased 0x-prefixed 40-hex-char address", () { + for (final token in tokens) { + expect( + addressPattern.hasMatch(token.contractAddress), + isTrue, + reason: "bad address for ${token.symbol}: ${token.contractAddress}", + ); + } + }); + + test("every token has a non-empty name and symbol", () { + for (final token in tokens) { + expect(token.name.trim(), isNotEmpty, reason: "empty name for ${token.contractAddress}"); + expect( + token.symbol.trim(), + isNotEmpty, + reason: "empty symbol for ${token.contractAddress}", + ); + } + }); + + test("every decimal is within the 0..18 range", () { + for (final token in tokens) { + expect( + token.decimal, + inInclusiveRange(0, 18), + reason: "bad decimal for ${token.symbol}: ${token.decimal}", + ); + } + }); + + test("no duplicate contract addresses", () { + final seen = {}; + for (final token in tokens) { + final addr = token.contractAddress.toLowerCase(); + expect(seen.add(addr), isTrue, reason: "duplicate address $addr (${token.symbol})"); + } + }); + + test("USDG is the 6-decimal stablecoin and is enabled by default", () { + final usdg = tokens.firstWhere((t) => t.symbol == "USDG"); + expect(usdg.decimal, 6); + expect(usdg.enabled, isTrue); + }); + + test("tokenized stock tokens exist and ship disabled", () { + final stocks = tokens.where((t) => t.groups.contains(CurrencyGroups.tokenizedStock)).toList(); + expect(stocks, isNotEmpty); + expect(stocks.every((t) => !t.enabled), isTrue); + }); + }); + + group("EVMChainUtils Robinhood chain params", () { + test("getMoralisChainName is null for Robinhood (Moralis does not index 4663)", () { + expect(EVMChainUtils.getMoralisChainName(4663), isNull); + }); + + test("getMoralisChainName maps supported chains to Moralis slugs", () { + expect(EVMChainUtils.getMoralisChainName(1), "eth"); + expect(EVMChainUtils.getMoralisChainName(137), "polygon"); + expect(EVMChainUtils.getMoralisChainName(8453), "base"); + expect(EVMChainUtils.getMoralisChainName(42161), "arbitrum"); + expect(EVMChainUtils.getMoralisChainName(56), "bsc"); + }); + + test("getMoralisChainName is null for unknown chains", () { + expect(EVMChainUtils.getMoralisChainName(999999), isNull); + }); + + test("Robinhood is an Orbit chain with no priority fee", () { + expect(EVMChainUtils.hasPriorityFee(4663), isFalse); + }); + + test("Robinhood default token tag is ROB and fee currency is ETH", () { + expect(EVMChainUtils.getDefaultTokenTag(4663), "ROB"); + expect(EVMChainUtils.getFeeCurrency(4663), "ETH"); + }); + }); +} diff --git a/cw_solana/lib/solana_client.dart b/cw_solana/lib/solana_client.dart index c69ec8387..ed5a365a8 100644 --- a/cw_solana/lib/solana_client.dart +++ b/cw_solana/lib/solana_client.dart @@ -439,14 +439,16 @@ class SolanaWalletClient { return walletSent && walletReceived; } + static const unresolvedTokenTitle = "TOKEN"; + static CryptoCurrency currencyForRawAmount(SPLToken? token, int mintDecimals) { if (token != null && token.decimals == mintDecimals) { return token; } return CryptoCurrency( - name: (token?.title ?? "TOKEN").toLowerCase(), - title: token?.title ?? "TOKEN", + name: (token?.title ?? unresolvedTokenTitle).toLowerCase(), + title: token?.title ?? unresolvedTokenTitle, decimals: mintDecimals, ); } @@ -1272,7 +1274,10 @@ class SolanaWalletClient { }, ); - if (response.statusCode != 200) return null; + if (response.statusCode != 200) { + throw Exception("Moralis token metadata returned ${response.statusCode}"); + } + final decodedResponse = jsonDecode(response.body) as Map; final symbol = decodedResponse['symbol'] ?? ''; diff --git a/cw_solana/lib/solana_wallet.dart b/cw_solana/lib/solana_wallet.dart index 8253b5894..89eb4b75e 100644 --- a/cw_solana/lib/solana_wallet.dart +++ b/cw_solana/lib/solana_wallet.dart @@ -360,6 +360,9 @@ abstract class SolanaWalletBase @override Future updateTransactionsHistory({List? specificTokenMints}) async { + _seedTokenInfoCache(); + await _reparseUnresolvedTokenTransactionsOnce(); + await Future.wait([ _updateNativeSOLTransactions(), updateSPLTokenTransactions(specificMints: specificTokenMints), @@ -393,6 +396,32 @@ abstract class SolanaWalletBase await prefs.remove(_lastSyncedSignatureKey(source)); } + void _seedTokenInfoCache() { + for (final token in _splTokens) { + _client.tokenInfoCache[token.mintAddress] = token; + } + } + + Future _reparseUnresolvedTokenTransactionsOnce() async { + final prefs = await _sharedPrefs.future; + final key = "solana_unresolved_token_reparse_done_${walletInfo.name}"; + + if (prefs.getBool(key) ?? false) { + return; + } + + final hasUnresolvedTransactions = transactionHistory.transactions.values.any( + (transaction) => + transaction.amount.currency.symbol == SolanaWalletClient.unresolvedTokenTitle, + ); + + if (hasUnresolvedTransactions) { + await _clearLastSyncedSignature(_nativeSource); + } + + await prefs.setBool(key, true); + } + /// Polls for a specific transaction by signature with exponential backoff /// I'm using this in case we make the call to fetch the transaction and it has not finished its confirmations on the solana network and been indexed by the node networks we use. Future pollForTransaction({ @@ -401,6 +430,7 @@ abstract class SolanaWalletBase int maxRetries = 5, }) async { final walletAddress = _solanaPublicKey.toAddress().address; + _seedTokenInfoCache(); for (int i = 0; i < maxRetries; i++) { await Future.delayed(initialDelay * (i + 1)); diff --git a/ios/Runner/InfoBase.plist b/ios/Runner/InfoBase.plist index 43eec935d..0898ac791 100644 --- a/ios/Runner/InfoBase.plist +++ b/ios/Runner/InfoBase.plist @@ -363,6 +363,26 @@ bsc-wallet + + CFBundleTypeRole + Editor + CFBundleURLName + robinhood + CFBundleURLSchemes + + robinhood + + + + CFBundleTypeRole + Viewer + CFBundleURLName + robinhood-wallet + CFBundleURLSchemes + + robinhood-wallet + + CFBundleTypeRole Viewer diff --git a/lib/buy/dfx/dfx_buy_provider.dart b/lib/buy/dfx/dfx_buy_provider.dart index 282ed7698..846099d18 100644 --- a/lib/buy/dfx/dfx_buy_provider.dart +++ b/lib/buy/dfx/dfx_buy_provider.dart @@ -137,6 +137,7 @@ class DFXBuyProvider extends BuyProvider { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.solana: case WalletType.tron: return wallet.signMessage(message); diff --git a/lib/buy/robinhood/robinhood_buy_provider.dart b/lib/buy/robinhood/robinhood_buy_provider.dart index 651dc6b84..090e67da6 100644 --- a/lib/buy/robinhood/robinhood_buy_provider.dart +++ b/lib/buy/robinhood/robinhood_buy_provider.dart @@ -108,6 +108,7 @@ class RobinhoodBuyProvider extends BuyProvider { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.solana: case WalletType.tron: case WalletType.dogecoin: diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart index 1c4c6d372..7d198efc0 100644 --- a/lib/core/address_validator.dart +++ b/lib/core/address_validator.dart @@ -113,6 +113,7 @@ class AddressValidator extends TextValidator { case CryptoCurrency.eth: case CryptoCurrency.baseEth: case CryptoCurrency.arbEth: + case CryptoCurrency.robEth: case CryptoCurrency.mana: case CryptoCurrency.matic: case CryptoCurrency.maticpoly: @@ -271,6 +272,7 @@ class AddressValidator extends TextValidator { case CryptoCurrency.avaxc: case CryptoCurrency.baseEth: case CryptoCurrency.arbEth: + case CryptoCurrency.robEth: return [42]; case CryptoCurrency.bch: return [42, 54, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]; @@ -382,6 +384,7 @@ class AddressValidator extends TextValidator { case CryptoCurrency.maticpoly: case CryptoCurrency.baseEth: case CryptoCurrency.arbEth: + case CryptoCurrency.robEth: case CryptoCurrency.arb: pattern = '0x[0-9a-zA-Z]+'; case CryptoCurrency.nano: diff --git a/lib/core/seed_validator.dart b/lib/core/seed_validator.dart index efe0f3655..9123a491e 100644 --- a/lib/core/seed_validator.dart +++ b/lib/core/seed_validator.dart @@ -37,6 +37,7 @@ class SeedValidator extends Validator { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return evm!.getEVMWordList(language); case WalletType.bitcoinCash: return getBitcoinWordList(language); diff --git a/lib/core/wallet_creation_service.dart b/lib/core/wallet_creation_service.dart index 3700a1c84..4ab9b67cb 100644 --- a/lib/core/wallet_creation_service.dart +++ b/lib/core/wallet_creation_service.dart @@ -81,6 +81,7 @@ class WalletCreationService { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.solana: case WalletType.tron: case WalletType.dogecoin: diff --git a/lib/di.dart b/lib/di.dart index bd1e79b24..5d4834ca9 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -1234,6 +1234,7 @@ Future setup({ case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return evm!.createEVMWalletService(param1, SettingsStoreBase.walletPasswordDirectInput); case WalletType.bitcoinCash: return bitcoinCash!.createBitcoinCashWalletService( diff --git a/lib/entities/default_settings_migration.dart b/lib/entities/default_settings_migration.dart index ce43f9362..4f1225ca4 100644 --- a/lib/entities/default_settings_migration.dart +++ b/lib/entities/default_settings_migration.dart @@ -64,6 +64,7 @@ const dogecoinDefaultNodeUri = 'dogecoin.stackwallet.com:50022'; const baseDefaultNodeUri = 'base-rpc.publicnode.com'; const arbitrumDefaultNodeUri = 'arbitrum-one-rpc.publicnode.com'; const bscDefaultNodeUri = 'bsc-dataseed.bnbchain.org'; +const robinhoodDefaultNodeUri = "robinhood-rpc.publicnode.com"; const zcashDefaultNodeUri = 'zec.rocks:443'; Future defaultSettingsMigration( @@ -660,6 +661,12 @@ Future defaultSettingsMigration( break; case 72: await createDefaultChartsData(); + await addWalletNodeList(type: WalletType.robinhood); + await _changeDefaultNode( + sharedPreferences: sharedPreferences, + type: WalletType.robinhood, + currentNodePreferenceKey: PreferencesKey.currentRobinhoodNodeIdKey, + ); break; default: break; diff --git a/lib/entities/node_check.dart b/lib/entities/node_check.dart index e66fc6dce..dbc0b583f 100644 --- a/lib/entities/node_check.dart +++ b/lib/entities/node_check.dart @@ -16,6 +16,7 @@ const Map nodePreferenceKeys = { WalletType.base: PreferencesKey.currentBaseNodeIdKey, WalletType.arbitrum: PreferencesKey.currentArbitrumNodeIdKey, WalletType.bsc: PreferencesKey.currentBscNodeIdKey, + WalletType.robinhood: PreferencesKey.currentRobinhoodNodeIdKey, WalletType.nano: PreferencesKey.currentNanoNodeIdKey, WalletType.decred: PreferencesKey.currentDecredNodeIdKey, WalletType.bitcoinCash: PreferencesKey.currentBitcoinCashNodeIdKey, diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart index de1ea9c76..088cb45a0 100644 --- a/lib/entities/preferences_key.dart +++ b/lib/entities/preferences_key.dart @@ -13,6 +13,7 @@ class PreferencesKey { static const currentBaseNodeIdKey = 'current_node_id_base'; static const currentArbitrumNodeIdKey = 'current_node_id_arbitrum'; static const currentBscNodeIdKey = 'current_node_id_bsc'; + static const currentRobinhoodNodeIdKey = "current_node_id_robinhood"; static const currentNanoNodeIdKey = 'current_node_id_nano'; static const currentNanoPowNodeIdKey = 'current_node_id_nano_pow'; static const currentDecredNodeIdKey = 'current_node_id_decred'; @@ -92,6 +93,7 @@ class PreferencesKey { static const useBaseScan = 'use_base_scan'; static const useArbiScan = 'use_arbitrum_scan'; static const useBscScan = 'use_bscscan'; + static const useRobinhoodScan = "use_robinhood_scan"; static const useTronGrid = 'use_trongrid'; static const useMempoolFeeAPI = 'use_mempool_fee_api'; static const evmHiddenChainIds = 'evm_hidden_chain_ids'; diff --git a/lib/entities/priority_for_wallet_type.dart b/lib/entities/priority_for_wallet_type.dart index f41c3b34b..71d4c0e44 100644 --- a/lib/entities/priority_for_wallet_type.dart +++ b/lib/entities/priority_for_wallet_type.dart @@ -30,6 +30,7 @@ List priorityForWalletType(WalletType type) { case WalletType.dogecoin: return dogecoin!.getTransactionPriorities(); case WalletType.arbitrum: + case WalletType.robinhood: case WalletType.nano: case WalletType.banano: case WalletType.solana: diff --git a/lib/evm/cw_evm.dart b/lib/evm/cw_evm.dart index a291169ee..5145d643d 100644 --- a/lib/evm/cw_evm.dart +++ b/lib/evm/cw_evm.dart @@ -199,10 +199,13 @@ class CWEVM extends EVM { @override Future getErc20Token(WalletBase wallet, String contractAddress) { final evmWallet = wallet as EVMChainWallet; - final chainName = EVMChainUtils.getDefaultTokenSymbol(evmWallet.selectedChainId).toLowerCase(); - return evmWallet.getErc20Token(contractAddress, chainName); + return evmWallet.getErc20Token(contractAddress, getMoralisChainName(wallet)); } + @override + String? getMoralisChainName(WalletBase wallet) => + EVMChainUtils.getMoralisChainName((wallet as EVMChainWallet).selectedChainId); + @override CryptoCurrency assetOfTransaction(WalletBase wallet, TransactionInfo transaction) { transaction as EVMChainTransactionInfo; diff --git a/lib/exchange/provider/changenow_exchange_provider.dart b/lib/exchange/provider/changenow_exchange_provider.dart index e6c94d559..c3721c9c4 100644 --- a/lib/exchange/provider/changenow_exchange_provider.dart +++ b/lib/exchange/provider/changenow_exchange_provider.dart @@ -356,6 +356,8 @@ class ChangeNowExchangeProvider extends ExchangeProvider { return 'cchain'; case 'ARB': return 'arbitrum'; + case "ROB": + return "hood"; default: return tag.toLowerCase(); } @@ -366,6 +368,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider { 'POLY' => 'MATIC', 'AVAXC' => 'CCHAIN', 'ARBITRUM' => 'ARB', + "HOOD" => "ROB", _ => network, }; } diff --git a/lib/exchange/provider/near_Intents_exchange_provider.dart b/lib/exchange/provider/near_Intents_exchange_provider.dart index 7b1c2ef1d..e47d5017d 100644 --- a/lib/exchange/provider/near_Intents_exchange_provider.dart +++ b/lib/exchange/provider/near_Intents_exchange_provider.dart @@ -50,6 +50,7 @@ class NearIntentsExchangeProvider extends ExchangeProvider { 'AVAXC': '0x1111111111111111111111111111111111111111', 'ARB': '0x1111111111111111111111111111111111111111', 'BASE': '0x1111111111111111111111111111111111111111', + "ROB": "0x1111111111111111111111111111111111111111", // Others 'SOL': '11111111111111111111111111111111', @@ -516,6 +517,7 @@ class NearIntentsExchangeProvider extends ExchangeProvider { return switch (tag) { 'TRX' => 'tron', 'AVAXC' => 'avax', + "ROB" => "hood", _ => tag?.toLowerCase(), }; } @@ -524,6 +526,7 @@ class NearIntentsExchangeProvider extends ExchangeProvider { return switch (blockchain) { 'tron' => 'TRX', 'avax' => 'AVAXC', + "hood" => "ROB", _ => blockchain?.toUpperCase(), }; } diff --git a/lib/exchange/provider/sideshift_exchange_provider.dart b/lib/exchange/provider/sideshift_exchange_provider.dart index d111edcef..ae3e80b24 100644 --- a/lib/exchange/provider/sideshift_exchange_provider.dart +++ b/lib/exchange/provider/sideshift_exchange_provider.dart @@ -457,6 +457,8 @@ class SideShiftExchangeProvider extends ExchangeProvider { return 'zcash'; case 'AVAXC': return 'avax'; + case "ROB": + return "robinhood"; default: return tag.toLowerCase(); } diff --git a/lib/exchange/provider/swaptrade_exchange_provider.dart b/lib/exchange/provider/swaptrade_exchange_provider.dart index e3db6929f..d67dfde1a 100644 --- a/lib/exchange/provider/swaptrade_exchange_provider.dart +++ b/lib/exchange/provider/swaptrade_exchange_provider.dart @@ -54,6 +54,10 @@ class SwapTradeExchangeProvider extends ExchangeProvider { required CryptoCurrency to, required bool isFixedRateMode, }) async { + if (!_isPairSupported(from, to)) { + return null; + } + try { final uri = Uri.https(apiAuthority, getCoins); final response = await ProxyWrapper().get(clearnetUri: uri); @@ -96,6 +100,7 @@ class SwapTradeExchangeProvider extends ExchangeProvider { required bool isReceiveAmount}) async { try { if (amount == 0) return 0.0; + if (!_isPairSupported(from, to)) return 0.0; if (isFixedRateMode && !supportsFixedRate) { return 0.0; } @@ -191,13 +196,24 @@ class SwapTradeExchangeProvider extends ExchangeProvider { required bool isFixedRateMode, required bool isSendAll, }) async { + final sendNetwork = _networkFor(request.fromCurrency); + final receiveNetwork = _networkFor(request.toCurrency); + if (sendNetwork == null || receiveNetwork == null) { + throw TradeNotCreatedException( + description, + description: "SwapTrade has no network for " + "${request.fromCurrency.title} ${request.fromCurrency.tag ?? ""} or " + "${request.toCurrency.title} ${request.toCurrency.tag ?? ""}", + ); + } + try { final params = {}; var body = { 'coin_send': _normalizeCurrency(request.fromCurrency), - 'coin_send_network': _networkFor(request.fromCurrency), + 'coin_send_network': sendNetwork, 'coin_receive': _normalizeCurrency(request.toCurrency), - 'coin_receive_network': _networkFor(request.toCurrency), + 'coin_receive_network': receiveNetwork, 'amount_send': request.fromAmount, 'recipient': request.toAddress, 'ref': 'cake', @@ -396,22 +412,16 @@ class SwapTradeExchangeProvider extends ExchangeProvider { } } - String _networkFor(CryptoCurrency currency) { - final network = switch (currency) { - CryptoCurrency.eth => 'ETH', - CryptoCurrency.bnb => 'BNB_BSC', - CryptoCurrency.usdterc20 => 'USDT_ERC20', - CryptoCurrency.usdttrc20 => 'TRX_USDT_S2UZ', - CryptoCurrency.usdtbsc => 'USDT_BSC', - CryptoCurrency.sol => 'SOL', - CryptoCurrency.btc => 'BTC', - CryptoCurrency.xmr => 'XMR', - CryptoCurrency.ltc => 'LTC', - CryptoCurrency.ada => 'ADA', - CryptoCurrency.bch => 'BCH', - CryptoCurrency.zec => 'ZEC', - _ => currency.title.toUpperCase(), - }; - return network; - } + bool _isPairSupported(CryptoCurrency from, CryptoCurrency to) => + _networkFor(from) != null && _networkFor(to) != null; + + String? _networkFor(CryptoCurrency currency) => + switch ((currency.title.toUpperCase(), currency.tag?.toUpperCase())) { + ("BNB", "BSC") => "BNB_BSC", + ("USDT", "ETH") => "USDT_ERC20", + ("USDT", "TRX") => "TRX_USDT_S2UZ", + ("USDT", "BSC") => "USDT_BSC", + (final title, null) => title, + _ => null, + }; } diff --git a/lib/new-ui/pages/send_page.dart b/lib/new-ui/pages/send_page.dart index e78b5d247..0a41e2297 100644 --- a/lib/new-ui/pages/send_page.dart +++ b/lib/new-ui/pages/send_page.dart @@ -612,7 +612,10 @@ class _NewSendPageState extends State { subtitle: "~${output.estimatedFee} ${widget.sendViewModel.currencySymbol} (${output.estimatedFeeFiatAmount} ${widget.sendViewModel.fiatCurrency})", // Without fee priorities the row does nothing, - // so it must not be announced as interactive. + // so it must not be announced as interactive or + // show a tappable arrow. + showArrow: widget + .sendViewModel.feesViewModel.hasFeesPriority, onTap: widget.sendViewModel.feesViewModel .hasFeesPriority ? () => diff --git a/lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart b/lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart index aa6316d33..aa3339d53 100644 --- a/lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart +++ b/lib/new-ui/widgets/currency_picker/multi_network_currency_picker.dart @@ -481,6 +481,7 @@ class _MultiNetworkPickerBodyState extends State<_MultiNetworkPickerBody> { String _shortChainLabel(CryptoCurrency c) { if (cryptoCurrencyOrTokenToWalletType(c) == WalletType.bsc) return 'BSC'; + if (cryptoCurrencyOrTokenToWalletType(c) == WalletType.robinhood) return "ROB"; return chainNameForCurrency(c); } @@ -493,7 +494,7 @@ class _MultiNetworkPickerBodyState extends State<_MultiNetworkPickerBody> { } bool _isL2NativeEth(CryptoCurrency c) => - c == CryptoCurrency.arbEth || c == CryptoCurrency.baseEth; + c == CryptoCurrency.arbEth || c == CryptoCurrency.baseEth || c == CryptoCurrency.robEth; _SelSection? _selectedSection({ required List recents, diff --git a/lib/new-ui/widgets/receive_page/receive_info_box.dart b/lib/new-ui/widgets/receive_page/receive_info_box.dart index ac3f1acfd..e47269bd7 100644 --- a/lib/new-ui/widgets/receive_page/receive_info_box.dart +++ b/lib/new-ui/widgets/receive_page/receive_info_box.dart @@ -5,6 +5,7 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart'; import 'package:cake_wallet/src/widgets/cake_image_widget.dart'; import 'package:cw_core/crypto_currency.dart'; +import "package:cw_core/currency_for_wallet_type.dart"; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; @@ -36,6 +37,7 @@ class ReceiveInfoBox extends StatelessWidget { case WalletType.polygon: case WalletType.zano: case WalletType.bsc: + case WalletType.robinhood: if (autoGenerateSubaddressStatus == AutoGenerateSubaddressStatus.disabled) return null; return ReceiveInfoBox( iconPath: "", @@ -43,8 +45,7 @@ class ReceiveInfoBox extends StatelessWidget { onDismissed: onDismissed, bottomWidget: InfoboxCurrencyRow( currencies: supportedCurrencies ?? [], - chainIconPath: - "assets/new-ui/chain_badges/${walletTypeToString(type).toLowerCase()}.svg", + chainIconPath: walletTypeToCryptoCurrency(type).chainIconPath ?? "", )); default: if (autoGenerateSubaddressStatus == AutoGenerateSubaddressStatus.disabled) return null; diff --git a/lib/new-ui/widgets/receive_page/receive_token_display.dart b/lib/new-ui/widgets/receive_page/receive_token_display.dart index db0486da4..e123db950 100644 --- a/lib/new-ui/widgets/receive_page/receive_token_display.dart +++ b/lib/new-ui/widgets/receive_page/receive_token_display.dart @@ -1,9 +1,9 @@ import 'package:cake_wallet/src/widgets/cake_image_widget.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart'; +import "package:cw_core/currency_for_wallet_type.dart"; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:flutter_svg/flutter_svg.dart'; class ReceiveTokenDisplay extends StatelessWidget { const ReceiveTokenDisplay({super.key, required this.addressListViewModel}); @@ -35,7 +35,7 @@ class ReceiveTokenDisplay extends StatelessWidget { children: [ CakeImageWidget( imageUrl: - "assets/new-ui/chain_badges/${addressListViewModel.wallet.type == WalletType.bsc ? 'bnb' : walletTypeToString(addressListViewModel.wallet.type).toLowerCase()}.svg", + walletTypeToCryptoCurrency(addressListViewModel.wallet.type).chainIconPath, width: 16, height: 16, colorFilter: diff --git a/lib/reactions/wallet_connect.dart b/lib/reactions/wallet_connect.dart index 61a6c11d2..e9cb16973 100644 --- a/lib/reactions/wallet_connect.dart +++ b/lib/reactions/wallet_connect.dart @@ -11,6 +11,7 @@ const List walletConnectCompatibleChains = [ WalletType.base, WalletType.arbitrum, WalletType.bsc, + WalletType.robinhood, WalletType.solana, ]; @@ -39,6 +40,7 @@ bool isEVMCompatibleChain(WalletType walletType) { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return true; default: return false; @@ -93,6 +95,8 @@ String getChainNameSpaceAndIdBasedOnWalletType(WalletType walletType, {int? chai return EVMChainId.arbitrum.chain(); case WalletType.bsc: return EVMChainId.bsc.chain(); + case WalletType.robinhood: + return EVMChainId.robinhood.chain(); case WalletType.solana: return SolanaChainId.mainnet.chain(); default: @@ -107,6 +111,7 @@ List getChainSupportedMethodsOnWalletType(WalletType walletType) { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return EVMSupportedMethods.values.map((e) => e.name).toList(); case WalletType.solana: return SolanaSupportedMethods.values.map((e) => e.name).toList(); diff --git a/lib/reactions/wallet_utils.dart b/lib/reactions/wallet_utils.dart index 57d11a4c8..b0d66fc00 100644 --- a/lib/reactions/wallet_utils.dart +++ b/lib/reactions/wallet_utils.dart @@ -7,6 +7,7 @@ bool isBIP39Wallet(WalletType walletType) { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.solana: case WalletType.tron: case WalletType.bitcoin: @@ -49,6 +50,7 @@ bool hasTokens(WalletType walletType) { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return true; default: return false; @@ -61,6 +63,7 @@ String tokenStandardFor(WalletType walletType) { case WalletType.polygon: case WalletType.arbitrum: case WalletType.base: + case WalletType.robinhood: return 'ERC-20'; case WalletType.bsc: return 'BEP-20'; diff --git a/lib/src/screens/contact/contact_list_page.dart b/lib/src/screens/contact/contact_list_page.dart index 61fa3f38a..8c7d78417 100644 --- a/lib/src/screens/contact/contact_list_page.dart +++ b/lib/src/screens/contact/contact_list_page.dart @@ -388,9 +388,12 @@ class _ContactListBodyState extends State { } Widget generateContactRaw(BuildContext context, ContactRecord contact, bool isLast) { - final image = contact.type == CryptoCurrency.baseEth - ? 'assets/new-ui/crypto_full_icons/base.svg' - : contact.type.iconPath; + const l2NativeChainIcons = { + CryptoCurrency.baseEth: "assets/new-ui/crypto_full_icons/base.svg", + CryptoCurrency.arbEth: "assets/new-ui/crypto_full_icons/arbitrum.svg", + CryptoCurrency.robEth: "assets/new-ui/crypto_full_icons/robinhood.svg", + }; + final image = l2NativeChainIcons[contact.type] ?? contact.type.iconPath; final currencyIcon = (image != null && image.isNotEmpty) ? CakeImageWidget(imageUrl: image, height: 24, width: 24) : const SizedBox(height: 24, width: 24); diff --git a/lib/src/screens/dashboard/widgets/menu_widget.dart b/lib/src/screens/dashboard/widgets/menu_widget.dart index fbdb05861..6025d91dc 100644 --- a/lib/src/screens/dashboard/widgets/menu_widget.dart +++ b/lib/src/screens/dashboard/widgets/menu_widget.dart @@ -2,6 +2,7 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/widgets/setting_action_button.dart'; import 'package:cake_wallet/src/widgets/setting_actions.dart'; import 'package:flutter/material.dart'; +import "package:flutter_svg/svg.dart"; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -36,6 +37,7 @@ class MenuWidgetState extends State { this.baseIcon = Image.asset('assets/new-ui/crypto_full_icons/base.svg'), this.arbitrumIcon = Image.asset('assets/new-ui/crypto_full_icons/arbitrum.svg'), this.bscIcon = Image.asset('assets/new-ui/crypto_full_icons/bnb.svg'), + this.robinhoodIcon = SvgPicture.asset("assets/new-ui/crypto_full_icons/robinhood.svg"), this.solanaIcon = Image.asset('assets/new-ui/crypto_full_icons/solana.svg'), this.tronIcon = Image.asset('assets/new-ui/crypto_full_icons/tron.svg'), this.wowneroIcon = Image.asset('assets/new-ui/crypto_full_icons/wownero.svg'), @@ -67,6 +69,7 @@ class MenuWidgetState extends State { Image baseIcon; Image arbitrumIcon; Image bscIcon; + Widget robinhoodIcon; Image solanaIcon; Image tronIcon; Image wowneroIcon; @@ -261,6 +264,8 @@ class MenuWidgetState extends State { return arbitrumIcon; case WalletType.bsc: return bscIcon; + case WalletType.robinhood: + return robinhoodIcon; case WalletType.tron: return tronIcon; case WalletType.wownero: diff --git a/lib/src/screens/settings/connection_sync_page.dart b/lib/src/screens/settings/connection_sync_page.dart index ca9c46165..0a0ac9f7c 100644 --- a/lib/src/screens/settings/connection_sync_page.dart +++ b/lib/src/screens/settings/connection_sync_page.dart @@ -93,6 +93,14 @@ class ConnectionSyncPage extends BasePage { onChanged: (val) { _connectionSyncViewModel.setUseBaseScan(val); }), + if (_connectionSyncViewModel.canUseRobinhoodScan) + ListItemToggle( + keyValue: "can_use_robinhoodscan", + label: S.of(context).robinhoodscan_history, + value: _connectionSyncViewModel.useRobinhoodScan, + onChanged: (val) { + _connectionSyncViewModel.setUseRobinhoodScan(val); + }), if (_connectionSyncViewModel.canUseArbiScan) ListItemToggle( keyValue: "can_use_arbiscan", diff --git a/lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_id.dart b/lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_id.dart index d13b99bcf..a6150dfbe 100644 --- a/lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_id.dart +++ b/lib/src/screens/wallet_connect/services/chain_service/eth/evm_chain_id.dart @@ -6,6 +6,7 @@ enum EVMChainId { base, arbitrum, bsc, + robinhood, } extension EVMChainIdX on EVMChainId { @@ -24,6 +25,7 @@ extension EVMChainIdX on EVMChainId { EVMChainId.base => 8453, EVMChainId.arbitrum => 42161, EVMChainId.bsc => 56, + EVMChainId.robinhood => 4663, }; } diff --git a/lib/src/screens/wallet_connect/services/key_service/wallet_connect_key_service.dart b/lib/src/screens/wallet_connect/services/key_service/wallet_connect_key_service.dart index 4d09213d7..53f446be0 100644 --- a/lib/src/screens/wallet_connect/services/key_service/wallet_connect_key_service.dart +++ b/lib/src/screens/wallet_connect/services/key_service/wallet_connect_key_service.dart @@ -18,6 +18,7 @@ class KeyServiceImpl implements WalletConnectKeyService { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return evm!.getPrivateKey(wallet); case WalletType.solana: return solana!.getPrivateKey(wallet); @@ -33,6 +34,7 @@ class KeyServiceImpl implements WalletConnectKeyService { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return evm!.getPublicKey(wallet); case WalletType.solana: return solana!.getPublicKey(wallet); @@ -52,6 +54,7 @@ class KeyServiceImpl implements WalletConnectKeyService { 'eip155:137', 'eip155:8453', 'eip155:42161', + "eip155:4663", ], privateKey: _getPrivateKeyForWallet(wallet), publicKey: _getPublicKeyForWallet(wallet), diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index ff9f41dc0..c0945ab1c 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -120,6 +120,7 @@ abstract class SettingsStoreBase with Store { required this.useBaseScan, required this.useArbiScan, required this.useBscScan, + required this.useRobinhoodScan, required this.usePolygonScan, required this.useTronGrid, required this.useMempoolFeeAPI, @@ -533,6 +534,11 @@ abstract class SettingsStoreBase with Store { reaction((_) => useBscScan, (bool useBscScan) => _sharedPreferences.setBool(PreferencesKey.useBscScan, useBscScan)); + reaction( + (_) => useRobinhoodScan, + (bool useRobinhoodScan) => + _sharedPreferences.setBool(PreferencesKey.useRobinhoodScan, useRobinhoodScan)); + reaction((_) => useTronGrid, (bool useTronGrid) => _sharedPreferences.setBool(PreferencesKey.useTronGrid, useTronGrid)); @@ -978,6 +984,9 @@ abstract class SettingsStoreBase with Store { @observable bool useBscScan; + @observable + bool useRobinhoodScan; + @observable bool useTronGrid; @@ -1144,6 +1153,8 @@ abstract class SettingsStoreBase with Store { return PreferencesKey.currentArbitrumNodeIdKey; case 56: return PreferencesKey.currentBscNodeIdKey; + case 4663: + return PreferencesKey.currentRobinhoodNodeIdKey; default: // Default to Ethereum for unknown chainIds return PreferencesKey.currentEthereumNodeIdKey; @@ -1338,6 +1349,7 @@ abstract class SettingsStoreBase with Store { final useBaseScan = sharedPreferences.getBool(PreferencesKey.useBaseScan) ?? true; final useArbiScan = sharedPreferences.getBool(PreferencesKey.useArbiScan) ?? true; final useBscScan = sharedPreferences.getBool(PreferencesKey.useBscScan) ?? true; + final useRobinhoodScan = sharedPreferences.getBool(PreferencesKey.useRobinhoodScan) ?? true; final useTronGrid = sharedPreferences.getBool(PreferencesKey.useTronGrid) ?? true; final useMempoolFeeAPI = sharedPreferences.getBool(PreferencesKey.useMempoolFeeAPI) ?? true; final useBlinkProtection = sharedPreferences.getBool(PreferencesKey.useBlinkProtection) ?? true; @@ -1402,6 +1414,7 @@ abstract class SettingsStoreBase with Store { final baseNodeId = sharedPreferences.getInt(PreferencesKey.currentBaseNodeIdKey); final arbitrumNodeId = sharedPreferences.getInt(PreferencesKey.currentArbitrumNodeIdKey); final bscNodeId = sharedPreferences.getInt(PreferencesKey.currentBscNodeIdKey); + final robinhoodNodeId = sharedPreferences.getInt(PreferencesKey.currentRobinhoodNodeIdKey); final nanoNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey); final nanoPowNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoPowNodeIdKey); final solanaNodeId = sharedPreferences.getInt(PreferencesKey.currentSolanaNodeIdKey); @@ -1455,6 +1468,8 @@ abstract class SettingsStoreBase with Store { nodeSource.firstWhereOrNull((e) => e.uriRaw == zcashDefaultNodeUri); final bscNode = nodeSource.firstWhereOrNull((e) => e.id == bscNodeId) ?? nodeSource.firstWhereOrNull((e) => e.uriRaw == bscDefaultNodeUri); + final robinhoodNode = nodeSource.firstWhereOrNull((e) => e.id == robinhoodNodeId) ?? + nodeSource.firstWhereOrNull((e) => e.uriRaw == robinhoodDefaultNodeUri); final packageInfo = await PackageInfo.fromPlatform(); final deviceName = await _getDeviceName() ?? ''; @@ -1523,6 +1538,10 @@ abstract class SettingsStoreBase with Store { nodes[WalletType.bsc] = bscNode; } + if (robinhoodNode != null) { + nodes[WalletType.robinhood] = robinhoodNode; + } + if (bitcoinCashElectrumServer != null) { nodes[WalletType.bitcoinCash] = bitcoinCashElectrumServer; } @@ -1725,6 +1744,7 @@ abstract class SettingsStoreBase with Store { useBaseScan: useBaseScan, useArbiScan: useArbiScan, useBscScan: useBscScan, + useRobinhoodScan: useRobinhoodScan, useTronGrid: useTronGrid, useMempoolFeeAPI: useMempoolFeeAPI, useBlinkProtection: useBlinkProtection, @@ -1972,6 +1992,7 @@ abstract class SettingsStoreBase with Store { useBaseScan = sharedPreferences.getBool(PreferencesKey.useBaseScan) ?? true; useArbiScan = sharedPreferences.getBool(PreferencesKey.useArbiScan) ?? true; useBscScan = sharedPreferences.getBool(PreferencesKey.useBscScan) ?? true; + useRobinhoodScan = sharedPreferences.getBool(PreferencesKey.useRobinhoodScan) ?? true; useTronGrid = sharedPreferences.getBool(PreferencesKey.useTronGrid) ?? true; useMempoolFeeAPI = sharedPreferences.getBool(PreferencesKey.useMempoolFeeAPI) ?? true; useBlinkProtection = sharedPreferences.getBool(PreferencesKey.useBlinkProtection) ?? true; @@ -2014,6 +2035,7 @@ abstract class SettingsStoreBase with Store { final baseNodeId = sharedPreferences.getInt(PreferencesKey.currentBaseNodeIdKey); final arbitrumNodeId = sharedPreferences.getInt(PreferencesKey.currentArbitrumNodeIdKey); final bscNodeId = sharedPreferences.getInt(PreferencesKey.currentBscNodeIdKey); + final robinhoodNodeId = sharedPreferences.getInt(PreferencesKey.currentRobinhoodNodeIdKey); final nanoNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey); final solanaNodeId = sharedPreferences.getInt(PreferencesKey.currentSolanaNodeIdKey); final tronNodeId = sharedPreferences.getInt(PreferencesKey.currentTronNodeIdKey); @@ -2031,6 +2053,7 @@ abstract class SettingsStoreBase with Store { final baseNode = await Node.get(baseNodeId ?? -1); final arbitrumNode = await Node.get(arbitrumNodeId ?? -1); final bscNode = await Node.get(bscNodeId ?? -1); + final robinhoodNode = await Node.get(robinhoodNodeId ?? -1); final bitcoinCashNode = await Node.get(bitcoinCashElectrumServerId ?? -1); final nanoNode = await Node.get(nanoNodeId ?? -1); final solanaNode = await Node.get(solanaNodeId ?? -1); @@ -2077,6 +2100,10 @@ abstract class SettingsStoreBase with Store { nodes[WalletType.bsc] = bscNode; } + if (robinhoodNode != null) { + nodes[WalletType.robinhood] = robinhoodNode; + } + if (bitcoinCashNode != null) { nodes[WalletType.bitcoinCash] = bitcoinCashNode; } @@ -2230,6 +2257,7 @@ abstract class SettingsStoreBase with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: final chainId = evm!.getChainIdByWalletType(node.type); final preferenceKey = _getEVMNodePreferenceKey(chainId); await _sharedPreferences.setInt(preferenceKey, node.id); diff --git a/lib/utils/qr_util.dart b/lib/utils/qr_util.dart index f03937c32..ab43544a8 100644 --- a/lib/utils/qr_util.dart +++ b/lib/utils/qr_util.dart @@ -12,6 +12,8 @@ String getQrImage(WalletType type) { return 'assets/images/arbitrum_chain_QR.svg'; case WalletType.bsc: return 'assets/images/bnb_chain_QR.svg'; + case WalletType.robinhood: + return "assets/images/eth_chain_qr.svg"; case WalletType.solana: return 'assets/images/sol_chain_qr.svg'; case WalletType.tron: @@ -55,6 +57,8 @@ String getChainMonoImage(WalletType type) { return 'assets/images/arbitrum_chain_mono.svg'; case WalletType.bsc: return 'assets/images/bnb_chain_mono.svg'; + case WalletType.robinhood: + return "assets/images/robinhood_chain_mono.svg"; case WalletType.solana: return 'assets/images/sol_chain_mono.svg'; case WalletType.tron: diff --git a/lib/utils/token_utilities.dart b/lib/utils/token_utilities.dart index efb7b684d..748485ccf 100644 --- a/lib/utils/token_utilities.dart +++ b/lib/utils/token_utilities.dart @@ -2,7 +2,6 @@ import 'package:cake_wallet/reactions/wallet_connect.dart'; import 'package:cake_wallet/evm/evm.dart'; import 'package:cake_wallet/solana/solana.dart'; import 'package:cake_wallet/tron/tron.dart'; -import 'package:cw_core/cake_hive.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/currency_for_wallet_type.dart'; import 'package:cw_core/erc20_token.dart'; @@ -12,7 +11,6 @@ import "package:cw_core/utils/print_verbose.dart"; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; -import 'package:hive/hive.dart'; class TokenUtilities { static Future> loadAllUniqueEvmTokens() async { @@ -192,6 +190,7 @@ class TokenUtilities { WalletType.base => 8453, WalletType.arbitrum => 42161, WalletType.bsc => 56, + WalletType.robinhood => 4663, _ => 1, }; @@ -298,7 +297,12 @@ class TokenUtilities { // Only check EVM registry for currencies that might be EVM-related final isPotentialEVM = isNativeToken(currency) || (tag != null && - (tag == "ETH" || tag == "POL" || tag == "BASE" || tag == "ARB" || tag == "BSC")); + (tag == "ETH" || + tag == "POL" || + tag == "BASE" || + tag == "ARB" || + tag == "BSC" || + tag == "ROB")); if (isPotentialEVM) { // Try by tag first if available (e.g., 'POL', 'BASE', 'ARB') diff --git a/lib/view_model/advanced_privacy_settings_view_model.dart b/lib/view_model/advanced_privacy_settings_view_model.dart index f8f1ce1d7..03a67c385 100644 --- a/lib/view_model/advanced_privacy_settings_view_model.dart +++ b/lib/view_model/advanced_privacy_settings_view_model.dart @@ -56,6 +56,7 @@ abstract class AdvancedPrivacySettingsViewModelBase with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.solana: case WalletType.tron: case WalletType.zcash: @@ -100,6 +101,7 @@ abstract class AdvancedPrivacySettingsViewModelBase with Store { WalletType.base, WalletType.arbitrum, WalletType.bsc, + WalletType.robinhood, WalletType.tron, WalletType.solana, WalletType.monero, diff --git a/lib/view_model/dashboard/balance_view_model.dart b/lib/view_model/dashboard/balance_view_model.dart index f464076b6..b39580096 100644 --- a/lib/view_model/dashboard/balance_view_model.dart +++ b/lib/view_model/dashboard/balance_view_model.dart @@ -219,6 +219,7 @@ abstract class BalanceViewModelBase with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.solana: case WalletType.tron: return S.current.xmr_full_balance; diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 2cc5ce1d0..061a0d612 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -1300,6 +1300,7 @@ abstract class DashboardViewModelBase with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.solana: case WalletType.nano: case WalletType.banano: diff --git a/lib/view_model/dashboard/home_settings_view_model.dart b/lib/view_model/dashboard/home_settings_view_model.dart index 5039c927b..777af604a 100644 --- a/lib/view_model/dashboard/home_settings_view_model.dart +++ b/lib/view_model/dashboard/home_settings_view_model.dart @@ -194,10 +194,10 @@ abstract class HomeSettingsViewModelBase with Store { return false; } - bool isPotentialScamViaMoralis = await _isPotentialScamTokenViaMoralis( - contractAddress, - getChainNameBasedOnWalletType(_balanceViewModel.wallet.type), - ); + final moralisChainName = evm!.getMoralisChainName(_balanceViewModel.wallet); + + final isPotentialScamViaMoralis = moralisChainName != null && + await _isPotentialScamTokenViaMoralis(contractAddress, moralisChainName); bool isUnverifiedContract = await _isContractUnverified( contractAddress, @@ -221,6 +221,7 @@ abstract class HomeSettingsViewModelBase with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: defaultTokenAddresses = evm!.getDefaultTokenContractAddresses(_balanceViewModel.wallet); break; case WalletType.solana: @@ -262,6 +263,7 @@ abstract class HomeSettingsViewModelBase with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: defaultTokenSymbols = evm!.getDefaultTokenSymbols(_balanceViewModel.wallet); break; case WalletType.solana: diff --git a/lib/view_model/dashboard/transaction_list_item.dart b/lib/view_model/dashboard/transaction_list_item.dart index f72ab6da4..a90c2394e 100644 --- a/lib/view_model/dashboard/transaction_list_item.dart +++ b/lib/view_model/dashboard/transaction_list_item.dart @@ -207,6 +207,7 @@ class TransactionListItem extends ActionListItem with Keyable { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: final asset = assetOfTransaction; final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index 6c95bf614..82e6c873a 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -277,7 +277,8 @@ abstract class ExchangeTradeViewModelBase with Store { _isTokenBelongingToWallet(CryptoCurrency.arbEth) || _isTokenBelongingToWallet(CryptoCurrency.trx) || _isTokenBelongingToWallet(CryptoCurrency.sol) || - _isTokenBelongingToWallet(CryptoCurrency.bnb); + _isTokenBelongingToWallet(CryptoCurrency.bnb) || + _isTokenBelongingToWallet(CryptoCurrency.robEth); if (!canSend) { return 'Wallet currency ${wallet.currency.title} does not match trade from currency ${tradeFrom.title} or is not a supported token for this wallet.'; @@ -346,6 +347,7 @@ abstract class ExchangeTradeViewModelBase with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return _createERC681URI(fromCurrency, inputAddress, amount); case WalletType.solana: return SolanaURI( diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index 52510b4a9..0373f5e24 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -1547,6 +1547,10 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with depositCurrency = CryptoCurrency.bnb; receiveCurrency = CryptoCurrency.xmr; break; + case WalletType.robinhood: + depositCurrency = CryptoCurrency.robEth; + receiveCurrency = CryptoCurrency.xmr; + break; case WalletType.solana: depositCurrency = CryptoCurrency.sol; receiveCurrency = CryptoCurrency.xmr; diff --git a/lib/view_model/node_list/node_create_or_edit_view_model.dart b/lib/view_model/node_list/node_create_or_edit_view_model.dart index 00fb961c1..23fc0117b 100644 --- a/lib/view_model/node_list/node_create_or_edit_view_model.dart +++ b/lib/view_model/node_list/node_create_or_edit_view_model.dart @@ -126,6 +126,7 @@ abstract class NodeCreateOrEditViewModelBase with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.solana: case WalletType.banano: case WalletType.nano: diff --git a/lib/view_model/restore/wallet_restore_from_qr_code.dart b/lib/view_model/restore/wallet_restore_from_qr_code.dart index f1456b9b5..58225c441 100644 --- a/lib/view_model/restore/wallet_restore_from_qr_code.dart +++ b/lib/view_model/restore/wallet_restore_from_qr_code.dart @@ -35,6 +35,7 @@ class WalletRestoreFromQRCode { 'base-wallet': WalletType.base, 'arbitrum-wallet': WalletType.arbitrum, 'bsc-wallet': WalletType.bsc, + "robinhood-wallet": WalletType.robinhood, 'nano-wallet': WalletType.nano, 'nano_wallet': WalletType.nano, 'bitcoincash': WalletType.bitcoinCash, diff --git a/lib/view_model/send/fees_view_model.dart b/lib/view_model/send/fees_view_model.dart index c9fb0b5d5..c062d1d9e 100644 --- a/lib/view_model/send/fees_view_model.dart +++ b/lib/view_model/send/fees_view_model.dart @@ -109,6 +109,7 @@ abstract class FeesViewModelBase extends WalletChangeListenerViewModel with Stor case WalletType.solana: case WalletType.tron: case WalletType.arbitrum: + case WalletType.robinhood: case WalletType.zcash: return false; } @@ -128,8 +129,8 @@ abstract class FeesViewModelBase extends WalletChangeListenerViewModel with Stor wallet.type != WalletType.banano && wallet.type != WalletType.solana && wallet.type != WalletType.tron && - wallet.chainId != - 42161; // Wallet type is generic for all EVM chains, so we need to check the chainId + wallet.chainId != 42161 && + wallet.chainId != 4663; @computed bool get isElectrumWallet => diff --git a/lib/view_model/send/output.dart b/lib/view_model/send/output.dart index 618416b95..566b0ef5c 100644 --- a/lib/view_model/send/output.dart +++ b/lib/view_model/send/output.dart @@ -189,12 +189,14 @@ abstract class OutputBase with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: final isNative = [ CryptoCurrency.eth, CryptoCurrency.maticpoly, CryptoCurrency.baseEth, CryptoCurrency.arbEth, - CryptoCurrency.bnb + CryptoCurrency.bnb, + CryptoCurrency.robEth ].contains(cryptoCurrencyHandler()); final fee = isNative diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 5bed4c39f..07ab72b9b 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -293,6 +293,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.tron: case WalletType.solana: case WalletType.bitcoin: @@ -1273,6 +1274,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor WalletType.solana, WalletType.tron, WalletType.arbitrum, + WalletType.robinhood, WalletType.zcash, ].contains(wallet.type)) { throw Exception('Priority is null for wallet type: ${wallet.type}'); @@ -1311,6 +1313,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return evm!.createEVMTransactionCredentials( outputs, priority: priority, diff --git a/lib/view_model/settings/connection_sync_view_model.dart b/lib/view_model/settings/connection_sync_view_model.dart index 972aacc09..af47ecb61 100644 --- a/lib/view_model/settings/connection_sync_view_model.dart +++ b/lib/view_model/settings/connection_sync_view_model.dart @@ -205,6 +205,9 @@ abstract class ConnectionSyncViewModelBase with Store { @computed bool get useBaseScan => _settingsStore.useBaseScan; + @computed + bool get useRobinhoodScan => _settingsStore.useRobinhoodScan; + @computed bool get useArbiScan => _settingsStore.useArbiScan; @@ -223,6 +226,9 @@ abstract class ConnectionSyncViewModelBase with Store { @computed bool get canUseBaseScan => _wallet.chainId == 8453; + @computed + bool get canUseRobinhoodScan => _wallet.chainId == 4663; + @computed bool get canUseArbiScan => _wallet.chainId == 42161; @@ -271,6 +277,12 @@ abstract class ConnectionSyncViewModelBase with Store { evm!.updateScanProviderUsageState(_wallet, value); } + @action + void setUseRobinhoodScan(bool value) { + _settingsStore.useRobinhoodScan = value; + evm!.updateScanProviderUsageState(_wallet, value); + } + @action void setUseTronGrid(bool value) { _settingsStore.useTronGrid = value; diff --git a/lib/view_model/settings/other_settings_view_model.dart b/lib/view_model/settings/other_settings_view_model.dart index 35fa34ea2..d6d70dc73 100644 --- a/lib/view_model/settings/other_settings_view_model.dart +++ b/lib/view_model/settings/other_settings_view_model.dart @@ -104,6 +104,7 @@ abstract class OtherSettingsViewModelBase with Store { WalletType.solana, WalletType.tron, WalletType.arbitrum, + WalletType.robinhood, ].contains(_wallet.type)); String getDisplayPriority(dynamic priority) { diff --git a/lib/view_model/transaction_details_view_model.dart b/lib/view_model/transaction_details_view_model.dart index df9c72721..df5012f3f 100644 --- a/lib/view_model/transaction_details_view_model.dart +++ b/lib/view_model/transaction_details_view_model.dart @@ -476,6 +476,8 @@ abstract class TransactionDetailsViewModelBase with Store { return "https://arbiscan.io/tx/${txId}"; case WalletType.bsc: return "https://bscscan.com/tx/${txId}"; + case WalletType.robinhood: + return "https://robinhoodchain.blockscout.com/tx/${txId}"; case WalletType.polygon: return "https://polygonscan.com/tx/${txId}"; case WalletType.nano: diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index 42dbcd3ca..136a41235 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -562,6 +562,12 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo "assets/images/usdt_wallet_icon.svg", "assets/images/more_tokens.svg", ]; + case 4663: + return [ + "assets/new-ui/crypto_full_icons/robinhood.svg", + "assets/images/usdg_icon.png", + "assets/images/more_tokens.svg", + ]; default: return [ "assets/new-ui/crypto_full_icons/ethereum.svg", diff --git a/lib/view_model/wallet_keys_view_model.dart b/lib/view_model/wallet_keys_view_model.dart index ce10a269b..87e038f26 100644 --- a/lib/view_model/wallet_keys_view_model.dart +++ b/lib/view_model/wallet_keys_view_model.dart @@ -171,6 +171,7 @@ abstract class WalletKeysViewModelBase with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.solana: case WalletType.tron: items.addAll([ @@ -321,6 +322,8 @@ abstract class WalletKeysViewModelBase with Store { return 'arbitrum-wallet'; case WalletType.bsc: return 'bsc-wallet'; + case WalletType.robinhood: + return "robinhood-wallet"; case WalletType.solana: return 'solana-wallet'; case WalletType.tron: diff --git a/lib/view_model/wallet_new_vm.dart b/lib/view_model/wallet_new_vm.dart index 4d50370f2..66006beb4 100644 --- a/lib/view_model/wallet_new_vm.dart +++ b/lib/view_model/wallet_new_vm.dart @@ -83,6 +83,7 @@ abstract class WalletNewVMBase extends WalletCreationVM with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return evm!.createEVMNewWalletCredentials( name: name, password: walletPassword, diff --git a/lib/view_model/wallet_restore_view_model.dart b/lib/view_model/wallet_restore_view_model.dart index 360cbf116..4f49c7b25 100644 --- a/lib/view_model/wallet_restore_view_model.dart +++ b/lib/view_model/wallet_restore_view_model.dart @@ -54,6 +54,7 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: case WalletType.decred: case WalletType.bitcoin: case WalletType.litecoin: @@ -97,6 +98,7 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { WalletType.base, WalletType.arbitrum, WalletType.bsc, + WalletType.robinhood, WalletType.nano, WalletType.banano, WalletType.solana, @@ -179,6 +181,7 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return evm!.createEVMRestoreWalletFromSeedCredentials( name: name, mnemonic: seed, @@ -288,6 +291,7 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { case WalletType.base: case WalletType.arbitrum: case WalletType.bsc: + case WalletType.robinhood: return evm!.createEVMRestoreWalletFromPrivateKey( name: name, password: password, diff --git a/lib/view_model/wallet_switcher_view_model.dart b/lib/view_model/wallet_switcher_view_model.dart index 4d66e5725..fad34f3b2 100644 --- a/lib/view_model/wallet_switcher_view_model.dart +++ b/lib/view_model/wallet_switcher_view_model.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:cake_wallet/reactions/wallet_connect.dart'; import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/core/wallet_loading_service.dart'; import 'package:cw_core/wallet_base.dart'; @@ -32,13 +31,6 @@ abstract class WalletSwitcherViewModelBase with Store { Future> getWallets(WalletType? walletType) async { final wiList = await WalletInfo.getAll(); if (walletType == null) return wiList; - - // For EVM-compatible wallet types, show all EVM-compatible wallets - // This allows users to switch between any EVM wallet regardless of the specific chain - if (isEVMCompatibleChain(walletType)) { - return wiList.where((wallet) => isEVMCompatibleChain(wallet.type)).toList(); - } - return wiList.where((wallet) => wallet.type == walletType).toList(); } diff --git a/pubspec_base.yaml b/pubspec_base.yaml index af82a421b..71bf305a5 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -287,6 +287,7 @@ flutter: - assets/arbitrum_node_list.yml - assets/zcash_node_list.yml - assets/bsc_node_list.yml + - assets/robinhood_node_list.yml - assets/text/ - assets/faq/ - assets/animation/ diff --git a/res/pictures/balance_card_backgrounds/robinhood.svg b/res/pictures/balance_card_backgrounds/robinhood.svg new file mode 100644 index 000000000..8082ed778 --- /dev/null +++ b/res/pictures/balance_card_backgrounds/robinhood.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/res/pictures/balance_card_icons/robinhood.svg b/res/pictures/balance_card_icons/robinhood.svg new file mode 100644 index 000000000..7f56d1bda --- /dev/null +++ b/res/pictures/balance_card_icons/robinhood.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/chain_icons/robinhood.svg b/res/pictures/card_icons/chain_icons/robinhood.svg new file mode 100644 index 000000000..2a0337d22 --- /dev/null +++ b/res/pictures/card_icons/chain_icons/robinhood.svg @@ -0,0 +1,4 @@ + + + + diff --git a/res/pictures/card_icons/og_icons/rob-og.svg b/res/pictures/card_icons/og_icons/rob-og.svg new file mode 100644 index 000000000..2a0337d22 --- /dev/null +++ b/res/pictures/card_icons/og_icons/rob-og.svg @@ -0,0 +1,4 @@ + + + + diff --git a/res/pictures/card_icons/outline_icons/rob-outline.svg b/res/pictures/card_icons/outline_icons/rob-outline.svg new file mode 100644 index 000000000..d4f523285 --- /dev/null +++ b/res/pictures/card_icons/outline_icons/rob-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/card_icons/symbol_icons/rob-symbol.svg b/res/pictures/card_icons/symbol_icons/rob-symbol.svg new file mode 100644 index 000000000..7f56d1bda --- /dev/null +++ b/res/pictures/card_icons/symbol_icons/rob-symbol.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/chain_badges/robinhood.svg b/res/pictures/chain_badges/robinhood.svg new file mode 100644 index 000000000..7f56d1bda --- /dev/null +++ b/res/pictures/chain_badges/robinhood.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/pictures/crypto_full_icons/robinhood.svg b/res/pictures/crypto_full_icons/robinhood.svg new file mode 100644 index 000000000..2a0337d22 --- /dev/null +++ b/res/pictures/crypto_full_icons/robinhood.svg @@ -0,0 +1,4 @@ + + + + diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 7f80e1f0b..e551b19d0 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -987,6 +987,7 @@ "return_address_desc": "في الحالة النادرة لفشل عملية المبادلة، يمكن لشركائنا ردّ دفعتك تلقائيًا إلى عنوان الاسترداد المُقدَّم.", "return_address_desc_external": "نظرًا لأنك اخترت Send From External، يُرجى تعيين عنوان الاسترداد يدويًا أدناه.", "robinhood_option_description": "اشترِ وحوّل فورًا باستخدام بطاقة الخصم أو حسابك المصرفي أو رصيد Robinhood. الولايات المتحدة الأمريكية فقط.", + "robinhoodscan_history": "تاريخ روبنهود", "rotate_address": "احصل على عنوان جديد", "router_no_route": "لم يتم تعريف مسار لـ ${name}", "salary": "الراتب", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index daec5e533..b29f2ac68 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -987,6 +987,7 @@ "return_address_desc": "В редкия случай на неуспешен суап, нашите партньори могат автоматично да възстановят плащането ви към предоставения адрес за възстановяване.", "return_address_desc_external": "Тъй като избрахте „Send From External“, моля, задайте ръчно адрес за възстановяване по‑долу.", "robinhood_option_description": "Купувайте и прехвърляйте незабавно с дебитна карта, банкова сметка или баланс в Robinhood. Само за САЩ.", + "robinhoodscan_history": "История на Робинхуд", "rotate_address": "Вземете нов адрес", "router_no_route": "Няма дефиниран маршрут за ${name}", "salary": "Заплата", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index c82c45a36..845d1d43d 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -987,6 +987,7 @@ "return_address_desc": "Ve vzácném případě neúspěšného swapu mohou naši partneři automaticky vrátit vaši platbu na zadanou refund adresu.", "return_address_desc_external": "Protože jste zvolili možnost Odeslat z externího zdroje, nastavte níže ručně adresu pro vrácení.", "robinhood_option_description": "Nakupujte a převádějte okamžitě pomocí debetní karty, bankovního účtu nebo zůstatku Robinhood. Pouze v USA.", + "robinhoodscan_history": "Historie Robinhood", "rotate_address": "Získejte novou adresu", "router_no_route": "Pro ${name} není definována žádná trasa", "salary": "Plat", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index fcd55f654..6a8dd526a 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -990,6 +990,7 @@ "return_address_desc": "Im seltenen Fall eines fehlgeschlagenen Swaps können unsere Partner Ihre Zahlung automatisch an die angegebene Rückerstattungsadresse erstatten.", "return_address_desc_external": "Da Sie „Von extern senden“ ausgewählt haben, legen Sie bitte unten manuell eine Erstattungsadresse fest.", "robinhood_option_description": "Kaufen und übertragen Sie sofort mit Ihrer Debitkarte, Ihrem Bankkonto oder Ihrem Robinhood-Guthaben. Nur USA.", + "robinhoodscan_history": "Robinhood-Geschichte", "rotate_address": "Neue Adresse abrufen", "router_no_route": "Keine Route für ${name} definiert", "salary": "Gehalt", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index c9ec1b7df..6cec6c229 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -997,6 +997,7 @@ "return_address_desc": "In the rare case of a failed swap, our partners can automatically refund your payment to the provided refund address.", "return_address_desc_external": "Since you chose Send From External, please set a refund address manually below.", "robinhood_option_description": "Buy and transfer instantly using your debit card, bank account, or Robinhood balance. USA only.", + "robinhoodscan_history": "Robinhood History", "rotate_address": "Get new address", "router_no_route": "No route defined for ${name}", "salary": "Salary", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 62f5a930a..ea6decadd 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -988,6 +988,7 @@ "return_address_desc": "En el caso poco frecuente de que un intercambio falle, nuestros socios pueden reembolsar automáticamente su pago a la dirección de reembolso proporcionada.", "return_address_desc_external": "Como elegiste Enviar desde externo, establece manualmente una dirección de reembolso a continuación.", "robinhood_option_description": "Compra y transfiere al instante con tu tarjeta de débito, cuenta bancaria o saldo de Robinhood. Solo en EE. UU.", + "robinhoodscan_history": "Historia de Robinhood", "rotate_address": "Obtener nueva dirección", "router_no_route": "No se ha definido ninguna ruta para ${name}", "salary": "Salario", diff --git a/res/values/strings_fa.arb b/res/values/strings_fa.arb index 9e0ec0245..cac2a0319 100644 --- a/res/values/strings_fa.arb +++ b/res/values/strings_fa.arb @@ -987,6 +987,7 @@ "return_address_desc": "در موارد نادرِ ناموفق بودن سواپ، شرکای ما می‌توانند پرداخت شما را به‌صورت خودکار به آدرس بازپرداختِ ارائه‌شده بازگردانند.", "return_address_desc_external": "از آنجایی که «ارسال از خارجی» را انتخاب کرده‌اید، لطفاً آدرس بازپرداخت را به‌صورت دستی در زیر تنظیم کنید.", "robinhood_option_description": "با استفاده از کارت نقدی، حساب بانکی یا موجودی Robinhood خود، فوراً خرید و انتقال دهید. فقط در ایالات متحده.", + "robinhoodscan_history": "تاریخچه رابینهود", "rotate_address": "آدرس جدید دریافت کنید", "router_no_route": "هیچ مسیری برای ${name} تعریف نشده است", "salary": "حقوق", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 2e44f9036..031c1df8f 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -987,6 +987,7 @@ "return_address_desc": "Dans le cas rare d'un swap échoué, nos partenaires peuvent automatiquement rembourser votre paiement à l'adresse de remboursement fournie.", "return_address_desc_external": "Puisque vous avez choisi Envoyer depuis une source externe, veuillez définir manuellement une adresse de remboursement ci-dessous.", "robinhood_option_description": "Achetez et transférez instantanément avec votre carte de débit, votre compte bancaire ou votre solde Robinhood. Réservé aux États-Unis.", + "robinhoodscan_history": "Histoire de Robinhood", "rotate_address": "Obtenir une nouvelle adresse", "router_no_route": "Aucune route définie pour ${name}", "salary": "Salaire", diff --git a/res/values/strings_gn.arb b/res/values/strings_gn.arb index 0c7ff9f11..277a7d38c 100644 --- a/res/values/strings_gn.arb +++ b/res/values/strings_gn.arb @@ -990,6 +990,7 @@ "return_address_desc": "Pe káso sa’ietéva peteĩ swap ojavy hag̃uarã, ore irũnguéra ikatu ombojevy hag̃ua automáticamente nde pago pe dirección de reembolso oñeme’ẽvape.", "return_address_desc_external": "Reiporavo rupi Enviar de Externo, ikatúpiko emoĩ peteĩ dirección de reembolso pópe ko’ápe.", "robinhood_option_description": "Ejogua ha embohasa pyaʼe reipuruvo nde tarjeta débito, nde cuenta bancaria térã nde saldo Robinhood. Estados Unidos-pe añoite.", + "robinhoodscan_history": "Robinhood Tembiasakue", "rotate_address": "Ehupyty dirección pyahu", "router_no_route": "Ndaipóri tape jeiporavo hag̃ua ${name} hag̃ua", "salary": "Tembiapo repy", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 981818a46..ecd8851f4 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -989,6 +989,7 @@ "return_address_desc": "A cikin yanayin da ba kasafai ba na musanya da ta gaza, abokan hulɗarmu za su iya mayar da kuɗin biyan ku ta atomatik zuwa adireshin mayar da kuɗi da aka bayar.", "return_address_desc_external": "Tun da ka zaɓi Aika Daga Waje, don Allah ka saita adireshin mayar da kuɗi da hannu a ƙasa.", "robinhood_option_description": "Sayi kuma canja wurin nan take ta amfani da katin debit, asusun banki, ko ma'aunin Robinhood. Amurka kawai.", + "robinhoodscan_history": "Tarihin Robinhood", "rotate_address": "Samu sabon adireshin", "router_no_route": "Ba a ayyana wata hanya don ${name} ba", "salary": "Albashi", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 86624c9b0..55370866c 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -989,6 +989,7 @@ "return_address_desc": "स्वैप विफल होने की दुर्लभ स्थिति में, हमारे साझेदार आपके भुगतान को दिए गए रिफंड पते पर स्वचालित रूप से वापस कर सकते हैं।", "return_address_desc_external": "चूंकि आपने बाहरी स्रोत से भेजें चुना है, कृपया नीचे मैन्युअल रूप से रिफंड पता सेट करें।", "robinhood_option_description": "अपने डेबिट कार्ड, बैंक खाते या Robinhood बैलेंस का उपयोग करके तुरंत खरीदें और ट्रांसफर करें। केवल USA।", + "robinhoodscan_history": "रॉबिनहुड इतिहास", "rotate_address": "नया पता प्राप्त करें", "router_no_route": "${name} के लिए कोई मार्ग निर्धारित नहीं है", "salary": "वेतन", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 76d627115..d229d6f20 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -987,6 +987,7 @@ "return_address_desc": "U rijetkom slučaju neuspjele zamjene, naši partneri mogu automatski vratiti vašu uplatu na navedenu adresu za povrat.", "return_address_desc_external": "Budući da ste odabrali Slanje s vanjskog, u nastavku ručno postavite adresu za povrat.", "robinhood_option_description": "Kupite i prenesite odmah pomoću svoje debitne kartice, bankovnog računa ili Robinhood salda. Samo za SAD.", + "robinhoodscan_history": "Povijest Robinhooda", "rotate_address": "Nađi novu adresu", "router_no_route": "Nije definirana ruta za ${name}", "salary": "Plaća", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index 21dde734e..3d76ae42a 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -987,6 +987,7 @@ "return_address_desc": "Փոխանակման ձախողման հազվագյուտ դեպքում մեր գործընկերները կարող են ավտոմատ կերպով վերադարձնել ձեր վճարումը տրամադրված վերադարձման հասցեին։", "return_address_desc_external": "Քանի որ դուք ընտրել եք «Ուղարկել արտաքինից», խնդրում ենք ստորև ձեռքով նշել վերադարձի հասցեն:", "robinhood_option_description": "Գնեք և փոխանցեք ակնթարթորեն՝ օգտագործելով ձեր դեբետային քարտը, բանկային հաշիվը կամ Robinhood-ի մնացորդը։ Միայն ԱՄՆ-ում։", + "robinhoodscan_history": "Ռոբինհուդի պատմություն", "rotate_address": "Ստացեք նոր հասցե", "router_no_route": "${name}-ի համար երթուղի սահմանված չէ", "salary": "Աշխատավարձ", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 6574a60cb..be9f4f2bf 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -990,6 +990,7 @@ "return_address_desc": "Dalam kasus swap gagal yang jarang terjadi, mitra kami dapat secara otomatis mengembalikan pembayaran Anda ke alamat refund yang diberikan.", "return_address_desc_external": "Karena Anda memilih Kirim dari Eksternal, harap tetapkan alamat pengembalian secara manual di bawah.", "robinhood_option_description": "Beli dan transfer secara instan menggunakan kartu debit, rekening bank, atau saldo Robinhood Anda. Hanya untuk AS.", + "robinhoodscan_history": "Sejarah Robinhood", "rotate_address": "Dapatkan alamat baru", "router_no_route": "Tidak ada rute yang ditentukan untuk ${name}", "salary": "Gaji", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 2d7b7262f..a44cba1b6 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -988,6 +988,7 @@ "return_address_desc": "Nel raro caso di uno swap non riuscito, i nostri partner possono rimborsare automaticamente il pagamento all'indirizzo di rimborso fornito.", "return_address_desc_external": "Poiché hai scelto Invia da esterno, imposta manualmente un indirizzo di rimborso qui sotto.", "robinhood_option_description": "Acquista e trasferisci istantaneamente utilizzando la tua carta di debito, il tuo conto bancario o il saldo Robinhood. Solo negli USA.", + "robinhoodscan_history": "Storia di Robinhood", "rotate_address": "Ottieni un nuovo indirizzo", "router_no_route": "Nessuna rotta definita per ${name}", "salary": "Stipendio", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 65aba10dc..3aa12c694 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -988,6 +988,7 @@ "return_address_desc": "まれにスワップが失敗した場合、当社のパートナーは指定された返金先アドレスへお支払いを自動的に返金できます。", "return_address_desc_external": "「外部から送信」を選択したため、以下で返金先アドレスを手動で設定してください。", "robinhood_option_description": "デビットカード、銀行口座、またはRobinhood残高を使用して、即座に購入して送金できます。米国のみ。", + "robinhoodscan_history": "ロビンフッドの歴史", "rotate_address": "新しい住所を取得する", "router_no_route": "${name} のルートが定義されていません", "salary": "給与", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index ab25aea5d..a02fb214f 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -987,6 +987,7 @@ "return_address_desc": "드물게 스왑이 실패하는 경우, 파트너사가 제공된 환불 주소로 결제 금액을 자동으로 환불할 수 있습니다.", "return_address_desc_external": "외부에서 보내기를 선택하셨으므로 아래에서 환불 주소를 수동으로 설정해 주세요.", "robinhood_option_description": "직불 카드, 은행 계좌 또는 Robinhood 잔액을 사용하여 즉시 구매하고 이체할 수 있습니다. 미국 전용.", + "robinhoodscan_history": "로빈후드의 역사", "rotate_address": "새 주소 받기", "router_no_route": "${name}에 대해 정의된 경로가 없습니다", "salary": "급여", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 91e541138..57a35d5b1 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -987,6 +987,7 @@ "return_address_desc": "လဲလှယ်မှု မအောင်မြင်သည့် ရှားပါးသော အခြေအနေတွင်၊ ကျွန်ုပ်တို့၏ လုပ်ဖော်ကိုင်ဖက်များသည် သင့်ငွေပေးချေမှုကို ပေးထားသော ပြန်အမ်းလိပ်စာသို့ အလိုအလျောက် ပြန်အမ်းပေးနိုင်ပါသည်။", "return_address_desc_external": "Send From External ကို သင်ရွေးချယ်ထားသောကြောင့်၊ ကျေးဇူးပြု၍ အောက်တွင် ပြန်အမ်းရန် လိပ်စာကို ကိုယ်တိုင် သတ်မှတ်ပါ။", "robinhood_option_description": "သင်၏ ဒက်ဘစ်ကဒ်၊ ဘဏ်အကောင့် သို့မဟုတ် Robinhood လက်ကျန်ငွေကို အသုံးပြုပြီး ချက်ချင်း ဝယ်ယူပြီး လွှဲပြောင်းနိုင်သည်။ USA အတွက်သာ။", + "robinhoodscan_history": "Robinhood သမိုင်း", "rotate_address": "လိပ်စာအသစ်ရယူပါ။", "router_no_route": "${name} အတွက် သတ်မှတ်ထားသော လမ်းကြောင်း မရှိပါ", "salary": "လစာ", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index e2ed5ea04..b18b186a7 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -987,6 +987,7 @@ "return_address_desc": "In het zeldzame geval dat de swap mislukt, kunnen onze partners je betaling automatisch terugstorten naar het opgegeven terugbetalingsadres.", "return_address_desc_external": "Omdat je voor Verzenden vanaf extern hebt gekozen, stel hieronder handmatig een terugbetalingsadres in.", "robinhood_option_description": "Koop en zet direct over met je bankpas, bankrekening of Robinhood-saldo. Alleen in de VS.", + "robinhoodscan_history": "Robinhood-geschiedenis", "rotate_address": "Nieuw adres krijgen", "router_no_route": "Geen route gedefinieerd voor ${name}", "salary": "Salaris", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index d874155be..a5a99774e 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -987,6 +987,7 @@ "return_address_desc": "W rzadkich przypadkach nieudanej wymiany nasi partnerzy mogą automatycznie zwrócić Twoją płatność na podany adres zwrotu środków.", "return_address_desc_external": "Ponieważ wybrałeś opcję Wyślij z zewnątrz, ustaw poniżej ręcznie adres zwrotu środków.", "robinhood_option_description": "Kup i natychmiast przelej, używając karty debetowej, konta bankowego lub salda Robinhood. Tylko USA.", + "robinhoodscan_history": "Historia Robinhooda", "rotate_address": "Uzyskaj nowy adres", "router_no_route": "Nie zdefiniowano ścieżki dla ${name}", "salary": "Wynagrodzenie", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 52fd4d042..c314e85c2 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -989,6 +989,7 @@ "return_address_desc": "No caso raro de falha na troca, nossos parceiros podem reembolsar automaticamente seu pagamento para o endereço de reembolso fornecido.", "return_address_desc_external": "Como você escolheu Enviar de Externo, defina manualmente abaixo um endereço de reembolso.", "robinhood_option_description": "Compre e transfira instantaneamente usando seu cartão de débito, conta bancária ou saldo da Robinhood. Apenas nos EUA.", + "robinhoodscan_history": "História Robinhood", "rotate_address": "Obter novo endereço", "router_no_route": "Nenhuma rota definida para ${name}", "salary": "Salário", diff --git a/res/values/strings_pt_BR.arb b/res/values/strings_pt_BR.arb index d27391613..5c8c76da9 100644 --- a/res/values/strings_pt_BR.arb +++ b/res/values/strings_pt_BR.arb @@ -993,6 +993,7 @@ "return_address_desc": "No caso raro de uma falha no swap, nossos parceiros podem reembolsar automaticamente seu pagamento para o endereço de reembolso fornecido.", "return_address_desc_external": "Como você escolheu Enviar de Externo, defina um endereço de reembolso manualmente abaixo.", "robinhood_option_description": "Compre e transfira instantaneamente usando seu cartão de débito, conta bancária ou saldo da Robinhood. Apenas nos EUA.", + "robinhoodscan_history": "História Robinhood", "rotate_address": "Obter novo endereço", "router_no_route": "Nenhuma rota definida para ${name}", "salary": "Salário", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 8d8d39d54..415cf3272 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -988,6 +988,7 @@ "return_address_desc": "В редком случае неудачного обмена наши партнеры могут автоматически вернуть ваш платеж на указанный адрес для возврата.", "return_address_desc_external": "Поскольку вы выбрали вариант «Отправить из внешнего источника», укажите ниже адрес для возврата вручную.", "robinhood_option_description": "Покупайте и переводите мгновенно, используя дебетовую карту, банковский счет или баланс Robinhood. Только для США.", + "robinhoodscan_history": "История Робинхуда", "rotate_address": "Получить новый адрес", "router_no_route": "Маршрут для ${name} не определён", "salary": "Зарплата", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 25f7c0ce2..837ded235 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -987,6 +987,7 @@ "return_address_desc": "ในกรณีที่การสวอปล้มเหลวซึ่งเกิดขึ้นไม่บ่อยนัก พันธมิตรของเราสามารถคืนเงินการชำระเงินของคุณโดยอัตโนมัติไปยังที่อยู่สำหรับการคืนเงินที่ระบุไว้", "return_address_desc_external": "เนื่องจากคุณเลือกส่งจากภายนอก โปรดตั้งค่าที่อยู่สำหรับการคืนเงินด้วยตนเองด้านล่าง", "robinhood_option_description": "ซื้อและโอนทันทีโดยใช้บัตรเดบิต บัญชีธนาคาร หรือยอดคงเหลือ Robinhood ใช้ได้เฉพาะในสหรัฐอเมริกาเท่านั้น", + "robinhoodscan_history": "ประวัติศาสตร์โรบินฮู้ด", "rotate_address": "รับที่อยู่ใหม่", "router_no_route": "ไม่มีเส้นทางที่กำหนดไว้สำหรับ ${name}", "salary": "เงินเดือน", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index d624aafbb..e6a2a3208 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -987,6 +987,7 @@ "return_address_desc": "Sa bihirang pagkakataon ng nabigong swap, maaaring awtomatikong i-refund ng aming mga kasosyo ang iyong bayad sa ibinigay na refund address.", "return_address_desc_external": "Dahil pinili mo ang Send From External, pakitakda nang manu-mano ang refund address sa ibaba.", "robinhood_option_description": "Bumili at maglipat kaagad gamit ang iyong debit card, bank account, o balanse sa Robinhood. USA lang.", + "robinhoodscan_history": "Kasaysayan ng Robinhood", "rotate_address": "Kumuha ng bagong address", "router_no_route": "Walang rutang tinukoy para sa ${name}", "salary": "Suweldo", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index c7adc0d02..543eb97a9 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -987,6 +987,7 @@ "return_address_desc": "Nadiren de olsa başarısız bir takas durumunda, ortaklarımız ödemenizi sağlanan iade adresine otomatik olarak geri gönderebilir.", "return_address_desc_external": "\"Dışarıdan Gönder\" seçeneğini seçtiğiniz için lütfen aşağıda bir iade adresini manuel olarak belirleyin.", "robinhood_option_description": "Banka kartınızı, banka hesabınızı veya Robinhood bakiyenizi kullanarak anında satın alın ve aktarın. Yalnızca ABD'de.", + "robinhoodscan_history": "Robinhood'un Tarihi", "rotate_address": "Yeni adres al", "router_no_route": "${name} için rota tanımlanmadı", "salary": "Maaş", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 268bd88bb..2ea9c2994 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -988,6 +988,7 @@ "return_address_desc": "У рідкісних випадках невдалого обміну наші партнери можуть автоматично повернути ваш платіж на вказану адресу для повернення коштів.", "return_address_desc_external": "Оскільки ви вибрали «Надіслати із зовнішнього джерела», будь ласка, вручну вкажіть нижче адресу для повернення коштів.", "robinhood_option_description": "Купуйте та переказуйте миттєво за допомогою дебетової картки, банківського рахунку або балансу Robinhood. Тільки для США.", + "robinhoodscan_history": "Історія Робінхуд", "rotate_address": "Отримати нову адресу", "router_no_route": "Маршрут для ${name} не визначено", "salary": "Зарплата", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 921c87b1f..1ac8a594d 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -989,6 +989,7 @@ "return_address_desc": "سواپ ناکام ہونے کی نایاب صورت میں، ہمارے شراکت دار آپ کی ادائیگی کو فراہم کردہ ریفنڈ ایڈریس پر خودکار طور پر واپس کر سکتے ہیں۔", "return_address_desc_external": "چونکہ آپ نے بیرونی ذریعے سے بھیجنے کا انتخاب کیا ہے، براہِ کرم نیچے دستی طور پر ریفنڈ ایڈریس سیٹ کریں۔", "robinhood_option_description": "اپنے ڈیبٹ کارڈ، بینک اکاؤنٹ یا Robinhood بیلنس کا استعمال کرتے ہوئے فوری طور پر خریدیں اور منتقل کریں۔ صرف USA کے لیے۔", + "robinhoodscan_history": "رابن ہڈ ہسٹری", "rotate_address": "نیا پتہ حاصل کریں۔", "router_no_route": "${name} کے لیے کوئی روٹ متعین نہیں ہے", "salary": "تنخواہ", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index d060f1fb3..c219bfd1c 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -988,6 +988,7 @@ "return_address_desc": "Trong trường hợp hiếm hoi hoán đổi thất bại, các đối tác của chúng tôi có thể tự động hoàn tiền thanh toán của bạn về địa chỉ hoàn tiền đã cung cấp.", "return_address_desc_external": "Vì bạn đã chọn Gửi từ bên ngoài, vui lòng đặt thủ công địa chỉ hoàn tiền bên dưới.", "robinhood_option_description": "Mua và chuyển ngay lập tức bằng thẻ ghi nợ, tài khoản ngân hàng hoặc số dư Robinhood của bạn. Chỉ dành cho Hoa Kỳ.", + "robinhoodscan_history": "Lịch sử Robinhood", "rotate_address": "Nhận địa chỉ mới", "router_no_route": "Không có tuyến đường nào được xác định cho ${name}", "salary": "Lương", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 5b97c28a1..46bd63c05 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -988,6 +988,7 @@ "return_address_desc": "Nínú ọ̀ràn tí ó ṣọ̀wọ́n tí swap bá kùnà, àwọn alábàáṣiṣẹ́pọ̀ wa lè dá ìsanwó rẹ padà laifọwọ́yì sí àdírẹ́sì agbapada tí a pèsè.", "return_address_desc_external": "Nítorí pé o ti yan Firanṣẹ Látì Ita, jọwọ ṣètò àdírẹ́sì ìpadà owó pẹ̀lú ọwọ́ ní isalẹ.", "robinhood_option_description": "Ra ki o gbe lọ lẹsẹkẹsẹ ní lílo kaadi débítì rẹ, àkàǹtì banki, tàbí ìwọ̀ntúnwọ̀nsì Robinhood. USA nìkan.", + "robinhoodscan_history": "Robinhood History", "rotate_address": "Gba adirẹsi titun", "router_no_route": "Kò sí ọ̀nà tí a ṣàlàyé fún ${name}", "salary": "Owo-oṣù", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 6839eb08b..7df890309 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -987,6 +987,7 @@ "return_address_desc": "在极少数情况下兑换失败,我们的合作伙伴可以自动将您的付款退还至您提供的退款地址。", "return_address_desc_external": "由于您选择“从外部发送”,请在下方手动设置退款地址。", "robinhood_option_description": "使用您的借记卡、银行账户或 Robinhood 余额即可即时购买并转账。仅限美国。", + "robinhoodscan_history": "罗宾汉历史", "rotate_address": "获取新地址", "router_no_route": "未为 ${name} 定义路由", "salary": "薪资", diff --git a/scripts/android/pubspec_gen.sh b/scripts/android/pubspec_gen.sh index 9cf8976d6..a71284b3f 100755 --- a/scripts/android/pubspec_gen.sh +++ b/scripts/android/pubspec_gen.sh @@ -10,7 +10,7 @@ case $APP_ANDROID_TYPE in CONFIG_ARGS="--monero" ;; $CAKEWALLET) - CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --zano --decred --dogecoin --base --zcash --arbitrum --bsc" + CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --zano --decred --dogecoin --base --zcash --arbitrum --bsc --robinhood" ;; esac diff --git a/scripts/ios/app_config.sh b/scripts/ios/app_config.sh index 70577e4da..007ed0d9a 100755 --- a/scripts/ios/app_config.sh +++ b/scripts/ios/app_config.sh @@ -31,7 +31,7 @@ case $APP_IOS_TYPE in ;; $CAKEWALLET) - CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --zano --decred --dogecoin --base --zcash --arbitrum --bsc" + CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --zano --decred --dogecoin --base --zcash --arbitrum --bsc --robinhood" ;; esac diff --git a/scripts/linux/app_config.sh b/scripts/linux/app_config.sh index 050bee6c7..083914782 100755 --- a/scripts/linux/app_config.sh +++ b/scripts/linux/app_config.sh @@ -13,7 +13,7 @@ CONFIG_ARGS="" case $APP_LINUX_TYPE in $CAKEWALLET) - CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --dogecoin --base --arbitrum --bsc --excludeFlutterSecureStorage";; + CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --dogecoin --base --arbitrum --bsc --robinhood --excludeFlutterSecureStorage";; esac cp -rf pubspec_description.yaml pubspec.yaml diff --git a/scripts/macos/app_config.sh b/scripts/macos/app_config.sh index 64ae2dd96..d274de7ae 100755 --- a/scripts/macos/app_config.sh +++ b/scripts/macos/app_config.sh @@ -36,7 +36,7 @@ case $APP_MACOS_TYPE in $MONERO_COM) CONFIG_ARGS="--monero";; $CAKEWALLET) - CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --dogecoin --base --arbitrum --bsc";; + CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --dogecoin --base --arbitrum --bsc --robinhood";; esac cp -rf pubspec_description.yaml pubspec.yaml diff --git a/tool/configure.dart b/tool/configure.dart index 7c7bc8e98..56a6660b0 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -35,8 +35,9 @@ Future main(List args) async { final hasBase = args.contains('${prefix}base'); final hasArbitrum = args.contains('${prefix}arbitrum'); final hasBsc = args.contains('${prefix}bsc'); + final hasRobinhood = args.contains("${prefix}robinhood"); final hasZcash = args.contains('${prefix}zcash'); - final hasEVM = hasEthereum || hasPolygon || hasBase || hasArbitrum || hasBsc; + final hasEVM = hasEthereum || hasPolygon || hasBase || hasArbitrum || hasBsc || hasRobinhood; final excludeFlutterSecureStorage = args.contains('${prefix}excludeFlutterSecureStorage'); await generateBitcoin(hasBitcoin); @@ -71,6 +72,7 @@ Future main(List args) async { hasBase: hasBase, hasArbitrum: hasArbitrum, hasBsc: hasBsc, + hasRobinhood: hasRobinhood, hasZcash: hasZcash, ); await generateWalletTypes( @@ -90,6 +92,7 @@ Future main(List args) async { hasBase: hasBase, hasArbitrum: hasArbitrum, hasBsc: hasBsc, + hasRobinhood: hasRobinhood, hasZcash: hasZcash, ); await injectSecureStorage(!excludeFlutterSecureStorage); @@ -1599,6 +1602,7 @@ abstract class EVM { WalletType? getWalletTypeByChainId(int chainId); String getChainNameByChainId(int chainId); String getTokenNameByChainId(int chainId); + String? getMoralisChainName(WalletBase wallet); // Chain selection methods List getAllChains(); ChainInfo? getCurrentChain(WalletBase wallet); @@ -1849,6 +1853,7 @@ Future generatePubspec({ required bool hasBase, required bool hasArbitrum, required bool hasBsc, + required bool hasRobinhood, required bool hasZcash, }) async { const cwCore = """ @@ -1960,7 +1965,7 @@ Future generatePubspec({ output += '\n$flutterSecureStorage\n'; } - if (hasEthereum || hasPolygon || hasBase || hasArbitrum || hasBsc) { + if (hasEthereum || hasPolygon || hasBase || hasArbitrum || hasBsc || hasRobinhood) { output += '\n$cwEVM'; } @@ -2009,6 +2014,7 @@ Future generateWalletTypes({ required bool hasBase, required bool hasArbitrum, required bool hasBsc, + required bool hasRobinhood, required bool hasZcash, }) async { final walletTypesFile = File(walletTypesPath); @@ -2037,6 +2043,10 @@ Future generateWalletTypes({ outputContent += '\tWalletType.bsc,\n'; } + if (hasRobinhood) { + outputContent += "\tWalletType.robinhood,\n"; + } + if (hasSolana) { outputContent += '\tWalletType.solana,\n'; } diff --git a/tool/utils/secret_key.dart b/tool/utils/secret_key.dart index 6128637df..c3cadec4b 100644 --- a/tool/utils/secret_key.dart +++ b/tool/utils/secret_key.dart @@ -112,6 +112,7 @@ class SecretKey { SecretKey('moralisApiKey', () => ''), SecretKey('nowNodesApiKey', () => ''), SecretKey('blinkApiKey', () => ''), + SecretKey('alchemyApiKey', () => ''), ]; static final solanaSecrets = [