From 9c04c7f2cacd36752c9cbb181bb748f6d84c1d76 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 12 Jun 2025 14:13:45 +0530 Subject: [PATCH 01/46] Localization Update --- lib/l10n/app_localizations.dart | 1353 +++++++++++++++++ lib/l10n/app_localizations_en.dart | 660 ++++++++ lib/l10n/app_localizations_es.dart | 664 ++++++++ lib/l10n/app_localizations_fr.dart | 665 ++++++++ lib/l10n/app_localizations_nl.dart | 667 ++++++++ lib/main.dart | 2 +- lib/modals/account/switch_account.dart | 2 +- lib/modals/onboarding/onboarding.dart | 2 +- lib/modals/profile/edit.dart | 2 +- lib/modals/profile/profile.dart | 2 +- lib/modals/save/save.dart | 2 +- lib/modals/save/share.dart | 2 +- lib/modals/wallet/community_picker.dart | 2 +- lib/modals/wallet/deep_link.dart | 2 +- lib/modals/wallet/pick_sender.dart | 2 +- lib/modals/wallet/voucher_read.dart | 2 +- lib/modals/wallet/voucher_view.dart | 2 +- lib/router/shell.dart | 2 +- lib/screens/about/screen.dart | 2 +- lib/screens/account/screen.dart | 2 +- lib/screens/accounts/screen.android.dart | 2 +- lib/screens/accounts/screen.apple.dart | 2 +- lib/screens/accounts/screen.dart | 2 +- lib/screens/cards/screen.dart | 2 +- lib/screens/deeplink/deep_link.dart | 2 +- lib/screens/landing/account_connected.dart | 2 +- lib/screens/landing/account_recovery.dart | 2 +- lib/screens/landing/screen.dart | 2 +- lib/screens/landing/screen.web.dart | 2 +- .../landing/single_community_screen.dart | 2 +- lib/screens/send/send_details.dart | 2 +- lib/screens/send/send_link_progress.dart | 2 +- lib/screens/send/send_progress.dart | 2 +- lib/screens/send/send_to.dart | 2 +- lib/screens/send/tip_details.dart | 2 +- lib/screens/settings/screen.dart | 2 +- lib/screens/transaction/screen.dart | 2 +- lib/screens/voucher/screen.dart | 2 +- lib/screens/vouchers/screen.dart | 2 +- lib/screens/vouchers/voucher_read.dart | 2 +- lib/screens/vouchers/voucher_row.dart | 2 +- lib/screens/wallet/more_actions_sheet.dart | 2 +- lib/screens/wallet/receive.dart | 2 +- lib/screens/wallet/screen.dart | 2 +- lib/screens/wallet/screen.web.dart | 2 +- lib/screens/wallet/tip_to.dart | 2 +- lib/screens/wallet/transaction_row.dart | 2 +- lib/screens/wallet/wallet_actions.dart | 2 +- lib/screens/wallet/wallet_scroll_view.dart | 2 +- lib/widgets/chip.dart | 2 +- lib/widgets/communities/offline_banner.dart | 2 +- lib/widgets/confirm_modal.dart | 2 +- lib/widgets/nfc_overlay.dart | 2 +- lib/widgets/profile/profile_badge.dart | 2 +- lib/widgets/profile/profile_chip.dart | 2 +- lib/widgets/profile/profile_row.dart | 2 +- lib/widgets/qr/qr_modal.dart | 2 +- lib/widgets/scanner/nfc_modal.dart | 2 +- lib/widgets/text_input_modal.dart | 2 +- lib/widgets/vouchers/amount_input_modal.dart | 2 +- .../webview/connected_webview_send_modal.dart | 2 +- lib/widgets/webview/webview_navigation.dart | 2 +- test/router_extension.dart | 2 +- 63 files changed, 4067 insertions(+), 58 deletions(-) create mode 100644 lib/l10n/app_localizations.dart create mode 100644 lib/l10n/app_localizations_en.dart create mode 100644 lib/l10n/app_localizations_es.dart create mode 100644 lib/l10n/app_localizations_fr.dart create mode 100644 lib/l10n/app_localizations_nl.dart diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart new file mode 100644 index 00000000..d77593c6 --- /dev/null +++ b/lib/l10n/app_localizations.dart @@ -0,0 +1,1353 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'app_localizations_en.dart'; +import 'app_localizations_es.dart'; +import 'app_localizations_fr.dart'; +import 'app_localizations_nl.dart'; + +// ignore_for_file: type=lint + +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. +/// +/// Applications need to include `AppLocalizations.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'l10n/app_localizations.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: AppLocalizations.localizationsDelegates, +/// supportedLocales: AppLocalizations.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the AppLocalizations.supportedLocales +/// property. +abstract class AppLocalizations { + AppLocalizations(String locale) + : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static AppLocalizations? of(BuildContext context) { + return Localizations.of(context, AppLocalizations); + } + + static const LocalizationsDelegate delegate = + _AppLocalizationsDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = + >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [ + Locale('en'), + Locale('es'), + Locale('fr'), + Locale('nl') + ]; + + /// No description provided for @viewContract. + /// + /// In en, this message translates to: + /// **'View Contract'** + String get viewContract; + + /// No description provided for @confirm. + /// + /// In en, this message translates to: + /// **'Confirm'** + String get confirm; + + /// No description provided for @welcomeCitizen. + /// + /// In en, this message translates to: + /// **'Welcome, citizen!'** + String get welcomeCitizen; + + /// No description provided for @aWalletForYourCommunity. + /// + /// In en, this message translates to: + /// **'This is your new wallet, where you can store, send and receive the tokens of your community.'** + String get aWalletForYourCommunity; + + /// No description provided for @createNewAccount. + /// + /// In en, this message translates to: + /// **'Create new Account'** + String get createNewAccount; + + /// No description provided for @scanFromCommunity. + /// + /// In en, this message translates to: + /// **'Scan a QR code from your community'** + String get scanFromCommunity; + + /// No description provided for @or. + /// + /// In en, this message translates to: + /// **'OR'** + String get or; + + /// No description provided for @browseCommunities. + /// + /// In en, this message translates to: + /// **'Browse Communities'** + String get browseCommunities; + + /// No description provided for @recoverfrombackup. + /// + /// In en, this message translates to: + /// **'Recover from backup'** + String get recoverfrombackup; + + /// No description provided for @recoverIndividualAccountFromaPrivatekey. + /// + /// In en, this message translates to: + /// **'Recover Individual Account from a private key'** + String get recoverIndividualAccountFromaPrivatekey; + + /// No description provided for @createNewAccountMsg. + /// + /// In en, this message translates to: + /// **'Create a profile to make it easier for people to send you tokens.'** + String get createNewAccountMsg; + + /// No description provided for @settingsScrApp. + /// + /// In en, this message translates to: + /// **'App'** + String get settingsScrApp; + + /// No description provided for @createaprofile. + /// + /// In en, this message translates to: + /// **'Create a profile'** + String get createaprofile; + + /// No description provided for @edit. + /// + /// In en, this message translates to: + /// **'Edit'** + String get edit; + + /// No description provided for @darkMode. + /// + /// In en, this message translates to: + /// **'Dark mode'** + String get darkMode; + + /// No description provided for @about. + /// + /// In en, this message translates to: + /// **'About'** + String get about; + + /// No description provided for @pushNotifications. + /// + /// In en, this message translates to: + /// **'Push Notifications'** + String get pushNotifications; + + /// No description provided for @inappsounds. + /// + /// In en, this message translates to: + /// **'In-app sounds'** + String get inappsounds; + + /// No description provided for @viewOn. + /// + /// In en, this message translates to: + /// **'View On {name}'** + String viewOn(Object name); + + /// No description provided for @accounts. + /// + /// In en, this message translates to: + /// **'Accounts'** + String get accounts; + + /// No description provided for @account. + /// + /// In en, this message translates to: + /// **'Account'** + String get account; + + /// No description provided for @cards. + /// + /// In en, this message translates to: + /// **'Cards'** + String get cards; + + /// No description provided for @yourContactsWillAppearHere. + /// + /// In en, this message translates to: + /// **'Your contacts will appear here'** + String get yourContactsWillAppearHere; + + /// No description provided for @accountsAndroidBackupsuseAndroid. + /// + /// In en, this message translates to: + /// **'Backups use Android Auto Backup and follow your device\\\'s backup settings automatically.'** + String get accountsAndroidBackupsuseAndroid; + + /// No description provided for @accountsAndroidIfYouInstalltheAppAgain. + /// + /// In en, this message translates to: + /// **'If you install the app again on another device which shares the same Google account, the encrypted backup will be used to restore your accounts.'** + String get accountsAndroidIfYouInstalltheAppAgain; + + /// No description provided for @accountsAndroidYouraccounts. + /// + /// In en, this message translates to: + /// **'Your accounts and your account backups are generated and owned by you.'** + String get accountsAndroidYouraccounts; + + /// No description provided for @accountsAndroidManuallyExported. + /// + /// In en, this message translates to: + /// **'They can be manually exported at any time.'** + String get accountsAndroidManuallyExported; + + /// No description provided for @accountsApYouraccountsarebackedup. + /// + /// In en, this message translates to: + /// **'Your accounts are backed up to your iPhone\\\'s Keychain and follow your backup settings automatically.'** + String get accountsApYouraccountsarebackedup; + + /// No description provided for @accountsApSyncthisiPhone. + /// + /// In en, this message translates to: + /// **'Enabling \"Sync this iPhone\" will ensure that your iPhone\\\'s keychain gets backed up to iCloud.'** + String get accountsApSyncthisiPhone; + + /// No description provided for @accountsApYoucancheck. + /// + /// In en, this message translates to: + /// **'You can check if syncing is enabled in your Settings app by going to: Apple ID > iCloud > Passwords and Keychain.'** + String get accountsApYoucancheck; + + /// No description provided for @accountsApYouraccounts. + /// + /// In en, this message translates to: + /// **'Your accounts and your account backups are generated and owned by you.'** + String get accountsApYouraccounts; + + /// No description provided for @accountsApTheycanbe. + /// + /// In en, this message translates to: + /// **'They can be manually exported at any time.'** + String get accountsApTheycanbe; + + /// No description provided for @initialAddress. + /// + /// In en, this message translates to: + /// **'Initial Address:'** + String get initialAddress; + + /// No description provided for @notifications. + /// + /// In en, this message translates to: + /// **'Notifications'** + String get notifications; + + /// No description provided for @backup. + /// + /// In en, this message translates to: + /// **'Backup'** + String get backup; + + /// No description provided for @dangerZone. + /// + /// In en, this message translates to: + /// **'Danger Zone'** + String get dangerZone; + + /// No description provided for @clearDataAndBackups. + /// + /// In en, this message translates to: + /// **'Clear data & backups'** + String get clearDataAndBackups; + + /// No description provided for @replaceExistingBackup. + /// + /// In en, this message translates to: + /// **'Replace existing backup'** + String get replaceExistingBackup; + + /// No description provided for @replace. + /// + /// In en, this message translates to: + /// **'Replace'** + String get replace; + + /// No description provided for @androidBackupTexlineOne. + /// + /// In en, this message translates to: + /// **'There is already a backup on your Google Drive account from different credentials.'** + String get androidBackupTexlineOne; + + /// No description provided for @androidBackupTexlineTwo. + /// + /// In en, this message translates to: + /// **'Are you sure you want to replace it?'** + String get androidBackupTexlineTwo; + + /// No description provided for @appResetTexlineOne. + /// + /// In en, this message translates to: + /// **'Are you sure you want to delete everything?'** + String get appResetTexlineOne; + + /// No description provided for @appResetTexlineTwo. + /// + /// In en, this message translates to: + /// **'This action cannot be undone.'** + String get appResetTexlineTwo; + + /// No description provided for @delete. + /// + /// In en, this message translates to: + /// **'Delete'** + String get delete; + + /// No description provided for @endToEndEncryption. + /// + /// In en, this message translates to: + /// **'End-to-end encryption'** + String get endToEndEncryption; + + /// No description provided for @endToEndEncryptionSub. + /// + /// In en, this message translates to: + /// **'Backups are always end-to-end encrypted.'** + String get endToEndEncryptionSub; + + /// No description provided for @accountsSubLableOne. + /// + /// In en, this message translates to: + /// **'All your accounts are automatically backed up to your device\'s keychain and synced with your iCloud keychain.'** + String get accountsSubLableOne; + + /// No description provided for @accountsSubLableLastBackUp. + /// + /// In en, this message translates to: + /// **'Your accounts are backed up to your Google Drive account. Last backup: {lastBackup}.'** + String accountsSubLableLastBackUp(Object lastBackup); + + /// No description provided for @accountsSubLableLastBackUpSecond. + /// + /// In en, this message translates to: + /// **'Back up your accounts to your Google Drive account.'** + String get accountsSubLableLastBackUpSecond; + + /// No description provided for @auto. + /// + /// In en, this message translates to: + /// **'auto'** + String get auto; + + /// No description provided for @varsion. + /// + /// In en, this message translates to: + /// **'Version {version} ({buildNumber})'** + String varsion(Object buildNumber, Object version); + + /// No description provided for @transactionDetais. + /// + /// In en, this message translates to: + /// **'Transaction details'** + String get transactionDetais; + + /// No description provided for @transactionID. + /// + /// In en, this message translates to: + /// **'Transaction ID'** + String get transactionID; + + /// No description provided for @date. + /// + /// In en, this message translates to: + /// **'Date'** + String get date; + + /// No description provided for @description. + /// + /// In en, this message translates to: + /// **'Description'** + String get description; + + /// No description provided for @reply. + /// + /// In en, this message translates to: + /// **'Reply'** + String get reply; + + /// No description provided for @sendAgain. + /// + /// In en, this message translates to: + /// **'Send again'** + String get sendAgain; + + /// No description provided for @voucherCreating. + /// + /// In en, this message translates to: + /// **'Creating voucher...'** + String get voucherCreating; + + /// No description provided for @voucherFunding. + /// + /// In en, this message translates to: + /// **'Funding voucher...'** + String get voucherFunding; + + /// No description provided for @voucherRedeemed. + /// + /// In en, this message translates to: + /// **'Voucher redeemed'** + String get voucherRedeemed; + + /// No description provided for @voucherCreated. + /// + /// In en, this message translates to: + /// **'Voucher created'** + String get voucherCreated; + + /// No description provided for @voucherCreateFailed. + /// + /// In en, this message translates to: + /// **'Voucher creation failed'** + String get voucherCreateFailed; + + /// No description provided for @anonymous. + /// + /// In en, this message translates to: + /// **'Anonymous'** + String get anonymous; + + /// No description provided for @minted. + /// + /// In en, this message translates to: + /// **'Minted'** + String get minted; + + /// No description provided for @noDescription. + /// + /// In en, this message translates to: + /// **'no description'** + String get noDescription; + + /// No description provided for @preparingWallet. + /// + /// In en, this message translates to: + /// **'Preparing wallet...'** + String get preparingWallet; + + /// No description provided for @transactions. + /// + /// In en, this message translates to: + /// **'Transaction history'** + String get transactions; + + /// No description provided for @citizenWallet. + /// + /// In en, this message translates to: + /// **'Citizen Wallet'** + String get citizenWallet; + + /// No description provided for @aWlletRorYourCommunity. + /// + /// In en, this message translates to: + /// **'A wallet for your community'** + String get aWlletRorYourCommunity; + + /// No description provided for @openingYourWallet. + /// + /// In en, this message translates to: + /// **'Opening your wallet...'** + String get openingYourWallet; + + /// No description provided for @continueText. + /// + /// In en, this message translates to: + /// **'Continue'** + String get continueText; + + /// No description provided for @copied. + /// + /// In en, this message translates to: + /// **'Copied'** + String get copied; + + /// No description provided for @copyText. + /// + /// In en, this message translates to: + /// **'Copy'** + String get copyText; + + /// No description provided for @backupDate. + /// + /// In en, this message translates to: + /// **'Backup date: '** + String get backupDate; + + /// No description provided for @decryptBackup. + /// + /// In en, this message translates to: + /// **'Decrypt backup'** + String get decryptBackup; + + /// No description provided for @googleDriveAccount. + /// + /// In en, this message translates to: + /// **'Google Drive account: '** + String get googleDriveAccount; + + /// No description provided for @noKeysFoundTryManually. + /// + /// In en, this message translates to: + /// **'No keys found, try entering manually.'** + String get noKeysFoundTryManually; + + /// No description provided for @getEncryptionKeyFromYourPasswordManager. + /// + /// In en, this message translates to: + /// **'Get encryption key from your Password Manager'** + String get getEncryptionKeyFromYourPasswordManager; + + /// No description provided for @invalidKeyEncryptionKey. + /// + /// In en, this message translates to: + /// **'Invalid key encryption key.'** + String get invalidKeyEncryptionKey; + + /// No description provided for @enterEncryptionKeyManually. + /// + /// In en, this message translates to: + /// **'Enter encryption key manually'** + String get enterEncryptionKeyManually; + + /// No description provided for @enterEncryptionKey. + /// + /// In en, this message translates to: + /// **'Enter encryption key'** + String get enterEncryptionKey; + + /// No description provided for @encryptionKey. + /// + /// In en, this message translates to: + /// **'Encryption key'** + String get encryptionKey; + + /// No description provided for @loading. + /// + /// In en, this message translates to: + /// **'Loading'** + String get loading; + + /// No description provided for @joinCommunity. + /// + /// In en, this message translates to: + /// **'Join Community'** + String get joinCommunity; + + /// No description provided for @importText. + /// + /// In en, this message translates to: + /// **'Import'** + String get importText; + + /// No description provided for @selectAccount. + /// + /// In en, this message translates to: + /// **'Select Account'** + String get selectAccount; + + /// No description provided for @hello. + /// + /// In en, this message translates to: + /// **'Hello'** + String get hello; + + /// No description provided for @thisIsYourWallet. + /// + /// In en, this message translates to: + /// **'This is your wallet.'** + String get thisIsYourWallet; + + /// No description provided for @itLivesInTheLinkOfThisPage. + /// + /// In en, this message translates to: + /// **'It lives in the link of this page.'** + String get itLivesInTheLinkOfThisPage; + + /// No description provided for @itIsUniqueToYouAndYourCommunity. + /// + /// In en, this message translates to: + /// **'It is unique to you and your community.'** + String get itIsUniqueToYouAndYourCommunity; + + /// No description provided for @keepYourLink. + /// + /// In en, this message translates to: + /// **'Keep your link private to make sure only you have access to this wallet.'** + String get keepYourLink; + + /// No description provided for @send. + /// + /// In en, this message translates to: + /// **'Send'** + String get send; + + /// No description provided for @sending. + /// + /// In en, this message translates to: + /// **'Sending'** + String get sending; + + /// No description provided for @swipeToMint. + /// + /// In en, this message translates to: + /// **'Swipe to mint'** + String get swipeToMint; + + /// No description provided for @swipeToSend. + /// + /// In en, this message translates to: + /// **'Swipe to send'** + String get swipeToSend; + + /// No description provided for @swipeToConfirm. + /// + /// In en, this message translates to: + /// **'Swipe to confirm'** + String get swipeToConfirm; + + /// No description provided for @receive. + /// + /// In en, this message translates to: + /// **'Receive'** + String get receive; + + /// No description provided for @request. + /// + /// In en, this message translates to: + /// **'Request'** + String get request; + + /// No description provided for @retry. + /// + /// In en, this message translates to: + /// **'Retry'** + String get retry; + + /// No description provided for @searchUserAndAddress. + /// + /// In en, this message translates to: + /// **'Search user or paste address'** + String get searchUserAndAddress; + + /// No description provided for @sendViaLink. + /// + /// In en, this message translates to: + /// **'Send via link'** + String get sendViaLink; + + /// No description provided for @scanQRCode. + /// + /// In en, this message translates to: + /// **'Scan QR Code'** + String get scanQRCode; + + /// No description provided for @sendToNFCTag. + /// + /// In en, this message translates to: + /// **'Send to an NFC tag'** + String get sendToNFCTag; + + /// No description provided for @mint. + /// + /// In en, this message translates to: + /// **'Mint'** + String get mint; + + /// No description provided for @vouchers. + /// + /// In en, this message translates to: + /// **'Vouchers'** + String get vouchers; + + /// No description provided for @noBackupFound. + /// + /// In en, this message translates to: + /// **'No backup found'** + String get noBackupFound; + + /// No description provided for @selectAnotherAccount. + /// + /// In en, this message translates to: + /// **'Select another account'** + String get selectAnotherAccount; + + /// No description provided for @recoverIndividualAccount. + /// + /// In en, this message translates to: + /// **'Recover individual account from a private key'** + String get recoverIndividualAccount; + + /// No description provided for @restoreAllAccountsGoogleDrive. + /// + /// In en, this message translates to: + /// **'Restore all accounts from Google Drive'** + String get restoreAllAccountsGoogleDrive; + + /// No description provided for @infoActionLayoutDescription. + /// + /// In en, this message translates to: + /// **'You will be asked to log in to your Google account. We will only request access to this app\\\'s folder in your Google Drive.'** + String get infoActionLayoutDescription; + + /// No description provided for @connectYourGoogleDriveAccount. + /// + /// In en, this message translates to: + /// **'Connect your Google Drive Account'** + String get connectYourGoogleDriveAccount; + + /// No description provided for @recoverIndividualAccountPrivateKey. + /// + /// In en, this message translates to: + /// **'Recover individual account from a private key'** + String get recoverIndividualAccountPrivateKey; + + /// No description provided for @create. + /// + /// In en, this message translates to: + /// **'Create'** + String get create; + + /// No description provided for @username. + /// + /// In en, this message translates to: + /// **'Username'** + String get username; + + /// No description provided for @enterAUsername. + /// + /// In en, this message translates to: + /// **'Enter a username'** + String get enterAUsername; + + /// No description provided for @pleasePickAUsername. + /// + /// In en, this message translates to: + /// **'Please pick a username.'** + String get pleasePickAUsername; + + /// No description provided for @thisUsernameIsAlreadyTaken. + /// + /// In en, this message translates to: + /// **'This username is already taken.'** + String get thisUsernameIsAlreadyTaken; + + /// No description provided for @name. + /// + /// In en, this message translates to: + /// **'Name'** + String get name; + + /// No description provided for @enterAName. + /// + /// In en, this message translates to: + /// **'Enter a name'** + String get enterAName; + + /// No description provided for @enterDescription. + /// + /// In en, this message translates to: + /// **'Enter a description\n\n\n'** + String get enterDescription; + + /// No description provided for @failedSaveProfile. + /// + /// In en, this message translates to: + /// **'Failed to save profile.'** + String get failedSaveProfile; + + /// No description provided for @fetchingExistingProfile. + /// + /// In en, this message translates to: + /// **'Fetching existing profile...'** + String get fetchingExistingProfile; + + /// No description provided for @uploadingNewProfile. + /// + /// In en, this message translates to: + /// **'Uploading new profile...'** + String get uploadingNewProfile; + + /// No description provided for @almostDone. + /// + /// In en, this message translates to: + /// **'Almost done...'** + String get almostDone; + + /// No description provided for @saving. + /// + /// In en, this message translates to: + /// **'Saving...'** + String get saving; + + /// No description provided for @save. + /// + /// In en, this message translates to: + /// **'Save'** + String get save; + + /// No description provided for @language. + /// + /// In en, this message translates to: + /// **'Language'** + String get language; + + /// No description provided for @saveWallet. + /// + /// In en, this message translates to: + /// **'Save Wallet'** + String get saveWallet; + + /// No description provided for @saveText1. + /// + /// In en, this message translates to: + /// **'Don\'t lose your wallet! Bookmark this page or save its unique address that contains your private key in a safe place.'** + String get saveText1; + + /// No description provided for @gettheapp. + /// + /// In en, this message translates to: + /// **'Alternatively, you can download the Citizen Wallet app and import your wallet there.'** + String get gettheapp; + + /// No description provided for @appstorebadge. + /// + /// In en, this message translates to: + /// **'app store badge'** + String get appstorebadge; + + /// No description provided for @googleplaybadge. + /// + /// In en, this message translates to: + /// **'google play badge'** + String get googleplaybadge; + + /// No description provided for @opentheapp. + /// + /// In en, this message translates to: + /// **'Once installed, you can import your web wallet in the app.'** + String get opentheapp; + + /// No description provided for @open. + /// + /// In en, this message translates to: + /// **'Import in the app'** + String get open; + + /// No description provided for @copyyouruniquewalletURL. + /// + /// In en, this message translates to: + /// **'Copy your unique wallet URL'** + String get copyyouruniquewalletURL; + + /// No description provided for @emailtoyourselfyourwalleturl. + /// + /// In en, this message translates to: + /// **'Email to yourself your wallet url'** + String get emailtoyourselfyourwalleturl; + + /// No description provided for @shareText1. + /// + /// In en, this message translates to: + /// **'Get someone else to scan this QR code.'** + String get shareText1; + + /// No description provided for @shareText2. + /// + /// In en, this message translates to: + /// **'If they don\'t already have one, it will create a new Citizen Wallet on their device.'** + String get shareText2; + + /// No description provided for @editname. + /// + /// In en, this message translates to: + /// **'Edit name'** + String get editname; + + /// No description provided for @export. + /// + /// In en, this message translates to: + /// **'Export'** + String get export; + + /// No description provided for @cancel. + /// + /// In en, this message translates to: + /// **'Cancel'** + String get cancel; + + /// No description provided for @enteraccountname. + /// + /// In en, this message translates to: + /// **'Enter account name'** + String get enteraccountname; + + /// No description provided for @exportAccount. + /// + /// In en, this message translates to: + /// **'Export Account'** + String get exportAccount; + + /// No description provided for @deleteaccount. + /// + /// In en, this message translates to: + /// **'Delete account'** + String get deleteaccount; + + /// No description provided for @deleteaccountMsg1. + /// + /// In en, this message translates to: + /// **'Are you sure you want to delete this account?'** + String get deleteaccountMsg1; + + /// No description provided for @deleteaccountMsg2. + /// + /// In en, this message translates to: + /// **'This action cannot be undone.'** + String get deleteaccountMsg2; + + /// No description provided for @profileText1. + /// + /// In en, this message translates to: + /// **'It looks like you don\'t have a profile yet.'** + String get profileText1; + + /// No description provided for @share. + /// + /// In en, this message translates to: + /// **'Share link'** + String get share; + + /// No description provided for @cancelRefund. + /// + /// In en, this message translates to: + /// **'Cancel & Refund'** + String get cancelRefund; + + /// No description provided for @returnFunds. + /// + /// In en, this message translates to: + /// **'Return Funds'** + String get returnFunds; + + /// No description provided for @returnVoucher. + /// + /// In en, this message translates to: + /// **'Return Voucher'** + String get returnVoucher; + + /// No description provided for @returnVoucherMsg. + /// + /// In en, this message translates to: + /// **'will be returned to your wallet.'** + String get returnVoucherMsg; + + /// No description provided for @deleteVoucher. + /// + /// In en, this message translates to: + /// **'Delete Voucher'** + String get deleteVoucher; + + /// No description provided for @deleteVoucherMsg. + /// + /// In en, this message translates to: + /// **'This will remove the voucher from the list.'** + String get deleteVoucherMsg; + + /// No description provided for @wallet. + /// + /// In en, this message translates to: + /// **'Wallet'** + String get wallet; + + /// No description provided for @voucherAmount. + /// + /// In en, this message translates to: + /// **'Voucher Amount'** + String get voucherAmount; + + /// No description provided for @enteramount. + /// + /// In en, this message translates to: + /// **'Enter amount'** + String get enteramount; + + /// No description provided for @vouchericon. + /// + /// In en, this message translates to: + /// **'voucher icon'** + String get vouchericon; + + /// No description provided for @vouchersMsg. + /// + /// In en, this message translates to: + /// **'Your vouchers will appear here'** + String get vouchersMsg; + + /// No description provided for @createVoucher. + /// + /// In en, this message translates to: + /// **'Create Voucher'** + String get createVoucher; + + /// No description provided for @returnText. + /// + /// In en, this message translates to: + /// **'Return'** + String get returnText; + + /// No description provided for @redeemed. + /// + /// In en, this message translates to: + /// **'redeemed'** + String get redeemed; + + /// No description provided for @issued. + /// + /// In en, this message translates to: + /// **'issued'** + String get issued; + + /// No description provided for @communities. + /// + /// In en, this message translates to: + /// **'Communities'** + String get communities; + + /// No description provided for @invalidlink. + /// + /// In en, this message translates to: + /// **'Invalid link'** + String get invalidlink; + + /// No description provided for @unabltohandlelink. + /// + /// In en, this message translates to: + /// **'Unable to handle link'** + String get unabltohandlelink; + + /// No description provided for @dismiss. + /// + /// In en, this message translates to: + /// **'Dismiss'** + String get dismiss; + + /// No description provided for @to. + /// + /// In en, this message translates to: + /// **'To'** + String get to; + + /// No description provided for @minting. + /// + /// In en, this message translates to: + /// **'Minting'** + String get minting; + + /// No description provided for @externalWallet. + /// + /// In en, this message translates to: + /// **'External Wallet'** + String get externalWallet; + + /// No description provided for @resetQRCode. + /// + /// In en, this message translates to: + /// **'Reset QR Code'** + String get resetQRCode; + + /// No description provided for @amount. + /// + /// In en, this message translates to: + /// **'Amount'** + String get amount; + + /// No description provided for @descriptionMsg. + /// + /// In en, this message translates to: + /// **'Add a description'** + String get descriptionMsg; + + /// No description provided for @clear. + /// + /// In en, this message translates to: + /// **'Clear'** + String get clear; + + /// No description provided for @done. + /// + /// In en, this message translates to: + /// **'Done'** + String get done; + + /// No description provided for @settings. + /// + /// In en, this message translates to: + /// **'Settings'** + String get settings; + + /// No description provided for @sent. + /// + /// In en, this message translates to: + /// **'Sent'** + String get sent; + + /// No description provided for @failedSend. + /// + /// In en, this message translates to: + /// **'Failed to send {currencyName}.'** + String failedSend(Object currencyName); + + /// No description provided for @failedMint. + /// + /// In en, this message translates to: + /// **'Failed to mint {currencyName}.'** + String failedMint(Object currencyName); + + /// No description provided for @onText. + /// + /// In en, this message translates to: + /// **'on'** + String get onText; + + /// No description provided for @invalidQRCode. + /// + /// In en, this message translates to: + /// **'Invalid QR Code'** + String get invalidQRCode; + + /// No description provided for @enterManually. + /// + /// In en, this message translates to: + /// **'Enter Manually'** + String get enterManually; + + /// No description provided for @scanAgain. + /// + /// In en, this message translates to: + /// **'Scan Again'** + String get scanAgain; + + /// No description provided for @max. + /// + /// In en, this message translates to: + /// **'max'** + String get max; + + /// No description provided for @insufficientFunds. + /// + /// In en, this message translates to: + /// **'Insufficient funds.'** + String get insufficientFunds; + + /// No description provided for @currentBalance. + /// + /// In en, this message translates to: + /// **'Current balance: {formattedBalance}'** + String currentBalance(Object formattedBalance); + + /// No description provided for @sendDescription. + /// + /// In en, this message translates to: + /// **'Add a description\n\n\n'** + String get sendDescription; + + /// No description provided for @chooseRecipient. + /// + /// In en, this message translates to: + /// **'Choose Recipient'** + String get chooseRecipient; + + /// No description provided for @createdBy. + /// + /// In en, this message translates to: + /// **'Created by'** + String get createdBy; + + /// No description provided for @redeem. + /// + /// In en, this message translates to: + /// **'Redeem'** + String get redeem; + + /// No description provided for @voucher. + /// + /// In en, this message translates to: + /// **'Voucher'** + String get voucher; + + /// No description provided for @createVoucherText. + /// + /// In en, this message translates to: + /// **'Create a voucher which anyone can redeem for the amount shown above.'** + String get createVoucherText; + + /// No description provided for @emptyBalanceText1. + /// + /// In en, this message translates to: + /// **'This voucher has already been redeemed.'** + String get emptyBalanceText1; + + /// No description provided for @emptyBalanceText2. + /// + /// In en, this message translates to: + /// **'Redeem this voucher to your account.'** + String get emptyBalanceText2; + + /// No description provided for @tapToScan. + /// + /// In en, this message translates to: + /// **'Tap to scan'** + String get tapToScan; + + /// No description provided for @communityCurrentlyOffline. + /// + /// In en, this message translates to: + /// **'Community currently offline'** + String get communityCurrentlyOffline; + + /// No description provided for @topup. + /// + /// In en, this message translates to: + /// **'Top Up'** + String get topup; + + /// No description provided for @close. + /// + /// In en, this message translates to: + /// **'Close'** + String get close; + + /// No description provided for @more. + /// + /// In en, this message translates to: + /// **'More'** + String get more; + + /// No description provided for @start. + /// + /// In en, this message translates to: + /// **'Start'** + String get start; + + /// No description provided for @connecting. + /// + /// In en, this message translates to: + /// **'Connecting'** + String get connecting; + + /// No description provided for @accountNotFound. + /// + /// In en, this message translates to: + /// **'Account not found'** + String get accountNotFound; +} + +class _AppLocalizationsDelegate + extends LocalizationsDelegate { + const _AppLocalizationsDelegate(); + + @override + Future load(Locale locale) { + return SynchronousFuture(lookupAppLocalizations(locale)); + } + + @override + bool isSupported(Locale locale) => + ['en', 'es', 'fr', 'nl'].contains(locale.languageCode); + + @override + bool shouldReload(_AppLocalizationsDelegate old) => false; +} + +AppLocalizations lookupAppLocalizations(Locale locale) { + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'en': + return AppLocalizationsEn(); + case 'es': + return AppLocalizationsEs(); + case 'fr': + return AppLocalizationsFr(); + case 'nl': + return AppLocalizationsNl(); + } + + throw FlutterError( + 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.'); +} diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart new file mode 100644 index 00000000..8960b596 --- /dev/null +++ b/lib/l10n/app_localizations_en.dart @@ -0,0 +1,660 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for English (`en`). +class AppLocalizationsEn extends AppLocalizations { + AppLocalizationsEn([String locale = 'en']) : super(locale); + + @override + String get viewContract => 'View Contract'; + + @override + String get confirm => 'Confirm'; + + @override + String get welcomeCitizen => 'Welcome, citizen!'; + + @override + String get aWalletForYourCommunity => + 'This is your new wallet, where you can store, send and receive the tokens of your community.'; + + @override + String get createNewAccount => 'Create new Account'; + + @override + String get scanFromCommunity => 'Scan a QR code from your community'; + + @override + String get or => 'OR'; + + @override + String get browseCommunities => 'Browse Communities'; + + @override + String get recoverfrombackup => 'Recover from backup'; + + @override + String get recoverIndividualAccountFromaPrivatekey => + 'Recover Individual Account from a private key'; + + @override + String get createNewAccountMsg => + 'Create a profile to make it easier for people to send you tokens.'; + + @override + String get settingsScrApp => 'App'; + + @override + String get createaprofile => 'Create a profile'; + + @override + String get edit => 'Edit'; + + @override + String get darkMode => 'Dark mode'; + + @override + String get about => 'About'; + + @override + String get pushNotifications => 'Push Notifications'; + + @override + String get inappsounds => 'In-app sounds'; + + @override + String viewOn(Object name) { + return 'View On $name'; + } + + @override + String get accounts => 'Accounts'; + + @override + String get account => 'Account'; + + @override + String get cards => 'Cards'; + + @override + String get yourContactsWillAppearHere => 'Your contacts will appear here'; + + @override + String get accountsAndroidBackupsuseAndroid => + 'Backups use Android Auto Backup and follow your device\\\'s backup settings automatically.'; + + @override + String get accountsAndroidIfYouInstalltheAppAgain => + 'If you install the app again on another device which shares the same Google account, the encrypted backup will be used to restore your accounts.'; + + @override + String get accountsAndroidYouraccounts => + 'Your accounts and your account backups are generated and owned by you.'; + + @override + String get accountsAndroidManuallyExported => + 'They can be manually exported at any time.'; + + @override + String get accountsApYouraccountsarebackedup => + 'Your accounts are backed up to your iPhone\\\'s Keychain and follow your backup settings automatically.'; + + @override + String get accountsApSyncthisiPhone => + 'Enabling \"Sync this iPhone\" will ensure that your iPhone\\\'s keychain gets backed up to iCloud.'; + + @override + String get accountsApYoucancheck => + 'You can check if syncing is enabled in your Settings app by going to: Apple ID > iCloud > Passwords and Keychain.'; + + @override + String get accountsApYouraccounts => + 'Your accounts and your account backups are generated and owned by you.'; + + @override + String get accountsApTheycanbe => + 'They can be manually exported at any time.'; + + @override + String get initialAddress => 'Initial Address:'; + + @override + String get notifications => 'Notifications'; + + @override + String get backup => 'Backup'; + + @override + String get dangerZone => 'Danger Zone'; + + @override + String get clearDataAndBackups => 'Clear data & backups'; + + @override + String get replaceExistingBackup => 'Replace existing backup'; + + @override + String get replace => 'Replace'; + + @override + String get androidBackupTexlineOne => + 'There is already a backup on your Google Drive account from different credentials.'; + + @override + String get androidBackupTexlineTwo => 'Are you sure you want to replace it?'; + + @override + String get appResetTexlineOne => + 'Are you sure you want to delete everything?'; + + @override + String get appResetTexlineTwo => 'This action cannot be undone.'; + + @override + String get delete => 'Delete'; + + @override + String get endToEndEncryption => 'End-to-end encryption'; + + @override + String get endToEndEncryptionSub => + 'Backups are always end-to-end encrypted.'; + + @override + String get accountsSubLableOne => + 'All your accounts are automatically backed up to your device\'s keychain and synced with your iCloud keychain.'; + + @override + String accountsSubLableLastBackUp(Object lastBackup) { + return 'Your accounts are backed up to your Google Drive account. Last backup: $lastBackup.'; + } + + @override + String get accountsSubLableLastBackUpSecond => + 'Back up your accounts to your Google Drive account.'; + + @override + String get auto => 'auto'; + + @override + String varsion(Object buildNumber, Object version) { + return 'Version $version ($buildNumber)'; + } + + @override + String get transactionDetais => 'Transaction details'; + + @override + String get transactionID => 'Transaction ID'; + + @override + String get date => 'Date'; + + @override + String get description => 'Description'; + + @override + String get reply => 'Reply'; + + @override + String get sendAgain => 'Send again'; + + @override + String get voucherCreating => 'Creating voucher...'; + + @override + String get voucherFunding => 'Funding voucher...'; + + @override + String get voucherRedeemed => 'Voucher redeemed'; + + @override + String get voucherCreated => 'Voucher created'; + + @override + String get voucherCreateFailed => 'Voucher creation failed'; + + @override + String get anonymous => 'Anonymous'; + + @override + String get minted => 'Minted'; + + @override + String get noDescription => 'no description'; + + @override + String get preparingWallet => 'Preparing wallet...'; + + @override + String get transactions => 'Transaction history'; + + @override + String get citizenWallet => 'Citizen Wallet'; + + @override + String get aWlletRorYourCommunity => 'A wallet for your community'; + + @override + String get openingYourWallet => 'Opening your wallet...'; + + @override + String get continueText => 'Continue'; + + @override + String get copied => 'Copied'; + + @override + String get copyText => 'Copy'; + + @override + String get backupDate => 'Backup date: '; + + @override + String get decryptBackup => 'Decrypt backup'; + + @override + String get googleDriveAccount => 'Google Drive account: '; + + @override + String get noKeysFoundTryManually => 'No keys found, try entering manually.'; + + @override + String get getEncryptionKeyFromYourPasswordManager => + 'Get encryption key from your Password Manager'; + + @override + String get invalidKeyEncryptionKey => 'Invalid key encryption key.'; + + @override + String get enterEncryptionKeyManually => 'Enter encryption key manually'; + + @override + String get enterEncryptionKey => 'Enter encryption key'; + + @override + String get encryptionKey => 'Encryption key'; + + @override + String get loading => 'Loading'; + + @override + String get joinCommunity => 'Join Community'; + + @override + String get importText => 'Import'; + + @override + String get selectAccount => 'Select Account'; + + @override + String get hello => 'Hello'; + + @override + String get thisIsYourWallet => 'This is your wallet.'; + + @override + String get itLivesInTheLinkOfThisPage => 'It lives in the link of this page.'; + + @override + String get itIsUniqueToYouAndYourCommunity => + 'It is unique to you and your community.'; + + @override + String get keepYourLink => + 'Keep your link private to make sure only you have access to this wallet.'; + + @override + String get send => 'Send'; + + @override + String get sending => 'Sending'; + + @override + String get swipeToMint => 'Swipe to mint'; + + @override + String get swipeToSend => 'Swipe to send'; + + @override + String get swipeToConfirm => 'Swipe to confirm'; + + @override + String get receive => 'Receive'; + + @override + String get request => 'Request'; + + @override + String get retry => 'Retry'; + + @override + String get searchUserAndAddress => 'Search user or paste address'; + + @override + String get sendViaLink => 'Send via link'; + + @override + String get scanQRCode => 'Scan QR Code'; + + @override + String get sendToNFCTag => 'Send to an NFC tag'; + + @override + String get mint => 'Mint'; + + @override + String get vouchers => 'Vouchers'; + + @override + String get noBackupFound => 'No backup found'; + + @override + String get selectAnotherAccount => 'Select another account'; + + @override + String get recoverIndividualAccount => + 'Recover individual account from a private key'; + + @override + String get restoreAllAccountsGoogleDrive => + 'Restore all accounts from Google Drive'; + + @override + String get infoActionLayoutDescription => + 'You will be asked to log in to your Google account. We will only request access to this app\\\'s folder in your Google Drive.'; + + @override + String get connectYourGoogleDriveAccount => + 'Connect your Google Drive Account'; + + @override + String get recoverIndividualAccountPrivateKey => + 'Recover individual account from a private key'; + + @override + String get create => 'Create'; + + @override + String get username => 'Username'; + + @override + String get enterAUsername => 'Enter a username'; + + @override + String get pleasePickAUsername => 'Please pick a username.'; + + @override + String get thisUsernameIsAlreadyTaken => 'This username is already taken.'; + + @override + String get name => 'Name'; + + @override + String get enterAName => 'Enter a name'; + + @override + String get enterDescription => 'Enter a description\n\n\n'; + + @override + String get failedSaveProfile => 'Failed to save profile.'; + + @override + String get fetchingExistingProfile => 'Fetching existing profile...'; + + @override + String get uploadingNewProfile => 'Uploading new profile...'; + + @override + String get almostDone => 'Almost done...'; + + @override + String get saving => 'Saving...'; + + @override + String get save => 'Save'; + + @override + String get language => 'Language'; + + @override + String get saveWallet => 'Save Wallet'; + + @override + String get saveText1 => + 'Don\'t lose your wallet! Bookmark this page or save its unique address that contains your private key in a safe place.'; + + @override + String get gettheapp => + 'Alternatively, you can download the Citizen Wallet app and import your wallet there.'; + + @override + String get appstorebadge => 'app store badge'; + + @override + String get googleplaybadge => 'google play badge'; + + @override + String get opentheapp => + 'Once installed, you can import your web wallet in the app.'; + + @override + String get open => 'Import in the app'; + + @override + String get copyyouruniquewalletURL => 'Copy your unique wallet URL'; + + @override + String get emailtoyourselfyourwalleturl => + 'Email to yourself your wallet url'; + + @override + String get shareText1 => 'Get someone else to scan this QR code.'; + + @override + String get shareText2 => + 'If they don\'t already have one, it will create a new Citizen Wallet on their device.'; + + @override + String get editname => 'Edit name'; + + @override + String get export => 'Export'; + + @override + String get cancel => 'Cancel'; + + @override + String get enteraccountname => 'Enter account name'; + + @override + String get exportAccount => 'Export Account'; + + @override + String get deleteaccount => 'Delete account'; + + @override + String get deleteaccountMsg1 => + 'Are you sure you want to delete this account?'; + + @override + String get deleteaccountMsg2 => 'This action cannot be undone.'; + + @override + String get profileText1 => 'It looks like you don\'t have a profile yet.'; + + @override + String get share => 'Share link'; + + @override + String get cancelRefund => 'Cancel & Refund'; + + @override + String get returnFunds => 'Return Funds'; + + @override + String get returnVoucher => 'Return Voucher'; + + @override + String get returnVoucherMsg => 'will be returned to your wallet.'; + + @override + String get deleteVoucher => 'Delete Voucher'; + + @override + String get deleteVoucherMsg => 'This will remove the voucher from the list.'; + + @override + String get wallet => 'Wallet'; + + @override + String get voucherAmount => 'Voucher Amount'; + + @override + String get enteramount => 'Enter amount'; + + @override + String get vouchericon => 'voucher icon'; + + @override + String get vouchersMsg => 'Your vouchers will appear here'; + + @override + String get createVoucher => 'Create Voucher'; + + @override + String get returnText => 'Return'; + + @override + String get redeemed => 'redeemed'; + + @override + String get issued => 'issued'; + + @override + String get communities => 'Communities'; + + @override + String get invalidlink => 'Invalid link'; + + @override + String get unabltohandlelink => 'Unable to handle link'; + + @override + String get dismiss => 'Dismiss'; + + @override + String get to => 'To'; + + @override + String get minting => 'Minting'; + + @override + String get externalWallet => 'External Wallet'; + + @override + String get resetQRCode => 'Reset QR Code'; + + @override + String get amount => 'Amount'; + + @override + String get descriptionMsg => 'Add a description'; + + @override + String get clear => 'Clear'; + + @override + String get done => 'Done'; + + @override + String get settings => 'Settings'; + + @override + String get sent => 'Sent'; + + @override + String failedSend(Object currencyName) { + return 'Failed to send $currencyName.'; + } + + @override + String failedMint(Object currencyName) { + return 'Failed to mint $currencyName.'; + } + + @override + String get onText => 'on'; + + @override + String get invalidQRCode => 'Invalid QR Code'; + + @override + String get enterManually => 'Enter Manually'; + + @override + String get scanAgain => 'Scan Again'; + + @override + String get max => 'max'; + + @override + String get insufficientFunds => 'Insufficient funds.'; + + @override + String currentBalance(Object formattedBalance) { + return 'Current balance: $formattedBalance'; + } + + @override + String get sendDescription => 'Add a description\n\n\n'; + + @override + String get chooseRecipient => 'Choose Recipient'; + + @override + String get createdBy => 'Created by'; + + @override + String get redeem => 'Redeem'; + + @override + String get voucher => 'Voucher'; + + @override + String get createVoucherText => + 'Create a voucher which anyone can redeem for the amount shown above.'; + + @override + String get emptyBalanceText1 => 'This voucher has already been redeemed.'; + + @override + String get emptyBalanceText2 => 'Redeem this voucher to your account.'; + + @override + String get tapToScan => 'Tap to scan'; + + @override + String get communityCurrentlyOffline => 'Community currently offline'; + + @override + String get topup => 'Top Up'; + + @override + String get close => 'Close'; + + @override + String get more => 'More'; + + @override + String get start => 'Start'; + + @override + String get connecting => 'Connecting'; + + @override + String get accountNotFound => 'Account not found'; +} diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart new file mode 100644 index 00000000..1eb75f3f --- /dev/null +++ b/lib/l10n/app_localizations_es.dart @@ -0,0 +1,664 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Spanish Castilian (`es`). +class AppLocalizationsEs extends AppLocalizations { + AppLocalizationsEs([String locale = 'es']) : super(locale); + + @override + String get viewContract => 'Ver contrato'; + + @override + String get confirm => 'Confirmar'; + + @override + String get welcomeCitizen => '¡Bienvenido, ciudadano!'; + + @override + String get aWalletForYourCommunity => + 'Esta es tu nueva billetera, donde puedes almacenar, enviar y recibir los tokens de tu comunidad.'; + + @override + String get createNewAccount => 'Crear nueva cuenta'; + + @override + String get scanFromCommunity => 'Escanea un código QR de tu comunidad'; + + @override + String get or => 'O'; + + @override + String get browseCommunities => 'Explorar comunidades'; + + @override + String get recoverfrombackup => 'Recuperar desde copia de seguridad'; + + @override + String get recoverIndividualAccountFromaPrivatekey => + 'Recuperar cuenta individual desde una clave privada'; + + @override + String get createNewAccountMsg => + 'Crea un perfil para facilitar que las personas te envíen tokens.'; + + @override + String get settingsScrApp => 'Aplicación'; + + @override + String get createaprofile => 'Crear un perfil'; + + @override + String get edit => 'Editar'; + + @override + String get darkMode => 'Modo oscuro'; + + @override + String get about => 'Acerca de'; + + @override + String get pushNotifications => 'Notificaciones push'; + + @override + String get inappsounds => 'Sonidos en la aplicación'; + + @override + String viewOn(Object name) { + return 'Ver en $name'; + } + + @override + String get accounts => 'Cuentas'; + + @override + String get account => 'Cuenta'; + + @override + String get cards => 'Tarjetas'; + + @override + String get yourContactsWillAppearHere => 'Tus contactos aparecerán aquí'; + + @override + String get accountsAndroidBackupsuseAndroid => + 'Las copias de seguridad usan la copia automática de Android y siguen la configuración de respaldo de tu dispositivo automáticamente.'; + + @override + String get accountsAndroidIfYouInstalltheAppAgain => + 'Si instalas la aplicación nuevamente en otro dispositivo que comparta la misma cuenta de Google, se usará la copia de seguridad cifrada para restaurar tus cuentas.'; + + @override + String get accountsAndroidYouraccounts => + 'Tus cuentas y las copias de seguridad de tus cuentas son generadas y poseídas por ti.'; + + @override + String get accountsAndroidManuallyExported => + 'Pueden ser exportadas manualmente en cualquier momento.'; + + @override + String get accountsApYouraccountsarebackedup => + 'Tus cuentas están respaldadas en el llavero de tu iPhone y siguen tu configuración de respaldo automáticamente.'; + + @override + String get accountsApSyncthisiPhone => + 'Habilitar \"Sincronizar este iPhone\" asegurará que el llavero de tu iPhone se respalde en iCloud.'; + + @override + String get accountsApYoucancheck => + 'Puedes verificar si la sincronización está habilitada en la aplicación Configuración yendo a: ID de Apple > iCloud > Contraseñas y Llavero.'; + + @override + String get accountsApYouraccounts => + 'Tus cuentas y las copias de seguridad de tus cuentas son generadas y poseídas por ti.'; + + @override + String get accountsApTheycanbe => + 'Pueden ser exportadas manualmente en cualquier momento.'; + + @override + String get initialAddress => 'Dirección inicial:'; + + @override + String get notifications => 'Notificaciones'; + + @override + String get backup => 'Copia de seguridad'; + + @override + String get dangerZone => 'Zona de peligro'; + + @override + String get clearDataAndBackups => 'Borrar datos y copias de seguridad'; + + @override + String get replaceExistingBackup => 'Reemplazar copia de seguridad existente'; + + @override + String get replace => 'Reemplazar'; + + @override + String get androidBackupTexlineOne => + 'Ya existe una copia de seguridad en tu cuenta de Google Drive con diferentes credenciales.'; + + @override + String get androidBackupTexlineTwo => + '¿Estás seguro de que quieres reemplazarla?'; + + @override + String get appResetTexlineOne => '¿Estás seguro de que quieres borrar todo?'; + + @override + String get appResetTexlineTwo => 'Esta acción no se puede deshacer.'; + + @override + String get delete => 'Eliminar'; + + @override + String get endToEndEncryption => 'Cifrado de extremo a extremo'; + + @override + String get endToEndEncryptionSub => + 'Las copias de seguridad siempre están cifradas de extremo a extremo.'; + + @override + String get accountsSubLableOne => + 'Todas tus cuentas se respaldan automáticamente en el llavero de tu dispositivo y se sincronizan con tu llavero de iCloud.'; + + @override + String accountsSubLableLastBackUp(Object lastBackup) { + return 'Tus cuentas están respaldadas en tu cuenta de Google Drive. Última copia de seguridad: $lastBackup.'; + } + + @override + String get accountsSubLableLastBackUpSecond => + 'Respalda tus cuentas en tu cuenta de Google Drive.'; + + @override + String get auto => 'automático'; + + @override + String varsion(Object buildNumber, Object version) { + return 'Versión $version ($buildNumber)'; + } + + @override + String get transactionDetais => 'Detalles de la transacción'; + + @override + String get transactionID => 'ID de la transacción'; + + @override + String get date => 'Fecha'; + + @override + String get description => 'Descripción'; + + @override + String get reply => 'Responder'; + + @override + String get sendAgain => 'Enviar de nuevo'; + + @override + String get voucherCreating => 'Creando vale...'; + + @override + String get voucherFunding => 'Financiando vale...'; + + @override + String get voucherRedeemed => 'Vale canjeado'; + + @override + String get voucherCreated => 'Vale creado'; + + @override + String get voucherCreateFailed => 'Falló la creación del vale'; + + @override + String get anonymous => 'Anónimo'; + + @override + String get minted => 'Acuñado'; + + @override + String get noDescription => 'sin descripción'; + + @override + String get preparingWallet => 'Preparando billetera...'; + + @override + String get transactions => 'Historial de transacciones'; + + @override + String get citizenWallet => 'Billetera Ciudadana'; + + @override + String get aWlletRorYourCommunity => 'Una billetera para tu comunidad'; + + @override + String get openingYourWallet => 'Abriendo tu billetera...'; + + @override + String get continueText => 'Continuar'; + + @override + String get copied => 'Copiado'; + + @override + String get copyText => 'Copiar'; + + @override + String get backupDate => 'Fecha de copia de seguridad: '; + + @override + String get decryptBackup => 'Descifrar copia de seguridad'; + + @override + String get googleDriveAccount => 'Cuenta de Google Drive: '; + + @override + String get noKeysFoundTryManually => + 'No se encontraron claves, intenta ingresar manualmente.'; + + @override + String get getEncryptionKeyFromYourPasswordManager => + 'Obtén la clave de cifrado desde tu administrador de contraseñas'; + + @override + String get invalidKeyEncryptionKey => 'Clave de cifrado inválida.'; + + @override + String get enterEncryptionKeyManually => + 'Ingresa la clave de cifrado manualmente'; + + @override + String get enterEncryptionKey => 'Ingresa la clave de cifrado'; + + @override + String get encryptionKey => 'Clave de cifrado'; + + @override + String get loading => 'Cargando'; + + @override + String get joinCommunity => 'Unirse a la comunidad'; + + @override + String get importText => 'Importar'; + + @override + String get selectAccount => 'Seleccionar cuenta'; + + @override + String get hello => 'Hola'; + + @override + String get thisIsYourWallet => 'Esta es tu billetera.'; + + @override + String get itLivesInTheLinkOfThisPage => 'Vive en el enlace de esta página.'; + + @override + String get itIsUniqueToYouAndYourCommunity => + 'Es único para ti y tu comunidad.'; + + @override + String get keepYourLink => + 'Mantén tu enlace privado para asegurarte de que solo tú tengas acceso a esta billetera.'; + + @override + String get send => 'Enviar'; + + @override + String get sending => 'Enviando'; + + @override + String get swipeToMint => 'Desliza para acuñar'; + + @override + String get swipeToSend => 'Desliza para enviar'; + + @override + String get swipeToConfirm => 'Desliza para confirmar'; + + @override + String get receive => 'Recibir'; + + @override + String get request => 'Solicitar'; + + @override + String get retry => 'Reintentar'; + + @override + String get searchUserAndAddress => 'Busca un usuario o pega una dirección'; + + @override + String get sendViaLink => 'Enviar por enlace'; + + @override + String get scanQRCode => 'Escanear código QR'; + + @override + String get sendToNFCTag => 'Enviar a una etiqueta NFC'; + + @override + String get mint => 'Acuñar'; + + @override + String get vouchers => 'Vales'; + + @override + String get noBackupFound => 'No se encontró copia de seguridad'; + + @override + String get selectAnotherAccount => 'Seleccionar otra cuenta'; + + @override + String get recoverIndividualAccount => + 'Recuperar cuenta individual desde una clave privada'; + + @override + String get restoreAllAccountsGoogleDrive => + 'Restaurar todas las cuentas desde Google Drive'; + + @override + String get infoActionLayoutDescription => + 'Se te pedirá que inicies sesión en tu cuenta de Google. Solo solicitaremos acceso a la carpeta de esta aplicación en tu Google Drive.'; + + @override + String get connectYourGoogleDriveAccount => + 'Conecta tu cuenta de Google Drive'; + + @override + String get recoverIndividualAccountPrivateKey => + 'Recuperar cuenta individual desde una clave privada'; + + @override + String get create => 'Crear'; + + @override + String get username => 'Nombre de usuario'; + + @override + String get enterAUsername => 'Ingresa un nombre de usuario'; + + @override + String get pleasePickAUsername => 'Por favor, elige un nombre de usuario.'; + + @override + String get thisUsernameIsAlreadyTaken => + 'Este nombre de usuario ya está tomado.'; + + @override + String get name => 'Nombre'; + + @override + String get enterAName => 'Ingresa un nombre'; + + @override + String get enterDescription => 'Ingresa una descripción\n\n\n'; + + @override + String get failedSaveProfile => 'No se pudo guardar el perfil.'; + + @override + String get fetchingExistingProfile => 'Obteniendo perfil existente...'; + + @override + String get uploadingNewProfile => 'Subiendo nuevo perfil...'; + + @override + String get almostDone => 'Casi listo...'; + + @override + String get saving => 'Guardando...'; + + @override + String get save => 'Guardar'; + + @override + String get language => 'Idioma'; + + @override + String get saveWallet => 'Guardar billetera'; + + @override + String get saveText1 => + '¡No pierdas tu billetera! Marca esta página como favorita o guarda su dirección única que contiene tu clave privada en un lugar seguro.'; + + @override + String get gettheapp => + 'Alternativamente, puedes descargar la aplicación Citizen Wallet e importar tu billetera allí.'; + + @override + String get appstorebadge => 'insignia de la tienda de aplicaciones'; + + @override + String get googleplaybadge => 'insignia de Google Play'; + + @override + String get opentheapp => + 'Una vez instalada, puedes importar tu billetera web en la aplicación.'; + + @override + String get open => 'Importar en la aplicación'; + + @override + String get copyyouruniquewalletURL => 'Copia la URL única de tu billetera'; + + @override + String get emailtoyourselfyourwalleturl => + 'Envía por correo a ti mismo la URL de tu billetera'; + + @override + String get shareText1 => 'Pide a alguien más que escanee este código QR.'; + + @override + String get shareText2 => + 'Si no tienen una, se creará una nueva Billetera Ciudadana en su dispositivo.'; + + @override + String get editname => 'Editar nombre'; + + @override + String get export => 'Exportar'; + + @override + String get cancel => 'Cancelar'; + + @override + String get enteraccountname => 'Ingresa el nombre de la cuenta'; + + @override + String get exportAccount => 'Exportar cuenta'; + + @override + String get deleteaccount => 'Eliminar cuenta'; + + @override + String get deleteaccountMsg1 => + '¿Estás seguro de que quieres eliminar esta cuenta?'; + + @override + String get deleteaccountMsg2 => 'Esta acción no se puede deshacer.'; + + @override + String get profileText1 => 'Parece que aún no tienes un perfil.'; + + @override + String get share => 'Compartir enlace'; + + @override + String get cancelRefund => 'Cancelar y reembolsar'; + + @override + String get returnFunds => 'Devolver fondos'; + + @override + String get returnVoucher => 'Devolver vale'; + + @override + String get returnVoucherMsg => 'será devuelto a tu billetera.'; + + @override + String get deleteVoucher => 'Eliminar vale'; + + @override + String get deleteVoucherMsg => 'Esto eliminará el vale de la lista.'; + + @override + String get wallet => 'Billetera'; + + @override + String get voucherAmount => 'Monto del vale'; + + @override + String get enteramount => 'Ingresa el monto'; + + @override + String get vouchericon => 'ícono de vale'; + + @override + String get vouchersMsg => 'Tus vales aparecerán aquí'; + + @override + String get createVoucher => 'Crear vale'; + + @override + String get returnText => 'Devolver'; + + @override + String get redeemed => 'canjeado'; + + @override + String get issued => 'emitido'; + + @override + String get communities => 'Comunidades'; + + @override + String get invalidlink => 'Enlace inválido'; + + @override + String get unabltohandlelink => 'No se puede manejar el enlace'; + + @override + String get dismiss => 'Descartar'; + + @override + String get to => 'A'; + + @override + String get minting => 'Acuñando'; + + @override + String get externalWallet => 'Billetera externa'; + + @override + String get resetQRCode => 'Restablecer código QR'; + + @override + String get amount => 'Monto'; + + @override + String get descriptionMsg => 'Agregar una descripción'; + + @override + String get clear => 'Borrar'; + + @override + String get done => 'Hecho'; + + @override + String get settings => 'Configuraciones'; + + @override + String get sent => 'Enviado'; + + @override + String failedSend(Object currencyName) { + return 'No se pudo enviar $currencyName.'; + } + + @override + String failedMint(Object currencyName) { + return 'No se pudo acuñar $currencyName.'; + } + + @override + String get onText => 'en'; + + @override + String get invalidQRCode => 'Código QR inválido'; + + @override + String get enterManually => 'Ingresar manualmente'; + + @override + String get scanAgain => 'Escanear de nuevo'; + + @override + String get max => 'máx'; + + @override + String get insufficientFunds => 'Fondos insuficientes.'; + + @override + String currentBalance(Object formattedBalance) { + return 'Saldo actual: $formattedBalance'; + } + + @override + String get sendDescription => 'Agregar una descripción\n\n\n'; + + @override + String get chooseRecipient => 'Elegir destinatario'; + + @override + String get createdBy => 'Creado por'; + + @override + String get redeem => 'Canjear'; + + @override + String get voucher => 'Vale'; + + @override + String get createVoucherText => + 'Crea un vale que cualquiera pueda canjear por el monto mostrado arriba.'; + + @override + String get emptyBalanceText1 => 'Este vale ya ha sido canjeado.'; + + @override + String get emptyBalanceText2 => 'Canjea este vale en tu cuenta.'; + + @override + String get tapToScan => 'Toca para escanear'; + + @override + String get communityCurrentlyOffline => + 'Comunidad actualmente fuera de línea'; + + @override + String get topup => 'Recargar'; + + @override + String get close => 'Cerrar'; + + @override + String get more => 'Más'; + + @override + String get start => 'Iniciar'; + + @override + String get connecting => 'Conectando'; + + @override + String get accountNotFound => 'Cuenta no encontrada'; +} diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart new file mode 100644 index 00000000..8b441a7b --- /dev/null +++ b/lib/l10n/app_localizations_fr.dart @@ -0,0 +1,665 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for French (`fr`). +class AppLocalizationsFr extends AppLocalizations { + AppLocalizationsFr([String locale = 'fr']) : super(locale); + + @override + String get viewContract => 'Voir le contrat'; + + @override + String get confirm => 'Confirmer'; + + @override + String get welcomeCitizen => 'Welcome, citizen!'; + + @override + String get aWalletForYourCommunity => + 'Ceci est votre nouveau portefeuille, où vous pouvez stocker, envoyer et recevoir les jetons de votre communauté.'; + + @override + String get createNewAccount => 'Créer un nouveau compte'; + + @override + String get scanFromCommunity => 'Scannez un code QR de votre communauté'; + + @override + String get or => 'OU'; + + @override + String get browseCommunities => 'Parcourir les communautés'; + + @override + String get recoverfrombackup => 'Récupérer à partir d\'une sauvegarde'; + + @override + String get recoverIndividualAccountFromaPrivatekey => + 'Récupérer un compte individuel à partir d\'une clé privée'; + + @override + String get createNewAccountMsg => + 'Créez un profil pour faciliter l\'envoi de jetons vers vous.'; + + @override + String get settingsScrApp => 'Application'; + + @override + String get createaprofile => 'Créer un profil'; + + @override + String get edit => 'Modifier'; + + @override + String get darkMode => 'Mode sombre'; + + @override + String get about => 'À propos'; + + @override + String get pushNotifications => 'Notifications push'; + + @override + String get inappsounds => 'Sons dans l\'application'; + + @override + String viewOn(Object name) { + return 'Voir sur $name'; + } + + @override + String get accounts => 'Comptes'; + + @override + String get account => 'Compte'; + + @override + String get cards => 'Cartes'; + + @override + String get yourContactsWillAppearHere => 'Vos contacts apparaîtront ici'; + + @override + String get accountsAndroidBackupsuseAndroid => + 'Les sauvegardes utilisent la sauvegarde automatique Android et suivent les paramètres de sauvegarde de votre appareil automatiquement.'; + + @override + String get accountsAndroidIfYouInstalltheAppAgain => + 'Si vous installez l\'application de nouveau sur un autre appareil utilisant le même compte Google, la sauvegarde chiffrée sera utilisée pour restaurer vos comptes.'; + + @override + String get accountsAndroidYouraccounts => + 'Vos comptes et les sauvegardes de vos comptes vous appartiennent.'; + + @override + String get accountsAndroidManuallyExported => + 'Ils peuvent être exportés manuellement à tout moment.'; + + @override + String get accountsApYouraccountsarebackedup => + 'Vos comptes sont sauvegardés dans le trousseau de votre iPhone et suivent vos paramètres de sauvegarde automatiquement.'; + + @override + String get accountsApSyncthisiPhone => + 'Activer \"Synchroniser cet iPhone\" garantira que le trousseau de votre iPhone soit sauvegardé sur iCloud.'; + + @override + String get accountsApYoucancheck => + 'Vous pouvez vérifier si la synchronisation est activée dans votre application Paramètres en allant à : Identifiant Apple > iCloud > Mots de passe et trousseau.'; + + @override + String get accountsApYouraccounts => + 'Vos comptes et les sauvegardes de vos comptes sont générés et vous appartiennent.'; + + @override + String get accountsApTheycanbe => + 'Ils peuvent être exportés manuellement à tout moment.'; + + @override + String get initialAddress => 'Adresse initiale'; + + @override + String get notifications => 'Notifications'; + + @override + String get backup => 'Sauvegarde'; + + @override + String get dangerZone => 'Zone de danger'; + + @override + String get clearDataAndBackups => 'Effacer les données et les sauvegardes'; + + @override + String get replaceExistingBackup => 'Remplacer la sauvegarde existante'; + + @override + String get replace => 'Remplacer'; + + @override + String get androidBackupTexlineOne => + 'Il existe déjà une sauvegarde dans votre compte Google Drive à partir de différents identifiants.'; + + @override + String get androidBackupTexlineTwo => + 'Êtes-vous sûr de vouloir la remplacer?'; + + @override + String get appResetTexlineOne => 'Êtes-vous sûr de vouloir tout supprimer?'; + + @override + String get appResetTexlineTwo => 'Cette action ne peut pas être annulée.'; + + @override + String get delete => 'Supprimer'; + + @override + String get endToEndEncryption => 'Chiffrement de bout en bout'; + + @override + String get endToEndEncryptionSub => + 'Les sauvegardes sont toujours chiffrées de bout en bout.'; + + @override + String get accountsSubLableOne => + 'Tous vos comptes sont automatiquement sauvegardés dans le trousseau de votre appareil et synchronisés avec votre trousseau iCloud.'; + + @override + String accountsSubLableLastBackUp(Object lastBackup) { + return 'Vos comptes sont sauvegardés sur votre compte Google Drive. Dernière sauvegarde : $lastBackup.'; + } + + @override + String get accountsSubLableLastBackUpSecond => + 'Sauvegardez vos comptes sur votre compte Google Drive.'; + + @override + String get auto => 'auto'; + + @override + String varsion(Object buildNumber, Object version) { + return 'Version $version ($buildNumber)'; + } + + @override + String get transactionDetais => 'Détails de la transaction'; + + @override + String get transactionID => 'ID de transaction'; + + @override + String get date => 'Date'; + + @override + String get description => 'Description'; + + @override + String get reply => 'Répondre'; + + @override + String get sendAgain => 'Envoyer à nouveau'; + + @override + String get voucherCreating => 'Création du bon...'; + + @override + String get voucherFunding => 'Financement du bon...'; + + @override + String get voucherRedeemed => 'Bon échangé'; + + @override + String get voucherCreated => 'Bon créé'; + + @override + String get voucherCreateFailed => 'Échec de la création du bon'; + + @override + String get anonymous => 'Anonyme'; + + @override + String get minted => 'Émis'; + + @override + String get noDescription => 'pas de description'; + + @override + String get preparingWallet => 'Préparation du portefeuille...'; + + @override + String get transactions => 'Historique des transactions'; + + @override + String get citizenWallet => 'Citizen Wallet'; + + @override + String get aWlletRorYourCommunity => 'Un portefeuille pour votre communauté'; + + @override + String get openingYourWallet => 'Ouverture de votre portefeuille...'; + + @override + String get continueText => 'Continuer'; + + @override + String get copied => 'Copié'; + + @override + String get copyText => 'Copier'; + + @override + String get backupDate => 'Date de sauvegarde :'; + + @override + String get decryptBackup => 'Déchiffrer la sauvegarde'; + + @override + String get googleDriveAccount => 'Compte Google Drive :'; + + @override + String get noKeysFoundTryManually => + 'Aucune clé trouvée, essayez manuellement.'; + + @override + String get getEncryptionKeyFromYourPasswordManager => + 'Obtenir la clé de chiffrement de votre gestionnaire de mots de passe'; + + @override + String get invalidKeyEncryptionKey => 'Clé de chiffrement invalide.'; + + @override + String get enterEncryptionKeyManually => + 'Entrer la clé de chiffrement manuellement'; + + @override + String get enterEncryptionKey => 'Entrer la clé de chiffrement'; + + @override + String get encryptionKey => 'Clé de chiffrement'; + + @override + String get loading => 'Chargement'; + + @override + String get joinCommunity => 'Rejoindre la communauté'; + + @override + String get importText => 'Importer'; + + @override + String get selectAccount => 'Sélectionner un compte'; + + @override + String get hello => 'Bonjour'; + + @override + String get thisIsYourWallet => 'Ceci est votre portefeuille.'; + + @override + String get itLivesInTheLinkOfThisPage => + 'Il se trouve dans le lien de cette page.'; + + @override + String get itIsUniqueToYouAndYourCommunity => + 'Il est unique pour vous et votre communauté.'; + + @override + String get keepYourLink => + 'Gardez votre lien privé pour vous assurer que vous seul avez accès à ce portefeuille.'; + + @override + String get send => 'Envoyer'; + + @override + String get sending => 'Envoi'; + + @override + String get swipeToMint => 'Balayez pour émettre'; + + @override + String get swipeToSend => 'Balayez pour envoyer'; + + @override + String get swipeToConfirm => 'Balayez pour confirmer'; + + @override + String get receive => 'Recevoir'; + + @override + String get request => 'Demander'; + + @override + String get retry => 'Réessayer'; + + @override + String get searchUserAndAddress => 'Adresse ou nom d\'utilisateur'; + + @override + String get sendViaLink => 'Envoyer un lien'; + + @override + String get scanQRCode => 'Scanner un code QR'; + + @override + String get sendToNFCTag => 'Envoyer sur une carte NFC'; + + @override + String get mint => 'Émettre'; + + @override + String get vouchers => 'Bons'; + + @override + String get noBackupFound => 'Aucune sauvegarde trouvée'; + + @override + String get selectAnotherAccount => 'Sélectionner un autre compte'; + + @override + String get recoverIndividualAccount => + 'Récupérer un compte individuel à partir d\'une clé privée'; + + @override + String get restoreAllAccountsGoogleDrive => + 'Restaurer tous les comptes depuis Google Drive'; + + @override + String get infoActionLayoutDescription => + 'Vous devrez vous connecter à votre compte Google. Nous demanderons uniquement l\'accès au dossier de cette application dans votre Google Drive.'; + + @override + String get connectYourGoogleDriveAccount => + 'Connecter votre compte Google Drive'; + + @override + String get recoverIndividualAccountPrivateKey => + 'Récupérer un compte individuel à partir d\'une clé privée'; + + @override + String get create => 'Créer'; + + @override + String get username => 'Nom d\'utilisateur'; + + @override + String get enterAUsername => 'Entrez un nom d\'utilisateur'; + + @override + String get pleasePickAUsername => 'Veuillez choisir un nom d\'utilisateur.'; + + @override + String get thisUsernameIsAlreadyTaken => + 'Ce nom d\'utilisateur est déjà pris.'; + + @override + String get name => 'Nom'; + + @override + String get enterAName => 'Entrez un nom'; + + @override + String get enterDescription => 'Entrez une description'; + + @override + String get failedSaveProfile => 'Échec de l\'enregistrement du profil.'; + + @override + String get fetchingExistingProfile => 'Récupération du profil existant...'; + + @override + String get uploadingNewProfile => 'Téléchargement du nouveau profil...'; + + @override + String get almostDone => 'Presque terminé...'; + + @override + String get saving => 'Enregistrement...'; + + @override + String get save => 'Enregistrer'; + + @override + String get language => 'Langue'; + + @override + String get saveWallet => 'Enregistrer le portefeuille'; + + @override + String get saveText1 => + 'Ne perdez pas votre portefeuille ! Mettez cette page en favori ou sauvegardez son adresse unique contenant votre clé privée dans un endroit sûr.'; + + @override + String get gettheapp => + 'Vous pouvez également télécharger l\'application et y importer votre portefeuille.'; + + @override + String get appstorebadge => 'badge App Store'; + + @override + String get googleplaybadge => 'badge Google Play'; + + @override + String get opentheapp => + 'Une fois installée, vous pouvez importer votre portefeuille.'; + + @override + String get open => 'Importer dans l\'appplication'; + + @override + String get copyyouruniquewalletURL => + 'Copiez l\'URL unique de votre portefeuille'; + + @override + String get emailtoyourselfyourwalleturl => + 'Envoyez-vous par courriel l\'URL de votre portefeuille'; + + @override + String get shareText1 => 'Faites scanner ce code QR par quelqu\'un d\'autre.'; + + @override + String get shareText2 => + 'S\'ils n\'en ont pas déjà un, cela créera un nouveau portefeuille Citoyen sur leur appareil.'; + + @override + String get editname => 'Modifier le nom'; + + @override + String get export => 'Exporter'; + + @override + String get cancel => 'Annuler'; + + @override + String get enteraccountname => 'Entrer le nom du compte'; + + @override + String get exportAccount => 'Exporter le compte'; + + @override + String get deleteaccount => 'Supprimer le compte'; + + @override + String get deleteaccountMsg1 => + 'Êtes-vous sûr de vouloir supprimer ce compte ?'; + + @override + String get deleteaccountMsg2 => 'Cette action ne peut pas être annulée.'; + + @override + String get profileText1 => 'Il semble que vous n\'ayez pas encore de profil.'; + + @override + String get share => 'Partager le lien'; + + @override + String get cancelRefund => 'Annuler et rembourser'; + + @override + String get returnFunds => 'Rendre les fonds'; + + @override + String get returnVoucher => 'Rendre le bon'; + + @override + String get returnVoucherMsg => 'sera retourné à votre portefeuille.'; + + @override + String get deleteVoucher => 'Supprimer le bon'; + + @override + String get deleteVoucherMsg => 'Cela retirera le bon de la liste.'; + + @override + String get wallet => 'Portefeuille'; + + @override + String get voucherAmount => 'Montant du bon'; + + @override + String get enteramount => 'Entrer le montant'; + + @override + String get vouchericon => 'icône de bon'; + + @override + String get vouchersMsg => 'Vos bons apparaîtront ici'; + + @override + String get createVoucher => 'Créer un bon'; + + @override + String get returnText => 'Retour'; + + @override + String get redeemed => 'échangé'; + + @override + String get issued => 'émis'; + + @override + String get communities => 'Communautés'; + + @override + String get invalidlink => 'Lien invalide'; + + @override + String get unabltohandlelink => 'Impossible de gérer le lien'; + + @override + String get dismiss => 'Ignorer'; + + @override + String get to => 'À'; + + @override + String get minting => 'Frappe'; + + @override + String get externalWallet => 'Portefeuille externe'; + + @override + String get resetQRCode => 'Réinitialiser le code QR'; + + @override + String get amount => 'Montant'; + + @override + String get descriptionMsg => 'Ajouter une description'; + + @override + String get clear => 'Effacer'; + + @override + String get done => 'OK'; + + @override + String get settings => 'Paramètres'; + + @override + String get sent => 'Envoyé'; + + @override + String failedSend(Object currencyName) { + return 'Échec de l\'envoi de $currencyName.'; + } + + @override + String failedMint(Object currencyName) { + return 'Échec de l\'émission de $currencyName.'; + } + + @override + String get onText => 'sur'; + + @override + String get invalidQRCode => 'Code QR invalide'; + + @override + String get enterManually => 'Entrer manuellement'; + + @override + String get scanAgain => 'Scanner à nouveau'; + + @override + String get max => 'max'; + + @override + String get insufficientFunds => 'Fonds insuffisants.'; + + @override + String currentBalance(Object formattedBalance) { + return 'Current balance: $formattedBalance'; + } + + @override + String get sendDescription => 'Ajouter une description\n\n\n'; + + @override + String get chooseRecipient => 'Choisir un destinataire'; + + @override + String get createdBy => 'Créé par'; + + @override + String get redeem => 'Accepter'; + + @override + String get voucher => 'Bon'; + + @override + String get createVoucherText => + 'Créer un bon échangeable contre le montant indiqué ci-dessus.'; + + @override + String get emptyBalanceText1 => 'Ce bon a déjà été utilisé.'; + + @override + String get emptyBalanceText2 => 'Échangez ce bon sur votre compte.'; + + @override + String get tapToScan => 'Scannez votre carte'; + + @override + String get communityCurrentlyOffline => 'Communauté actuellement hors ligne'; + + @override + String get topup => 'Recharger'; + + @override + String get close => 'Fermer'; + + @override + String get more => 'Plus'; + + @override + String get start => 'Commencer'; + + @override + String get connecting => 'Connexion'; + + @override + String get accountNotFound => 'Compte non trouvé'; +} diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart new file mode 100644 index 00000000..c625d6b3 --- /dev/null +++ b/lib/l10n/app_localizations_nl.dart @@ -0,0 +1,667 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Dutch Flemish (`nl`). +class AppLocalizationsNl extends AppLocalizations { + AppLocalizationsNl([String locale = 'nl']) : super(locale); + + @override + String get viewContract => 'Contract bekijken'; + + @override + String get confirm => 'Bevestig'; + + @override + String get welcomeCitizen => 'Welcome, citizen!'; + + @override + String get aWalletForYourCommunity => + 'Dit is je nieuwe wallet, waar je de tokens van je gemeenschap kunt opslaan, verzenden en ontvangen.'; + + @override + String get createNewAccount => 'Creëer een nieuwe account'; + + @override + String get scanFromCommunity => 'Een QR-code scannen vanuit je gemeenschap'; + + @override + String get or => 'OF'; + + @override + String get browseCommunities => 'Gemeenschappen doorbladeren'; + + @override + String get recoverfrombackup => 'herstel account van backup'; + + @override + String get recoverIndividualAccountFromaPrivatekey => + 'Herstel een individuele account via een private key.'; + + @override + String get createNewAccountMsg => + 'Creëer een profiel zodat mensen gemakkelijk tokens kunnen sturen naar uw gebruikersnaam.'; + + @override + String get settingsScrApp => 'App'; + + @override + String get createaprofile => 'Creëer een profiel'; + + @override + String get edit => 'Bewerk'; + + @override + String get darkMode => 'Donkere modus'; + + @override + String get about => 'Over ons'; + + @override + String get pushNotifications => 'Push-meldingen'; + + @override + String get inappsounds => 'In-app geluiden'; + + @override + String viewOn(Object name) { + return 'Weergeven op $name'; + } + + @override + String get accounts => 'Accounts'; + + @override + String get account => 'Account'; + + @override + String get cards => 'Kaarten'; + + @override + String get yourContactsWillAppearHere => + 'Uw contactpersonen verschijnen hier'; + + @override + String get accountsAndroidBackupsuseAndroid => + 'Back-ups maken gebruik van Android Auto Backup en volgen automatisch de back-upinstellingen van je toestel.'; + + @override + String get accountsAndroidIfYouInstalltheAppAgain => + 'Als je de app opnieuw installeert op een ander apparaat met hetzelfde Google-account, wordt de versleutelde back-up gebruikt om je accounts te herstellen.'; + + @override + String get accountsAndroidYouraccounts => + 'Uw accounts en back-ups worden door u aangemaakt en zijn volledig uw eigendom. '; + + @override + String get accountsAndroidManuallyExported => + 'Ze kunnen op elk moment handmatig worden geëxporteerd.'; + + @override + String get accountsApYouraccountsarebackedup => + 'Van je accounts wordt een back-up gemaakt in de Keychain van je iPhone en ze volgen automatisch je iCloud back-upinstellingen.'; + + @override + String get accountsApSyncthisiPhone => + 'Als je \"Sync this iPhone\" inschakelt, wordt er een back-up van je keychain van je iPhone gemaakt in iCloud. '; + + @override + String get accountsApYoucancheck => + 'Je kunt controleren of synchronisatie is ingeschakeld in je Instellingen door te gaan naar: Apple ID > iCloud > Wachtwoorden en Keychain. '; + + @override + String get accountsApYouraccounts => + 'Uw accounts en back-ups van uw accounts worden door u aangemaakt en zijn volledig uw eigendom. '; + + @override + String get accountsApTheycanbe => + 'Ze kunnen op elk moment handmatig worden geëxporteerd.'; + + @override + String get initialAddress => 'Initieel Adres:'; + + @override + String get notifications => 'Notificaties'; + + @override + String get backup => 'Backup'; + + @override + String get dangerZone => 'Gevaren zone'; + + @override + String get clearDataAndBackups => 'Verwijder data & backups'; + + @override + String get replaceExistingBackup => 'Vervang huidge backup'; + + @override + String get replace => 'Vervang'; + + @override + String get androidBackupTexlineOne => + 'Er is al een back-up op je Google Drive-account gelinkt met een andere account'; + + @override + String get androidBackupTexlineTwo => + 'Weet je zeker dat je deze wilt vervangen?'; + + @override + String get appResetTexlineOne => + 'Weet je zeker dat je alles wilt verwijderen?'; + + @override + String get appResetTexlineTwo => + 'Deze actie kan niet ongedaan worden gemaakt.'; + + @override + String get delete => 'Verwijder'; + + @override + String get endToEndEncryption => 'End-to-end encryptie'; + + @override + String get endToEndEncryptionSub => + 'Back-ups zijn altijd end-to-end versleuteld.'; + + @override + String get accountsSubLableOne => + 'Van al je accounts wordt automatisch een back-up gemaakt in de sleutelhanger van je apparaat en ze worden gesynchroniseerd met je iCloud-Keychain.'; + + @override + String accountsSubLableLastBackUp(Object lastBackup) { + return 'Van je accounts wordt een back-up gemaakt op je Google Drive-account. Laatste back-up: $lastBackup.'; + } + + @override + String get accountsSubLableLastBackUpSecond => + 'Maak nu een back-up van je accounts op je Google Drive-account.'; + + @override + String get auto => 'auto'; + + @override + String varsion(Object buildNumber, Object version) { + return 'Versie $version ($buildNumber)'; + } + + @override + String get transactionDetais => 'Transactie details'; + + @override + String get transactionID => 'Transactie ID'; + + @override + String get date => 'Datum'; + + @override + String get description => 'Beschrijving'; + + @override + String get reply => 'Antwoord'; + + @override + String get sendAgain => 'Verstuur opnieuw'; + + @override + String get voucherCreating => 'Voucher creëren...'; + + @override + String get voucherFunding => 'Voucher financieren...'; + + @override + String get voucherRedeemed => 'Voucher geclaimd'; + + @override + String get voucherCreated => 'Voucher gecreëerd'; + + @override + String get voucherCreateFailed => 'Voucher creatie mislukt'; + + @override + String get anonymous => 'Anoniem'; + + @override + String get minted => 'Minted'; + + @override + String get noDescription => 'Geen beschrijving'; + + @override + String get preparingWallet => 'Wallet wordt geïnitialiseerd...'; + + @override + String get transactions => 'Transactiegeschiedenis'; + + @override + String get citizenWallet => 'Citizen Wallet'; + + @override + String get aWlletRorYourCommunity => 'Een wallet voor jouw gemeenschap'; + + @override + String get openingYourWallet => 'Wallet openen...'; + + @override + String get continueText => 'Ga verder'; + + @override + String get copied => 'Gekopieerd'; + + @override + String get copyText => 'Kopieer'; + + @override + String get backupDate => 'Backup datum: '; + + @override + String get decryptBackup => 'Decrypteer backup'; + + @override + String get googleDriveAccount => 'Google Drive account: '; + + @override + String get noKeysFoundTryManually => + 'Geen account-keys gevonden, probeer handmatig in te voeren.'; + + @override + String get getEncryptionKeyFromYourPasswordManager => + 'Haal de coderingssleutel op uit uw Password Manager'; + + @override + String get invalidKeyEncryptionKey => 'Ongeldige coderingssleutel.'; + + @override + String get enterEncryptionKeyManually => + 'Coderingssleutel handmatig invoeren'; + + @override + String get enterEncryptionKey => 'Encryptie key invoeren'; + + @override + String get encryptionKey => 'Encryptie key'; + + @override + String get loading => 'Bezig met laden'; + + @override + String get joinCommunity => 'Lid worden'; + + @override + String get importText => 'Importeer'; + + @override + String get selectAccount => 'Selecteer Account'; + + @override + String get hello => 'Hello'; + + @override + String get thisIsYourWallet => 'Dit is jouw wallet.'; + + @override + String get itLivesInTheLinkOfThisPage => + 'Je wallet gegevens zitten in de link van deze pagina.'; + + @override + String get itIsUniqueToYouAndYourCommunity => + 'Het is uniek voor jou en je gemeenschap.'; + + @override + String get keepYourLink => + 'Houd je link privé om ervoor te zorgen dat alleen jij toegang hebt tot deze wallet.'; + + @override + String get send => 'Verstuur'; + + @override + String get sending => 'Versturen'; + + @override + String get swipeToMint => 'Swipe om te minten'; + + @override + String get swipeToSend => 'Swipe om te versturen'; + + @override + String get swipeToConfirm => 'Swipe om te bevestigen'; + + @override + String get receive => 'Ontvang'; + + @override + String get request => 'Aanvraag'; + + @override + String get retry => 'Opnieuw proberen'; + + @override + String get searchUserAndAddress => 'Zoek gebruiker of plak adres'; + + @override + String get sendViaLink => 'Verstuur via link'; + + @override + String get scanQRCode => 'Scan QR Code'; + + @override + String get sendToNFCTag => 'Verstuur naar een NFC-tag'; + + @override + String get mint => 'Mint'; + + @override + String get vouchers => 'Vouchers'; + + @override + String get noBackupFound => 'Geen backup gevonden'; + + @override + String get selectAnotherAccount => 'Selecteer een andere account'; + + @override + String get recoverIndividualAccount => + 'Individuele account herstellen met een private key'; + + @override + String get restoreAllAccountsGoogleDrive => + 'Alle accounts herstellen via Google Drive'; + + @override + String get infoActionLayoutDescription => + 'Je wordt gevraagd om in te loggen op je Google account. We vragen alleen toegang tot de map van deze app in je Google Drive.'; + + @override + String get connectYourGoogleDriveAccount => + 'Verbind met je Google Drive Account'; + + @override + String get recoverIndividualAccountPrivateKey => + 'Herstel individuele account via een private key'; + + @override + String get create => 'Creëer'; + + @override + String get username => 'Gebruikersnaam'; + + @override + String get enterAUsername => 'Voer een gebruikersnaam in'; + + @override + String get pleasePickAUsername => 'Kies een gebruikersnaam.'; + + @override + String get thisUsernameIsAlreadyTaken => + 'Deze gebruikersnaam wordt reeds gebruikt.'; + + @override + String get name => 'Naam'; + + @override + String get enterAName => 'Kies een naam'; + + @override + String get enterDescription => 'Kies een beschrijving\n\n\n'; + + @override + String get failedSaveProfile => + 'Het is niet gelukt om het profiel op te slaan.'; + + @override + String get fetchingExistingProfile => 'Bestaand profiel ophalen'; + + @override + String get uploadingNewProfile => 'Nieuw profiel uploaden...'; + + @override + String get almostDone => 'Bijna klaar...'; + + @override + String get saving => 'Opslaan...'; + + @override + String get save => 'Opslaan'; + + @override + String get language => 'Taal'; + + @override + String get saveWallet => 'Wallet opslaan'; + + @override + String get saveText1 => + 'Verlies je wallet niet! Bookmark deze pagina of bewaar het unieke adres met je private key op een veilige plek.'; + + @override + String get gettheapp => 'De app downloaden'; + + @override + String get appstorebadge => 'app store badge'; + + @override + String get googleplaybadge => 'google play badge'; + + @override + String get opentheapp => 'Open de app'; + + @override + String get open => 'Open'; + + @override + String get copyyouruniquewalletURL => 'Kopieer je unieke wallet link'; + + @override + String get emailtoyourselfyourwalleturl => 'Email je wallet link naar jezelf'; + + @override + String get shareText1 => 'Laat iemand anders deze QR-code scannen. '; + + @override + String get shareText2 => + 'Indien ze nog geen wallet hebben, wordt er een nieuwe Citizen Wallet aangemaakt op hun apparaat.'; + + @override + String get editname => 'Naam wijzigen'; + + @override + String get export => 'Exporteer'; + + @override + String get cancel => 'Annuleer'; + + @override + String get enteraccountname => 'Account naam ingeven'; + + @override + String get exportAccount => 'Exporteer Account'; + + @override + String get deleteaccount => 'Verwijder account'; + + @override + String get deleteaccountMsg1 => + 'Weet je zeker dat je deze account wilt verwijderen?'; + + @override + String get deleteaccountMsg2 => + 'Deze actie kan niet ongedaan worden gemaakt.'; + + @override + String get profileText1 => 'Het lijkt erop dat je nog geen profiel hebt. '; + + @override + String get share => 'Deel link'; + + @override + String get cancelRefund => 'Annuleer & Terugbetaling'; + + @override + String get returnFunds => 'Retourneer tokens'; + + @override + String get returnVoucher => 'Cancel voucher'; + + @override + String get returnVoucherMsg => 'wordt teruggestort in je wallet'; + + @override + String get deleteVoucher => 'Verwijder Voucher'; + + @override + String get deleteVoucherMsg => + 'Hierdoor wordt de voucher uit de lijst verwijderd.'; + + @override + String get wallet => 'Wallet'; + + @override + String get voucherAmount => 'Voucher bedrag'; + + @override + String get enteramount => 'Geef bedrag in'; + + @override + String get vouchericon => 'voucher icon'; + + @override + String get vouchersMsg => 'Je vouchers verschijnen hier'; + + @override + String get createVoucher => 'Creëer Voucher'; + + @override + String get returnText => 'Terug'; + + @override + String get redeemed => 'geclaimd'; + + @override + String get issued => 'gecreëerd'; + + @override + String get communities => 'Gemeenschappen'; + + @override + String get invalidlink => 'Ongeldige link'; + + @override + String get unabltohandlelink => 'Kan link niet verwerken'; + + @override + String get dismiss => 'Annuleer'; + + @override + String get to => 'naar NL'; + + @override + String get minting => 'Minting'; + + @override + String get externalWallet => 'Externe Wallet'; + + @override + String get resetQRCode => 'Reset QR Code'; + + @override + String get amount => 'Bedrag'; + + @override + String get descriptionMsg => 'Voeg beschrijving toe'; + + @override + String get clear => 'Wis'; + + @override + String get done => 'Gereed'; + + @override + String get settings => 'Settings'; + + @override + String get sent => 'Verzonden'; + + @override + String failedSend(Object currencyName) { + return 'Verzenden van $currencyName is niet gelukt.'; + } + + @override + String failedMint(Object currencyName) { + return 'Minten van $currencyName is niet gelukt.'; + } + + @override + String get onText => 'op'; + + @override + String get invalidQRCode => 'Ongeldige QR Code'; + + @override + String get enterManually => 'Handmatig invoeren'; + + @override + String get scanAgain => 'Scan opnieuw'; + + @override + String get max => 'max'; + + @override + String get insufficientFunds => 'Onvoldoende fondsen.'; + + @override + String currentBalance(Object formattedBalance) { + return 'Huidige balans: $formattedBalance'; + } + + @override + String get sendDescription => 'Beschrijving toevoegen\n\n\n'; + + @override + String get chooseRecipient => 'Kies ontvanger'; + + @override + String get createdBy => 'Gedaan door'; + + @override + String get redeem => 'Claim'; + + @override + String get voucher => 'Voucher'; + + @override + String get createVoucherText => + 'Maak een voucher die iedereen kan claimen voor het bovenstaande bedrag.'; + + @override + String get emptyBalanceText1 => 'Deze bon is al ingewisseld.'; + + @override + String get emptyBalanceText2 => 'Claim deze voucher op je account'; + + @override + String get tapToScan => 'Tik om te scannen'; + + @override + String get communityCurrentlyOffline => 'Gemeenschap momenteel offline'; + + @override + String get topup => 'Opwaarderen'; + + @override + String get close => 'Sluiten'; + + @override + String get more => 'Meer'; + + @override + String get start => 'Start'; + + @override + String get connecting => 'Verbinding maken'; + + @override + String get accountNotFound => 'Account niet gevonden'; +} diff --git a/lib/main.dart b/lib/main.dart index 05b85de1..b68690f9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -31,7 +31,7 @@ import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:timeago/timeago.dart' as timeago; const supportedLocales = [ diff --git a/lib/modals/account/switch_account.dart b/lib/modals/account/switch_account.dart index bab776a6..a91a5840 100644 --- a/lib/modals/account/switch_account.dart +++ b/lib/modals/account/switch_account.dart @@ -21,7 +21,7 @@ import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class SwitchAccountModal extends StatefulWidget { final WalletLogic logic; diff --git a/lib/modals/onboarding/onboarding.dart b/lib/modals/onboarding/onboarding.dart index 02059477..23555d36 100644 --- a/lib/modals/onboarding/onboarding.dart +++ b/lib/modals/onboarding/onboarding.dart @@ -5,7 +5,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class OnboardingModal extends StatelessWidget { final String title; diff --git a/lib/modals/profile/edit.dart b/lib/modals/profile/edit.dart index 8b205c86..ea6066a2 100644 --- a/lib/modals/profile/edit.dart +++ b/lib/modals/profile/edit.dart @@ -18,7 +18,7 @@ import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; import 'package:rate_limiter/rate_limiter.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class EditProfileModal extends StatefulWidget { const EditProfileModal({ diff --git a/lib/modals/profile/profile.dart b/lib/modals/profile/profile.dart index 1bffdfab..806e45f5 100644 --- a/lib/modals/profile/profile.dart +++ b/lib/modals/profile/profile.dart @@ -9,7 +9,7 @@ import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class ProfileModal extends StatefulWidget { final String account; diff --git a/lib/modals/save/save.dart b/lib/modals/save/save.dart index 2042e38c..27547ab5 100644 --- a/lib/modals/save/save.dart +++ b/lib/modals/save/save.dart @@ -9,7 +9,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class SaveModal extends StatefulWidget { const SaveModal({ diff --git a/lib/modals/save/share.dart b/lib/modals/save/share.dart index f7ebebdd..77feda10 100644 --- a/lib/modals/save/share.dart +++ b/lib/modals/save/share.dart @@ -12,7 +12,7 @@ import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class ShareModal extends StatefulWidget { final String title; diff --git a/lib/modals/wallet/community_picker.dart b/lib/modals/wallet/community_picker.dart index f528d3de..fd0c03ca 100644 --- a/lib/modals/wallet/community_picker.dart +++ b/lib/modals/wallet/community_picker.dart @@ -12,7 +12,7 @@ import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class CommunityPickerModal extends StatefulWidget { const CommunityPickerModal({super.key}); diff --git a/lib/modals/wallet/deep_link.dart b/lib/modals/wallet/deep_link.dart index 93ba4df7..30a7a3e6 100644 --- a/lib/modals/wallet/deep_link.dart +++ b/lib/modals/wallet/deep_link.dart @@ -14,7 +14,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class DeepLinkModal extends StatefulWidget { final WalletService wallet; diff --git a/lib/modals/wallet/pick_sender.dart b/lib/modals/wallet/pick_sender.dart index 3d2516de..fc07740e 100644 --- a/lib/modals/wallet/pick_sender.dart +++ b/lib/modals/wallet/pick_sender.dart @@ -21,7 +21,7 @@ import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; import 'package:rate_limiter/rate_limiter.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class PickeSenderModal extends StatefulWidget { final WalletLogic walletLogic; diff --git a/lib/modals/wallet/voucher_read.dart b/lib/modals/wallet/voucher_read.dart index c98f43e0..20aa15a0 100644 --- a/lib/modals/wallet/voucher_read.dart +++ b/lib/modals/wallet/voucher_read.dart @@ -15,7 +15,7 @@ import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class VoucherReadModal extends StatefulWidget { final String address; diff --git a/lib/modals/wallet/voucher_view.dart b/lib/modals/wallet/voucher_view.dart index 0afa794b..8f8498f0 100644 --- a/lib/modals/wallet/voucher_view.dart +++ b/lib/modals/wallet/voucher_view.dart @@ -12,7 +12,7 @@ import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; import 'package:citizenwallet/utils/strings.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class VoucherViewModal extends StatefulWidget { final String address; diff --git a/lib/router/shell.dart b/lib/router/shell.dart index 9316ac58..03c5e89d 100644 --- a/lib/router/shell.dart +++ b/lib/router/shell.dart @@ -6,7 +6,7 @@ import 'package:flutter/foundation.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class RouterShell extends StatelessWidget { final Widget child; diff --git a/lib/screens/about/screen.dart b/lib/screens/about/screen.dart index 03f0f3ba..e32a675b 100644 --- a/lib/screens/about/screen.dart +++ b/lib/screens/about/screen.dart @@ -6,7 +6,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class AboutScreen extends StatelessWidget { const AboutScreen({Key? key}) : super(key: key); diff --git a/lib/screens/account/screen.dart b/lib/screens/account/screen.dart index f0bc705c..754c1031 100644 --- a/lib/screens/account/screen.dart +++ b/lib/screens/account/screen.dart @@ -17,7 +17,7 @@ import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class AccountScreen extends StatefulWidget { final String? address; diff --git a/lib/screens/accounts/screen.android.dart b/lib/screens/accounts/screen.android.dart index 1721b4ee..3657f626 100644 --- a/lib/screens/accounts/screen.android.dart +++ b/lib/screens/accounts/screen.android.dart @@ -1,7 +1,7 @@ import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/widgets/header.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class AndroidAccountsScreen extends StatelessWidget { const AndroidAccountsScreen({Key? key}) : super(key: key); diff --git a/lib/screens/accounts/screen.apple.dart b/lib/screens/accounts/screen.apple.dart index d869cdfe..3f03e74c 100644 --- a/lib/screens/accounts/screen.apple.dart +++ b/lib/screens/accounts/screen.apple.dart @@ -1,7 +1,7 @@ import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/widgets/header.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class AppleAccountsScreen extends StatelessWidget { const AppleAccountsScreen({Key? key}) : super(key: key); diff --git a/lib/screens/accounts/screen.dart b/lib/screens/accounts/screen.dart index 8eb1ae25..a790ac5e 100644 --- a/lib/screens/accounts/screen.dart +++ b/lib/screens/accounts/screen.dart @@ -26,7 +26,7 @@ import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class AccountsScreen extends StatefulWidget { final WalletLogic logic; diff --git a/lib/screens/cards/screen.dart b/lib/screens/cards/screen.dart index ca4ef46f..80ef7c0b 100644 --- a/lib/screens/cards/screen.dart +++ b/lib/screens/cards/screen.dart @@ -5,7 +5,7 @@ import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/widgets/header.dart'; import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class CardsScreen extends StatefulWidget { final WalletLogic walletLogic; diff --git a/lib/screens/deeplink/deep_link.dart b/lib/screens/deeplink/deep_link.dart index 8c919fc3..10acc764 100644 --- a/lib/screens/deeplink/deep_link.dart +++ b/lib/screens/deeplink/deep_link.dart @@ -14,7 +14,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class DeepLinkScreen extends StatefulWidget { final WalletService wallet; diff --git a/lib/screens/landing/account_connected.dart b/lib/screens/landing/account_connected.dart index 899d72f3..af7dfa66 100644 --- a/lib/screens/landing/account_connected.dart +++ b/lib/screens/landing/account_connected.dart @@ -9,7 +9,7 @@ import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class AccountConnectedScreen extends StatefulWidget { const AccountConnectedScreen({ diff --git a/lib/screens/landing/account_recovery.dart b/lib/screens/landing/account_recovery.dart index 02e91b92..57305efb 100644 --- a/lib/screens/landing/account_recovery.dart +++ b/lib/screens/landing/account_recovery.dart @@ -10,7 +10,7 @@ import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class AccountRecoveryScreen extends StatefulWidget { const AccountRecoveryScreen({ diff --git a/lib/screens/landing/screen.dart b/lib/screens/landing/screen.dart index c2e1833b..29f05613 100644 --- a/lib/screens/landing/screen.dart +++ b/lib/screens/landing/screen.dart @@ -18,7 +18,7 @@ import 'package:go_router/go_router.dart'; import 'package:flutter_svg/svg.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class LandingScreen extends StatefulWidget { final String uri; diff --git a/lib/screens/landing/screen.web.dart b/lib/screens/landing/screen.web.dart index b9f57254..6b6a51c9 100644 --- a/lib/screens/landing/screen.web.dart +++ b/lib/screens/landing/screen.web.dart @@ -4,7 +4,7 @@ import 'package:citizenwallet/utils/delay.dart'; import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; import 'package:lottie/lottie.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class WebLandingScreen extends StatefulWidget { final String? voucher; diff --git a/lib/screens/landing/single_community_screen.dart b/lib/screens/landing/single_community_screen.dart index 7e35346f..30e34a41 100644 --- a/lib/screens/landing/single_community_screen.dart +++ b/lib/screens/landing/single_community_screen.dart @@ -18,7 +18,7 @@ import 'package:go_router/go_router.dart'; import 'package:flutter_svg/svg.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class SingleCommunityLandingScreen extends StatefulWidget { final String uri; diff --git a/lib/screens/send/send_details.dart b/lib/screens/send/send_details.dart index edad269b..186c585f 100644 --- a/lib/screens/send/send_details.dart +++ b/lib/screens/send/send_details.dart @@ -20,7 +20,7 @@ import 'package:citizenwallet/widgets/slide_to_complete.dart'; import 'package:citizenwallet/widgets/webview/webview_modal.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:rate_limiter/rate_limiter.dart'; diff --git a/lib/screens/send/send_link_progress.dart b/lib/screens/send/send_link_progress.dart index 347803f2..490ddad3 100644 --- a/lib/screens/send/send_link_progress.dart +++ b/lib/screens/send/send_link_progress.dart @@ -15,7 +15,7 @@ import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class SendLinkProgress extends StatefulWidget { final VoucherLogic voucherLogic; diff --git a/lib/screens/send/send_progress.dart b/lib/screens/send/send_progress.dart index 2d54d51f..315a4a2c 100644 --- a/lib/screens/send/send_progress.dart +++ b/lib/screens/send/send_progress.dart @@ -15,7 +15,7 @@ import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class SendProgress extends StatefulWidget { final String? to; diff --git a/lib/screens/send/send_to.dart b/lib/screens/send/send_to.dart index 5a152024..2774855d 100644 --- a/lib/screens/send/send_to.dart +++ b/lib/screens/send/send_to.dart @@ -23,7 +23,7 @@ import 'package:citizenwallet/widgets/scanner/nfc_modal.dart'; import 'package:citizenwallet/widgets/scanner/scanner_modal.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:rate_limiter/rate_limiter.dart'; diff --git a/lib/screens/send/tip_details.dart b/lib/screens/send/tip_details.dart index 30ca7d89..348919b7 100644 --- a/lib/screens/send/tip_details.dart +++ b/lib/screens/send/tip_details.dart @@ -20,7 +20,7 @@ import 'package:citizenwallet/widgets/slide_to_complete.dart'; import 'package:citizenwallet/widgets/webview/webview_modal.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:rate_limiter/rate_limiter.dart'; diff --git a/lib/screens/settings/screen.dart b/lib/screens/settings/screen.dart index 4ccd0221..9f6984d3 100644 --- a/lib/screens/settings/screen.dart +++ b/lib/screens/settings/screen.dart @@ -20,7 +20,7 @@ import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class SettingsScreen extends StatefulWidget { const SettingsScreen({super.key}); diff --git a/lib/screens/transaction/screen.dart b/lib/screens/transaction/screen.dart index 9fa3326b..225f66b4 100644 --- a/lib/screens/transaction/screen.dart +++ b/lib/screens/transaction/screen.dart @@ -17,7 +17,7 @@ import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class TransactionScreen extends StatefulWidget { final String? transactionId; diff --git a/lib/screens/voucher/screen.dart b/lib/screens/voucher/screen.dart index ab133a77..0b3d0d42 100644 --- a/lib/screens/voucher/screen.dart +++ b/lib/screens/voucher/screen.dart @@ -13,7 +13,7 @@ import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; import 'package:citizenwallet/utils/strings.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class VoucherScreen extends StatefulWidget { final String address; diff --git a/lib/screens/vouchers/screen.dart b/lib/screens/vouchers/screen.dart index 9a0fa340..adaa7929 100644 --- a/lib/screens/vouchers/screen.dart +++ b/lib/screens/vouchers/screen.dart @@ -16,7 +16,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class VouchersScreen extends StatefulWidget { final WalletLogic walletLogic; diff --git a/lib/screens/vouchers/voucher_read.dart b/lib/screens/vouchers/voucher_read.dart index 7a7cdca0..c66ace42 100644 --- a/lib/screens/vouchers/voucher_read.dart +++ b/lib/screens/vouchers/voucher_read.dart @@ -15,7 +15,7 @@ import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class VoucherReadScreen extends StatefulWidget { final String address; diff --git a/lib/screens/vouchers/voucher_row.dart b/lib/screens/vouchers/voucher_row.dart index 1ab025bc..de90b75f 100644 --- a/lib/screens/vouchers/voucher_row.dart +++ b/lib/screens/vouchers/voucher_row.dart @@ -6,7 +6,7 @@ import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/utils/currency.dart'; import 'package:citizenwallet/widgets/coin_logo.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; diff --git a/lib/screens/wallet/more_actions_sheet.dart b/lib/screens/wallet/more_actions_sheet.dart index 2aa1831f..64302947 100644 --- a/lib/screens/wallet/more_actions_sheet.dart +++ b/lib/screens/wallet/more_actions_sheet.dart @@ -7,7 +7,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class MoreActionsSheet extends StatelessWidget { final void Function()? handleSendScreen; diff --git a/lib/screens/wallet/receive.dart b/lib/screens/wallet/receive.dart index a7c95e71..a9d7c087 100644 --- a/lib/screens/wallet/receive.dart +++ b/lib/screens/wallet/receive.dart @@ -21,7 +21,7 @@ import 'package:flutter/cupertino.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; import 'package:rate_limiter/rate_limiter.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class ReceiveScreen extends StatefulWidget { final WalletLogic logic; diff --git a/lib/screens/wallet/screen.dart b/lib/screens/wallet/screen.dart index b0da7de7..57ed928f 100644 --- a/lib/screens/wallet/screen.dart +++ b/lib/screens/wallet/screen.dart @@ -27,7 +27,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:citizenwallet/widgets/communities/offline_banner.dart'; import 'package:citizenwallet/widgets/webview/connected_webview_modal.dart'; diff --git a/lib/screens/wallet/screen.web.dart b/lib/screens/wallet/screen.web.dart index d63bf7e9..17f889d7 100644 --- a/lib/screens/wallet/screen.web.dart +++ b/lib/screens/wallet/screen.web.dart @@ -27,7 +27,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class BurnerWalletScreen extends StatefulWidget { final String encoded; diff --git a/lib/screens/wallet/tip_to.dart b/lib/screens/wallet/tip_to.dart index 30b785d0..7cb040f6 100644 --- a/lib/screens/wallet/tip_to.dart +++ b/lib/screens/wallet/tip_to.dart @@ -14,7 +14,7 @@ import 'package:citizenwallet/widgets/profile/profile_chip.dart'; import 'package:citizenwallet/widgets/profile/profile_row.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:rate_limiter/rate_limiter.dart'; diff --git a/lib/screens/wallet/transaction_row.dart b/lib/screens/wallet/transaction_row.dart index c1d47cd3..eeaac64b 100644 --- a/lib/screens/wallet/transaction_row.dart +++ b/lib/screens/wallet/transaction_row.dart @@ -9,7 +9,7 @@ import 'package:citizenwallet/widgets/profile/profile_circle.dart'; import 'package:citizenwallet/widgets/skeleton/pulsing_container.dart'; import 'package:flutter/cupertino.dart'; import 'package:intl/intl.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:timeago/timeago.dart' as timeago; class TransactionRow extends StatefulWidget { diff --git a/lib/screens/wallet/wallet_actions.dart b/lib/screens/wallet/wallet_actions.dart index f79515f1..77d743ac 100644 --- a/lib/screens/wallet/wallet_actions.dart +++ b/lib/screens/wallet/wallet_actions.dart @@ -13,7 +13,7 @@ import 'package:citizenwallet/widgets/wallet/action_button.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_svg/svg.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class WalletActions extends StatefulWidget { final double shrink; diff --git a/lib/screens/wallet/wallet_scroll_view.dart b/lib/screens/wallet/wallet_scroll_view.dart index c59126e3..f405e726 100644 --- a/lib/screens/wallet/wallet_scroll_view.dart +++ b/lib/screens/wallet/wallet_scroll_view.dart @@ -17,7 +17,7 @@ import 'package:citizenwallet/widgets/qr/qr.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class WalletScrollView extends StatefulWidget { final ScrollController controller; diff --git a/lib/widgets/chip.dart b/lib/widgets/chip.dart index e32595c3..266dbde0 100644 --- a/lib/widgets/chip.dart +++ b/lib/widgets/chip.dart @@ -4,7 +4,7 @@ import 'package:citizenwallet/theme/colors.dart'; import 'package:citizenwallet/theme/provider.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class Chip extends StatefulWidget { final Color color; diff --git a/lib/widgets/communities/offline_banner.dart b/lib/widgets/communities/offline_banner.dart index 773ee7ef..965fe7bd 100644 --- a/lib/widgets/communities/offline_banner.dart +++ b/lib/widgets/communities/offline_banner.dart @@ -4,7 +4,7 @@ import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/utils/delay.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:url_launcher/url_launcher.dart'; class OfflineBanner extends StatefulWidget { diff --git a/lib/widgets/confirm_modal.dart b/lib/widgets/confirm_modal.dart index 23e4487c..4e2f7010 100644 --- a/lib/widgets/confirm_modal.dart +++ b/lib/widgets/confirm_modal.dart @@ -4,7 +4,7 @@ import 'package:citizenwallet/widgets/dismissible_modal_popup.dart'; import 'package:citizenwallet/widgets/header.dart'; import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; const List emptyDetails = []; diff --git a/lib/widgets/nfc_overlay.dart b/lib/widgets/nfc_overlay.dart index 37e247ef..cfd5917c 100644 --- a/lib/widgets/nfc_overlay.dart +++ b/lib/widgets/nfc_overlay.dart @@ -5,7 +5,7 @@ import 'package:provider/provider.dart'; import 'package:citizenwallet/services/nfc/service.dart'; import 'package:citizenwallet/state/scan/state.dart'; import 'package:citizenwallet/utils/delay.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class NfcOverlay extends StatefulWidget { final Function()? onCancel; diff --git a/lib/widgets/profile/profile_badge.dart b/lib/widgets/profile/profile_badge.dart index 9e153fef..b0ec5ab5 100644 --- a/lib/widgets/profile/profile_badge.dart +++ b/lib/widgets/profile/profile_badge.dart @@ -3,7 +3,7 @@ import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/widgets/profile/profile_circle.dart'; import 'package:citizenwallet/widgets/skeleton/pulsing_container.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class ProfileBadge extends StatelessWidget { final ProfileV1? profile; diff --git a/lib/widgets/profile/profile_chip.dart b/lib/widgets/profile/profile_chip.dart index 6d72d999..a670ad23 100644 --- a/lib/widgets/profile/profile_chip.dart +++ b/lib/widgets/profile/profile_chip.dart @@ -2,7 +2,7 @@ import 'package:citizenwallet/services/wallet/contracts/profile.dart'; import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/widgets/profile/profile_circle.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class ProfileChip extends StatelessWidget { final ProfileV1? selectedProfile; diff --git a/lib/widgets/profile/profile_row.dart b/lib/widgets/profile/profile_row.dart index feed5181..671c2b88 100644 --- a/lib/widgets/profile/profile_row.dart +++ b/lib/widgets/profile/profile_row.dart @@ -2,7 +2,7 @@ import 'package:citizenwallet/services/wallet/contracts/profile.dart'; import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/widgets/profile/profile_circle.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class ProfileRow extends StatelessWidget { final ProfileV1? profile; diff --git a/lib/widgets/qr/qr_modal.dart b/lib/widgets/qr/qr_modal.dart index 3f5dc210..2db1aa44 100644 --- a/lib/widgets/qr/qr_modal.dart +++ b/lib/widgets/qr/qr_modal.dart @@ -6,7 +6,7 @@ import 'package:citizenwallet/widgets/qr/qr.dart'; import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class QRModal extends StatelessWidget { final String? title; diff --git a/lib/widgets/scanner/nfc_modal.dart b/lib/widgets/scanner/nfc_modal.dart index a318d34c..2d646734 100644 --- a/lib/widgets/scanner/nfc_modal.dart +++ b/lib/widgets/scanner/nfc_modal.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class NFCModal extends StatefulWidget { final String? modalKey; diff --git a/lib/widgets/text_input_modal.dart b/lib/widgets/text_input_modal.dart index 76e8e136..11c31ac5 100644 --- a/lib/widgets/text_input_modal.dart +++ b/lib/widgets/text_input_modal.dart @@ -5,7 +5,7 @@ import 'package:citizenwallet/widgets/header.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class TextInputModal extends StatefulWidget { final String title; diff --git a/lib/widgets/vouchers/amount_input_modal.dart b/lib/widgets/vouchers/amount_input_modal.dart index bd5b001c..5dcc4c33 100644 --- a/lib/widgets/vouchers/amount_input_modal.dart +++ b/lib/widgets/vouchers/amount_input_modal.dart @@ -7,7 +7,7 @@ import 'package:citizenwallet/widgets/header.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class AmountInputModal extends StatefulWidget { final String title; diff --git a/lib/widgets/webview/connected_webview_send_modal.dart b/lib/widgets/webview/connected_webview_send_modal.dart index d6547119..9cbe369b 100644 --- a/lib/widgets/webview/connected_webview_send_modal.dart +++ b/lib/widgets/webview/connected_webview_send_modal.dart @@ -12,7 +12,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class ConnectedWebViewSendModal extends StatefulWidget { final String address; diff --git a/lib/widgets/webview/webview_navigation.dart b/lib/widgets/webview/webview_navigation.dart index 1ddc790e..d132b192 100644 --- a/lib/widgets/webview/webview_navigation.dart +++ b/lib/widgets/webview/webview_navigation.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:citizenwallet/theme/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; class WebViewNavigation extends StatelessWidget { final String? url; diff --git a/test/router_extension.dart b/test/router_extension.dart index 7190572d..5c1c7f2e 100644 --- a/test/router_extension.dart +++ b/test/router_extension.dart @@ -1,6 +1,6 @@ import 'package:citizenwallet/state/theme/state.dart'; import 'package:citizenwallet/theme/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:citizenwallet/state/state.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/scheduler.dart'; From e314200ba662e829d444baa57c8b72697442d15b Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Fri, 18 Jul 2025 11:58:54 +0530 Subject: [PATCH 02/46] Wallet Refactor --- lib/main.dart | 1 - lib/modals/wallet/deep_link.dart | 12 +- lib/router/router.dart | 1 - lib/screens/account/screen.dart | 13 +- lib/screens/cards/screen.dart | 2 +- lib/screens/deeplink/deep_link.dart | 10 +- lib/screens/send/send_to.dart | 2 +- lib/screens/send/tip_details.dart | 2 +- lib/screens/transaction/screen.dart | 4 +- lib/screens/wallet/screen.dart | 21 +- lib/screens/wallet/screen.web.dart | 33 +- lib/services/config/config.dart | 222 +- lib/services/wallet/wallet.dart | 2129 ++++++++--------- lib/state/deep_link/logic.dart | 45 +- lib/state/notifications/logic.dart | 59 +- lib/state/profile/logic.dart | 111 +- lib/state/profile/state.dart | 2 + lib/state/profiles/logic.dart | 36 +- lib/state/scan/logic.dart | 24 +- lib/state/transaction.dart | 18 +- lib/state/vouchers/logic.dart | 147 +- lib/state/wallet/logic.dart | 374 +-- .../webview/connected_webview_modal.dart | 2 +- 23 files changed, 1772 insertions(+), 1498 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index b68690f9..c050feb6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -62,7 +62,6 @@ FutureOr appRunner() async { AccountDBService(); - WalletService(); final config = ConfigService(); if (kIsWeb) { diff --git a/lib/modals/wallet/deep_link.dart b/lib/modals/wallet/deep_link.dart index 30a7a3e6..47db5601 100644 --- a/lib/modals/wallet/deep_link.dart +++ b/lib/modals/wallet/deep_link.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; import 'package:citizenwallet/services/wallet/wallet.dart'; import 'package:citizenwallet/state/deep_link/logic.dart'; @@ -15,16 +16,21 @@ import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; import 'package:citizenwallet/l10n/app_localizations.dart'; +import 'package:web3dart/web3dart.dart'; class DeepLinkModal extends StatefulWidget { - final WalletService wallet; + final Config config; + final EthPrivateKey credentials; + final EthereumAddress account; final String deepLink; final String deepLinkParams; const DeepLinkModal({ super.key, - required this.wallet, + required this.config, + required this.credentials, + required this.account, required this.deepLink, required this.deepLinkParams, }); @@ -42,7 +48,7 @@ class DeepLinkModalState extends State { void initState() { super.initState(); - _logic = DeepLinkLogic(context, widget.wallet); + _logic = DeepLinkLogic(context, widget.config, widget.credentials, widget.account); // post frame callback WidgetsBinding.instance.addPostFrameCallback((_) { diff --git a/lib/router/router.dart b/lib/router/router.dart index 7f44e921..2a33de45 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -437,7 +437,6 @@ GoRouter createRouter( return ChangeNotifierProvider( create: (_) => DeepLinkState(extra['deepLink']), child: DeepLinkScreen( - wallet: extra['wallet'], deepLink: extra['deepLink'], deepLinkParams: extra['deepLinkParams'], ), diff --git a/lib/screens/account/screen.dart b/lib/screens/account/screen.dart index 754c1031..9e8b6168 100644 --- a/lib/screens/account/screen.dart +++ b/lib/screens/account/screen.dart @@ -72,10 +72,21 @@ class AccountScreenState extends State { widget.address!, widget.alias!, (bool hasChanged) async { + // Initialize ProfileLogic with wallet state + _logic.setWalletState( + _walletLogic.config!, + _walletLogic.credentials!, + _walletLogic.accountAddress!, + ); + await _logic.loadProfileLink(); if (hasChanged) { - _logic.resetAll(); + // Only reset if we don't already have profile data + final profileState = context.read(); + if (profileState.username.isEmpty) { + _logic.resetAll(); + } final online = _walletLogic.isOnline; _logic.loadProfile(online: online); } diff --git a/lib/screens/cards/screen.dart b/lib/screens/cards/screen.dart index 80ef7c0b..38a0612c 100644 --- a/lib/screens/cards/screen.dart +++ b/lib/screens/cards/screen.dart @@ -46,7 +46,7 @@ class CardsScreenState extends State { } print( - '${AppLocalizations.of(context)!.initialAddress} ${widget.walletLogic.privateKey.address.hexEip55}'); + '${AppLocalizations.of(context)!.initialAddress} ${widget.walletLogic.privateKey?.address.hexEip55 ?? 'No address'}'); // _logic.configure( // widget.walletLogic.privateKey, wallet.account, wallet.alias); diff --git a/lib/screens/deeplink/deep_link.dart b/lib/screens/deeplink/deep_link.dart index 10acc764..a0ca8e60 100644 --- a/lib/screens/deeplink/deep_link.dart +++ b/lib/screens/deeplink/deep_link.dart @@ -17,14 +17,11 @@ import 'package:provider/provider.dart'; import 'package:citizenwallet/l10n/app_localizations.dart'; class DeepLinkScreen extends StatefulWidget { - final WalletService wallet; - final String deepLink; final String deepLinkParams; const DeepLinkScreen({ super.key, - required this.wallet, required this.deepLink, required this.deepLinkParams, }); @@ -42,12 +39,11 @@ class DeepLinkScreenState extends State { void initState() { super.initState(); - _logic = DeepLinkLogic(context, widget.wallet); + // _logic = DeepLinkLogic(context); // post frame callback WidgetsBinding.instance.addPostFrameCallback((_) { // initial requests go here - onLoad(); }); } @@ -60,6 +56,10 @@ class DeepLinkScreenState extends State { } void onLoad() async { + final wallet = context.read().wallet; + if (wallet == null) { + return; + } switch (widget.deepLink) { case 'faucet-v1': // handle loading of metadata diff --git a/lib/screens/send/send_to.dart b/lib/screens/send/send_to.dart index 2774855d..141ff696 100644 --- a/lib/screens/send/send_to.dart +++ b/lib/screens/send/send_to.dart @@ -249,7 +249,7 @@ class _SendToScreenState extends State { return; } - widget.profilesLogic.getProfile(hex); + widget.profilesLogic.getLocalProfile(hex); if (!context.mounted) { return; diff --git a/lib/screens/send/tip_details.dart b/lib/screens/send/tip_details.dart index 348919b7..79ea4525 100644 --- a/lib/screens/send/tip_details.dart +++ b/lib/screens/send/tip_details.dart @@ -74,7 +74,7 @@ class _TipDetailsScreenState extends State { if (tipTo != null) { // Get profile from tipTo address - widget.profilesLogic.getProfile(tipTo).then((profile) { + widget.profilesLogic.getLocalProfile(tipTo).then((profile) { if (profile != null) { widget.profilesLogic.selectProfile(profile); } diff --git a/lib/screens/transaction/screen.dart b/lib/screens/transaction/screen.dart index 225f66b4..5783c09f 100644 --- a/lib/screens/transaction/screen.dart +++ b/lib/screens/transaction/screen.dart @@ -88,7 +88,7 @@ class TransactionScreenState extends State walletLogic.addressController.text = address; - final profile = await profilesLogic.getProfile(address); + final profile = await profilesLogic.getLocalProfile(address); walletLogic.updateAddress(override: profile != null); @@ -139,7 +139,7 @@ class TransactionScreenState extends State walletLogic.updateMessage(); walletLogic.updateListenerAmount(); - final profile = await profilesLogic.getProfile(address); + final profile = await profilesLogic.getLocalProfile(address); walletLogic.updateAddress(override: profile != null); walletLogic.updateAmount(); diff --git a/lib/screens/wallet/screen.dart b/lib/screens/wallet/screen.dart index 57ed928f..86142281 100644 --- a/lib/screens/wallet/screen.dart +++ b/lib/screens/wallet/screen.dart @@ -174,6 +174,12 @@ class WalletScreenState extends State { _address!, _alias!, (bool hasChanged) async { + _profileLogic.setWalletState( + _logic.config!, + _logic.credentials!, + _logic.accountAddress!, + ); + _logic.requestWalletActions(); await _logic.loadTransactions(); @@ -242,7 +248,6 @@ class WalletScreenState extends State { final navigator = GoRouter.of(context); await navigator.push('/wallet/$_address/deeplink', extra: { - 'wallet': _logic.wallet, 'deepLink': deepLink, 'deepLinkParams': deepLinkParams, }); @@ -379,7 +384,7 @@ class WalletScreenState extends State { } _logic.updateAddress(override: true); - _profilesLogic.getProfile(addr); + _profilesLogic.getLocalProfile(addr); await navigator.push('/wallet/$_address/send/$addr', extra: { 'walletLogic': _logic, @@ -449,8 +454,12 @@ class WalletScreenState extends State { _voucherLogic.pause(); if (receiveParams != null) { + final wallet = context.read().wallet; + if (wallet == null) { + return; + } final hex = await _logic.updateFromCapture( - '/#/?alias=${_logic.wallet.alias}&receiveParams=$receiveParams', + '/#/?alias=${wallet.alias}&receiveParams=$receiveParams', ); if (hex == null) { @@ -467,7 +476,7 @@ class WalletScreenState extends State { return; } - _profilesLogic.getProfile(hex); + _profilesLogic.getLocalProfile(hex); final navigator = GoRouter.of(context); @@ -833,7 +842,7 @@ class WalletScreenState extends State { final pluginUrl = '$redirectUrl/#/?dl=plugin'; final connection = _logic.connection; - String url = '$result?${connection.queryParams}'; + String url = '$result?${connection?.queryParams ?? ''}'; if (result.startsWith(pluginUrl)) { final resultUri = Uri.parse(result); final uri = Uri.parse(resultUri.fragment); @@ -856,7 +865,7 @@ class WalletScreenState extends State { } url = - '${pluginConfig.url}${pluginConfig.url.contains('?') ? '&' : '?'}${connection.queryParams}'; + '${pluginConfig.url}${pluginConfig.url.contains('?') ? '&' : '?'}${connection?.queryParams ?? ''}'; } if (!super.mounted) { diff --git a/lib/screens/wallet/screen.web.dart b/lib/screens/wallet/screen.web.dart index 17f889d7..eb4b937a 100644 --- a/lib/screens/wallet/screen.web.dart +++ b/lib/screens/wallet/screen.web.dart @@ -206,19 +206,26 @@ class BurnerWalletScreenState extends State { _profilesLogic.pause(); _voucherLogic.pause(); - await CupertinoScaffold.showCupertinoModalBottomSheet( - context: context, - expand: true, - useRootNavigator: true, - builder: (modalContext) => ChangeNotifierProvider( - create: (_) => DeepLinkState(deepLink), - child: DeepLinkModal( - wallet: _logic.wallet, - deepLink: deepLink, - deepLinkParams: params, - ), - ), - ); + // await CupertinoScaffold.showCupertinoModalBottomSheet( + // context: context, + // expand: true, + // useRootNavigator: true, + // builder: (modalContext) => ChangeNotifierProvider( + // create: (_) => DeepLinkState(deepLink), + // child: DeepLinkModal( + // wallet: _logic.wallet, + // deepLink: deepLink, + // deepLinkParams: params, + // ), + // ), + // ); + + final navigator = GoRouter.of(context); + + await navigator.push('/wallet/${widget.encoded}/deeplink', extra: { + 'deepLink': deepLink, + 'deepLinkParams': params, + }); _logic.resumeFetching(); _profilesLogic.resume(); diff --git a/lib/services/config/config.dart b/lib/services/config/config.dart index a31a9ca8..9ce42e10 100644 --- a/lib/services/config/config.dart +++ b/lib/services/config/config.dart @@ -1,5 +1,22 @@ +import 'dart:convert'; + +import 'package:http/http.dart'; +import 'package:citizenwallet/services/api/api.dart'; import 'package:citizenwallet/services/config/legacy.dart'; import 'package:collection/collection.dart'; +import 'package:citizenwallet/services/wallet/contracts/account_factory.dart'; +import 'package:citizenwallet/services/wallet/contracts/cards/interface.dart'; +import 'package:citizenwallet/services/wallet/contracts/cards/safe_card_manager.dart'; +import 'package:citizenwallet/services/wallet/contracts/communityModule.dart'; +import 'package:citizenwallet/services/wallet/contracts/entrypoint.dart'; +import 'package:citizenwallet/services/wallet/contracts/erc1155.dart'; +import 'package:citizenwallet/services/wallet/contracts/erc20.dart'; +import 'package:citizenwallet/services/wallet/contracts/profile.dart'; +import 'package:citizenwallet/services/wallet/contracts/safe_account.dart'; +import 'package:citizenwallet/services/wallet/contracts/simple_account.dart'; +import 'package:citizenwallet/utils/uint8.dart'; +import 'package:web3dart/crypto.dart'; +import 'package:web3dart/web3dart.dart'; const String defaultPrimary = '#A256FF'; @@ -66,6 +83,7 @@ class CommunityConfig { final ContractLocation profile; final ContractLocation primaryToken; final ContractLocation primaryAccountFactory; + final ContractLocation? primarySessionManager; final ContractLocation? primaryCardManager; CommunityConfig({ @@ -80,6 +98,7 @@ class CommunityConfig { required this.profile, required this.primaryToken, required this.primaryAccountFactory, + this.primarySessionManager, this.primaryCardManager, }); @@ -101,6 +120,9 @@ class CommunityConfig { primaryToken: ContractLocation.fromJson(json['primary_token']), primaryAccountFactory: ContractLocation.fromJson(json['primary_account_factory']), + primarySessionManager: json['primary_session_manager'] != null + ? ContractLocation.fromJson(json['primary_session_manager']) + : null, primaryCardManager: json['primary_card_manager'] != null ? ContractLocation.fromJson(json['primary_card_manager']) : null, @@ -121,6 +143,8 @@ class CommunityConfig { 'profile': profile.toJson(), 'primary_token': primaryToken.toJson(), 'primary_account_factory': primaryAccountFactory.toJson(), + if (primarySessionManager != null) + 'primary_session_manager': primarySessionManager!.toJson(), if (primaryCardManager != null) 'primary_card_manager': primaryCardManager!.toJson(), }; @@ -364,7 +388,7 @@ enum PluginLaunchMode { class PluginConfig { final String name; final String? icon; - String url; + final String url; final PluginLaunchMode launchMode; final String? action; final bool hidden; @@ -394,10 +418,6 @@ class PluginConfig { ); } - void updateUrl(String url) { - this.url = url; - } - // to json Map toJson() { return { @@ -414,7 +434,7 @@ class PluginConfig { // to string @override String toString() { - return 'PluginConfig{name: $name, icon: $icon, url: $url, launchMode: $launchMode, action: $action, hidden: $hidden, signature: $signature}'; + return 'PluginConfig{name: $name, icon: $icon, url: $url}'; } } @@ -489,15 +509,54 @@ class CardsConfig extends ContractLocation { return { 'chain_id': chainId, 'address': address, + 'instance_id': instanceId, 'type': type.name, - if (instanceId != null) 'instance_id': instanceId, }; } // to string @override String toString() { - return 'CardsConfig{chainId: $chainId, address: $address, type: $type}'; + return 'CardsConfig{chainId: $chainId, address: $address, instanceId: $instanceId, type: $type}'; + } +} + +class SessionsConfig { + final int chainId; + final String moduleAddress; + final String factoryAddress; + final String providerAddress; + + SessionsConfig({ + required this.chainId, + required this.moduleAddress, + required this.factoryAddress, + required this.providerAddress, + }); + + factory SessionsConfig.fromJson(Map json) { + return SessionsConfig( + chainId: json['chain_id'], + moduleAddress: json['module_address'], + factoryAddress: json['factory_address'], + providerAddress: json['provider_address'], + ); + } + + // to json + Map toJson() { + return { + 'chain_id': chainId, + 'module_address': moduleAddress, + 'factory_address': factoryAddress, + 'provider_address': providerAddress, + }; + } + + // to string + @override + String toString() { + return 'SessionsConfig{chainId: $chainId, moduleAddress: $moduleAddress, factoryAddress: $factoryAddress, providerAddress: $providerAddress}'; } } @@ -530,6 +589,7 @@ class Config { final Map tokens; final ScanConfig scan; final Map accounts; + final Map? sessions; final Map? cards; final Map chains; final IPFSConfig ipfs; @@ -538,11 +598,27 @@ class Config { final int version; bool online; + late Web3Client ethClient; + late APIService ipfsService; + late APIService engine; + late APIService engineRPC; + late APIService engineIPFSService; + + late StackupEntryPoint entryPointContract; + late CommunityModule communityModuleContract; + late AccountFactoryService accountFactoryContract; + late ProfileContract profileContract; + AbstractCardManagerContract? cardManagerContract; + + late ERC20Contract token20Contract; + late ERC1155Contract token1155Contract; + Config({ required this.community, required this.tokens, required this.scan, required this.accounts, + required this.sessions, required this.cards, required this.chains, required this.ipfs, @@ -550,7 +626,108 @@ class Config { required this.configLocation, this.version = 0, this.online = true, - }); + }) { + final chain = chains.values.first; + final rpcUrl = getRpcUrl(chain.id.toString()); + final nodeUrl = getNodeUrl(chain.id.toString()); + + ethClient = Web3Client(rpcUrl, Client()); + ipfsService = APIService(baseURL: ipfs.url); + engine = APIService(baseURL: nodeUrl); + engineRPC = APIService(baseURL: rpcUrl); + engineIPFSService = APIService(baseURL: nodeUrl); + } + + Future initContracts() async { + final chain = chains.values.first; + + final erc4337Config = getPrimaryAccountAbstractionConfig(); + + entryPointContract = StackupEntryPoint( + chain.id, + ethClient, + erc4337Config.entrypointAddress, + ); + await entryPointContract.init(); + + communityModuleContract = CommunityModule( + chain.id, + ethClient, + erc4337Config.entrypointAddress, + ); + await communityModuleContract.init(); + + accountFactoryContract = AccountFactoryService( + chain.id, + ethClient, + erc4337Config.accountFactoryAddress, + ); + await accountFactoryContract.init(); + + token20Contract = ERC20Contract( + chain.id, + ethClient, + getPrimaryToken().address, + ); + await token20Contract.init(); + + token1155Contract = ERC1155Contract( + chain.id, + ethClient, + getPrimaryToken().address, + ); + await token1155Contract.init(); + + profileContract = ProfileContract( + chain.id, + ethClient, + community.profile.address, + ); + await profileContract.init(); + + final primaryCardManager = getPrimaryCardManager(); + + if (primaryCardManager != null && + primaryCardManager.type == CardManagerType.safe) { + cardManagerContract = SafeCardManagerContract( + keccak256(utf8.encode(primaryCardManager.instanceId!)), + chain.id, + ethClient, + primaryCardManager.address, + ); + await cardManagerContract!.init(); + } + } + + Future getSimpleAccount(String address) async { + final chain = chains.values.first; + + final account = SimpleAccount( + chain.id, + ethClient, + address, + ); + await account.init(); + + return account; + } + + Future getSafeAccount(String address) async { + final chain = chains.values.first; + + final account = SafeAccount( + chain.id, + ethClient, + address, + ); + await account.init(); + + return account; + } + + Future getNonce(String address) async { + return await entryPointContract.getNonce(address); + } factory Config.fromLegacy(LegacyConfig legacy) { final community = CommunityConfig( @@ -636,6 +813,7 @@ class Config { tokens: tokens, scan: ScanConfig(name: legacy.scan.name, url: legacy.scan.url), accounts: accounts, + sessions: null, cards: cards, chains: chains, ipfs: IPFSConfig(url: legacy.ipfs.url), @@ -658,6 +836,8 @@ class Config { scan: ScanConfig.fromJson(json['scan']), accounts: (json['accounts'] as Map) .map((key, value) => MapEntry(key, ERC4337Config.fromJson(value))), + sessions: (json['sessions'] as Map?) + ?.map((key, value) => MapEntry(key, SessionsConfig.fromJson(value))), cards: (json['cards'] as Map?) ?.map((key, value) => MapEntry(key, CardsConfig.fromJson(value))), chains: (json['chains'] as Map) @@ -678,6 +858,9 @@ class Config { 'tokens': tokens.map((key, value) => MapEntry(key, value.toJson())), 'scan': scan.toJson(), 'accounts': accounts.map((key, value) => MapEntry(key, value.toJson())), + if (sessions != null) + 'sessions': + sessions!.map((key, value) => MapEntry(key, value.toJson())), if (cards != null) 'cards': cards!.map((key, value) => MapEntry(key, value.toJson())), 'chains': chains.map((key, value) => MapEntry(key, value.toJson())), @@ -722,6 +905,27 @@ class Config { return primaryAccountAbstraction; } + SessionsConfig getPrimarySessionManager() { + if (sessions == null) { + throw Exception('Sessions not found'); + } + + final primarySessionManager = + sessions![community.primarySessionManager!.fullAddress]; + + if (primarySessionManager == null) { + throw Exception('Primary Session Manager Config not found'); + } + + return primarySessionManager; + } + + String getPaymasterType() { + final erc4337Config = getPrimaryAccountAbstractionConfig(); + + return erc4337Config.paymasterType; + } + CardsConfig? getPrimaryCardManager() { return cards?[community.primaryCardManager?.fullAddress]; } diff --git a/lib/services/wallet/wallet.dart b/lib/services/wallet/wallet.dart index 0a8068c8..41fde431 100644 --- a/lib/services/wallet/wallet.dart +++ b/lib/services/wallet/wallet.dart @@ -5,24 +5,16 @@ import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/indexer/pagination.dart'; import 'package:citizenwallet/services/indexer/push_update_request.dart'; import 'package:citizenwallet/services/indexer/signed_request.dart'; -import 'package:citizenwallet/services/preferences/preferences.dart'; +import 'package:citizenwallet/services/engine/utils.dart'; import 'package:citizenwallet/services/sigauth/sigauth.dart'; -import 'package:citizenwallet/services/wallet/contracts/accessControl.dart'; -import 'package:citizenwallet/services/wallet/contracts/cards/card_manager.dart'; -import 'package:citizenwallet/services/wallet/contracts/cards/safe_card_manager.dart'; -import 'package:citizenwallet/services/wallet/contracts/communityModule.dart'; -import 'package:citizenwallet/services/wallet/contracts/entrypoint.dart'; -import 'package:citizenwallet/services/wallet/contracts/erc1155.dart'; import 'package:citizenwallet/services/wallet/contracts/erc20.dart'; import 'package:citizenwallet/services/wallet/contracts/profile.dart'; -import 'package:citizenwallet/services/wallet/contracts/safe_account.dart'; import 'package:citizenwallet/services/wallet/contracts/simpleFaucet.dart'; -import 'package:citizenwallet/services/wallet/contracts/simple_account.dart'; -import 'package:citizenwallet/services/wallet/contracts/account_factory.dart'; +import 'package:citizenwallet/services/wallet/contracts/cards/card_manager.dart'; +import 'package:citizenwallet/services/wallet/contracts/cards/safe_card_manager.dart'; import 'package:citizenwallet/services/wallet/contracts/cards/interface.dart'; -import 'package:citizenwallet/services/engine/utils.dart'; +import 'package:citizenwallet/services/wallet/contracts/accessControl.dart'; import 'package:citizenwallet/services/wallet/gas.dart'; -import 'package:citizenwallet/services/wallet/models/chain.dart'; import 'package:citizenwallet/services/wallet/models/json_rpc.dart'; import 'package:citizenwallet/services/wallet/models/paymaster_data.dart'; import 'package:citizenwallet/services/wallet/models/userop.dart'; @@ -30,991 +22,677 @@ import 'package:citizenwallet/services/wallet/utils.dart'; import 'package:citizenwallet/utils/delay.dart'; import 'package:citizenwallet/utils/uint8.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:http/http.dart'; import 'package:web3dart/crypto.dart'; import 'package:web3dart/web3dart.dart'; -import 'package:web_socket_channel/web_socket_channel.dart'; - -class WalletService { - static final WalletService _instance = WalletService._internal(); - factory WalletService() { - return _instance; +/// given a tx hash, waits for the tx to be mined +Future waitForTxSuccess( + Config config, + String txHash, { + int retryCount = 0, + int maxRetries = 20, +}) async { + if (retryCount >= maxRetries) { + return false; } - final PreferencesService _pref = PreferencesService(); - - BigInt? _chainId; - late NativeCurrency currency; + final ethClient = config.ethClient; - late Client _client; + final receipt = await ethClient.getTransactionReceipt(txHash); + if (receipt?.status != true) { + // there is either no receipt or the tx is still not confirmed - late String _alias; - late String _url; - late String _wsurl; - late Web3Client _ethClient; + // increment the retry count + final nextRetryCount = retryCount + 1; - late String ipfsUrl; - late APIService _ipfs; - late APIService _indexer; - late APIService _indexerIPFS; + // wait for a bit before retrying + await delay(Duration(milliseconds: 250 * (nextRetryCount))); - late APIService _rpc; - late APIService _bundlerRPC; - late APIService _paymasterRPC; - late String _paymasterType; - - late EIP1559GasPriceEstimator _gasPriceEstimator; - - late Map erc4337Headers; - - WalletService._internal() { - _client = Client(); + // retry + return waitForTxSuccess( + config, + txHash, + retryCount: nextRetryCount, + maxRetries: maxRetries, + ); } - // Declare variables using the `late` keyword, which means they will be initialized at a later time. -// The variables are related to Ethereum blockchain development. - late EthPrivateKey - _credentials; // Represents a private key for an Ethereum account. - late EthereumAddress _account; // Represents an Ethereum address. - late SigAuthService _sigAuth; - - late StackupEntryPoint - _contractEntryPoint; // Represents the entry point for a smart contract on the Ethereum blockchain. - late CommunityModule _contractCommunityModule; - late AccountFactoryService - _contractAccountFactory; // Represents a factory for creating Ethereum accounts. - String _tokenStandard = 'erc20'; - ERC20Contract? - _contractToken; // Represents a smart contract for an ERC20 token on the Ethereum blockchain. - ERC1155Contract? - _contract1155Token; // Represents a smart contract for an ERC1155 token on the Ethereum blockchain. - late AccessControlUpgradeableContract _contractAccessControl; - late SimpleAccount _contractAccount; // Represents a simple Ethereum account. - late SafeAccount _contractSafeAccount; - late ProfileContract - _contractProfile; // Represents a smart contract for a user profile on the Ethereum blockchain. - AbstractCardManagerContract? _cardManager; - - EthPrivateKey get credentials => _credentials; - EthereumAddress get address => _credentials.address; - EthereumAddress get account => _account; - - /// retrieves the current balance of the address - Future getBalance({String? addr, BigInt? tokenId}) async { - try { - BigInt b = BigInt.zero; - if (_tokenStandard == 'erc20') { - b = await _contractToken!.getBalance(addr ?? _account.hexEip55).timeout( - const Duration(seconds: 10), - ); - } else if (_tokenStandard == 'erc1155') { - b = await _contract1155Token! - .getBalance(addr ?? _account.hexEip55, tokenId ?? BigInt.zero) - .timeout( - const Duration(seconds: 10), - ); - } - - // TODO: figure out why the returned balance is sometimes out of bounds - _pref.setBalance(_account.hexEip55, b.toString()); - - return b.toString(); - } catch (_) {} + return true; +} - return _pref.getBalance(_account.hexEip55) ?? '0'; +/// construct transfer call data +Uint8List tokenTransferCallData( + Config config, + EthereumAddress from, + String to, + BigInt amount, { + BigInt? tokenId, +}) { + if (config.getPrimaryToken().standard == 'erc20') { + return config.token20Contract.transferCallData(to, amount); + } else if (config.getPrimaryToken().standard == 'erc1155') { + return config.token1155Contract + .transferCallData(from.hexEip55, to, tokenId ?? BigInt.zero, amount); } - String get standard => _tokenStandard; + return Uint8List.fromList([]); +} - Future get minter async { - return _contractAccessControl.isMinter(_account.hexEip55); +String transferEventStringSignature(Config config) { + if (config.getPrimaryToken().standard == 'erc20') { + return config.token20Contract.transferEventStringSignature; + } else if (config.getPrimaryToken().standard == 'erc1155') { + return config.token1155Contract.transferEventStringSignature; } - /// retrieve chain id - int get chainId => _chainId != null ? _chainId!.toInt() : 0; - String? get alias { - try { - return _alias; - } catch (_) {} + return ''; +} - return null; +String transferEventSignature(Config config) { + if (config.getPrimaryToken().standard == 'erc20') { + return config.token20Contract.transferEventSignature; + } else if (config.getPrimaryToken().standard == 'erc1155') { + return config.token1155Contract.transferEventSignature; } - String get tokenAddress => _tokenStandard == 'erc20' - ? _contractToken!.addr - : _contract1155Token!.addr; - String get profileAddress => _contractProfile.addr; - - SigAuthConnection get connection => _sigAuth.connect(); - - Future get accountNonce async => - getEntryPointContract().getNonce(_account.hexEip55); - - Future init( - EthereumAddress account, - EthPrivateKey privateKey, - NativeCurrency currency, - Config config, { - void Function(String)? onNotify, - void Function(bool)? onFinished, - }) async { - _alias = config.community.alias; - - final token = config.getPrimaryToken(); - final accountAbstractionConfig = - config.getPrimaryAccountAbstractionConfig(); - final chain = config.chains[token.chainId.toString()]; - - _url = chain!.node.url; - _wsurl = chain.node.wsUrl; - - final rpcUrl = config.getRpcUrl(token.chainId.toString()); - - _ethClient = Web3Client( - rpcUrl, - _client, - // socketConnector: () => - // WebSocketChannel.connect(Uri.parse(_wsurl)).cast(), - ); - - ipfsUrl = config.ipfs.url; - _ipfs = APIService(baseURL: ipfsUrl); - _indexer = APIService(baseURL: _url); - _indexerIPFS = APIService(baseURL: _url); - - _rpc = APIService(baseURL: rpcUrl); - - _bundlerRPC = APIService(baseURL: rpcUrl); - _paymasterRPC = APIService(baseURL: rpcUrl); - _paymasterType = accountAbstractionConfig.paymasterType; + return ''; +} - _gasPriceEstimator = EIP1559GasPriceEstimator( - _rpc, - _ethClient, - gasExtraPercentage: accountAbstractionConfig.gasExtraPercentage, - ); +/// retrieves the current balance of the address +Future getBalance( + Config config, + EthereumAddress addr, { + BigInt? tokenId, +}) async { + try { + final tokenStandard = config.getPrimaryToken().standard; + + BigInt balance = BigInt.zero; + switch (tokenStandard) { + case 'erc20': + balance = + await config.token20Contract.getBalance(addr.hexEip55).timeout( + const Duration(seconds: 4), + ); - erc4337Headers = {}; - if (!kIsWeb || kDebugMode) { - // on native, we need to set the origin header - erc4337Headers['Origin'] = dotenv.get('ORIGIN_HEADER'); + break; + case 'erc1155': + balance = await config.token1155Contract + .getBalance(addr.hexEip55, tokenId ?? BigInt.zero) + .timeout( + const Duration(seconds: 4), + ); + break; } - _credentials = privateKey; - _sigAuth = SigAuthService( - credentials: privateKey, - address: account, - redirect: dotenv.get('ORIGIN_HEADER'), - ); - - final cachedChainId = _pref.getChainIdForAlias(config.community.alias); - _chainId = cachedChainId != null - ? BigInt.parse(cachedChainId) - : await _ethClient.getChainId(); - await _pref.setChainIdForAlias( - config.community.alias, _chainId!.toString()); - - this.currency = currency; + return balance.toString(); + } catch (e, s) { + debugPrint('error: $e'); + debugPrint('stack trace: $s'); + } - final primaryCardManager = config.getPrimaryCardManager(); + return '0'; +} - if (primaryCardManager != null && - primaryCardManager.type == CardManagerType.classic) { - _cardManager = CardManagerContract( - _chainId!.toInt(), - _ethClient, - primaryCardManager.address, - ); - } +/// get profile data +Future getProfile(Config config, String addr) async { + try { + final url = await config.profileContract.getURL(addr); - if (primaryCardManager != null && - primaryCardManager.type == CardManagerType.safe && - primaryCardManager.instanceId != null) { - final instanceId = primaryCardManager.instanceId!; - _cardManager = SafeCardManagerContract( - keccak256(convertStringToUint8List(instanceId)), - _chainId!.toInt(), - _ethClient, - primaryCardManager.address, - ); - } + final profileData = await config.ipfsService.get(url: '/$url'); - await _cardManager?.init(); + final profile = ProfileV1.fromJson(profileData); - await _initContracts( - account, - config.community.alias, - accountAbstractionConfig.entrypointAddress, - accountAbstractionConfig.accountFactoryAddress, - token, - config.community.profile.address, - ); + profile.parseIPFSImageURLs(config.ipfs.url); - onFinished?.call(true); + return profile; + } catch (exception) { + // } - Future getCardHash(String serial, {bool local = true}) async { - if (_cardManager == null) { - throw Exception('Card manager not initialized'); - } + return null; +} - return _cardManager!.getCardHash(serial, local: local); - } +/// get profile data by username +Future getProfileByUsername(Config config, String username) async { + try { + final url = await config.profileContract.getURLFromUsername(username); - Future getCardAddress(Uint8List hash) async { - if (_cardManager == null) { - throw Exception('Card manager not initialized'); - } - return _cardManager!.getCardAddress(hash); - } + final profileData = await config.ipfsService.get(url: '/$url'); - Future initWeb( - EthereumAddress account, - EthPrivateKey privateKey, - NativeCurrency currency, - Config config, { - bool legacy = false, - }) async { - // _useLegacyBundlers = legacy; - - // _alias = config.community.alias; - // _url = config.node.url; - // _wsurl = config.node.wsUrl; - - // _ethClient = Web3Client( - // _url, - // _client, - // socketConnector: () => - // WebSocketChannel.connect(Uri.parse(_wsurl)).cast(), - // ); - - // ipfsUrl = config.ipfs.url; - // _ipfs = APIService(baseURL: ipfsUrl); - // _indexer = APIService(baseURL: config.indexer.url); - // _indexerIPFS = APIService(baseURL: config.indexer.ipfsUrl); - - // _rpc = APIService(baseURL: config.node.url); - // _bundlerRPC = APIService( - // baseURL: config.erc4337.paymasterAddress != null - // ? '${config.erc4337.rpcUrl}/${config.erc4337.paymasterAddress}' - // : config.erc4337.rpcUrl); - // _paymasterRPC = APIService( - // baseURL: config.erc4337.paymasterAddress != null - // ? '${config.erc4337.paymasterRPCUrl}/${config.erc4337.paymasterAddress}' - // : config.erc4337.paymasterRPCUrl); - // _paymasterType = config.erc4337.paymasterType; - - // _gasPriceEstimator = EIP1559GasPriceEstimator( - // _rpc, - // _ethClient, - // gasExtraPercentage: config.erc4337.gasExtraPercentage, - // ); - - // erc4337Headers = {}; - // if (!kIsWeb || kDebugMode) { - // // on native, we need to set the origin header - // erc4337Headers['Origin'] = dotenv.get('ORIGIN_HEADER'); - // } - - // _credentials = privateKey; - - // final cachedChainId = _pref.getChainIdForAlias(config.community.alias); - // _chainId = cachedChainId != null - // ? BigInt.parse(cachedChainId) - // : await _ethClient.getChainId(); - // await _pref.setChainIdForAlias( - // config.community.alias, _chainId!.toString()); - - // this.currency = currency; - - // _legacy4337Bundlers = await getLegacy4337Bundlers(); - - // await _initContracts( - // account, - // config.community.alias, - // config.erc4337.entrypointAddress, - // config.erc4337.accountFactoryAddress, - // config.token.address, - // config.profile.address, - // ); - - // await _initLegacyContracts(); - // await _initLegacyRPCs(); - } + final profile = ProfileV1.fromJson(profileData); - /// Initializes the Ethereum smart contracts used by the wallet. - /// - /// [account] The account address - /// [alias] The community alias - /// [eaddr] The Ethereum address of the entry point for the smart contract. - /// [afaddr] The Ethereum address of the account factory smart contract. - /// [taddr] The Ethereum address of the ERC20 token smart contract. - /// [prfaddr] The Ethereum address of the user profile smart contract. - Future _initContracts( - EthereumAddress account, - String alias, - String eaddr, - String afaddr, - TokenConfig token, - String prfaddr, - ) async { - // Get the Ethereum address for the current account. - // _account = EthereumAddress.fromHex(account); - _account = account; - await _pref.setAccountAddress( - _credentials.address.hexEip55, - address.hexEip55, - ); + profile.parseIPFSImageURLs(config.ipfs.url); - // Create a new simple account instance and initialize it. - _contractAccount = SimpleAccount(chainId, _ethClient, _account.hexEip55); - await _contractAccount.init(); + return profile; + } catch (exception) { + // + } - // Create a new safe account instance and initialize it. - _contractSafeAccount = SafeAccount(chainId, _ethClient, _account.hexEip55); - await _contractSafeAccount.init(); + return null; +} - // Create a new entry point instance and initialize it. - _contractEntryPoint = StackupEntryPoint(chainId, _ethClient, eaddr); - await _contractEntryPoint.init(); +/// profileExists checks whether there is a profile for this username +Future profileExists(Config config, String username) async { + try { + final url = await config.profileContract.getURLFromUsername(username); - // Create a new community module instance and initialize it. - _contractCommunityModule = CommunityModule(chainId, _ethClient, eaddr); - await _contractCommunityModule.init(); + return url != ''; + } catch (exception) { + // + } - // Create a new account factory instance and initialize it. - _contractAccountFactory = - AccountFactoryService(chainId, _ethClient, afaddr); - await _contractAccountFactory.init(); + return false; +} - _tokenStandard = token.standard; +/// get profile data +Future getProfileFromUrl(Config config, String url) async { + try { + final profileData = await config.ipfsService.get(url: '/$url'); - switch (token.standard) { - case 'erc20': - // Create a new ERC20 token contract instance and initialize it. - _contractToken = ERC20Contract(chainId, _ethClient, token.address); - await _contractToken?.init(); - break; - case 'erc1155': - _contract1155Token = - ERC1155Contract(chainId, _ethClient, token.address); - await _contract1155Token?.init(); - break; - } + final profile = ProfileV1.fromJson(profileData); - _contractAccessControl = - AccessControlUpgradeableContract(chainId, _ethClient, token.address); - await _contractAccessControl.init(); + profile.parseIPFSImageURLs(config.ipfs.url); - // Create a new user profile contract instance and initialize it. - _contractProfile = ProfileContract(chainId, _ethClient, prfaddr); - await _contractProfile.init(); + return profile; + } catch (exception) { + // } - /// given a tx hash, waits for the tx to be mined - Future waitForTxSuccess( - String txHash, { - int retryCount = 0, - int maxRetries = 20, - }) async { - if (retryCount >= maxRetries) { - return false; - } - - final receipt = await _ethClient.getTransactionReceipt(txHash); - if (receipt?.status != true) { - // there is either no receipt or the tx is still not confirmed - - // increment the retry count - final nextRetryCount = retryCount + 1; - - // wait for a bit before retrying - await delay(Duration(milliseconds: 250 * (nextRetryCount))); + return null; +} - // retry - return waitForTxSuccess( - txHash, - retryCount: nextRetryCount, - maxRetries: maxRetries, - ); - } +/// set profile data +Future setProfile( + Config config, + EthereumAddress account, + EthPrivateKey credentials, + ProfileRequest profile, { + required List image, + required String fileType, +}) async { + try { + final url = + '/v1/profiles/${config.profileContract.addr}/${account.hexEip55}'; + + final json = jsonEncode( + profile.toJson(), + ); - return true; - } + final body = SignedRequest(convertBytesToUint8List(utf8.encode(json))); - StackupEntryPoint getEntryPointContract({bool legacy = false}) { - return _contractEntryPoint; - } + final sig = await compute( + generateSignature, (jsonEncode(body.toJson()), credentials)); - AccountFactoryService getAccounFactoryContract({bool legacy = false}) { - return _contractAccountFactory; - } + final resp = await config.engineIPFSService.filePut( + url: url, + file: image, + fileType: fileType, + headers: { + 'X-Signature': sig, + 'X-Address': account.hexEip55, + }, + body: body.toJson(), + ); - APIService getBundlerRPC({bool legacy = false}) { - return _bundlerRPC; - } + final String profileUrl = resp['object']['ipfs_url']; - APIService getPaymasterRPC({bool legacy = false}) { - return _paymasterRPC; - } + final calldata = config.profileContract + .setCallData(account.hexEip55, profile.username, profileUrl); - String getPaymasterType({bool legacy = false}) { - return _paymasterType; - } + final (_, userop) = await prepareUserop( + config, + account, + credentials, + [config.profileContract.addr], + [calldata], + ); - /// fetches the balance of a given address - // Future getBalance(String addr, {BigInt? tokenId}) async { - // BigInt b = BigInt.zero; - // if (_tokenStandard == 'erc20') { - // b = await _contractToken!.getBalance(addr); - // } else if (_tokenStandard == 'erc1155') { - // b = await _contract1155Token!.getBalance(addr, tokenId!); - // } - - // return fromDoubleUnit( - // b.toString(), - // decimals: currency.decimals, - // ); - // } - - String get transferEventStringSignature { - if (_tokenStandard == 'erc20') { - return _contractToken!.transferEventStringSignature; - } else if (_tokenStandard == 'erc1155') { - return _contract1155Token!.transferEventStringSignature; + final txHash = await submitUserop(config, userop); + if (txHash == null) { + throw Exception('profile update failed'); } - return ''; - } - - String get transferEventSignature { - if (_tokenStandard == 'erc20') { - return _contractToken!.transferEventSignature; - } else if (_tokenStandard == 'erc1155') { - return _contract1155Token!.transferEventSignature; + final success = await waitForTxSuccess(config, txHash); + if (!success) { + throw Exception('transaction failed'); } - return ''; - } - - Future isMinter(String addr) async { - return _contractAccessControl.isMinter(addr); + return profileUrl; + } catch (e, s) { + debugPrint('error: $e'); + debugPrint('stack trace: $s'); } - /// set profile data - Future setProfile( - ProfileRequest profile, { - required List image, - required String fileType, - }) async { - try { - final url = '/v1/profiles/$profileAddress/${_account.hexEip55}'; - - final json = jsonEncode( - profile.toJson(), - ); - - final body = SignedRequest(convertBytesToUint8List(utf8.encode(json))); - - final sig = await compute( - generateSignature, (jsonEncode(body.toJson()), _credentials)); - - final resp = await _indexerIPFS.filePut( - url: url, - file: image, - fileType: fileType, - headers: { - 'X-Signature': sig, - 'X-Address': _account.hexEip55, - }, - body: body.toJson(), - ); - - final String profileUrl = resp['object']['ipfs_url']; + return null; +} - final calldata = _contractProfile.setCallData( - _account.hexEip55, profile.username, profileUrl); +/// update profile data +Future updateProfile(Config config, EthereumAddress account, + EthPrivateKey credentials, ProfileV1 profile) async { + try { + final url = + '/v1/profiles/${config.profileContract.addr}/${account.hexEip55}'; - final (_, userop) = await prepareUserop([profileAddress], [calldata]); + final json = jsonEncode( + profile.toJson(), + ); - final txHash = await submitUserop(userop); - if (txHash == null) { - throw Exception('profile update failed'); - } + final body = SignedRequest(convertBytesToUint8List(utf8.encode(json))); - final success = await waitForTxSuccess(txHash); - if (!success) { - throw Exception('transaction failed'); - } + final sig = await compute( + generateSignature, (jsonEncode(body.toJson()), credentials)); - return profileUrl; - } catch (_) {} + final resp = await config.engineIPFSService.patch( + url: url, + headers: { + 'X-Signature': sig, + 'X-Address': account.hexEip55, + }, + body: body.toJson(), + ); - return null; - } + final String profileUrl = resp['object']['ipfs_url']; - /// update profile data - Future updateProfile(ProfileV1 profile) async { - try { - final url = '/v1/profiles/$profileAddress/${_account.hexEip55}'; + final calldata = config.profileContract + .setCallData(account.hexEip55, profile.username, profileUrl); - final json = jsonEncode( - profile.toJson(), - ); + final (_, userop) = await prepareUserop( + config, + account, + credentials, + [config.profileContract.addr], + [calldata], + ); - final body = SignedRequest(convertBytesToUint8List(utf8.encode(json))); + final txHash = await submitUserop(config, userop); + if (txHash == null) { + throw Exception('profile update failed'); + } - final sig = await compute( - generateSignature, (jsonEncode(body.toJson()), _credentials)); + final success = await waitForTxSuccess(config, txHash); + if (!success) { + throw Exception('transaction failed'); + } - final resp = await _indexerIPFS.patch( - url: url, - headers: { - 'X-Signature': sig, - 'X-Address': _account.hexEip55, - }, - body: body.toJson(), - ); + return profileUrl; + } catch (_) {} - final String profileUrl = resp['object']['ipfs_url']; + return null; +} - final calldata = _contractProfile.setCallData( - _account.hexEip55, profile.username, profileUrl); +/// set profile data +Future deleteCurrentProfile( + Config config, + EthereumAddress account, + EthPrivateKey credentials, +) async { + try { + final url = + '/v1/profiles/${config.profileContract.addr}/${account.hexEip55}'; + + final encoded = jsonEncode( + { + 'account': account.hexEip55, + 'date': DateTime.now().toUtc().toIso8601String(), + }, + ); - final (_, userop) = await prepareUserop([profileAddress], [calldata]); + final body = SignedRequest(convertStringToUint8List(encoded)); - final txHash = await submitUserop(userop); - if (txHash == null) { - throw Exception('profile update failed'); - } + final sig = await compute( + generateSignature, (jsonEncode(body.toJson()), credentials)); - final success = await waitForTxSuccess(txHash); - if (!success) { - throw Exception('transaction failed'); - } - - return profileUrl; - } catch (_) {} + await config.engineIPFSService.delete( + url: url, + headers: { + 'X-Signature': sig, + 'X-Address': account.hexEip55, + }, + body: body.toJson(), + ); - return null; + return true; + } catch (e, s) { + debugPrint('error: $e'); + debugPrint('stack trace: $s'); } - /// set profile data - Future unpinCurrentProfile() async { - try { - final url = '/v1/profiles/$profileAddress/${_account.hexEip55}'; + return false; +} - final encoded = jsonEncode( - { - 'account': _account.hexEip55, - 'date': DateTime.now().toUtc().toIso8601String(), - }, - ); +/// check if an account exists +Future accountExists( + Config config, + EthereumAddress account, +) async { + try { + final url = '/v1/accounts/${account.hexEip55}/exists'; - final body = SignedRequest(convertStringToUint8List(encoded)); + await config.engine.get( + url: url, + ); - final sig = await compute( - generateSignature, (jsonEncode(body.toJson()), _credentials)); + return true; + } catch (_) {} - await _indexerIPFS.delete( - url: url, - headers: { - 'X-Signature': sig, - 'X-Address': _account.hexEip55, - }, - body: body.toJson(), - ); + return false; +} +/// create an account +Future createAccount( + Config config, + EthereumAddress account, + EthPrivateKey credentials, +) async { + try { + final exists = await accountExists(config, account); + if (exists) { return true; - } catch (_) {} - - return false; - } - - /// get profile data - Future getProfile(String addr) async { - try { - final url = await _contractProfile.getURL(addr); - - final profileData = await _ipfs.get(url: '/$url'); - - final profile = ProfileV1.fromJson(profileData); - - profile.parseIPFSImageURLs(ipfsUrl); - - return profile; - } on UnauthorizedException { - // - } on NotFoundException { - // - } on ConflictException { - // - } catch (exception) { - // - final rpcError = parseRPCErrorText(exception.toString()); - if (rpcError.code == -1) { - throw NetworkException(); - } } - return null; - } + final simpleAccount = await config.getSimpleAccount(account.hexEip55); - /// get profile data - Future getProfileFromUrl(String url) async { - try { - final profileData = await _ipfs.get(url: '/$url'); + Uint8List calldata = simpleAccount.transferOwnershipCallData( + credentials.address.hexEip55, + ); + if (config.getPaymasterType() == 'cw-safe') { + calldata = config.communityModuleContract.getChainIdCallData(); + } - final profile = ProfileV1.fromJson(profileData); + final (_, userop) = await prepareUserop( + config, + account, + credentials, + [account.hexEip55], + [calldata], + ); - profile.parseIPFSImageURLs(ipfsUrl); + final txHash = await submitUserop( + config, + userop, + ); + if (txHash == null) { + throw Exception('failed to submit user op'); + } - return profile; - } catch (exception) { - // + final success = await waitForTxSuccess(config, txHash); + if (!success) { + throw Exception('transaction failed'); } - return null; + return true; + } catch (e, s) { + debugPrint('error: $e'); + debugPrint('stack trace: $s'); } - /// get profile data by username - Future getProfileByUsername(String username) async { - try { - final url = await _contractProfile.getURLFromUsername(username); - - final profileData = await _ipfs.get(url: '/$url'); - - final profile = ProfileV1.fromJson(profileData); + return false; +} - profile.parseIPFSImageURLs(ipfsUrl); +/// makes a jsonrpc request from this wallet +Future requestPaymaster( + Config config, + SUJSONRPCRequest body, { + bool legacy = false, +}) async { + final rawResponse = await config.engineRPC.post( + body: body, + ); - return profile; - } catch (exception) { - // - } + final response = SUJSONRPCResponse.fromJson(rawResponse); - return null; + if (response.error != null) { + throw Exception(response.error!.message); } - /// profileExists checks whether there is a profile for this username - Future profileExists(String username) async { - try { - final url = await _contractProfile.getURLFromUsername(username); + return response; +} - return url != ''; - } catch (exception) { - // +/// return paymaster data for constructing a user op +Future<(PaymasterData?, Exception?)> getPaymasterData( + Config config, + UserOp userop, + String eaddr, + String ptype, { + bool legacy = false, +}) async { + final body = SUJSONRPCRequest( + method: 'pm_sponsorUserOperation', + params: [ + userop.toJson(), + eaddr, + {'type': ptype}, + ], + ); + + try { + final response = await requestPaymaster(config, body, legacy: legacy); + + return (PaymasterData.fromJson(response.result), null); + } catch (exception) { + final strerr = exception.toString(); + + if (strerr.contains(gasFeeErrorMessage)) { + return (null, NetworkCongestedException()); } - return false; - } - - /// Accounts - - /// check if an account exists - Future accountExists({ - String? account, - }) async { - try { - final url = '/v1/accounts/${account ?? _account.hexEip55}/exists'; - - await _indexer.get( - url: url, - ); - - return true; - } catch (_) {} - - return false; + if (strerr.contains(invalidBalanceErrorMessage)) { + return (null, NetworkInvalidBalanceException()); + } } - // TODO: create an account using a user op - - /// create an account - Future createAccount({ - EthPrivateKey? customCredentials, - }) async { - try { - final exists = await accountExists(); - if (exists) { - return true; - } - - Uint8List calldata = _contractAccount.transferOwnershipCallData( - _credentials.address.hexEip55, - ); - if (_paymasterType == 'cw-safe') { - calldata = _contractCommunityModule.getChainIdCallData(); - } + return (null, NetworkUnknownException()); +} - final (_, userop) = await prepareUserop( - [_account.hexEip55], - [calldata], - ); +/// return paymaster data for constructing a user op +Future<(List, Exception?)> getPaymasterOOData( + Config config, + UserOp userop, + String eaddr, + String ptype, { + bool legacy = false, + int count = 1, +}) async { + final body = SUJSONRPCRequest( + method: 'pm_ooSponsorUserOperation', + params: [ + userop.toJson(), + eaddr, + {'type': ptype}, + count, + ], + ); + + try { + final response = await requestPaymaster(config, body, legacy: legacy); + + final List data = response.result; + if (data.isEmpty) { + throw Exception('empty paymaster data'); + } - final txHash = await submitUserop( - userop, - ); - if (txHash == null) { - throw Exception('failed to submit user op'); - } + if (data.length != count) { + throw Exception('invalid paymaster data'); + } - final success = await waitForTxSuccess(txHash); - if (!success) { - throw Exception('transaction failed'); - } + return (data.map((item) => PaymasterData.fromJson(item)).toList(), null); + } catch (exception) { + final strerr = exception.toString(); - return true; - } catch (_) {} + if (strerr.contains(gasFeeErrorMessage)) { + return ([], NetworkCongestedException()); + } - return false; + if (strerr.contains(invalidBalanceErrorMessage)) { + return ([], NetworkInvalidBalanceException()); + } } - /// upgrade an account - Future upgradeAccount() async { - try { - final accountFactory = _contractAccountFactory; + return ([], NetworkUnknownException()); +} - final url = - '/accounts/factory/${accountFactory.addr}/sca/${_account.hexEip55}'; +/// prepare a userop for with calldata +Future<(String, UserOp)> prepareUserop( + Config config, + EthereumAddress account, + EthPrivateKey credentials, + List dest, + List calldata, { + EthPrivateKey? customCredentials, + BigInt? customNonce, + bool deploy = true, + BigInt? value, +}) async { + try { + final cred = customCredentials ?? credentials; + + EthereumAddress acc = account; + if (customCredentials != null) { + acc = await getAccountAddress(config, customCredentials.address.hexEip55); + } - final encoded = jsonEncode( - { - 'owner': _credentials.address.hexEip55, - 'salt': BigInt.zero.toInt(), - }, - ); + // instantiate user op with default values + final userop = UserOp.defaultUserOp(); - final body = SignedRequest(convertStringToUint8List(encoded)); + // use the account hex as the sender + userop.sender = acc.hexEip55; - final sig = await compute( - generateSignature, (jsonEncode(body.toJson()), _credentials)); + // determine the appropriate nonce + BigInt nonce = customNonce ?? await config.getNonce(acc.hexEip55); - final response = await _indexer.patch( - url: url, - headers: { - 'X-Signature': sig, - 'X-Address': _account.hexEip55, - }, - body: body.toJson(), - ); + final paymasterType = config.getPaymasterType(); - final implementation = response['object']['account_implementation']; - if (implementation == "0x0000000000000000000000000000000000000000") { - throw Exception('invalid implementation'); + // if it's the first user op from this account, we need to deploy the account contract + if (nonce == BigInt.zero && deploy) { + bool exists = false; + if (paymasterType == 'payg') { + // solves edge case with legacy account migration + exists = await accountExists(config, acc); } - return implementation; - } on ConflictException { - // account is already up to date - return null; - } catch (_) {} - - return null; - } - - /// Transactions - - /// fetch erc20 transfer events - /// - /// [offset] number of transfers to skip - /// - /// [limit] number of transferst to fetch - /// - /// [maxDate] fetch transfers up to this date - Future<(List, Pagination)> fetchErc20Transfers({ - required int offset, - required int limit, - required DateTime maxDate, - }) async { - try { - final List tx = []; - - const path = '/v1/logs'; - - final eventSignature = _tokenStandard == 'erc20' - ? _contractToken!.transferEventSignature - : _contract1155Token!.transferEventSignature; - - final dataQueryParams = buildQueryParams([ - { - 'key': 'from', - 'value': _account.hexEip55, - }, - ], or: [ - { - 'key': 'to', - 'value': _account.hexEip55, - }, - ]); - - final addr = _tokenStandard == 'erc20' - ? _contractToken!.addr - : _contract1155Token!.addr; - - final url = - '$path/$addr/$eventSignature?offset=$offset&limit=$limit&maxDate=${Uri.encodeComponent(maxDate.toUtc().toIso8601String())}&$dataQueryParams'; - - final response = await _indexer.get(url: url); - - // convert response array into TransferEvent list - for (final item in response['array']) { - final log = Log.fromJson(item); + if (!exists) { + final accountFactory = config.accountFactoryContract; - tx.add(TransferEvent.fromLog(log, standard: _tokenStandard)); + // construct the init code to deploy the account + userop.initCode = await accountFactory.createAccountInitCode( + cred.address.hexEip55, + BigInt.zero, + ); + } else { + // try again in case the account was created in the meantime + nonce = customNonce ?? + await config.entryPointContract.getNonce(acc.hexEip55); } + } - return (tx, Pagination.fromJson(response['meta'])); - } catch (_) {} - - return ([], Pagination.empty()); - } - - /// fetch new erc20 transfer events - /// - /// [fromDate] fetches transfers from this date - Future?> fetchNewErc20Transfers(DateTime fromDate) async { - try { - final List tx = []; - - const path = 'logs/v2/transfers'; + userop.nonce = nonce; - final addr = _tokenStandard == 'erc20' - ? _contractToken!.addr - : _contract1155Token!.addr; + // set the appropriate call data for the transfer + // we need to call account.execute which will call token.transfer + switch (paymasterType) { + case 'payg': + case 'cw': + { + final simpleAccount = await config.getSimpleAccount(acc.hexEip55); - final url = - '/$path/$addr/${_account.hexEip55}/new?limit=10&fromDate=${Uri.encodeComponent(fromDate.toUtc().toIso8601String())}'; + userop.callData = dest.length > 1 && calldata.length > 1 + ? simpleAccount.executeBatchCallData( + dest, + calldata, + ) + : simpleAccount.executeCallData( + dest[0], + value ?? BigInt.zero, + calldata[0], + ); + break; + } + case 'cw-safe': + { + final safeAccount = await config.getSafeAccount(acc.hexEip55); + userop.callData = safeAccount.executeCallData( + dest[0], + value ?? BigInt.zero, + calldata[0], + ); + break; + } + } - final response = await _indexer.get(url: url); + // submit the user op to the paymaster in order to receive information to complete the user op + List paymasterOOData = []; + Exception? paymasterErr; + final useAccountNonce = + (nonce == BigInt.zero || paymasterType == 'payg') && deploy; + + if (useAccountNonce) { + // if it's the first user op, we should use a normal paymaster signature + PaymasterData? paymasterData; + (paymasterData, paymasterErr) = await getPaymasterData( + config, + userop, + config.entryPointContract.addr, + paymasterType, + ); - // convert response array into TransferEvent list - for (final item in response['array']) { - tx.add(TransferEvent.fromJson(item)); + if (paymasterData != null) { + paymasterOOData.add(paymasterData); } - - return tx; - } catch (_) {} - - return null; - } - - /// construct transfer call data - Uint8List tokenTransferCallData( - String to, - BigInt amount, { - String? from, - BigInt? tokenId, - }) { - if (_tokenStandard == 'erc20') { - return _contractToken!.transferCallData(to, amount); - } else if (_tokenStandard == 'erc1155') { - return _contract1155Token!.transferCallData( - from ?? _account.hexEip55, to, tokenId ?? BigInt.zero, amount); + } else { + // if it's not the first user op, we should use an out of order paymaster signature + (paymasterOOData, paymasterErr) = await getPaymasterOOData( + config, + userop, + config.entryPointContract.addr, + paymasterType, + ); } - return Uint8List.fromList([]); - } - - /// construct erc20 transfer call data - Uint8List tokenMintCallData( - String to, - BigInt amount, { - BigInt? tokenId, - }) { - if (_tokenStandard == 'erc20') { - return _contractToken!.mintCallData(to, amount); - } else if (_tokenStandard == 'erc1155') { - return _contract1155Token! - .mintCallData(to, amount, tokenId ?? BigInt.zero); + if (paymasterErr != null) { + throw paymasterErr; } - return Uint8List.fromList([]); - } - - /// construct simple faucet redeem call data - Future simpleFaucetRedeemCallData( - String address, - ) async { - final contract = SimpleFaucetContract(chainId, _ethClient, address); - - await contract.init(); - - return contract.redeemCallData(); - } - - /// fetch simple faucet redeem amount - Future getFaucetRedeemAmount(String address) async { - final contract = SimpleFaucetContract(chainId, _ethClient, address); - - await contract.init(); - - return contract.getAmount(); - } + if (paymasterOOData.isEmpty) { + throw Exception('unable to get paymaster data'); + } - /// Account Abstraction + final paymasterData = paymasterOOData.first; + if (!useAccountNonce) { + // use the nonce received from the paymaster + userop.nonce = paymasterData.nonce; + } - // get account address - Future getAccountAddress( - String addr, { - bool legacy = false, - bool cache = true, - }) async { - final prefKey = addr; - final cachedAccAddress = _pref.getAccountAddress(prefKey); + // add the received data to the user op + userop.paymasterAndData = paymasterData.paymasterAndData; + userop.preVerificationGas = paymasterData.preVerificationGas; + userop.verificationGasLimit = paymasterData.verificationGasLimit; + userop.callGasLimit = paymasterData.callGasLimit; - EthereumAddress address; - if (!cache || cachedAccAddress == null) { - final accountFactory = getAccounFactoryContract(legacy: legacy); + // get the hash of the user op + final hash = await config.entryPointContract.getUserOpHash(userop); - address = await accountFactory.getAddress(addr); - } else { - address = EthereumAddress.fromHex(cachedAccAddress); - } - await _pref.setAccountAddress( - prefKey, - address.hexEip55, - ); - return address; - } + // now we can sign the user op + userop.generateSignature(cred, hash); - setAccountAddress(EthereumAddress address) async { - final prefKey = _credentials.address.hexEip55; - await _pref.setAccountAddress( - prefKey, - address.hexEip55, - ); + return (bytesToHex(hash, include0x: true), userop); + } catch (_) { + rethrow; } +} - /// Submits a user operation to the Ethereum network. - /// - /// This function sends a JSON-RPC request to the ERC4337 bundler. The entrypoint is specified by the - /// [eaddr] parameter, with the [eth_sendUserOperation] method and the given - /// [userop] parameter. If the request is successful, the function returns a - /// tuple containing the transaction hash as a string and `null`. If the request - /// fails, the function returns a tuple containing `null` and an exception - /// object representing the type of error that occurred. - /// - /// If the request fails due to a network congestion error, the function returns - /// a [NetworkCongestedException] object. If the request fails due to an invalid - /// balance error, the function returns a [NetworkInvalidBalanceException] - /// object. If the request fails for any other reason, the function returns a - /// [NetworkUnknownException] object. - /// - /// [userop] The user operation to submit to the Ethereum network. - /// [eaddr] The Ethereum address of the node to send the request to. - /// A tuple containing the transaction hash as a string and [null] if - /// the request was successful, or [null] and an exception object if the - /// request failed. - Future<(String?, Exception?)> _submitUserOp( - UserOp userop, - String eaddr, { - Map? data, - TransferData? extraData, - }) async { - final params = [userop.toJson(), eaddr]; +/// submit a user op +Future submitUserop( + Config config, + UserOp userop, { + EthPrivateKey? customCredentials, + Map? data, + TransferData? extraData, +}) async { + try { + final entryPoint = config.entryPointContract; + + final params = [userop.toJson(), entryPoint.addr]; if (data != null) { params.add(data); } @@ -1027,417 +705,482 @@ class WalletService { params: params, ); - try { - final response = await _requestBundler(body); + final response = await requestBundler(config, body); - return (response.result as String, null); - } catch (exception) { - final strerr = exception.toString(); + return response.result as String; + } catch (exception, s) { + debugPrint('error: $exception'); + debugPrint('stack trace: $s'); - if (strerr.contains(gasFeeErrorMessage)) { - return (null, NetworkCongestedException()); - } + final strerr = exception.toString(); - if (strerr.contains(invalidBalanceErrorMessage)) { - return (null, NetworkInvalidBalanceException()); - } + if (strerr.contains(gasFeeErrorMessage)) { + throw NetworkCongestedException(); } - return (null, NetworkUnknownException()); + if (strerr.contains(invalidBalanceErrorMessage)) { + throw NetworkInvalidBalanceException(); + } } - /// makes a jsonrpc request from this wallet - Future _requestPaymaster( - SUJSONRPCRequest body, { - bool legacy = false, - }) async { - final paymasterRPC = getPaymasterRPC(legacy: legacy); + throw NetworkUnknownException(); +} - final rawResponse = await paymasterRPC.post( - body: body, - headers: erc4337Headers, - ); +/// makes a jsonrpc request from this wallet +Future requestBundler( + Config config, SUJSONRPCRequest body) async { + final rawResponse = await config.engineRPC.post( + body: body, + ); - final response = SUJSONRPCResponse.fromJson(rawResponse); + debugPrint('rawResponse: ${rawResponse.toString()}'); - if (response.error != null) { - throw Exception(response.error!.message); - } + final response = SUJSONRPCResponse.fromJson(rawResponse); - return response; + if (response.error != null) { + debugPrint('error: ${response.error!.message}'); + throw Exception(response.error!.message); } - /// makes a jsonrpc request from this wallet - Future _requestBundler(SUJSONRPCRequest body) async { - final rawResponse = await getBundlerRPC().post( - body: body, - headers: erc4337Headers, - ); - - final response = SUJSONRPCResponse.fromJson(rawResponse); + return response; +} - if (response.error != null) { - throw Exception(response.error!.message); +/// fetch erc20 transfer events +Future<(List, Pagination)> fetchErc20Transfers( + Config config, + String addr, { + required int offset, + required int limit, + required DateTime maxDate, +}) async { + try { + final List tx = []; + + const path = '/v1/logs'; + + final eventSignature = config.getPrimaryToken().standard == 'erc20' + ? config.token20Contract.transferEventSignature + : config.token1155Contract.transferEventSignature; + + final dataQueryParams = buildQueryParams([ + { + 'key': 'from', + 'value': addr, + }, + ], or: [ + { + 'key': 'to', + 'value': addr, + }, + ]); + + final tokenAddr = config.getPrimaryToken().standard == 'erc20' + ? config.token20Contract.addr + : config.token1155Contract.addr; + + final url = + '$path/$tokenAddr/$eventSignature?offset=$offset&limit=$limit&maxDate=${Uri.encodeComponent(maxDate.toUtc().toIso8601String())}&$dataQueryParams'; + + final response = await config.engine.get(url: url); + + // convert response array into TransferEvent list + for (final item in response['array']) { + final log = Log.fromJson(item); + + tx.add(TransferEvent.fromLog(log, + standard: config.getPrimaryToken().standard)); } - return response; + return (tx, Pagination.fromJson(response['meta'])); + } catch (e, s) { + debugPrint('error: $e'); + debugPrint('stack trace: $s'); } - /// return paymaster data for constructing a user op - Future<(PaymasterData?, Exception?)> _getPaymasterData( - UserOp userop, - String eaddr, - String ptype, { - bool legacy = false, - }) async { - final body = SUJSONRPCRequest( - method: 'pm_sponsorUserOperation', - params: [ - userop.toJson(), - eaddr, - {'type': ptype}, - ], - ); + return ([], Pagination.empty()); +} - try { - final response = await _requestPaymaster(body, legacy: legacy); +/// fetch new erc20 transfer events +Future?> fetchNewErc20Transfers( + Config config, + String addr, + DateTime fromDate, +) async { + try { + final List tx = []; - return (PaymasterData.fromJson(response.result), null); - } catch (exception) { - final strerr = exception.toString(); + const path = 'logs/v2/transfers'; - if (strerr.contains(gasFeeErrorMessage)) { - return (null, NetworkCongestedException()); - } + final tokenAddr = config.getPrimaryToken().standard == 'erc20' + ? config.token20Contract.addr + : config.token1155Contract.addr; - if (strerr.contains(invalidBalanceErrorMessage)) { - return (null, NetworkInvalidBalanceException()); - } + final url = + '/$path/$tokenAddr/$addr/new?limit=10&fromDate=${Uri.encodeComponent(fromDate.toUtc().toIso8601String())}'; + + final response = await config.engine.get(url: url); + + // convert response array into TransferEvent list + for (final item in response['array']) { + tx.add(TransferEvent.fromJson(item)); } - return (null, NetworkUnknownException()); + return tx; + } catch (e, s) { + debugPrint('error: $e'); + debugPrint('stack trace: $s'); } - /// return paymaster data for constructing a user op - Future<(List, Exception?)> _getPaymasterOOData( - UserOp userop, - String eaddr, - String ptype, { - bool legacy = false, - int count = 1, - }) async { - final body = SUJSONRPCRequest( - method: 'pm_ooSponsorUserOperation', - params: [ - userop.toJson(), - eaddr, - {'type': ptype}, - count, - ], - ); - - try { - final response = await _requestPaymaster(body, legacy: legacy); + return null; +} - final List data = response.result; - if (data.isEmpty) { - throw Exception('empty paymaster data'); - } +/// construct erc20 transfer call data +Uint8List tokenMintCallData( + Config config, + String to, + BigInt amount, { + BigInt? tokenId, +}) { + if (config.getPrimaryToken().standard == 'erc20') { + return config.token20Contract.mintCallData(to, amount); + } else if (config.getPrimaryToken().standard == 'erc1155') { + return config.token1155Contract + .mintCallData(to, amount, tokenId ?? BigInt.zero); + } - if (data.length != count) { - throw Exception('invalid paymaster data'); - } + return Uint8List.fromList([]); +} - return (data.map((item) => PaymasterData.fromJson(item)).toList(), null); - } catch (exception) { - final strerr = exception.toString(); +/// construct simple faucet redeem call data +Future simpleFaucetRedeemCallData( + Config config, + String address, +) async { + final chain = config.chains.values.first; + final contract = SimpleFaucetContract(chain.id, config.ethClient, address); - if (strerr.contains(gasFeeErrorMessage)) { - return ([], NetworkCongestedException()); - } + await contract.init(); - if (strerr.contains(invalidBalanceErrorMessage)) { - return ([], NetworkInvalidBalanceException()); - } - } + return contract.redeemCallData(); +} - return ([], NetworkUnknownException()); - } +/// fetch simple faucet redeem amount +Future getFaucetRedeemAmount(Config config, String address) async { + final chain = config.chains.values.first; + final contract = SimpleFaucetContract(chain.id, config.ethClient, address); - /// prepare a userop for with calldata - Future<(String, UserOp)> prepareUserop( - List dest, - List calldata, { - EthPrivateKey? customCredentials, - BigInt? customNonce, - bool deploy = true, - }) async { - try { - final cred = customCredentials ?? _credentials; - - EthereumAddress acc = _account; - if (customCredentials != null) { - acc = await getAccountAddress( - customCredentials.address.hexEip55, - ); - } - final StackupEntryPoint entryPoint = getEntryPointContract(); + await contract.init(); - // instantiate user op with default values - final userop = UserOp.defaultUserOp(); + return contract.getAmount(); +} - // use the account hex as the sender - userop.sender = acc.hexEip55; +/// updates the push token for the current account +Future updatePushToken( + Config config, + EthereumAddress account, + EthPrivateKey credentials, + String token, { + EthPrivateKey? customCredentials, +}) async { + try { + final cred = customCredentials ?? credentials; + + EthereumAddress acc = account; + if (customCredentials != null) { + acc = await getAccountAddress(config, customCredentials.address.hexEip55); + } - // determine the appropriate nonce - BigInt nonce = customNonce ?? await entryPoint.getNonce(acc.hexEip55); + final tokenAddr = config.getPrimaryToken().standard == 'erc20' + ? config.token20Contract.addr + : config.token1155Contract.addr; - // if it's the first user op from this account, we need to deploy the account contract - if (nonce == BigInt.zero && deploy) { - bool exists = false; - if (getPaymasterType() == 'payg') { - // solves edge case with legacy account migration - exists = await accountExists(account: acc.hexEip55); - } + final url = '/v1/push/$tokenAddr/${acc.hexEip55}'; - if (!exists) { - final accountFactory = getAccounFactoryContract(); + final encoded = jsonEncode( + PushUpdateRequest(token, acc.hexEip55).toJson(), + ); - // construct the init code to deploy the account - userop.initCode = await accountFactory.createAccountInitCode( - cred.address.hexEip55, - BigInt.zero, - ); - } else { - // try again in case the account was created in the meantime - nonce = customNonce ?? await entryPoint.getNonce(acc.hexEip55); - } - } + final body = SignedRequest(convertStringToUint8List(encoded)); - userop.nonce = nonce; + final sig = + await compute(generateSignature, (jsonEncode(body.toJson()), cred)); - // set the appropriate call data for the transfer - // we need to call account.execute which will call token.transfer - switch (getPaymasterType()) { - case 'payg': - case 'cw': - userop.callData = dest.length > 1 && calldata.length > 1 - ? _contractAccount.executeBatchCallData( - dest, - calldata, - ) - : _contractAccount.executeCallData( - dest[0], - BigInt.zero, - calldata[0], - ); - break; - case 'cw-safe': - userop.callData = _contractSafeAccount.executeCallData( - dest[0], - BigInt.zero, - calldata[0], - ); - break; - } + await config.engine.put( + url: url, + headers: { + 'X-Signature': sig, + 'X-Address': acc.hexEip55, + }, + body: body.toJson(), + ); - // set the appropriate gas fees based on network - final fees = await _gasPriceEstimator.estimate; - if (fees == null) { - throw Exception('unable to estimate fees'); - } + return true; + } catch (e, s) { + debugPrint('error: $e'); + debugPrint('stack trace: $s'); + } - userop.maxPriorityFeePerGas = - fees.maxPriorityFeePerGas * BigInt.from(calldata.length); - userop.maxFeePerGas = fees.maxFeePerGas * BigInt.from(calldata.length); - - // submit the user op to the paymaster in order to receive information to complete the user op - List paymasterOOData = []; - Exception? paymasterErr; - final useAccountNonce = - (nonce == BigInt.zero || getPaymasterType() == 'payg') && deploy; - - if (useAccountNonce) { - // if it's the first user op, we should use a normal paymaster signature - PaymasterData? paymasterData; - (paymasterData, paymasterErr) = await _getPaymasterData( - userop, - entryPoint.addr, - getPaymasterType(), - ); + return false; +} - if (paymasterData != null) { - paymasterOOData.add(paymasterData); - } - } else { - // if it's not the first user op, we should use an out of order paymaster signature - (paymasterOOData, paymasterErr) = await _getPaymasterOOData( - userop, - entryPoint.addr, - getPaymasterType(), - ); - } +/// removes the push token for the current account +Future removePushToken( + Config config, + EthereumAddress account, + EthPrivateKey credentials, + String token, { + EthPrivateKey? customCredentials, +}) async { + try { + final cred = customCredentials ?? credentials; + + EthereumAddress acc = account; + if (customCredentials != null) { + acc = await getAccountAddress(config, customCredentials.address.hexEip55); + } - if (paymasterErr != null) { - throw paymasterErr; - } + final tokenAddr = config.getPrimaryToken().standard == 'erc20' + ? config.token20Contract.addr + : config.token1155Contract.addr; - if (paymasterOOData.isEmpty) { - throw Exception('unable to get paymaster data'); - } + final url = '/v1/push/$tokenAddr/${acc.hexEip55}/$token'; - final paymasterData = paymasterOOData.first; - if (!useAccountNonce) { - // use the nonce received from the paymaster - userop.nonce = paymasterData.nonce; - } + final encoded = jsonEncode( + { + 'account': acc.hexEip55, + 'date': DateTime.now().toUtc().toIso8601String(), + }, + ); - // add the received data to the user op - userop.paymasterAndData = paymasterData.paymasterAndData; - userop.preVerificationGas = paymasterData.preVerificationGas; - userop.verificationGasLimit = paymasterData.verificationGasLimit; - userop.callGasLimit = paymasterData.callGasLimit; + final body = SignedRequest(convertStringToUint8List(encoded)); - // get the hash of the user op - final hash = await entryPoint.getUserOpHash(userop); + final sig = + await compute(generateSignature, (jsonEncode(body.toJson()), cred)); - // now we can sign the user op - userop.generateSignature(cred, hash); + await config.engine.delete( + url: url, + headers: { + 'X-Signature': sig, + 'X-Address': acc.hexEip55, + }, + body: body.toJson(), + ); - return (bytesToHex(hash, include0x: true), userop); - } catch (_) { - rethrow; - } + return true; + } catch (e, s) { + debugPrint('error: $e'); + debugPrint('stack trace: $s'); } - /// submit a user op - Future submitUserop( - UserOp userop, { - EthPrivateKey? customCredentials, - Map? data, - TransferData? extraData, - }) async { - try { - final entryPoint = getEntryPointContract(); - - // send the user op - final (txHash, useropErr) = await _submitUserOp( - userop, - entryPoint.addr, - data: data, - extraData: extraData, - ); - if (useropErr != null) { - throw useropErr; - } + return false; +} - return txHash; - } catch (_) { - rethrow; - } +/// check if an account is a minter +Future isMinter(Config config, EthereumAddress account) async { + try { + final chain = config.chains.values.first; + final tokenAddress = config.getPrimaryToken().address; + + final accessControl = AccessControlUpgradeableContract( + chain.id, + config.ethClient, + tokenAddress, + ); + await accessControl.init(); + + return await accessControl.isMinter(account.hexEip55); + } catch (e, s) { + debugPrint('error: $e'); + debugPrint('stack trace: $s'); } - /// updates the push token for the current account - /// - /// [token] the push token - /// [customCredentials] optional credentials to use - Future updatePushToken( - String token, { - EthPrivateKey? customCredentials, - }) async { - try { - final cred = customCredentials ?? _credentials; - - EthereumAddress acc = _account; - if (customCredentials != null) { - acc = await getAccountAddress( - customCredentials.address.hexEip55, - ); - } + return false; +} + +/// dispose of resources +void disposeWallet(Config config) { + config.ethClient.dispose(); +} - final addr = _tokenStandard == 'erc20' - ? _contractToken!.addr - : _contract1155Token!.addr; +/// get sigauth connection +SigAuthConnection getSigAuthConnection( + Config config, + EthereumAddress account, + EthPrivateKey credentials, + String redirect, +) { + final _sigAuth = SigAuthService( + credentials: credentials, + address: account, + redirect: redirect, + ); + + return _sigAuth.connect(); +} - final url = '/v1/push/$addr/${acc.hexEip55}'; +/// get account address +Future getAccountAddress( + Config config, + String addr, { + bool legacy = false, + bool cache = true, +}) async { + final accountFactory = config.accountFactoryContract; + return await accountFactory.getAddress(addr); +} - final encoded = jsonEncode( - PushUpdateRequest(token, acc.hexEip55).toJson(), - ); +/// upgrade an account +Future upgradeAccount( + Config config, + EthereumAddress account, + EthPrivateKey credentials, +) async { + try { + final accountFactory = config.accountFactoryContract; + + final url = + '/accounts/factory/${accountFactory.addr}/sca/${account.hexEip55}'; + + final encoded = jsonEncode( + { + 'owner': credentials.address.hexEip55, + 'salt': BigInt.zero.toInt(), + }, + ); - final body = SignedRequest(convertStringToUint8List(encoded)); + final body = SignedRequest(convertStringToUint8List(encoded)); - final sig = - await compute(generateSignature, (jsonEncode(body.toJson()), cred)); + final sig = await compute( + generateSignature, (jsonEncode(body.toJson()), credentials)); - await _indexer.put( - url: url, - headers: { - 'X-Signature': sig, - 'X-Address': acc.hexEip55, - }, - body: body.toJson(), - ); + final response = await config.engine.patch( + url: url, + headers: { + 'X-Signature': sig, + 'X-Address': account.hexEip55, + }, + body: body.toJson(), + ); - return true; - } catch (_) {} + final implementation = response['object']['account_implementation']; + if (implementation == "0x0000000000000000000000000000000000000000") { + throw Exception('invalid implementation'); + } - return false; + return implementation; + } catch (e, s) { + debugPrint('error: $e'); + debugPrint('stack trace: $s'); } - /// removes the push token for the current account - /// - /// [token] the push token - /// [customCredentials] optional credentials to use - Future removePushToken( - String token, { - EthPrivateKey? customCredentials, - }) async { - try { - final cred = customCredentials ?? _credentials; - - EthereumAddress acc = _account; - if (customCredentials != null) { - acc = await getAccountAddress( - customCredentials.address.hexEip55, - ); - } + return null; +} - final addr = _tokenStandard == 'erc20' - ? _contractToken!.addr - : _contract1155Token!.addr; +/// get card hash +Future getCardHash( + Config config, + String serial, { + bool local = true, +}) async { + final primaryCardManager = config.getPrimaryCardManager(); - final url = '/v1/push/$addr/${acc.hexEip55}/$token'; + if (primaryCardManager == null) { + throw Exception('Card manager not initialized'); + } - final encoded = jsonEncode( - { - 'account': acc.hexEip55, - 'date': DateTime.now().toUtc().toIso8601String(), - }, - ); + AbstractCardManagerContract cardManager; - final body = SignedRequest(convertStringToUint8List(encoded)); + if (primaryCardManager.type == CardManagerType.classic) { + cardManager = CardManagerContract( + primaryCardManager.chainId, + config.ethClient, + primaryCardManager.address, + ); + } else if (primaryCardManager.type == CardManagerType.safe && + primaryCardManager.instanceId != null) { + final instanceId = primaryCardManager.instanceId!; + cardManager = SafeCardManagerContract( + keccak256(convertStringToUint8List(instanceId)), + primaryCardManager.chainId, + config.ethClient, + primaryCardManager.address, + ); + } else { + throw Exception('Invalid card manager configuration'); + } - final sig = - await compute(generateSignature, (jsonEncode(body.toJson()), cred)); + await cardManager.init(); + return await cardManager.getCardHash(serial, local: local); +} - await _indexer.delete( - url: url, - headers: { - 'X-Signature': sig, - 'X-Address': acc.hexEip55, - }, - body: body.toJson(), - ); +/// get card address +Future getCardAddress( + Config config, + Uint8List hash, +) async { + final primaryCardManager = config.getPrimaryCardManager(); - return true; - } catch (_) {} + if (primaryCardManager == null) { + throw Exception('Card manager not initialized'); + } - return false; + AbstractCardManagerContract cardManager; + + if (primaryCardManager.type == CardManagerType.classic) { + cardManager = CardManagerContract( + primaryCardManager.chainId, + config.ethClient, + primaryCardManager.address, + ); + } else if (primaryCardManager.type == CardManagerType.safe && + primaryCardManager.instanceId != null) { + final instanceId = primaryCardManager.instanceId!; + cardManager = SafeCardManagerContract( + keccak256(convertStringToUint8List(instanceId)), + primaryCardManager.chainId, + config.ethClient, + primaryCardManager.address, + ); + } else { + throw Exception('Invalid card manager configuration'); } - /// dispose of resources - void dispose() { - _ethClient.dispose(); + await cardManager.init(); + return await cardManager.getCardAddress(hash); +} + +/// estimate gas prices using EIP1559 +Future estimateGasPrice( + Config config, +) async { + try { + final chain = config.chains.values.first; + final rpcUrl = config.getRpcUrl(chain.id.toString()); + final rpc = APIService(baseURL: rpcUrl); + + final estimator = EIP1559GasPriceEstimator( + rpc, + config.ethClient, + gasExtraPercentage: + config.getPrimaryAccountAbstractionConfig().gasExtraPercentage, + ); + + return await estimator.estimate; + } catch (e, s) { + debugPrint('error: $e'); + debugPrint('stack trace: $s'); } + + return null; } + +// Future getTwoFAAddress( +// Config config, +// String source, +// String type, +// ) async { +// final provider = EthereumAddress.fromHex( +// config.getPrimarySessionManager().providerAddress); +// final salt = generateSessionSalt(source, type); +// return await config.twoFAFactoryContract.getAddress(provider, salt); +// } diff --git a/lib/state/deep_link/logic.dart b/lib/state/deep_link/logic.dart index 9233834c..2876bd0b 100644 --- a/lib/state/deep_link/logic.dart +++ b/lib/state/deep_link/logic.dart @@ -1,21 +1,38 @@ +import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/wallet/wallet.dart'; import 'package:citizenwallet/state/deep_link/state.dart'; import 'package:citizenwallet/state/notifications/logic.dart'; import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; +import 'package:web3dart/web3dart.dart'; class DeepLinkLogic { final DeepLinkState _state; - final WalletService _wallet; final NotificationsLogic _notifications; + Config? _config; + EthPrivateKey? _credentials; + EthereumAddress? _account; - DeepLinkLogic(BuildContext context, WalletService wallet) + DeepLinkLogic(BuildContext context, Config config, EthPrivateKey credentials, EthereumAddress account) : _state = context.read(), - _wallet = wallet, - _notifications = NotificationsLogic(context); + _notifications = NotificationsLogic(context) { + _config = config; + _credentials = credentials; + _account = account; + } + + void setWalletState(Config config, EthPrivateKey credentials, EthereumAddress account) { + _config = config; + _credentials = credentials; + _account = account; + } Future faucetV1Redeem(String params) async { try { + if (_config == null || _credentials == null || _account == null) { + throw Exception('Wallet not initialized'); + } + _state.request(); final uri = Uri(query: params); @@ -25,16 +42,22 @@ class DeepLinkLogic { throw Exception('Address is required'); } - final calldata = await _wallet.simpleFaucetRedeemCallData(address); + final calldata = await simpleFaucetRedeemCallData(_config!, address); - final (_, userop) = await _wallet.prepareUserop([address], [calldata]); + final (_, userop) = await prepareUserop( + _config!, + _account!, + _credentials!, + [address], + [calldata], + ); - final txHash = await _wallet.submitUserop(userop); + final txHash = await submitUserop(_config!, userop); if (txHash == null) { throw Exception('transaction failed'); } - final success = await _wallet.waitForTxSuccess(txHash); + final success = await waitForTxSuccess(_config!, txHash); if (!success) { throw Exception('transaction failed'); } @@ -49,6 +72,10 @@ class DeepLinkLogic { Future faucetV1Metadata(String params) async { try { + if (_config == null) { + throw Exception('Wallet not initialized'); + } + _state.request(); final uri = Uri(query: params); @@ -58,7 +85,7 @@ class DeepLinkLogic { throw Exception('Address is required'); } - final amount = await _wallet.getFaucetRedeemAmount(address); + final amount = await getFaucetRedeemAmount(_config!, address); _state.setFaucetAmount(amount); _state.success(); diff --git a/lib/state/notifications/logic.dart b/lib/state/notifications/logic.dart index f0c2041b..cb6d8f9c 100644 --- a/lib/state/notifications/logic.dart +++ b/lib/state/notifications/logic.dart @@ -1,4 +1,5 @@ import 'package:citizenwallet/services/audio/audio.dart'; +import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/preferences/preferences.dart'; import 'package:citizenwallet/services/push/push.dart'; import 'package:citizenwallet/services/wallet/wallet.dart'; @@ -6,6 +7,7 @@ import 'package:citizenwallet/state/notifications/state.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; +import 'package:web3dart/web3dart.dart'; class NotificationsLogic { final NotificationsState _state; @@ -13,15 +15,25 @@ class NotificationsLogic { final PreferencesService _prefs = PreferencesService(); final PushService _push = PushService(); final AudioService _audio = AudioService(); - final WalletService _wallet = WalletService(); + Config? _config; + EthPrivateKey? _credentials; + EthereumAddress? _account; NotificationsLogic(BuildContext context) : _state = context.read(); + void setWalletState(Config config, EthPrivateKey credentials, EthereumAddress account) { + _config = config; + _credentials = credentials; + _account = account; + } + void init() async { try { + if (_account == null) return; + final systemEnabled = await _push.isEnabled(); - bool enabled = _prefs.pushNotifications(_wallet.account.hexEip55); + bool enabled = _prefs.pushNotifications(_account!.hexEip55); if (!systemEnabled) { final allowed = await _push.requestPermissions(); @@ -39,7 +51,7 @@ class NotificationsLogic { // enable push _state.setPush(true); await _push.start(onToken, onMessage); - _prefs.setPushNotifications(_wallet.account.hexEip55, true); + _prefs.setPushNotifications(_account!.hexEip55, true); } catch (e) { // } @@ -47,8 +59,10 @@ class NotificationsLogic { void checkPushPermissions() async { try { + if (_account == null) return; + final systemEnabled = await _push.isEnabled(); - final enabled = _prefs.pushNotifications(_wallet.account.hexEip55); + final enabled = _prefs.pushNotifications(_account!.hexEip55); _state.setPush(systemEnabled && enabled); } catch (e) { @@ -90,7 +104,14 @@ class NotificationsLogic { Future onToken(String token) async { try { - final updated = await _wallet.updatePushToken(token); + if (_config == null || _credentials == null || _account == null) return; + + final updated = await updatePushToken( + _config!, + _account!, + _credentials!, + token, + ); if (!updated) { throw Exception('Failed to update push token'); } @@ -99,14 +120,21 @@ class NotificationsLogic { } } - Future updatePushToken() async { + Future refreshPushToken() async { try { + if (_config == null || _credentials == null || _account == null) return; + final token = await _push.token; if (token == null) { return; } - final updated = await _wallet.updatePushToken(token); + final updated = await updatePushToken( + _config!, + _account!, + _credentials!, + token, + ); if (!updated) { throw Exception('Failed to update push token'); } @@ -117,21 +145,30 @@ class NotificationsLogic { Future togglePushNotifications() async { try { + if (_account == null) return; + final systemEnabled = await _push.isEnabled(); - final enabled = _prefs.pushNotifications(_wallet.account.hexEip55); + final enabled = _prefs.pushNotifications(_account!.hexEip55); if (systemEnabled && enabled) { // disable push _state.setPush(false); await _push.stop(); - _prefs.setPushNotifications(_wallet.account.hexEip55, false); + _prefs.setPushNotifications(_account!.hexEip55, false); final token = await _push.token; if (token == null) { return; } - final updated = await _wallet.removePushToken(token); + if (_config == null || _credentials == null) return; + + final updated = await removePushToken( + _config!, + _account!, + _credentials!, + token, + ); if (!updated) { throw Exception('Failed to update push token'); } @@ -148,7 +185,7 @@ class NotificationsLogic { // enable push _state.setPush(true); await _push.start(onToken, onMessage); - _prefs.setPushNotifications(_wallet.account.hexEip55, true); + _prefs.setPushNotifications(_account!.hexEip55, true); } catch (e) { // } diff --git a/lib/state/profile/logic.dart b/lib/state/profile/logic.dart index 6c53f64a..763b259c 100644 --- a/lib/state/profile/logic.dart +++ b/lib/state/profile/logic.dart @@ -32,7 +32,9 @@ class ProfileLogic { final PhotosService _photos = PhotosService(); final AccountDBService _db = AccountDBService(); - final WalletService _wallet = WalletService(); + Config? _config; + EthPrivateKey? _credentials; + EthereumAddress? _account; bool _pauseProfileCreation = false; @@ -41,6 +43,13 @@ class ProfileLogic { _profiles = context.read(); } + void setWalletState( + Config config, EthPrivateKey credentials, EthereumAddress account) { + _config = config; + _credentials = credentials; + _account = account; + } + void resetAll() { _state.resetAll(); } @@ -77,11 +86,11 @@ class ProfileLogic { try { _state.setProfileLinkRequest(); - if (_wallet.alias == null) { - throw Exception('alias not found'); + if (_account == null || _config == null) { + throw Exception('account or config not found'); } - final community = await _appDBService.communities.get(_wallet.alias!); + final community = await _appDBService.communities.get(_account!.hexEip55); if (community == null) { throw Exception('community not found'); @@ -92,7 +101,7 @@ class ProfileLogic { final url = communityConfig.community.walletUrl(deepLinkURL); final compressedParams = compress( - '?address=${_wallet.account.hexEip55}&alias=${communityConfig.community.alias}'); + '?address=${_account!.hexEip55}&alias=${communityConfig.community.alias}'); _state.setProfileLinkSuccess('$url&receiveParams=$compressedParams'); return; @@ -130,10 +139,15 @@ class ProfileLogic { return; } + if (_config == null) { + _state.setUsernameError(); + return; + } + try { _state.setUsernameRequest(); - final exists = await _wallet.profileExists(username); + final exists = await profileExists(_config!, username); if (exists) { throw Exception('Already exists'); } @@ -148,10 +162,17 @@ class ProfileLogic { } Future loadProfile({String? account, bool online = false}) async { - final ethAccount = _wallet.account; - final alias = _wallet.alias ?? ''; + if (_account == null || _config == null) { + print('ProfileLogic.loadProfile: _account or _config is null'); + return; + } + + final ethAccount = _account!; + final alias = _config!.community.alias; final acc = account ?? ethAccount.hexEip55; + print('ProfileLogic.loadProfile: Loading profile for account $acc, alias $alias, online: $online'); + resume(); try { @@ -160,8 +181,12 @@ class ProfileLogic { final account = await _accountBackupDBService.accounts.get(ethAccount, alias); + print('ProfileLogic.loadProfile: Found account in DB: ${account != null}'); + print('ProfileLogic.loadProfile: Account has profile: ${account?.profile != null}'); + if (account != null && account.profile != null) { final profile = account.profile!; + print('ProfileLogic.loadProfile: Setting profile from DB - username: ${profile.username}'); _state.setProfileSuccess( account: profile.account, username: profile.username, @@ -179,19 +204,32 @@ class ProfileLogic { } if (!online) { + print('ProfileLogic.loadProfile: Community is offline, exiting'); throw Exception('community is offline'); } - final profile = await _wallet.getProfile(acc); + print('ProfileLogic.loadProfile: Fetching profile from network'); + final profile = await getProfile(_config!, acc); + print('ProfileLogic.loadProfile: Network profile found: ${profile != null}'); + if (profile == null) { + print('ProfileLogic.loadProfile: No network profile found, current username: ${_state.username}'); _state.setProfileNoChangeSuccess(); - giveProfileUsername(); + + // Only generate a new username if we don't already have one + if (_state.username.isEmpty) { + print('ProfileLogic.loadProfile: Generating new username'); + giveProfileUsername(); + } else { + print('ProfileLogic.loadProfile: Keeping existing username: ${_state.username}'); + } return; } profile.name = cleanNameString(profile.name); + print('ProfileLogic.loadProfile: Setting profile from network - username: ${profile.username}'); _state.setProfileSuccess( account: profile.account, username: profile.username, @@ -236,7 +274,7 @@ class ProfileLogic { _state.viewProfileSuccess(cachedProfile!.profile); } - final profile = await _wallet.getProfile(account); + final profile = await getProfile(_config!, account); if (profile == null) { await delay(const Duration(milliseconds: 500)); _state.setViewProfileNoChangeSuccess(); @@ -261,6 +299,10 @@ class ProfileLogic { } Future save(ProfileV1 profile, Uint8List? image) async { + if (_config == null || _account == null || _credentials == null) { + return false; + } + try { _state.setProfileRequest(); @@ -270,7 +312,7 @@ class ProfileLogic { profile.name = _state.nameController.value.text; profile.description = _state.descriptionController.value.text; - final exists = await _wallet.createAccount(); + final exists = await createAccount(_config!, _account!, _credentials!); if (!exists) { throw Exception('Failed to create account'); } @@ -281,7 +323,10 @@ class ProfileLogic { ? convertBytesToUint8List(image) : await _photos.photoFromBundle('assets/icons/profile.jpg'); - final url = await _wallet.setProfile( + final url = await setProfile( + _config!, + _account!, + _credentials!, ProfileRequest.fromProfileV1(profile), image: newImage, fileType: '.jpg', @@ -292,7 +337,7 @@ class ProfileLogic { _state.setProfileFetching(); - final newProfile = await _wallet.getProfileFromUrl(url); + final newProfile = await getProfileFromUrl(_config!, url); if (newProfile == null) { throw Exception('Failed to load profile'); } @@ -323,7 +368,7 @@ class ProfileLogic { _accountBackupDBService.accounts.update( DBAccount( - alias: _wallet.alias!, + alias: _config!.community.alias, address: EthereumAddress.fromHex(newProfile.account), name: newProfile.name, username: newProfile.username, @@ -345,6 +390,10 @@ class ProfileLogic { } Future update(ProfileV1 profile) async { + if (_config == null || _account == null || _credentials == null) { + return false; + } + try { _state.setProfileRequest(); @@ -357,7 +406,7 @@ class ProfileLogic { _state.setProfileExisting(); - final existing = await _wallet.getProfile(profile.account); + final existing = await getProfile(_config!, profile.account); if (existing == null) { throw Exception('Failed to load profile'); } @@ -369,14 +418,15 @@ class ProfileLogic { _state.setProfileUploading(); - final url = await _wallet.updateProfile(profile); + final url = + await updateProfile(_config!, _account!, _credentials!, profile); if (url == null) { throw Exception('Failed to save profile'); } _state.setProfileFetching(); - final newProfile = await _wallet.getProfileFromUrl(url); + final newProfile = await getProfileFromUrl(_config!, url); if (newProfile == null) { throw Exception('Failed to load profile'); } @@ -405,7 +455,7 @@ class ProfileLogic { _accountBackupDBService.accounts.update( DBAccount( - alias: _wallet.alias!, + alias: _config!.community.alias, address: EthereumAddress.fromHex(newProfile.account), name: newProfile.name, username: newProfile.username, @@ -435,6 +485,10 @@ class ProfileLogic { } Future generateProfileUsername() async { + if (_config == null) { + return null; + } + String username = await getRandomUsername(); _state.setUsernameSuccess(username: username); @@ -442,7 +496,7 @@ class ProfileLogic { const baseDelay = Duration(milliseconds: 100); for (int tries = 1; tries <= maxTries; tries++) { - final exists = await _wallet.profileExists(username); + final exists = await profileExists(_config!, username); if (!exists) { return username; @@ -460,6 +514,10 @@ class ProfileLogic { Future giveProfileUsername() async { debugPrint('handleNewProfile'); + if (_config == null || _account == null || _credentials == null) { + return; + } + try { final username = await generateProfileUsername(); if (username == null) { @@ -469,8 +527,8 @@ class ProfileLogic { _state.setUsernameSuccess(username: username); - final address = _wallet.account.hexEip55; - final alias = _wallet.alias ?? ''; + final address = _account!.hexEip55; + final alias = _config!.community.alias; final account = await _accountBackupDBService.accounts .get(EthereumAddress.fromHex(address), alias); @@ -498,7 +556,7 @@ class ProfileLogic { return; } - final exists = await _wallet.createAccount(); + final exists = await createAccount(_config!, _account!, _credentials!); if (!exists) { throw Exception('Failed to create account'); } @@ -507,7 +565,10 @@ class ProfileLogic { return; } - final url = await _wallet.setProfile( + final url = await setProfile( + _config!, + _account!, + _credentials!, ProfileRequest.fromProfileV1(profile), image: await _photos.photoFromBundle('assets/icons/profile.jpg'), fileType: '.jpg', @@ -520,7 +581,7 @@ class ProfileLogic { return; } - final newProfile = await _wallet.getProfileFromUrl(url); + final newProfile = await getProfileFromUrl(_config!, url); if (newProfile == null) { throw Exception('Failed to get profile from url $url'); } diff --git a/lib/state/profile/state.dart b/lib/state/profile/state.dart index 6cc7ac11..a2f9b3cb 100644 --- a/lib/state/profile/state.dart +++ b/lib/state/profile/state.dart @@ -56,6 +56,7 @@ class ProfileState with ChangeNotifier { ProfileV1? viewProfile; void resetAll({notify = false}) { + print('ProfileState.resetAll: Resetting all profile data'); account = ''; username = ''; name = ''; @@ -178,6 +179,7 @@ class ProfileState with ChangeNotifier { required String imageMedium, required String imageSmall, }) { + print('ProfileState.setProfileSuccess: Setting username to "$username"'); this.account = account; this.username = username; this.name = name; diff --git a/lib/state/profiles/logic.dart b/lib/state/profiles/logic.dart index febe6767..2823e5e5 100644 --- a/lib/state/profiles/logic.dart +++ b/lib/state/profiles/logic.dart @@ -1,3 +1,4 @@ +import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/db/account/contacts.dart'; import 'package:citizenwallet/services/db/account/db.dart'; import 'package:citizenwallet/services/db/backup/accounts.dart'; @@ -10,13 +11,17 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:rate_limiter/rate_limiter.dart'; import 'package:citizenwallet/services/cache/contacts.dart'; +import 'package:web3dart/web3dart.dart'; class ProfilesLogic extends WidgetsBindingObserver { final AccountDBService _db = AccountDBService(); final AccountBackupDBService _accountBackupDBService = AccountBackupDBService(); late ProfilesState _state; - final WalletService _wallet = WalletService(); + + EthPrivateKey? _currentCredentials; + EthereumAddress? _currentAccount; + Config? _currentConfig; late Debounce debouncedSearchProfile; @@ -41,10 +46,21 @@ class ProfilesLogic extends WidgetsBindingObserver { ); } + void setWalletState( + Config config, EthPrivateKey credentials, EthereumAddress account) { + _currentConfig = config; + _currentCredentials = credentials; + _currentAccount = account; + } + Future _loadCachedProfile(String addr) async { try { + if (_currentConfig == null) { + return null; + } + final cachedProfile = await ContactsCache().get(addr, () async { - final fetchedProfile = await _wallet.getProfile(addr); + final fetchedProfile = await getProfile(_currentConfig!, addr); if (fetchedProfile == null) { return null; } @@ -117,13 +133,18 @@ class ProfilesLogic extends WidgetsBindingObserver { Future _searchProfile(String value) async { try { + if (_currentConfig == null) { + _state.isSearchingError(); + return; + } + final cleanValue = value.replaceFirst('@', ''); _state.isSearching(); final profile = cleanValue.startsWith('0x') - ? await _wallet.getProfile(cleanValue) - : await _wallet.getProfileByUsername(cleanValue); + ? await getProfile(_currentConfig!, cleanValue) + : await getProfileByUsername(_currentConfig!, cleanValue); final results = await _db.contacts.search(cleanValue.toLowerCase()); @@ -151,7 +172,7 @@ class ProfilesLogic extends WidgetsBindingObserver { _state.isSearchingError(); } - Future getProfile(String addr) async { + Future getLocalProfile(String addr) async { try { _state.isSearching(); @@ -222,8 +243,7 @@ class ProfilesLogic extends WidgetsBindingObserver { } // Try to get updated profile from wallet - final updatedProfile = - await _wallet.getProfile(account.address.hexEip55); + final updatedProfile = await getLocalProfile(account.address.hexEip55); if (updatedProfile != null) { profilesMap[account.address.hexEip55] = updatedProfile; @@ -256,7 +276,7 @@ class ProfilesLogic extends WidgetsBindingObserver { } Future getSendToProfile(String address) async { - final profile = await _wallet.getProfile(address); + final profile = await getLocalProfile(address); return profile; } diff --git a/lib/state/scan/logic.dart b/lib/state/scan/logic.dart index f7b3382e..f6a75ce0 100644 --- a/lib/state/scan/logic.dart +++ b/lib/state/scan/logic.dart @@ -2,10 +2,12 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/nfc/default.dart'; import 'package:citizenwallet/services/nfc/service.dart'; import 'package:citizenwallet/services/wallet/wallet.dart'; import 'package:citizenwallet/state/scan/state.dart'; +import 'package:web3dart/web3dart.dart'; class ScanLogic extends WidgetsBindingObserver { static final ScanLogic _instance = ScanLogic._internal(); @@ -18,12 +20,24 @@ class ScanLogic extends WidgetsBindingObserver { late ScanState _state; final NFCService _nfc = DefaultNFCService(); - final WalletService _wallet = WalletService(); + EthPrivateKey? _currentCredentials; + EthereumAddress? _currentAccount; + Config? _currentConfig; + + static void setGlobalWalletState(Config config, EthPrivateKey credentials, EthereumAddress account) { + _instance.setWalletState(config, credentials, account); + } void init(BuildContext context) { _state = context.read(); } + void setWalletState(Config config, EthPrivateKey credentials, EthereumAddress account) { + _currentConfig = config; + _currentCredentials = credentials; + _currentAccount = account; + } + void load() async { try { _state.loadScanner(); @@ -48,6 +62,10 @@ class ScanLogic extends WidgetsBindingObserver { Future read({String? message, String? successMessage}) async { try { + if (_currentConfig == null || _currentCredentials == null || _currentAccount == null) { + throw Exception('Wallet not initialized'); + } + _state.setNfcAddressRequest(); _state.setNfcReading(true); @@ -59,8 +77,8 @@ class ScanLogic extends WidgetsBindingObserver { _state.setNfcReading(false); // - final cardHash = await _wallet.getCardHash(serialNumber); - final address = await _wallet.getCardAddress(cardHash); + final cardHash = await getCardHash(_currentConfig!, serialNumber); + final address = await getCardAddress(_currentConfig!, cardHash); _state.setNfcAddressSuccess(address.hexEip55); diff --git a/lib/state/transaction.dart b/lib/state/transaction.dart index 2d294093..78f55aad 100644 --- a/lib/state/transaction.dart +++ b/lib/state/transaction.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:citizenwallet/models/transaction.dart' as transaction_model; +import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/db/account/db.dart'; import 'package:citizenwallet/services/wallet/contracts/erc20.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; @@ -13,7 +14,7 @@ class TransactionState with ChangeNotifier { final String _transactionHash; transaction_model.CWTransaction? transaction; final AccountDBService _accountDBService = AccountDBService(); - final WalletService _wallet = WalletService(); + Config? _config; TransactionState({required String transactionHash}) : _transactionHash = transactionHash; @@ -27,6 +28,10 @@ class TransactionState with ChangeNotifier { } } + void setConfig(Config config) { + _config = config; + } + @override void dispose() { _mounted = false; @@ -38,6 +43,13 @@ class TransactionState with ChangeNotifier { loading = true; safeNotifyListeners(); + if (_config == null) { + loading = false; + transaction = null; + safeNotifyListeners(); + return; + } + final dbTransaction = await _accountDBService.transactions .getTransactionByHash(_transactionHash); @@ -51,11 +63,11 @@ class TransactionState with ChangeNotifier { transaction = transaction_model.CWTransaction( fromDoubleUnit( dbTransaction.value.toString(), - decimals: _wallet.currency.decimals, + decimals: _config!.getPrimaryToken().decimals, ), id: dbTransaction.hash, hash: dbTransaction.txHash, - chainId: _wallet.chainId, + chainId: _config!.chains.values.first.id, from: EthereumAddress.fromHex(dbTransaction.from).hexEip55, to: EthereumAddress.fromHex(dbTransaction.to).hexEip55, description: dbTransaction.data != '' diff --git a/lib/state/vouchers/logic.dart b/lib/state/vouchers/logic.dart index f74d7099..9474ae30 100644 --- a/lib/state/vouchers/logic.dart +++ b/lib/state/vouchers/logic.dart @@ -27,9 +27,12 @@ class VoucherLogic extends WidgetsBindingObserver { final AppDBService _appDBService = AppDBService(); final AccountDBService _accountDBService = AccountDBService(); - final WalletService _wallet = WalletService(); final SharingService _sharing = SharingService(); + EthPrivateKey? _currentCredentials; + EthereumAddress? _currentAccount; + Config? _currentConfig; + late VoucherState _state; late Debounce debouncedLoad; @@ -46,6 +49,13 @@ class VoucherLogic extends WidgetsBindingObserver { ); } + void setWalletState( + Config config, EthPrivateKey credentials, EthereumAddress account) { + _currentConfig = config; + _currentCredentials = credentials; + _currentAccount = account; + } + void resetCreate() { _state.resetCreate(notify: false); } @@ -55,6 +65,10 @@ class VoucherLogic extends WidgetsBindingObserver { return; } + if (_currentConfig == null) { + return; + } + final toLoadCopy = [...toLoad]; toLoad = []; @@ -63,7 +77,8 @@ class VoucherLogic extends WidgetsBindingObserver { return; } try { - final balance = await _wallet.getBalance(addr: addr); + final balance = + await getBalance(_currentConfig!, EthereumAddress.fromHex(addr)); await _accountDBService.vouchers .updateBalance(addr, balance.toString()); @@ -93,12 +108,12 @@ class VoucherLogic extends WidgetsBindingObserver { try { _state.vouchersRequest(); - if (_wallet.alias == null) { - throw Exception('alias not found'); + if (_currentConfig == null) { + throw Exception('wallet not initialized'); } - final vouchers = - await _accountDBService.vouchers.getAllByAlias(_wallet.alias!); + final vouchers = await _accountDBService.vouchers + .getAllByAlias(_currentConfig!.community.alias); _state.vouchersSuccess(vouchers .map( @@ -151,13 +166,15 @@ class VoucherLogic extends WidgetsBindingObserver { EthereumAddress account = uri.queryParameters['account'] != null ? EthereumAddress.fromHex(uri.queryParameters['account']!) - : await _wallet.getAccountAddress( + : await getAccountAddress( + _currentConfig!, credentials.address.hexEip55, legacy: true, cache: false, ); - final balance = await _wallet.getBalance(addr: account.hexEip55); + final balance = + await getBalance(_currentConfig ?? Config.fromJson({}), account); final voucher = Voucher( address: account.hexEip55, @@ -203,7 +220,8 @@ class VoucherLogic extends WidgetsBindingObserver { throw Exception('voucher not found'); } - final balance = await _wallet.getBalance(addr: address); + final balance = + await getBalance(_currentConfig!, EthereumAddress.fromHex(address)); await _accountDBService.vouchers.updateBalance(address, balance); @@ -218,11 +236,12 @@ class VoucherLogic extends WidgetsBindingObserver { legacy: dbvoucher.legacy, ); - if (_wallet.alias == null) { + if (_currentConfig!.community.alias == null) { throw Exception('alias not found'); } - final community = await _appDBService.communities.get(_wallet.alias!); + final community = + await _appDBService.communities.get(_currentConfig!.community.alias); if (community == null) { throw Exception('community not found'); @@ -236,7 +255,7 @@ class VoucherLogic extends WidgetsBindingObserver { voucher, voucher.getLink( appLink, - _wallet.currency.symbol, + _currentConfig!.getPrimaryToken().symbol, dbvoucher.voucher, ), ); @@ -267,14 +286,15 @@ class VoucherLogic extends WidgetsBindingObserver { final doubleAmount = balance.replaceAll(',', '.'); final parsedAmount = toUnit( doubleAmount, - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ); - if (_wallet.alias == null) { + if (_currentConfig!.community.alias == null) { throw Exception('alias not found'); } - final community = await _appDBService.communities.get(_wallet.alias!); + final community = + await _appDBService.communities.get(_currentConfig!.community.alias); if (community == null) { throw Exception('community not found'); @@ -291,7 +311,7 @@ class VoucherLogic extends WidgetsBindingObserver { final List vouchers = []; for (int i = 0; i < quantity; i++) { - addresses.add(_wallet.tokenAddress); + addresses.add(_currentConfig!.getPrimaryToken().address); final credentials = EthPrivateKey.createRandom(Random.secure()); @@ -302,8 +322,8 @@ class VoucherLogic extends WidgetsBindingObserver { scryptN: 2, ); - final account = - await _wallet.getAccountAddress(credentials.address.hexEip55); + final account = await getAccountAddress( + _currentConfig!, credentials.address.hexEip55); final dbvoucher = DBVoucher( address: account.hexEip55, @@ -312,14 +332,16 @@ class VoucherLogic extends WidgetsBindingObserver { balance: parsedAmount.toString(), voucher: wallet.toJson(), salt: salt, - creator: _wallet.account.hexEip55, + creator: _currentAccount!.hexEip55, legacy: false, ); dbvouchers.add(dbvoucher); // TODO: token id should be set - calldata.add(_wallet.tokenTransferCallData( + calldata.add(tokenTransferCallData( + _currentConfig!, + _currentAccount!, account.hexEip55, parsedAmount, )); @@ -338,17 +360,23 @@ class VoucherLogic extends WidgetsBindingObserver { vouchers.add(voucher); } - final (_, userop) = await _wallet.prepareUserop( + final (_, userop) = await prepareUserop( + _currentConfig!, + _currentAccount!, + _currentCredentials!, addresses, calldata, ); - final txHash = await _wallet.submitUserop(userop); + final txHash = await submitUserop( + _currentConfig!, + userop, + ); if (txHash == null) { throw Exception('transaction failed'); } - final success = await _wallet.waitForTxSuccess(txHash); + final success = await waitForTxSuccess(_currentConfig!, txHash); if (!success) { throw Exception('transaction failed'); } @@ -384,17 +412,18 @@ class VoucherLogic extends WidgetsBindingObserver { final doubleAmount = balance.replaceAll(',', '.'); final parsedAmount = toUnit( doubleAmount, - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ); - final account = - await _wallet.getAccountAddress(credentials.address.hexEip55); + final account = await getAccountAddress( + _currentConfig!, credentials.address.hexEip55); - if (_wallet.alias == null) { + if (_currentConfig!.community.alias == null) { throw Exception('alias not found'); } - final community = await _appDBService.communities.get(_wallet.alias!); + final community = + await _appDBService.communities.get(_currentConfig!.community.alias); if (community == null) { throw Exception('community not found'); @@ -409,7 +438,7 @@ class VoucherLogic extends WidgetsBindingObserver { balance: parsedAmount.toString(), voucher: 'v2-${bytesToHex(credentials.privateKey)}', salt: salt, - creator: _wallet.account.hexEip55, + creator: _currentAccount!.hexEip55, legacy: false, ); @@ -417,26 +446,32 @@ class VoucherLogic extends WidgetsBindingObserver { // TODO: token id should be set final calldata = mint - ? _wallet.tokenMintCallData( + ? tokenMintCallData( + _currentConfig!, account.hexEip55, parsedAmount, ) - : _wallet.tokenTransferCallData( + : tokenTransferCallData( + _currentConfig!, + _currentAccount!, account.hexEip55, parsedAmount, ); - final (_, userop) = await _wallet.prepareUserop( - [_wallet.tokenAddress], + final (_, userop) = await prepareUserop( + _currentConfig!, + _currentAccount!, + _currentCredentials!, + [_currentConfig!.getPrimaryToken().address], [calldata], ); final args = { - 'from': _wallet.account.hexEip55, + 'from': _currentAccount!.hexEip55, 'to': account.hexEip55, }; - if (_wallet.standard == 'erc1155') { - args['operator'] = _wallet.account.hexEip55; + if (_currentConfig!.getPrimaryToken().standard == 'erc1155') { + args['operator'] = _currentAccount!.hexEip55; args['id'] = '0'; args['amount'] = parsedAmount.toString(); } else { @@ -444,12 +479,13 @@ class VoucherLogic extends WidgetsBindingObserver { } final eventData = createEventData( - stringSignature: _wallet.transferEventStringSignature, - topic: _wallet.transferEventSignature, + stringSignature: transferEventStringSignature(_currentConfig!), + topic: transferEventSignature(_currentConfig!), args: args, ); - final txHash = await _wallet.submitUserop( + final txHash = await submitUserop( + _currentConfig!, userop, data: eventData, extraData: TransferData(dbvoucher.name), @@ -480,7 +516,7 @@ class VoucherLogic extends WidgetsBindingObserver { ), ); - final success = await _wallet.waitForTxSuccess(txHash); + final success = await waitForTxSuccess(_currentConfig!, txHash); if (!success) { throw Exception('transaction failed'); } @@ -566,31 +602,35 @@ class VoucherLogic extends WidgetsBindingObserver { if (preSendingTransaction != null) { preSendingTransaction( - amount, tempId, _wallet.account.hexEip55, voucher.address); + amount, tempId, _currentAccount!.hexEip55, voucher.address); } - final calldata = _wallet.tokenTransferCallData( - _wallet.account.hexEip55, + final calldata = tokenTransferCallData( + _currentConfig!, + _currentAccount!, + voucher.address, amount, - from: voucher.address, ); - final (hash, userop) = await _wallet.prepareUserop( - [_wallet.tokenAddress], + final (hash, userop) = await prepareUserop( + _currentConfig!, + _currentAccount!, + _currentCredentials!, + [_currentConfig!.getPrimaryToken().address], [calldata], customCredentials: credentials, ); if (sendingTransaction != null) { sendingTransaction( - amount, hash, _wallet.account.hexEip55, voucher.address); + amount, hash, _currentAccount!.hexEip55, voucher.address); } final args = { 'from': voucher.address, - 'to': _wallet.account.hexEip55, + 'to': _currentAccount!.hexEip55, }; - if (_wallet.standard == 'erc1155') { + if (_currentConfig!.getPrimaryToken().standard == 'erc1155') { args['operator'] = voucher.address; args['id'] = '0'; args['amount'] = amount.toString(); @@ -599,12 +639,13 @@ class VoucherLogic extends WidgetsBindingObserver { } final eventData = createEventData( - stringSignature: _wallet.transferEventStringSignature, - topic: _wallet.transferEventSignature, + stringSignature: transferEventStringSignature(_currentConfig!), + topic: transferEventSignature(_currentConfig!), args: args, ); - final txHash = await _wallet.submitUserop( + final txHash = await submitUserop( + _currentConfig!, userop, customCredentials: credentials, data: eventData, @@ -614,7 +655,7 @@ class VoucherLogic extends WidgetsBindingObserver { throw Exception('transaction failed'); } - final success = await _wallet.waitForTxSuccess(txHash); + final success = await waitForTxSuccess(_currentConfig!, txHash); if (!success) { throw Exception('transaction failed'); } diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index 914fc330..51d5175a 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -24,7 +24,10 @@ import 'package:citizenwallet/services/wallet/models/userop.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; import 'package:citizenwallet/services/wallet/wallet.dart'; import 'package:citizenwallet/state/notifications/logic.dart'; +import 'package:citizenwallet/state/profiles/logic.dart'; +import 'package:citizenwallet/state/scan/logic.dart'; import 'package:citizenwallet/state/theme/logic.dart'; +import 'package:citizenwallet/state/vouchers/logic.dart'; import 'package:citizenwallet/state/wallet/state.dart'; import 'package:citizenwallet/utils/delay.dart'; import 'package:citizenwallet/utils/qr.dart'; @@ -77,7 +80,6 @@ class WalletLogic extends WidgetsBindingObserver { final String appUniversalURL = dotenv.get('ORIGIN_HEADER'); final ConfigService _config = ConfigService(); - final WalletService _wallet = WalletService(); final AccountDBService _accountDBService = AccountDBService(); final AppDBService _appDBService = AppDBService(); @@ -86,9 +88,25 @@ class WalletLogic extends WidgetsBindingObserver { bool cancelLoadAccounts = false; - WalletService get wallet => _wallet; EventService? _eventService; - SigAuthConnection get connection => _wallet.connection; + + EthPrivateKey? _currentCredentials; + EthereumAddress? _currentAccount; + Config? _currentConfig; + + SigAuthConnection? get connection { + if (_currentCredentials == null || + _currentAccount == null || + _currentConfig == null) { + return null; + } + return getSigAuthConnection( + _currentConfig!, + _currentAccount!, + _currentCredentials!, + dotenv.get('ORIGIN_HEADER'), + ); + } final TextEditingController _addressController = TextEditingController(); final TextEditingController _amountController = TextEditingController(); @@ -99,16 +117,42 @@ class WalletLogic extends WidgetsBindingObserver { TextEditingController get messageController => _messageController; String? get lastWallet => _preferences.lastWallet; - String get address => _wallet.address.hexEip55; - String get account => _wallet.account.hexEip55; - String get token => _wallet.tokenAddress; + String get address => _currentCredentials?.address.hexEip55 ?? ''; + String get account => _currentAccount?.hexEip55 ?? ''; + String get token => _currentConfig?.getPrimaryToken().address ?? ''; WalletLogic(BuildContext context, NotificationsLogic notificationsLogic) : _state = context.read(), _notificationsLogic = notificationsLogic; - EthPrivateKey get privateKey { - return _wallet.credentials; + // References to other logic classes that need wallet state + ProfilesLogic? _profilesLogic; + VoucherLogic? _voucherLogic; + + void setLogicReferences( + ProfilesLogic? profilesLogic, VoucherLogic? voucherLogic) { + _profilesLogic = profilesLogic; + _voucherLogic = voucherLogic; + } + + EthPrivateKey? get privateKey => _currentCredentials; + Config? get config => _currentConfig; + EthPrivateKey? get credentials => _currentCredentials; + EthereumAddress? get accountAddress => _currentAccount; + + void setWalletStateInOtherLogic() { + if (_currentConfig != null && + _currentCredentials != null && + _currentAccount != null) { + _notificationsLogic.setWalletState( + _currentConfig!, _currentCredentials!, _currentAccount!); + _profilesLogic?.setWalletState( + _currentConfig!, _currentCredentials!, _currentAccount!); + _voucherLogic?.setWalletState( + _currentConfig!, _currentCredentials!, _currentAccount!); + ScanLogic.setGlobalWalletState( + _currentConfig!, _currentCredentials!, _currentAccount!); + } } void updateMessage() { @@ -239,25 +283,29 @@ class WalletLogic extends WidgetsBindingObserver { final token = config.getPrimaryToken(); - await _wallet.initWeb( - EthereumAddress.fromHex(decodedSplit[0]), - cred.privateKey, - legacy: fromLegacy, - NativeCurrency( - name: token.name, - symbol: token.symbol, - decimals: token.decimals, - ), - config, - ); + // await _wallet.initWeb( + // EthereumAddress.fromHex(decodedSplit[0]), + // cred.privateKey, + // legacy: fromLegacy, + // NativeCurrency( + // name: token.name, + // symbol: token.symbol, + // decimals: token.decimals, + // ), + // config, + // ); + + await config.initContracts(); + + _currentCredentials = cred.privateKey; + _currentAccount = EthereumAddress.fromHex(decodedSplit[0]); + _currentConfig = config; await _accountDBService.init( - 'wallet_${_wallet.address.hexEip55}'); // TODO: migrate to account address instead + 'wallet_${_currentCredentials!.address.hexEip55}'); // TODO: migrate to account address instead ContactsCache().init(_accountDBService); - final currency = _wallet.currency; - _state.setWalletConfig(config); _state.setWallet( @@ -265,26 +313,30 @@ class WalletLogic extends WidgetsBindingObserver { '0', name: 'Citizen Wallet', // on web, acts as a page's title, wallet is fitting here - address: _wallet.address.hexEip55, + address: _currentCredentials!.address.hexEip55, alias: config.community.alias, - account: _wallet.account.hexEip55, + account: _currentAccount!.hexEip55, currencyName: token.name, symbol: token.symbol, currencyLogo: config.community.logo, - decimalDigits: currency.decimals, + decimalDigits: token.decimals, locked: false, minter: false, ), ); - _wallet.getBalance().then((v) => _state.setWalletBalance(v)); - _wallet.minter.then((v) => _state.setWalletMinter(v)); + getBalance(config, _currentAccount!) + .then((v) => _state.setWalletBalance(v)); + isMinter(config, _currentAccount!).then((v) => _state.setWalletMinter(v)); + + // Set wallet state in other logic classes + setWalletStateInOtherLogic(); if (loadAdditionalData != null) await loadAdditionalData(); _theme.changeTheme(config.community.theme); - await _preferences.setLastWallet(_wallet.address.hexEip55); + await _preferences.setLastWallet(_currentCredentials!.address.hexEip55); await _preferences.setLastAlias(config.community.alias); await _preferences.setLastWalletLink(encoded); @@ -341,9 +393,9 @@ class WalletLogic extends WidgetsBindingObserver { ); if (isWalletLoaded && - accAddress == _wallet.account.hexEip55 && - alias == _wallet.alias) { - _wallet.getBalance().then((v) { + accAddress == _currentAccount?.hexEip55 && + alias == communityConfig.community.alias) { + getBalance(communityConfig, _currentAccount!).then((v) { _state.updateWalletBalanceSuccess(v); }); @@ -367,25 +419,22 @@ class WalletLogic extends WidgetsBindingObserver { _state.setChainId(chainId); - await _wallet.init( - dbWallet.address, - dbWallet.privateKey!, - nativeCurrency, - communityConfig, - onNotify: (String message) { - _notificationsLogic.show(message); - }, - onFinished: (bool ok) { - _state.setWalletReady(ok); - _state.setWalletReadyLoading(false); - }, - ); + // Initialize config contracts + await communityConfig.initContracts(); + + // Set current wallet state + _currentCredentials = dbWallet.privateKey!; + _currentAccount = dbWallet.address; + _currentConfig = communityConfig; await _accountDBService.init( - 'wallet_${_wallet.address.hexEip55}'); // TODO: migrate to account address instead + 'wallet_${_currentCredentials!.address.hexEip55}'); // TODO: migrate to account address instead ContactsCache().init(_accountDBService); + _state.setWalletReady(true); + _state.setWalletReadyLoading(false); + _config .isCommunityOnline( communityConfig.chains[token.chainId.toString()]!.node.url) @@ -404,7 +453,7 @@ class WalletLogic extends WidgetsBindingObserver { name: dbWallet.name, address: dbWallet.address.hexEip55, alias: dbWallet.alias, - account: _wallet.account.hexEip55, + account: _currentAccount!.hexEip55, currencyName: token.name, symbol: token.symbol, currencyLogo: communityConfig.community.logo, @@ -415,7 +464,11 @@ class WalletLogic extends WidgetsBindingObserver { ), ); - _wallet.getBalance().then((v) => _state.setWalletBalance(v)); + getBalance(communityConfig, _currentAccount!) + .then((v) => _state.setWalletBalance(v)); + + // Set wallet state in other logic classes + setWalletStateInOtherLogic(); loadAdditionalData(true); @@ -597,7 +650,7 @@ class WalletLogic extends WidgetsBindingObserver { Future transferEventSubscribe() async { try { - final alias = _wallet.alias; + final alias = _currentConfig?.community.alias ?? ''; if (alias == null) { return; } @@ -620,7 +673,7 @@ class WalletLogic extends WidgetsBindingObserver { _eventService = EventService( communityConfig.chains[token.chainId.toString()]!.node.wsUrl, token.address, - _wallet.transferEventSignature, + transferEventSignature(_currentConfig!), ); _eventService!.setMessageHandler(handleTransferEvent); @@ -651,10 +704,11 @@ class WalletLogic extends WidgetsBindingObserver { case 'update': final log = Log.fromJson(event.data); - final tx = TransferEvent.fromLog(log, standard: _wallet.standard); + final tx = TransferEvent.fromLog(log, + standard: _currentConfig!.getPrimaryToken().standard); // TODO: fix this on the websocket side - final myAccount = _wallet.account.hexEip55; + final myAccount = _currentAccount!.hexEip55; if (tx.from.hexEip55 != myAccount && tx.to.hexEip55 != myAccount) { return; } @@ -671,18 +725,18 @@ class WalletLogic extends WidgetsBindingObserver { value: tx.value.toString(), data: tx.data != null ? jsonEncode(tx.data?.toJson()) : '', status: tx.status, - contract: _wallet.tokenAddress, + contract: _currentConfig!.getPrimaryToken().address, )); final txList = [ CWTransaction( fromDoubleUnit( tx.value.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: tx.hash, hash: tx.txhash, - chainId: _wallet.chainId, + chainId: _currentConfig!.chains.values.first.id, from: tx.from.hexEip55, to: tx.to.hexEip55, description: tx.data?.description ?? '', @@ -691,7 +745,7 @@ class WalletLogic extends WidgetsBindingObserver { ]; incomingTxNotification(txList.where((element) => - element.to == _wallet.account.hexEip55 && + element.to == _currentAccount!.hexEip55 && element.state != TransactionState.success)); _state.incomingTransactionsRequestSuccess(txList); @@ -713,7 +767,7 @@ class WalletLogic extends WidgetsBindingObserver { if (incomingTxCount > 0 && incomingTxCount > _incomingTxCount) { // _lastIncomingTx = incomingTx.first; _notificationsLogic.show( - 'Receiving ${incomingTx.first.amount} ${_wallet.currency.symbol}...', + 'Receiving ${incomingTx.first.amount} ${_currentConfig!.getPrimaryToken().symbol}...', ); } @@ -798,20 +852,20 @@ class WalletLogic extends WidgetsBindingObserver { final List txs = (await _accountDBService.transactions.getPreviousTransactions( maxDate, - _wallet.tokenAddress, + _currentConfig!.getPrimaryToken().address, "0", // TODO: remove tokenId hardcode - _wallet.account.hexEip55, + _currentAccount!.hexEip55, offset: 0, limit: limit, )) .map((dbtx) => CWTransaction( fromDoubleUnit( dbtx.value.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: dbtx.hash, hash: dbtx.txHash, - chainId: _wallet.chainId, + chainId: _currentConfig!.chains.values.first.id, from: EthereumAddress.fromHex(dbtx.from).hexEip55, to: EthereumAddress.fromHex(dbtx.to).hexEip55, description: dbtx.data != '' @@ -828,7 +882,9 @@ class WalletLogic extends WidgetsBindingObserver { if (txs.isEmpty || (txs.isNotEmpty && txs.first.date.isBefore(maxDate))) { // nothing in the db or slightly less than there could be, check remote - final (remoteTxs, _) = await _wallet.fetchErc20Transfers( + final (remoteTxs, _) = await fetchErc20Transfers( + _currentConfig!, + _currentAccount!.hexEip55, offset: 0, limit: limit, maxDate: maxDate, @@ -847,7 +903,7 @@ class WalletLogic extends WidgetsBindingObserver { value: tx.value.toString(), data: tx.data != null ? jsonEncode(tx.data?.toJson()) : '', status: tx.status, - contract: _wallet.tokenAddress, + contract: _currentConfig!.getPrimaryToken().address, ), ); @@ -859,11 +915,11 @@ class WalletLogic extends WidgetsBindingObserver { txs.addAll(iterableRemoteTxs.map((dbtx) => CWTransaction( fromDoubleUnit( dbtx.value.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: dbtx.hash, hash: dbtx.txHash, - chainId: _wallet.chainId, + chainId: _currentConfig!.chains.values.first.id, from: EthereumAddress.fromHex(dbtx.from).hexEip55, to: EthereumAddress.fromHex(dbtx.to).hexEip55, description: dbtx.data != '' @@ -885,7 +941,7 @@ class WalletLogic extends WidgetsBindingObserver { maxDate: maxDate, ); - _wallet.getBalance().then((v) { + getBalance(_currentConfig!, _currentAccount!).then((v) { _state.updateWalletBalanceSuccess(v); }); @@ -907,20 +963,20 @@ class WalletLogic extends WidgetsBindingObserver { final List txs = (await _accountDBService.transactions.getPreviousTransactions( maxDate, - _wallet.tokenAddress, + _currentConfig!.getPrimaryToken().address, "0", // TODO: remove tokenId hardcode - _wallet.account.hexEip55, + _currentAccount!.hexEip55, offset: offset, limit: limit, )) .map((dbtx) => CWTransaction( fromDoubleUnit( dbtx.value.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: dbtx.hash, hash: dbtx.txHash, - chainId: _wallet.chainId, + chainId: _currentConfig!.chains.values.first.id, from: EthereumAddress.fromHex(dbtx.from).hexEip55, to: EthereumAddress.fromHex(dbtx.to).hexEip55, description: dbtx.data != '' @@ -937,7 +993,9 @@ class WalletLogic extends WidgetsBindingObserver { if (txs.isEmpty || txs.length < limit) { // nothing in the db or slightly less than there could be, check remote - final (remoteTxs, _) = await _wallet.fetchErc20Transfers( + final (remoteTxs, _) = await fetchErc20Transfers( + _currentConfig!, + _currentAccount!.hexEip55, offset: offset, limit: limit, maxDate: maxDate, @@ -956,7 +1014,7 @@ class WalletLogic extends WidgetsBindingObserver { value: tx.value.toString(), data: tx.data != null ? jsonEncode(tx.data?.toJson()) : '', status: tx.status, - contract: _wallet.tokenAddress, + contract: _currentConfig!.getPrimaryToken().address, ), ); @@ -968,11 +1026,11 @@ class WalletLogic extends WidgetsBindingObserver { txs.addAll(iterableRemoteTxs.map((dbtx) => CWTransaction( fromDoubleUnit( dbtx.value.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: dbtx.hash, hash: dbtx.txHash, - chainId: _wallet.chainId, + chainId: _currentConfig!.chains.values.first.id, from: EthereumAddress.fromHex(dbtx.from).hexEip55, to: EthereumAddress.fromHex(dbtx.to).hexEip55, description: dbtx.data != '' @@ -1000,11 +1058,11 @@ class WalletLogic extends WidgetsBindingObserver { Future updateBalance() async { try { - if (_wallet.alias == null) { + if (_currentConfig?.community.alias == null) { throw Exception('alias not found'); } - final balance = await _wallet.getBalance(); + final balance = await getBalance(_currentConfig!, _currentAccount!); final currentDoubleBalance = double.tryParse(_state.wallet?.balance ?? '0.0') ?? 0.0; @@ -1069,7 +1127,7 @@ class WalletLogic extends WidgetsBindingObserver { final balance = double.tryParse(_state.wallet?.balance ?? '0.0') ?? 0.0; final doubleAmount = double.parse(toUnit( amount.replaceAll(',', '.'), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ).toString()); return doubleAmount == 0 || doubleAmount > balance; @@ -1096,11 +1154,11 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.sending( fromDoubleUnit( amount.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: tempId, hash: '', - chainId: _wallet.chainId, + chainId: _currentConfig!.chains.values.first.id, from: from, to: to, description: message, @@ -1120,11 +1178,11 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.pending( fromDoubleUnit( amount.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: hash, hash: '', - chainId: _wallet.chainId, + chainId: _currentConfig!.chains.values.first.id, to: to, from: from, description: message, @@ -1143,7 +1201,7 @@ class WalletLogic extends WidgetsBindingObserver { final doubleAmount = amount.replaceAll(',', '.'); final parsedAmount = toUnit( doubleAmount, - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ); var tempId = id ?? '${pendingTransactionId}_${generateRandomId()}'; @@ -1160,27 +1218,32 @@ class WalletLogic extends WidgetsBindingObserver { parsedAmount, tempId, to, - _wallet.account.hexEip55, + _currentAccount!.hexEip55, message: message, ); // TODO: token id should be set - final calldata = _wallet.tokenTransferCallData( + final calldata = tokenTransferCallData( + _currentConfig!, + _currentAccount!, to, parsedAmount, ); - final (hash, userop) = await _wallet.prepareUserop( - [_wallet.tokenAddress], + final (hash, userop) = await prepareUserop( + _currentConfig!, + _currentAccount!, + _currentCredentials!, + [_currentConfig!.getPrimaryToken().address], [calldata], ); final args = { - 'from': _wallet.account.hexEip55, + 'from': _currentAccount!.hexEip55, 'to': to, }; - if (_wallet.standard == 'erc1155') { - args['operator'] = _wallet.account.hexEip55; + if (_currentConfig!.getPrimaryToken().standard == 'erc1155') { + args['operator'] = _currentAccount!.hexEip55; args['id'] = '0'; args['amount'] = parsedAmount.toString(); } else { @@ -1188,12 +1251,13 @@ class WalletLogic extends WidgetsBindingObserver { } final eventData = createEventData( - stringSignature: _wallet.transferEventStringSignature, - topic: _wallet.transferEventSignature, + stringSignature: transferEventStringSignature(_currentConfig!), + topic: transferEventSignature(_currentConfig!), args: args, ); - final txHash = await _wallet.submitUserop( + final txHash = await submitUserop( + _currentConfig!, userop, data: eventData, extraData: message != '' ? TransferData(message) : null, @@ -1207,19 +1271,18 @@ class WalletLogic extends WidgetsBindingObserver { parsedAmount, tempId, to, - _wallet.account.hexEip55, + _currentAccount!.hexEip55, message: message, ); if (userop.isFirst()) { - // an account was created, update push token in the background - _wallet.waitForTxSuccess(txHash).then((value) { + waitForTxSuccess(_currentConfig!, txHash).then((value) { if (!value) { return; } // the account exists, enable push notifications - _notificationsLogic.updatePushToken(); + _notificationsLogic.refreshPushToken(); }); } @@ -1236,7 +1299,7 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1250,7 +1313,7 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1266,7 +1329,7 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1292,7 +1355,7 @@ class WalletLogic extends WidgetsBindingObserver { final doubleAmount = amount.replaceAll(',', '.'); final parsedAmount = toUnit( doubleAmount, - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ); var tempId = id ?? '${pendingTransactionId}_${generateRandomId()}'; @@ -1309,26 +1372,31 @@ class WalletLogic extends WidgetsBindingObserver { parsedAmount, tempId, to, - _wallet.account.hexEip55, + _currentAccount!.hexEip55, ); // TODO: token id should be set - final calldata = _wallet.tokenTransferCallData( + final calldata = tokenTransferCallData( + _currentConfig!, + _currentAccount!, to, parsedAmount, ); - final (hash, userop) = await _wallet.prepareUserop( - [_wallet.tokenAddress], + final (hash, userop) = await prepareUserop( + _currentConfig!, + _currentAccount!, + _currentCredentials!, + [_currentConfig!.getPrimaryToken().address], [calldata], ); final args = { - 'from': _wallet.account.hexEip55, + 'from': _currentAccount!.hexEip55, 'to': to, }; - if (_wallet.standard == 'erc1155') { - args['operator'] = _wallet.account.hexEip55; + if (_currentConfig!.getPrimaryToken().standard == 'erc1155') { + args['operator'] = _currentAccount!.hexEip55; args['id'] = '0'; args['amount'] = parsedAmount.toString(); } else { @@ -1336,12 +1404,13 @@ class WalletLogic extends WidgetsBindingObserver { } final eventData = createEventData( - stringSignature: _wallet.transferEventStringSignature, - topic: _wallet.transferEventSignature, + stringSignature: transferEventStringSignature(_currentConfig!), + topic: transferEventSignature(_currentConfig!), args: args, ); - final txHash = await _wallet.submitUserop( + final txHash = await submitUserop( + _currentConfig!, userop, data: eventData, extraData: message != '' ? TransferData(message) : null, @@ -1355,19 +1424,19 @@ class WalletLogic extends WidgetsBindingObserver { parsedAmount, tempId, to, - _wallet.account.hexEip55, + _currentAccount!.hexEip55, message: message, ); if (userop.isFirst()) { // an account was created, update push token in the background - _wallet.waitForTxSuccess(txHash).then((value) { + waitForTxSuccess(_currentConfig!, txHash).then((value) { if (!value) { return; } // the account exists, enable push notifications - _notificationsLogic.updatePushToken(); + _notificationsLogic.refreshPushToken(); }); } @@ -1384,7 +1453,7 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1398,7 +1467,7 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1412,7 +1481,7 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1437,7 +1506,7 @@ class WalletLogic extends WidgetsBindingObserver { final doubleAmount = amount.replaceAll(',', '.'); final parsedAmount = toUnit( doubleAmount, - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ); var tempId = id ?? '${pendingTransactionId}_${generateRandomId()}'; @@ -1459,13 +1528,17 @@ class WalletLogic extends WidgetsBindingObserver { ); // TODO: token id should be set - final calldata = _wallet.tokenMintCallData( + final calldata = tokenMintCallData( + _currentConfig!, to, parsedAmount, ); - final (_, userop) = await _wallet.prepareUserop( - [_wallet.tokenAddress], + final (_, userop) = await prepareUserop( + _currentConfig!, + _currentAccount!, + _currentCredentials!, + [_currentConfig!.getPrimaryToken().address], [calldata], ); @@ -1473,8 +1546,8 @@ class WalletLogic extends WidgetsBindingObserver { 'from': zeroAddress, 'to': to, }; - if (_wallet.standard == 'erc1155') { - args['operator'] = _wallet.account.hexEip55; + if (_currentConfig!.getPrimaryToken().standard == 'erc1155') { + args['operator'] = _currentAccount!.hexEip55; args['id'] = '0'; args['amount'] = parsedAmount.toString(); } else { @@ -1482,12 +1555,13 @@ class WalletLogic extends WidgetsBindingObserver { } final eventData = createEventData( - stringSignature: _wallet.transferEventStringSignature, - topic: _wallet.transferEventSignature, + stringSignature: transferEventStringSignature(_currentConfig!), + topic: transferEventSignature(_currentConfig!), args: args, ); - final txHash = await _wallet.submitUserop( + final txHash = await submitUserop( + _currentConfig!, userop, data: eventData, extraData: message != '' ? TransferData(message) : null, @@ -1507,13 +1581,13 @@ class WalletLogic extends WidgetsBindingObserver { if (userop.isFirst()) { // an account was created, update push token in the background - _wallet.waitForTxSuccess(txHash).then((value) { + waitForTxSuccess(_currentConfig!, txHash).then((value) { if (!value) { return; } // the account exists, enable push notifications - _notificationsLogic.updatePushToken(); + _notificationsLogic.refreshPushToken(); }); } @@ -1532,11 +1606,11 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( amount.toString(), - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ), id: tempId, hash: '', - chainId: _wallet.chainId, + chainId: _currentConfig!.chains.values.first.id, to: to, from: zeroAddress, description: message.isNotEmpty ? message : 'Failed to mint token', @@ -1589,7 +1663,7 @@ class WalletLogic extends WidgetsBindingObserver { void setMaxAmount() { _amountController.text = fromDoubleUnit( _state.wallet?.balance ?? '0.0', - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, ); updateAmount(); } @@ -1636,7 +1710,8 @@ class WalletLogic extends WidgetsBindingObserver { addressToUse = parsedData.address; } catch (_) { String username = parsedData.address; - ProfileV1? profile = await _wallet.getProfileByUsername(username); + ProfileV1? profile = + await getProfileByUsername(_currentConfig!, username); if (profile != null) { addressToUse = profile.account; } @@ -1676,11 +1751,12 @@ class WalletLogic extends WidgetsBindingObserver { try { updateListenerAmount(); - if (_wallet.alias == null) { + if (_currentConfig?.community.alias == null) { throw Exception('alias not found'); } - final community = await _appDBService.communities.get(_wallet.alias!); + final community = + await _appDBService.communities.get(_currentConfig!.community.alias!); if (community == null) { throw Exception('community not found'); @@ -1692,12 +1768,12 @@ class WalletLogic extends WidgetsBindingObserver { if (onlyHex != null && onlyHex) { _state.updateReceiveQR( - '$url?sendto=${_wallet.account.hexEip55}@${communityConfig.community.alias}'); + '$url?sendto=${_currentAccount!.hexEip55}@${communityConfig.community.alias}'); return; } String params = - 'sendto=${_wallet.account.hexEip55}@${communityConfig.community.alias}'; + 'sendto=${_currentAccount!.hexEip55}@${communityConfig.community.alias}'; if (_amountController.value.text.isNotEmpty) { final double amount = _amountController.value.text.isEmpty @@ -1732,7 +1808,7 @@ class WalletLogic extends WidgetsBindingObserver { void updateWalletQR() async { try { - _state.updateWalletQR(_wallet.account.hexEip55); + _state.updateWalletQR(_currentAccount!.hexEip55); return; } catch (_) {} @@ -1745,7 +1821,7 @@ class WalletLogic extends WidgetsBindingObserver { void copyWalletAccount() { try { - Clipboard.setData(ClipboardData(text: _wallet.account.hexEip55)); + Clipboard.setData(ClipboardData(text: _currentAccount!.hexEip55)); } catch (_) {} } @@ -1824,7 +1900,7 @@ class WalletLogic extends WidgetsBindingObserver { _amountController.text = double.parse('${toUnit( amount, - decimals: _wallet.currency.decimals, + decimals: _currentConfig!.getPrimaryToken().decimals, )}') .toStringAsFixed(2); @@ -1841,21 +1917,22 @@ class WalletLogic extends WidgetsBindingObserver { try { final now = DateTime.now().toUtc().add(const Duration(seconds: 30)); - final redirectUrl = '$appUniversalURL/?alias=${_wallet.alias}'; + final redirectUrl = + '$appUniversalURL/?alias=${_currentConfig!.community.alias}'; final encodedRedirectUrl = Uri.encodeComponent(redirectUrl); final parsedURL = Uri.parse(appUniversalURL); if (pluginConfig.signature) { return ( - '${pluginConfig.url}${pluginConfig.url.contains('?') ? '&' : '?'}${connection.queryParams}', + '${pluginConfig.url}${pluginConfig.url.contains('?') ? '&' : '?'}${connection!.queryParams}', parsedURL.scheme != 'https' ? parsedURL.scheme : null, redirectUrl, ); } return ( - '${pluginConfig.url}?account=${_wallet.account.hexEip55}&expiry=${now.millisecondsSinceEpoch}&redirectUrl=$encodedRedirectUrl&signature=0x123', + '${pluginConfig.url}?account=${_currentAccount!.hexEip55}&expiry=${now.millisecondsSinceEpoch}&redirectUrl=$encodedRedirectUrl&signature=0x123', parsedURL.scheme != 'https' ? parsedURL.scheme : null, redirectUrl, ); @@ -1897,7 +1974,7 @@ class WalletLogic extends WidgetsBindingObserver { } if (extraParams != null) { - plugin.updateUrl('${plugin.url}?$extraParams'); + // plugin.updateUrl('${plugin.url}?$extraParams'); } return plugin; @@ -1916,7 +1993,7 @@ class WalletLogic extends WidgetsBindingObserver { void cleanupWalletService() { try { - _wallet.dispose(); + // Cleanup any remaining resources } catch (_) {} transferEventUnsubscribe(); } @@ -1940,13 +2017,14 @@ class WalletLogic extends WidgetsBindingObserver { resumeFetching(); loadTransactions(); - if (_wallet.alias == null) { + if (_currentConfig?.community.alias == null) { return; } await updateBalance(); - final community = await _appDBService.communities.get(_wallet.alias!); + final community = await _appDBService.communities + .get(_currentConfig!.community.alias); if (community == null) { return; @@ -1993,10 +2071,10 @@ class WalletLogic extends WidgetsBindingObserver { )); try { - final isMinter = await _wallet.minter; - _state.setWalletMinter(isMinter); + final isMinterResult = await isMinter(_currentConfig!, _currentAccount!); + _state.setWalletMinter(isMinterResult); - if (isMinter) { + if (isMinterResult) { actionsToAdd.add(ActionButton( label: 'Minter', buttonType: ActionButtonType.minter, @@ -2005,7 +2083,7 @@ class WalletLogic extends WidgetsBindingObserver { } catch (_) {} try { - final alias = _wallet.alias ?? ""; + final alias = _currentConfig!.community.alias; final community = await _appDBService.communities.get(alias); if (community != null) { diff --git a/lib/widgets/webview/connected_webview_modal.dart b/lib/widgets/webview/connected_webview_modal.dart index 3169fe00..5b49ade7 100644 --- a/lib/widgets/webview/connected_webview_modal.dart +++ b/lib/widgets/webview/connected_webview_modal.dart @@ -130,7 +130,7 @@ class _WebViewModalState extends State { return; } - widget.profilesLogic.getProfile(parsedData.address); + widget.profilesLogic.getLocalProfile(parsedData.address); final dismiss = await showCupertinoModalBottomSheet( context: context, From e0239e33f3b8404564d7bfa4ec027573cc7e51c4 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Tue, 22 Jul 2025 19:05:16 +0530 Subject: [PATCH 03/46] v5 migration --- assets/config/v5/communities.json | 1940 +++++++++++++++++ assets/config/v5/communities.test.json | 1933 ++++++++++++++++ assets/config/v5/debug.json | 73 + lib/main.dart | 2 +- lib/screens/wallet/screen.dart | 7 + lib/services/accounts/accounts.dart | 4 +- lib/services/accounts/native/android.dart | 68 +- lib/services/accounts/native/apple.dart | 68 +- lib/services/accounts/web.dart | 2 +- lib/services/config/config.dart | 19 +- lib/services/config/service.dart | 20 +- lib/services/db/app/communities.dart | 42 + lib/services/db/app/db.dart | 2 +- lib/services/db/backup/accounts.dart | 29 +- lib/services/db/backup/db.dart | 2 +- .../wallet/contracts/account_factory.dart | 2 +- lib/services/wallet/wallet.dart | 10 +- lib/state/app/logic.dart | 6 + lib/state/communities/logic.dart | 88 +- lib/state/profile/logic.dart | 16 +- lib/state/profiles/logic.dart | 1 + lib/state/wallet/logic.dart | 14 + pubspec.yaml | 5 +- 23 files changed, 4286 insertions(+), 67 deletions(-) create mode 100644 assets/config/v5/communities.json create mode 100644 assets/config/v5/communities.test.json create mode 100644 assets/config/v5/debug.json diff --git a/assets/config/v5/communities.json b/assets/config/v5/communities.json new file mode 100644 index 00000000..03d80f4a --- /dev/null +++ b/assets/config/v5/communities.json @@ -0,0 +1,1940 @@ +[ + { + "community": { + "name": "Citizen Wallet (CTZN)", + "description": "The token powering the Citizen Wallet economy.", + "url": "https://citizenwallet.xyz", + "alias": "ctzn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "theme": { + "primary": "#9563D3" + }, + "profile": { + "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", + "chain_id": 137 + }, + "primary_token": { + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { + "standard": "erc20", + "name": "Citizen Wallet", + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "symbol": "CTZN", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://citizenwallet.xyz/pay-with-ctzn", + "launch_mode": "browser" + }, + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://my.citizenwallet.xyz/onramp", + "action": "topup", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/ctzn.json", + "version": 4 + }, + { + "community": { + "name": "Brussels Pay", + "description": "A community for the city of Brussels", + "url": "https://pay.brussels", + "alias": "wallet.pay.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "custom_domain": "wallet.pay.brussels", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", + "chain_id": 100 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 100 + } + }, + "tokens": { + "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "pay.brussels", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "EURb", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { + "chain_id": 100, + "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", + "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", + "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_type": "cw" + }, + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 100, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.pay.brussels", + "ws_url": "wss://engine.pay.brussels" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "url": "https://checkout.pay.brussels/topup", + "action": "topup", + "signature": true + } + ], + "config_location": "https://wallet.pay.brussels/config/community.json", + "version": 4 + }, + { + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token of gratitude.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gratitude", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "theme": { + "primary": "#4EC19D" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "42220:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 42220, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://gratitude.citizenwallet.xyz/config/community.json", + "version": 4 + }, + { + "community": { + "name": "SFLUV Community", + "description": "A community currency for the city of San Francisco.", + "url": "https://sfluv.org", + "alias": "wallet.sfluv.org", + "custom_domain": "wallet.sfluv.org", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "theme": { + "primary": "#eb6c6c" + }, + "profile": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 137 + }, + "primary_token": { + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "chain_id": 137 + } + }, + "tokens": { + "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { + "standard": "erc20", + "name": "SFLUV V1.1", + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "symbol": "SFLUV", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "paymaster_type": "cw" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "url": "https://app.sfluv.org", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", + "version": 4 + }, + { + "community": { + "name": "Txirrin", + "description": "A community for Txirrin", + "url": "https://citizenwallet.xyz/txirrin", + "alias": "txirrin", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", + "hidden": false, + "theme": { + "primary": "#FB7502" + }, + "profile": { + "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", + "chain_id": 100 + }, + "primary_token": { + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + } + }, + "tokens": { + "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { + "standard": "erc20", + "name": "Txirrin", + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "symbol": "TXI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/txirrin.json", + "version": 4 + }, + { + "community": { + "name": "Bolivia Pay", + "description": "A community for Ethereum Bolivia.", + "url": "https://www.ethereumbolivia.org", + "alias": "boliviapay", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", + "theme": { + "primary": "#009393" + }, + "profile": { + "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", + "chain_id": 137 + }, + "primary_token": { + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "standard": "erc20", + "name": "(PoS) Tether USD", + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "symbol": "USDT", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/boliviapay.json", + "version": 4 + }, + { + "community": { + "name": "Breadchain Community Token", + "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", + "url": "https://breadchain.xyz/", + "alias": "bread", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "profile": { + "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", + "chain_id": 100 + }, + "primary_token": { + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "chain_id": 100 + } + }, + "tokens": { + "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { + "standard": "erc20", + "name": "Breadchain Community Token", + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "symbol": "BREAD", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { + "chain_id": 100, + "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", + "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_type": "cw" + }, + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://marketplace.citizenwallet.xyz/bread", + "launch_mode": "webview", + "signature": true + }, + { + "name": "Breadcon 2025 Faucet", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://faucet.citizenwallet.xyz/breadcon2025", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/bread.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Commons Hub Brussels", + "description": "Community Token for the Commons Hub Brussels community", + "url": "https://commonshub.brussels", + "alias": "wallet.commonshub.brussels", + "custom_domain": "wallet.commonshub.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", + "theme": { + "primary": "#ff4c02" + }, + "profile": { + "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { + "standard": "erc20", + "name": "Commons Hub Token", + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "symbol": "CHT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "cards": { + "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { + "chain_id": 42220, + "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", + "type": "classic" + } + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.commonshub.brussels.json", + "version": 4 + }, + { + "community": { + "name": "Sel de Salm", + "description": "La communauté de Sel de Salm", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "alias": "seldesalm", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "theme": { + "primary": "#6B5CA4" + }, + "profile": { + "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { + "standard": "erc20", + "name": "Myrtille", + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "symbol": "MYRT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "cards": { + "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 42220, + "instance_id": "cw-seldesalm", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Informations Générales", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "launch_mode": "webview" + }, + { + "name": "Échanges", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://marketplace.citizenwallet.xyz/seldesalm", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://seldesalm.citizenwallet.xyz/config/community.json", + "version": 4 + }, + { + "community": { + "name": "TECHI", + "description": "A community for TECHI users", + "url": "https://my.techi.be", + "alias": "my.techi.be", + "logo": "https://my.techi.be/assets/token.svg", + "hidden": false, + "theme": { + "primary": "#617FF8" + }, + "profile": { + "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", + "chain_id": 100 + }, + "primary_token": { + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 100 + } + }, + "tokens": { + "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { + "standard": "erc20", + "name": "TECHI", + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "symbol": "TECHI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.my.techi.be", + "ws_url": "wss://engine.my.techi.be" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.techi.be/assets/community.json", + "version": 4 + }, + { + "community": { + "name": "Regens Unite", + "description": "A community currency for the Regens Unite community.", + "url": "https://www.regensunite.earth/", + "alias": "wallet.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "custom_domain": "wallet.regensunite.earth", + "hidden": true, + "profile": { + "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "chain_id": 137 + } + }, + "tokens": { + "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "Regens Unite Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "RGN", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 137, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg", + "gas_extra_percentage": 50 + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.regensunite.earth.json", + "version": 4 + }, + { + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gt.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "custom_domain": null, + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/gt.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Celo Euro", + "description": "Celo Euro is a stablecoin for the Celo Community.", + "url": "https://celo.org/", + "alias": "ceur.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { + "standard": "erc20", + "name": "Celo Euro", + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "symbol": "cEUR", + "decimals": 18, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/ceur.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "EUR e-money", + "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", + "url": "https://monerium.com/tokens/", + "alias": "eure.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", + "hidden": true, + "profile": { + "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "chain_id": 137 + } + }, + "tokens": { + "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { + "standard": "erc20", + "name": "EUR emoney", + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "symbol": "EURe", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { + "chain_id": 137, + "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/eure.polygon.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "USDC on Polygon", + "description": "The community of people using USDC on Polygon.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "app", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "chain_id": 137 + }, + "primary_token": { + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "chain_id": 137 + } + }, + "tokens": { + "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "symbol": "USDC", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { + "chain_id": 137, + "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/app.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "USDC on Base", + "description": "The community of people using USDC on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "usdc.base", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "symbol": "USDC", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { + "chain_id": 8453, + "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/usdc.base.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "OAK Community", + "description": "A community currency for the city of Oakland.", + "url": "https://www.oak.community/", + "alias": "wallet.oak.community", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", + "custom_domain": "wallet.oak.community", + "hidden": true, + "profile": { + "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { + "standard": "erc20", + "name": "OAK Community Currency", + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "symbol": "OAK", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 8453, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x123", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.oak.community.json", + "version": 4 + }, + { + "community": { + "name": "Stable Coin", + "description": "SBC is a digital dollar stablecoin issued by Brale", + "url": "https://brale.xyz/", + "alias": "sbc.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", + "hidden": true, + "profile": { + "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "chain_id": 137 + }, + "primary_token": { + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "chain_id": 137 + } + }, + "tokens": { + "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { + "standard": "erc20", + "name": "Stable Coin", + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "symbol": "SBC", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { + "chain_id": 137, + "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", + "paymaster_address": "0x123", + "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "paymaster_type": "cw" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/sbc.polygon.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Zinne.brussels", + "description": "A community currency for the city of Brussels", + "url": "https://zinne.brussels", + "alias": "zinne", + "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", + "hidden": true, + "profile": { + "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", + "chain_id": 137 + }, + "primary_token": { + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "chain_id": 137 + } + }, + "tokens": { + "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { + "standard": "erc20", + "name": "Zinne.brussels Token", + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "symbol": "ZINNE", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { + "chain_id": 137, + "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "paymaster_type": "cw" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/zinne.brussels.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Regens Unite Time Bank", + "description": "Make time to regen", + "url": "https://regensunite.earth", + "alias": "timebank.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "hidden": true, + "profile": { + "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x186DaBD027e228C988777907465807FDab270894", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x39b77d77f7677997871b304094a05295eb71e240", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x186DaBD027e228C988777907465807FDab270894": { + "standard": "erc20", + "name": "Regen Hour", + "address": "0x186DaBD027e228C988777907465807FDab270894", + "symbol": "rHour", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x39b77d77f7677997871b304094a05295eb71e240": { + "chain_id": 42220, + "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://timebank.regensunite.earth/indexer", + "version": 4 + }, + { + "community": { + "name": "MOOS Token", + "description": "A community currency for MOOS.", + "url": "https://www.moos.garden/", + "alias": "moos", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", + "hidden": true, + "profile": { + "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { + "standard": "erc20", + "name": "MOOS Token", + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "symbol": "MOOS", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { + "chain_id": 42220, + "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", + "url": "https://marketplace.citizenwallet.xyz/moos", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/moos.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Bonne Heure", + "description": "Système d'Échange Local de Villers-la-Ville", + "url": "https://selcoupdepouce.be", + "alias": "selcoupdepouce", + "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", + "hidden": true, + "profile": { + "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { + "standard": "erc20", + "name": "Bonne Heure", + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "symbol": "BHR", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { + "chain_id": 42220, + "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", + "launch_mode": "browser", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/selcoupdepouce.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "CI token", + "description": "Monnaie locale du Cercle Informatique de l’ULB", + "url": "https://citizenwallet.xyz/cit", + "alias": "cit.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", + "hidden": true, + "profile": { + "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { + "standard": "erc20", + "name": "CI token", + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "symbol": "CIT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { + "chain_id": 42220, + "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/cit.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Wolugo", + "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", + "url": "https://wolugo.be", + "alias": "wallet.wolugo.be", + "custom_domain": "wallet.wolugo.be", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", + "theme": { + "primary": "#81e2c1" + }, + "hidden": true, + "profile": { + "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "chain_id": 42220 + }, + "card_factory": { + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { + "standard": "erc20", + "name": "Wolu", + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "symbol": "WOLU", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { + "chain_id": 42220, + "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "paymaster_type": "cw" + } + }, + "cards": { + "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { + "chain_id": 42220, + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.wolugo.be.json", + "version": 4 + }, + { + "community": { + "name": "Woluwe Test", + "description": "Local currency for the Woluwe Test community.", + "url": "https://wollet-v2.citizenwallet.net/token", + "alias": "wtc.celo", + "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", + "hidden": true, + "profile": { + "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xE79E19594A749330036280c685E2719d58d99052", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { + "standard": "erc20", + "name": "Woluwe Test Coin", + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "symbol": "WTC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xE79E19594A749330036280c685E2719d58d99052": { + "chain_id": 42220, + "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/wtc.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "ETHGlobal London Token", + "description": "The community of people using ETHLDN on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "testnet-ethldn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", + "hidden": true, + "profile": { + "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", + "chain_id": 84532 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 84532 + }, + "primary_account_factory": { + "address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "chain_id": 84532 + } + }, + "tokens": { + "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "ETHGlobal London Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "ETHLDN", + "decimals": 6, + "chain_id": 84532 + } + }, + "scan": { + "url": "https://sepolia.basescan.org", + "name": "Base Sepolia Explorer" + }, + "accounts": { + "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { + "chain_id": 84532, + "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "paymaster_type": "cw" + } + }, + "chains": { + "84532": { + "id": 84532, + "node": { + "url": "https://84532.engine.citizenwallet.xyz", + "ws_url": "wss://84532.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/testnet-ethldn.json", + "version": 4 + }, + { + "community": { + "name": "Celo Community Point", + "description": "This is a community for the Celo Point", + "url": "https://citizenwallet.xyz", + "alias": "celo-c.citizenwallet.xyz", + "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", + "hidden": true, + "profile": { + "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { + "standard": "erc20", + "name": "Celo Community Point", + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "symbol": "CeloC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { + "chain_id": 42220, + "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/celo-c.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "KFMEDIA℠", + "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", + "url": "https://kingfishersmedia.io", + "alias": "wallet.kingfishersmedia.io", + "custom_domain": "wallet.kingfishersmedia.io", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", + "theme": { + "primary": "#88292c" + }, + "profile": { + "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { + "standard": "erc1155", + "name": "KFMEDIA℠ Pathways for LATAM™", + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "symbol": "KFMPFL", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.kingfishersmedia.io.json", + "version": 4 + } +] \ No newline at end of file diff --git a/assets/config/v5/communities.test.json b/assets/config/v5/communities.test.json new file mode 100644 index 00000000..85557855 --- /dev/null +++ b/assets/config/v5/communities.test.json @@ -0,0 +1,1933 @@ +[ + { + "community": { + "name": "Citizen Wallet (CTZN)", + "description": "The token powering the Citizen Wallet economy.", + "url": "https://citizenwallet.xyz", + "alias": "ctzn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "theme": { + "primary": "#9563D3" + }, + "profile": { + "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", + "chain_id": 137 + }, + "primary_token": { + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { + "standard": "erc20", + "name": "Citizen Wallet", + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "symbol": "CTZN", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://citizenwallet.xyz/pay-with-ctzn", + "launch_mode": "browser" + }, + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://my.citizenwallet.xyz/onramp", + "action": "topup", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/ctzn.json", + "version": 4 + }, + { + "community": { + "name": "Brussels Pay", + "description": "A community for the city of Brussels", + "url": "https://pay.brussels", + "alias": "wallet.pay.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "custom_domain": "wallet.pay.brussels", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", + "chain_id": 100 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 100 + } + }, + "tokens": { + "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "pay.brussels", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "EURb", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { + "chain_id": 100, + "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", + "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", + "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_type": "cw" + }, + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 100, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.pay.brussels", + "ws_url": "wss://engine.pay.brussels" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "url": "https://checkout.pay.brussels/topup", + "action": "topup", + "signature": true + } + ], + "config_location": "https://wallet.pay.brussels/config/community.json", + "version": 4 + }, + { + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token of gratitude.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gratitude", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "theme": { + "primary": "#4EC19D" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "42220:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 42220, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://gratitude.citizenwallet.xyz/config/community.json", + "version": 4 + }, + { + "community": { + "name": "SFLUV Community", + "description": "A community currency for the city of San Francisco.", + "url": "https://sfluv.org", + "alias": "wallet.sfluv.org", + "custom_domain": "wallet.sfluv.org", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "theme": { + "primary": "#eb6c6c" + }, + "profile": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 137 + }, + "primary_token": { + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "chain_id": 137 + } + }, + "tokens": { + "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { + "standard": "erc20", + "name": "SFLUV V1.1", + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "symbol": "SFLUV", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://wallet.sfluv.org/uploads/logo.svg", + "url": "https://app.sfluv.org", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", + "version": 4 + }, + { + "community": { + "name": "Txirrin", + "description": "A community for Txirrin", + "url": "https://citizenwallet.xyz/txirrin", + "alias": "txirrin", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", + "hidden": false, + "theme": { + "primary": "#FB7502" + }, + "profile": { + "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", + "chain_id": 100 + }, + "primary_token": { + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + } + }, + "tokens": { + "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { + "standard": "erc20", + "name": "Txirrin", + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "symbol": "TXI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/txirrin.json", + "version": 4 + }, + { + "community": { + "name": "Bolivia Pay", + "description": "A community for Ethereum Bolivia.", + "url": "https://www.ethereumbolivia.org", + "alias": "boliviapay", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", + "theme": { + "primary": "#009393" + }, + "profile": { + "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", + "chain_id": 137 + }, + "primary_token": { + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "standard": "erc20", + "name": "(PoS) Tether USD", + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "symbol": "USDT", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/boliviapay.json", + "version": 4 + }, + { + "community": { + "name": "Breadchain Community Token", + "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", + "url": "https://breadchain.xyz/", + "alias": "bread", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "profile": { + "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", + "chain_id": 100 + }, + "primary_token": { + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "chain_id": 100 + } + }, + "tokens": { + "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { + "standard": "erc20", + "name": "Breadchain Community Token", + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "symbol": "BREAD", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { + "chain_id": 100, + "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", + "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_type": "cw" + }, + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://marketplace.citizenwallet.xyz/bread", + "launch_mode": "webview", + "signature": true + }, + { + "name": "Breadcon 2025 Faucet", + "icon": "https://bread.citizenwallet.xyz/uploads/logo.svg", + "url": "https://faucet.citizenwallet.xyz/breadcon2025", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/bread.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Commons Hub Brussels", + "description": "Community Token for the Commons Hub Brussels community", + "url": "https://commonshub.brussels", + "alias": "wallet.commonshub.brussels", + "custom_domain": "wallet.commonshub.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", + "theme": { + "primary": "#ff4c02" + }, + "profile": { + "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { + "standard": "erc20", + "name": "Commons Hub Token", + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "symbol": "CHT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "cards": { + "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { + "chain_id": 42220, + "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", + "type": "classic" + } + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.commonshub.brussels.json", + "version": 4 + }, + { + "community": { + "name": "Sel de Salm", + "description": "La communauté de Sel de Salm", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "alias": "seldesalm", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "theme": { + "primary": "#6B5CA4" + }, + "profile": { + "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { + "standard": "erc20", + "name": "Myrtille", + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "symbol": "MYRT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "cards": { + "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 42220, + "instance_id": "cw-seldesalm", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Informations Générales", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "launch_mode": "webview" + }, + { + "name": "Échanges", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://marketplace.citizenwallet.xyz/seldesalm", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://seldesalm.citizenwallet.xyz/config/community.json", + "version": 4 + }, + { + "community": { + "name": "TECHI", + "description": "A community for TECHI users", + "url": "https://my.techi.be", + "alias": "my.techi.be", + "logo": "https://my.techi.be/assets/token.svg", + "hidden": false, + "theme": { + "primary": "#617FF8" + }, + "profile": { + "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", + "chain_id": 100 + }, + "primary_token": { + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 100 + } + }, + "tokens": { + "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { + "standard": "erc20", + "name": "TECHI", + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "symbol": "TECHI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.my.techi.be", + "ws_url": "wss://engine.my.techi.be" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.techi.be/assets/community.json", + "version": 4 + }, + { + "community": { + "name": "Regens Unite", + "description": "A community currency for the Regens Unite community.", + "url": "https://www.regensunite.earth/", + "alias": "wallet.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "custom_domain": "wallet.regensunite.earth", + "hidden": true, + "profile": { + "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "chain_id": 137 + } + }, + "tokens": { + "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "Regens Unite Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "RGN", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 137, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg", + "gas_extra_percentage": 50 + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.regensunite.earth.json", + "version": 4 + }, + { + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gt.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "custom_domain": null, + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/gt.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Celo Euro", + "description": "Celo Euro is a stablecoin for the Celo Community.", + "url": "https://celo.org/", + "alias": "ceur.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { + "standard": "erc20", + "name": "Celo Euro", + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "symbol": "cEUR", + "decimals": 18, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/ceur.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "EUR e-money", + "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", + "url": "https://monerium.com/tokens/", + "alias": "eure.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", + "hidden": true, + "profile": { + "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "chain_id": 137 + } + }, + "tokens": { + "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { + "standard": "erc20", + "name": "EUR emoney", + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "symbol": "EURe", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { + "chain_id": 137, + "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/eure.polygon.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "USDC on Polygon", + "description": "The community of people using USDC on Polygon.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "app", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "chain_id": 137 + }, + "primary_token": { + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "chain_id": 137 + } + }, + "tokens": { + "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "symbol": "USDC", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { + "chain_id": 137, + "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/app.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "USDC on Base", + "description": "The community of people using USDC on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "usdc.base", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "symbol": "USDC", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { + "chain_id": 8453, + "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/usdc.base.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "OAK Community", + "description": "A community currency for the city of Oakland.", + "url": "https://www.oak.community/", + "alias": "wallet.oak.community", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", + "custom_domain": "wallet.oak.community", + "hidden": true, + "profile": { + "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { + "standard": "erc20", + "name": "OAK Community Currency", + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "symbol": "OAK", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 8453, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x123", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.oak.community.json", + "version": 4 + }, + { + "community": { + "name": "Stable Coin", + "description": "SBC is a digital dollar stablecoin issued by Brale", + "url": "https://brale.xyz/", + "alias": "sbc.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", + "hidden": true, + "profile": { + "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "chain_id": 137 + }, + "primary_token": { + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "chain_id": 137 + } + }, + "tokens": { + "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { + "standard": "erc20", + "name": "Stable Coin", + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "symbol": "SBC", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { + "chain_id": 137, + "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", + "paymaster_address": "0x123", + "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "paymaster_type": "cw" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/sbc.polygon.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Zinne.brussels", + "description": "A community currency for the city of Brussels", + "url": "https://zinne.brussels", + "alias": "zinne", + "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", + "hidden": true, + "profile": { + "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", + "chain_id": 137 + }, + "primary_token": { + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "chain_id": 137 + } + }, + "tokens": { + "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { + "standard": "erc20", + "name": "Zinne.brussels Token", + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "symbol": "ZINNE", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { + "chain_id": 137, + "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "paymaster_type": "cw" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/zinne.brussels.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Regens Unite Time Bank", + "description": "Make time to regen", + "url": "https://regensunite.earth", + "alias": "timebank.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "hidden": true, + "profile": { + "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x186DaBD027e228C988777907465807FDab270894", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x39b77d77f7677997871b304094a05295eb71e240", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x186DaBD027e228C988777907465807FDab270894": { + "standard": "erc20", + "name": "Regen Hour", + "address": "0x186DaBD027e228C988777907465807FDab270894", + "symbol": "rHour", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x39b77d77f7677997871b304094a05295eb71e240": { + "chain_id": 42220, + "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://timebank.regensunite.earth/uploads/logo.svg", + "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://timebank.regensunite.earth/indexer", + "version": 4 + }, + { + "community": { + "name": "MOOS Token", + "description": "A community currency for MOOS.", + "url": "https://www.moos.garden/", + "alias": "moos", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", + "hidden": true, + "profile": { + "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { + "standard": "erc20", + "name": "MOOS Token", + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "symbol": "MOOS", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { + "chain_id": 42220, + "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", + "url": "https://marketplace.citizenwallet.xyz/moos", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/moos.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Bonne Heure", + "description": "Système d'Échange Local de Villers-la-Ville", + "url": "https://selcoupdepouce.be", + "alias": "selcoupdepouce", + "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", + "hidden": true, + "profile": { + "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { + "standard": "erc20", + "name": "Bonne Heure", + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "symbol": "BHR", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { + "chain_id": 42220, + "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", + "launch_mode": "browser", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/selcoupdepouce.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "CI token", + "description": "Monnaie locale du Cercle Informatique de l’ULB", + "url": "https://citizenwallet.xyz/cit", + "alias": "cit.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", + "hidden": true, + "profile": { + "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { + "standard": "erc20", + "name": "CI token", + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "symbol": "CIT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { + "chain_id": 42220, + "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/cit.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Wolugo", + "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", + "url": "https://wolugo.be", + "alias": "wallet.wolugo.be", + "custom_domain": "wallet.wolugo.be", + "logo": "https://wallet.wolugo.be/uploads/logo.svg", + "theme": { + "primary": "#81e2c1" + }, + "hidden": true, + "profile": { + "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "chain_id": 42220 + }, + "card_factory": { + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { + "standard": "erc20", + "name": "Wolu", + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "symbol": "WOLU", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { + "chain_id": 42220, + "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "paymaster_type": "cw" + } + }, + "cards": { + "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { + "chain_id": 42220, + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.wolugo.be.json", + "version": 4 + }, + { + "community": { + "name": "Woluwe Test", + "description": "Local currency for the Woluwe Test community.", + "url": "https://wollet-v2.citizenwallet.net/token", + "alias": "wtc.celo", + "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", + "hidden": true, + "profile": { + "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xE79E19594A749330036280c685E2719d58d99052", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { + "standard": "erc20", + "name": "Woluwe Test Coin", + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "symbol": "WTC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xE79E19594A749330036280c685E2719d58d99052": { + "chain_id": 42220, + "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/wtc.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "ETHGlobal London Token", + "description": "The community of people using ETHLDN on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "testnet-ethldn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", + "hidden": true, + "profile": { + "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", + "chain_id": 84532 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 84532 + }, + "primary_account_factory": { + "address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "chain_id": 84532 + } + }, + "tokens": { + "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "ETHGlobal London Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "ETHLDN", + "decimals": 6, + "chain_id": 84532 + } + }, + "scan": { + "url": "https://sepolia.basescan.org", + "name": "Base Sepolia Explorer" + }, + "accounts": { + "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { + "chain_id": 84532, + "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "paymaster_type": "cw" + } + }, + "chains": { + "84532": { + "id": 84532, + "node": { + "url": "https://84532.engine.citizenwallet.xyz", + "ws_url": "wss://84532.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/testnet-ethldn.json", + "version": 4 + }, + { + "community": { + "name": "Celo Community Point", + "description": "This is a community for the Celo Point", + "url": "https://citizenwallet.xyz", + "alias": "celo-c.citizenwallet.xyz", + "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", + "hidden": true, + "profile": { + "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { + "standard": "erc20", + "name": "Celo Community Point", + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "symbol": "CeloC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { + "chain_id": 42220, + "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/celo-c.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "KFMEDIA℠", + "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", + "url": "https://kingfishersmedia.io", + "alias": "wallet.kingfishersmedia.io", + "custom_domain": "wallet.kingfishersmedia.io", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", + "theme": { + "primary": "#88292c" + }, + "profile": { + "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { + "standard": "erc1155", + "name": "KFMEDIA℠ Pathways for LATAM™", + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "symbol": "KFMPFL", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.kingfishersmedia.io.json", + "version": 4 + } +] \ No newline at end of file diff --git a/assets/config/v5/debug.json b/assets/config/v5/debug.json new file mode 100644 index 00000000..4692a2c0 --- /dev/null +++ b/assets/config/v5/debug.json @@ -0,0 +1,73 @@ +{ + "community": { + "name": "KFMEDIA℠", + "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", + "url": "https://kingfishersmedia.io", + "alias": "wallet.kingfishersmedia.io", + "custom_domain": "wallet.kingfishersmedia.io", + "logo": "https://config.internal.citizenwallet.xyz/_images/kfmpfl.png", + "theme": { + "primary": "#88292c" + }, + "profile": { + "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { + "standard": "erc1155", + "name": "KFMEDIA℠ Pathways for LATAM™", + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "symbol": "KFMPFL", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.kingfishersmedia.io.json", + "version": 4 +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index f40375a6..41741671 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -76,7 +76,7 @@ FutureOr appRunner() async { } final AppDBService appDBService = AppDBService(); - await appDBService.init('appv4'); + await appDBService.init('appv5'); final numConfigs = (await appDBService.communities.getAll()).length; config.singleCommunityMode = numConfigs < 2; diff --git a/lib/screens/wallet/screen.dart b/lib/screens/wallet/screen.dart index 7e695fcc..e538d4ba 100644 --- a/lib/screens/wallet/screen.dart +++ b/lib/screens/wallet/screen.dart @@ -9,6 +9,7 @@ import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/engine/events.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; import 'package:citizenwallet/state/app/logic.dart'; +import 'package:citizenwallet/state/communities/logic.dart'; import 'package:citizenwallet/state/notifications/logic.dart'; import 'package:citizenwallet/state/notifications/state.dart'; import 'package:citizenwallet/state/profile/logic.dart'; @@ -74,6 +75,7 @@ class WalletScreenState extends State late ProfileLogic _profileLogic; late ProfilesLogic _profilesLogic; late VoucherLogic _voucherLogic; + late CommunitiesLogic _communitiesLogic; final WalletKitLogic _walletKitLogic = WalletKitLogic(); String? _address; @@ -105,6 +107,7 @@ class WalletScreenState extends State _profileLogic = ProfileLogic(context); _profilesLogic = ProfilesLogic(context); _voucherLogic = VoucherLogic(context); + _communitiesLogic = CommunitiesLogic(context); WidgetsBinding.instance.addObserver(_profilesLogic); WidgetsBinding.instance.addObserver(_voucherLogic); @@ -210,6 +213,10 @@ class WalletScreenState extends State _notificationsLogic.init(); + if (_alias != null) { + await _communitiesLogic.fetchAndUpdateSingleCommunity(_alias!); + } + if (_voucher != null && _voucherParams != null) { await handleLoadFromVoucher(); } diff --git a/lib/services/accounts/accounts.dart b/lib/services/accounts/accounts.dart index 3edeaf64..bb5422c7 100644 --- a/lib/services/accounts/accounts.dart +++ b/lib/services/accounts/accounts.dart @@ -14,7 +14,7 @@ abstract class AccountsOptionsInterface {} /// /// This is used to store wallet backups and the implementation is platform specific. abstract class AccountsServiceInterface { - final int _version = 4; + final int _version = 5; int get version => _version; @@ -37,7 +37,7 @@ abstract class AccountsServiceInterface { Future setAccount(DBAccount account); // get account - Future getAccount(String address, String alias); + Future getAccount(String address, String alias, [String? accountFactoryAddress]); // get accounts for alias Future> getAccountsForAlias(String alias); diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index 83a074a1..5587c1b4 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -3,6 +3,8 @@ import 'package:citizenwallet/services/db/backup/db.dart'; import 'package:citizenwallet/utils/encrypt.dart'; import 'package:citizenwallet/services/accounts/options.dart'; import 'package:citizenwallet/services/db/backup/accounts.dart'; +import 'package:citizenwallet/services/db/app/db.dart'; +import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/accounts/backup.dart'; import 'package:citizenwallet/services/accounts/accounts.dart'; @@ -90,6 +92,67 @@ class AndroidAccountsService extends AccountsServiceInterface { } } }, + 5: () async { + final allAccounts = await _accountsDB.accounts.all(); + + for (final account in allAccounts) { + if (account.accountFactoryAddress != null) { + continue; + } + + final community = await AppDBService().communities.get(account.alias); + if (community == null) { + continue; + } + + final config = Config.fromJson(community.config); + String accountFactoryAddress = config.community.primaryAccountFactory.address; + + switch (account.alias) { + case 'gratitude': + accountFactoryAddress = '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD'; + break; + case 'bread': + accountFactoryAddress = '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9'; + break; + case 'wallet.commonshub.brussels': + accountFactoryAddress = '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87'; + break; + case 'wallet.sfluv.org': + accountFactoryAddress = '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; + break; + default: + if (accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + accountFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + } + break; + } + + // Create new account with factory address + final newAccount = DBAccount( + alias: account.alias, + address: account.address, + name: account.name, + username: account.username, + accountFactoryAddress: accountFactoryAddress, + privateKey: account.privateKey, + profile: account.profile, + ); + + // Delete old account and insert new one + await _accountsDB.accounts.delete(account.address, account.alias, account.accountFactoryAddress); + await _accountsDB.accounts.insert(newAccount); + + final oldKey = getAccountID(account.address, account.alias, account.accountFactoryAddress); + final newKey = getAccountID(account.address, account.alias, accountFactoryAddress); + + final privateKey = await _credentials.read(oldKey); + if (privateKey != null) { + await _credentials.write(newKey, privateKey); + await _credentials.delete(oldKey); + } + } + }, }; // run all migrations @@ -143,10 +206,11 @@ class AndroidAccountsService extends AccountsServiceInterface { // get wallet backup @override - Future getAccount(String address, String alias) async { + Future getAccount(String address, String alias, [String? accountFactoryAddress]) async { final account = await _accountsDB.accounts.get( EthereumAddress.fromHex(address), alias, + accountFactoryAddress, ); if (account == null) { @@ -175,12 +239,14 @@ class AndroidAccountsService extends AccountsServiceInterface { await _accountsDB.accounts.delete( EthereumAddress.fromHex(address), alias, + null, ); await _credentials.delete( getAccountID( EthereumAddress.fromHex(address), alias, + null, ), ); } diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index 849f9f1f..943c220b 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -6,6 +6,8 @@ import 'package:citizenwallet/services/credentials/credentials.dart'; import 'package:citizenwallet/services/credentials/native/apple.dart'; import 'package:citizenwallet/services/db/backup/accounts.dart'; import 'package:citizenwallet/services/db/backup/db.dart'; +import 'package:citizenwallet/services/db/app/db.dart'; +import 'package:citizenwallet/services/config/config.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:web3dart/credentials.dart'; import 'package:web3dart/crypto.dart'; @@ -203,6 +205,67 @@ class AppleAccountsService extends AccountsServiceInterface { } } }, + 5: () async { + final allAccounts = await _accountsDB.accounts.all(); + + for (final account in allAccounts) { + if (account.accountFactoryAddress != null) { + continue; + } + + final community = await AppDBService().communities.get(account.alias); + if (community == null) { + continue; + } + + final config = Config.fromJson(community.config); + String accountFactoryAddress = config.community.primaryAccountFactory.address; + + switch (account.alias) { + case 'gratitude': + accountFactoryAddress = '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD'; + break; + case 'bread': + accountFactoryAddress = '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9'; + break; + case 'wallet.commonshub.brussels': + accountFactoryAddress = '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87'; + break; + case 'wallet.sfluv.org': + accountFactoryAddress = '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; + break; + default: + if (accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + accountFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + } + break; + } + + // Create new account with factory address + final newAccount = DBAccount( + alias: account.alias, + address: account.address, + name: account.name, + username: account.username, + accountFactoryAddress: accountFactoryAddress, + privateKey: account.privateKey, + profile: account.profile, + ); + + // Delete old account and insert new one + await _accountsDB.accounts.delete(account.address, account.alias, account.accountFactoryAddress); + await _accountsDB.accounts.insert(newAccount); + + final oldKey = getAccountID(account.address, account.alias, account.accountFactoryAddress); + final newKey = getAccountID(account.address, account.alias, accountFactoryAddress); + + final privateKey = await _credentials.read(oldKey); + if (privateKey != null) { + await _credentials.write(newKey, privateKey); + await _credentials.delete(oldKey); + } + } + }, }; // run all migrations @@ -256,10 +319,11 @@ class AppleAccountsService extends AccountsServiceInterface { // get wallet backup @override - Future getAccount(String address, String alias) async { + Future getAccount(String address, String alias, [String? accountFactoryAddress]) async { final account = await _accountsDB.accounts.get( EthereumAddress.fromHex(address), alias, + accountFactoryAddress, ); if (account == null) { @@ -288,12 +352,14 @@ class AppleAccountsService extends AccountsServiceInterface { await _accountsDB.accounts.delete( EthereumAddress.fromHex(address), alias, + null, ); await _credentials.delete( getAccountID( EthereumAddress.fromHex(address), alias, + null, ), ); } diff --git a/lib/services/accounts/web.dart b/lib/services/accounts/web.dart index 4b31f568..8aa6d983 100644 --- a/lib/services/accounts/web.dart +++ b/lib/services/accounts/web.dart @@ -42,7 +42,7 @@ class WebAccountsService extends AccountsServiceInterface { // get wallet backup @override - Future getAccount(String address, String alias) async { + Future getAccount(String address, String alias, [String? accountFactoryAddress]) async { return null; } diff --git a/lib/services/config/config.dart b/lib/services/config/config.dart index a31a9ca8..42fc121b 100644 --- a/lib/services/config/config.dart +++ b/lib/services/config/config.dart @@ -722,6 +722,17 @@ class Config { return primaryAccountAbstraction; } + ERC4337Config getAccountAbstractionConfig(String accountFactoryAddress, [int? chainId]) { + final targetChainId = chainId ?? community.primaryAccountFactory.chainId; + final accountAbstraction = accounts['$targetChainId:$accountFactoryAddress']; + + if (accountAbstraction == null) { + throw Exception('Account Abstraction Config not found for factory: $accountFactoryAddress on chain: $targetChainId'); + } + + return accountAbstraction; + } + CardsConfig? getPrimaryCardManager() { return cards?[community.primaryCardManager?.fullAddress]; } @@ -736,13 +747,17 @@ class Config { return chain.node.url; } - String getRpcUrl(String chainId) { + String getRpcUrl(String chainId, [String? accountFactory]) { final chain = chains[chainId]; if (chain == null) { throw Exception('Chain not found'); } - return '${chain.node.url}/v1/rpc/${getPrimaryAccountAbstractionConfig().paymasterAddress}'; + final accountAbstractionConfig = accountFactory != null + ? getAccountAbstractionConfig(accountFactory, int.parse(chainId)) + : getPrimaryAccountAbstractionConfig(); + + return '${chain.node.url}/v1/rpc/${accountAbstractionConfig.paymasterAddress}'; } } diff --git a/lib/services/config/service.dart b/lib/services/config/service.dart index 89b998ec..2acce0ce 100644 --- a/lib/services/config/service.dart +++ b/lib/services/config/service.dart @@ -30,7 +30,7 @@ class ConfigService { static const String communityConfigListS3FileName = 'communities'; static const String communityDebugFileName = 'debug'; - static const int version = 4; + static const int version = 5; final PreferencesService _pref = PreferencesService(); late APIService _api; @@ -189,12 +189,28 @@ class ConfigService { return config; } catch (e, s) { debugPrint('Error fetching remote config: $e'); - debugPrint('Stacktrace: $s'); + debugPrintStack(stackTrace: s); return null; } } + Future getSingleCommunityConfig(String configLocation) async { + if (kDebugMode) { + return null; + } + + try { + final response = await _api.get(url: configLocation); + final config = Config.fromJson(response); + return config; + } catch (e, s) { + debugPrint('Error fetching single community config: $e'); + debugPrintStack(stackTrace: s); + return null; + } + } + Future> getCommunitiesFromRemote() async { if (kDebugMode) { final localConfigs = jsonDecode(await rootBundle.loadString( diff --git a/lib/services/db/app/communities.dart b/lib/services/db/app/communities.dart index 46eefac1..1d02fa3e 100644 --- a/lib/services/db/app/communities.dart +++ b/lib/services/db/app/communities.dart @@ -5,6 +5,7 @@ import 'package:citizenwallet/services/config/service.dart'; import 'package:citizenwallet/services/db/db.dart'; import 'package:flutter/foundation.dart'; import 'package:sqflite/sqflite.dart'; +import 'package:collection/collection.dart'; Future> legacyToV4(Database db, String name) async { final List> maps = await db.query(name); @@ -28,6 +29,40 @@ Future> legacyToV4(Database db, String name) async { return v4Configs; } +Future> V5Migration(Database db, String name) async { + final ConfigService config = ConfigService(); + + final localConfigs = await config.getLocalConfigs(); + + final List> maps = await db.query(name); + final existingCommunities = List.generate(maps.length, (i) { + return DBCommunity.fromMap(maps[i]); + }); + + final List updatedConfigs = []; + + for (final localConfig in localConfigs) { + final existingCommunity = existingCommunities.firstWhereOrNull( + (c) => c.alias == localConfig.community.alias, + ); + + if (existingCommunity != null) { + final updatedCommunity = DBCommunity( + alias: localConfig.community.alias, + config: localConfig.toJson(), + hidden: localConfig.community.hidden, + version: localConfig.version, + online: existingCommunity.online, + ); + updatedConfigs.add(updatedCommunity); + } else { + updatedConfigs.add(DBCommunity.fromConfig(localConfig)); + } + } + + return updatedConfigs; +} + class DBCommunity { final String alias; // index final bool hidden; @@ -118,6 +153,9 @@ class CommunityTable extends DBTable { 2: [ 'V4Migration', ], + 3: [ + 'V5Migration', + ], }; for (var i = oldVersion + 1; i <= newVersion; i++) { @@ -131,6 +169,10 @@ class CommunityTable extends DBTable { final updatedConfigs = await legacyToV4(db, name); await upsert(updatedConfigs); continue; + case 'V5Migration': + final updatedConfigs = await V5Migration(db, name); + await upsert(updatedConfigs); + continue; } await db.execute(query); diff --git a/lib/services/db/app/db.dart b/lib/services/db/app/db.dart index f73c927d..65e25b60 100644 --- a/lib/services/db/app/db.dart +++ b/lib/services/db/app/db.dart @@ -27,7 +27,7 @@ class AppDBService extends DBService { await communities.migrate(db, oldVersion, newVersion); return; }, - version: 2, + version: 3, ); final db = await databaseFactory.openDatabase( diff --git a/lib/services/db/backup/accounts.dart b/lib/services/db/backup/accounts.dart index 13404623..b47c2b06 100644 --- a/lib/services/db/backup/accounts.dart +++ b/lib/services/db/backup/accounts.dart @@ -15,6 +15,7 @@ class DBAccount { final String name; final UserHandle? userHandle; final String? username; + final String? accountFactoryAddress; EthPrivateKey? privateKey; final ProfileV1? profile; @@ -23,9 +24,10 @@ class DBAccount { required this.address, required this.name, this.username, + this.accountFactoryAddress, this.privateKey, this.profile, - }) : id = getAccountID(address, alias), + }) : id = getAccountID(address, alias, accountFactoryAddress), userHandle = username != null ? UserHandle(username, alias) : null; // toMap @@ -36,6 +38,7 @@ class DBAccount { 'address': address.hexEip55, if (name.isNotEmpty) 'name': name, 'username': username, + 'accountFactoryAddress': accountFactoryAddress, 'privateKey': privateKey != null ? bytesToHex(privateKey!.privateKey) : null, if (profile != null) 'profile': jsonEncode(profile!.toJson()), @@ -49,6 +52,7 @@ class DBAccount { address: EthereumAddress.fromHex(map['address']), name: map['name'], username: map['username'], + accountFactoryAddress: map['accountFactoryAddress'], privateKey: map['privateKey'] != null ? EthPrivateKey.fromHex(map['privateKey']) : null, @@ -59,8 +63,13 @@ class DBAccount { } } -String getAccountID(EthereumAddress address, String alias) { - return '${address.hexEip55}@$alias'; +String getAccountID( + EthereumAddress address, String alias, String? accountFactoryAddress) { + if (accountFactoryAddress == null) { + return '${address.hexEip55}@$alias'; + } else { + return '${address.hexEip55}@$accountFactoryAddress@$alias'; + } } class UserHandle { @@ -95,6 +104,7 @@ class AccountsTable extends DBTable { address TEXT NOT NULL, name TEXT NOT NULL, username TEXT, + accountFactoryAddress TEXT NOT NULL, privateKey TEXT, profile TEXT ) @@ -113,6 +123,9 @@ class AccountsTable extends DBTable { ], 3: [ 'ALTER TABLE $name ADD COLUMN username TEXT DEFAULT NULL', + ], + 4: [ + 'ALTER TABLE $name ADD COLUMN accountFactoryAddress TEXT DEFAULT NULL', ] }; @@ -133,11 +146,12 @@ class AccountsTable extends DBTable { } // get account by id - Future get(EthereumAddress address, String alias) async { + Future get(EthereumAddress address, String alias, + String? accountFactoryAddress) async { final List> maps = await db.query( name, where: 'id = ?', - whereArgs: [getAccountID(address, alias)], + whereArgs: [getAccountID(address, alias, accountFactoryAddress)], ); if (maps.isEmpty) { @@ -164,11 +178,12 @@ class AccountsTable extends DBTable { ); } - Future delete(EthereumAddress address, String alias) async { + Future delete(EthereumAddress address, String alias, + String? accountFactoryAddress) async { await db.delete( name, where: 'id = ?', - whereArgs: [getAccountID(address, alias)], + whereArgs: [getAccountID(address, alias, accountFactoryAddress)], ); } diff --git a/lib/services/db/backup/db.dart b/lib/services/db/backup/db.dart index 71ae81af..ea620ab1 100644 --- a/lib/services/db/backup/db.dart +++ b/lib/services/db/backup/db.dart @@ -40,7 +40,7 @@ class AccountBackupDBService extends DBService { return; }, - version: 3, + version: 4, ); final db = await databaseFactory.openDatabase( diff --git a/lib/services/wallet/contracts/account_factory.dart b/lib/services/wallet/contracts/account_factory.dart index cf27bffc..ee16cde5 100644 --- a/lib/services/wallet/contracts/account_factory.dart +++ b/lib/services/wallet/contracts/account_factory.dart @@ -14,7 +14,7 @@ Future accountFactoryServiceFromConfig(Config config, {String? customAccountFactory}) async { final primaryAccountFactory = config.community.primaryAccountFactory; - final url = config.getRpcUrl(primaryAccountFactory.chainId.toString()); + final url = config.getRpcUrl(primaryAccountFactory.chainId.toString(), customAccountFactory); // final wsurl = // config.chains[primaryAccountFactory.chainId.toString()]!.node.wsUrl; print('url: $url'); diff --git a/lib/services/wallet/wallet.dart b/lib/services/wallet/wallet.dart index afbe4beb..5734b116 100644 --- a/lib/services/wallet/wallet.dart +++ b/lib/services/wallet/wallet.dart @@ -159,18 +159,20 @@ class WalletService { Config config, { void Function(String)? onNotify, void Function(bool)? onFinished, + String? accountFactoryAddress, }) async { _alias = config.community.alias; final token = config.getPrimaryToken(); - final accountAbstractionConfig = - config.getPrimaryAccountAbstractionConfig(); + final accountAbstractionConfig = accountFactoryAddress != null + ? config.getAccountAbstractionConfig(accountFactoryAddress, token.chainId) + : config.getPrimaryAccountAbstractionConfig(); final chain = config.chains[token.chainId.toString()]; _url = chain!.node.url; _wsurl = chain.node.wsUrl; - final rpcUrl = config.getRpcUrl(token.chainId.toString()); + final rpcUrl = config.getRpcUrl(token.chainId.toString(), accountFactoryAddress); _ethClient = Web3Client( rpcUrl, @@ -452,6 +454,8 @@ class WalletService { return _contractAccountFactory; } + String get accountFactoryAddress => _contractAccountFactory.addr; + APIService getBundlerRPC({bool legacy = false}) { return _bundlerRPC; } diff --git a/lib/state/app/logic.dart b/lib/state/app/logic.dart index 7ece074d..2610a294 100644 --- a/lib/state/app/logic.dart +++ b/lib/state/app/logic.dart @@ -193,6 +193,8 @@ class AppLogic { privateKey: credentials, name: token.name, alias: communityConfig.community.alias, + accountFactoryAddress: + communityConfig.community.primaryAccountFactory.address, )); _theme.changeTheme(communityConfig.community.theme); @@ -308,6 +310,8 @@ class AppLogic { privateKey: credentials, name: name, alias: communityConfig.community.alias, + accountFactoryAddress: + communityConfig.community.primaryAccountFactory.address, ), ); @@ -374,6 +378,8 @@ class AppLogic { privateKey: credentials, name: '${token.symbol} Web Account', alias: communityConfig.community.alias, + accountFactoryAddress: + communityConfig.community.primaryAccountFactory.address, ), ); diff --git a/lib/state/communities/logic.dart b/lib/state/communities/logic.dart index fb702245..439679fa 100644 --- a/lib/state/communities/logic.dart +++ b/lib/state/communities/logic.dart @@ -29,17 +29,6 @@ class CommunitiesLogic { communities.map((c) => Config.fromJson(c.config)).toList(); _state.fetchCommunitiesSuccess(communityConfigs); - // Grouped operations for fetching and upserting communities - (() async { - final List communities = - await config.getCommunitiesFromRemote(); - - _state.upsertCommunities(communityConfigs); - - await _db.communities - .upsert(communities.map((c) => DBCommunity.fromConfig(c)).toList()); - })(); - for (final communityConfig in communityConfigs) { if (communityConfig.community.hidden) { continue; @@ -109,7 +98,7 @@ class CommunitiesLogic { _state.fetchCommunitiesSuccess(communityConfigs); return; } catch (e) { - // + debugPrint('Error fetching communities: $e'); } _state.fetchCommunitiesFailure(); @@ -125,9 +114,22 @@ class CommunitiesLogic { void _fetchAllCommunitiesFromRemote() async { try { - final List communities = await config.getCommunitiesFromRemote(); - await _db.communities - .upsert(communities.map((c) => DBCommunity.fromConfig(c)).toList()); + final communities = await _db.communities.getAll(); + for (final community in communities) { + final config = Config.fromJson(community.config); + if (config.community.hidden) { + continue; + } + + final token = config.getPrimaryToken(); + final chain = config.chains[token.chainId.toString()]; + + if (chain != null) { + final isOnline = await this.config.isCommunityOnline(chain.node.url); + await _db.communities + .updateOnlineStatus(config.community.alias, isOnline); + } + } return; } catch (e) { // @@ -166,32 +168,7 @@ class CommunitiesLogic { return true; } - for (int attempt = 0; attempt < 2; attempt++) { - final List communities = await config.getCommunitiesFromRemote(); - - for (final community in communities) { - if (community.community.alias != alias) { - continue; - } - - final token = community.getPrimaryToken(); - final chain = community.chains[token.chainId.toString()]; - - final isOnline = await config.isCommunityOnline(chain!.node.url); - - await _db.communities.upsert([DBCommunity.fromConfig(community)]); - await _db.communities - .updateOnlineStatus(community.community.alias, isOnline); - } - - // Check again if the community exists after the update - communityExists = await _db.communities.exists(alias); - if (communityExists) { - return true; - } - } - - return communityExists; + return false; } Future initializeAppDB() async { @@ -201,4 +178,33 @@ class CommunitiesLogic { // } } + + Future fetchAndUpdateSingleCommunity(String alias) async { + try { + final community = await _db.communities.get(alias); + if (community == null) { + return; + } + + final config = Config.fromJson(community.config); + final remoteConfig = + await this.config.getSingleCommunityConfig(config.configLocation); + + if (remoteConfig != null) { + await _db.communities.upsert([DBCommunity.fromConfig(remoteConfig)]); + + final existingIndex = _state.communities.indexWhere( + (c) => c.community.alias == alias, + ); + + if (existingIndex != -1) { + remoteConfig.online = _state.communities[existingIndex].online; + _state.communities[existingIndex] = remoteConfig; + _state.notifyListeners(); + } + } + } catch (e) { + debugPrint('Error fetching single community: $e'); + } + } } diff --git a/lib/state/profile/logic.dart b/lib/state/profile/logic.dart index 6c53f64a..e532f78b 100644 --- a/lib/state/profile/logic.dart +++ b/lib/state/profile/logic.dart @@ -158,7 +158,7 @@ class ProfileLogic { _state.setProfileRequest(); final account = - await _accountBackupDBService.accounts.get(ethAccount, alias); + await _accountBackupDBService.accounts.get(ethAccount, alias, null); if (account != null && account.profile != null) { final profile = account.profile!; @@ -207,11 +207,15 @@ class ProfileLogic { profile, ); + // Get the existing account to preserve the account factory address + final existingAccount = await _accountBackupDBService.accounts.get(ethAccount, alias, null); + _accountBackupDBService.accounts.update(DBAccount( alias: alias, address: ethAccount, name: profile.name, username: profile.username, + accountFactoryAddress: existingAccount?.accountFactoryAddress, privateKey: null, profile: profile, )); @@ -403,12 +407,19 @@ class ProfileLogic { imageSmall: newProfile.imageSmall, )); + final existingAccount = await _accountBackupDBService.accounts.get( + EthereumAddress.fromHex(newProfile.account), + _wallet.alias!, + null + ); + _accountBackupDBService.accounts.update( DBAccount( alias: _wallet.alias!, address: EthereumAddress.fromHex(newProfile.account), name: newProfile.name, username: newProfile.username, + accountFactoryAddress: existingAccount?.accountFactoryAddress, privateKey: null, profile: newProfile, ), @@ -473,7 +484,7 @@ class ProfileLogic { final alias = _wallet.alias ?? ''; final account = await _accountBackupDBService.accounts - .get(EthereumAddress.fromHex(address), alias); + .get(EthereumAddress.fromHex(address), alias, null); if (account == null) { throw Exception( @@ -556,6 +567,7 @@ class ProfileLogic { address: EthereumAddress.fromHex(address), name: newProfile.name, username: newProfile.username, + accountFactoryAddress: account.accountFactoryAddress, profile: newProfile, ), ); diff --git a/lib/state/profiles/logic.dart b/lib/state/profiles/logic.dart index febe6767..0c9a22bb 100644 --- a/lib/state/profiles/logic.dart +++ b/lib/state/profiles/logic.dart @@ -234,6 +234,7 @@ class ProfilesLogic extends WidgetsBindingObserver { address: account.address, name: updatedProfile.name, username: updatedProfile.username, + accountFactoryAddress: account.accountFactoryAddress, profile: updatedProfile, ), ); diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index 91c75346..714dce40 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -10,6 +10,7 @@ import 'package:citizenwallet/services/config/service.dart'; import 'package:citizenwallet/services/db/account/db.dart'; import 'package:citizenwallet/services/db/backup/accounts.dart'; import 'package:citizenwallet/services/db/app/db.dart'; +import 'package:citizenwallet/services/db/app/communities.dart'; import 'package:citizenwallet/services/db/account/transactions.dart'; import 'package:citizenwallet/services/accounts/accounts.dart'; import 'package:citizenwallet/services/engine/events.dart'; @@ -376,6 +377,7 @@ class WalletLogic extends WidgetsBindingObserver { dbWallet.privateKey!, nativeCurrency, communityConfig, + accountFactoryAddress: dbWallet.accountFactoryAddress, onNotify: (String message) { _notificationsLogic.show(message); }, @@ -486,6 +488,7 @@ class WalletLogic extends WidgetsBindingObserver { privateKey: credentials, name: 'New ${token.symbol} Account', alias: communityConfig.community.alias, + accountFactoryAddress: communityConfig.community.primaryAccountFactory.address, )); _theme.changeTheme(communityConfig.community.theme); @@ -553,6 +556,7 @@ class WalletLogic extends WidgetsBindingObserver { privateKey: credentials, name: name, alias: communityConfig.community.alias, + accountFactoryAddress: communityConfig.community.primaryAccountFactory.address, )); _theme.changeTheme(communityConfig.community.theme); @@ -2080,6 +2084,16 @@ class WalletLogic extends WidgetsBindingObserver { Config communityConfig = Config.fromJson(community.config); + try { + final remoteConfig = await _config.getSingleCommunityConfig(communityConfig.configLocation); + if (remoteConfig != null) { + await _appDBService.communities.upsert([DBCommunity.fromConfig(remoteConfig)]); + communityConfig = remoteConfig; + } + } catch (e) { + debugPrint('Error fetching single community config: $e'); + } + final token = communityConfig.getPrimaryToken(); communityConfig.online = await _config.isCommunityOnline( diff --git a/pubspec.yaml b/pubspec.yaml index 3c6fa591..47df4926 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -128,10 +128,13 @@ flutter: - assets/icons/citizenbank.svg - assets/icons/language-svgrepo-com.svg - assets/icons/contactless.svg + - assets/config/v5/communities.json + - assets/config/v5/communities.test.json + - assets/config/v5/debug.json + - assets/icons/switch_accounts.svg - assets/config/v4/communities.json - assets/config/v4/communities.test.json - assets/config/v4/debug.json - - assets/icons/switch_accounts.svg - assets/config/v3/communities.json - assets/config/v3/communities.test.json - assets/config/v3/legacy_4337_bundlers.json From 8e996851162ac71499600527d99bc7d2fc47a6bd Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 24 Jul 2025 17:09:26 +0530 Subject: [PATCH 04/46] Conflicts Resolved --- lib/main.dart | 1 - lib/modals/profile/edit.dart | 12 +- lib/modals/wallet/deep_link.dart | 3 - lib/screens/accounts/screen.dart | 1 - lib/screens/cards/screen.dart | 5 - lib/screens/deeplink/deep_link.dart | 7 - lib/screens/landing/account_recovery.dart | 1 - lib/screens/send/send_link_progress.dart | 1 - lib/screens/send/send_progress.dart | 26 +- lib/screens/send/tip_details.dart | 19 +- lib/screens/wallet/more_actions_sheet.dart | 1 - lib/screens/wallet/screen.dart | 13 +- lib/screens/wallet/screen.web.dart | 18 +- lib/screens/wallet/tip_to.dart | 1 - lib/screens/webview/screen.dart | 2 - lib/services/config/config.dart | 1 - lib/services/config/service.dart | 8 +- lib/services/credentials/native/android.dart | 1 - lib/services/db/backup/accounts.dart | 1 - lib/services/db/backup/db.dart | 1 - lib/services/db/db.dart | 1 - lib/services/engine/events.dart | 15 - lib/services/preferences/preferences.dart | 2 - lib/services/sentry/sentry.dart | 4 - .../wallet/contracts/account_factory.dart | 2 - .../wallet/contracts/cards/card_manager.dart | 1 - .../contracts/cards/safe_card_manager.dart | 1 - lib/services/wallet/utils.dart | 4 +- lib/services/wallet_connect/wallet_kit.dart | 1 - lib/state/deep_link/logic.dart | 20 +- lib/state/notifications/logic.dart | 36 +-- lib/state/profile/logic.dart | 60 ++-- lib/state/profiles/logic.dart | 12 +- lib/state/scan/logic.dart | 10 +- lib/state/transaction.dart | 2 - lib/state/vouchers/logic.dart | 112 +++---- lib/state/wallet/logic.dart | 285 +++++++++--------- lib/state/wallet_connect/logic.dart | 9 +- lib/widgets/communities/community_row.dart | 1 - lib/widgets/scanner/scanner.dart | 1 - lib/widgets/wallet_transaction_modal.dart | 1 - .../webview/connected_webview_modal.dart | 2 - lib/widgets/webview/webview_navigation.dart | 1 - test/router_extension.dart | 1 - 44 files changed, 315 insertions(+), 392 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 599753c3..3c122501 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,7 +7,6 @@ import 'package:citizenwallet/services/config/service.dart'; import 'package:citizenwallet/services/db/account/db.dart'; import 'package:citizenwallet/services/db/app/db.dart'; import 'package:citizenwallet/services/preferences/preferences.dart'; -import 'package:citizenwallet/services/wallet/wallet.dart'; import 'package:citizenwallet/state/app/logic.dart'; import 'package:citizenwallet/state/app/state.dart'; import 'package:citizenwallet/state/communities/logic.dart'; diff --git a/lib/modals/profile/edit.dart b/lib/modals/profile/edit.dart index bcfca698..8d762c5d 100644 --- a/lib/modals/profile/edit.dart +++ b/lib/modals/profile/edit.dart @@ -228,6 +228,10 @@ class EditProfileModalState extends State { context.select((ProfileState state) => state.descriptionEdit); final username = context.select((ProfileState state) => state.username); + + final usernameErrorMessage = + context.select((ProfileState state) => state.usernameErrorMessage); + final hasProfile = username.isNotEmpty; final isInvalid = @@ -396,11 +400,9 @@ class EditProfileModalState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - context.select((ProfileState state) => state - .usernameErrorMessage.isNotEmpty) - ? context.select((ProfileState state) => - state.usernameErrorMessage) - : usernameController.value.text == '' + usernameErrorMessage.isNotEmpty + ? usernameErrorMessage + : usernameController.value.text.isEmpty ? AppLocalizations.of(context)! .pleasePickAUsername : AppLocalizations.of(context)! diff --git a/lib/modals/wallet/deep_link.dart b/lib/modals/wallet/deep_link.dart index 47db5601..b38f6729 100644 --- a/lib/modals/wallet/deep_link.dart +++ b/lib/modals/wallet/deep_link.dart @@ -1,8 +1,5 @@ -import 'dart:async'; - import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; -import 'package:citizenwallet/services/wallet/wallet.dart'; import 'package:citizenwallet/state/deep_link/logic.dart'; import 'package:citizenwallet/state/deep_link/state.dart'; import 'package:citizenwallet/state/wallet/state.dart'; diff --git a/lib/screens/accounts/screen.dart b/lib/screens/accounts/screen.dart index a790ac5e..88f25b84 100644 --- a/lib/screens/accounts/screen.dart +++ b/lib/screens/accounts/screen.dart @@ -14,7 +14,6 @@ import 'package:citizenwallet/utils/delay.dart'; import 'package:citizenwallet/utils/formatters.dart'; import 'package:citizenwallet/utils/ratio.dart'; import 'package:citizenwallet/widgets/confirm_modal.dart'; -import 'package:citizenwallet/widgets/expansion_panel/expansion_panel.dart'; import 'package:citizenwallet/widgets/export_wallet_modal.dart'; import 'package:citizenwallet/widgets/header.dart'; import 'package:citizenwallet/widgets/persistent_header_delegate.dart'; diff --git a/lib/screens/cards/screen.dart b/lib/screens/cards/screen.dart index 38a0612c..484e4781 100644 --- a/lib/screens/cards/screen.dart +++ b/lib/screens/cards/screen.dart @@ -45,11 +45,6 @@ class CardsScreenState extends State { return; } - print( - '${AppLocalizations.of(context)!.initialAddress} ${widget.walletLogic.privateKey?.address.hexEip55 ?? 'No address'}'); - - // _logic.configure( - // widget.walletLogic.privateKey, wallet.account, wallet.alias); _logic.read(); } diff --git a/lib/screens/deeplink/deep_link.dart b/lib/screens/deeplink/deep_link.dart index a0ca8e60..6bae78f2 100644 --- a/lib/screens/deeplink/deep_link.dart +++ b/lib/screens/deeplink/deep_link.dart @@ -1,7 +1,4 @@ -import 'dart:async'; - import 'package:citizenwallet/services/wallet/utils.dart'; -import 'package:citizenwallet/services/wallet/wallet.dart'; import 'package:citizenwallet/state/deep_link/logic.dart'; import 'package:citizenwallet/state/deep_link/state.dart'; import 'package:citizenwallet/state/wallet/state.dart'; @@ -39,8 +36,6 @@ class DeepLinkScreenState extends State { void initState() { super.initState(); - // _logic = DeepLinkLogic(context); - // post frame callback WidgetsBinding.instance.addPostFrameCallback((_) { // initial requests go here @@ -50,8 +45,6 @@ class DeepLinkScreenState extends State { @override void dispose() { - // - super.dispose(); } diff --git a/lib/screens/landing/account_recovery.dart b/lib/screens/landing/account_recovery.dart index 57305efb..82096562 100644 --- a/lib/screens/landing/account_recovery.dart +++ b/lib/screens/landing/account_recovery.dart @@ -5,7 +5,6 @@ import 'package:citizenwallet/state/backup/state.dart'; import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/widgets/layouts/info_action.dart'; import 'package:citizenwallet/widgets/scanner/scanner_modal.dart'; -import 'package:citizenwallet/widgets/text_input_modal.dart'; import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; diff --git a/lib/screens/send/send_link_progress.dart b/lib/screens/send/send_link_progress.dart index 490ddad3..22173282 100644 --- a/lib/screens/send/send_link_progress.dart +++ b/lib/screens/send/send_link_progress.dart @@ -1,4 +1,3 @@ -import 'package:citizenwallet/models/transaction.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; import 'package:citizenwallet/state/vouchers/logic.dart'; import 'package:citizenwallet/state/vouchers/state.dart'; diff --git a/lib/screens/send/send_progress.dart b/lib/screens/send/send_progress.dart index d1c4d70c..06c2dc0e 100644 --- a/lib/screens/send/send_progress.dart +++ b/lib/screens/send/send_progress.dart @@ -57,6 +57,16 @@ class _SendProgressState extends State { navigator.pop(); } + void handleDismiss(BuildContext context) { + final navigator = GoRouter.of(context); + + if (navigator.canPop()) { + navigator.pop(); + } else { + navigator.go('/wallet/${widget.walletLogic?.account}'); + } + } + void handleStartCloseScreenTimer(BuildContext context) { if (_isClosing) { return; @@ -132,6 +142,8 @@ class _SendProgressState extends State { final date = DateFormat.yMMMd().add_Hm().format(inProgressTransaction.date); + final hasTip = context.select((WalletState state) => state.hasTip); + final statusMessage = inProgressTransactionError ? widget.isMinting ? AppLocalizations.of(context)!.failedMint(wallet.symbol) @@ -333,8 +345,7 @@ class _SendProgressState extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - context.select((WalletState state) => state.hasTip) && - widget.sendTransaction?.tipTo == null + hasTip && widget.sendTransaction?.tipTo == null ? Column( children: [ Button( @@ -356,16 +367,7 @@ class _SendProgressState extends State { height: 10, ), CupertinoButton( - onPressed: () { - final navigator = GoRouter.of(context); - - if (navigator.canPop()) { - navigator.pop(); - } else { - navigator.go( - '/wallet/${widget.walletLogic?.account}'); - } - }, + onPressed: () => handleDismiss(context), child: ConstrainedBox( constraints: BoxConstraints( minWidth: 200, diff --git a/lib/screens/send/tip_details.dart b/lib/screens/send/tip_details.dart index b2ff60f2..f0e2c65c 100644 --- a/lib/screens/send/tip_details.dart +++ b/lib/screens/send/tip_details.dart @@ -67,16 +67,19 @@ class _TipDetailsScreenState extends State { super.initState(); _sendTransaction = widget.sendTransaction ?? SendTransaction(); - WidgetsBinding.instance.addPostFrameCallback((_) { + WidgetsBinding.instance.addPostFrameCallback((_) async { final walletLogic = widget.walletLogic; final tipTo = context.read().tipTo; if (tipTo != null) { - widget.profilesLogic.getLocalProfile(tipTo).then((profile) { + try { + final profile = await widget.profilesLogic.getLocalProfile(tipTo); if (profile != null) { widget.profilesLogic.selectProfile(profile); } - }); + } catch (e) { + debugPrint('Error fetching profile: $e'); + } } onLoad(); @@ -293,12 +296,12 @@ class _TipDetailsScreenState extends State { await Future.delayed(const Duration(milliseconds: 50)); - final walletAddress = walletLogic.address.isNotEmpty - ? walletLogic.address - : walletLogic.account.isNotEmpty - ? walletLogic.account + final walletAddress = walletLogic.address.isNotEmpty + ? walletLogic.address + : walletLogic.account.isNotEmpty + ? walletLogic.account : context.read().wallet?.address ?? ''; - + if (walletAddress.isNotEmpty) { navigator.go('/wallet/$walletAddress'); } else { diff --git a/lib/screens/wallet/more_actions_sheet.dart b/lib/screens/wallet/more_actions_sheet.dart index 64302947..52fe6e75 100644 --- a/lib/screens/wallet/more_actions_sheet.dart +++ b/lib/screens/wallet/more_actions_sheet.dart @@ -4,7 +4,6 @@ import 'package:citizenwallet/state/wallet/state.dart'; import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/widgets/coin_logo.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:citizenwallet/l10n/app_localizations.dart'; diff --git a/lib/screens/wallet/screen.dart b/lib/screens/wallet/screen.dart index 1d3bfeb6..8d65daa0 100644 --- a/lib/screens/wallet/screen.dart +++ b/lib/screens/wallet/screen.dart @@ -188,7 +188,7 @@ class WalletScreenState extends State _logic.credentials!, _logic.accountAddress!, ); - + _logic.requestWalletActions(); await _logic.loadTransactions(); @@ -817,7 +817,7 @@ class WalletScreenState extends State if (alias == null && params != null) { alias = paramsAlias(params); } - + if (alias == null) { return (null, null); } @@ -986,7 +986,7 @@ class WalletScreenState extends State final pluginUrl = '$redirectUrl/#/?dl=plugin'; final connection = _logic.connection; - String url = '$result?${connection?.queryParams ?? ''}'; + String url = '$result?${connection.queryParams}'; if (result.startsWith(pluginUrl)) { final resultUri = Uri.parse(result); final uri = Uri.parse(resultUri.fragment); @@ -1009,7 +1009,7 @@ class WalletScreenState extends State } url = - '${pluginConfig.url}${pluginConfig.url.contains('?') ? '&' : '?'}${connection?.queryParams ?? ''}'; + '${pluginConfig.url}${pluginConfig.url.contains('?') ? '&' : '?'}${connection.queryParams}'; } if (!super.mounted) { @@ -1057,13 +1057,14 @@ class WalletScreenState extends State final uriAlias = aliasFromUri(result); final receiveAlias = aliasFromReceiveUri(result); final sendAlias = aliasFromSendUri(result); - + if (voucherParams != null || deepLinkParams != null || sendToParams != null) { final (address, alias) = await handleLoadFromParams( voucherParams ?? sendToParams ?? deepLinkParams ?? parsedQRData.alias, - overrideAlias: uriAlias ?? receiveAlias ?? sendAlias ?? parsedQRData.alias, + overrideAlias: + uriAlias ?? receiveAlias ?? sendAlias ?? parsedQRData.alias, ); loadedAddress = address; loadedAlias = alias; diff --git a/lib/screens/wallet/screen.web.dart b/lib/screens/wallet/screen.web.dart index eb4b937a..2546ebc7 100644 --- a/lib/screens/wallet/screen.web.dart +++ b/lib/screens/wallet/screen.web.dart @@ -1,8 +1,6 @@ import 'package:citizenwallet/modals/profile/edit.dart'; -import 'package:citizenwallet/modals/wallet/deep_link.dart'; import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; -import 'package:citizenwallet/state/deep_link/state.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:universal_html/html.dart' as html; @@ -195,7 +193,7 @@ class BurnerWalletScreenState extends State { switch (deepLink) { case 'plugin': final pluginConfig = - await _logic.getPluginConfig(widget.alias!, params); + await _logic.getPluginConfig(widget.alias, params); if (pluginConfig == null) { return; } @@ -206,20 +204,6 @@ class BurnerWalletScreenState extends State { _profilesLogic.pause(); _voucherLogic.pause(); - // await CupertinoScaffold.showCupertinoModalBottomSheet( - // context: context, - // expand: true, - // useRootNavigator: true, - // builder: (modalContext) => ChangeNotifierProvider( - // create: (_) => DeepLinkState(deepLink), - // child: DeepLinkModal( - // wallet: _logic.wallet, - // deepLink: deepLink, - // deepLinkParams: params, - // ), - // ), - // ); - final navigator = GoRouter.of(context); await navigator.push('/wallet/${widget.encoded}/deeplink', extra: { diff --git a/lib/screens/wallet/tip_to.dart b/lib/screens/wallet/tip_to.dart index 7cb040f6..38d588d7 100644 --- a/lib/screens/wallet/tip_to.dart +++ b/lib/screens/wallet/tip_to.dart @@ -13,7 +13,6 @@ import 'package:citizenwallet/widgets/persistent_header_delegate.dart'; import 'package:citizenwallet/widgets/profile/profile_chip.dart'; import 'package:citizenwallet/widgets/profile/profile_row.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter/services.dart'; import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; diff --git a/lib/screens/webview/screen.dart b/lib/screens/webview/screen.dart index 9384b095..e8492632 100644 --- a/lib/screens/webview/screen.dart +++ b/lib/screens/webview/screen.dart @@ -114,8 +114,6 @@ class _WebViewScreenState extends State { void handleBack() async { bool canGoBack = await webViewController?.canGoBack() ?? false; - print('can go back $canGoBack'); - if (canGoBack) { await webViewController?.goBack(); } diff --git a/lib/services/config/config.dart b/lib/services/config/config.dart index 9ce42e10..588e8e19 100644 --- a/lib/services/config/config.dart +++ b/lib/services/config/config.dart @@ -14,7 +14,6 @@ import 'package:citizenwallet/services/wallet/contracts/erc20.dart'; import 'package:citizenwallet/services/wallet/contracts/profile.dart'; import 'package:citizenwallet/services/wallet/contracts/safe_account.dart'; import 'package:citizenwallet/services/wallet/contracts/simple_account.dart'; -import 'package:citizenwallet/utils/uint8.dart'; import 'package:web3dart/crypto.dart'; import 'package:web3dart/web3dart.dart'; diff --git a/lib/services/config/service.dart b/lib/services/config/service.dart index 89b998ec..b08216a9 100644 --- a/lib/services/config/service.dart +++ b/lib/services/config/service.dart @@ -60,8 +60,8 @@ class ConfigService { _configs = [config]; }).catchError((e, s) { - print('Error fetching config: $e'); - print('Stacktrace: $s'); + debugPrint('Error fetching config: $e'); + debugPrint('Stacktrace: $s'); }); return _configs.first; @@ -76,8 +76,8 @@ class ConfigService { return config; } catch (e, s) { - print('Error fetching config: $e'); - print('Stacktrace: $s'); + debugPrint('Error fetching config: $e'); + debugPrint('Stacktrace: $s'); } String alias = Uri.base.host.endsWith(appLinkSuffix) diff --git a/lib/services/credentials/native/android.dart b/lib/services/credentials/native/android.dart index 6bd11386..86dbcb89 100644 --- a/lib/services/credentials/native/android.dart +++ b/lib/services/credentials/native/android.dart @@ -2,7 +2,6 @@ import 'dart:typed_data'; import 'package:citizenwallet/services/credentials/credentials.dart'; import 'package:citizenwallet/utils/encrypt.dart'; -import 'package:convert/convert.dart'; import 'package:credential_manager/credential_manager.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:web3dart/crypto.dart'; diff --git a/lib/services/db/backup/accounts.dart b/lib/services/db/backup/accounts.dart index 13404623..95c9e42c 100644 --- a/lib/services/db/backup/accounts.dart +++ b/lib/services/db/backup/accounts.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:citizenwallet/services/db/db.dart'; import 'package:citizenwallet/services/wallet/contracts/profile.dart'; -import 'package:citizenwallet/services/wallet/wallet.dart'; import 'package:flutter/foundation.dart'; import 'package:sqflite/sqlite_api.dart'; import 'package:web3dart/crypto.dart'; diff --git a/lib/services/db/backup/db.dart b/lib/services/db/backup/db.dart index 71ae81af..af46904a 100644 --- a/lib/services/db/backup/db.dart +++ b/lib/services/db/backup/db.dart @@ -1,6 +1,5 @@ import 'package:citizenwallet/services/db/backup/accounts.dart'; import 'package:citizenwallet/services/db/db.dart'; -import 'package:sqflite/sqlite_api.dart'; import 'package:sqflite_common/sqflite.dart'; class AccountBackupDBService extends DBService { diff --git a/lib/services/db/db.dart b/lib/services/db/db.dart index dc134075..8ded1a75 100644 --- a/lib/services/db/db.dart +++ b/lib/services/db/db.dart @@ -56,7 +56,6 @@ abstract class DBService { final dbPath = kIsWeb ? this.name : join(await getDatabasesPath(), this.name); - print('dbPath: $dbPath'); _db = await openDB(dbPath); } diff --git a/lib/services/engine/events.dart b/lib/services/engine/events.dart index 076faf1e..6eed5d1c 100644 --- a/lib/services/engine/events.dart +++ b/lib/services/engine/events.dart @@ -41,7 +41,6 @@ class WebSocketEvent { final jsonData = json.decode(message); return WebSocketEvent.fromJson(jsonData); } catch (e) { - print('Error parsing WebSocket message: $e'); return null; } } @@ -66,7 +65,6 @@ class EventService { bool get isOffline => _isConnected == false; Future connect({Duration? reconnectDelay}) async { - print('Connecting to $_url/v1/events/$_contractAddress/$_topic'); if (_isConnected) return; @@ -89,7 +87,6 @@ class EventService { onDone: _onDone, ); } catch (e) { - print('Connection error: $e'); _isConnected = false; _onStateChange(EventServiceState.error); Duration delay = Duration(seconds: _reconnectDelay.inSeconds); @@ -118,36 +115,26 @@ class EventService { } void _onMessage(dynamic message) { - print('Received message: $message'); if (message is String) { final event = WebSocketEvent.tryParse(message); if (event != null) { // Handle the parsed event - print('Parsed WebSocketEvent: ${event.type} - ${event.id}'); _messageHandler?.call(event); - } else { - print('Failed to parse WebSocket message'); } - } else { - print('Received non-string message'); } } void _onError(error) { - print('WebSocket error: $error'); _isConnected = false; _onStateChange(EventServiceState.error); if (!_intentionalDisconnect) { _scheduleReconnect(); - } else { - print('Skipping reconnect due to intentional disconnect'); } } void _onDone() { - print('WebSocket connection closed'); _isConnected = false; if (!_intentionalDisconnect) { _scheduleReconnect(); @@ -164,7 +151,6 @@ class EventService { _reconnectTimer?.cancel(); _reconnectTimer = Timer(reconnectDelay ?? _reconnectDelay, () async { - print('Attempting to reconnect...'); _onStateChange(EventServiceState.connecting); @@ -175,7 +161,6 @@ class EventService { } Future disconnect() async { - print('Disconnecting from $_url/v1/events/$_contractAddress/$_topic'); _reconnectTimer?.cancel(); _isConnected = false; _intentionalDisconnect = true; diff --git a/lib/services/preferences/preferences.dart b/lib/services/preferences/preferences.dart index 14d8a7d6..4539535b 100644 --- a/lib/services/preferences/preferences.dart +++ b/lib/services/preferences/preferences.dart @@ -1,7 +1,5 @@ import 'dart:convert'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/scheduler.dart'; import 'package:shared_preferences/shared_preferences.dart'; class PreferencesService { diff --git a/lib/services/sentry/sentry.dart b/lib/services/sentry/sentry.dart index 030e1a0b..4c47988b 100644 --- a/lib/services/sentry/sentry.dart +++ b/lib/services/sentry/sentry.dart @@ -1,7 +1,3 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; - // remove the sensitive part of the fragment String? scrubFragment(String? fragment) { if (fragment == null) { diff --git a/lib/services/wallet/contracts/account_factory.dart b/lib/services/wallet/contracts/account_factory.dart index cf27bffc..1322b254 100644 --- a/lib/services/wallet/contracts/account_factory.dart +++ b/lib/services/wallet/contracts/account_factory.dart @@ -8,7 +8,6 @@ import 'package:http/http.dart'; import 'package:smartcontracts/accounts.dart'; import 'package:web3dart/crypto.dart'; import 'package:web3dart/web3dart.dart'; -import 'package:web_socket_channel/web_socket_channel.dart'; Future accountFactoryServiceFromConfig(Config config, {String? customAccountFactory}) async { @@ -17,7 +16,6 @@ Future accountFactoryServiceFromConfig(Config config, final url = config.getRpcUrl(primaryAccountFactory.chainId.toString()); // final wsurl = // config.chains[primaryAccountFactory.chainId.toString()]!.node.wsUrl; - print('url: $url'); final client = Client(); diff --git a/lib/services/wallet/contracts/cards/card_manager.dart b/lib/services/wallet/contracts/cards/card_manager.dart index 9f5305ea..1f335ec5 100644 --- a/lib/services/wallet/contracts/cards/card_manager.dart +++ b/lib/services/wallet/contracts/cards/card_manager.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter/services.dart'; diff --git a/lib/services/wallet/contracts/cards/safe_card_manager.dart b/lib/services/wallet/contracts/cards/safe_card_manager.dart index 74053007..81ef0824 100644 --- a/lib/services/wallet/contracts/cards/safe_card_manager.dart +++ b/lib/services/wallet/contracts/cards/safe_card_manager.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter/services.dart'; diff --git a/lib/services/wallet/utils.dart b/lib/services/wallet/utils.dart index 6d79cf14..d89fa20c 100644 --- a/lib/services/wallet/utils.dart +++ b/lib/services/wallet/utils.dart @@ -127,12 +127,12 @@ bool isValidPrivateKey(String privateKey) { String compress(String data) { final enCodedData = utf8.encode(data); final gZipData = GZipEncoder().encode(enCodedData, level: 6); - return base64Url.encode(gZipData!); + return base64Url.encode(gZipData); } Uint8List compressBytes(Uint8List data) { final gZipData = GZipEncoder().encode(data, level: 6); - return convertBytesToUint8List(gZipData!); + return convertBytesToUint8List(gZipData); } String decompress(String data) { diff --git a/lib/services/wallet_connect/wallet_kit.dart b/lib/services/wallet_connect/wallet_kit.dart index baaa2356..bf9f1a44 100644 --- a/lib/services/wallet_connect/wallet_kit.dart +++ b/lib/services/wallet_connect/wallet_kit.dart @@ -12,7 +12,6 @@ import 'package:reown_walletkit/reown_walletkit.dart'; import 'package:web3dart/crypto.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:citizenwallet/services/config/config.dart'; -import 'package:web3dart/web3dart.dart'; final List supportedChains = [ 'eip155:100', diff --git a/lib/state/deep_link/logic.dart b/lib/state/deep_link/logic.dart index 2876bd0b..bb5cc19f 100644 --- a/lib/state/deep_link/logic.dart +++ b/lib/state/deep_link/logic.dart @@ -9,9 +9,9 @@ import 'package:web3dart/web3dart.dart'; class DeepLinkLogic { final DeepLinkState _state; final NotificationsLogic _notifications; - Config? _config; - EthPrivateKey? _credentials; - EthereumAddress? _account; + late Config _config; + late EthPrivateKey _credentials; + late EthereumAddress _account; DeepLinkLogic(BuildContext context, Config config, EthPrivateKey credentials, EthereumAddress account) : _state = context.read(), @@ -42,22 +42,22 @@ class DeepLinkLogic { throw Exception('Address is required'); } - final calldata = await simpleFaucetRedeemCallData(_config!, address); + final calldata = await simpleFaucetRedeemCallData(_config, address); final (_, userop) = await prepareUserop( - _config!, - _account!, - _credentials!, + _config, + _account, + _credentials, [address], [calldata], ); - final txHash = await submitUserop(_config!, userop); + final txHash = await submitUserop(_config, userop); if (txHash == null) { throw Exception('transaction failed'); } - final success = await waitForTxSuccess(_config!, txHash); + final success = await waitForTxSuccess(_config, txHash); if (!success) { throw Exception('transaction failed'); } @@ -85,7 +85,7 @@ class DeepLinkLogic { throw Exception('Address is required'); } - final amount = await getFaucetRedeemAmount(_config!, address); + final amount = await getFaucetRedeemAmount(_config, address); _state.setFaucetAmount(amount); _state.success(); diff --git a/lib/state/notifications/logic.dart b/lib/state/notifications/logic.dart index cb6d8f9c..b14d82fd 100644 --- a/lib/state/notifications/logic.dart +++ b/lib/state/notifications/logic.dart @@ -15,9 +15,9 @@ class NotificationsLogic { final PreferencesService _prefs = PreferencesService(); final PushService _push = PushService(); final AudioService _audio = AudioService(); - Config? _config; - EthPrivateKey? _credentials; - EthereumAddress? _account; + late Config _config; + late EthPrivateKey _credentials; + late EthereumAddress _account; NotificationsLogic(BuildContext context) : _state = context.read(); @@ -33,7 +33,7 @@ class NotificationsLogic { if (_account == null) return; final systemEnabled = await _push.isEnabled(); - bool enabled = _prefs.pushNotifications(_account!.hexEip55); + bool enabled = _prefs.pushNotifications(_account.hexEip55); if (!systemEnabled) { final allowed = await _push.requestPermissions(); @@ -51,7 +51,7 @@ class NotificationsLogic { // enable push _state.setPush(true); await _push.start(onToken, onMessage); - _prefs.setPushNotifications(_account!.hexEip55, true); + _prefs.setPushNotifications(_account.hexEip55, true); } catch (e) { // } @@ -62,7 +62,7 @@ class NotificationsLogic { if (_account == null) return; final systemEnabled = await _push.isEnabled(); - final enabled = _prefs.pushNotifications(_account!.hexEip55); + final enabled = _prefs.pushNotifications(_account.hexEip55); _state.setPush(systemEnabled && enabled); } catch (e) { @@ -107,9 +107,9 @@ class NotificationsLogic { if (_config == null || _credentials == null || _account == null) return; final updated = await updatePushToken( - _config!, - _account!, - _credentials!, + _config, + _account, + _credentials, token, ); if (!updated) { @@ -130,9 +130,9 @@ class NotificationsLogic { } final updated = await updatePushToken( - _config!, - _account!, - _credentials!, + _config, + _account, + _credentials, token, ); if (!updated) { @@ -148,13 +148,13 @@ class NotificationsLogic { if (_account == null) return; final systemEnabled = await _push.isEnabled(); - final enabled = _prefs.pushNotifications(_account!.hexEip55); + final enabled = _prefs.pushNotifications(_account.hexEip55); if (systemEnabled && enabled) { // disable push _state.setPush(false); await _push.stop(); - _prefs.setPushNotifications(_account!.hexEip55, false); + _prefs.setPushNotifications(_account.hexEip55, false); final token = await _push.token; if (token == null) { @@ -164,9 +164,9 @@ class NotificationsLogic { if (_config == null || _credentials == null) return; final updated = await removePushToken( - _config!, - _account!, - _credentials!, + _config, + _account, + _credentials, token, ); if (!updated) { @@ -185,7 +185,7 @@ class NotificationsLogic { // enable push _state.setPush(true); await _push.start(onToken, onMessage); - _prefs.setPushNotifications(_account!.hexEip55, true); + _prefs.setPushNotifications(_account.hexEip55, true); } catch (e) { // } diff --git a/lib/state/profile/logic.dart b/lib/state/profile/logic.dart index d9e38245..f4178630 100644 --- a/lib/state/profile/logic.dart +++ b/lib/state/profile/logic.dart @@ -32,9 +32,9 @@ class ProfileLogic { final PhotosService _photos = PhotosService(); final AccountDBService _db = AccountDBService(); - Config? _config; - EthPrivateKey? _credentials; - EthereumAddress? _account; + late Config _config; + late EthPrivateKey _credentials; + late EthereumAddress _account; bool _pauseProfileCreation = false; @@ -90,7 +90,7 @@ class ProfileLogic { throw Exception('account or config not found'); } - final community = await _appDBService.communities.get(_account!.hexEip55); + final community = await _appDBService.communities.get(_account.hexEip55); if (community == null) { throw Exception('community not found'); @@ -101,7 +101,7 @@ class ProfileLogic { final url = communityConfig.community.walletUrl(deepLinkURL); final compressedParams = compress( - '?address=${_account!.hexEip55}&alias=${communityConfig.community.alias}'); + '?address=${_account.hexEip55}&alias=${communityConfig.community.alias}'); _state.setProfileLinkSuccess('$url&receiveParams=$compressedParams'); return; @@ -164,12 +164,12 @@ class ProfileLogic { try { _state.setUsernameRequest(); - final exists = await profileExists(_config!, username.toLowerCase()); + final exists = await profileExists(_config, username.toLowerCase()); if (exists) { final existingProfile = - await getProfileByUsername(_config!, username.toLowerCase()); + await getProfileByUsername(_config, username.toLowerCase()); if (existingProfile != null && - existingProfile.account == _account!.hexEip55) { + existingProfile.account == _account.hexEip55) { _state.setUsernameSuccess(); return; } @@ -190,8 +190,8 @@ class ProfileLogic { } Future loadProfile({String? account, bool online = false}) async { - final ethAccount = _account!; - final alias = _config!.community.alias; + final ethAccount = _account; + final alias = _config.community.alias; final acc = account ?? ethAccount.hexEip55; resume(); @@ -224,7 +224,7 @@ class ProfileLogic { throw Exception('community is offline'); } - final profile = await getProfile(_config!, acc); + final profile = await getProfile(_config, acc); if (profile == null) { _state.setProfileNoChangeSuccess(); @@ -281,7 +281,7 @@ class ProfileLogic { _state.viewProfileSuccess(cachedProfile!.profile); } - final profile = await getProfile(_config!, account); + final profile = await getProfile(_config, account); if (profile == null) { await delay(const Duration(milliseconds: 500)); _state.setViewProfileNoChangeSuccess(); @@ -319,7 +319,7 @@ class ProfileLogic { profile.name = _state.nameController.value.text; profile.description = _state.descriptionController.value.text; - final exists = await createAccount(_config!, _account!, _credentials!); + final exists = await createAccount(_config, _account, _credentials); if (!exists) { throw Exception('Failed to create account'); } @@ -331,9 +331,9 @@ class ProfileLogic { : await _photos.photoFromBundle('assets/icons/profile.jpg'); final url = await setProfile( - _config!, - _account!, - _credentials!, + _config, + _account, + _credentials, ProfileRequest.fromProfileV1(profile), image: newImage, fileType: '.jpg', @@ -344,7 +344,7 @@ class ProfileLogic { _state.setProfileFetching(); - final newProfile = await getProfileFromUrl(_config!, url); + final newProfile = await getProfileFromUrl(_config, url); if (newProfile == null) { throw Exception('Failed to load profile'); } @@ -375,7 +375,7 @@ class ProfileLogic { _accountBackupDBService.accounts.update( DBAccount( - alias: _config!.community.alias, + alias: _config.community.alias, address: EthereumAddress.fromHex(newProfile.account), name: newProfile.name, username: newProfile.username, @@ -413,7 +413,7 @@ class ProfileLogic { _state.setProfileExisting(); - final existing = await getProfile(_config!, profile.account); + final existing = await getProfile(_config, profile.account); if (existing == null) { throw Exception('Failed to load profile'); } @@ -426,14 +426,14 @@ class ProfileLogic { _state.setProfileUploading(); final url = - await updateProfile(_config!, _account!, _credentials!, profile); + await updateProfile(_config, _account, _credentials, profile); if (url == null) { throw Exception('Failed to save profile'); } _state.setProfileFetching(); - final newProfile = await getProfileFromUrl(_config!, url); + final newProfile = await getProfileFromUrl(_config, url); if (newProfile == null) { throw Exception('Failed to load profile'); } @@ -462,7 +462,7 @@ class ProfileLogic { _accountBackupDBService.accounts.update( DBAccount( - alias: _config!.community.alias, + alias: _config.community.alias, address: EthereumAddress.fromHex(newProfile.account), name: newProfile.name, username: newProfile.username, @@ -503,7 +503,7 @@ class ProfileLogic { const baseDelay = Duration(milliseconds: 100); for (int tries = 1; tries <= maxTries; tries++) { - final exists = await profileExists(_config!, username); + final exists = await profileExists(_config, username); if (!exists) { return username; @@ -534,8 +534,8 @@ class ProfileLogic { _state.setUsernameSuccess(username: username); - final address = _account!.hexEip55; - final alias = _config!.community.alias; + final address = _account.hexEip55; + final alias = _config.community.alias; final account = await _accountBackupDBService.accounts .get(EthereumAddress.fromHex(address), alias); @@ -563,7 +563,7 @@ class ProfileLogic { return; } - final exists = await createAccount(_config!, _account!, _credentials!); + final exists = await createAccount(_config, _account, _credentials); if (!exists) { throw Exception('Failed to create account'); } @@ -573,9 +573,9 @@ class ProfileLogic { } final url = await setProfile( - _config!, - _account!, - _credentials!, + _config, + _account, + _credentials, ProfileRequest.fromProfileV1(profile), image: await _photos.photoFromBundle('assets/icons/profile.jpg'), fileType: '.jpg', @@ -588,7 +588,7 @@ class ProfileLogic { return; } - final newProfile = await getProfileFromUrl(_config!, url); + final newProfile = await getProfileFromUrl(_config, url); if (newProfile == null) { throw Exception('Failed to get profile from url $url'); } diff --git a/lib/state/profiles/logic.dart b/lib/state/profiles/logic.dart index 2823e5e5..59328419 100644 --- a/lib/state/profiles/logic.dart +++ b/lib/state/profiles/logic.dart @@ -19,9 +19,9 @@ class ProfilesLogic extends WidgetsBindingObserver { AccountBackupDBService(); late ProfilesState _state; - EthPrivateKey? _currentCredentials; - EthereumAddress? _currentAccount; - Config? _currentConfig; + late EthPrivateKey _currentCredentials; + late EthereumAddress _currentAccount; + late Config _currentConfig; late Debounce debouncedSearchProfile; @@ -60,7 +60,7 @@ class ProfilesLogic extends WidgetsBindingObserver { } final cachedProfile = await ContactsCache().get(addr, () async { - final fetchedProfile = await getProfile(_currentConfig!, addr); + final fetchedProfile = await getProfile(_currentConfig, addr); if (fetchedProfile == null) { return null; } @@ -143,8 +143,8 @@ class ProfilesLogic extends WidgetsBindingObserver { _state.isSearching(); final profile = cleanValue.startsWith('0x') - ? await getProfile(_currentConfig!, cleanValue) - : await getProfileByUsername(_currentConfig!, cleanValue); + ? await getProfile(_currentConfig, cleanValue) + : await getProfileByUsername(_currentConfig, cleanValue); final results = await _db.contacts.search(cleanValue.toLowerCase()); diff --git a/lib/state/scan/logic.dart b/lib/state/scan/logic.dart index f6a75ce0..e05b374e 100644 --- a/lib/state/scan/logic.dart +++ b/lib/state/scan/logic.dart @@ -20,9 +20,9 @@ class ScanLogic extends WidgetsBindingObserver { late ScanState _state; final NFCService _nfc = DefaultNFCService(); - EthPrivateKey? _currentCredentials; - EthereumAddress? _currentAccount; - Config? _currentConfig; + late EthPrivateKey _currentCredentials; + late EthereumAddress _currentAccount; + late Config _currentConfig; static void setGlobalWalletState(Config config, EthPrivateKey credentials, EthereumAddress account) { _instance.setWalletState(config, credentials, account); @@ -77,8 +77,8 @@ class ScanLogic extends WidgetsBindingObserver { _state.setNfcReading(false); // - final cardHash = await getCardHash(_currentConfig!, serialNumber); - final address = await getCardAddress(_currentConfig!, cardHash); + final cardHash = await getCardHash(_currentConfig, serialNumber); + final address = await getCardAddress(_currentConfig, cardHash); _state.setNfcAddressSuccess(address.hexEip55); diff --git a/lib/state/transaction.dart b/lib/state/transaction.dart index 0e97ef8d..2db1bf52 100644 --- a/lib/state/transaction.dart +++ b/lib/state/transaction.dart @@ -3,10 +3,8 @@ import 'dart:convert'; import 'package:citizenwallet/models/transaction.dart' as transaction_model; import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/db/account/db.dart'; -import 'package:citizenwallet/services/db/account/transactions.dart'; import 'package:citizenwallet/services/wallet/contracts/erc20.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; -import 'package:citizenwallet/services/wallet/wallet.dart'; import 'package:collection/collection.dart'; import 'package:flutter/cupertino.dart'; import 'package:web3dart/web3dart.dart'; diff --git a/lib/state/vouchers/logic.dart b/lib/state/vouchers/logic.dart index 9474ae30..2fadd1f8 100644 --- a/lib/state/vouchers/logic.dart +++ b/lib/state/vouchers/logic.dart @@ -29,9 +29,9 @@ class VoucherLogic extends WidgetsBindingObserver { final AccountDBService _accountDBService = AccountDBService(); final SharingService _sharing = SharingService(); - EthPrivateKey? _currentCredentials; - EthereumAddress? _currentAccount; - Config? _currentConfig; + late EthPrivateKey _currentCredentials; + late EthereumAddress _currentAccount; + late Config _currentConfig; late VoucherState _state; @@ -78,7 +78,7 @@ class VoucherLogic extends WidgetsBindingObserver { } try { final balance = - await getBalance(_currentConfig!, EthereumAddress.fromHex(addr)); + await getBalance(_currentConfig, EthereumAddress.fromHex(addr)); await _accountDBService.vouchers .updateBalance(addr, balance.toString()); @@ -113,7 +113,7 @@ class VoucherLogic extends WidgetsBindingObserver { } final vouchers = await _accountDBService.vouchers - .getAllByAlias(_currentConfig!.community.alias); + .getAllByAlias(_currentConfig.community.alias); _state.vouchersSuccess(vouchers .map( @@ -167,7 +167,7 @@ class VoucherLogic extends WidgetsBindingObserver { EthereumAddress account = uri.queryParameters['account'] != null ? EthereumAddress.fromHex(uri.queryParameters['account']!) : await getAccountAddress( - _currentConfig!, + _currentConfig, credentials.address.hexEip55, legacy: true, cache: false, @@ -221,7 +221,7 @@ class VoucherLogic extends WidgetsBindingObserver { } final balance = - await getBalance(_currentConfig!, EthereumAddress.fromHex(address)); + await getBalance(_currentConfig, EthereumAddress.fromHex(address)); await _accountDBService.vouchers.updateBalance(address, balance); @@ -236,12 +236,12 @@ class VoucherLogic extends WidgetsBindingObserver { legacy: dbvoucher.legacy, ); - if (_currentConfig!.community.alias == null) { + if (_currentConfig.community.alias.isEmpty) { throw Exception('alias not found'); } final community = - await _appDBService.communities.get(_currentConfig!.community.alias); + await _appDBService.communities.get(_currentConfig.community.alias); if (community == null) { throw Exception('community not found'); @@ -255,7 +255,7 @@ class VoucherLogic extends WidgetsBindingObserver { voucher, voucher.getLink( appLink, - _currentConfig!.getPrimaryToken().symbol, + _currentConfig.getPrimaryToken().symbol, dbvoucher.voucher, ), ); @@ -286,15 +286,15 @@ class VoucherLogic extends WidgetsBindingObserver { final doubleAmount = balance.replaceAll(',', '.'); final parsedAmount = toUnit( doubleAmount, - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ); - if (_currentConfig!.community.alias == null) { + if (_currentConfig.community.alias.isEmpty) { throw Exception('alias not found'); } final community = - await _appDBService.communities.get(_currentConfig!.community.alias); + await _appDBService.communities.get(_currentConfig.community.alias); if (community == null) { throw Exception('community not found'); @@ -311,7 +311,7 @@ class VoucherLogic extends WidgetsBindingObserver { final List vouchers = []; for (int i = 0; i < quantity; i++) { - addresses.add(_currentConfig!.getPrimaryToken().address); + addresses.add(_currentConfig.getPrimaryToken().address); final credentials = EthPrivateKey.createRandom(Random.secure()); @@ -323,7 +323,7 @@ class VoucherLogic extends WidgetsBindingObserver { ); final account = await getAccountAddress( - _currentConfig!, credentials.address.hexEip55); + _currentConfig, credentials.address.hexEip55); final dbvoucher = DBVoucher( address: account.hexEip55, @@ -332,7 +332,7 @@ class VoucherLogic extends WidgetsBindingObserver { balance: parsedAmount.toString(), voucher: wallet.toJson(), salt: salt, - creator: _currentAccount!.hexEip55, + creator: _currentAccount.hexEip55, legacy: false, ); @@ -340,8 +340,8 @@ class VoucherLogic extends WidgetsBindingObserver { // TODO: token id should be set calldata.add(tokenTransferCallData( - _currentConfig!, - _currentAccount!, + _currentConfig, + _currentAccount, account.hexEip55, parsedAmount, )); @@ -361,22 +361,22 @@ class VoucherLogic extends WidgetsBindingObserver { } final (_, userop) = await prepareUserop( - _currentConfig!, - _currentAccount!, - _currentCredentials!, + _currentConfig, + _currentAccount, + _currentCredentials, addresses, calldata, ); final txHash = await submitUserop( - _currentConfig!, + _currentConfig, userop, ); if (txHash == null) { throw Exception('transaction failed'); } - final success = await waitForTxSuccess(_currentConfig!, txHash); + final success = await waitForTxSuccess(_currentConfig, txHash); if (!success) { throw Exception('transaction failed'); } @@ -412,18 +412,18 @@ class VoucherLogic extends WidgetsBindingObserver { final doubleAmount = balance.replaceAll(',', '.'); final parsedAmount = toUnit( doubleAmount, - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ); final account = await getAccountAddress( - _currentConfig!, credentials.address.hexEip55); + _currentConfig, credentials.address.hexEip55); - if (_currentConfig!.community.alias == null) { + if (_currentConfig.community.alias.isEmpty) { throw Exception('alias not found'); } final community = - await _appDBService.communities.get(_currentConfig!.community.alias); + await _appDBService.communities.get(_currentConfig.community.alias); if (community == null) { throw Exception('community not found'); @@ -438,7 +438,7 @@ class VoucherLogic extends WidgetsBindingObserver { balance: parsedAmount.toString(), voucher: 'v2-${bytesToHex(credentials.privateKey)}', salt: salt, - creator: _currentAccount!.hexEip55, + creator: _currentAccount.hexEip55, legacy: false, ); @@ -447,31 +447,31 @@ class VoucherLogic extends WidgetsBindingObserver { // TODO: token id should be set final calldata = mint ? tokenMintCallData( - _currentConfig!, + _currentConfig, account.hexEip55, parsedAmount, ) : tokenTransferCallData( - _currentConfig!, - _currentAccount!, + _currentConfig, + _currentAccount, account.hexEip55, parsedAmount, ); final (_, userop) = await prepareUserop( - _currentConfig!, - _currentAccount!, - _currentCredentials!, - [_currentConfig!.getPrimaryToken().address], + _currentConfig, + _currentAccount, + _currentCredentials, + [_currentConfig.getPrimaryToken().address], [calldata], ); final args = { - 'from': _currentAccount!.hexEip55, + 'from': _currentAccount.hexEip55, 'to': account.hexEip55, }; - if (_currentConfig!.getPrimaryToken().standard == 'erc1155') { - args['operator'] = _currentAccount!.hexEip55; + if (_currentConfig.getPrimaryToken().standard == 'erc1155') { + args['operator'] = _currentAccount.hexEip55; args['id'] = '0'; args['amount'] = parsedAmount.toString(); } else { @@ -479,13 +479,13 @@ class VoucherLogic extends WidgetsBindingObserver { } final eventData = createEventData( - stringSignature: transferEventStringSignature(_currentConfig!), - topic: transferEventSignature(_currentConfig!), + stringSignature: transferEventStringSignature(_currentConfig), + topic: transferEventSignature(_currentConfig), args: args, ); final txHash = await submitUserop( - _currentConfig!, + _currentConfig, userop, data: eventData, extraData: TransferData(dbvoucher.name), @@ -516,7 +516,7 @@ class VoucherLogic extends WidgetsBindingObserver { ), ); - final success = await waitForTxSuccess(_currentConfig!, txHash); + final success = await waitForTxSuccess(_currentConfig, txHash); if (!success) { throw Exception('transaction failed'); } @@ -602,35 +602,35 @@ class VoucherLogic extends WidgetsBindingObserver { if (preSendingTransaction != null) { preSendingTransaction( - amount, tempId, _currentAccount!.hexEip55, voucher.address); + amount, tempId, _currentAccount.hexEip55, voucher.address); } final calldata = tokenTransferCallData( - _currentConfig!, - _currentAccount!, + _currentConfig, + _currentAccount, voucher.address, amount, ); final (hash, userop) = await prepareUserop( - _currentConfig!, - _currentAccount!, - _currentCredentials!, - [_currentConfig!.getPrimaryToken().address], + _currentConfig, + _currentAccount, + _currentCredentials, + [_currentConfig.getPrimaryToken().address], [calldata], customCredentials: credentials, ); if (sendingTransaction != null) { sendingTransaction( - amount, hash, _currentAccount!.hexEip55, voucher.address); + amount, hash, _currentAccount.hexEip55, voucher.address); } final args = { 'from': voucher.address, - 'to': _currentAccount!.hexEip55, + 'to': _currentAccount.hexEip55, }; - if (_currentConfig!.getPrimaryToken().standard == 'erc1155') { + if (_currentConfig.getPrimaryToken().standard == 'erc1155') { args['operator'] = voucher.address; args['id'] = '0'; args['amount'] = amount.toString(); @@ -639,13 +639,13 @@ class VoucherLogic extends WidgetsBindingObserver { } final eventData = createEventData( - stringSignature: transferEventStringSignature(_currentConfig!), - topic: transferEventSignature(_currentConfig!), + stringSignature: transferEventStringSignature(_currentConfig), + topic: transferEventSignature(_currentConfig), args: args, ); final txHash = await submitUserop( - _currentConfig!, + _currentConfig, userop, customCredentials: credentials, data: eventData, @@ -655,7 +655,7 @@ class VoucherLogic extends WidgetsBindingObserver { throw Exception('transaction failed'); } - final success = await waitForTxSuccess(_currentConfig!, txHash); + final success = await waitForTxSuccess(_currentConfig, txHash); if (!success) { throw Exception('transaction failed'); } diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index 2303f44e..25cfc21a 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -92,20 +92,15 @@ class WalletLogic extends WidgetsBindingObserver { EventService? _eventService; - EthPrivateKey? _currentCredentials; - EthereumAddress? _currentAccount; - Config? _currentConfig; - - SigAuthConnection? get connection { - if (_currentCredentials == null || - _currentAccount == null || - _currentConfig == null) { - return null; - } + late EthPrivateKey _currentCredentials; + late EthereumAddress _currentAccount; + late Config _currentConfig; + + SigAuthConnection get connection { return getSigAuthConnection( - _currentConfig!, - _currentAccount!, - _currentCredentials!, + _currentConfig, + _currentAccount, + _currentCredentials, dotenv.get('ORIGIN_HEADER'), ); } @@ -119,9 +114,9 @@ class WalletLogic extends WidgetsBindingObserver { TextEditingController get messageController => _messageController; String? get lastWallet => _preferences.lastWallet; - String get address => _currentCredentials?.address.hexEip55 ?? ''; - String get account => _currentAccount?.hexEip55 ?? ''; - String get token => _currentConfig?.getPrimaryToken().address ?? ''; + String get address => _currentCredentials.address.hexEip55; + String get account => _currentAccount.hexEip55; + String get token => _currentConfig.getPrimaryToken().address ; WalletLogic(BuildContext context, NotificationsLogic notificationsLogic) : _state = context.read(), @@ -149,13 +144,13 @@ class WalletLogic extends WidgetsBindingObserver { _currentCredentials != null && _currentAccount != null) { _notificationsLogic.setWalletState( - _currentConfig!, _currentCredentials!, _currentAccount!); + _currentConfig, _currentCredentials, _currentAccount); _profilesLogic?.setWalletState( - _currentConfig!, _currentCredentials!, _currentAccount!); + _currentConfig, _currentCredentials, _currentAccount); _voucherLogic?.setWalletState( - _currentConfig!, _currentCredentials!, _currentAccount!); + _currentConfig, _currentCredentials, _currentAccount); ScanLogic.setGlobalWalletState( - _currentConfig!, _currentCredentials!, _currentAccount!); + _currentConfig, _currentCredentials, _currentAccount); } } @@ -306,7 +301,7 @@ class WalletLogic extends WidgetsBindingObserver { _currentConfig = config; await _accountDBService.init( - 'wallet_${_currentCredentials!.address.hexEip55}'); // TODO: migrate to account address instead + 'wallet_${_currentCredentials.address.hexEip55}'); // TODO: migrate to account address instead ContactsCache().init(_accountDBService); @@ -317,9 +312,9 @@ class WalletLogic extends WidgetsBindingObserver { '0', name: 'Citizen Wallet', // on web, acts as a page's title, wallet is fitting here - address: _currentCredentials!.address.hexEip55, + address: _currentCredentials.address.hexEip55, alias: config.community.alias, - account: _currentAccount!.hexEip55, + account: _currentAccount.hexEip55, currencyName: token.name, symbol: token.symbol, currencyLogo: config.community.logo, @@ -329,9 +324,9 @@ class WalletLogic extends WidgetsBindingObserver { ), ); - getBalance(config, _currentAccount!) + getBalance(config, _currentAccount) .then((v) => _state.setWalletBalance(v)); - isMinter(config, _currentAccount!).then((v) => _state.setWalletMinter(v)); + isMinter(config, _currentAccount).then((v) => _state.setWalletMinter(v)); // Set wallet state in other logic classes setWalletStateInOtherLogic(); @@ -340,7 +335,7 @@ class WalletLogic extends WidgetsBindingObserver { _theme.changeTheme(config.community.theme); - await _preferences.setLastWallet(_currentCredentials!.address.hexEip55); + await _preferences.setLastWallet(_currentCredentials.address.hexEip55); await _preferences.setLastAlias(config.community.alias); await _preferences.setLastWalletLink(encoded); @@ -397,9 +392,9 @@ class WalletLogic extends WidgetsBindingObserver { ); if (isWalletLoaded && - accAddress == _currentAccount?.hexEip55 && + accAddress == _currentAccount.hexEip55 && alias == communityConfig.community.alias) { - getBalance(communityConfig, _currentAccount!).then((v) { + getBalance(communityConfig, _currentAccount).then((v) { _state.updateWalletBalanceSuccess(v); }); @@ -432,7 +427,7 @@ class WalletLogic extends WidgetsBindingObserver { _currentConfig = communityConfig; await _accountDBService.init( - 'wallet_${_currentCredentials!.address.hexEip55}'); // TODO: migrate to account address instead + 'wallet_${_currentCredentials.address.hexEip55}'); // TODO: migrate to account address instead ContactsCache().init(_accountDBService); @@ -457,7 +452,7 @@ class WalletLogic extends WidgetsBindingObserver { name: dbWallet.name, address: dbWallet.address.hexEip55, alias: dbWallet.alias, - account: _currentAccount!.hexEip55, + account: _currentAccount.hexEip55, currencyName: token.name, symbol: token.symbol, currencyLogo: communityConfig.community.logo, @@ -468,7 +463,7 @@ class WalletLogic extends WidgetsBindingObserver { ), ); - getBalance(communityConfig, _currentAccount!) + getBalance(communityConfig, _currentAccount) .then((v) => _state.setWalletBalance(v)); // Set wallet state in other logic classes @@ -654,8 +649,8 @@ class WalletLogic extends WidgetsBindingObserver { Future transferEventSubscribe() async { try { - final alias = _currentConfig?.community.alias ?? ''; - if (alias == null) { + final alias = _currentConfig.community.alias; + if (alias.isEmpty) { return; } @@ -678,7 +673,7 @@ class WalletLogic extends WidgetsBindingObserver { _eventService = EventService( communityConfig.chains[token.chainId.toString()]!.node.wsUrl, token.address, - transferEventSignature(_currentConfig!), + transferEventSignature(_currentConfig), ); _eventService!.setMessageHandler(handleTransferEvent); @@ -716,10 +711,10 @@ class WalletLogic extends WidgetsBindingObserver { final log = Log.fromJson(event.data); final tx = TransferEvent.fromLog(log, - standard: _currentConfig!.getPrimaryToken().standard); + standard: _currentConfig.getPrimaryToken().standard); // TODO: fix this on the websocket side - final myAccount = _currentAccount!.hexEip55; + final myAccount = _currentAccount.hexEip55; if (tx.from.hexEip55 != myAccount && tx.to.hexEip55 != myAccount) { return; } @@ -736,18 +731,18 @@ class WalletLogic extends WidgetsBindingObserver { value: tx.value.toString(), data: tx.data != null ? jsonEncode(tx.data?.toJson()) : '', status: tx.status, - contract: _currentConfig!.getPrimaryToken().address, + contract: _currentConfig.getPrimaryToken().address, )); final txList = [ CWTransaction( fromDoubleUnit( tx.value.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: tx.hash, hash: tx.txhash, - chainId: _currentConfig!.chains.values.first.id, + chainId: _currentConfig.chains.values.first.id, from: tx.from.hexEip55, to: tx.to.hexEip55, description: tx.data?.description ?? '', @@ -756,7 +751,7 @@ class WalletLogic extends WidgetsBindingObserver { ]; incomingTxNotification(txList.where((element) => - element.to == _currentAccount!.hexEip55 && + element.to == _currentAccount.hexEip55 && element.state != TransactionState.success)); _state.incomingTransactionsRequestSuccess(txList); @@ -778,7 +773,7 @@ class WalletLogic extends WidgetsBindingObserver { if (incomingTxCount > 0 && incomingTxCount > _incomingTxCount) { // _lastIncomingTx = incomingTx.first; _notificationsLogic.show( - 'Receiving ${incomingTx.first.amount} ${_currentConfig!.getPrimaryToken().symbol}...', + 'Receiving ${incomingTx.first.amount} ${_currentConfig.getPrimaryToken().symbol}...', ); } @@ -863,20 +858,20 @@ class WalletLogic extends WidgetsBindingObserver { final List txs = (await _accountDBService.transactions.getPreviousTransactions( maxDate, - _currentConfig!.getPrimaryToken().address, + _currentConfig.getPrimaryToken().address, "0", // TODO: remove tokenId hardcode - _currentAccount!.hexEip55, + _currentAccount.hexEip55, offset: 0, limit: limit, )) .map((dbtx) => CWTransaction( fromDoubleUnit( dbtx.value.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: dbtx.hash, hash: dbtx.txHash, - chainId: _currentConfig!.chains.values.first.id, + chainId: _currentConfig.chains.values.first.id, from: EthereumAddress.fromHex(dbtx.from).hexEip55, to: EthereumAddress.fromHex(dbtx.to).hexEip55, description: dbtx.data != '' @@ -894,8 +889,8 @@ class WalletLogic extends WidgetsBindingObserver { if (txs.isEmpty || (txs.isNotEmpty && txs.first.date.isBefore(maxDate))) { // nothing in the db or slightly less than there could be, check remote final (remoteTxs, _) = await fetchErc20Transfers( - _currentConfig!, - _currentAccount!.hexEip55, + _currentConfig, + _currentAccount.hexEip55, offset: 0, limit: limit, maxDate: maxDate, @@ -914,7 +909,7 @@ class WalletLogic extends WidgetsBindingObserver { value: tx.value.toString(), data: tx.data != null ? jsonEncode(tx.data?.toJson()) : '', status: tx.status, - contract: _currentConfig!.getPrimaryToken().address, + contract: _currentConfig.getPrimaryToken().address, ), ); @@ -926,11 +921,11 @@ class WalletLogic extends WidgetsBindingObserver { txs.addAll(iterableRemoteTxs.map((dbtx) => CWTransaction( fromDoubleUnit( dbtx.value.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: dbtx.hash, hash: dbtx.txHash, - chainId: _currentConfig!.chains.values.first.id, + chainId: _currentConfig.chains.values.first.id, from: EthereumAddress.fromHex(dbtx.from).hexEip55, to: EthereumAddress.fromHex(dbtx.to).hexEip55, description: dbtx.data != '' @@ -952,7 +947,7 @@ class WalletLogic extends WidgetsBindingObserver { maxDate: maxDate, ); - getBalance(_currentConfig!, _currentAccount!).then((v) { + getBalance(_currentConfig, _currentAccount).then((v) { _state.updateWalletBalanceSuccess(v); }); @@ -974,20 +969,20 @@ class WalletLogic extends WidgetsBindingObserver { final List txs = (await _accountDBService.transactions.getPreviousTransactions( maxDate, - _currentConfig!.getPrimaryToken().address, + _currentConfig.getPrimaryToken().address, "0", // TODO: remove tokenId hardcode - _currentAccount!.hexEip55, + _currentAccount.hexEip55, offset: offset, limit: limit, )) .map((dbtx) => CWTransaction( fromDoubleUnit( dbtx.value.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: dbtx.hash, hash: dbtx.txHash, - chainId: _currentConfig!.chains.values.first.id, + chainId: _currentConfig.chains.values.first.id, from: EthereumAddress.fromHex(dbtx.from).hexEip55, to: EthereumAddress.fromHex(dbtx.to).hexEip55, description: dbtx.data != '' @@ -1005,8 +1000,8 @@ class WalletLogic extends WidgetsBindingObserver { if (txs.isEmpty || txs.length < limit) { // nothing in the db or slightly less than there could be, check remote final (remoteTxs, _) = await fetchErc20Transfers( - _currentConfig!, - _currentAccount!.hexEip55, + _currentConfig, + _currentAccount.hexEip55, offset: offset, limit: limit, maxDate: maxDate, @@ -1025,7 +1020,7 @@ class WalletLogic extends WidgetsBindingObserver { value: tx.value.toString(), data: tx.data != null ? jsonEncode(tx.data?.toJson()) : '', status: tx.status, - contract: _currentConfig!.getPrimaryToken().address, + contract: _currentConfig.getPrimaryToken().address, ), ); @@ -1037,11 +1032,11 @@ class WalletLogic extends WidgetsBindingObserver { txs.addAll(iterableRemoteTxs.map((dbtx) => CWTransaction( fromDoubleUnit( dbtx.value.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: dbtx.hash, hash: dbtx.txHash, - chainId: _currentConfig!.chains.values.first.id, + chainId: _currentConfig.chains.values.first.id, from: EthereumAddress.fromHex(dbtx.from).hexEip55, to: EthereumAddress.fromHex(dbtx.to).hexEip55, description: dbtx.data != '' @@ -1069,11 +1064,11 @@ class WalletLogic extends WidgetsBindingObserver { Future updateBalance() async { try { - if (_currentConfig?.community.alias == null) { + if (_currentConfig.community.alias.isEmpty) { throw Exception('alias not found'); } - final balance = await getBalance(_currentConfig!, _currentAccount!); + final balance = await getBalance(_currentConfig, _currentAccount); final currentDoubleBalance = double.tryParse(_state.wallet?.balance ?? '0.0') ?? 0.0; @@ -1138,7 +1133,7 @@ class WalletLogic extends WidgetsBindingObserver { final balance = double.tryParse(_state.wallet?.balance ?? '0.0') ?? 0.0; final doubleAmount = double.parse(toUnit( amount.replaceAll(',', '.'), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ).toString()); return doubleAmount == 0 || doubleAmount > balance; @@ -1165,11 +1160,11 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.sending( fromDoubleUnit( amount.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: tempId, hash: '', - chainId: _currentConfig!.chains.values.first.id, + chainId: _currentConfig.chains.values.first.id, from: from, to: to, description: message, @@ -1189,11 +1184,11 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.pending( fromDoubleUnit( amount.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: hash, hash: '', - chainId: _currentConfig!.chains.values.first.id, + chainId: _currentConfig.chains.values.first.id, to: to, from: from, description: message, @@ -1212,7 +1207,7 @@ class WalletLogic extends WidgetsBindingObserver { final doubleAmount = amount.replaceAll(',', '.'); final parsedAmount = toUnit( doubleAmount, - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ); var tempId = id ?? '${pendingTransactionId}_${generateRandomId()}'; @@ -1229,32 +1224,32 @@ class WalletLogic extends WidgetsBindingObserver { parsedAmount, tempId, to, - _currentAccount!.hexEip55, + _currentAccount.hexEip55, message: message, ); // TODO: token id should be set final calldata = tokenTransferCallData( - _currentConfig!, - _currentAccount!, + _currentConfig, + _currentAccount, to, parsedAmount, ); final (hash, userop) = await prepareUserop( - _currentConfig!, - _currentAccount!, - _currentCredentials!, - [_currentConfig!.getPrimaryToken().address], + _currentConfig, + _currentAccount, + _currentCredentials, + [_currentConfig.getPrimaryToken().address], [calldata], ); final args = { - 'from': _currentAccount!.hexEip55, + 'from': _currentAccount.hexEip55, 'to': to, }; - if (_currentConfig!.getPrimaryToken().standard == 'erc1155') { - args['operator'] = _currentAccount!.hexEip55; + if (_currentConfig.getPrimaryToken().standard == 'erc1155') { + args['operator'] = _currentAccount.hexEip55; args['id'] = '0'; args['amount'] = parsedAmount.toString(); } else { @@ -1262,13 +1257,13 @@ class WalletLogic extends WidgetsBindingObserver { } final eventData = createEventData( - stringSignature: transferEventStringSignature(_currentConfig!), - topic: transferEventSignature(_currentConfig!), + stringSignature: transferEventStringSignature(_currentConfig), + topic: transferEventSignature(_currentConfig), args: args, ); final txHash = await submitUserop( - _currentConfig!, + _currentConfig, userop, data: eventData, extraData: message != '' ? TransferData(message) : null, @@ -1282,12 +1277,12 @@ class WalletLogic extends WidgetsBindingObserver { parsedAmount, tempId, to, - _currentAccount!.hexEip55, + _currentAccount.hexEip55, message: message, ); if (userop.isFirst()) { - waitForTxSuccess(_currentConfig!, txHash).then((value) { + waitForTxSuccess(_currentConfig, txHash).then((value) { if (!value) { return; } @@ -1310,7 +1305,7 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1324,7 +1319,7 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1334,13 +1329,13 @@ class WalletLogic extends WidgetsBindingObserver { error: NetworkInvalidBalanceException().message), ); } catch (e, s) { - print('error: $e'); - print('stack: $s'); + debugPrint('error: $e'); + debugPrint('stack: $s'); _state.sendQueueAddTransaction( CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1372,16 +1367,16 @@ class WalletLogic extends WidgetsBindingObserver { final calldata = hexToBytes(data); final (hash, userop) = await prepareUserop( - _currentConfig!, - _currentAccount!, - _currentCredentials!, + _currentConfig, + _currentAccount, + _currentCredentials, [to], [calldata], value: BigInt.parse(value.isEmpty ? '0' : value), ); final txHash = await submitUserop( - _currentConfig!, + _currentConfig, userop, ); if (txHash == null) { @@ -1390,7 +1385,7 @@ class WalletLogic extends WidgetsBindingObserver { } if (userop.isFirst()) { - waitForTxSuccess(_currentConfig!, txHash).then((value) { + waitForTxSuccess(_currentConfig, txHash).then((value) { if (!value) { return; } @@ -1410,8 +1405,8 @@ class WalletLogic extends WidgetsBindingObserver { } on NetworkInvalidBalanceException { // } catch (e, s) { - print('error: $e'); - print('stack: $s'); + debugPrint('error: $e'); + debugPrint('stack: $s'); } _state.sendCallDataTransactionError(); @@ -1429,7 +1424,7 @@ class WalletLogic extends WidgetsBindingObserver { final doubleAmount = amount.replaceAll(',', '.'); final parsedAmount = toUnit( doubleAmount, - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ); var tempId = id ?? '${pendingTransactionId}_${generateRandomId()}'; @@ -1446,30 +1441,30 @@ class WalletLogic extends WidgetsBindingObserver { parsedAmount, tempId, to, - _currentAccount!.hexEip55, + _currentAccount.hexEip55, ); final calldata = tokenTransferCallData( - _currentConfig!, - _currentAccount!, + _currentConfig, + _currentAccount, to, parsedAmount, ); final (hash, userop) = await prepareUserop( - _currentConfig!, - _currentAccount!, - _currentCredentials!, - [_currentConfig!.getPrimaryToken().address], + _currentConfig, + _currentAccount, + _currentCredentials, + [_currentConfig.getPrimaryToken().address], [calldata], ); final args = { - 'from': _currentAccount!.hexEip55, + 'from': _currentAccount.hexEip55, 'to': to, }; - if (_currentConfig!.getPrimaryToken().standard == 'erc1155') { - args['operator'] = _currentAccount!.hexEip55; + if (_currentConfig.getPrimaryToken().standard == 'erc1155') { + args['operator'] = _currentAccount.hexEip55; args['id'] = '0'; args['amount'] = parsedAmount.toString(); } else { @@ -1477,13 +1472,13 @@ class WalletLogic extends WidgetsBindingObserver { } final eventData = createEventData( - stringSignature: transferEventStringSignature(_currentConfig!), - topic: transferEventSignature(_currentConfig!), + stringSignature: transferEventStringSignature(_currentConfig), + topic: transferEventSignature(_currentConfig), args: args, ); final txHash = await submitUserop( - _currentConfig!, + _currentConfig, userop, data: eventData, extraData: message != '' ? TransferData(message) : null, @@ -1497,13 +1492,13 @@ class WalletLogic extends WidgetsBindingObserver { parsedAmount, tempId, to, - _currentAccount!.hexEip55, + _currentAccount.hexEip55, message: message, ); if (userop.isFirst()) { // an account was created, update push token in the background - waitForTxSuccess(_currentConfig!, txHash).then((value) { + waitForTxSuccess(_currentConfig, txHash).then((value) { if (!value) { return; } @@ -1526,7 +1521,7 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1540,7 +1535,7 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1554,7 +1549,7 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( parsedAmount.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: tempId, hash: '', @@ -1579,7 +1574,7 @@ class WalletLogic extends WidgetsBindingObserver { final doubleAmount = amount.replaceAll(',', '.'); final parsedAmount = toUnit( doubleAmount, - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ); var tempId = id ?? '${pendingTransactionId}_${generateRandomId()}'; @@ -1602,16 +1597,16 @@ class WalletLogic extends WidgetsBindingObserver { // TODO: token id should be set final calldata = tokenMintCallData( - _currentConfig!, + _currentConfig, to, parsedAmount, ); final (_, userop) = await prepareUserop( - _currentConfig!, - _currentAccount!, - _currentCredentials!, - [_currentConfig!.getPrimaryToken().address], + _currentConfig, + _currentAccount, + _currentCredentials, + [_currentConfig.getPrimaryToken().address], [calldata], ); @@ -1619,8 +1614,8 @@ class WalletLogic extends WidgetsBindingObserver { 'from': zeroAddress, 'to': to, }; - if (_currentConfig!.getPrimaryToken().standard == 'erc1155') { - args['operator'] = _currentAccount!.hexEip55; + if (_currentConfig.getPrimaryToken().standard == 'erc1155') { + args['operator'] = _currentAccount.hexEip55; args['id'] = '0'; args['amount'] = parsedAmount.toString(); } else { @@ -1628,13 +1623,13 @@ class WalletLogic extends WidgetsBindingObserver { } final eventData = createEventData( - stringSignature: transferEventStringSignature(_currentConfig!), - topic: transferEventSignature(_currentConfig!), + stringSignature: transferEventStringSignature(_currentConfig), + topic: transferEventSignature(_currentConfig), args: args, ); final txHash = await submitUserop( - _currentConfig!, + _currentConfig, userop, data: eventData, extraData: message != '' ? TransferData(message) : null, @@ -1654,7 +1649,7 @@ class WalletLogic extends WidgetsBindingObserver { if (userop.isFirst()) { // an account was created, update push token in the background - waitForTxSuccess(_currentConfig!, txHash).then((value) { + waitForTxSuccess(_currentConfig, txHash).then((value) { if (!value) { return; } @@ -1679,11 +1674,11 @@ class WalletLogic extends WidgetsBindingObserver { CWTransaction.failed( fromDoubleUnit( amount.toString(), - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ), id: tempId, hash: '', - chainId: _currentConfig!.chains.values.first.id, + chainId: _currentConfig.chains.values.first.id, to: to, from: zeroAddress, description: message.isNotEmpty ? message : 'Failed to mint token', @@ -1736,7 +1731,7 @@ class WalletLogic extends WidgetsBindingObserver { void setMaxAmount() { _amountController.text = fromDoubleUnit( _state.wallet?.balance ?? '0.0', - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ); updateAmount(); } @@ -1821,7 +1816,7 @@ class WalletLogic extends WidgetsBindingObserver { if (format == QRFormat.eip681Transfer) { final amount = fromDoubleUnit( parsedData.amount!, - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, ); _amountController.text = amount; } else { @@ -1837,7 +1832,7 @@ class WalletLogic extends WidgetsBindingObserver { } catch (_) { String username = parsedData.address; ProfileV1? profile = - await getProfileByUsername(_currentConfig!, username); + await getProfileByUsername(_currentConfig, username); if (profile != null) { addressToUse = profile.account; } else { @@ -1879,12 +1874,12 @@ class WalletLogic extends WidgetsBindingObserver { try { updateListenerAmount(); - if (_currentConfig?.community.alias == null) { + if (_currentConfig.community.alias.isEmpty) { throw Exception('alias not found'); } final community = - await _appDBService.communities.get(_currentConfig!.community.alias!); + await _appDBService.communities.get(_currentConfig.community.alias); if (community == null) { throw Exception('community not found'); @@ -1896,12 +1891,12 @@ class WalletLogic extends WidgetsBindingObserver { if (onlyHex != null && onlyHex) { _state.updateReceiveQR( - '$url?sendto=${_currentAccount!.hexEip55}@${communityConfig.community.alias}'); + '$url?sendto=${_currentAccount.hexEip55}@${communityConfig.community.alias}'); return; } String params = - 'sendto=${_currentAccount!.hexEip55}@${communityConfig.community.alias}'; + 'sendto=${_currentAccount.hexEip55}@${communityConfig.community.alias}'; if (_amountController.value.text.isNotEmpty) { final double amount = _amountController.value.text.isEmpty @@ -1936,7 +1931,7 @@ class WalletLogic extends WidgetsBindingObserver { void updateWalletQR() async { try { - _state.updateWalletQR(_currentAccount!.hexEip55); + _state.updateWalletQR(_currentAccount.hexEip55); return; } catch (_) {} @@ -1949,7 +1944,7 @@ class WalletLogic extends WidgetsBindingObserver { void copyWalletAccount() { try { - Clipboard.setData(ClipboardData(text: _currentAccount!.hexEip55)); + Clipboard.setData(ClipboardData(text: _currentAccount.hexEip55)); } catch (_) {} } @@ -2028,7 +2023,7 @@ class WalletLogic extends WidgetsBindingObserver { _amountController.text = double.parse('${toUnit( amount, - decimals: _currentConfig!.getPrimaryToken().decimals, + decimals: _currentConfig.getPrimaryToken().decimals, )}') .toStringAsFixed(2); @@ -2046,21 +2041,21 @@ class WalletLogic extends WidgetsBindingObserver { final now = DateTime.now().toUtc().add(const Duration(seconds: 30)); final redirectUrl = - '$appUniversalURL/?alias=${_currentConfig!.community.alias}'; + '$appUniversalURL/?alias=${_currentConfig.community.alias}'; final encodedRedirectUrl = Uri.encodeComponent(redirectUrl); final parsedURL = Uri.parse(appUniversalURL); if (pluginConfig.signature) { return ( - '${pluginConfig.url}${pluginConfig.url.contains('?') ? '&' : '?'}${connection!.queryParams}', + '${pluginConfig.url}${pluginConfig.url.contains('?') ? '&' : '?'}${connection.queryParams}', parsedURL.scheme != 'https' ? parsedURL.scheme : null, redirectUrl, ); } return ( - '${pluginConfig.url}?account=${_currentAccount!.hexEip55}&expiry=${now.millisecondsSinceEpoch}&redirectUrl=$encodedRedirectUrl&signature=0x123', + '${pluginConfig.url}?account=${_currentAccount.hexEip55}&expiry=${now.millisecondsSinceEpoch}&redirectUrl=$encodedRedirectUrl&signature=0x123', parsedURL.scheme != 'https' ? parsedURL.scheme : null, redirectUrl, ); @@ -2145,14 +2140,14 @@ class WalletLogic extends WidgetsBindingObserver { resumeFetching(); loadTransactions(); - if (_currentConfig?.community.alias == null) { + if (_currentConfig.community.alias.isEmpty) { return; } await updateBalance(); final community = await _appDBService.communities - .get(_currentConfig!.community.alias); + .get(_currentConfig.community.alias); if (community == null) { return; @@ -2199,7 +2194,7 @@ class WalletLogic extends WidgetsBindingObserver { )); try { - final isMinterResult = await isMinter(_currentConfig!, _currentAccount!); + final isMinterResult = await isMinter(_currentConfig, _currentAccount); _state.setWalletMinter(isMinterResult); if (isMinterResult) { @@ -2211,7 +2206,7 @@ class WalletLogic extends WidgetsBindingObserver { } catch (_) {} try { - final alias = _currentConfig!.community.alias; + final alias = _currentConfig.community.alias; final community = await _appDBService.communities.get(alias); if (community != null) { diff --git a/lib/state/wallet_connect/logic.dart b/lib/state/wallet_connect/logic.dart index d41a399b..84c332d2 100644 --- a/lib/state/wallet_connect/logic.dart +++ b/lib/state/wallet_connect/logic.dart @@ -8,7 +8,6 @@ import 'package:citizenwallet/state/wallet_connect/state.dart'; import 'package:provider/provider.dart'; import 'package:citizenwallet/widgets/wallet_session_approval.dart'; import 'package:citizenwallet/services/config/config.dart'; -import 'package:web3dart/web3dart.dart'; import 'dart:async'; class WalletKitLogic with WidgetsBindingObserver { @@ -20,9 +19,9 @@ class WalletKitLogic with WidgetsBindingObserver { WalletConnectState? _state; // Wallet state for handlers - Config? _config; - EthereumAddress? _account; - EthPrivateKey? _credentials; + late Config _config; + late EthereumAddress _account; + late EthPrivateKey _credentials; ReownWalletKit? get connectClient => _service.client; SessionProposalEvent? get currentProposal => _currentProposal; @@ -397,7 +396,7 @@ class WalletKitLogic with WidgetsBindingObserver { String? transactionType; try { final contractData = await _service.getContractDetails(transaction['to']); - if (contractData != null && contractData.abi != null) { + if (contractData != null && contractData.abi.isNotEmpty) { transactionType = _service.getTransactionTypeFromAbi( contractData.abi, transaction['data'] ?? '', diff --git a/lib/widgets/communities/community_row.dart b/lib/widgets/communities/community_row.dart index 78111821..5ed71fa7 100644 --- a/lib/widgets/communities/community_row.dart +++ b/lib/widgets/communities/community_row.dart @@ -3,7 +3,6 @@ import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/widgets/coin_logo.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter_svg/svg.dart'; class CommunityRow extends StatelessWidget { final Config config; diff --git a/lib/widgets/scanner/scanner.dart b/lib/widgets/scanner/scanner.dart index b9fc94f1..1f964538 100644 --- a/lib/widgets/scanner/scanner.dart +++ b/lib/widgets/scanner/scanner.dart @@ -4,7 +4,6 @@ import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/utils/delay.dart'; import 'package:citizenwallet/widgets/borders/border_painter.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:lottie/lottie.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; diff --git a/lib/widgets/wallet_transaction_modal.dart b/lib/widgets/wallet_transaction_modal.dart index 1bea87ea..4e78edca 100644 --- a/lib/widgets/wallet_transaction_modal.dart +++ b/lib/widgets/wallet_transaction_modal.dart @@ -32,7 +32,6 @@ class _WalletTransactionModalState extends State { initState() { super.initState(); - print(widget.event); } void _handleConfirm() { diff --git a/lib/widgets/webview/connected_webview_modal.dart b/lib/widgets/webview/connected_webview_modal.dart index 12ab23e1..99c9e8a3 100644 --- a/lib/widgets/webview/connected_webview_modal.dart +++ b/lib/widgets/webview/connected_webview_modal.dart @@ -11,7 +11,6 @@ import 'package:flutter/services.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:go_router/go_router.dart'; import 'package:citizenwallet/widgets/webview/webview_navigation.dart'; -import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; class ConnectedWebViewModal extends StatefulWidget { final String? modalKey; @@ -79,7 +78,6 @@ class _WebViewModalState extends State { void handleConsoleMessage( InAppWebViewController controller, ConsoleMessage message) { - print('>>>> ${message.message}'); } Future shouldOverrideUrlLoading( diff --git a/lib/widgets/webview/webview_navigation.dart b/lib/widgets/webview/webview_navigation.dart index d132b192..c5247cef 100644 --- a/lib/widgets/webview/webview_navigation.dart +++ b/lib/widgets/webview/webview_navigation.dart @@ -1,6 +1,5 @@ import 'package:flutter/cupertino.dart'; import 'package:citizenwallet/theme/provider.dart'; -import 'package:citizenwallet/l10n/app_localizations.dart'; class WebViewNavigation extends StatelessWidget { final String? url; diff --git a/test/router_extension.dart b/test/router_extension.dart index 4bcbd02b..453068c1 100644 --- a/test/router_extension.dart +++ b/test/router_extension.dart @@ -1,7 +1,6 @@ import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:citizenwallet/state/theme/state.dart'; import 'package:citizenwallet/theme/provider.dart'; -import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:citizenwallet/state/state.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/scheduler.dart'; From 970aa16dcb77baa7a00b3cbd036902c5f6030db6 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Fri, 25 Jul 2025 12:48:21 +0530 Subject: [PATCH 05/46] fixed conflict --- lib/modals/wallet/voucher_read.dart | 22 ++++++++++ lib/router/router.dart | 1 + lib/screens/send/send_details.dart | 31 +++++++++++--- lib/screens/send/tip_details.dart | 56 ++++++++++++++++++-------- lib/screens/voucher/screen.dart | 13 ++++++ lib/screens/vouchers/screen.dart | 29 ++++++++++++- lib/screens/vouchers/voucher_read.dart | 10 +++++ lib/screens/wallet/screen.dart | 6 +++ lib/state/profiles/logic.dart | 7 ++++ lib/state/vouchers/logic.dart | 44 ++++++++++++++------ lib/state/wallet/logic.dart | 19 +++++---- 11 files changed, 195 insertions(+), 43 deletions(-) diff --git a/lib/modals/wallet/voucher_read.dart b/lib/modals/wallet/voucher_read.dart index 20aa15a0..cd723a61 100644 --- a/lib/modals/wallet/voucher_read.dart +++ b/lib/modals/wallet/voucher_read.dart @@ -67,6 +67,15 @@ class VoucherReadModalState extends State } void onLoad() async { + final walletLogic = widget.logic; + if (walletLogic.config != null && walletLogic.credentials != null && walletLogic.accountAddress != null) { + _logic.setWalletState( + walletLogic.config!, + walletLogic.credentials!, + walletLogic.accountAddress!, + ); + } + final voucher = await _logic.openVoucher(widget.address); if (voucher == null) { @@ -81,6 +90,19 @@ class VoucherReadModalState extends State } void handleRedeem() async { + print('handleRedeem called for address: ${widget.address}'); + + // Initialize voucher logic if not already initialized + final walletLogic = widget.logic; + if (walletLogic.config != null && walletLogic.credentials != null && walletLogic.accountAddress != null) { + print('Initializing voucher logic in handleRedeem'); + _logic.setWalletState( + walletLogic.config!, + walletLogic.credentials!, + walletLogic.accountAddress!, + ); + } + final navigator = GoRouter.of(context); _logic.returnVoucher( diff --git a/lib/router/router.dart b/lib/router/router.dart index 116170c6..140dbcbc 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -393,6 +393,7 @@ GoRouter createRouter( address: state.pathParameters['voucher'] ?? '', amount: extra['amount'], logo: extra['logo'], + walletLogic: extra['walletLogic'], ); }, ), diff --git a/lib/screens/send/send_details.dart b/lib/screens/send/send_details.dart index 6b3f8f9e..4b0ad510 100644 --- a/lib/screens/send/send_details.dart +++ b/lib/screens/send/send_details.dart @@ -123,16 +123,37 @@ class _SendDetailsScreenState extends State { final voucherLogic = widget.voucherLogic; if (voucherLogic == null) { + setState(() { + _isSending = false; + }); return; } final walletLogic = widget.walletLogic; - voucherLogic.createVoucher( - balance: widget.walletLogic.amountController.value.text, - symbol: symbol, - mint: mint, - ); + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { + voucherLogic.setWalletState( + walletLogic.config!, + walletLogic.credentials!, + walletLogic.accountAddress!, + ); + } + + try { + voucherLogic.createVoucher( + balance: widget.walletLogic.amountController.value.text, + symbol: symbol, + mint: mint, + ); + } catch (e) { + debugPrint('Error creating voucher: $e'); + setState(() { + _isSending = false; + }); + return; + } voucherLogic.shareReady(); diff --git a/lib/screens/send/tip_details.dart b/lib/screens/send/tip_details.dart index f0e2c65c..d1aa7c05 100644 --- a/lib/screens/send/tip_details.dart +++ b/lib/screens/send/tip_details.dart @@ -69,18 +69,6 @@ class _TipDetailsScreenState extends State { WidgetsBinding.instance.addPostFrameCallback((_) async { final walletLogic = widget.walletLogic; - final tipTo = context.read().tipTo; - - if (tipTo != null) { - try { - final profile = await widget.profilesLogic.getLocalProfile(tipTo); - if (profile != null) { - widget.profilesLogic.selectProfile(profile); - } - } catch (e) { - debugPrint('Error fetching profile: $e'); - } - } onLoad(); @@ -118,6 +106,19 @@ class _TipDetailsScreenState extends State { void onLoad() async { await delay(const Duration(milliseconds: 250)); + final tipTo = context.read().tipTo; + + if (tipTo != null) { + try { + final profile = await widget.profilesLogic.getLocalProfile(tipTo); + if (profile != null) { + widget.profilesLogic.selectProfile(profile); + } + } catch (e) { + debugPrint('Error fetching profile: $e'); + } + } + amountFocusNode.requestFocus(); messageFocusNode.addListener(_onMessageFocusChange); } @@ -147,16 +148,37 @@ class _TipDetailsScreenState extends State { final voucherLogic = widget.voucherLogic; if (voucherLogic == null) { + setState(() { + _isSending = false; + }); return; } final walletLogic = widget.walletLogic; - voucherLogic.createVoucher( - balance: widget.walletLogic.amountController.value.text, - symbol: symbol, - mint: mint, - ); + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { + voucherLogic.setWalletState( + walletLogic.config!, + walletLogic.credentials!, + walletLogic.accountAddress!, + ); + } + + try { + voucherLogic.createVoucher( + balance: widget.walletLogic.amountController.value.text, + symbol: symbol, + mint: mint, + ); + } catch (e) { + debugPrint('Error creating voucher: $e'); + setState(() { + _isSending = false; + }); + return; + } voucherLogic.shareReady(); diff --git a/lib/screens/voucher/screen.dart b/lib/screens/voucher/screen.dart index a8cff67e..1c09f2d6 100644 --- a/lib/screens/voucher/screen.dart +++ b/lib/screens/voucher/screen.dart @@ -1,5 +1,6 @@ import 'package:citizenwallet/state/vouchers/logic.dart'; import 'package:citizenwallet/state/vouchers/state.dart'; +import 'package:citizenwallet/state/wallet/logic.dart'; import 'package:citizenwallet/state/wallet/state.dart'; import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/widgets/blurry_child.dart'; @@ -18,12 +19,14 @@ class VoucherScreen extends StatefulWidget { final String address; final String amount; final String? logo; + final WalletLogic walletLogic; const VoucherScreen({ super.key, required this.address, required this.amount, this.logo = 'assets/icons/voucher.svg', + required this.walletLogic, }); @override @@ -61,6 +64,16 @@ class VoucherViewModalState extends State } void onLoad() async { + final walletLogic = widget.walletLogic; + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { + _logic.setWalletState( + walletLogic.config!, + walletLogic.credentials!, + walletLogic.accountAddress!, + ); + } _logic.openVoucher(widget.address); } diff --git a/lib/screens/vouchers/screen.dart b/lib/screens/vouchers/screen.dart index adaa7929..9e6e8888 100644 --- a/lib/screens/vouchers/screen.dart +++ b/lib/screens/vouchers/screen.dart @@ -61,6 +61,17 @@ class VouchersScreenState extends State { } void onLoad() async { + final walletLogic = widget.walletLogic; + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { + _logic.setWalletState( + walletLogic.config!, + walletLogic.credentials!, + walletLogic.accountAddress!, + ); + } + await _logic.fetchVouchers(); } @@ -87,6 +98,7 @@ class VouchersScreenState extends State { await navigator.push('/wallet/${wallet.account}/vouchers/$address', extra: { 'amount': amount, 'logo': logo, + 'walletLogic': widget.walletLogic, }); _logic.resume(address: address); } @@ -167,6 +179,7 @@ class VouchersScreenState extends State { .push('/wallet/${wallet.account}/vouchers/$address', extra: { 'amount': amount, 'logo': logo, + 'walletLogic': widget.walletLogic, }); } @@ -187,7 +200,21 @@ class VouchersScreenState extends State { ), ); - if (confirm == true) await _logic.returnVoucher(address); + if (confirm == true) { + + final walletLogic = widget.walletLogic; + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { + _logic.setWalletState( + walletLogic.config!, + walletLogic.credentials!, + walletLogic.accountAddress!, + ); + } + + await _logic.returnVoucher(address); + } } if (!super.mounted) { diff --git a/lib/screens/vouchers/voucher_read.dart b/lib/screens/vouchers/voucher_read.dart index c66ace42..c08a1f61 100644 --- a/lib/screens/vouchers/voucher_read.dart +++ b/lib/screens/vouchers/voucher_read.dart @@ -67,6 +67,16 @@ class VoucherReadScreenState extends State } void onLoad() async { + final walletLogic = widget.logic; + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { + _logic.setWalletState( + walletLogic.config!, + walletLogic.credentials!, + walletLogic.accountAddress!, + ); + } final voucher = await _logic.openVoucher(widget.address); if (voucher == null) { diff --git a/lib/screens/wallet/screen.dart b/lib/screens/wallet/screen.dart index 8d65daa0..643e1d69 100644 --- a/lib/screens/wallet/screen.dart +++ b/lib/screens/wallet/screen.dart @@ -189,6 +189,12 @@ class WalletScreenState extends State _logic.accountAddress!, ); + _voucherLogic.setWalletState( + _logic.config!, + _logic.credentials!, + _logic.accountAddress!, + ); + _logic.requestWalletActions(); await _logic.loadTransactions(); diff --git a/lib/state/profiles/logic.dart b/lib/state/profiles/logic.dart index 59328419..0c1e3cbf 100644 --- a/lib/state/profiles/logic.dart +++ b/lib/state/profiles/logic.dart @@ -28,6 +28,7 @@ class ProfilesLogic extends WidgetsBindingObserver { late Debounce debouncedLoad; List toLoad = []; bool stopLoading = false; + bool _isInitialized = false; ProfilesLogic(BuildContext context) { _state = context.read(); @@ -51,6 +52,7 @@ class ProfilesLogic extends WidgetsBindingObserver { _currentConfig = config; _currentCredentials = credentials; _currentAccount = account; + _isInitialized = true; } Future _loadCachedProfile(String addr) async { @@ -295,6 +297,11 @@ class ProfilesLogic extends WidgetsBindingObserver { void resume() { stopLoading = false; + + if (!_isInitialized) { + return; + } + debouncedLoad(); } diff --git a/lib/state/vouchers/logic.dart b/lib/state/vouchers/logic.dart index 2fadd1f8..4d4462ec 100644 --- a/lib/state/vouchers/logic.dart +++ b/lib/state/vouchers/logic.dart @@ -38,6 +38,7 @@ class VoucherLogic extends WidgetsBindingObserver { late Debounce debouncedLoad; List toLoad = []; bool stopLoading = false; + bool _isInitialized = false; VoucherLogic(BuildContext context) { _state = context.read(); @@ -54,6 +55,7 @@ class VoucherLogic extends WidgetsBindingObserver { _currentConfig = config; _currentCredentials = credentials; _currentAccount = account; + _isInitialized = true; } void resetCreate() { @@ -65,10 +67,6 @@ class VoucherLogic extends WidgetsBindingObserver { return; } - if (_currentConfig == null) { - return; - } - final toLoadCopy = [...toLoad]; toLoad = []; @@ -106,12 +104,11 @@ class VoucherLogic extends WidgetsBindingObserver { Future fetchVouchers() async { try { - _state.vouchersRequest(); - - if (_currentConfig == null) { + if (!_isInitialized) { throw Exception('wallet not initialized'); } + _state.vouchersRequest(); final vouchers = await _accountDBService.vouchers .getAllByAlias(_currentConfig.community.alias); @@ -144,6 +141,10 @@ class VoucherLogic extends WidgetsBindingObserver { String salt = '', }) async { try { + if (!_isInitialized) { + throw Exception('wallet not initialized'); + } + _state.readVoucherRequest(); final jsonVoucher = decompress(compressedVoucher); @@ -173,8 +174,7 @@ class VoucherLogic extends WidgetsBindingObserver { cache: false, ); - final balance = - await getBalance(_currentConfig ?? Config.fromJson({}), account); + final balance = await getBalance(_currentConfig, account); final voucher = Voucher( address: account.hexEip55, @@ -213,6 +213,10 @@ class VoucherLogic extends WidgetsBindingObserver { Future openVoucher(String address) async { try { + if (!_isInitialized) { + throw Exception('wallet not initialized'); + } + _state.openVoucherRequest(); final dbvoucher = await _accountDBService.vouchers.get(address); @@ -281,6 +285,10 @@ class VoucherLogic extends WidgetsBindingObserver { String salt = '', }) async { try { + if (!_isInitialized) { + throw Exception('wallet not initialized'); + } + _state.createVoucherRequest(); final doubleAmount = balance.replaceAll(',', '.'); @@ -390,8 +398,8 @@ class VoucherLogic extends WidgetsBindingObserver { ); return; - } catch (_) { - // + } catch (e) { + debugPrint('Error creating voucher: $e'); } _state.createVoucherError(); @@ -405,6 +413,9 @@ class VoucherLogic extends WidgetsBindingObserver { bool mint = false, }) async { try { + if (!_isInitialized) { + throw Exception('wallet not initialized'); + } _state.createVoucherRequest(); final credentials = EthPrivateKey.createRandom(Random.secure()); @@ -415,8 +426,8 @@ class VoucherLogic extends WidgetsBindingObserver { decimals: _currentConfig.getPrimaryToken().decimals, ); - final account = await getAccountAddress( - _currentConfig, credentials.address.hexEip55); + final account = + await getAccountAddress(_currentConfig, credentials.address.hexEip55); if (_currentConfig.community.alias.isEmpty) { throw Exception('alias not found'); @@ -574,6 +585,9 @@ class VoucherLogic extends WidgetsBindingObserver { })? sendingTransaction, }) async { try { + if (!_isInitialized) { + throw Exception('wallet not initialized'); + } _state.returnVoucherRequest(); final voucher = await _accountDBService.vouchers.get(address); @@ -698,6 +712,10 @@ class VoucherLogic extends WidgetsBindingObserver { void resume({String? address}) { stopLoading = false; + if (!_isInitialized) { + return; + } + if (address != null) { updateVoucher(address); return; diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index 25cfc21a..91f50873 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -95,6 +95,7 @@ class WalletLogic extends WidgetsBindingObserver { late EthPrivateKey _currentCredentials; late EthereumAddress _currentAccount; late Config _currentConfig; + bool _isInitialized = false; SigAuthConnection get connection { return getSigAuthConnection( @@ -134,15 +135,13 @@ class WalletLogic extends WidgetsBindingObserver { _voucherLogic = voucherLogic; } - EthPrivateKey? get privateKey => _currentCredentials; - Config? get config => _currentConfig; - EthPrivateKey? get credentials => _currentCredentials; - EthereumAddress? get accountAddress => _currentAccount; + EthPrivateKey? get privateKey => _isInitialized ? _currentCredentials : null; + Config? get config => _isInitialized ? _currentConfig : null; + EthPrivateKey? get credentials => _isInitialized ? _currentCredentials : null; + EthereumAddress? get accountAddress => _isInitialized ? _currentAccount : null; void setWalletStateInOtherLogic() { - if (_currentConfig != null && - _currentCredentials != null && - _currentAccount != null) { + if (_isInitialized) { _notificationsLogic.setWalletState( _currentConfig, _currentCredentials, _currentAccount); _profilesLogic?.setWalletState( @@ -299,6 +298,7 @@ class WalletLogic extends WidgetsBindingObserver { _currentCredentials = cred.privateKey; _currentAccount = EthereumAddress.fromHex(decodedSplit[0]); _currentConfig = config; + _isInitialized = true; await _accountDBService.init( 'wallet_${_currentCredentials.address.hexEip55}'); // TODO: migrate to account address instead @@ -425,6 +425,7 @@ class WalletLogic extends WidgetsBindingObserver { _currentCredentials = dbWallet.privateKey!; _currentAccount = dbWallet.address; _currentConfig = communityConfig; + _isInitialized = true; await _accountDBService.init( 'wallet_${_currentCredentials.address.hexEip55}'); // TODO: migrate to account address instead @@ -2137,6 +2138,10 @@ class WalletLogic extends WidgetsBindingObserver { Future didChangeAppLifecycleState(AppLifecycleState state) async { switch (state) { case AppLifecycleState.resumed: + if (!_isInitialized) { + return; + } + resumeFetching(); loadTransactions(); From 6c6aaca339d2a3aa758417f3350e1c9bbd6debb8 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Sat, 26 Jul 2025 01:31:41 +0530 Subject: [PATCH 06/46] Merge Conflicts --- lib/modals/wallet/voucher_read.dart | 20 ++++++++--------- lib/services/config/config.dart | 6 ++++-- lib/state/profile/logic.dart | 17 +++++++-------- lib/state/wallet/logic.dart | 33 ++++++++++++++++++----------- 4 files changed, 43 insertions(+), 33 deletions(-) diff --git a/lib/modals/wallet/voucher_read.dart b/lib/modals/wallet/voucher_read.dart index cd723a61..7fe8dbca 100644 --- a/lib/modals/wallet/voucher_read.dart +++ b/lib/modals/wallet/voucher_read.dart @@ -68,14 +68,16 @@ class VoucherReadModalState extends State void onLoad() async { final walletLogic = widget.logic; - if (walletLogic.config != null && walletLogic.credentials != null && walletLogic.accountAddress != null) { + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { _logic.setWalletState( walletLogic.config!, walletLogic.credentials!, walletLogic.accountAddress!, ); - } - + } + final voucher = await _logic.openVoucher(widget.address); if (voucher == null) { @@ -90,19 +92,17 @@ class VoucherReadModalState extends State } void handleRedeem() async { - print('handleRedeem called for address: ${widget.address}'); - - // Initialize voucher logic if not already initialized final walletLogic = widget.logic; - if (walletLogic.config != null && walletLogic.credentials != null && walletLogic.accountAddress != null) { - print('Initializing voucher logic in handleRedeem'); + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { _logic.setWalletState( walletLogic.config!, walletLogic.credentials!, walletLogic.accountAddress!, ); - } - + } + final navigator = GoRouter.of(context); _logic.returnVoucher( diff --git a/lib/services/config/config.dart b/lib/services/config/config.dart index 30011f5c..2b884f47 100644 --- a/lib/services/config/config.dart +++ b/lib/services/config/config.dart @@ -637,10 +637,12 @@ class Config { engineIPFSService = APIService(baseURL: nodeUrl); } - Future initContracts() async { + Future initContracts([String? accountFactoryAddress]) async { final chain = chains.values.first; - final erc4337Config = getPrimaryAccountAbstractionConfig(); + final erc4337Config = accountFactoryAddress != null + ? getAccountAbstractionConfig(accountFactoryAddress, chain.id) + : getPrimaryAccountAbstractionConfig(); entryPointContract = StackupEntryPoint( chain.id, diff --git a/lib/state/profile/logic.dart b/lib/state/profile/logic.dart index 1db083bf..34962519 100644 --- a/lib/state/profile/logic.dart +++ b/lib/state/profile/logic.dart @@ -253,8 +253,9 @@ class ProfileLogic { ); // Get the existing account to preserve the account factory address - final existingAccount = await _accountBackupDBService.accounts.get(ethAccount, alias, null); - + final existingAccount = + await _accountBackupDBService.accounts.get(ethAccount, alias, null); + _accountBackupDBService.accounts.update(DBAccount( alias: alias, address: ethAccount, @@ -429,8 +430,7 @@ class ProfileLogic { _state.setProfileUploading(); - final url = - await updateProfile(_config, _account, _credentials, profile); + final url = await updateProfile(_config, _account, _credentials, profile); if (url == null) { throw Exception('Failed to save profile'); } @@ -465,11 +465,10 @@ class ProfileLogic { )); final existingAccount = await _accountBackupDBService.accounts.get( - EthereumAddress.fromHex(newProfile.account), - _wallet.alias!, - null - ); - + EthereumAddress.fromHex(newProfile.account), + _config.community.alias, + null); + _accountBackupDBService.accounts.update( DBAccount( alias: _config.community.alias, diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index f1de0284..ce706799 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -118,7 +118,7 @@ class WalletLogic extends WidgetsBindingObserver { String? get lastWallet => _preferences.lastWallet; String get address => _currentCredentials.address.hexEip55; String get account => _currentAccount.hexEip55; - String get token => _currentConfig.getPrimaryToken().address ; + String get token => _currentConfig.getPrimaryToken().address; WalletLogic(BuildContext context, NotificationsLogic notificationsLogic) : _state = context.read(), @@ -139,7 +139,8 @@ class WalletLogic extends WidgetsBindingObserver { EthPrivateKey? get privateKey => _isInitialized ? _currentCredentials : null; Config? get config => _isInitialized ? _currentConfig : null; EthPrivateKey? get credentials => _isInitialized ? _currentCredentials : null; - EthereumAddress? get accountAddress => _isInitialized ? _currentAccount : null; + EthereumAddress? get accountAddress => + _isInitialized ? _currentAccount : null; void setWalletStateInOtherLogic() { if (_isInitialized) { @@ -378,7 +379,12 @@ class WalletLogic extends WidgetsBindingObserver { Config communityConfig = Config.fromJson(community.config); _theme.changeTheme(communityConfig.community.theme); - final dbWallet = await _encPrefs.getAccount(accAddress, alias); + var dbWallet = await _encPrefs.getAccount(accAddress, alias); + + if (dbWallet != null && dbWallet.accountFactoryAddress != null) { + dbWallet = await _encPrefs.getAccount( + accAddress, alias, dbWallet.accountFactoryAddress); + } if (dbWallet == null || dbWallet.privateKey == null) { throw NotFoundException(); @@ -419,8 +425,7 @@ class WalletLogic extends WidgetsBindingObserver { _state.setChainId(chainId); - // Initialize config contracts - await communityConfig.initContracts(); + await communityConfig.initContracts(dbWallet.accountFactoryAddress); // Set current wallet state _currentCredentials = dbWallet.privateKey!; @@ -536,7 +541,8 @@ class WalletLogic extends WidgetsBindingObserver { privateKey: credentials, name: 'New ${token.symbol} Account', alias: communityConfig.community.alias, - accountFactoryAddress: communityConfig.community.primaryAccountFactory.address, + accountFactoryAddress: + communityConfig.community.primaryAccountFactory.address, )); _theme.changeTheme(communityConfig.community.theme); @@ -604,7 +610,8 @@ class WalletLogic extends WidgetsBindingObserver { privateKey: credentials, name: name, alias: communityConfig.community.alias, - accountFactoryAddress: communityConfig.community.primaryAccountFactory.address, + accountFactoryAddress: + communityConfig.community.primaryAccountFactory.address, )); _theme.changeTheme(communityConfig.community.theme); @@ -2144,7 +2151,7 @@ class WalletLogic extends WidgetsBindingObserver { if (!_isInitialized) { return; } - + resumeFetching(); loadTransactions(); @@ -2154,8 +2161,8 @@ class WalletLogic extends WidgetsBindingObserver { await updateBalance(); - final community = await _appDBService.communities - .get(_currentConfig.community.alias); + final community = + await _appDBService.communities.get(_currentConfig.community.alias); if (community == null) { return; @@ -2164,9 +2171,11 @@ class WalletLogic extends WidgetsBindingObserver { Config communityConfig = Config.fromJson(community.config); try { - final remoteConfig = await _config.getSingleCommunityConfig(communityConfig.configLocation); + final remoteConfig = await _config + .getSingleCommunityConfig(communityConfig.configLocation); if (remoteConfig != null) { - await _appDBService.communities.upsert([DBCommunity.fromConfig(remoteConfig)]); + await _appDBService.communities + .upsert([DBCommunity.fromConfig(remoteConfig)]); communityConfig = remoteConfig; } } catch (e) { From 95c94011f76fccebef476895a73ca5847e553e9c Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Mon, 28 Jul 2025 18:56:17 +0530 Subject: [PATCH 07/46] fixed bugfix --- lib/services/accounts/accounts.dart | 2 +- lib/services/accounts/native/android.dart | 78 +++++---- lib/services/accounts/native/apple.dart | 78 +++++---- lib/services/accounts/web.dart | 2 +- lib/services/config/config.dart | 13 +- lib/services/db/backup/accounts.dart | 44 +++-- lib/services/db/backup/legacy.dart | 199 ++++++++++++++++++++++ lib/state/profile/logic.dart | 18 +- lib/state/wallet/logic.dart | 9 +- 9 files changed, 355 insertions(+), 88 deletions(-) create mode 100644 lib/services/db/backup/legacy.dart diff --git a/lib/services/accounts/accounts.dart b/lib/services/accounts/accounts.dart index bb5422c7..09b5280f 100644 --- a/lib/services/accounts/accounts.dart +++ b/lib/services/accounts/accounts.dart @@ -37,7 +37,7 @@ abstract class AccountsServiceInterface { Future setAccount(DBAccount account); // get account - Future getAccount(String address, String alias, [String? accountFactoryAddress]); + Future getAccount(String address, String alias, [String accountFactoryAddress]); // get accounts for alias Future> getAccountsForAlias(String alias); diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index 5587c1b4..e01e6f24 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -68,6 +68,7 @@ class AndroidAccountsService extends AccountsServiceInterface { alias: legacyBackup.alias, address: EthereumAddress.fromHex(legacyBackup.address), name: legacyBackup.name, + accountFactoryAddress: '', ); await _accountsDB.accounts.insert(account); @@ -94,40 +95,47 @@ class AndroidAccountsService extends AccountsServiceInterface { }, 5: () async { final allAccounts = await _accountsDB.accounts.all(); - + for (final account in allAccounts) { - if (account.accountFactoryAddress != null) { + if (account.accountFactoryAddress.isNotEmpty) { continue; } - + final community = await AppDBService().communities.get(account.alias); if (community == null) { continue; } - + final config = Config.fromJson(community.config); - String accountFactoryAddress = config.community.primaryAccountFactory.address; - + String accountFactoryAddress = + config.community.primaryAccountFactory.address; + switch (account.alias) { case 'gratitude': - accountFactoryAddress = '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD'; + accountFactoryAddress = + '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD'; break; case 'bread': - accountFactoryAddress = '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9'; + accountFactoryAddress = + '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9'; break; case 'wallet.commonshub.brussels': - accountFactoryAddress = '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87'; + accountFactoryAddress = + '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87'; break; case 'wallet.sfluv.org': - accountFactoryAddress = '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; + accountFactoryAddress = + '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; break; default: - if (accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - accountFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + if (accountFactoryAddress == + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + accountFactoryAddress = + '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; } break; } - + // Create new account with factory address final newAccount = DBAccount( alias: account.alias, @@ -138,14 +146,17 @@ class AndroidAccountsService extends AccountsServiceInterface { privateKey: account.privateKey, profile: account.profile, ); - + // Delete old account and insert new one - await _accountsDB.accounts.delete(account.address, account.alias, account.accountFactoryAddress); + await _accountsDB.accounts.delete( + account.address, account.alias, account.accountFactoryAddress); await _accountsDB.accounts.insert(newAccount); - - final oldKey = getAccountID(account.address, account.alias, account.accountFactoryAddress); - final newKey = getAccountID(account.address, account.alias, accountFactoryAddress); - + + final oldKey = getAccountID( + account.address, account.alias, account.accountFactoryAddress); + final newKey = getAccountID( + account.address, account.alias, accountFactoryAddress); + final privateKey = await _credentials.read(oldKey); if (privateKey != null) { await _credentials.write(newKey, privateKey); @@ -206,7 +217,8 @@ class AndroidAccountsService extends AccountsServiceInterface { // get wallet backup @override - Future getAccount(String address, String alias, [String? accountFactoryAddress]) async { + Future getAccount(String address, String alias, + [String accountFactoryAddress = '']) async { final account = await _accountsDB.accounts.get( EthereumAddress.fromHex(address), alias, @@ -236,19 +248,25 @@ class AndroidAccountsService extends AccountsServiceInterface { // delete wallet backup @override Future deleteAccount(String address, String alias) async { - await _accountsDB.accounts.delete( - EthereumAddress.fromHex(address), - alias, - null, - ); + final accounts = await _accountsDB.accounts.allForAlias(alias); + final account = + accounts.where((acc) => acc.address.hexEip55 == address).firstOrNull; - await _credentials.delete( - getAccountID( + if (account != null) { + await _accountsDB.accounts.delete( EthereumAddress.fromHex(address), alias, - null, - ), - ); + account.accountFactoryAddress, + ); + + await _credentials.delete( + getAccountID( + EthereumAddress.fromHex(address), + alias, + account.accountFactoryAddress, + ), + ); + } } // delete all wallet backups diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index 943c220b..721e9d1e 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -172,6 +172,7 @@ class AppleAccountsService extends AccountsServiceInterface { alias: legacyBackup.alias, address: EthereumAddress.fromHex(legacyBackup.address), name: legacyBackup.name, + accountFactoryAddress: '', ); await _accountsDB.accounts.insert(account); @@ -207,40 +208,47 @@ class AppleAccountsService extends AccountsServiceInterface { }, 5: () async { final allAccounts = await _accountsDB.accounts.all(); - + for (final account in allAccounts) { - if (account.accountFactoryAddress != null) { + if (account.accountFactoryAddress.isNotEmpty) { continue; } - + final community = await AppDBService().communities.get(account.alias); if (community == null) { continue; } - + final config = Config.fromJson(community.config); - String accountFactoryAddress = config.community.primaryAccountFactory.address; - + String accountFactoryAddress = + config.community.primaryAccountFactory.address; + switch (account.alias) { case 'gratitude': - accountFactoryAddress = '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD'; + accountFactoryAddress = + '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD'; break; case 'bread': - accountFactoryAddress = '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9'; + accountFactoryAddress = + '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9'; break; case 'wallet.commonshub.brussels': - accountFactoryAddress = '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87'; + accountFactoryAddress = + '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87'; break; case 'wallet.sfluv.org': - accountFactoryAddress = '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; + accountFactoryAddress = + '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; break; default: - if (accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - accountFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + if (accountFactoryAddress == + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + accountFactoryAddress = + '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; } break; } - + // Create new account with factory address final newAccount = DBAccount( alias: account.alias, @@ -251,14 +259,17 @@ class AppleAccountsService extends AccountsServiceInterface { privateKey: account.privateKey, profile: account.profile, ); - + // Delete old account and insert new one - await _accountsDB.accounts.delete(account.address, account.alias, account.accountFactoryAddress); + await _accountsDB.accounts.delete( + account.address, account.alias, account.accountFactoryAddress); await _accountsDB.accounts.insert(newAccount); - - final oldKey = getAccountID(account.address, account.alias, account.accountFactoryAddress); - final newKey = getAccountID(account.address, account.alias, accountFactoryAddress); - + + final oldKey = getAccountID( + account.address, account.alias, account.accountFactoryAddress); + final newKey = getAccountID( + account.address, account.alias, accountFactoryAddress); + final privateKey = await _credentials.read(oldKey); if (privateKey != null) { await _credentials.write(newKey, privateKey); @@ -319,7 +330,8 @@ class AppleAccountsService extends AccountsServiceInterface { // get wallet backup @override - Future getAccount(String address, String alias, [String? accountFactoryAddress]) async { + Future getAccount(String address, String alias, + [String accountFactoryAddress = '']) async { final account = await _accountsDB.accounts.get( EthereumAddress.fromHex(address), alias, @@ -349,19 +361,25 @@ class AppleAccountsService extends AccountsServiceInterface { // delete wallet backup @override Future deleteAccount(String address, String alias) async { - await _accountsDB.accounts.delete( - EthereumAddress.fromHex(address), - alias, - null, - ); + final accounts = await _accountsDB.accounts.allForAlias(alias); + final account = + accounts.where((acc) => acc.address.hexEip55 == address).firstOrNull; - await _credentials.delete( - getAccountID( + if (account != null) { + await _accountsDB.accounts.delete( EthereumAddress.fromHex(address), alias, - null, - ), - ); + account.accountFactoryAddress, + ); + + await _credentials.delete( + getAccountID( + EthereumAddress.fromHex(address), + alias, + account.accountFactoryAddress, + ), + ); + } } // delete all wallet backups diff --git a/lib/services/accounts/web.dart b/lib/services/accounts/web.dart index 8aa6d983..e11498cc 100644 --- a/lib/services/accounts/web.dart +++ b/lib/services/accounts/web.dart @@ -42,7 +42,7 @@ class WebAccountsService extends AccountsServiceInterface { // get wallet backup @override - Future getAccount(String address, String alias, [String? accountFactoryAddress]) async { + Future getAccount(String address, String alias, [String accountFactoryAddress = '']) async { return null; } diff --git a/lib/services/config/config.dart b/lib/services/config/config.dart index 2b884f47..e5590688 100644 --- a/lib/services/config/config.dart +++ b/lib/services/config/config.dart @@ -637,10 +637,10 @@ class Config { engineIPFSService = APIService(baseURL: nodeUrl); } - Future initContracts([String? accountFactoryAddress]) async { + Future initContracts([String accountFactoryAddress = '']) async { final chain = chains.values.first; - final erc4337Config = accountFactoryAddress != null + final erc4337Config = accountFactoryAddress.isNotEmpty ? getAccountAbstractionConfig(accountFactoryAddress, chain.id) : getPrimaryAccountAbstractionConfig(); @@ -927,12 +927,15 @@ class Config { return erc4337Config.paymasterType; } - ERC4337Config getAccountAbstractionConfig(String accountFactoryAddress, [int? chainId]) { + ERC4337Config getAccountAbstractionConfig(String accountFactoryAddress, + [int? chainId]) { final targetChainId = chainId ?? community.primaryAccountFactory.chainId; - final accountAbstraction = accounts['$targetChainId:$accountFactoryAddress']; + final accountAbstraction = + accounts['$targetChainId:$accountFactoryAddress']; if (accountAbstraction == null) { - throw Exception('Account Abstraction Config not found for factory: $accountFactoryAddress on chain: $targetChainId'); + throw Exception( + 'Account Abstraction Config not found for factory: $accountFactoryAddress on chain: $targetChainId'); } return accountAbstraction; diff --git a/lib/services/db/backup/accounts.dart b/lib/services/db/backup/accounts.dart index 5ec86be9..0060a5f7 100644 --- a/lib/services/db/backup/accounts.dart +++ b/lib/services/db/backup/accounts.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:citizenwallet/services/db/db.dart'; +import 'package:citizenwallet/services/db/backup/legacy.dart'; import 'package:citizenwallet/services/wallet/contracts/profile.dart'; import 'package:flutter/foundation.dart'; import 'package:sqflite/sqlite_api.dart'; @@ -14,7 +15,7 @@ class DBAccount { final String name; final UserHandle? userHandle; final String? username; - final String? accountFactoryAddress; + final String accountFactoryAddress; EthPrivateKey? privateKey; final ProfileV1? profile; @@ -22,8 +23,8 @@ class DBAccount { required this.alias, required this.address, required this.name, + required this.accountFactoryAddress, this.username, - this.accountFactoryAddress, this.privateKey, this.profile, }) : id = getAccountID(address, alias, accountFactoryAddress), @@ -63,12 +64,8 @@ class DBAccount { } String getAccountID( - EthereumAddress address, String alias, String? accountFactoryAddress) { - if (accountFactoryAddress == null) { - return '${address.hexEip55}@$alias'; - } else { - return '${address.hexEip55}@$accountFactoryAddress@$alias'; - } + EthereumAddress address, String alias, String accountFactoryAddress) { + return '${address.hexEip55}@$accountFactoryAddress@$alias'; } class UserHandle { @@ -124,7 +121,7 @@ class AccountsTable extends DBTable { 'ALTER TABLE $name ADD COLUMN username TEXT DEFAULT NULL', ], 4: [ - 'ALTER TABLE $name ADD COLUMN accountFactoryAddress TEXT DEFAULT NULL', + 'ALTER TABLE $name ADD COLUMN accountFactoryAddress TEXT', ] }; @@ -144,9 +141,34 @@ class AccountsTable extends DBTable { } } + Future> getAllLegacyDBAccounts() async { + final List> maps = await db.query( + name, + where: 'accountFactoryAddress IS NULL', + ); + + return List.generate(maps.length, (i) { + return LegacyDBAccount.fromMap(maps[i]); + }); + } + + /// Converts a LegacyDBAccount to a DBAccount + /// For legacy accounts, we use a default account factory address + DBAccount convertLegacyToDBAccount(LegacyDBAccount legacyAccount) { + return DBAccount( + alias: legacyAccount.alias, + address: legacyAccount.address, + name: legacyAccount.name, + username: legacyAccount.username, + accountFactoryAddress: '', + privateKey: legacyAccount.privateKey, + profile: legacyAccount.profile, + ); + } + // get account by id Future get(EthereumAddress address, String alias, - String? accountFactoryAddress) async { + String accountFactoryAddress) async { final List> maps = await db.query( name, where: 'id = ?', @@ -178,7 +200,7 @@ class AccountsTable extends DBTable { } Future delete(EthereumAddress address, String alias, - String? accountFactoryAddress) async { + String accountFactoryAddress) async { await db.delete( name, where: 'id = ?', diff --git a/lib/services/db/backup/legacy.dart b/lib/services/db/backup/legacy.dart new file mode 100644 index 00000000..ee18630c --- /dev/null +++ b/lib/services/db/backup/legacy.dart @@ -0,0 +1,199 @@ +import 'dart:convert'; + +import 'package:citizenwallet/services/db/db.dart'; +import 'package:citizenwallet/services/wallet/contracts/profile.dart'; +import 'package:flutter/foundation.dart'; +import 'package:sqflite/sqlite_api.dart'; +import 'package:web3dart/crypto.dart'; +import 'package:web3dart/web3dart.dart'; + +class LegacyDBAccount { + final String id; + final String alias; + final EthereumAddress address; + final String name; + final UserHandle? userHandle; + final String? username; + EthPrivateKey? privateKey; + final ProfileV1? profile; + + LegacyDBAccount({ + required this.alias, + required this.address, + required this.name, + this.username, + this.privateKey, + this.profile, + }) : id = getAccountID(address, alias), + userHandle = username != null ? UserHandle(username, alias) : null; + + // toMap + Map toMap() { + return { + 'id': id, + 'alias': alias, + 'address': address.hexEip55, + if (name.isNotEmpty) 'name': name, + 'username': username, + 'privateKey': + privateKey != null ? bytesToHex(privateKey!.privateKey) : null, + if (profile != null) 'profile': jsonEncode(profile!.toJson()), + }; + } + + // fromMap + factory LegacyDBAccount.fromMap(Map map) { + return LegacyDBAccount( + alias: map['alias'], + address: EthereumAddress.fromHex(map['address']), + name: map['name'], + username: map['username'], + privateKey: map['privateKey'] != null + ? EthPrivateKey.fromHex(map['privateKey']) + : null, + profile: map['profile'] != null + ? ProfileV1.fromJson(jsonDecode(map['profile'])) + : null, + ); + } +} + +String getAccountID(EthereumAddress address, String alias) { + return '${address.hexEip55}@$alias'; +} + +class UserHandle { + final String username; + final String communityAlias; + + const UserHandle(this.username, this.communityAlias); + + factory UserHandle.fromUserHandle(String userHandle) { + final parts = userHandle.split('@'); + if (parts.length != 2) { + throw FormatException('Invalid user handle format: $userHandle'); + } + return UserHandle(parts[0], parts[1]); + } + + @override + String toString() => '$username@$communityAlias'; +} + +class AccountsTable extends DBTable { + AccountsTable(super.db); + + @override + String get name => 't_accounts'; + + @override + String get createQuery => ''' + CREATE TABLE $name ( + id TEXT PRIMARY KEY, + alias TEXT NOT NULL, + address TEXT NOT NULL, + name TEXT NOT NULL, + username TEXT, + privateKey TEXT, + profile TEXT + ) + '''; + + @override + Future create(Database db) async { + await db.execute(createQuery); + } + + @override + Future migrate(Database db, int oldVersion, int newVersion) async { + final migrations = { + 2: [ + 'UPDATE $name SET privateKey = NULL', + ], + 3: [ + 'ALTER TABLE $name ADD COLUMN username TEXT DEFAULT NULL', + ] + }; + + for (var i = oldVersion + 1; i <= newVersion; i++) { + final queries = migrations[i]; + + if (queries != null) { + for (final query in queries) { + try { + await db.execute(query); + } catch (e, s) { + debugPrint('Migration error: $e'); + debugPrintStack(stackTrace: s); + } + } + } + } + } + + // get account by id + Future get(EthereumAddress address, String alias) async { + final List> maps = await db.query( + name, + where: 'id = ?', + whereArgs: [getAccountID(address, alias)], + ); + + if (maps.isEmpty) { + return null; + } + + return LegacyDBAccount.fromMap(maps.first); + } + + Future insert(LegacyDBAccount account) async { + await db.insert( + name, + account.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + Future update(LegacyDBAccount account) async { + await db.update( + name, + account.toMap(), + where: 'id = ?', + whereArgs: [account.id], + ); + } + + Future delete(EthereumAddress address, String alias) async { + await db.delete( + name, + where: 'id = ?', + whereArgs: [getAccountID(address, alias)], + ); + } + + // delete all + Future deleteAll() async { + await db.delete(name); + } + + Future> all() async { + final List> maps = await db.query(name); + + return List.generate(maps.length, (i) { + return LegacyDBAccount.fromMap(maps[i]); + }); + } + + // get all accounts for alias + Future> allForAlias(String alias) async { + final List> maps = await db.query( + name, + where: 'alias = ?', + whereArgs: [alias], + ); + + return List.generate(maps.length, (i) { + return LegacyDBAccount.fromMap(maps[i]); + }); + } +} \ No newline at end of file diff --git a/lib/state/profile/logic.dart b/lib/state/profile/logic.dart index 34962519..8d564139 100644 --- a/lib/state/profile/logic.dart +++ b/lib/state/profile/logic.dart @@ -200,7 +200,7 @@ class ProfileLogic { _state.setProfileRequest(); final account = - await _accountBackupDBService.accounts.get(ethAccount, alias, null); + await _accountBackupDBService.accounts.get(ethAccount, alias, ''); if (account != null && account.profile != null) { final profile = account.profile!; @@ -254,14 +254,14 @@ class ProfileLogic { // Get the existing account to preserve the account factory address final existingAccount = - await _accountBackupDBService.accounts.get(ethAccount, alias, null); + await _accountBackupDBService.accounts.get(ethAccount, alias, ''); _accountBackupDBService.accounts.update(DBAccount( alias: alias, address: ethAccount, name: profile.name, username: profile.username, - accountFactoryAddress: existingAccount?.accountFactoryAddress, + accountFactoryAddress: existingAccount?.accountFactoryAddress ?? '', privateKey: null, profile: profile, )); @@ -378,12 +378,18 @@ class ProfileLogic { ), ); + final existingAccount = await _accountBackupDBService.accounts.get( + EthereumAddress.fromHex(newProfile.account), + _config.community.alias, + ''); + _accountBackupDBService.accounts.update( DBAccount( alias: _config.community.alias, address: EthereumAddress.fromHex(newProfile.account), name: newProfile.name, username: newProfile.username, + accountFactoryAddress: existingAccount?.accountFactoryAddress ?? '', privateKey: null, profile: newProfile, ), @@ -467,7 +473,7 @@ class ProfileLogic { final existingAccount = await _accountBackupDBService.accounts.get( EthereumAddress.fromHex(newProfile.account), _config.community.alias, - null); + ''); _accountBackupDBService.accounts.update( DBAccount( @@ -475,7 +481,7 @@ class ProfileLogic { address: EthereumAddress.fromHex(newProfile.account), name: newProfile.name, username: newProfile.username, - accountFactoryAddress: existingAccount?.accountFactoryAddress, + accountFactoryAddress: existingAccount?.accountFactoryAddress ?? '', privateKey: null, profile: newProfile, ), @@ -548,7 +554,7 @@ class ProfileLogic { final alias = _config.community.alias; final account = await _accountBackupDBService.accounts - .get(EthereumAddress.fromHex(address), alias, null); + .get(EthereumAddress.fromHex(address), alias, ''); if (account == null) { throw Exception( diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index ce706799..2927baab 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -379,9 +379,9 @@ class WalletLogic extends WidgetsBindingObserver { Config communityConfig = Config.fromJson(community.config); _theme.changeTheme(communityConfig.community.theme); - var dbWallet = await _encPrefs.getAccount(accAddress, alias); + var dbWallet = await _encPrefs.getAccount(accAddress, alias, ''); - if (dbWallet != null && dbWallet.accountFactoryAddress != null) { + if (dbWallet != null && dbWallet.accountFactoryAddress.isNotEmpty) { dbWallet = await _encPrefs.getAccount( accAddress, alias, dbWallet.accountFactoryAddress); } @@ -631,7 +631,7 @@ class WalletLogic extends WidgetsBindingObserver { Future editWallet(String address, String alias, String name) async { try { - final dbWallet = await _encPrefs.getAccount(address, alias); + final dbWallet = await _encPrefs.getAccount(address, alias, ''); if (dbWallet == null) { throw NotFoundException(); } @@ -641,6 +641,7 @@ class WalletLogic extends WidgetsBindingObserver { privateKey: dbWallet.privateKey, name: name, alias: dbWallet.alias, + accountFactoryAddress: dbWallet.accountFactoryAddress, )); loadDBWallets(); @@ -802,7 +803,7 @@ class WalletLogic extends WidgetsBindingObserver { // takes a password and returns a wallet Future returnWallet(String address, String alias) async { try { - final dbWallet = await _encPrefs.getAccount(address, alias); + final dbWallet = await _encPrefs.getAccount(address, alias, ''); if (dbWallet == null || dbWallet.privateKey == null) { throw NotFoundException(); } From 9356a40503ebfe972c9bc62b5634d8384c7ed86f Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Tue, 29 Jul 2025 02:34:48 +0530 Subject: [PATCH 08/46] added the scenarios --- lib/modals/landing/app_download_modal.dart | 236 ++++++++++++++++ lib/modals/wallet/migration_backup_modal.dart | 263 ++++++++++++++++++ lib/screens/landing/screen.dart | 54 ++++ lib/screens/wallet/more_actions_sheet.dart | 22 ++ lib/screens/wallet/screen.dart | 2 + lib/state/wallet/logic.dart | 5 + lib/state/wallet/state.dart | 1 + 7 files changed, 583 insertions(+) create mode 100644 lib/modals/landing/app_download_modal.dart create mode 100644 lib/modals/wallet/migration_backup_modal.dart diff --git a/lib/modals/landing/app_download_modal.dart b/lib/modals/landing/app_download_modal.dart new file mode 100644 index 00000000..26d12e52 --- /dev/null +++ b/lib/modals/landing/app_download_modal.dart @@ -0,0 +1,236 @@ +import 'package:citizenwallet/state/backup_web/logic.dart'; +import 'package:citizenwallet/theme/provider.dart'; +import 'package:citizenwallet/widgets/button.dart'; +import 'package:citizenwallet/widgets/header.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; +import 'package:citizenwallet/l10n/app_localizations.dart'; + +class AppDownloadModal extends StatefulWidget { + final String? title; + final String? message; + + const AppDownloadModal({ + super.key, + this.title, + this.message, + }); + + @override + AppDownloadModalState createState() => AppDownloadModalState(); +} + +class AppDownloadModalState extends State { + late BackupWebLogic _logic; + + @override + void initState() { + super.initState(); + _logic = BackupWebLogic(context); + } + + void handleDismiss(BuildContext context) { + FocusManager.instance.primaryFocus?.unfocus(); + GoRouter.of(context).pop(); + } + + void handleAppStoreLink() { + _logic.openAppStore(); + } + + void handleGooglePlayLink() { + _logic.openPlayStore(); + } + + void handleNativeApp() { + _logic.openNativeApp(); + } + + @override + Widget build(BuildContext context) { + final isIOS = defaultTargetPlatform == TargetPlatform.iOS; + final isAndroid = defaultTargetPlatform == TargetPlatform.android; + final isDesktop = !isIOS && !isAndroid; + + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: CupertinoPageScaffold( + backgroundColor: + Theme.of(context).colors.uiBackgroundAlt.resolveFrom(context), + child: SafeArea( + minimum: const EdgeInsets.only(left: 10, right: 10, top: 20), + child: Flex( + direction: Axis.vertical, + children: [ + Header( + title: widget.title ?? AppLocalizations.of(context)!.gettheapp, + showBackButton: true, + ), + Expanded( + child: CustomScrollView( + scrollBehavior: const CupertinoScrollBehavior(), + slivers: [ + SliverToBoxAdapter( + child: Column( + children: [ + const SizedBox(height: 40), + SvgPicture.asset( + 'assets/citizenwallet-only-logo.svg', + semanticsLabel: 'Citizen Wallet Icon', + height: 120, + ), + const SizedBox(height: 30), + if (widget.message != null) ...[ + Text( + widget.message!, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(height: 30), + ], + if (isIOS) ...[ + Text( + AppLocalizations.of(context)!.gettheapp, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(height: 20), + CupertinoButton( + onPressed: handleAppStoreLink, + child: SvgPicture.asset( + 'assets/images/app-store-badge.svg', + semanticsLabel: + AppLocalizations.of(context)!.appstorebadge, + height: 70, + ), + ), + ], + if (isAndroid) ...[ + Text( + AppLocalizations.of(context)!.gettheapp, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(height: 20), + CupertinoButton( + onPressed: handleGooglePlayLink, + child: Image.asset( + 'assets/images/google-play-badge.png', + semanticLabel: AppLocalizations.of(context)! + .googleplaybadge, + height: 100, + ), + ), + ], + if (isDesktop) ...[ + Text( + AppLocalizations.of(context)!.gettheapp, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CupertinoButton( + onPressed: handleAppStoreLink, + child: SvgPicture.asset( + 'assets/images/app-store-badge.svg', + semanticsLabel: + AppLocalizations.of(context)! + .appstorebadge, + height: 60, + ), + ), + const SizedBox(width: 20), + CupertinoButton( + onPressed: handleGooglePlayLink, + child: Image.asset( + 'assets/images/google-play-badge.png', + semanticLabel: AppLocalizations.of(context)! + .googleplaybadge, + height: 80, + ), + ), + ], + ), + ], + if (!isDesktop) ...[ + const SizedBox(height: 40), + Text( + AppLocalizations.of(context)!.opentheapp, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(height: 20), + Button( + text: AppLocalizations.of(context)!.open, + suffix: Row( + children: [ + const SizedBox(width: 10), + Icon( + CupertinoIcons.arrowshape_turn_up_right, + size: 18, + color: Theme.of(context) + .colors + .black + .resolveFrom(context), + ), + ], + ), + onPressed: handleNativeApp, + minWidth: 200, + maxWidth: 200, + ), + ], + const SizedBox(height: 40), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/modals/wallet/migration_backup_modal.dart b/lib/modals/wallet/migration_backup_modal.dart new file mode 100644 index 00000000..cb456205 --- /dev/null +++ b/lib/modals/wallet/migration_backup_modal.dart @@ -0,0 +1,263 @@ +import 'package:citizenwallet/state/backup/logic.dart'; +import 'package:citizenwallet/state/backup/state.dart'; +import 'package:citizenwallet/state/notifications/state.dart'; +import 'package:citizenwallet/theme/provider.dart'; +import 'package:citizenwallet/widgets/button.dart'; +import 'package:citizenwallet/widgets/header.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; +import 'package:provider/provider.dart'; + +class MigrationBackupModal extends StatefulWidget { + final String? title; + final String? message; + + const MigrationBackupModal({ + super.key, + this.title, + this.message, + }); + + @override + MigrationBackupModalState createState() => MigrationBackupModalState(); +} + +class MigrationBackupModalState extends State { + late BackupLogic _backupLogic; + + @override + void initState() { + super.initState(); + _backupLogic = BackupLogic(context); + } + + void handleDismiss(BuildContext context) { + FocusManager.instance.primaryFocus?.unfocus(); + GoRouter.of(context).pop(); + } + + void handleBackupWallet() async { + HapticFeedback.heavyImpact(); + + try { + await _backupLogic.backupAndroid(); + + if (mounted) { + context.read().toastShow( + 'Wallet backed up successfully!', + type: ToastType.success, + ); + handleDismiss(context); + } + } catch (e) { + if (mounted) { + context.read().toastShow( + 'Failed to backup wallet. Please try again.', + type: ToastType.error, + ); + } + } + } + + void handleRestoreWallet() async { + HapticFeedback.heavyImpact(); + + try { + final hasAccounts = await _backupLogic.hasAccounts(); + + if (hasAccounts) { + await _backupLogic.setupAndroidFromRecovery(); + + if (mounted) { + context.read().toastShow( + 'Wallet restored successfully!', + type: ToastType.success, + ); + handleDismiss(context); + } + } else { + if (mounted) { + context.read().toastShow( + 'No backup found to restore.', + type: ToastType.error, + ); + } + } + } catch (e) { + if (mounted) { + context.read().toastShow( + 'Failed to restore wallet. Please try again.', + type: ToastType.error, + ); + } + } + } + + void handleMigrateWallet() async { + HapticFeedback.heavyImpact(); + + try { + if (mounted) { + context.read().toastShow( + 'Wallet migration completed!', + type: ToastType.success, + ); + handleDismiss(context); + } + } catch (e) { + if (mounted) { + context.read().toastShow( + 'Failed to migrate wallet. Please try again.', + type: ToastType.error, + ); + } + } + } + + @override + Widget build(BuildContext context) { + final loading = context.select((BackupState state) => state.loading); + + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: CupertinoPageScaffold( + backgroundColor: + Theme.of(context).colors.uiBackgroundAlt.resolveFrom(context), + child: SafeArea( + minimum: const EdgeInsets.only(left: 10, right: 10, top: 20), + child: Flex( + direction: Axis.vertical, + children: [ + Header( + title: widget.title ?? 'Wallet Management', + showBackButton: true, + ), + Expanded( + child: CustomScrollView( + scrollBehavior: const CupertinoScrollBehavior(), + slivers: [ + SliverToBoxAdapter( + child: Column( + children: [ + const SizedBox(height: 40), + SvgPicture.asset( + 'assets/citizenwallet-only-logo.svg', + semanticsLabel: 'Citizen Wallet Icon', + height: 100, + ), + const SizedBox(height: 30), + if (widget.message != null) ...[ + Text( + widget.message!, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(height: 30), + ], + Text( + 'Secure your wallet and manage your data', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(height: 40), + if (loading) ...[ + const CupertinoActivityIndicator(), + const SizedBox(height: 20), + Text( + 'Processing...', + style: TextStyle( + fontSize: 14, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + ] else ...[ + Button( + text: 'Backup Wallet', + prefix: Icon( + CupertinoIcons.cloud_upload, + size: 20, + color: Theme.of(context) + .colors + .black + .resolveFrom(context), + ), + onPressed: handleBackupWallet, + minWidth: 250, + maxWidth: 250, + ), + const SizedBox(height: 20), + Button( + text: 'Restore Wallet', + prefix: Icon( + CupertinoIcons.cloud_download, + size: 20, + color: Theme.of(context) + .colors + .black + .resolveFrom(context), + ), + onPressed: handleRestoreWallet, + minWidth: 250, + maxWidth: 250, + ), + const SizedBox(height: 20), + Button( + text: 'Migrate Wallet', + prefix: Icon( + CupertinoIcons.arrow_right_arrow_left, + size: 20, + color: Theme.of(context) + .colors + .black + .resolveFrom(context), + ), + onPressed: handleMigrateWallet, + minWidth: 250, + maxWidth: 250, + ), + ], + const SizedBox(height: 40), + Text( + 'Your wallet data is encrypted and secure', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 12, + color: Theme.of(context) + .colors + .text + .resolveFrom(context) + .withOpacity(0.6), + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/screens/landing/screen.dart b/lib/screens/landing/screen.dart index b8c14204..6bd38894 100644 --- a/lib/screens/landing/screen.dart +++ b/lib/screens/landing/screen.dart @@ -1,5 +1,6 @@ // import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:citizenwallet/modals/account/select_account.dart'; +import 'package:citizenwallet/modals/landing/app_download_modal.dart'; import 'package:citizenwallet/modals/wallet/community_picker.dart'; import 'package:citizenwallet/router/utils.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; @@ -331,6 +332,18 @@ class LandingScreenState extends State navigator.push('/recovery'); } + void handleShowAppDownload() async { + await showCupertinoModalBottomSheet( + context: context, + expand: true, + useRootNavigator: true, + builder: (modalContext) => const AppDownloadModal( + title: 'Get Citizen Wallet', + message: 'Download the app for the best experience', + ), + ); + } + void handleQRScan() async { final navigator = GoRouter.of(context); @@ -670,6 +683,47 @@ class LandingScreenState extends State ), ), ), + const SizedBox(height: 20), + CupertinoButton( + onPressed: handleShowAppDownload, + child: ConstrainedBox( + constraints: BoxConstraints( + maxWidth: maxWidth, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + 'Get the App', + style: TextStyle( + color: Theme.of(context) + .colors + .primary + .resolveFrom(context), + fontSize: 18, + fontWeight: FontWeight.bold, + ), + maxLines: 2, + textAlign: TextAlign.center, + ), + const SizedBox( + width: 10, + height: 44, + ), + Icon( + CupertinoIcons.arrow_right, + color: Theme.of(context) + .colors + .primary + .resolveFrom(context), + ), + ], + ), + ), + ), ], if (isPlatformApple()) ...[ Container( diff --git a/lib/screens/wallet/more_actions_sheet.dart b/lib/screens/wallet/more_actions_sheet.dart index 52fe6e75..d650db94 100644 --- a/lib/screens/wallet/more_actions_sheet.dart +++ b/lib/screens/wallet/more_actions_sheet.dart @@ -5,8 +5,10 @@ import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/widgets/coin_logo.dart'; import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; +import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; import 'package:citizenwallet/l10n/app_localizations.dart'; +import 'package:citizenwallet/modals/wallet/migration_backup_modal.dart'; class MoreActionsSheet extends StatelessWidget { final void Function()? handleSendScreen; @@ -101,6 +103,26 @@ class MoreActionsSheet extends StatelessWidget { }), ); }).toList(); + case ActionButtonType.migration: + return [ + _buildSheetItem( + context, + 'Migration & Backup', + icon: CupertinoIcons.cloud_upload, + onPressed: () { + navigator.pop(); + showCupertinoModalBottomSheet( + context: context, + expand: true, + useRootNavigator: true, + builder: (modalContext) => const MigrationBackupModal( + title: 'Migration & Backup', + message: 'Manage your wallet data and security', + ), + ); + }, + ) + ]; default: return [ Container() diff --git a/lib/screens/wallet/screen.dart b/lib/screens/wallet/screen.dart index 13762a33..d957f66a 100644 --- a/lib/screens/wallet/screen.dart +++ b/lib/screens/wallet/screen.dart @@ -1173,6 +1173,8 @@ class WalletScreenState extends State case ActionButtonType.plugins: handlePlugin(pluginConfig); break; + case ActionButtonType.migration: + break; } } diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index 2927baab..9cae9b4e 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -2221,6 +2221,11 @@ class WalletLogic extends WidgetsBindingObserver { buttonType: ActionButtonType.vouchers, )); + actionsToAdd.add(ActionButton( + label: 'Migration & Backup', + buttonType: ActionButtonType.migration, + )); + try { final isMinterResult = await isMinter(_currentConfig, _currentAccount); _state.setWalletMinter(isMinterResult); diff --git a/lib/state/wallet/state.dart b/lib/state/wallet/state.dart index 4516101d..4997b37a 100644 --- a/lib/state/wallet/state.dart +++ b/lib/state/wallet/state.dart @@ -12,6 +12,7 @@ enum ActionButtonType { plugins, minter, more, + migration, } class ActionButton { From 67b1f0a1789c575e6b4744ce6e7e83ded8b0e9fb Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Tue, 29 Jul 2025 12:45:08 +0530 Subject: [PATCH 09/46] account factory update --- lib/services/db/backup/accounts.dart | 2 +- lib/state/wallet/logic.dart | 42 ++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/lib/services/db/backup/accounts.dart b/lib/services/db/backup/accounts.dart index 0060a5f7..69f539f2 100644 --- a/lib/services/db/backup/accounts.dart +++ b/lib/services/db/backup/accounts.dart @@ -144,7 +144,7 @@ class AccountsTable extends DBTable { Future> getAllLegacyDBAccounts() async { final List> maps = await db.query( name, - where: 'accountFactoryAddress IS NULL', + where: 'accountFactoryAddress IS NULL OR accountFactoryAddress = ""', ); return List.generate(maps.length, (i) { diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index 2927baab..f18d0eff 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -384,6 +384,48 @@ class WalletLogic extends WidgetsBindingObserver { if (dbWallet != null && dbWallet.accountFactoryAddress.isNotEmpty) { dbWallet = await _encPrefs.getAccount( accAddress, alias, dbWallet.accountFactoryAddress); + } else if (dbWallet != null && dbWallet.accountFactoryAddress.isEmpty) { + String defaultAccountFactoryAddress = + communityConfig.community.primaryAccountFactory.address; + + switch (alias) { + case 'gratitude': + defaultAccountFactoryAddress = + '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD'; + break; + case 'bread': + defaultAccountFactoryAddress = + '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9'; + break; + case 'wallet.commonshub.brussels': + defaultAccountFactoryAddress = + '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87'; + break; + case 'wallet.sfluv.org': + defaultAccountFactoryAddress = + '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; + break; + default: + if (defaultAccountFactoryAddress == + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + defaultAccountFactoryAddress = + '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + } + break; + } + + final updatedAccount = DBAccount( + alias: dbWallet.alias, + address: dbWallet.address, + name: dbWallet.name, + username: dbWallet.username, + accountFactoryAddress: defaultAccountFactoryAddress, + privateKey: dbWallet.privateKey, + profile: dbWallet.profile, + ); + + await _encPrefs.setAccount(updatedAccount); + dbWallet = updatedAccount; } if (dbWallet == null || dbWallet.privateKey == null) { From f3861b2059f4efe2764b26230833fd4495109ab6 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Wed, 30 Jul 2025 10:11:57 +0530 Subject: [PATCH 10/46] fixed community issue --- assets/config/v5/communities.json | 201 ++++++++++++++----------- assets/config/v5/communities.test.json | 142 ++++++++--------- assets/config/v5/debug.json | 9 +- lib/services/db/backup/accounts.dart | 48 +++++- 4 files changed, 222 insertions(+), 178 deletions(-) diff --git a/assets/config/v5/communities.json b/assets/config/v5/communities.json index 03d80f4a..ff8d44c1 100644 --- a/assets/config/v5/communities.json +++ b/assets/config/v5/communities.json @@ -37,13 +37,6 @@ "name": "Polygon Explorer" }, "accounts": { - "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - }, "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 137, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", @@ -79,8 +72,8 @@ "signature": true } ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/ctzn.json", - "version": 4 + "config_location": "https://config.internal.citizenwallet.xyz/v5/ctzn.json", + "version": 5 }, { "community": { @@ -103,7 +96,7 @@ "chain_id": 100 }, "primary_account_factory": { - "address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 100 }, "primary_card_manager": { @@ -133,11 +126,11 @@ "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", "paymaster_type": "cw" }, - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 100, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, @@ -170,7 +163,7 @@ } ], "config_location": "https://wallet.pay.brussels/config/community.json", - "version": 4 + "version": 5 }, { "community": { @@ -191,7 +184,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 }, "primary_card_manager": { @@ -221,11 +214,18 @@ "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", "paymaster_type": "cw" }, - "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, @@ -250,7 +250,7 @@ }, "plugins": [], "config_location": "https://gratitude.citizenwallet.xyz/config/community.json", - "version": 4 + "version": 5 }, { "community": { @@ -272,7 +272,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -297,6 +297,13 @@ "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw" } }, "chains": { @@ -322,7 +329,7 @@ } ], "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", - "version": 4 + "version": 5 }, { "community": { @@ -363,13 +370,6 @@ "name": "Gnosis Explorer" }, "accounts": { - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - }, "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 100, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", @@ -392,7 +392,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/txirrin.json", - "version": 4 + "version": 5 }, { "community": { @@ -432,13 +432,6 @@ "name": "Polygon Explorer" }, "accounts": { - "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - }, "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 137, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", @@ -460,7 +453,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/boliviapay.json", - "version": 4 + "version": 5 }, { "community": { @@ -478,7 +471,7 @@ "chain_id": 100 }, "primary_account_factory": { - "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 100 } }, @@ -504,11 +497,11 @@ "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", "paymaster_type": "cw" }, - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 100, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, @@ -542,7 +535,7 @@ } ], "config_location": "https://config.internal.citizenwallet.xyz/v4/bread.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -564,7 +557,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -589,6 +582,13 @@ "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw" } }, "chains": { @@ -620,7 +620,7 @@ } ], "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.commonshub.brussels.json", - "version": 4 + "version": 5 }, { "community": { @@ -664,11 +664,11 @@ "name": "Celo Explorer" }, "accounts": { - "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" }, "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { @@ -715,7 +715,7 @@ } ], "config_location": "https://seldesalm.citizenwallet.xyz/config/community.json", - "version": 4 + "version": 5 }, { "community": { @@ -760,13 +760,6 @@ "name": "Gnosis Explorer" }, "accounts": { - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - }, "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 100, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", @@ -789,7 +782,7 @@ }, "plugins": [], "config_location": "https://my.techi.be/assets/community.json", - "version": 4 + "version": 5 }, { "community": { @@ -809,7 +802,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x9406Cc6185a346906296840746125a0E44976454", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -835,6 +828,14 @@ "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", "paymaster_type": "payg", "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "payg", + "gas_extra_percentage": 50 } }, "chains": { @@ -851,7 +852,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.regensunite.earth.json", - "version": 4 + "version": 5 }, { "community": { @@ -874,7 +875,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -899,6 +900,13 @@ "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw" } }, "chains": { @@ -915,7 +923,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/gt.celo.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -937,7 +945,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -962,6 +970,13 @@ "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw" } }, "chains": { @@ -978,7 +993,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/ceur.celo.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -997,7 +1012,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -1023,6 +1038,14 @@ "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", "paymaster_type": "cw", "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw", + "gas_extra_percentage": 50 } }, "chains": { @@ -1039,7 +1062,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/eure.polygon.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1061,7 +1084,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -1103,7 +1126,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/app.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1125,7 +1148,7 @@ "chain_id": 8453 }, "primary_account_factory": { - "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 8453 } }, @@ -1167,7 +1190,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/usdc.base.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1187,7 +1210,7 @@ "chain_id": 8453 }, "primary_account_factory": { - "address": "0x9406Cc6185a346906296840746125a0E44976454", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 8453 } }, @@ -1228,7 +1251,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.oak.community.json", - "version": 4 + "version": 5 }, { "community": { @@ -1247,7 +1270,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -1288,7 +1311,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/sbc.polygon.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1307,7 +1330,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -1348,7 +1371,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/zinne.brussels.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1367,7 +1390,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x39b77d77f7677997871b304094a05295eb71e240", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1416,7 +1439,7 @@ } ], "config_location": "https://timebank.regensunite.earth/indexer", - "version": 4 + "version": 5 }, { "community": { @@ -1435,7 +1458,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1484,7 +1507,7 @@ } ], "config_location": "https://config.internal.citizenwallet.xyz/v4/moos.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1503,7 +1526,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1552,7 +1575,7 @@ } ], "config_location": "https://config.internal.citizenwallet.xyz/v4/selcoupdepouce.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1571,7 +1594,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1611,7 +1634,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/cit.celo.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1634,7 +1657,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 }, "card_factory": { @@ -1685,7 +1708,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.wolugo.be.json", - "version": 4 + "version": 5 }, { "community": { @@ -1704,7 +1727,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0xE79E19594A749330036280c685E2719d58d99052", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1744,7 +1767,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/wtc.celo.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1763,7 +1786,7 @@ "chain_id": 84532 }, "primary_account_factory": { - "address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 84532 } }, @@ -1803,7 +1826,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/testnet-ethldn.json", - "version": 4 + "version": 5 }, { "community": { @@ -1822,7 +1845,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1862,7 +1885,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/celo-c.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1907,11 +1930,11 @@ "name": "Celo Explorer" }, "accounts": { - "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" }, "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { @@ -1935,6 +1958,6 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.kingfishersmedia.io.json", - "version": 4 + "version": 5 } ] \ No newline at end of file diff --git a/assets/config/v5/communities.test.json b/assets/config/v5/communities.test.json index 85557855..e629c204 100644 --- a/assets/config/v5/communities.test.json +++ b/assets/config/v5/communities.test.json @@ -37,13 +37,6 @@ "name": "Polygon Explorer" }, "accounts": { - "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - }, "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 137, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", @@ -80,7 +73,7 @@ } ], "config_location": "https://config.internal.citizenwallet.xyz/v4/ctzn.json", - "version": 4 + "version": 5 }, { "community": { @@ -103,7 +96,7 @@ "chain_id": 100 }, "primary_account_factory": { - "address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 100 }, "primary_card_manager": { @@ -133,11 +126,11 @@ "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", "paymaster_type": "cw" }, - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 100, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, @@ -170,7 +163,7 @@ } ], "config_location": "https://wallet.pay.brussels/config/community.json", - "version": 4 + "version": 5 }, { "community": { @@ -191,7 +184,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 }, "primary_card_manager": { @@ -221,13 +214,6 @@ "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", "paymaster_type": "cw" }, - "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - }, "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", @@ -257,7 +243,7 @@ }, "plugins": [], "config_location": "https://gratitude.citizenwallet.xyz/config/community.json", - "version": 4 + "version": 5 }, { "community": { @@ -279,7 +265,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -336,7 +322,7 @@ } ], "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", - "version": 4 + "version": 5 }, { "community": { @@ -377,11 +363,11 @@ "name": "Gnosis Explorer" }, "accounts": { - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 100, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, @@ -399,7 +385,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/txirrin.json", - "version": 4 + "version": 5 }, { "community": { @@ -439,11 +425,11 @@ "name": "Polygon Explorer" }, "accounts": { - "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 137, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, @@ -460,7 +446,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/boliviapay.json", - "version": 4 + "version": 5 }, { "community": { @@ -478,7 +464,7 @@ "chain_id": 100 }, "primary_account_factory": { - "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 100 } }, @@ -504,11 +490,11 @@ "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", "paymaster_type": "cw" }, - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 100, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" }, "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { @@ -549,7 +535,7 @@ } ], "config_location": "https://config.internal.citizenwallet.xyz/v4/bread.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -571,7 +557,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -634,7 +620,7 @@ } ], "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.commonshub.brussels.json", - "version": 4 + "version": 5 }, { "community": { @@ -678,11 +664,11 @@ "name": "Celo Explorer" }, "accounts": { - "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, @@ -722,7 +708,7 @@ } ], "config_location": "https://seldesalm.citizenwallet.xyz/config/community.json", - "version": 4 + "version": 5 }, { "community": { @@ -767,11 +753,11 @@ "name": "Gnosis Explorer" }, "accounts": { - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 100, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, @@ -789,7 +775,7 @@ }, "plugins": [], "config_location": "https://my.techi.be/assets/community.json", - "version": 4 + "version": 5 }, { "community": { @@ -809,7 +795,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x9406Cc6185a346906296840746125a0E44976454", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -851,7 +837,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.regensunite.earth.json", - "version": 4 + "version": 5 }, { "community": { @@ -874,7 +860,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -915,7 +901,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/gt.celo.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -937,7 +923,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -978,7 +964,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/ceur.celo.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -997,7 +983,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -1039,7 +1025,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/eure.polygon.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1061,7 +1047,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -1103,7 +1089,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/app.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1125,7 +1111,7 @@ "chain_id": 8453 }, "primary_account_factory": { - "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 8453 } }, @@ -1167,7 +1153,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/usdc.base.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1187,7 +1173,7 @@ "chain_id": 8453 }, "primary_account_factory": { - "address": "0x9406Cc6185a346906296840746125a0E44976454", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 8453 } }, @@ -1228,7 +1214,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.oak.community.json", - "version": 4 + "version": 5 }, { "community": { @@ -1247,7 +1233,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -1288,7 +1274,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/sbc.polygon.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1307,7 +1293,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 } }, @@ -1348,7 +1334,7 @@ }, "plugins": [], "config_location": "https://config.internal.citizenwallet.xyz/v4/zinne.brussels.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1367,7 +1353,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x39b77d77f7677997871b304094a05295eb71e240", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1416,7 +1402,7 @@ } ], "config_location": "https://timebank.regensunite.earth/indexer", - "version": 4 + "version": 5 }, { "community": { @@ -1435,7 +1421,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1484,7 +1470,7 @@ } ], "config_location": "https://config.internal.citizenwallet.xyz/v4/moos.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1503,7 +1489,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1552,7 +1538,7 @@ } ], "config_location": "https://config.internal.citizenwallet.xyz/v4/selcoupdepouce.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1571,7 +1557,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1611,7 +1597,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/cit.celo.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1634,7 +1620,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 }, "card_factory": { @@ -1685,7 +1671,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.wolugo.be.json", - "version": 4 + "version": 5 }, { "community": { @@ -1704,7 +1690,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0xE79E19594A749330036280c685E2719d58d99052", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1744,7 +1730,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/wtc.celo.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1763,7 +1749,7 @@ "chain_id": 84532 }, "primary_account_factory": { - "address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 84532 } }, @@ -1803,7 +1789,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/testnet-ethldn.json", - "version": 4 + "version": 5 }, { "community": { @@ -1822,7 +1808,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 } }, @@ -1862,7 +1848,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/celo-c.citizenwallet.xyz.json", - "version": 4 + "version": 5 }, { "community": { @@ -1907,11 +1893,11 @@ "name": "Celo Explorer" }, "accounts": { - "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, @@ -1928,6 +1914,6 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.kingfishersmedia.io.json", - "version": 4 + "version": 5 } ] \ No newline at end of file diff --git a/assets/config/v5/debug.json b/assets/config/v5/debug.json index 4692a2c0..47501c0f 100644 --- a/assets/config/v5/debug.json +++ b/assets/config/v5/debug.json @@ -41,13 +41,6 @@ "name": "Celo Explorer" }, "accounts": { - "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - }, "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", @@ -69,5 +62,5 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.kingfishersmedia.io.json", - "version": 4 + "version": 5 } \ No newline at end of file diff --git a/lib/services/db/backup/accounts.dart b/lib/services/db/backup/accounts.dart index 69f539f2..2b8dcc8b 100644 --- a/lib/services/db/backup/accounts.dart +++ b/lib/services/db/backup/accounts.dart @@ -52,7 +52,7 @@ class DBAccount { address: EthereumAddress.fromHex(map['address']), name: map['name'], username: map['username'], - accountFactoryAddress: map['accountFactoryAddress'], + accountFactoryAddress: map['accountFactoryAddress'] ?? '', privateKey: map['privateKey'] != null ? EthPrivateKey.fromHex(map['privateKey']) : null, @@ -122,6 +122,7 @@ class AccountsTable extends DBTable { ], 4: [ 'ALTER TABLE $name ADD COLUMN accountFactoryAddress TEXT', + 'UPDATE $name SET accountFactoryAddress = "" WHERE accountFactoryAddress IS NULL', ] }; @@ -169,17 +170,58 @@ class AccountsTable extends DBTable { // get account by id Future get(EthereumAddress address, String alias, String accountFactoryAddress) async { + final accountId = getAccountID(address, alias, accountFactoryAddress); + + if (accountFactoryAddress.isEmpty) { + var maps = await db.query( + name, + where: 'id = ?', + whereArgs: [accountId], + ); + + if (maps.isNotEmpty) { + final account = DBAccount.fromMap(maps.first); + return account; + } + + final oldFormatId = '${address.hexEip55}@$alias'; + maps = await db.query( + name, + where: 'id = ?', + whereArgs: [oldFormatId], + ); + + if (maps.isNotEmpty) { + final account = DBAccount.fromMap(maps.first); + return account; + } + + maps = await db.query( + name, + where: 'address = ? AND alias = ?', + whereArgs: [address.hexEip55, alias], + ); + + if (maps.isNotEmpty) { + final account = DBAccount.fromMap(maps.first); + return account; + } + + return null; + } + final List> maps = await db.query( name, where: 'id = ?', - whereArgs: [getAccountID(address, alias, accountFactoryAddress)], + whereArgs: [accountId], ); if (maps.isEmpty) { return null; } - return DBAccount.fromMap(maps.first); + final account = DBAccount.fromMap(maps.first); + return account; } Future insert(DBAccount account) async { From 3aeb5bc71925a64149129a1a3d6ba1153a43299d Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Wed, 30 Jul 2025 12:15:12 +0530 Subject: [PATCH 11/46] Community.json update --- assets/config/v5/communities.json | 3992 ++++++++++++------------ assets/config/v5/communities.test.json | 178 +- 2 files changed, 2175 insertions(+), 1995 deletions(-) diff --git a/assets/config/v5/communities.json b/assets/config/v5/communities.json index ff8d44c1..0753256c 100644 --- a/assets/config/v5/communities.json +++ b/assets/config/v5/communities.json @@ -1,1963 +1,2031 @@ [ - { - "community": { - "name": "Citizen Wallet (CTZN)", - "description": "The token powering the Citizen Wallet economy.", - "url": "https://citizenwallet.xyz", - "alias": "ctzn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "theme": { - "primary": "#9563D3" - }, - "profile": { - "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", - "chain_id": 137 - }, - "primary_token": { - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { - "standard": "erc20", - "name": "Citizen Wallet", - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "symbol": "CTZN", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://citizenwallet.xyz/pay-with-ctzn", - "launch_mode": "browser" - }, - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://my.citizenwallet.xyz/onramp", - "action": "topup", - "signature": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v5/ctzn.json", - "version": 5 - }, - { - "community": { - "name": "Brussels Pay", - "description": "A community for the city of Brussels", - "url": "https://pay.brussels", - "alias": "wallet.pay.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "custom_domain": "wallet.pay.brussels", - "hidden": false, - "theme": { - "primary": "#4a90e2" - }, - "profile": { - "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", - "chain_id": 100 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "chain_id": 100 - } - }, - "tokens": { - "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "pay.brussels", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "EURb", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { - "chain_id": 100, - "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", - "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", - "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_type": "cw" - }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "cards": { - "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { - "chain_id": 100, - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "type": "classic" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.pay.brussels", - "ws_url": "wss://engine.pay.brussels" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "url": "https://checkout.pay.brussels/topup", - "action": "topup", - "signature": true - } - ], - "config_location": "https://wallet.pay.brussels/config/community.json", - "version": 5 - }, - { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token of gratitude.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gratitude", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "theme": { - "primary": "#4EC19D" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "cards": { - "42220:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { - "chain_id": 42220, - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "type": "classic" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://gratitude.citizenwallet.xyz/config/community.json", - "version": 5 - }, - { - "community": { - "name": "SFLUV Community", - "description": "A community currency for the city of San Francisco.", - "url": "https://sfluv.org", - "alias": "wallet.sfluv.org", - "custom_domain": "wallet.sfluv.org", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "theme": { - "primary": "#eb6c6c" - }, - "profile": { - "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "chain_id": 137 - }, - "primary_token": { - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { - "standard": "erc20", - "name": "SFLUV V1.1", - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "symbol": "SFLUV", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { - "chain_id": 137, - "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", - "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", - "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "url": "https://app.sfluv.org", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", - "version": 5 - }, - { - "community": { - "name": "Txirrin", - "description": "A community for Txirrin", - "url": "https://citizenwallet.xyz/txirrin", - "alias": "txirrin", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", - "hidden": false, - "theme": { - "primary": "#FB7502" - }, - "profile": { - "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", - "chain_id": 100 - }, - "primary_token": { - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - } - }, - "tokens": { - "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { - "standard": "erc20", - "name": "Txirrin", - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "symbol": "TXI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/txirrin.json", - "version": 5 - }, - { - "community": { - "name": "Bolivia Pay", - "description": "A community for Ethereum Bolivia.", - "url": "https://www.ethereumbolivia.org", - "alias": "boliviapay", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", - "theme": { - "primary": "#009393" - }, - "profile": { - "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", - "chain_id": 137 - }, - "primary_token": { - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { - "standard": "erc20", - "name": "(PoS) Tether USD", - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "symbol": "USDT", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/boliviapay.json", - "version": 5 - }, - { - "community": { - "name": "Breadchain Community Token", - "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", - "url": "https://breadchain.xyz/", - "alias": "bread", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "profile": { - "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", - "chain_id": 100 - }, - "primary_token": { - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - } - }, - "tokens": { - "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { - "standard": "erc20", - "name": "Breadchain Community Token", - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "symbol": "BREAD", - "decimals": 18, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { - "chain_id": 100, - "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", - "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_type": "cw" - }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://marketplace.citizenwallet.xyz/bread", - "launch_mode": "webview", - "signature": true - }, - { - "name": "Breadcon 2025 Faucet", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://faucet.citizenwallet.xyz/breadcon2025", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/bread.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "Commons Hub Brussels", - "description": "Community Token for the Commons Hub Brussels community", - "url": "https://commonshub.brussels", - "alias": "wallet.commonshub.brussels", - "custom_domain": "wallet.commonshub.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", - "theme": { - "primary": "#ff4c02" - }, - "profile": { - "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { - "standard": "erc20", - "name": "Commons Hub Token", - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "symbol": "CHT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { - "chain_id": 42220, - "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", - "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "cards": { - "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { - "chain_id": 42220, - "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", - "type": "classic" - } - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.commonshub.brussels.json", - "version": 5 - }, - { - "community": { - "name": "Sel de Salm", - "description": "La communauté de Sel de Salm", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "alias": "seldesalm", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "theme": { - "primary": "#6B5CA4" - }, - "profile": { - "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { - "standard": "erc20", - "name": "Myrtille", - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "symbol": "MYRT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "cards": { - "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 42220, - "instance_id": "cw-seldesalm", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Informations Générales", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "launch_mode": "webview" - }, - { - "name": "Échanges", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://marketplace.citizenwallet.xyz/seldesalm", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://seldesalm.citizenwallet.xyz/config/community.json", - "version": 5 - }, - { - "community": { - "name": "TECHI", - "description": "A community for TECHI users", - "url": "https://my.techi.be", - "alias": "my.techi.be", - "logo": "https://my.techi.be/assets/token.svg", - "hidden": false, - "theme": { - "primary": "#617FF8" - }, - "profile": { - "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", - "chain_id": 100 - }, - "primary_token": { - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "chain_id": 100 - } - }, - "tokens": { - "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { - "standard": "erc20", - "name": "TECHI", - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "symbol": "TECHI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.my.techi.be", - "ws_url": "wss://engine.my.techi.be" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.techi.be/assets/community.json", - "version": 5 - }, - { - "community": { - "name": "Regens Unite", - "description": "A community currency for the Regens Unite community.", - "url": "https://www.regensunite.earth/", - "alias": "wallet.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "custom_domain": "wallet.regensunite.earth", - "hidden": true, - "profile": { - "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "Regens Unite Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "RGN", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 137, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg", - "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "payg", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.regensunite.earth.json", - "version": 5 - }, - { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gt.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "custom_domain": null, - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/gt.celo.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "Celo Euro", - "description": "Celo Euro is a stablecoin for the Celo Community.", - "url": "https://celo.org/", - "alias": "ceur.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { - "standard": "erc20", - "name": "Celo Euro", - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "symbol": "cEUR", - "decimals": 18, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { - "chain_id": 42220, - "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", - "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/ceur.celo.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "EUR e-money", - "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", - "url": "https://monerium.com/tokens/", - "alias": "eure.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", - "hidden": true, - "profile": { - "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { - "standard": "erc20", - "name": "EUR emoney", - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "symbol": "EURe", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { - "chain_id": 137, - "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", - "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", - "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", - "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/eure.polygon.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "USDC on Polygon", - "description": "The community of people using USDC on Polygon.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "app", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "chain_id": 137 - }, - "primary_token": { - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "symbol": "USDC", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { - "chain_id": 137, - "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", - "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", - "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/app.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "USDC on Base", - "description": "The community of people using USDC on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "usdc.base", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "symbol": "USDC", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { - "chain_id": 8453, - "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/usdc.base.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "OAK Community", - "description": "A community currency for the city of Oakland.", - "url": "https://www.oak.community/", - "alias": "wallet.oak.community", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", - "custom_domain": "wallet.oak.community", - "hidden": true, - "profile": { - "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { - "standard": "erc20", - "name": "OAK Community Currency", - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "symbol": "OAK", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 8453, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x123", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg" - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.oak.community.json", - "version": 5 - }, - { - "community": { - "name": "Stable Coin", - "description": "SBC is a digital dollar stablecoin issued by Brale", - "url": "https://brale.xyz/", - "alias": "sbc.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", - "hidden": true, - "profile": { - "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "chain_id": 137 - }, - "primary_token": { - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { - "standard": "erc20", - "name": "Stable Coin", - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "symbol": "SBC", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { - "chain_id": 137, - "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", - "paymaster_address": "0x123", - "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", - "paymaster_type": "cw" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/sbc.polygon.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "Zinne.brussels", - "description": "A community currency for the city of Brussels", - "url": "https://zinne.brussels", - "alias": "zinne", - "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", - "hidden": true, - "profile": { - "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", - "chain_id": 137 - }, - "primary_token": { - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { - "standard": "erc20", - "name": "Zinne.brussels Token", - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "symbol": "ZINNE", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { - "chain_id": 137, - "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", - "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", - "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", - "paymaster_type": "cw" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/zinne.brussels.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "Regens Unite Time Bank", - "description": "Make time to regen", - "url": "https://regensunite.earth", - "alias": "timebank.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "hidden": true, - "profile": { - "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x186DaBD027e228C988777907465807FDab270894", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x186DaBD027e228C988777907465807FDab270894": { - "standard": "erc20", - "name": "Regen Hour", - "address": "0x186DaBD027e228C988777907465807FDab270894", - "symbol": "rHour", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x39b77d77f7677997871b304094a05295eb71e240": { - "chain_id": 42220, - "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", - "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", - "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://timebank.regensunite.earth/indexer", - "version": 5 - }, - { - "community": { - "name": "MOOS Token", - "description": "A community currency for MOOS.", - "url": "https://www.moos.garden/", - "alias": "moos", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", - "hidden": true, - "profile": { - "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { - "standard": "erc20", - "name": "MOOS Token", - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "symbol": "MOOS", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { - "chain_id": 42220, - "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", - "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", - "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", - "url": "https://marketplace.citizenwallet.xyz/moos", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/moos.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "Bonne Heure", - "description": "Système d'Échange Local de Villers-la-Ville", - "url": "https://selcoupdepouce.be", - "alias": "selcoupdepouce", - "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", - "hidden": true, - "profile": { - "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { - "standard": "erc20", - "name": "Bonne Heure", - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "symbol": "BHR", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { - "chain_id": 42220, - "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", - "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", - "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", - "launch_mode": "browser", - "signature": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/selcoupdepouce.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "CI token", - "description": "Monnaie locale du Cercle Informatique de l’ULB", - "url": "https://citizenwallet.xyz/cit", - "alias": "cit.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", - "hidden": true, - "profile": { - "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { - "standard": "erc20", - "name": "CI token", - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "symbol": "CIT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { - "chain_id": 42220, - "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", - "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", - "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/cit.celo.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "Wolugo", - "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", - "url": "https://wolugo.be", - "alias": "wallet.wolugo.be", - "custom_domain": "wallet.wolugo.be", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", - "theme": { - "primary": "#81e2c1" - }, - "hidden": true, - "profile": { - "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "card_factory": { - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { - "standard": "erc20", - "name": "Wolu", - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "symbol": "WOLU", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { - "chain_id": 42220, - "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", - "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", - "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", - "paymaster_type": "cw" - } - }, - "cards": { - "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { - "chain_id": 42220, - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "type": "classic" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.wolugo.be.json", - "version": 5 - }, - { - "community": { - "name": "Woluwe Test", - "description": "Local currency for the Woluwe Test community.", - "url": "https://wollet-v2.citizenwallet.net/token", - "alias": "wtc.celo", - "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", - "hidden": true, - "profile": { - "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { - "standard": "erc20", - "name": "Woluwe Test Coin", - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "symbol": "WTC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xE79E19594A749330036280c685E2719d58d99052": { - "chain_id": 42220, - "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", - "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/wtc.celo.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "ETHGlobal London Token", - "description": "The community of people using ETHLDN on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "testnet-ethldn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", - "hidden": true, - "profile": { - "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", - "chain_id": 84532 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 84532 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 84532 - } - }, - "tokens": { - "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "ETHGlobal London Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "ETHLDN", - "decimals": 6, - "chain_id": 84532 - } - }, - "scan": { - "url": "https://sepolia.basescan.org", - "name": "Base Sepolia Explorer" - }, - "accounts": { - "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { - "chain_id": 84532, - "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", - "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", - "paymaster_type": "cw" - } - }, - "chains": { - "84532": { - "id": 84532, - "node": { - "url": "https://84532.engine.citizenwallet.xyz", - "ws_url": "wss://84532.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/testnet-ethldn.json", - "version": 5 - }, - { - "community": { - "name": "Celo Community Point", - "description": "This is a community for the Celo Point", - "url": "https://citizenwallet.xyz", - "alias": "celo-c.citizenwallet.xyz", - "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", - "hidden": true, - "profile": { - "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { - "standard": "erc20", - "name": "Celo Community Point", - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "symbol": "CeloC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { - "chain_id": 42220, - "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", - "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", - "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/celo-c.citizenwallet.xyz.json", - "version": 5 - }, - { - "community": { - "name": "KFMEDIA℠", - "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", - "url": "https://kingfishersmedia.io", - "alias": "wallet.kingfishersmedia.io", - "custom_domain": "wallet.kingfishersmedia.io", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", - "theme": { - "primary": "#88292c" - }, - "profile": { - "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { - "standard": "erc1155", - "name": "KFMEDIA℠ Pathways for LATAM™", - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "symbol": "KFMPFL", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.kingfishersmedia.io.json", - "version": 5 - } -] \ No newline at end of file + { + "community": { + "name": "Citizen Wallet (CTZN)", + "description": "The token powering the Citizen Wallet economy.", + "url": "https://citizenwallet.xyz", + "alias": "ctzn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "theme": { + "primary": "#9563D3" + }, + "profile": { + "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", + "chain_id": 137 + }, + "primary_token": { + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { + "standard": "erc20", + "name": "Citizen Wallet", + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "symbol": "CTZN", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://citizenwallet.xyz/pay-with-ctzn", + "launch_mode": "browser" + }, + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://my.citizenwallet.xyz/onramp", + "action": "topup", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/ctzn", + "version": 5 + }, + { + "community": { + "name": "Brussels Pay", + "description": "A community for the city of Brussels", + "url": "https://pay.brussels", + "alias": "wallet.pay.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "custom_domain": "wallet.pay.brussels", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", + "chain_id": 100 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 100 + } + }, + "tokens": { + "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "pay.brussels", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "EURb", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { + "chain_id": 100, + "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", + "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", + "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_type": "cw" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 100, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.pay.brussels", + "ws_url": "wss://engine.pay.brussels" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "url": "https://checkout.pay.brussels/topup", + "action": "topup", + "signature": true + } + ], + "config_location": "https://wallet.pay.brussels/config/community.json", + "version": 5 + }, + { + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token of gratitude.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gratitude", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "theme": { + "primary": "#4EC19D" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "42220:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 42220, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://gratitude.citizenwallet.xyz/config/community.json", + "version": 5 + }, + { + "community": { + "name": "SFLUV Community", + "description": "A community currency for the city of San Francisco.", + "url": "https://sfluv.org", + "alias": "wallet.sfluv.org", + "custom_domain": "wallet.sfluv.org", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "theme": { + "primary": "#eb6c6c" + }, + "profile": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 137 + }, + "primary_token": { + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { + "standard": "erc20", + "name": "SFLUV V1.1", + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "symbol": "SFLUV", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "url": "https://app.sfluv.org", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.sfluv.org", + "version": 5 + }, + { + "community": { + "name": "Txirrin", + "description": "A community for Txirrin", + "url": "https://citizenwallet.xyz/txirrin", + "alias": "txirrin", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", + "hidden": false, + "theme": { + "primary": "#FB7502" + }, + "profile": { + "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", + "chain_id": 100 + }, + "primary_token": { + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + } + }, + "tokens": { + "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { + "standard": "erc20", + "name": "Txirrin", + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "symbol": "TXI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/txirrin", + "version": 5 + }, + { + "community": { + "name": "Bolivia Pay", + "description": "A community for Ethereum Bolivia.", + "url": "https://www.ethereumbolivia.org", + "alias": "boliviapay", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", + "theme": { + "primary": "#009393" + }, + "profile": { + "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", + "chain_id": 137 + }, + "primary_token": { + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "standard": "erc20", + "name": "(PoS) Tether USD", + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "symbol": "USDT", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/boliviapay", + "version": 5 + }, + { + "community": { + "name": "Breadchain Community Token", + "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", + "url": "https://breadchain.xyz/", + "alias": "bread", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "profile": { + "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", + "chain_id": 100 + }, + "primary_token": { + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + } + }, + "tokens": { + "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { + "standard": "erc20", + "name": "Breadchain Community Token", + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "symbol": "BREAD", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { + "chain_id": 100, + "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", + "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_type": "cw" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://marketplace.citizenwallet.xyz/bread", + "launch_mode": "webview", + "signature": true + }, + { + "name": "Breadcon 2025 Faucet", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://faucet.citizenwallet.xyz/breadcon2025", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/bread", + "version": 5 + }, + { + "community": { + "name": "Commons Hub Brussels", + "description": "Community Token for the Commons Hub Brussels community", + "url": "https://commonshub.brussels", + "alias": "wallet.commonshub.brussels", + "custom_domain": "wallet.commonshub.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", + "theme": { + "primary": "#ff4c02" + }, + "profile": { + "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { + "standard": "erc20", + "name": "Commons Hub Token", + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "symbol": "CHT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "cards": { + "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { + "chain_id": 42220, + "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", + "type": "classic" + } + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.commonshub.brussels", + "version": 5 + }, + { + "community": { + "name": "Sel de Salm", + "description": "La communauté de Sel de Salm", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "alias": "seldesalm", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "theme": { + "primary": "#6B5CA4" + }, + "profile": { + "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { + "standard": "erc20", + "name": "Myrtille", + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "symbol": "MYRT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "cards": { + "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 42220, + "instance_id": "cw-seldesalm", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Informations Générales", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "launch_mode": "webview" + }, + { + "name": "Échanges", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://marketplace.citizenwallet.xyz/seldesalm", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://seldesalm.citizenwallet.xyz/config/community.json", + "version": 5 + }, + { + "community": { + "name": "TECHI", + "description": "A community for TECHI users", + "url": "https://my.techi.be", + "alias": "my.techi.be", + "logo": "https://my.techi.be/assets/token.svg", + "hidden": false, + "theme": { + "primary": "#617FF8" + }, + "profile": { + "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", + "chain_id": 100 + }, + "primary_token": { + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 100 + } + }, + "tokens": { + "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { + "standard": "erc20", + "name": "TECHI", + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "symbol": "TECHI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.my.techi.be", + "ws_url": "wss://engine.my.techi.be" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.techi.be/assets/community.json", + "version": 5 + }, + { + "community": { + "name": "Regens Unite", + "description": "A community currency for the Regens Unite community.", + "url": "https://www.regensunite.earth/", + "alias": "wallet.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "custom_domain": "wallet.regensunite.earth", + "hidden": true, + "profile": { + "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "Regens Unite Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "RGN", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 137, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.regensunite.earth", + "version": 5 + }, + { + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gt.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "custom_domain": null, + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/gt.celo", + "version": 5 + }, + { + "community": { + "name": "Celo Euro", + "description": "Celo Euro is a stablecoin for the Celo Community.", + "url": "https://celo.org/", + "alias": "ceur.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { + "standard": "erc20", + "name": "Celo Euro", + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "symbol": "cEUR", + "decimals": 18, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/ceur.celo", + "version": 5 + }, + { + "community": { + "name": "EUR e-money", + "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", + "url": "https://monerium.com/tokens/", + "alias": "eure.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", + "hidden": true, + "profile": { + "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { + "standard": "erc20", + "name": "EUR emoney", + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "symbol": "EURe", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { + "chain_id": 137, + "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.polygon", + "version": 5 + }, + { + "community": { + "name": "USDC on Polygon", + "description": "The community of people using USDC on Polygon.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "app", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "chain_id": 137 + }, + "primary_token": { + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "symbol": "USDC", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { + "chain_id": 137, + "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/app", + "version": 5 + }, + { + "community": { + "name": "USDC on Base", + "description": "The community of people using USDC on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "usdc.base", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "symbol": "USDC", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { + "chain_id": 8453, + "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/usdc.base", + "version": 5 + }, + { + "community": { + "name": "OAK Community", + "description": "A community currency for the city of Oakland.", + "url": "https://www.oak.community/", + "alias": "wallet.oak.community", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", + "custom_domain": "wallet.oak.community", + "hidden": true, + "profile": { + "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { + "standard": "erc20", + "name": "OAK Community Currency", + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "symbol": "OAK", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 8453, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x123", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg" + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.oak.community", + "version": 5 + }, + { + "community": { + "name": "Stable Coin", + "description": "SBC is a digital dollar stablecoin issued by Brale", + "url": "https://brale.xyz/", + "alias": "sbc.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", + "hidden": true, + "profile": { + "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "chain_id": 137 + }, + "primary_token": { + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { + "standard": "erc20", + "name": "Stable Coin", + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "symbol": "SBC", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { + "chain_id": 137, + "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", + "paymaster_address": "0x123", + "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/sbc.polygon", + "version": 5 + }, + { + "community": { + "name": "Zinne.brussels", + "description": "A community currency for the city of Brussels", + "url": "https://zinne.brussels", + "alias": "zinne", + "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", + "hidden": true, + "profile": { + "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", + "chain_id": 137 + }, + "primary_token": { + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { + "standard": "erc20", + "name": "Zinne.brussels Token", + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "symbol": "ZINNE", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { + "chain_id": 137, + "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/zinne", + "version": 5 + }, + { + "community": { + "name": "Regens Unite Time Bank", + "description": "Make time to regen", + "url": "https://regensunite.earth", + "alias": "timebank.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "hidden": true, + "profile": { + "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x186DaBD027e228C988777907465807FDab270894", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x186DaBD027e228C988777907465807FDab270894": { + "standard": "erc20", + "name": "Regen Hour", + "address": "0x186DaBD027e228C988777907465807FDab270894", + "symbol": "rHour", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x39b77d77f7677997871b304094a05295eb71e240": { + "chain_id": 42220, + "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://timebank.regensunite.earth/indexer", + "version": 5 + }, + { + "community": { + "name": "MOOS Token", + "description": "A community currency for MOOS.", + "url": "https://www.moos.garden/", + "alias": "moos", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", + "hidden": true, + "profile": { + "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { + "standard": "erc20", + "name": "MOOS Token", + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "symbol": "MOOS", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { + "chain_id": 42220, + "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", + "url": "https://marketplace.citizenwallet.xyz/moos", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/moos", + "version": 5 + }, + { + "community": { + "name": "Bonne Heure", + "description": "Système d'Échange Local de Villers-la-Ville", + "url": "https://selcoupdepouce.be", + "alias": "selcoupdepouce", + "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", + "hidden": true, + "profile": { + "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { + "standard": "erc20", + "name": "Bonne Heure", + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "symbol": "BHR", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { + "chain_id": 42220, + "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", + "launch_mode": "browser", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/selcoupdepouce", + "version": 5 + }, + { + "community": { + "name": "CI token", + "description": "Monnaie locale du Cercle Informatique de l’ULB", + "url": "https://citizenwallet.xyz/cit", + "alias": "cit.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", + "hidden": true, + "profile": { + "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { + "standard": "erc20", + "name": "CI token", + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "symbol": "CIT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { + "chain_id": 42220, + "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/cit.celo", + "version": 5 + }, + { + "community": { + "name": "Wolugo", + "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", + "url": "https://wolugo.be", + "alias": "wallet.wolugo.be", + "custom_domain": "wallet.wolugo.be", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", + "theme": { + "primary": "#81e2c1" + }, + "hidden": true, + "profile": { + "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "card_factory": { + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { + "standard": "erc20", + "name": "Wolu", + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "symbol": "WOLU", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { + "chain_id": 42220, + "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { + "chain_id": 42220, + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.wolugo.be", + "version": 5 + }, + { + "community": { + "name": "Woluwe Test", + "description": "Local currency for the Woluwe Test community.", + "url": "https://wollet-v2.citizenwallet.net/token", + "alias": "wtc.celo", + "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", + "hidden": true, + "profile": { + "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { + "standard": "erc20", + "name": "Woluwe Test Coin", + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "symbol": "WTC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xE79E19594A749330036280c685E2719d58d99052": { + "chain_id": 42220, + "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wtc.celo", + "version": 5 + }, + { + "community": { + "name": "ETHGlobal London Token", + "description": "The community of people using ETHLDN on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "testnet-ethldn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", + "hidden": true, + "profile": { + "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", + "chain_id": 84532 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 84532 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 84532 + } + }, + "tokens": { + "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "ETHGlobal London Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "ETHLDN", + "decimals": 6, + "chain_id": 84532 + } + }, + "scan": { + "url": "https://sepolia.basescan.org", + "name": "Base Sepolia Explorer" + }, + "accounts": { + "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { + "chain_id": 84532, + "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "paymaster_type": "cw" + }, + "84532:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 84532, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "84532": { + "id": 84532, + "node": { + "url": "https://84532.engine.citizenwallet.xyz", + "ws_url": "wss://84532.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/testnet-ethldn", + "version": 5 + }, + { + "community": { + "name": "Celo Community Point", + "description": "This is a community for the Celo Point", + "url": "https://citizenwallet.xyz", + "alias": "celo-c.citizenwallet.xyz", + "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", + "hidden": true, + "profile": { + "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { + "standard": "erc20", + "name": "Celo Community Point", + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "symbol": "CeloC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { + "chain_id": 42220, + "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/celo-c.citizenwallet.xyz", + "version": 5 + }, + { + "community": { + "name": "KFMEDIA℠", + "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", + "url": "https://kingfishersmedia.io", + "alias": "wallet.kingfishersmedia.io", + "custom_domain": "wallet.kingfishersmedia.io", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", + "theme": { + "primary": "#88292c" + }, + "profile": { + "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { + "standard": "erc1155", + "name": "KFMEDIA℠ Pathways for LATAM™", + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "symbol": "KFMPFL", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", + "version": 5 + } +] diff --git a/assets/config/v5/communities.test.json b/assets/config/v5/communities.test.json index e629c204..2a8921b8 100644 --- a/assets/config/v5/communities.test.json +++ b/assets/config/v5/communities.test.json @@ -72,7 +72,7 @@ "signature": true } ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/ctzn.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/ctzn", "version": 5 }, { @@ -296,7 +296,7 @@ "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw" + "paymaster_type": "cw-safe" } }, "chains": { @@ -321,7 +321,7 @@ "hidden": true } ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.sfluv.org", "version": 5 }, { @@ -384,7 +384,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/txirrin.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/txirrin", "version": 5 }, { @@ -445,7 +445,7 @@ "ipfs": { "url": "https://ipfs.internal.citizenwallet.xyz" }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/boliviapay.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/boliviapay", "version": 5 }, { @@ -490,13 +490,6 @@ "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", "paymaster_type": "cw" }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - }, "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 100, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", @@ -534,7 +527,7 @@ "hidden": true } ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/bread.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/bread", "version": 5 }, { @@ -588,7 +581,7 @@ "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw" + "paymaster_type": "cw-safe" } }, "chains": { @@ -619,7 +612,7 @@ "signature": true } ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.commonshub.brussels.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.commonshub.brussels", "version": 5 }, { @@ -821,6 +814,13 @@ "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", "paymaster_type": "payg", "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -836,7 +836,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.regensunite.earth.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.regensunite.earth", "version": 5 }, { @@ -885,6 +885,13 @@ "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -900,7 +907,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/gt.celo.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/gt.celo", "version": 5 }, { @@ -948,6 +955,13 @@ "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -963,7 +977,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/ceur.celo.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/ceur.celo", "version": 5 }, { @@ -1009,6 +1023,13 @@ "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", "paymaster_type": "cw", "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1024,7 +1045,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/eure.polygon.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.polygon", "version": 5 }, { @@ -1073,6 +1094,13 @@ "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", "paymaster_type": "cw", "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1088,7 +1116,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/app.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/app", "version": 5 }, { @@ -1137,6 +1165,13 @@ "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", "paymaster_type": "cw", "gas_extra_percentage": 50 + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1152,7 +1187,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/usdc.base.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/usdc.base", "version": 5 }, { @@ -1198,6 +1233,13 @@ "paymaster_address": "0x123", "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", "paymaster_type": "payg" + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1213,7 +1255,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.oak.community.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.oak.community", "version": 5 }, { @@ -1258,6 +1300,13 @@ "paymaster_address": "0x123", "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1273,7 +1322,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/sbc.polygon.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/sbc.polygon", "version": 5 }, { @@ -1318,6 +1367,13 @@ "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1333,7 +1389,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/zinne.brussels.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/zinne", "version": 5 }, { @@ -1378,6 +1434,13 @@ "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1446,6 +1509,13 @@ "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1469,7 +1539,7 @@ "signature": true } ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/moos.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/moos", "version": 5 }, { @@ -1514,6 +1584,13 @@ "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1537,7 +1614,7 @@ "signature": true } ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/selcoupdepouce.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/selcoupdepouce", "version": 5 }, { @@ -1582,6 +1659,13 @@ "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1596,7 +1680,7 @@ "ipfs": { "url": "https://ipfs.internal.citizenwallet.xyz" }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/cit.celo.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/cit.celo", "version": 5 }, { @@ -1649,6 +1733,13 @@ "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "cards": { @@ -1670,7 +1761,7 @@ "ipfs": { "url": "https://ipfs.internal.citizenwallet.xyz" }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.wolugo.be.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.wolugo.be", "version": 5 }, { @@ -1715,6 +1806,13 @@ "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1729,7 +1827,7 @@ "ipfs": { "url": "https://ipfs.internal.citizenwallet.xyz" }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/wtc.celo.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/wtc.celo", "version": 5 }, { @@ -1774,6 +1872,13 @@ "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", "paymaster_type": "cw" + }, + "84532:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 84532, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1788,7 +1893,7 @@ "ipfs": { "url": "https://ipfs.internal.citizenwallet.xyz" }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/testnet-ethldn.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/testnet-ethldn", "version": 5 }, { @@ -1833,6 +1938,13 @@ "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" } }, "chains": { @@ -1847,7 +1959,7 @@ "ipfs": { "url": "https://ipfs.internal.citizenwallet.xyz" }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/celo-c.citizenwallet.xyz.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/celo-c.citizenwallet.xyz", "version": 5 }, { @@ -1913,7 +2025,7 @@ "ipfs": { "url": "https://ipfs.internal.citizenwallet.xyz" }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.kingfishersmedia.io.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", "version": 5 } -] \ No newline at end of file +] From 1d5c01e5e088b5c278c71641987bc9040ee72e7d Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Wed, 30 Jul 2025 13:09:12 +0530 Subject: [PATCH 12/46] Community.json update --- assets/config/v5/communities.json | 10 +++++----- assets/config/v5/communities.test.json | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/assets/config/v5/communities.json b/assets/config/v5/communities.json index 0753256c..272005b8 100644 --- a/assets/config/v5/communities.json +++ b/assets/config/v5/communities.json @@ -162,7 +162,7 @@ "signature": true } ], - "config_location": "https://wallet.pay.brussels/config/community.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", "version": 5 }, { @@ -242,7 +242,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://gratitude.citizenwallet.xyz/config/community.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/gratitude", "version": 5 }, { @@ -700,7 +700,7 @@ "signature": true } ], - "config_location": "https://seldesalm.citizenwallet.xyz/config/community.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/seldesalm", "version": 5 }, { @@ -767,7 +767,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://my.techi.be/assets/community.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/my.techi.be", "version": 5 }, { @@ -1464,7 +1464,7 @@ "signature": true } ], - "config_location": "https://timebank.regensunite.earth/indexer", + "config_location": "https://my.citizenwallet.xyz/api/communities/timebank.regensunite.earth", "version": 5 }, { diff --git a/assets/config/v5/communities.test.json b/assets/config/v5/communities.test.json index 2a8921b8..706abb09 100644 --- a/assets/config/v5/communities.test.json +++ b/assets/config/v5/communities.test.json @@ -162,7 +162,7 @@ "signature": true } ], - "config_location": "https://wallet.pay.brussels/config/community.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", "version": 5 }, { @@ -242,7 +242,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://gratitude.citizenwallet.xyz/config/community.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/gratitude", "version": 5 }, { @@ -700,7 +700,7 @@ "signature": true } ], - "config_location": "https://seldesalm.citizenwallet.xyz/config/community.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/seldesalm", "version": 5 }, { @@ -767,7 +767,7 @@ "url": "https://ipfs.internal.citizenwallet.xyz" }, "plugins": [], - "config_location": "https://my.techi.be/assets/community.json", + "config_location": "https://my.citizenwallet.xyz/api/communities/my.techi.be", "version": 5 }, { @@ -1464,7 +1464,7 @@ "signature": true } ], - "config_location": "https://timebank.regensunite.earth/indexer", + "config_location": "https://my.citizenwallet.xyz/api/communities/timebank.regensunite.earth", "version": 5 }, { From 101438e31e53343b45c88d84fbb5c0918963538d Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Wed, 30 Jul 2025 23:37:31 +0530 Subject: [PATCH 13/46] Update on Modal --- lib/modals/landing/app_download_modal.dart | 236 ---------------- lib/modals/landing/migration_modal.dart | 144 ++++++++++ lib/modals/wallet/migration_backup_modal.dart | 263 ------------------ lib/screens/landing/screen.dart | 58 +--- lib/screens/wallet/more_actions_sheet.dart | 23 +- lib/screens/wallet/screen.dart | 6 +- lib/services/preferences/preferences.dart | 6 + lib/state/wallet/logic.dart | 5 +- lib/state/wallet/state.dart | 1 - lib/utils/migration_modal.dart | 21 ++ 10 files changed, 184 insertions(+), 579 deletions(-) delete mode 100644 lib/modals/landing/app_download_modal.dart create mode 100644 lib/modals/landing/migration_modal.dart delete mode 100644 lib/modals/wallet/migration_backup_modal.dart create mode 100644 lib/utils/migration_modal.dart diff --git a/lib/modals/landing/app_download_modal.dart b/lib/modals/landing/app_download_modal.dart deleted file mode 100644 index 26d12e52..00000000 --- a/lib/modals/landing/app_download_modal.dart +++ /dev/null @@ -1,236 +0,0 @@ -import 'package:citizenwallet/state/backup_web/logic.dart'; -import 'package:citizenwallet/theme/provider.dart'; -import 'package:citizenwallet/widgets/button.dart'; -import 'package:citizenwallet/widgets/header.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:go_router/go_router.dart'; -import 'package:citizenwallet/l10n/app_localizations.dart'; - -class AppDownloadModal extends StatefulWidget { - final String? title; - final String? message; - - const AppDownloadModal({ - super.key, - this.title, - this.message, - }); - - @override - AppDownloadModalState createState() => AppDownloadModalState(); -} - -class AppDownloadModalState extends State { - late BackupWebLogic _logic; - - @override - void initState() { - super.initState(); - _logic = BackupWebLogic(context); - } - - void handleDismiss(BuildContext context) { - FocusManager.instance.primaryFocus?.unfocus(); - GoRouter.of(context).pop(); - } - - void handleAppStoreLink() { - _logic.openAppStore(); - } - - void handleGooglePlayLink() { - _logic.openPlayStore(); - } - - void handleNativeApp() { - _logic.openNativeApp(); - } - - @override - Widget build(BuildContext context) { - final isIOS = defaultTargetPlatform == TargetPlatform.iOS; - final isAndroid = defaultTargetPlatform == TargetPlatform.android; - final isDesktop = !isIOS && !isAndroid; - - return GestureDetector( - onTap: () => FocusManager.instance.primaryFocus?.unfocus(), - child: CupertinoPageScaffold( - backgroundColor: - Theme.of(context).colors.uiBackgroundAlt.resolveFrom(context), - child: SafeArea( - minimum: const EdgeInsets.only(left: 10, right: 10, top: 20), - child: Flex( - direction: Axis.vertical, - children: [ - Header( - title: widget.title ?? AppLocalizations.of(context)!.gettheapp, - showBackButton: true, - ), - Expanded( - child: CustomScrollView( - scrollBehavior: const CupertinoScrollBehavior(), - slivers: [ - SliverToBoxAdapter( - child: Column( - children: [ - const SizedBox(height: 40), - SvgPicture.asset( - 'assets/citizenwallet-only-logo.svg', - semanticsLabel: 'Citizen Wallet Icon', - height: 120, - ), - const SizedBox(height: 30), - if (widget.message != null) ...[ - Text( - widget.message!, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.normal, - color: Theme.of(context) - .colors - .text - .resolveFrom(context), - ), - ), - const SizedBox(height: 30), - ], - if (isIOS) ...[ - Text( - AppLocalizations.of(context)!.gettheapp, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.normal, - color: Theme.of(context) - .colors - .text - .resolveFrom(context), - ), - ), - const SizedBox(height: 20), - CupertinoButton( - onPressed: handleAppStoreLink, - child: SvgPicture.asset( - 'assets/images/app-store-badge.svg', - semanticsLabel: - AppLocalizations.of(context)!.appstorebadge, - height: 70, - ), - ), - ], - if (isAndroid) ...[ - Text( - AppLocalizations.of(context)!.gettheapp, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.normal, - color: Theme.of(context) - .colors - .text - .resolveFrom(context), - ), - ), - const SizedBox(height: 20), - CupertinoButton( - onPressed: handleGooglePlayLink, - child: Image.asset( - 'assets/images/google-play-badge.png', - semanticLabel: AppLocalizations.of(context)! - .googleplaybadge, - height: 100, - ), - ), - ], - if (isDesktop) ...[ - Text( - AppLocalizations.of(context)!.gettheapp, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.normal, - color: Theme.of(context) - .colors - .text - .resolveFrom(context), - ), - ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CupertinoButton( - onPressed: handleAppStoreLink, - child: SvgPicture.asset( - 'assets/images/app-store-badge.svg', - semanticsLabel: - AppLocalizations.of(context)! - .appstorebadge, - height: 60, - ), - ), - const SizedBox(width: 20), - CupertinoButton( - onPressed: handleGooglePlayLink, - child: Image.asset( - 'assets/images/google-play-badge.png', - semanticLabel: AppLocalizations.of(context)! - .googleplaybadge, - height: 80, - ), - ), - ], - ), - ], - if (!isDesktop) ...[ - const SizedBox(height: 40), - Text( - AppLocalizations.of(context)!.opentheapp, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.normal, - color: Theme.of(context) - .colors - .text - .resolveFrom(context), - ), - ), - const SizedBox(height: 20), - Button( - text: AppLocalizations.of(context)!.open, - suffix: Row( - children: [ - const SizedBox(width: 10), - Icon( - CupertinoIcons.arrowshape_turn_up_right, - size: 18, - color: Theme.of(context) - .colors - .black - .resolveFrom(context), - ), - ], - ), - onPressed: handleNativeApp, - minWidth: 200, - maxWidth: 200, - ), - ], - const SizedBox(height: 40), - ], - ), - ), - ], - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/modals/landing/migration_modal.dart b/lib/modals/landing/migration_modal.dart new file mode 100644 index 00000000..de394ff6 --- /dev/null +++ b/lib/modals/landing/migration_modal.dart @@ -0,0 +1,144 @@ +import 'package:citizenwallet/services/preferences/preferences.dart'; +import 'package:citizenwallet/theme/provider.dart' as theme_provider; +import 'package:citizenwallet/utils/platform.dart'; +import 'package:citizenwallet/widgets/button.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:go_router/go_router.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class MigrationModal extends StatefulWidget { + const MigrationModal({super.key}); + + @override + MigrationModalState createState() => MigrationModalState(); +} + +class MigrationModalState extends State { + late PreferencesService _preferences; + + @override + void initState() { + super.initState(); + _preferences = PreferencesService(); + } + + void handleDismiss() { + _preferences.setMigrationModalShown(true); + GoRouter.of(context).pop(); + } + + void handleDownload() async { + _preferences.setMigrationModalShown(true); + + String url; + if (isPlatformApple()) { + url = ''; + } else if (isPlatformAndroid()) { + url = ''; + } else { + url = ''; + } + + try { + final uri = Uri.parse(url); + if (await canLaunchUrl(uri)) { + await launchUrl(uri, mode: LaunchMode.externalApplication); + } + } catch (e) { + debugPrint('Could not launch URL: $url'); + } + + if (mounted) { + GoRouter.of(context).pop(); + } + } + + @override + Widget build(BuildContext context) { + final theme = theme_provider.Theme.of(context); + + return Container( + height: MediaQuery.of(context).size.height * 0.5, + decoration: BoxDecoration( + color: CupertinoColors.systemBackground, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ), + child: Padding( + padding: const EdgeInsets.all(15), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Icon or Logo + Container( + width: 80, + height: 80, + decoration: BoxDecoration( + color: theme.colors.surfacePrimary.resolveFrom(context).withOpacity(0.1), + borderRadius: BorderRadius.circular(20), + ), + child: Icon( + CupertinoIcons.arrow_up_circle_fill, + size: 40, + color: theme.colors.surfacePrimary.resolveFrom(context), + ), + ), + + const SizedBox(height: 24), + + // Title + Text( + 'We\'ve Moved!', + style: const TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + ), + textAlign: TextAlign.center, + ), + + const SizedBox(height: 16), + + // Message + Text( + 'We\'ve migrated to a new and improved application. Download the new app to continue enjoying all the features with enhanced security and performance.', + style: TextStyle( + fontSize: 16, + color: CupertinoColors.label.resolveFrom(context).withOpacity(0.8), + ), + textAlign: TextAlign.center, + ), + + const SizedBox(height: 32), + + // Download Button + SizedBox( + width: double.infinity, + child: Button( + onPressed: handleDownload, + text: isPlatformApple() + ? 'Download on App Store' + : 'Download on Play Store', + color: theme.colors.surfacePrimary.resolveFrom(context), + ), + ), + + const SizedBox(height: 16), + + // Dismiss Button + SizedBox( + width: double.infinity, + child: Button( + onPressed: handleDismiss, + text: 'Not Now', + color: CupertinoColors.systemGrey4, + labelColor: CupertinoColors.label, + ), + ), + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/modals/wallet/migration_backup_modal.dart b/lib/modals/wallet/migration_backup_modal.dart deleted file mode 100644 index cb456205..00000000 --- a/lib/modals/wallet/migration_backup_modal.dart +++ /dev/null @@ -1,263 +0,0 @@ -import 'package:citizenwallet/state/backup/logic.dart'; -import 'package:citizenwallet/state/backup/state.dart'; -import 'package:citizenwallet/state/notifications/state.dart'; -import 'package:citizenwallet/theme/provider.dart'; -import 'package:citizenwallet/widgets/button.dart'; -import 'package:citizenwallet/widgets/header.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:go_router/go_router.dart'; -import 'package:provider/provider.dart'; - -class MigrationBackupModal extends StatefulWidget { - final String? title; - final String? message; - - const MigrationBackupModal({ - super.key, - this.title, - this.message, - }); - - @override - MigrationBackupModalState createState() => MigrationBackupModalState(); -} - -class MigrationBackupModalState extends State { - late BackupLogic _backupLogic; - - @override - void initState() { - super.initState(); - _backupLogic = BackupLogic(context); - } - - void handleDismiss(BuildContext context) { - FocusManager.instance.primaryFocus?.unfocus(); - GoRouter.of(context).pop(); - } - - void handleBackupWallet() async { - HapticFeedback.heavyImpact(); - - try { - await _backupLogic.backupAndroid(); - - if (mounted) { - context.read().toastShow( - 'Wallet backed up successfully!', - type: ToastType.success, - ); - handleDismiss(context); - } - } catch (e) { - if (mounted) { - context.read().toastShow( - 'Failed to backup wallet. Please try again.', - type: ToastType.error, - ); - } - } - } - - void handleRestoreWallet() async { - HapticFeedback.heavyImpact(); - - try { - final hasAccounts = await _backupLogic.hasAccounts(); - - if (hasAccounts) { - await _backupLogic.setupAndroidFromRecovery(); - - if (mounted) { - context.read().toastShow( - 'Wallet restored successfully!', - type: ToastType.success, - ); - handleDismiss(context); - } - } else { - if (mounted) { - context.read().toastShow( - 'No backup found to restore.', - type: ToastType.error, - ); - } - } - } catch (e) { - if (mounted) { - context.read().toastShow( - 'Failed to restore wallet. Please try again.', - type: ToastType.error, - ); - } - } - } - - void handleMigrateWallet() async { - HapticFeedback.heavyImpact(); - - try { - if (mounted) { - context.read().toastShow( - 'Wallet migration completed!', - type: ToastType.success, - ); - handleDismiss(context); - } - } catch (e) { - if (mounted) { - context.read().toastShow( - 'Failed to migrate wallet. Please try again.', - type: ToastType.error, - ); - } - } - } - - @override - Widget build(BuildContext context) { - final loading = context.select((BackupState state) => state.loading); - - return GestureDetector( - onTap: () => FocusManager.instance.primaryFocus?.unfocus(), - child: CupertinoPageScaffold( - backgroundColor: - Theme.of(context).colors.uiBackgroundAlt.resolveFrom(context), - child: SafeArea( - minimum: const EdgeInsets.only(left: 10, right: 10, top: 20), - child: Flex( - direction: Axis.vertical, - children: [ - Header( - title: widget.title ?? 'Wallet Management', - showBackButton: true, - ), - Expanded( - child: CustomScrollView( - scrollBehavior: const CupertinoScrollBehavior(), - slivers: [ - SliverToBoxAdapter( - child: Column( - children: [ - const SizedBox(height: 40), - SvgPicture.asset( - 'assets/citizenwallet-only-logo.svg', - semanticsLabel: 'Citizen Wallet Icon', - height: 100, - ), - const SizedBox(height: 30), - if (widget.message != null) ...[ - Text( - widget.message!, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.normal, - color: Theme.of(context) - .colors - .text - .resolveFrom(context), - ), - ), - const SizedBox(height: 30), - ], - Text( - 'Secure your wallet and manage your data', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.normal, - color: Theme.of(context) - .colors - .text - .resolveFrom(context), - ), - ), - const SizedBox(height: 40), - if (loading) ...[ - const CupertinoActivityIndicator(), - const SizedBox(height: 20), - Text( - 'Processing...', - style: TextStyle( - fontSize: 14, - color: Theme.of(context) - .colors - .text - .resolveFrom(context), - ), - ), - ] else ...[ - Button( - text: 'Backup Wallet', - prefix: Icon( - CupertinoIcons.cloud_upload, - size: 20, - color: Theme.of(context) - .colors - .black - .resolveFrom(context), - ), - onPressed: handleBackupWallet, - minWidth: 250, - maxWidth: 250, - ), - const SizedBox(height: 20), - Button( - text: 'Restore Wallet', - prefix: Icon( - CupertinoIcons.cloud_download, - size: 20, - color: Theme.of(context) - .colors - .black - .resolveFrom(context), - ), - onPressed: handleRestoreWallet, - minWidth: 250, - maxWidth: 250, - ), - const SizedBox(height: 20), - Button( - text: 'Migrate Wallet', - prefix: Icon( - CupertinoIcons.arrow_right_arrow_left, - size: 20, - color: Theme.of(context) - .colors - .black - .resolveFrom(context), - ), - onPressed: handleMigrateWallet, - minWidth: 250, - maxWidth: 250, - ), - ], - const SizedBox(height: 40), - Text( - 'Your wallet data is encrypted and secure', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 12, - color: Theme.of(context) - .colors - .text - .resolveFrom(context) - .withOpacity(0.6), - ), - ), - ], - ), - ), - ], - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/screens/landing/screen.dart b/lib/screens/landing/screen.dart index 6bd38894..be005eaa 100644 --- a/lib/screens/landing/screen.dart +++ b/lib/screens/landing/screen.dart @@ -1,6 +1,6 @@ // import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:citizenwallet/modals/account/select_account.dart'; -import 'package:citizenwallet/modals/landing/app_download_modal.dart'; + import 'package:citizenwallet/modals/wallet/community_picker.dart'; import 'package:citizenwallet/router/utils.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; @@ -11,6 +11,7 @@ import 'package:citizenwallet/state/backup/state.dart'; import 'package:citizenwallet/state/communities/logic.dart'; import 'package:citizenwallet/state/vouchers/logic.dart'; import 'package:citizenwallet/theme/provider.dart'; +import 'package:citizenwallet/utils/migration_modal.dart'; import 'package:citizenwallet/utils/platform.dart'; import 'package:citizenwallet/widgets/scanner/scanner_modal.dart'; import 'package:flutter/cupertino.dart'; @@ -209,6 +210,8 @@ class LandingScreenState extends State _appLogic.appLoaded(); + await MigrationModalUtils.showMigrationModalIfNeeded(context); + navigator.go('/wallet/$address$params'); } @@ -332,17 +335,7 @@ class LandingScreenState extends State navigator.push('/recovery'); } - void handleShowAppDownload() async { - await showCupertinoModalBottomSheet( - context: context, - expand: true, - useRootNavigator: true, - builder: (modalContext) => const AppDownloadModal( - title: 'Get Citizen Wallet', - message: 'Download the app for the best experience', - ), - ); - } + void handleQRScan() async { final navigator = GoRouter.of(context); @@ -684,46 +677,7 @@ class LandingScreenState extends State ), ), const SizedBox(height: 20), - CupertinoButton( - onPressed: handleShowAppDownload, - child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: maxWidth, - ), - child: Row( - mainAxisAlignment: - MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Text( - 'Get the App', - style: TextStyle( - color: Theme.of(context) - .colors - .primary - .resolveFrom(context), - fontSize: 18, - fontWeight: FontWeight.bold, - ), - maxLines: 2, - textAlign: TextAlign.center, - ), - const SizedBox( - width: 10, - height: 44, - ), - Icon( - CupertinoIcons.arrow_right, - color: Theme.of(context) - .colors - .primary - .resolveFrom(context), - ), - ], - ), - ), - ), + ], if (isPlatformApple()) ...[ Container( diff --git a/lib/screens/wallet/more_actions_sheet.dart b/lib/screens/wallet/more_actions_sheet.dart index d650db94..4d42efa3 100644 --- a/lib/screens/wallet/more_actions_sheet.dart +++ b/lib/screens/wallet/more_actions_sheet.dart @@ -8,7 +8,7 @@ import 'package:go_router/go_router.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:provider/provider.dart'; import 'package:citizenwallet/l10n/app_localizations.dart'; -import 'package:citizenwallet/modals/wallet/migration_backup_modal.dart'; + class MoreActionsSheet extends StatelessWidget { final void Function()? handleSendScreen; @@ -103,26 +103,7 @@ class MoreActionsSheet extends StatelessWidget { }), ); }).toList(); - case ActionButtonType.migration: - return [ - _buildSheetItem( - context, - 'Migration & Backup', - icon: CupertinoIcons.cloud_upload, - onPressed: () { - navigator.pop(); - showCupertinoModalBottomSheet( - context: context, - expand: true, - useRootNavigator: true, - builder: (modalContext) => const MigrationBackupModal( - title: 'Migration & Backup', - message: 'Manage your wallet data and security', - ), - ); - }, - ) - ]; + default: return [ Container() diff --git a/lib/screens/wallet/screen.dart b/lib/screens/wallet/screen.dart index d957f66a..f9fa2353 100644 --- a/lib/screens/wallet/screen.dart +++ b/lib/screens/wallet/screen.dart @@ -20,6 +20,7 @@ import 'package:citizenwallet/state/wallet/state.dart'; import 'package:citizenwallet/state/wallet_connect/logic.dart'; import 'package:citizenwallet/state/wallet_connect/state.dart'; import 'package:citizenwallet/theme/provider.dart'; +import 'package:citizenwallet/utils/migration_modal.dart'; import 'package:citizenwallet/utils/qr.dart'; import 'package:citizenwallet/widgets/header.dart'; import 'package:citizenwallet/widgets/scanner/scanner_modal.dart'; @@ -244,6 +245,8 @@ class WalletScreenState extends State if (_deepLink != null && _deepLinkParams != null) { await handleLoadDeepLink(); } + + await MigrationModalUtils.showMigrationModalIfNeeded(context); } Future handleDisconnect() async { @@ -1173,8 +1176,7 @@ class WalletScreenState extends State case ActionButtonType.plugins: handlePlugin(pluginConfig); break; - case ActionButtonType.migration: - break; + } } diff --git a/lib/services/preferences/preferences.dart b/lib/services/preferences/preferences.dart index 4539535b..b19c967a 100644 --- a/lib/services/preferences/preferences.dart +++ b/lib/services/preferences/preferences.dart @@ -159,4 +159,10 @@ class PreferencesService { return _preferences.getString('languageCode'); } + Future setMigrationModalShown(bool shown) async { + await _preferences.setBool('migrationModalShown', shown); + } + + bool get migrationModalShown => _preferences.getBool('migrationModalShown') ?? false; + } diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index 9cae9b4e..b9732afe 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -2221,10 +2221,7 @@ class WalletLogic extends WidgetsBindingObserver { buttonType: ActionButtonType.vouchers, )); - actionsToAdd.add(ActionButton( - label: 'Migration & Backup', - buttonType: ActionButtonType.migration, - )); + try { final isMinterResult = await isMinter(_currentConfig, _currentAccount); diff --git a/lib/state/wallet/state.dart b/lib/state/wallet/state.dart index 4997b37a..4516101d 100644 --- a/lib/state/wallet/state.dart +++ b/lib/state/wallet/state.dart @@ -12,7 +12,6 @@ enum ActionButtonType { plugins, minter, more, - migration, } class ActionButton { diff --git a/lib/utils/migration_modal.dart b/lib/utils/migration_modal.dart new file mode 100644 index 00000000..7f132769 --- /dev/null +++ b/lib/utils/migration_modal.dart @@ -0,0 +1,21 @@ +import 'package:citizenwallet/modals/landing/migration_modal.dart'; +import 'package:citizenwallet/services/preferences/preferences.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; + +class MigrationModalUtils { + static Future showMigrationModalIfNeeded(BuildContext context) async { + final preferences = PreferencesService(); + + if (preferences.migrationModalShown) { + return; + } + + await showCupertinoModalBottomSheet( + context: context, + builder: (context) => const MigrationModal(), + isDismissible: false, + enableDrag: false, + ); + } +} \ No newline at end of file From 25339363c8992f471405826617e9d2b9ce0d0ff9 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 31 Jul 2025 01:15:19 +0530 Subject: [PATCH 14/46] update on communities --- assets/config/v5/communities.json | 233 ++++++++++++++++++-- assets/config/v5/communities.test.json | 247 ++++++++++++++++++++-- lib/services/accounts/native/android.dart | 56 +++++ lib/services/accounts/native/apple.dart | 57 +++++ 4 files changed, 560 insertions(+), 33 deletions(-) diff --git a/assets/config/v5/communities.json b/assets/config/v5/communities.json index 272005b8..f70ac35c 100644 --- a/assets/config/v5/communities.json +++ b/assets/config/v5/communities.json @@ -20,6 +20,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 } }, "tokens": { @@ -45,6 +49,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "137": { "id": 137, @@ -100,7 +112,11 @@ "chain_id": 100 }, "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 100 } }, @@ -139,6 +155,20 @@ "chain_id": 100, "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", "type": "classic" + }, + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "brussels-pay", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" } }, "chains": { @@ -165,6 +195,94 @@ "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", "version": 5 }, + { + "community": { + "name": "Monerium EURe on Gnosis", + "description": "A community for EURe on Gnosis", + "url": "https://monerium.com/", + "alias": "eure.gnosis", + "logo": "https://eure.gnosis.citizenwallet.xyz/wallet-config/_images/eure.svg", + "custom_domain": "eure.gnosis.citizenwallet.xyz", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x2e297B9ef4df73c8da5070E91EF0570FA312A698", + "chain_id": 100 + }, + "primary_token": { + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430": { + "standard": "erc20", + "name": "EURe [Gnosis]", + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "symbol": "EURe", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xeBDd6ee8DB7055f62D14A5eAAB7c18ae36Cd2216", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "cards": { + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "cw-discord-1", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.gnosis", + "version": 5 + }, { "community": { "name": "Gratitude Token", @@ -187,8 +305,8 @@ "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 42220 } }, @@ -222,11 +340,12 @@ "paymaster_type": "cw-safe" } }, - "cards": { - "42220:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { "chain_id": 42220, - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "type": "classic" + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" } }, "chains": { @@ -267,6 +386,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 } }, "tokens": { @@ -294,11 +417,19 @@ "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 137, "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "paymaster_address": "0x5097dAD831FE21EF12dA31bf5d07A2e8ef6f5f1e", "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "137": { "id": 137, @@ -346,6 +477,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 } }, "tokens": { @@ -371,6 +506,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "100": { "id": 100, @@ -408,6 +551,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 } }, "tokens": { @@ -433,6 +580,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "137": { "id": 137, @@ -466,6 +621,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 } }, "tokens": { @@ -498,6 +657,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "100": { "id": 100, @@ -552,6 +719,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 } }, "tokens": { @@ -579,11 +750,19 @@ "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "paymaster_address": "0x4860C0f127500F0cbF4a5Bd797cBb5aA50Eb0FbA", "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "42220": { "id": 42220, @@ -640,6 +819,10 @@ "primary_card_manager": { "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 } }, "tokens": { @@ -665,6 +848,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "42220": { "id": 42220, @@ -726,8 +917,8 @@ "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 100 }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 100 } }, @@ -754,6 +945,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "100": { "id": 100, @@ -1985,8 +2184,8 @@ "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 42220 } }, @@ -2013,6 +2212,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "42220": { "id": 42220, diff --git a/assets/config/v5/communities.test.json b/assets/config/v5/communities.test.json index 706abb09..f70ac35c 100644 --- a/assets/config/v5/communities.test.json +++ b/assets/config/v5/communities.test.json @@ -20,6 +20,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 } }, "tokens": { @@ -45,6 +49,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "137": { "id": 137, @@ -100,7 +112,11 @@ "chain_id": 100 }, "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 100 } }, @@ -139,6 +155,20 @@ "chain_id": 100, "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", "type": "classic" + }, + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "brussels-pay", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" } }, "chains": { @@ -165,6 +195,94 @@ "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", "version": 5 }, + { + "community": { + "name": "Monerium EURe on Gnosis", + "description": "A community for EURe on Gnosis", + "url": "https://monerium.com/", + "alias": "eure.gnosis", + "logo": "https://eure.gnosis.citizenwallet.xyz/wallet-config/_images/eure.svg", + "custom_domain": "eure.gnosis.citizenwallet.xyz", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x2e297B9ef4df73c8da5070E91EF0570FA312A698", + "chain_id": 100 + }, + "primary_token": { + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430": { + "standard": "erc20", + "name": "EURe [Gnosis]", + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "symbol": "EURe", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xeBDd6ee8DB7055f62D14A5eAAB7c18ae36Cd2216", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "cards": { + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "cw-discord-1", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.gnosis", + "version": 5 + }, { "community": { "name": "Gratitude Token", @@ -187,8 +305,8 @@ "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 42220 } }, @@ -222,11 +340,12 @@ "paymaster_type": "cw-safe" } }, - "cards": { - "42220:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { "chain_id": 42220, - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "type": "classic" + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" } }, "chains": { @@ -267,6 +386,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 } }, "tokens": { @@ -294,11 +417,19 @@ "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 137, "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "paymaster_address": "0x5097dAD831FE21EF12dA31bf5d07A2e8ef6f5f1e", "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "137": { "id": 137, @@ -314,7 +445,7 @@ "plugins": [ { "name": "About", - "icon": "https://wallet.sfluv.org/uploads/logo.svg", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", "url": "https://app.sfluv.org", "launch_mode": "webview", "signature": true, @@ -346,6 +477,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 } }, "tokens": { @@ -371,6 +506,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "100": { "id": 100, @@ -408,6 +551,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 } }, "tokens": { @@ -433,6 +580,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "137": { "id": 137, @@ -466,6 +621,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 } }, "tokens": { @@ -498,6 +657,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "100": { "id": 100, @@ -520,7 +687,7 @@ }, { "name": "Breadcon 2025 Faucet", - "icon": "https://bread.citizenwallet.xyz/uploads/logo.svg", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", "url": "https://faucet.citizenwallet.xyz/breadcon2025", "launch_mode": "webview", "signature": true, @@ -552,6 +719,10 @@ "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 } }, "tokens": { @@ -579,11 +750,19 @@ "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "paymaster_address": "0x4860C0f127500F0cbF4a5Bd797cBb5aA50Eb0FbA", "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "42220": { "id": 42220, @@ -640,6 +819,10 @@ "primary_card_manager": { "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 } }, "tokens": { @@ -665,6 +848,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "42220": { "id": 42220, @@ -726,8 +917,8 @@ "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 100 }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 100 } }, @@ -754,6 +945,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "100": { "id": 100, @@ -888,7 +1087,7 @@ }, "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" @@ -958,7 +1157,7 @@ }, "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" @@ -1438,7 +1637,7 @@ "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { "chain_id": 42220, "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "paymaster_type": "cw-safe" } @@ -1458,7 +1657,7 @@ "plugins": [ { "name": "Market", - "icon": "https://timebank.regensunite.earth/uploads/logo.svg", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", "launch_mode": "webview", "signature": true @@ -1690,7 +1889,7 @@ "url": "https://wolugo.be", "alias": "wallet.wolugo.be", "custom_domain": "wallet.wolugo.be", - "logo": "https://wallet.wolugo.be/uploads/logo.svg", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", "theme": { "primary": "#81e2c1" }, @@ -1985,8 +2184,8 @@ "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 42220 }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 42220 } }, @@ -2013,6 +2212,14 @@ "paymaster_type": "cw-safe" } }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "42220": { "id": 42220, diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index e01e6f24..0f67f2b9 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -5,6 +5,8 @@ import 'package:citizenwallet/services/accounts/options.dart'; import 'package:citizenwallet/services/db/backup/accounts.dart'; import 'package:citizenwallet/services/db/app/db.dart'; import 'package:citizenwallet/services/config/config.dart'; +import 'package:citizenwallet/services/wallet/wallet.dart'; +import 'package:citizenwallet/services/wallet/contracts/safe_account.dart'; import 'package:citizenwallet/services/accounts/backup.dart'; import 'package:citizenwallet/services/accounts/accounts.dart'; @@ -12,6 +14,7 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:web3dart/crypto.dart'; import 'package:web3dart/web3dart.dart'; +import 'package:flutter/foundation.dart'; const pinCodeCheckKey = 'cw__pinCodeCheck__'; const pinCodeKey = 'cw__pinCode__'; @@ -29,6 +32,50 @@ class AndroidAccountsService extends AccountsServiceInterface { late SharedPreferences _sharedPreferences; late AccountBackupDBService _accountsDB; + Future _fixSafeAccount(DBAccount account, Config config) async { + try { + if (account.accountFactoryAddress != + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + return; + } + + final safeAccount = SafeAccount( + config.chains.values.first.node.chainId, + config.ethClient, + account.address.hexEip55, + ); + await safeAccount.init(); + + final calldata = safeAccount.fixFallbackHandlerCallData(); + + final (hash, userop) = await prepareUserop( + config, + account.address, + account.privateKey!, + [account.address.hexEip55], + [calldata], + deploy: false, + ); + + final txHash = await submitUserop(config, userop); + + if (txHash != null) { + debugPrint('fixed cw-safe account ${account.address.hexEip55}'); + } else { + debugPrint( + 'Failed to submit cw-safe account ${account.address.hexEip55}'); + } + } catch (e, stackTrace) { + debugPrint('Error: cw-safe account ${account.address.hexEip55}: $e'); + debugPrint('Stack trace: $stackTrace'); + + if (e.toString().contains('contract not whitelisted')) { + debugPrint( + 'Contract not whitelisted error for account ${account.address.hexEip55}'); + } + } + } + @override Future init(AccountsOptionsInterface options) async { final AndroidAccountsOptions androidOptions = @@ -162,6 +209,15 @@ class AndroidAccountsService extends AccountsServiceInterface { await _credentials.write(newKey, privateKey); await _credentials.delete(oldKey); } + + if (account.accountFactoryAddress == + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + try { + await _fixSafeAccount(newAccount, config); + } catch (e) { + debugPrint('Failed to fix cw-safe account during migration: $e'); + } + } } }, }; diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index 721e9d1e..ef71fc25 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -11,6 +11,10 @@ import 'package:citizenwallet/services/config/config.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:web3dart/credentials.dart'; import 'package:web3dart/crypto.dart'; +import 'package:web3dart/web3dart.dart'; +import 'package:flutter/foundation.dart'; +import 'package:citizenwallet/services/wallet/wallet.dart'; +import 'package:citizenwallet/services/wallet/contracts/safe_account.dart'; /// AppleAccountsService implements an AccountsServiceInterface for iOS and macOS class AppleAccountsService extends AccountsServiceInterface { @@ -24,6 +28,50 @@ class AppleAccountsService extends AccountsServiceInterface { final CredentialsServiceInterface _credentials = getCredentialsService(); late AccountBackupDBService _accountsDB; + Future _fixSafeAccount(DBAccount account, Config config) async { + try { + if (account.accountFactoryAddress != + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + return; + } + + final safeAccount = SafeAccount( + config.chains.values.first.node.chainId, + config.ethClient, + account.address.hexEip55, + ); + await safeAccount.init(); + + final calldata = safeAccount.fixFallbackHandlerCallData(); + + final (hash, userop) = await prepareUserop( + config, + account.address, + account.privateKey!, + [account.address.hexEip55], + [calldata], + deploy: false, + ); + + final txHash = await submitUserop(config, userop); + + if (txHash != null) { + debugPrint('fixed cw-safe account ${account.address.hexEip55}'); + } else { + debugPrint( + 'Failed to submit for cw-safe account ${account.address.hexEip55}'); + } + } catch (e, stackTrace) { + debugPrint('Error: cw-safe account ${account.address.hexEip55}: $e'); + debugPrint('Stack trace: $stackTrace'); + + if (e.toString().contains('contract not whitelisted')) { + debugPrint( + 'Contract not whitelisted error for account ${account.address.hexEip55}'); + } + } + } + @override Future init(AccountsOptionsInterface options) async { final appleOptions = options as AppleAccountsOptions; @@ -275,6 +323,15 @@ class AppleAccountsService extends AccountsServiceInterface { await _credentials.write(newKey, privateKey); await _credentials.delete(oldKey); } + + if (account.accountFactoryAddress == + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + try { + await _fixSafeAccount(newAccount, config); + } catch (e) { + debugPrint('Failed to fix cw-safe account during migration: $e'); + } + } } }, }; From 0d33b996eac9b236c88c2786a0715c56c9f3d027 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 31 Jul 2025 11:25:46 +0530 Subject: [PATCH 15/46] minor update --- lib/services/accounts/native/android.dart | 6 ++++-- lib/services/accounts/native/apple.dart | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index 0f67f2b9..54908586 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -144,7 +144,9 @@ class AndroidAccountsService extends AccountsServiceInterface { final allAccounts = await _accountsDB.accounts.all(); for (final account in allAccounts) { - if (account.accountFactoryAddress.isNotEmpty) { + if (account.accountFactoryAddress.isNotEmpty && + account.accountFactoryAddress != + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { continue; } @@ -175,7 +177,7 @@ class AndroidAccountsService extends AccountsServiceInterface { '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; break; default: - if (accountFactoryAddress == + if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { accountFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index ef71fc25..29705c3f 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -258,7 +258,9 @@ class AppleAccountsService extends AccountsServiceInterface { final allAccounts = await _accountsDB.accounts.all(); for (final account in allAccounts) { - if (account.accountFactoryAddress.isNotEmpty) { + if (account.accountFactoryAddress.isNotEmpty && + account.accountFactoryAddress != + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { continue; } @@ -289,7 +291,7 @@ class AppleAccountsService extends AccountsServiceInterface { '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; break; default: - if (accountFactoryAddress == + if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { accountFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; From 61439ea1daf7bc465fbf9213e1b807983325fd3e Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 31 Jul 2025 17:43:42 +0530 Subject: [PATCH 16/46] button update --- lib/modals/account/switch_account.dart | 96 ++++++++++++++------- lib/modals/landing/migration_modal.dart | 53 +++++------- lib/screens/accounts/screen.dart | 110 ++++++++++++++++-------- lib/screens/landing/screen.dart | 8 +- lib/state/wallet/logic.dart | 2 - lib/utils/migration_modal.dart | 7 -- 6 files changed, 162 insertions(+), 114 deletions(-) diff --git a/lib/modals/account/switch_account.dart b/lib/modals/account/switch_account.dart index a91a5840..b9ac3b90 100644 --- a/lib/modals/account/switch_account.dart +++ b/lib/modals/account/switch_account.dart @@ -83,6 +83,10 @@ class SwitchAccountModalState extends State { GoRouter.of(context).pop(); } + void handleMigration(BuildContext context) { + GoRouter.of(context).pop(); + } + void handleCreate(BuildContext context) async { final navigator = GoRouter.of(context); @@ -407,7 +411,7 @@ class SwitchAccountModalState extends State { children: [ CupertinoButton( padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), - onPressed: () => handleImport(context), + onPressed: () => handleMigration(context), borderRadius: BorderRadius.circular(25), color: Theme.of(context) .colors @@ -418,7 +422,7 @@ class SwitchAccountModalState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - AppLocalizations.of(context)!.importText, + "Migrate Accounts", style: TextStyle( color: Theme.of(context) .colors @@ -428,7 +432,7 @@ class SwitchAccountModalState extends State { ), const SizedBox(width: 5), Icon( - CupertinoIcons.down_arrow, + CupertinoIcons.up_arrow, color: Theme.of(context) .colors .text @@ -437,33 +441,65 @@ class SwitchAccountModalState extends State { ], ), ), - const SizedBox(width: 10), - CupertinoButton( - padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), - onPressed: () => handleCreate(context), - borderRadius: BorderRadius.circular(25), - color: Theme.of(context) - .colors - .surfacePrimary - .resolveFrom(context), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - AppLocalizations.of(context)!.joinCommunity, - style: TextStyle( - color: Theme.of(context).colors.black, - ), - ), - const SizedBox(width: 5), - Icon( - CupertinoIcons.plus, - color: Theme.of(context).colors.black, - ), - ], - ), - ), + // CupertinoButton( + // padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), + // onPressed: () => handleImport(context), + // borderRadius: BorderRadius.circular(25), + // color: Theme.of(context) + // .colors + // .uiBackground + // .resolveFrom(context), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // Text( + // AppLocalizations.of(context)!.importText, + // style: TextStyle( + // color: Theme.of(context) + // .colors + // .text + // .resolveFrom(context), + // ), + // ), + // const SizedBox(width: 5), + // Icon( + // CupertinoIcons.down_arrow, + // color: Theme.of(context) + // .colors + // .text + // .resolveFrom(context), + // ), + // ], + // ), + // ), + // const SizedBox(width: 10), + // CupertinoButton( + // padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), + // onPressed: () => handleCreate(context), + // borderRadius: BorderRadius.circular(25), + // color: Theme.of(context) + // .colors + // .surfacePrimary + // .resolveFrom(context), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // Text( + // AppLocalizations.of(context)!.joinCommunity, + // style: TextStyle( + // color: Theme.of(context).colors.black, + // ), + // ), + // const SizedBox(width: 5), + // Icon( + // CupertinoIcons.plus, + // color: Theme.of(context).colors.black, + // ), + // ], + // ), + // ), ], ), ), diff --git a/lib/modals/landing/migration_modal.dart b/lib/modals/landing/migration_modal.dart index de394ff6..76cee0d6 100644 --- a/lib/modals/landing/migration_modal.dart +++ b/lib/modals/landing/migration_modal.dart @@ -1,4 +1,3 @@ -import 'package:citizenwallet/services/preferences/preferences.dart'; import 'package:citizenwallet/theme/provider.dart' as theme_provider; import 'package:citizenwallet/utils/platform.dart'; import 'package:citizenwallet/widgets/button.dart'; @@ -14,22 +13,11 @@ class MigrationModal extends StatefulWidget { } class MigrationModalState extends State { - late PreferencesService _preferences; - - @override - void initState() { - super.initState(); - _preferences = PreferencesService(); - } - void handleDismiss() { - _preferences.setMigrationModalShown(true); GoRouter.of(context).pop(); } void handleDownload() async { - _preferences.setMigrationModalShown(true); - String url; if (isPlatformApple()) { url = ''; @@ -67,7 +55,7 @@ class MigrationModalState extends State { ), ), child: Padding( - padding: const EdgeInsets.all(15), + padding: const EdgeInsets.all(24), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -76,7 +64,9 @@ class MigrationModalState extends State { width: 80, height: 80, decoration: BoxDecoration( - color: theme.colors.surfacePrimary.resolveFrom(context).withOpacity(0.1), + color: theme.colors.surfacePrimary + .resolveFrom(context) + .withOpacity(0.1), borderRadius: BorderRadius.circular(20), ), child: Icon( @@ -85,10 +75,9 @@ class MigrationModalState extends State { color: theme.colors.surfacePrimary.resolveFrom(context), ), ), - + const SizedBox(height: 24), - - // Title + Text( 'We\'ve Moved!', style: const TextStyle( @@ -97,41 +86,39 @@ class MigrationModalState extends State { ), textAlign: TextAlign.center, ), - + const SizedBox(height: 16), - - // Message + Text( - 'We\'ve migrated to a new and improved application. Download the new app to continue enjoying all the features with enhanced security and performance.', + 'We\'ve migrated to a new and improved application. Download the new app to continue enjoying all the features.', style: TextStyle( fontSize: 16, - color: CupertinoColors.label.resolveFrom(context).withOpacity(0.8), + color: + CupertinoColors.label.resolveFrom(context).withOpacity(0.8), ), textAlign: TextAlign.center, ), - + const SizedBox(height: 32), - - // Download Button + SizedBox( width: double.infinity, child: Button( onPressed: handleDownload, - text: isPlatformApple() - ? 'Download on App Store' - : 'Download on Play Store', + text: isPlatformApple() + ? 'Download on App Store' + : 'Download on Play Store', color: theme.colors.surfacePrimary.resolveFrom(context), ), ), - + const SizedBox(height: 16), - - // Dismiss Button + SizedBox( width: double.infinity, child: Button( onPressed: handleDismiss, - text: 'Not Now', + text: 'Dismiss', color: CupertinoColors.systemGrey4, labelColor: CupertinoColors.label, ), @@ -141,4 +128,4 @@ class MigrationModalState extends State { ), ); } -} \ No newline at end of file +} diff --git a/lib/screens/accounts/screen.dart b/lib/screens/accounts/screen.dart index 88f25b84..540e2b87 100644 --- a/lib/screens/accounts/screen.dart +++ b/lib/screens/accounts/screen.dart @@ -90,6 +90,10 @@ class AccountsScreenState extends State { GoRouter.of(context).pop(); } + void handleMigration(BuildContext context) { + GoRouter.of(context).pop(); + } + void handleJoin(BuildContext context) async { final navigator = GoRouter.of(context); @@ -676,7 +680,7 @@ class AccountsScreenState extends State { children: [ CupertinoButton( padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), - onPressed: () => handleImport(context), + onPressed: () => handleMigration(context), borderRadius: BorderRadius.circular(25), color: Theme.of(context) .colors @@ -687,7 +691,7 @@ class AccountsScreenState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - AppLocalizations.of(context)!.importText, + "Migrate Accounts", style: TextStyle( color: Theme.of(context) .colors @@ -697,7 +701,7 @@ class AccountsScreenState extends State { ), const SizedBox(width: 5), Icon( - CupertinoIcons.down_arrow, + CupertinoIcons.up_arrow, color: Theme.of(context) .colors .text @@ -706,40 +710,72 @@ class AccountsScreenState extends State { ], ), ), - const SizedBox(width: 10), - CupertinoButton( - padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), - onPressed: singleCommunityMode - ? () => - handleCreate(context, currentWallet?.alias) - : () => handleJoin(context), - borderRadius: BorderRadius.circular(25), - color: Theme.of(context) - .colors - .surfacePrimary - .resolveFrom(context), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - singleCommunityMode - ? AppLocalizations.of(context)! - .createNewAccount - : AppLocalizations.of(context)! - .joinCommunity, - style: TextStyle( - color: Theme.of(context).colors.black, - ), - ), - const SizedBox(width: 5), - Icon( - CupertinoIcons.plus, - color: Theme.of(context).colors.black, - ), - ], - ), - ), + // CupertinoButton( + // padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), + // onPressed: () => handleImport(context), + // borderRadius: BorderRadius.circular(25), + // color: Theme.of(context) + // .colors + // .uiBackground + // .resolveFrom(context), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // Text( + // AppLocalizations.of(context)!.importText, + // style: TextStyle( + // color: Theme.of(context) + // .colors + // .text + // .resolveFrom(context), + // ), + // ), + // const SizedBox(width: 5), + // Icon( + // CupertinoIcons.down_arrow, + // color: Theme.of(context) + // .colors + // .text + // .resolveFrom(context), + // ), + // ], + // ), + // ), + // const SizedBox(width: 10), + // CupertinoButton( + // padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), + // onPressed: singleCommunityMode + // ? () => + // handleCreate(context, currentWallet?.alias) + // : () => handleJoin(context), + // borderRadius: BorderRadius.circular(25), + // color: Theme.of(context) + // .colors + // .surfacePrimary + // .resolveFrom(context), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // Text( + // singleCommunityMode + // ? AppLocalizations.of(context)! + // .createNewAccount + // : AppLocalizations.of(context)! + // .joinCommunity, + // style: TextStyle( + // color: Theme.of(context).colors.black, + // ), + // ), + // const SizedBox(width: 5), + // Icon( + // CupertinoIcons.plus, + // color: Theme.of(context).colors.black, + // ), + // ], + // ), + // ), ], ), ), diff --git a/lib/screens/landing/screen.dart b/lib/screens/landing/screen.dart index be005eaa..b3c5cef2 100644 --- a/lib/screens/landing/screen.dart +++ b/lib/screens/landing/screen.dart @@ -193,6 +193,9 @@ class LandingScreenState extends State if (address == null) { _appLogic.appLoaded(); + + await MigrationModalUtils.showMigrationModalIfNeeded(context); + return; } @@ -210,8 +213,6 @@ class LandingScreenState extends State _appLogic.appLoaded(); - await MigrationModalUtils.showMigrationModalIfNeeded(context); - navigator.go('/wallet/$address$params'); } @@ -335,8 +336,6 @@ class LandingScreenState extends State navigator.push('/recovery'); } - - void handleQRScan() async { final navigator = GoRouter.of(context); @@ -677,7 +676,6 @@ class LandingScreenState extends State ), ), const SizedBox(height: 20), - ], if (isPlatformApple()) ...[ Container( diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index 6fc6c8d1..f18d0eff 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -2263,8 +2263,6 @@ class WalletLogic extends WidgetsBindingObserver { buttonType: ActionButtonType.vouchers, )); - - try { final isMinterResult = await isMinter(_currentConfig, _currentAccount); _state.setWalletMinter(isMinterResult); diff --git a/lib/utils/migration_modal.dart b/lib/utils/migration_modal.dart index 7f132769..e6769d56 100644 --- a/lib/utils/migration_modal.dart +++ b/lib/utils/migration_modal.dart @@ -1,16 +1,9 @@ import 'package:citizenwallet/modals/landing/migration_modal.dart'; -import 'package:citizenwallet/services/preferences/preferences.dart'; import 'package:flutter/cupertino.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; class MigrationModalUtils { static Future showMigrationModalIfNeeded(BuildContext context) async { - final preferences = PreferencesService(); - - if (preferences.migrationModalShown) { - return; - } - await showCupertinoModalBottomSheet( context: context, builder: (context) => const MigrationModal(), From 343853d52ec063d307b3527148cc83b48fb4d58c Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 31 Jul 2025 20:13:14 +0530 Subject: [PATCH 17/46] cursor rules --- .cursorrules | 277 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 .cursorrules diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 00000000..ae0d10c1 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,277 @@ +# Citizen Wallet Flutter Project - Coding Patterns & Conventions + +## Project Overview + +This is a Flutter-based mobile wallet application for community tokens, built with a focus on blockchain integration, state management, and cross-platform compatibility. + +## Architecture Patterns + +### 1. State Management + +- **Provider Pattern**: Uses `provider` package for state management +- **State/Logic Separation**: Each feature has separate `state.dart` and `logic.dart` files +- **ChangeNotifier**: All state classes extend `ChangeNotifier` for reactive updates +- **MultiProvider**: Centralized state provisioning in `lib/state/state.dart` + +### 2. Directory Structure + +``` +lib/ +├── models/ # Data models and DTOs +├── screens/ # UI screens organized by feature +├── widgets/ # Reusable UI components +├── services/ # Business logic and external integrations +├── state/ # State management (state + logic files) +├── router/ # Navigation and routing +├── theme/ # UI theming and styling +├── utils/ # Utility functions and helpers +├── modals/ # Modal dialogs and sheets +└── l10n/ # Localization files +``` + +### 3. File Naming Conventions + +- **snake_case**: All file names use snake_case +- **Feature-based**: Files organized by feature/domain +- **Platform suffixes**: `.android.dart`, `.apple.dart`, `.web.dart` for platform-specific code +- **State files**: `state.dart` for state classes, `logic.dart` for business logic + +## Code Style & Patterns + +### 1. Dart/Flutter Conventions + +- **Null Safety**: Full null safety implementation +- **Async/Await**: Prefer async/await over Future.then() +- **Const Constructors**: Use const constructors where possible +- **Final Variables**: Use final for immutable variables +- **Type Annotations**: Explicit type annotations for clarity + +### 2. State Management Patterns + +```dart +// State class pattern +class WalletState with ChangeNotifier { + bool loading = false; + String? error; + + void setLoading(bool value) { + loading = value; + notifyListeners(); + } +} + +// Logic class pattern +class WalletLogic { + final WalletState _state; + + Future loadWallet() async { + _state.setLoading(true); + try { + // business logic + } catch (e) { + _state.setError(e.toString()); + } finally { + _state.setLoading(false); + } + } +} +``` + +### 3. Service Layer Patterns + +- **Singleton Services**: Services like `ConfigService`, `AccountDBService` +- **Interface-based**: Use interfaces for service contracts +- **Error Handling**: Comprehensive try-catch blocks with proper error propagation +- **Async Operations**: All external operations are async + +### 4. UI Patterns + +- **Cupertino Design**: Uses Cupertino widgets for iOS-style design +- **Responsive Design**: Platform-aware UI components +- **Modal Sheets**: Heavy use of modal bottom sheets for user interactions +- **Loading States**: Consistent loading indicators and skeleton screens +- **Error Handling**: Toast notifications and error banners + +### 5. Navigation Patterns + +- **GoRouter**: Uses go_router for navigation +- **Deep Linking**: Comprehensive deep link support +- **Route Guards**: Conditional navigation based on app state +- **Platform-specific**: Different navigation patterns for web/mobile + +## Blockchain Integration + +### 1. Web3 Integration + +- **web3dart**: Primary Web3 library +- **Smart Contracts**: Custom contract interactions +- **Account Abstraction**: ERC-4337 account abstraction support +- **Gas Management**: Custom gas estimation and management + +### 2. Wallet Patterns + +- **Multi-wallet Support**: Multiple wallet accounts per user +- **Secure Storage**: Encrypted key storage +- **Transaction Management**: Queue-based transaction handling +- **Event Listening**: Real-time blockchain event monitoring + +## Database & Storage + +### 1. Local Storage + +- **SQLite**: Primary local database (sqflite) +- **Shared Preferences**: Simple key-value storage +- **Secure Storage**: Encrypted sensitive data storage +- **File System**: Asset and backup file management + +### 2. Data Models + +- **JSON Serialization**: All models support JSON serialization +- **Copy Methods**: Immutable data with copyWith methods +- **Validation**: Input validation and sanitization + +## Error Handling + +### 1. Exception Patterns + +- **Custom Exceptions**: Domain-specific exception classes +- **Graceful Degradation**: Fallback mechanisms for failures +- **User Feedback**: Clear error messages to users +- **Logging**: Comprehensive error logging and monitoring + +### 2. Error Recovery + +- **Retry Logic**: Exponential backoff for network operations +- **Offline Support**: Offline-first architecture +- **State Recovery**: Automatic state recovery mechanisms + +## Testing Patterns + +### 1. Test Organization + +- **Unit Tests**: Service and utility function tests +- **Widget Tests**: UI component testing +- **Integration Tests**: End-to-end workflow testing +- **Mock Services**: Comprehensive mocking for external dependencies + +### 2. Test Utilities + +- **Mock HTTP**: Network request mocking +- **Test Helpers**: Reusable test utilities +- **Test Data**: Consistent test data fixtures + +## Security Patterns + +### 1. Cryptography + +- **Encryption**: AES encryption for sensitive data +- **Key Management**: Secure key generation and storage +- **Digital Signatures**: Transaction signing and verification +- **Secure Communication**: HTTPS and secure WebSocket connections + +### 2. Authentication + +- **Biometric Auth**: Touch ID/Face ID integration +- **OAuth**: Google Sign-In integration +- **Session Management**: Secure session handling + +## Performance Patterns + +### 1. Optimization + +- **Lazy Loading**: On-demand resource loading +- **Caching**: Multi-level caching strategies +- **Image Optimization**: Efficient image handling and caching +- **Memory Management**: Proper disposal of resources + +### 2. Background Processing + +- **Event Listeners**: Efficient event handling +- **Background Tasks**: Non-blocking background operations +- **State Synchronization**: Efficient state updates + +## Internationalization + +### 1. Localization + +- **ARB Files**: Flutter's localization format +- **Multi-language**: English, French, Dutch support +- **RTL Support**: Right-to-left language support +- **Currency Formatting**: Localized currency display + +## Platform-Specific Code + +### 1. Platform Detection + +- **kIsWeb**: Web platform detection +- **Platform-specific Files**: Separate implementations for different platforms +- **Conditional Compilation**: Platform-specific code blocks + +### 2. Native Integrations + +- **iOS**: Apple-specific features (Face ID, iCloud) +- **Android**: Android-specific features (Google Sign-In) +- **Web**: Web-specific optimizations and features + +## Dependencies & Packages + +### 1. Core Dependencies + +- **Flutter**: Latest stable version +- **Provider**: State management +- **GoRouter**: Navigation +- **web3dart**: Blockchain integration +- **sqflite**: Local database + +### 2. UI Dependencies + +- **flutter_svg**: SVG support +- **lottie**: Animation support +- **cached_network_image**: Image caching +- **modal_bottom_sheet**: Modal dialogs + +### 3. Blockchain Dependencies + +- **smartcontracts**: Custom smart contract library +- **contractforge**: Contract interaction utilities +- **reown_walletkit**: Wallet functionality + +## Development Workflow + +### 1. Code Organization + +- **Feature-based**: Organize code by business features +- **Separation of Concerns**: Clear separation between UI, business logic, and data +- **Dependency Injection**: Service locator pattern for dependencies + +### 2. Code Quality + +- **Linting**: Flutter lints for code quality +- **Analysis**: Static analysis with custom rules +- **Documentation**: Comprehensive code documentation +- **Type Safety**: Strong typing throughout the codebase + +## Best Practices + +### 1. General + +- **Immutability**: Prefer immutable data structures +- **Composition**: Use composition over inheritance +- **Single Responsibility**: Each class has a single responsibility +- **Dependency Inversion**: Depend on abstractions, not concretions + +### 2. Flutter-specific + +- **Stateless Widgets**: Prefer stateless widgets when possible +- **Const Constructors**: Use const constructors for performance +- **Keys**: Use keys for widget identification +- **Dispose**: Properly dispose of controllers and listeners + +### 3. State Management + +- **Minimal State**: Keep state as minimal as possible +- **Predictable Updates**: State updates should be predictable +- **Performance**: Avoid unnecessary rebuilds +- **Testing**: Make state easily testable + +This project follows a well-structured, maintainable architecture with clear separation of concerns, comprehensive error handling, and strong typing throughout the codebase. From 70920e997265b9f899390a1f29c0047182a19ab1 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Fri, 1 Aug 2025 11:43:09 +0530 Subject: [PATCH 18/46] print statements --- lib/services/accounts/native/android.dart | 80 ++++++++++++++++++++--- lib/services/accounts/native/apple.dart | 80 ++++++++++++++++++++--- lib/services/db/backup/accounts.dart | 62 ++++++++++++------ 3 files changed, 186 insertions(+), 36 deletions(-) diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index 54908586..c5192c6f 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -33,21 +33,35 @@ class AndroidAccountsService extends AccountsServiceInterface { late AccountBackupDBService _accountsDB; Future _fixSafeAccount(DBAccount account, Config config) async { + print('=== _fixSafeAccount START ==='); + print('Account address: ${account.address.hexEip55}'); + print('Account alias: ${account.alias}'); + print('Account factory address: ${account.accountFactoryAddress}'); + print('Expected factory address: 0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2'); + try { if (account.accountFactoryAddress != '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + print('Account factory address does not match expected safe factory address. Skipping _fixSafeAccount.'); + print('=== _fixSafeAccount END (SKIPPED) ==='); return; } + print('Creating SafeAccount instance...'); final safeAccount = SafeAccount( config.chains.values.first.node.chainId, config.ethClient, account.address.hexEip55, ); + print('Initializing SafeAccount...'); await safeAccount.init(); + print('SafeAccount initialized successfully'); + print('Generating fixFallbackHandler call data...'); final calldata = safeAccount.fixFallbackHandlerCallData(); + print('Call data generated: ${calldata.length} bytes'); + print('Preparing user operation...'); final (hash, userop) = await prepareUserop( config, account.address, @@ -56,24 +70,27 @@ class AndroidAccountsService extends AccountsServiceInterface { [calldata], deploy: false, ); + print('User operation prepared. Hash: $hash'); + print('Submitting user operation...'); final txHash = await submitUserop(config, userop); + print('User operation submission result: $txHash'); if (txHash != null) { - debugPrint('fixed cw-safe account ${account.address.hexEip55}'); + print('✅ SUCCESS: Fixed cw-safe account ${account.address.hexEip55}'); + print('Transaction hash: $txHash'); } else { - debugPrint( - 'Failed to submit cw-safe account ${account.address.hexEip55}'); + print('❌ FAILED: Failed to submit cw-safe account ${account.address.hexEip55}'); } } catch (e, stackTrace) { - debugPrint('Error: cw-safe account ${account.address.hexEip55}: $e'); - debugPrint('Stack trace: $stackTrace'); + print('❌ ERROR: cw-safe account ${account.address.hexEip55}: $e'); + print('Stack trace: $stackTrace'); if (e.toString().contains('contract not whitelisted')) { - debugPrint( - 'Contract not whitelisted error for account ${account.address.hexEip55}'); + print('⚠️ Contract not whitelisted error for account ${account.address.hexEip55}'); } } + print('=== _fixSafeAccount END ==='); } @override @@ -141,50 +158,74 @@ class AndroidAccountsService extends AccountsServiceInterface { } }, 5: () async { + print('=== MIGRATION 5 START ==='); + print('Starting safe account factory address migration...'); + final allAccounts = await _accountsDB.accounts.all(); + print('Found ${allAccounts.length} total accounts to process'); + + int processedAccounts = 0; + int skippedAccounts = 0; + int safeAccountsFixed = 0; for (final account in allAccounts) { + print('--- Processing account ${account.address.hexEip55} ---'); + print('Account alias: ${account.alias}'); + print('Current factory address: ${account.accountFactoryAddress}'); + if (account.accountFactoryAddress.isNotEmpty && account.accountFactoryAddress != '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + print('Skipping account - factory address is not empty and not the old safe factory'); + skippedAccounts++; continue; } final community = await AppDBService().communities.get(account.alias); if (community == null) { + print('Skipping account - community not found for alias: ${account.alias}'); + skippedAccounts++; continue; } final config = Config.fromJson(community.config); String accountFactoryAddress = config.community.primaryAccountFactory.address; + print('Default factory address from config: $accountFactoryAddress'); switch (account.alias) { case 'gratitude': accountFactoryAddress = '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD'; + print('Using gratitude-specific factory address: $accountFactoryAddress'); break; case 'bread': accountFactoryAddress = '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9'; + print('Using bread-specific factory address: $accountFactoryAddress'); break; case 'wallet.commonshub.brussels': accountFactoryAddress = '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87'; + print('Using commonshub.brussels-specific factory address: $accountFactoryAddress'); break; case 'wallet.sfluv.org': accountFactoryAddress = '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; + print('Using sfluv.org-specific factory address: $accountFactoryAddress'); break; default: if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { accountFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + print('Using default safe factory address for old safe accounts: $accountFactoryAddress'); } break; } + print('Final factory address to use: $accountFactoryAddress'); + // Create new account with factory address final newAccount = DBAccount( alias: account.alias, @@ -196,31 +237,54 @@ class AndroidAccountsService extends AccountsServiceInterface { profile: account.profile, ); + print('Deleting old account from database...'); // Delete old account and insert new one await _accountsDB.accounts.delete( account.address, account.alias, account.accountFactoryAddress); + print('Inserting new account into database...'); await _accountsDB.accounts.insert(newAccount); final oldKey = getAccountID( account.address, account.alias, account.accountFactoryAddress); final newKey = getAccountID( account.address, account.alias, accountFactoryAddress); + + print('Old credentials key: $oldKey'); + print('New credentials key: $newKey'); final privateKey = await _credentials.read(oldKey); if (privateKey != null) { + print('Migrating credentials from old key to new key...'); await _credentials.write(newKey, privateKey); await _credentials.delete(oldKey); + print('Credentials migrated successfully'); + } else { + print('No credentials found for old key'); } if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + print('This is an old safe account, calling _fixSafeAccount...'); try { await _fixSafeAccount(newAccount, config); + safeAccountsFixed++; + print('✅ Safe account fixed successfully'); } catch (e) { - debugPrint('Failed to fix cw-safe account during migration: $e'); + print('❌ Failed to fix cw-safe account during migration: $e'); } + } else { + print('Not an old safe account, skipping _fixSafeAccount'); } + + processedAccounts++; + print('--- Account processing complete ---'); } + + print('=== MIGRATION 5 SUMMARY ==='); + print('Total accounts processed: $processedAccounts'); + print('Accounts skipped: $skippedAccounts'); + print('Safe accounts fixed: $safeAccountsFixed'); + print('=== MIGRATION 5 END ==='); }, }; diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index 29705c3f..46aaddb6 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -29,21 +29,35 @@ class AppleAccountsService extends AccountsServiceInterface { late AccountBackupDBService _accountsDB; Future _fixSafeAccount(DBAccount account, Config config) async { + print('=== _fixSafeAccount START ==='); + print('Account address: ${account.address.hexEip55}'); + print('Account alias: ${account.alias}'); + print('Account factory address: ${account.accountFactoryAddress}'); + print('Expected factory address: 0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2'); + try { if (account.accountFactoryAddress != '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + print('Account factory address does not match expected safe factory address. Skipping _fixSafeAccount.'); + print('=== _fixSafeAccount END (SKIPPED) ==='); return; } + print('Creating SafeAccount instance...'); final safeAccount = SafeAccount( config.chains.values.first.node.chainId, config.ethClient, account.address.hexEip55, ); + print('Initializing SafeAccount...'); await safeAccount.init(); + print('SafeAccount initialized successfully'); + print('Generating fixFallbackHandler call data...'); final calldata = safeAccount.fixFallbackHandlerCallData(); + print('Call data generated: ${calldata.length} bytes'); + print('Preparing user operation...'); final (hash, userop) = await prepareUserop( config, account.address, @@ -52,24 +66,27 @@ class AppleAccountsService extends AccountsServiceInterface { [calldata], deploy: false, ); + print('User operation prepared. Hash: $hash'); + print('Submitting user operation...'); final txHash = await submitUserop(config, userop); + print('User operation submission result: $txHash'); if (txHash != null) { - debugPrint('fixed cw-safe account ${account.address.hexEip55}'); + print('✅ SUCCESS: Fixed cw-safe account ${account.address.hexEip55}'); + print('Transaction hash: $txHash'); } else { - debugPrint( - 'Failed to submit for cw-safe account ${account.address.hexEip55}'); + print('❌ FAILED: Failed to submit for cw-safe account ${account.address.hexEip55}'); } } catch (e, stackTrace) { - debugPrint('Error: cw-safe account ${account.address.hexEip55}: $e'); - debugPrint('Stack trace: $stackTrace'); + print('❌ ERROR: cw-safe account ${account.address.hexEip55}: $e'); + print('Stack trace: $stackTrace'); if (e.toString().contains('contract not whitelisted')) { - debugPrint( - 'Contract not whitelisted error for account ${account.address.hexEip55}'); + print('⚠️ Contract not whitelisted error for account ${account.address.hexEip55}'); } } + print('=== _fixSafeAccount END ==='); } @override @@ -255,50 +272,74 @@ class AppleAccountsService extends AccountsServiceInterface { } }, 5: () async { + print('=== MIGRATION 5 START ==='); + print('Starting safe account factory address migration...'); + final allAccounts = await _accountsDB.accounts.all(); + print('Found ${allAccounts.length} total accounts to process'); + + int processedAccounts = 0; + int skippedAccounts = 0; + int safeAccountsFixed = 0; for (final account in allAccounts) { + print('--- Processing account ${account.address.hexEip55} ---'); + print('Account alias: ${account.alias}'); + print('Current factory address: ${account.accountFactoryAddress}'); + if (account.accountFactoryAddress.isNotEmpty && account.accountFactoryAddress != '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + print('Skipping account - factory address is not empty and not the old safe factory'); + skippedAccounts++; continue; } final community = await AppDBService().communities.get(account.alias); if (community == null) { + print('Skipping account - community not found for alias: ${account.alias}'); + skippedAccounts++; continue; } final config = Config.fromJson(community.config); String accountFactoryAddress = config.community.primaryAccountFactory.address; + print('Default factory address from config: $accountFactoryAddress'); switch (account.alias) { case 'gratitude': accountFactoryAddress = '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD'; + print('Using gratitude-specific factory address: $accountFactoryAddress'); break; case 'bread': accountFactoryAddress = '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9'; + print('Using bread-specific factory address: $accountFactoryAddress'); break; case 'wallet.commonshub.brussels': accountFactoryAddress = '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87'; + print('Using commonshub.brussels-specific factory address: $accountFactoryAddress'); break; case 'wallet.sfluv.org': accountFactoryAddress = '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; + print('Using sfluv.org-specific factory address: $accountFactoryAddress'); break; default: if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { accountFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + print('Using default safe factory address for old safe accounts: $accountFactoryAddress'); } break; } + print('Final factory address to use: $accountFactoryAddress'); + // Create new account with factory address final newAccount = DBAccount( alias: account.alias, @@ -310,31 +351,54 @@ class AppleAccountsService extends AccountsServiceInterface { profile: account.profile, ); + print('Deleting old account from database...'); // Delete old account and insert new one await _accountsDB.accounts.delete( account.address, account.alias, account.accountFactoryAddress); + print('Inserting new account into database...'); await _accountsDB.accounts.insert(newAccount); final oldKey = getAccountID( account.address, account.alias, account.accountFactoryAddress); final newKey = getAccountID( account.address, account.alias, accountFactoryAddress); + + print('Old credentials key: $oldKey'); + print('New credentials key: $newKey'); final privateKey = await _credentials.read(oldKey); if (privateKey != null) { + print('Migrating credentials from old key to new key...'); await _credentials.write(newKey, privateKey); await _credentials.delete(oldKey); + print('Credentials migrated successfully'); + } else { + print('No credentials found for old key'); } if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + print('This is an old safe account, calling _fixSafeAccount...'); try { await _fixSafeAccount(newAccount, config); + safeAccountsFixed++; + print('✅ Safe account fixed successfully'); } catch (e) { - debugPrint('Failed to fix cw-safe account during migration: $e'); + print('❌ Failed to fix cw-safe account during migration: $e'); } + } else { + print('Not an old safe account, skipping _fixSafeAccount'); } + + processedAccounts++; + print('--- Account processing complete ---'); } + + print('=== MIGRATION 5 SUMMARY ==='); + print('Total accounts processed: $processedAccounts'); + print('Accounts skipped: $skippedAccounts'); + print('Safe accounts fixed: $safeAccountsFixed'); + print('=== MIGRATION 5 END ==='); }, }; diff --git a/lib/services/db/backup/accounts.dart b/lib/services/db/backup/accounts.dart index 2b8dcc8b..c24dc277 100644 --- a/lib/services/db/backup/accounts.dart +++ b/lib/services/db/backup/accounts.dart @@ -113,33 +113,55 @@ class AccountsTable extends DBTable { @override Future migrate(Database db, int oldVersion, int newVersion) async { + print('=== ACCOUNTS TABLE MIGRATION START ==='); + print('Migrating from version $oldVersion to $newVersion'); final migrations = { - 2: [ - 'UPDATE $name SET privateKey = NULL', - ], - 3: [ - 'ALTER TABLE $name ADD COLUMN username TEXT DEFAULT NULL', - ], - 4: [ - 'ALTER TABLE $name ADD COLUMN accountFactoryAddress TEXT', - 'UPDATE $name SET accountFactoryAddress = "" WHERE accountFactoryAddress IS NULL', - ] + 2: () async { + print('Running migration 2: Setting privateKey to NULL'); + await db.execute('UPDATE $name SET privateKey = NULL'); + print('Migration 2 completed successfully'); + }, + 3: () async { + print('Running migration 3: Adding username column'); + try { + await db.execute('SELECT username FROM $name LIMIT 1'); + print('Column username already exists, skipping migration 3'); + } catch (e) { + print('Column username does not exist, adding it...'); + await db.execute('ALTER TABLE $name ADD COLUMN username TEXT DEFAULT NULL'); + print('Successfully added username column'); + } + }, + 4: () async { + // Check if accountFactoryAddress column already exists + try { + await db.execute('SELECT accountFactoryAddress FROM $name LIMIT 1'); + print('Column accountFactoryAddress already exists, skipping migration 4'); + } catch (e) { + print('Column accountFactoryAddress does not exist, adding it...'); + await db.execute('ALTER TABLE $name ADD COLUMN accountFactoryAddress TEXT'); + await db.execute('UPDATE $name SET accountFactoryAddress = "" WHERE accountFactoryAddress IS NULL'); + print('Successfully added accountFactoryAddress column'); + } + } }; for (var i = oldVersion + 1; i <= newVersion; i++) { - final queries = migrations[i]; - - if (queries != null) { - for (final query in queries) { - try { - await db.execute(query); - } catch (e, s) { - debugPrint('Migration error: $e'); - debugPrintStack(stackTrace: s); - } + final migration = migrations[i]; + + if (migration != null) { + print('Running migration $i...'); + try { + await migration(); + } catch (e, s) { + print('Migration error: $e'); + print('Stack trace: $s'); } + } else { + print('No migration defined for version $i'); } } + print('=== ACCOUNTS TABLE MIGRATION END ==='); } Future> getAllLegacyDBAccounts() async { From ccb1675a1736044e1bde9c89cb55d470f094ac77 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Fri, 1 Aug 2025 23:35:29 +0530 Subject: [PATCH 19/46] update --- lib/services/accounts/native/android.dart | 80 +++-------------------- lib/services/accounts/native/apple.dart | 80 +++-------------------- lib/services/db/backup/accounts.dart | 62 ++++++------------ lib/state/wallet/logic.dart | 32 ++++++++- 4 files changed, 67 insertions(+), 187 deletions(-) diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index c5192c6f..54908586 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -33,35 +33,21 @@ class AndroidAccountsService extends AccountsServiceInterface { late AccountBackupDBService _accountsDB; Future _fixSafeAccount(DBAccount account, Config config) async { - print('=== _fixSafeAccount START ==='); - print('Account address: ${account.address.hexEip55}'); - print('Account alias: ${account.alias}'); - print('Account factory address: ${account.accountFactoryAddress}'); - print('Expected factory address: 0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2'); - try { if (account.accountFactoryAddress != '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - print('Account factory address does not match expected safe factory address. Skipping _fixSafeAccount.'); - print('=== _fixSafeAccount END (SKIPPED) ==='); return; } - print('Creating SafeAccount instance...'); final safeAccount = SafeAccount( config.chains.values.first.node.chainId, config.ethClient, account.address.hexEip55, ); - print('Initializing SafeAccount...'); await safeAccount.init(); - print('SafeAccount initialized successfully'); - print('Generating fixFallbackHandler call data...'); final calldata = safeAccount.fixFallbackHandlerCallData(); - print('Call data generated: ${calldata.length} bytes'); - print('Preparing user operation...'); final (hash, userop) = await prepareUserop( config, account.address, @@ -70,27 +56,24 @@ class AndroidAccountsService extends AccountsServiceInterface { [calldata], deploy: false, ); - print('User operation prepared. Hash: $hash'); - print('Submitting user operation...'); final txHash = await submitUserop(config, userop); - print('User operation submission result: $txHash'); if (txHash != null) { - print('✅ SUCCESS: Fixed cw-safe account ${account.address.hexEip55}'); - print('Transaction hash: $txHash'); + debugPrint('fixed cw-safe account ${account.address.hexEip55}'); } else { - print('❌ FAILED: Failed to submit cw-safe account ${account.address.hexEip55}'); + debugPrint( + 'Failed to submit cw-safe account ${account.address.hexEip55}'); } } catch (e, stackTrace) { - print('❌ ERROR: cw-safe account ${account.address.hexEip55}: $e'); - print('Stack trace: $stackTrace'); + debugPrint('Error: cw-safe account ${account.address.hexEip55}: $e'); + debugPrint('Stack trace: $stackTrace'); if (e.toString().contains('contract not whitelisted')) { - print('⚠️ Contract not whitelisted error for account ${account.address.hexEip55}'); + debugPrint( + 'Contract not whitelisted error for account ${account.address.hexEip55}'); } } - print('=== _fixSafeAccount END ==='); } @override @@ -158,74 +141,50 @@ class AndroidAccountsService extends AccountsServiceInterface { } }, 5: () async { - print('=== MIGRATION 5 START ==='); - print('Starting safe account factory address migration...'); - final allAccounts = await _accountsDB.accounts.all(); - print('Found ${allAccounts.length} total accounts to process'); - - int processedAccounts = 0; - int skippedAccounts = 0; - int safeAccountsFixed = 0; for (final account in allAccounts) { - print('--- Processing account ${account.address.hexEip55} ---'); - print('Account alias: ${account.alias}'); - print('Current factory address: ${account.accountFactoryAddress}'); - if (account.accountFactoryAddress.isNotEmpty && account.accountFactoryAddress != '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - print('Skipping account - factory address is not empty and not the old safe factory'); - skippedAccounts++; continue; } final community = await AppDBService().communities.get(account.alias); if (community == null) { - print('Skipping account - community not found for alias: ${account.alias}'); - skippedAccounts++; continue; } final config = Config.fromJson(community.config); String accountFactoryAddress = config.community.primaryAccountFactory.address; - print('Default factory address from config: $accountFactoryAddress'); switch (account.alias) { case 'gratitude': accountFactoryAddress = '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD'; - print('Using gratitude-specific factory address: $accountFactoryAddress'); break; case 'bread': accountFactoryAddress = '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9'; - print('Using bread-specific factory address: $accountFactoryAddress'); break; case 'wallet.commonshub.brussels': accountFactoryAddress = '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87'; - print('Using commonshub.brussels-specific factory address: $accountFactoryAddress'); break; case 'wallet.sfluv.org': accountFactoryAddress = '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; - print('Using sfluv.org-specific factory address: $accountFactoryAddress'); break; default: if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { accountFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; - print('Using default safe factory address for old safe accounts: $accountFactoryAddress'); } break; } - print('Final factory address to use: $accountFactoryAddress'); - // Create new account with factory address final newAccount = DBAccount( alias: account.alias, @@ -237,54 +196,31 @@ class AndroidAccountsService extends AccountsServiceInterface { profile: account.profile, ); - print('Deleting old account from database...'); // Delete old account and insert new one await _accountsDB.accounts.delete( account.address, account.alias, account.accountFactoryAddress); - print('Inserting new account into database...'); await _accountsDB.accounts.insert(newAccount); final oldKey = getAccountID( account.address, account.alias, account.accountFactoryAddress); final newKey = getAccountID( account.address, account.alias, accountFactoryAddress); - - print('Old credentials key: $oldKey'); - print('New credentials key: $newKey'); final privateKey = await _credentials.read(oldKey); if (privateKey != null) { - print('Migrating credentials from old key to new key...'); await _credentials.write(newKey, privateKey); await _credentials.delete(oldKey); - print('Credentials migrated successfully'); - } else { - print('No credentials found for old key'); } if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - print('This is an old safe account, calling _fixSafeAccount...'); try { await _fixSafeAccount(newAccount, config); - safeAccountsFixed++; - print('✅ Safe account fixed successfully'); } catch (e) { - print('❌ Failed to fix cw-safe account during migration: $e'); + debugPrint('Failed to fix cw-safe account during migration: $e'); } - } else { - print('Not an old safe account, skipping _fixSafeAccount'); } - - processedAccounts++; - print('--- Account processing complete ---'); } - - print('=== MIGRATION 5 SUMMARY ==='); - print('Total accounts processed: $processedAccounts'); - print('Accounts skipped: $skippedAccounts'); - print('Safe accounts fixed: $safeAccountsFixed'); - print('=== MIGRATION 5 END ==='); }, }; diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index 46aaddb6..29705c3f 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -29,35 +29,21 @@ class AppleAccountsService extends AccountsServiceInterface { late AccountBackupDBService _accountsDB; Future _fixSafeAccount(DBAccount account, Config config) async { - print('=== _fixSafeAccount START ==='); - print('Account address: ${account.address.hexEip55}'); - print('Account alias: ${account.alias}'); - print('Account factory address: ${account.accountFactoryAddress}'); - print('Expected factory address: 0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2'); - try { if (account.accountFactoryAddress != '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - print('Account factory address does not match expected safe factory address. Skipping _fixSafeAccount.'); - print('=== _fixSafeAccount END (SKIPPED) ==='); return; } - print('Creating SafeAccount instance...'); final safeAccount = SafeAccount( config.chains.values.first.node.chainId, config.ethClient, account.address.hexEip55, ); - print('Initializing SafeAccount...'); await safeAccount.init(); - print('SafeAccount initialized successfully'); - print('Generating fixFallbackHandler call data...'); final calldata = safeAccount.fixFallbackHandlerCallData(); - print('Call data generated: ${calldata.length} bytes'); - print('Preparing user operation...'); final (hash, userop) = await prepareUserop( config, account.address, @@ -66,27 +52,24 @@ class AppleAccountsService extends AccountsServiceInterface { [calldata], deploy: false, ); - print('User operation prepared. Hash: $hash'); - print('Submitting user operation...'); final txHash = await submitUserop(config, userop); - print('User operation submission result: $txHash'); if (txHash != null) { - print('✅ SUCCESS: Fixed cw-safe account ${account.address.hexEip55}'); - print('Transaction hash: $txHash'); + debugPrint('fixed cw-safe account ${account.address.hexEip55}'); } else { - print('❌ FAILED: Failed to submit for cw-safe account ${account.address.hexEip55}'); + debugPrint( + 'Failed to submit for cw-safe account ${account.address.hexEip55}'); } } catch (e, stackTrace) { - print('❌ ERROR: cw-safe account ${account.address.hexEip55}: $e'); - print('Stack trace: $stackTrace'); + debugPrint('Error: cw-safe account ${account.address.hexEip55}: $e'); + debugPrint('Stack trace: $stackTrace'); if (e.toString().contains('contract not whitelisted')) { - print('⚠️ Contract not whitelisted error for account ${account.address.hexEip55}'); + debugPrint( + 'Contract not whitelisted error for account ${account.address.hexEip55}'); } } - print('=== _fixSafeAccount END ==='); } @override @@ -272,74 +255,50 @@ class AppleAccountsService extends AccountsServiceInterface { } }, 5: () async { - print('=== MIGRATION 5 START ==='); - print('Starting safe account factory address migration...'); - final allAccounts = await _accountsDB.accounts.all(); - print('Found ${allAccounts.length} total accounts to process'); - - int processedAccounts = 0; - int skippedAccounts = 0; - int safeAccountsFixed = 0; for (final account in allAccounts) { - print('--- Processing account ${account.address.hexEip55} ---'); - print('Account alias: ${account.alias}'); - print('Current factory address: ${account.accountFactoryAddress}'); - if (account.accountFactoryAddress.isNotEmpty && account.accountFactoryAddress != '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - print('Skipping account - factory address is not empty and not the old safe factory'); - skippedAccounts++; continue; } final community = await AppDBService().communities.get(account.alias); if (community == null) { - print('Skipping account - community not found for alias: ${account.alias}'); - skippedAccounts++; continue; } final config = Config.fromJson(community.config); String accountFactoryAddress = config.community.primaryAccountFactory.address; - print('Default factory address from config: $accountFactoryAddress'); switch (account.alias) { case 'gratitude': accountFactoryAddress = '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD'; - print('Using gratitude-specific factory address: $accountFactoryAddress'); break; case 'bread': accountFactoryAddress = '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9'; - print('Using bread-specific factory address: $accountFactoryAddress'); break; case 'wallet.commonshub.brussels': accountFactoryAddress = '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87'; - print('Using commonshub.brussels-specific factory address: $accountFactoryAddress'); break; case 'wallet.sfluv.org': accountFactoryAddress = '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e'; - print('Using sfluv.org-specific factory address: $accountFactoryAddress'); break; default: if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { accountFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; - print('Using default safe factory address for old safe accounts: $accountFactoryAddress'); } break; } - print('Final factory address to use: $accountFactoryAddress'); - // Create new account with factory address final newAccount = DBAccount( alias: account.alias, @@ -351,54 +310,31 @@ class AppleAccountsService extends AccountsServiceInterface { profile: account.profile, ); - print('Deleting old account from database...'); // Delete old account and insert new one await _accountsDB.accounts.delete( account.address, account.alias, account.accountFactoryAddress); - print('Inserting new account into database...'); await _accountsDB.accounts.insert(newAccount); final oldKey = getAccountID( account.address, account.alias, account.accountFactoryAddress); final newKey = getAccountID( account.address, account.alias, accountFactoryAddress); - - print('Old credentials key: $oldKey'); - print('New credentials key: $newKey'); final privateKey = await _credentials.read(oldKey); if (privateKey != null) { - print('Migrating credentials from old key to new key...'); await _credentials.write(newKey, privateKey); await _credentials.delete(oldKey); - print('Credentials migrated successfully'); - } else { - print('No credentials found for old key'); } if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - print('This is an old safe account, calling _fixSafeAccount...'); try { await _fixSafeAccount(newAccount, config); - safeAccountsFixed++; - print('✅ Safe account fixed successfully'); } catch (e) { - print('❌ Failed to fix cw-safe account during migration: $e'); + debugPrint('Failed to fix cw-safe account during migration: $e'); } - } else { - print('Not an old safe account, skipping _fixSafeAccount'); } - - processedAccounts++; - print('--- Account processing complete ---'); } - - print('=== MIGRATION 5 SUMMARY ==='); - print('Total accounts processed: $processedAccounts'); - print('Accounts skipped: $skippedAccounts'); - print('Safe accounts fixed: $safeAccountsFixed'); - print('=== MIGRATION 5 END ==='); }, }; diff --git a/lib/services/db/backup/accounts.dart b/lib/services/db/backup/accounts.dart index c24dc277..2b8dcc8b 100644 --- a/lib/services/db/backup/accounts.dart +++ b/lib/services/db/backup/accounts.dart @@ -113,55 +113,33 @@ class AccountsTable extends DBTable { @override Future migrate(Database db, int oldVersion, int newVersion) async { - print('=== ACCOUNTS TABLE MIGRATION START ==='); - print('Migrating from version $oldVersion to $newVersion'); final migrations = { - 2: () async { - print('Running migration 2: Setting privateKey to NULL'); - await db.execute('UPDATE $name SET privateKey = NULL'); - print('Migration 2 completed successfully'); - }, - 3: () async { - print('Running migration 3: Adding username column'); - try { - await db.execute('SELECT username FROM $name LIMIT 1'); - print('Column username already exists, skipping migration 3'); - } catch (e) { - print('Column username does not exist, adding it...'); - await db.execute('ALTER TABLE $name ADD COLUMN username TEXT DEFAULT NULL'); - print('Successfully added username column'); - } - }, - 4: () async { - // Check if accountFactoryAddress column already exists - try { - await db.execute('SELECT accountFactoryAddress FROM $name LIMIT 1'); - print('Column accountFactoryAddress already exists, skipping migration 4'); - } catch (e) { - print('Column accountFactoryAddress does not exist, adding it...'); - await db.execute('ALTER TABLE $name ADD COLUMN accountFactoryAddress TEXT'); - await db.execute('UPDATE $name SET accountFactoryAddress = "" WHERE accountFactoryAddress IS NULL'); - print('Successfully added accountFactoryAddress column'); - } - } + 2: [ + 'UPDATE $name SET privateKey = NULL', + ], + 3: [ + 'ALTER TABLE $name ADD COLUMN username TEXT DEFAULT NULL', + ], + 4: [ + 'ALTER TABLE $name ADD COLUMN accountFactoryAddress TEXT', + 'UPDATE $name SET accountFactoryAddress = "" WHERE accountFactoryAddress IS NULL', + ] }; for (var i = oldVersion + 1; i <= newVersion; i++) { - final migration = migrations[i]; - - if (migration != null) { - print('Running migration $i...'); - try { - await migration(); - } catch (e, s) { - print('Migration error: $e'); - print('Stack trace: $s'); + final queries = migrations[i]; + + if (queries != null) { + for (final query in queries) { + try { + await db.execute(query); + } catch (e, s) { + debugPrint('Migration error: $e'); + debugPrintStack(stackTrace: s); + } } - } else { - print('No migration defined for version $i'); } } - print('=== ACCOUNTS TABLE MIGRATION END ==='); } Future> getAllLegacyDBAccounts() async { diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index f18d0eff..5bdce5db 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -381,9 +381,39 @@ class WalletLogic extends WidgetsBindingObserver { var dbWallet = await _encPrefs.getAccount(accAddress, alias, ''); + if (dbWallet != null && dbWallet.privateKey == null) { + final allAccounts = await _encPrefs.getAllAccounts(); + final accountWithKey = allAccounts + .where((acc) => + acc.address.hexEip55 == accAddress && + acc.alias == alias && + acc.privateKey != null) + .firstOrNull; + + if (accountWithKey != null) { + dbWallet = accountWithKey; + } + } + if (dbWallet != null && dbWallet.accountFactoryAddress.isNotEmpty) { - dbWallet = await _encPrefs.getAccount( + var factoryWallet = await _encPrefs.getAccount( accAddress, alias, dbWallet.accountFactoryAddress); + + if (factoryWallet != null && factoryWallet.privateKey == null) { + final allAccounts = await _encPrefs.getAllAccounts(); + final accountWithKey = allAccounts + .where((acc) => + acc.address?.hexEip55 == accAddress && + acc.alias == alias && + acc.privateKey != null) + .firstOrNull; + + if (accountWithKey != null) { + factoryWallet = accountWithKey; + } + } + + dbWallet = factoryWallet; } else if (dbWallet != null && dbWallet.accountFactoryAddress.isEmpty) { String defaultAccountFactoryAddress = communityConfig.community.primaryAccountFactory.address; From 515fb1505372c2c109121a7d8ec38d8e9c93e7f6 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Tue, 12 Aug 2025 12:50:31 +0530 Subject: [PATCH 20/46] Repo Update --- assets/config/v5/communities.json | 153 +----- assets/config/v5/communities.test.json | 153 +----- lib/services/accounts/native/android.dart | 1 + lib/services/accounts/native/apple.dart | 1 + lib/services/wallet/wallet.dart | 495 ++++++++++++++++++-- lib/services/wallet_connect/wallet_kit.dart | 1 + lib/state/deep_link/logic.dart | 1 + lib/state/vouchers/logic.dart | 171 +++++++ lib/state/wallet/logic.dart | 337 +++++++++++++ 9 files changed, 1010 insertions(+), 303 deletions(-) diff --git a/assets/config/v5/communities.json b/assets/config/v5/communities.json index f70ac35c..8580520d 100644 --- a/assets/config/v5/communities.json +++ b/assets/config/v5/communities.json @@ -987,7 +987,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 137 } }, @@ -1013,13 +1013,6 @@ "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", "paymaster_type": "payg", "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1059,7 +1052,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1084,13 +1077,6 @@ "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1129,7 +1115,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1154,13 +1140,6 @@ "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1196,7 +1175,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 137 } }, @@ -1222,13 +1201,6 @@ "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", "paymaster_type": "cw", "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1267,7 +1239,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 137 } }, @@ -1293,13 +1265,6 @@ "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", "paymaster_type": "cw", "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1338,7 +1303,7 @@ "chain_id": 8453 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 8453 } }, @@ -1364,13 +1329,6 @@ "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", "paymaster_type": "cw", "gas_extra_percentage": 50 - }, - "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 8453, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1407,7 +1365,7 @@ "chain_id": 8453 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 8453 } }, @@ -1432,13 +1390,6 @@ "paymaster_address": "0x123", "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", "paymaster_type": "payg" - }, - "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 8453, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x123", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1474,7 +1425,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 137 } }, @@ -1499,13 +1450,6 @@ "paymaster_address": "0x123", "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x123", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1541,7 +1485,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 137 } }, @@ -1566,13 +1510,6 @@ "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1608,7 +1545,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1633,13 +1570,6 @@ "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1683,7 +1613,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1708,13 +1638,6 @@ "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1758,7 +1681,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1783,13 +1706,6 @@ "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1833,7 +1749,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1858,13 +1774,6 @@ "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1903,7 +1812,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 }, "card_factory": { @@ -1932,13 +1841,6 @@ "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "cards": { @@ -1980,7 +1882,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -2005,13 +1907,6 @@ "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -2046,7 +1941,7 @@ "chain_id": 84532 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 84532 } }, @@ -2071,13 +1966,6 @@ "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", "paymaster_type": "cw" - }, - "84532:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 84532, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -2112,7 +2000,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -2137,13 +2025,6 @@ "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { diff --git a/assets/config/v5/communities.test.json b/assets/config/v5/communities.test.json index f70ac35c..8580520d 100644 --- a/assets/config/v5/communities.test.json +++ b/assets/config/v5/communities.test.json @@ -987,7 +987,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 137 } }, @@ -1013,13 +1013,6 @@ "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", "paymaster_type": "payg", "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1059,7 +1052,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1084,13 +1077,6 @@ "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1129,7 +1115,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1154,13 +1140,6 @@ "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1196,7 +1175,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 137 } }, @@ -1222,13 +1201,6 @@ "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", "paymaster_type": "cw", "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1267,7 +1239,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 137 } }, @@ -1293,13 +1265,6 @@ "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", "paymaster_type": "cw", "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1338,7 +1303,7 @@ "chain_id": 8453 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 8453 } }, @@ -1364,13 +1329,6 @@ "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", "paymaster_type": "cw", "gas_extra_percentage": 50 - }, - "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 8453, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1407,7 +1365,7 @@ "chain_id": 8453 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 8453 } }, @@ -1432,13 +1390,6 @@ "paymaster_address": "0x123", "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", "paymaster_type": "payg" - }, - "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 8453, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x123", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1474,7 +1425,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 137 } }, @@ -1499,13 +1450,6 @@ "paymaster_address": "0x123", "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x123", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1541,7 +1485,7 @@ "chain_id": 137 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 137 } }, @@ -1566,13 +1510,6 @@ "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1608,7 +1545,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1633,13 +1570,6 @@ "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1683,7 +1613,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1708,13 +1638,6 @@ "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1758,7 +1681,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1783,13 +1706,6 @@ "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1833,7 +1749,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -1858,13 +1774,6 @@ "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -1903,7 +1812,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 }, "card_factory": { @@ -1932,13 +1841,6 @@ "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "cards": { @@ -1980,7 +1882,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -2005,13 +1907,6 @@ "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -2046,7 +1941,7 @@ "chain_id": 84532 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 84532 } }, @@ -2071,13 +1966,6 @@ "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", "paymaster_type": "cw" - }, - "84532:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 84532, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { @@ -2112,7 +2000,7 @@ "chain_id": 42220 }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 42220 } }, @@ -2137,13 +2025,6 @@ "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" } }, "chains": { diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index 54908586..43ad236f 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -55,6 +55,7 @@ class AndroidAccountsService extends AccountsServiceInterface { [account.address.hexEip55], [calldata], deploy: false, + accountFactoryAddress: account.accountFactoryAddress, ); final txHash = await submitUserop(config, userop); diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index 29705c3f..aed6b5a7 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -51,6 +51,7 @@ class AppleAccountsService extends AccountsServiceInterface { [account.address.hexEip55], [calldata], deploy: false, + accountFactoryAddress: account.accountFactoryAddress, ); final txHash = await submitUserop(config, userop); diff --git a/lib/services/wallet/wallet.dart b/lib/services/wallet/wallet.dart index 698e0a0b..bd733ac1 100644 --- a/lib/services/wallet/wallet.dart +++ b/lib/services/wallet/wallet.dart @@ -8,6 +8,7 @@ import 'package:citizenwallet/services/indexer/signed_request.dart'; import 'package:citizenwallet/services/engine/utils.dart'; import 'package:citizenwallet/services/sigauth/sigauth.dart'; import 'package:citizenwallet/services/wallet/contracts/erc20.dart'; +import 'package:citizenwallet/services/wallet/contracts/entrypoint.dart'; import 'package:citizenwallet/services/wallet/contracts/profile.dart'; import 'package:citizenwallet/services/wallet/contracts/simpleFaucet.dart'; import 'package:citizenwallet/services/wallet/contracts/cards/card_manager.dart'; @@ -25,6 +26,16 @@ import 'package:flutter/foundation.dart'; import 'package:web3dart/crypto.dart'; import 'package:web3dart/web3dart.dart'; +int _prepareUseropCallCount = 0; +int _submitUseropCallCount = 0; +bool _migrationInProgress = false; + +void setMigrationInProgress(bool inProgress) { + _migrationInProgress = inProgress; +} + +bool get isMigrationInProgress => _migrationInProgress; + /// given a tx hash, waits for the tx to be mined Future waitForTxSuccess( Config config, @@ -73,9 +84,9 @@ Uint8List tokenTransferCallData( } else if (config.getPrimaryToken().standard == 'erc1155') { return config.token1155Contract .transferCallData(from.hexEip55, to, tokenId ?? BigInt.zero, amount); + } else { + return Uint8List.fromList([]); } - - return Uint8List.fromList([]); } String transferEventStringSignature(Config config) { @@ -175,7 +186,8 @@ Future getProfileByUsername(Config config, String username) async { /// profileExists checks whether there is a profile for this username Future profileExists(Config config, String username) async { try { - final url = await config.profileContract.getURLFromUsername(username) + final url = await config.profileContract + .getURLFromUsername(username) .timeout(const Duration(seconds: 10)); return url != ''; @@ -247,6 +259,7 @@ Future setProfile( credentials, [config.profileContract.addr], [calldata], + accountFactoryAddress: config.community.primaryAccountFactory.address, ); final txHash = await submitUserop(config, userop); @@ -304,6 +317,7 @@ Future updateProfile(Config config, EthereumAddress account, credentials, [config.profileContract.addr], [calldata], + accountFactoryAddress: config.community.primaryAccountFactory.address, ); final txHash = await submitUserop(config, userop); @@ -362,7 +376,6 @@ Future deleteCurrentProfile( return false; } -/// check if an account exists Future accountExists( Config config, EthereumAddress account, @@ -375,7 +388,38 @@ Future accountExists( ); return true; - } catch (_) {} + } catch (e) { + return false; + } +} + +Future accountExistsWithFallback( + Config config, + EthereumAddress account, +) async { + try { + final exists = await accountExists(config, account); + if (exists) { + return true; + } + } catch (e) {} + + try { + final nonce = await config.entryPointContract.getNonce(account.hexEip55); + final exists = nonce > BigInt.zero; + if (exists) { + return true; + } + } catch (e) {} + + try { + final balance = await getBalance(config, account); + final exists = + double.tryParse(balance) != null && double.parse(balance) > 0; + if (exists) { + return true; + } + } catch (e) {} return false; } @@ -407,6 +451,7 @@ Future createAccount( credentials, [account.hexEip55], [calldata], + accountFactoryAddress: config.community.primaryAccountFactory.address, ); final txHash = await submitUserop( @@ -533,7 +578,48 @@ Future<(List, Exception?)> getPaymasterOOData( return ([], NetworkUnknownException()); } -/// prepare a userop for with calldata +Future<(PaymasterData?, Exception?)> getPaymasterDataWithFallback( + Config config, + UserOp userop, + String eaddr, + String ptype, { + bool legacy = false, +}) async { + try { + final (data, error) = + await getPaymasterData(config, userop, eaddr, ptype, legacy: legacy); + if (data != null) { + return (data, null); + } + } catch (e) {} + + if (!legacy) { + try { + final (data, error) = + await getPaymasterData(config, userop, eaddr, ptype, legacy: true); + if (data != null) { + return (data, null); + } + } catch (e) {} + } + + final alternativeTypes = ['payg', 'cw', 'cw-safe']; + for (final altType in alternativeTypes) { + if (altType != ptype) { + try { + final (data, error) = await getPaymasterData( + config, userop, eaddr, altType, + legacy: legacy); + if (data != null) { + return (data, null); + } + } catch (e) {} + } + } + + return (null, NetworkUnknownException()); +} + Future<(String, UserOp)> prepareUserop( Config config, EthereumAddress account, @@ -544,6 +630,88 @@ Future<(String, UserOp)> prepareUserop( BigInt? customNonce, bool deploy = true, BigInt? value, + String? accountFactoryAddress, + bool migrationSafe = false, + bool useFallback = true, +}) async { + _prepareUseropCallCount++; + + if (migrationSafe) { + _prepareUseropCallCount--; + return await _prepareUseropOriginal( + config, + account, + credentials, + dest, + calldata, + customCredentials: customCredentials, + customNonce: customNonce, + deploy: deploy, + value: value, + accountFactoryAddress: accountFactoryAddress, + ); + } + + if (!useFallback || _prepareUseropCallCount > 1) { + _prepareUseropCallCount--; + return await _prepareUseropOriginal( + config, + account, + credentials, + dest, + calldata, + customCredentials: customCredentials, + customNonce: customNonce, + deploy: deploy, + value: value, + accountFactoryAddress: accountFactoryAddress, + ); + } + + if (_migrationInProgress) { + _prepareUseropCallCount--; + return await _prepareUseropOriginal( + config, + account, + credentials, + dest, + calldata, + customCredentials: customCredentials, + customNonce: customNonce, + deploy: deploy, + value: value, + accountFactoryAddress: accountFactoryAddress, + ); + } + + final result = await prepareUseropWithFallback( + config, + account, + credentials, + dest, + calldata, + customCredentials: customCredentials, + customNonce: customNonce, + deploy: deploy, + value: value, + accountFactoryAddress: accountFactoryAddress, + ); + + _prepareUseropCallCount--; + return result; +} + +Future<(String, UserOp)> _prepareUseropOriginal( + Config config, + EthereumAddress account, + EthPrivateKey credentials, + List dest, + List calldata, { + EthPrivateKey? customCredentials, + BigInt? customNonce, + bool deploy = true, + BigInt? value, + String? accountFactoryAddress, }) async { try { final cred = customCredentials ?? credentials; @@ -562,7 +730,7 @@ Future<(String, UserOp)> prepareUserop( // determine the appropriate nonce BigInt nonce = customNonce ?? await config.getNonce(acc.hexEip55); - final paymasterType = config.getPaymasterType(); + var paymasterType = config.getPaymasterType(); // if it's the first user op from this account, we need to deploy the account contract if (nonce == BigInt.zero && deploy) { @@ -605,32 +773,85 @@ Future<(String, UserOp)> prepareUserop( : simpleAccount.executeCallData( dest[0], value ?? BigInt.zero, - // value ?? BigInt.zero, calldata[0], ); break; } case 'cw-safe': { - final safeAccount = await config.getSafeAccount(acc.hexEip55); - userop.callData = safeAccount.executeCallData( - dest[0], - value ?? BigInt.zero, - // value ?? BigInt.zero, - calldata[0], - ); + // Get account-specific configuration if available + ERC4337Config? accountConfig; + if (accountFactoryAddress != null && + accountFactoryAddress.isNotEmpty) { + try { + accountConfig = + config.getAccountAbstractionConfig(accountFactoryAddress); + } catch (e) {} + } + + final oldFactoryAddresses = [ + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2', // Old Safe factory + '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9', // Old Bread factory + '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD', // Old Gratitude factory + '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87', // Old Brussels factory + '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e', // Old SFLUV factory + ]; + final isOldAccount = accountFactoryAddress != null && + oldFactoryAddresses.contains(accountFactoryAddress); + + if (isOldAccount) { + // Use SimpleAccount execution for legacy accounts + final simpleAccount = await config.getSimpleAccount(acc.hexEip55); + userop.callData = simpleAccount.executeCallData( + dest[0], + value ?? BigInt.zero, + calldata[0], + ); + + // Apply account-specific configuration overrides + if (accountConfig != null) { + // Override entry point if different from current + if (config.entryPointContract.addr != + accountConfig.entrypointAddress) { + config.entryPointContract = StackupEntryPoint( + config.chains.values.first.id, + config.ethClient, + accountConfig.entrypointAddress, + ); + await config.entryPointContract.init(); + } + + // Override paymaster type if different + if (paymasterType != accountConfig.paymasterType) { + paymasterType = accountConfig.paymasterType; + } + + // Override paymaster URL if we have a paymaster address + if (accountConfig.paymasterAddress != null) { + final paymasterUrl = + '${config.chains.values.first.node.url}/v1/rpc/${accountConfig.paymasterAddress!}'; + config.engineRPC = APIService(baseURL: paymasterUrl); + } + } + } else { + // Use SafeAccount execution for new accounts + final safeAccount = await config.getSafeAccount(acc.hexEip55); + userop.callData = safeAccount.executeCallData( + dest[0], + value ?? BigInt.zero, + calldata[0], + ); + } break; } } - // submit the user op to the paymaster in order to receive information to complete the user op List paymasterOOData = []; Exception? paymasterErr; final useAccountNonce = (nonce == BigInt.zero || paymasterType == 'payg') && deploy; if (useAccountNonce) { - // if it's the first user op, we should use a normal paymaster signature PaymasterData? paymasterData; (paymasterData, paymasterErr) = await getPaymasterData( config, @@ -643,7 +864,6 @@ Future<(String, UserOp)> prepareUserop( paymasterOOData.add(paymasterData); } } else { - // if it's not the first user op, we should use an out of order paymaster signature (paymasterOOData, paymasterErr) = await getPaymasterOOData( config, userop, @@ -661,41 +881,218 @@ Future<(String, UserOp)> prepareUserop( } final paymasterData = paymasterOOData.first; + if (!useAccountNonce) { - // use the nonce received from the paymaster userop.nonce = paymasterData.nonce; } - // add the received data to the user op userop.paymasterAndData = paymasterData.paymasterAndData; userop.preVerificationGas = paymasterData.preVerificationGas; userop.verificationGasLimit = paymasterData.verificationGasLimit; userop.callGasLimit = paymasterData.callGasLimit; - // get the hash of the user op final hash = await config.entryPointContract.getUserOpHash(userop); - // now we can sign the user op userop.generateSignature(cred, hash); return (bytesToHex(hash, include0x: true), userop); - } catch (_) { + } catch (e, s) { + rethrow; + } +} + +Future<(String, UserOp)> prepareUseropWithFallback( + Config config, + EthereumAddress account, + EthPrivateKey credentials, + List dest, + List calldata, { + EthPrivateKey? customCredentials, + BigInt? customNonce, + bool deploy = true, + BigInt? value, + String? accountFactoryAddress, +}) async { + try { + final (hash, userop) = await prepareUserop( + config, + account, + credentials, + dest, + calldata, + customCredentials: customCredentials, + customNonce: customNonce, + deploy: deploy, + value: value, + accountFactoryAddress: accountFactoryAddress, + ); + return (hash, userop); + } catch (e) {} + + if (!deploy) { + try { + final (hash, userop) = await prepareUserop( + config, + account, + credentials, + dest, + calldata, + customCredentials: customCredentials, + customNonce: customNonce, + deploy: true, + value: value, + accountFactoryAddress: accountFactoryAddress, + ); + return (hash, userop); + } catch (e) {} + } + + if (accountFactoryAddress != null) { + try { + final (hash, userop) = await prepareUserop( + config, + account, + credentials, + dest, + calldata, + customCredentials: customCredentials, + customNonce: customNonce, + deploy: deploy, + value: value, + accountFactoryAddress: null, + ); + return (hash, userop); + } catch (e) {} + } + + try { + final cred = customCredentials ?? credentials; + final acc = account; + + final userop = UserOp.defaultUserOp(); + userop.sender = acc.hexEip55; + + final exists = await accountExistsWithFallback(config, acc); + + BigInt nonce = customNonce ?? await config.getNonce(acc.hexEip55); + + if (nonce == BigInt.zero && deploy && !exists) { + final accountFactory = config.accountFactoryContract; + userop.initCode = await accountFactory.createAccountInitCode( + cred.address.hexEip55, + BigInt.zero, + ); + } + + userop.nonce = nonce; + + final simpleAccount = await config.getSimpleAccount(acc.hexEip55); + userop.callData = dest.length > 1 && calldata.length > 1 + ? simpleAccount.executeBatchCallData(dest, calldata) + : simpleAccount.executeCallData( + dest[0], value ?? BigInt.zero, calldata[0]); + + final (paymasterData, paymasterErr) = await getPaymasterDataWithFallback( + config, + userop, + config.entryPointContract.addr, + config.getPaymasterType(), + ); + + if (paymasterErr != null) { + throw paymasterErr; + } + + if (paymasterData != null) { + userop.paymasterAndData = paymasterData.paymasterAndData; + userop.preVerificationGas = paymasterData.preVerificationGas; + userop.verificationGasLimit = paymasterData.verificationGasLimit; + userop.callGasLimit = paymasterData.callGasLimit; + + if (nonce == BigInt.zero && deploy) { + userop.nonce = paymasterData.nonce; + } + } else { + throw Exception('No paymaster data available'); + } + + final hash = await config.entryPointContract.getUserOpHash(userop); + userop.generateSignature(cred, hash); + + return (bytesToHex(hash, include0x: true), userop); + } catch (e) { rethrow; } } -/// submit a user op Future submitUserop( Config config, UserOp userop, { EthPrivateKey? customCredentials, Map? data, TransferData? extraData, + bool migrationSafe = false, + bool useRetry = true, +}) async { + _submitUseropCallCount++; + + if (migrationSafe) { + _submitUseropCallCount--; + return await _submitUseropOriginal( + config, + userop, + customCredentials: customCredentials, + data: data, + extraData: extraData, + ); + } + + if (!useRetry || _submitUseropCallCount > 1) { + _submitUseropCallCount--; + return await _submitUseropOriginal( + config, + userop, + customCredentials: customCredentials, + data: data, + extraData: extraData, + ); + } + + if (_migrationInProgress) { + _submitUseropCallCount--; + return await _submitUseropOriginal( + config, + userop, + customCredentials: customCredentials, + data: data, + extraData: extraData, + ); + } + + final result = await submitUseropWithRetry( + config, + userop, + customCredentials: customCredentials, + data: data, + extraData: extraData, + ); + + _submitUseropCallCount--; + return result; +} + +Future _submitUseropOriginal( + Config config, + UserOp userop, { + EthPrivateKey? customCredentials, + Map? data, + TransferData? extraData, }) async { try { final entryPoint = config.entryPointContract; final params = [userop.toJson(), entryPoint.addr]; + if (data != null) { params.add(data); } @@ -712,9 +1109,6 @@ Future submitUserop( return response.result as String; } catch (exception, s) { - debugPrint('error: $exception'); - debugPrint('stack trace: $s'); - final strerr = exception.toString(); if (strerr.contains(gasFeeErrorMessage)) { @@ -729,19 +1123,58 @@ Future submitUserop( throw NetworkUnknownException(); } -/// makes a jsonrpc request from this wallet +Future submitUseropWithRetry( + Config config, + UserOp userop, { + EthPrivateKey? customCredentials, + Map? data, + TransferData? extraData, + int maxRetries = 3, +}) async { + int attempt = 0; + Duration delay = const Duration(seconds: 1); + + while (attempt < maxRetries) { + attempt++; + + try { + final result = await submitUserop( + config, + userop, + customCredentials: customCredentials, + data: data, + extraData: extraData, + ); + + if (result != null) { + return result; + } + } catch (e) { + if (attempt >= maxRetries) { + rethrow; + } + + if (e is NetworkInvalidBalanceException) { + rethrow; + } + + await Future.delayed(delay); + delay = Duration(seconds: delay.inSeconds * 2); + } + } + + return null; +} + Future requestBundler( Config config, SUJSONRPCRequest body) async { final rawResponse = await config.engineRPC.post( body: body, ); - debugPrint('rawResponse: ${rawResponse.toString()}'); - final response = SUJSONRPCResponse.fromJson(rawResponse); if (response.error != null) { - debugPrint('error: ${response.error!.message}'); throw Exception(response.error!.message); } diff --git a/lib/services/wallet_connect/wallet_kit.dart b/lib/services/wallet_connect/wallet_kit.dart index bf9f1a44..bc050777 100644 --- a/lib/services/wallet_connect/wallet_kit.dart +++ b/lib/services/wallet_connect/wallet_kit.dart @@ -338,6 +338,7 @@ class WalletKitService { [transaction['to']], [data], value: value, + accountFactoryAddress: config.community.primaryAccountFactory.address, ); final txHash = await submitUserop( diff --git a/lib/state/deep_link/logic.dart b/lib/state/deep_link/logic.dart index bb5cc19f..6ab6ad44 100644 --- a/lib/state/deep_link/logic.dart +++ b/lib/state/deep_link/logic.dart @@ -50,6 +50,7 @@ class DeepLinkLogic { _credentials, [address], [calldata], + accountFactoryAddress: _config.community.primaryAccountFactory.address, ); final txHash = await submitUserop(_config, userop); diff --git a/lib/state/vouchers/logic.dart b/lib/state/vouchers/logic.dart index 4d4462ec..0a238f30 100644 --- a/lib/state/vouchers/logic.dart +++ b/lib/state/vouchers/logic.dart @@ -5,6 +5,8 @@ import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/db/account/db.dart'; import 'package:citizenwallet/services/db/account/vouchers.dart'; import 'package:citizenwallet/services/db/app/db.dart'; +import 'package:citizenwallet/services/accounts/accounts.dart'; +import 'package:citizenwallet/services/db/backup/accounts.dart'; import 'package:citizenwallet/services/share/share.dart'; import 'package:citizenwallet/services/wallet/contracts/erc20.dart'; import 'package:citizenwallet/services/engine/utils.dart'; @@ -28,6 +30,7 @@ class VoucherLogic extends WidgetsBindingObserver { final AppDBService _appDBService = AppDBService(); final AccountDBService _accountDBService = AccountDBService(); final SharingService _sharing = SharingService(); + final AccountsServiceInterface _encPrefs = getAccountsService(); late EthPrivateKey _currentCredentials; late EthereumAddress _currentAccount; @@ -62,6 +65,166 @@ class VoucherLogic extends WidgetsBindingObserver { _state.resetCreate(notify: false); } + Future resolveAccountFactoryAddress() async { + try { + if (_currentConfig == null) { + throw Exception('Current config is null'); + } + + if (_currentConfig.community.primaryAccountFactory.address.isEmpty) { + throw Exception('Primary account factory address is empty'); + } + + if (_currentAccount == null) { + throw Exception('Current account is null'); + } + + try { + final factoryAddress = + await getAccountFactoryAddressWithHiddenCommunityFallback(); + if (factoryAddress.isNotEmpty) { + return factoryAddress; + } + } catch (e) {} + + try { + final possibleFactories = [ + '', + _currentConfig.community.primaryAccountFactory.address, + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2', + '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185', + '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9', + '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD', + '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87', + '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e', + ]; + + for (final factory in possibleFactories) { + try { + final dbAccount = await _encPrefs.getAccount( + _currentAccount.hexEip55, + _currentConfig.community.alias, + factory); + if (dbAccount != null && + dbAccount.accountFactoryAddress.isNotEmpty) { + return dbAccount.accountFactoryAddress; + } + } catch (e) {} + } + } catch (e) {} + + try { + final communityMappings = { + 'bread': '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9', + 'gratitude': '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD', + 'wallet.commonshub.brussels': + '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87', + 'wallet.sfluv.org': '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e', + }; + + final mappedFactory = communityMappings[_currentConfig.community.alias]; + if (mappedFactory != null) { + return mappedFactory; + } + } catch (e) {} + + try { + final allAccounts = await _encPrefs.getAllAccounts(); + final matchingAccounts = allAccounts + .where((acc) => acc.address.hexEip55 == _currentAccount.hexEip55) + .toList(); + + for (final account in matchingAccounts) { + if (account.accountFactoryAddress.isNotEmpty) { + return account.accountFactoryAddress; + } + } + } catch (e) {} + + try { + final primaryFactory = + _currentConfig.community.primaryAccountFactory.address; + if (primaryFactory.isNotEmpty) { + return primaryFactory; + } + } catch (e) {} + + return '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + } catch (e) { + return '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + } + } + + Future getAccountFactoryAddressWithHiddenCommunityFallback() async { + try { + final dbAccount = await _encPrefs.getAccount( + _currentAccount.hexEip55, _currentConfig.community.alias, ''); + + if (dbAccount?.accountFactoryAddress != null && + dbAccount!.accountFactoryAddress.isNotEmpty) { + return dbAccount.accountFactoryAddress; + } + + final oldAccountFactories = { + 'bread': '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9', + 'gratitude': '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD', + 'wallet.commonshub.brussels': + '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87', + 'wallet.sfluv.org': '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e', + }; + + final oldFactory = oldAccountFactories[_currentConfig.community.alias]; + if (oldFactory != null) { + if (dbAccount != null) { + final updatedAccount = DBAccount( + alias: dbAccount.alias, + address: dbAccount.address, + name: dbAccount.name, + username: dbAccount.username, + accountFactoryAddress: oldFactory, + privateKey: dbAccount.privateKey, + profile: dbAccount.profile, + ); + await _encPrefs.setAccount(updatedAccount); + } + return oldFactory; + } + final allAccounts = await _encPrefs.getAllAccounts(); + final matchingAccount = allAccounts + .where((acc) => acc.address.hexEip55 == _currentAccount.hexEip55) + .firstOrNull; + + if (matchingAccount != null && + matchingAccount.accountFactoryAddress.isNotEmpty) { + return matchingAccount.accountFactoryAddress; + } + final legacyAccount = await _encPrefs.getAccount( + _currentAccount.hexEip55, + _currentConfig.community.alias, + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2'); + if (legacyAccount != null) { + const newFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + + final updatedAccount = DBAccount( + alias: legacyAccount.alias, + address: legacyAccount.address, + name: legacyAccount.name, + username: legacyAccount.username, + accountFactoryAddress: newFactoryAddress, + privateKey: legacyAccount.privateKey, + profile: legacyAccount.profile, + ); + await _encPrefs.setAccount(updatedAccount); + + return newFactoryAddress; + } + + return _currentConfig.community.primaryAccountFactory.address; + } catch (e) { + return _currentConfig.community.primaryAccountFactory.address; + } + } + _loadVoucher() async { if (stopLoading) { return; @@ -368,12 +531,15 @@ class VoucherLogic extends WidgetsBindingObserver { vouchers.add(voucher); } + final accountFactoryAddress = await resolveAccountFactoryAddress(); + final (_, userop) = await prepareUserop( _currentConfig, _currentAccount, _currentCredentials, addresses, calldata, + accountFactoryAddress: accountFactoryAddress, ); final txHash = await submitUserop( @@ -468,6 +634,7 @@ class VoucherLogic extends WidgetsBindingObserver { account.hexEip55, parsedAmount, ); + final accountFactoryAddress = await resolveAccountFactoryAddress(); final (_, userop) = await prepareUserop( _currentConfig, @@ -475,6 +642,7 @@ class VoucherLogic extends WidgetsBindingObserver { _currentCredentials, [_currentConfig.getPrimaryToken().address], [calldata], + accountFactoryAddress: accountFactoryAddress, ); final args = { @@ -626,6 +794,8 @@ class VoucherLogic extends WidgetsBindingObserver { amount, ); + final accountFactoryAddress = await resolveAccountFactoryAddress(); + final (hash, userop) = await prepareUserop( _currentConfig, _currentAccount, @@ -633,6 +803,7 @@ class VoucherLogic extends WidgetsBindingObserver { [_currentConfig.getPrimaryToken().address], [calldata], customCredentials: credentials, + accountFactoryAddress: accountFactoryAddress, ); if (sendingTransaction != null) { diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index 5bdce5db..72ce1b1c 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -1196,7 +1196,18 @@ class WalletLogic extends WidgetsBindingObserver { String message = '', String? id, bool clearInProgress = false, + bool useFallbackStrategy = false, }) async { + if (useFallbackStrategy) { + return sendTransactionWithFallback( + amount, + to, + message: message, + id: id, + clearInProgress: clearInProgress, + ); + } + return kIsWeb ? sendTransactionFromUnlocked( amount, @@ -1209,6 +1220,158 @@ class WalletLogic extends WidgetsBindingObserver { message: message, id: id, clearInProgress: clearInProgress); } + Future sendTransactionWithFallback( + String amount, + String to, { + String message = '', + String? id, + bool clearInProgress = false, + }) async { + final doubleAmount = amount.replaceAll(',', '.'); + final parsedAmount = toUnit( + doubleAmount, + decimals: _currentConfig.getPrimaryToken().decimals, + ); + + var tempId = id ?? '${pendingTransactionId}_${generateRandomId()}'; + + try { + _state.sendTransaction(id: id); + + if (to.isEmpty) { + _state.setInvalidAddress(true); + throw Exception('invalid address'); + } + + preSendingTransaction( + parsedAmount, + tempId, + to, + _currentAccount.hexEip55, + message: message, + ); + + final calldata = tokenTransferCallData( + _currentConfig, + _currentAccount, + to, + parsedAmount, + ); + + final accountFactoryAddress = await resolveAccountFactoryAddress(); + + final (hash, userop) = await prepareUseropWithFallback( + _currentConfig, + _currentAccount, + _currentCredentials, + [_currentConfig.getPrimaryToken().address], + [calldata], + accountFactoryAddress: accountFactoryAddress, + ); + + final args = { + 'from': _currentAccount.hexEip55, + 'to': to, + }; + if (_currentConfig.getPrimaryToken().standard == 'erc1155') { + args['operator'] = _currentAccount.hexEip55; + args['id'] = '0'; + args['amount'] = parsedAmount.toString(); + } else { + args['value'] = parsedAmount.toString(); + } + + final eventData = createEventData( + stringSignature: transferEventStringSignature(_currentConfig), + topic: transferEventSignature(_currentConfig), + args: args, + ); + + final txHash = await submitUseropWithRetry( + _currentConfig, + userop, + data: eventData, + extraData: message != '' ? TransferData(message) : null, + ); + + if (txHash == null) { + throw Exception('transaction failed'); + } + + sendingTransaction( + parsedAmount, + tempId, + to, + _currentAccount.hexEip55, + message: message, + ); + + if (userop.isFirst()) { + waitForTxSuccess(_currentConfig, txHash).then((value) { + if (!value) { + return; + } + _notificationsLogic.refreshPushToken(); + }); + } + + clearInputControllers(); + + _state.sendTransactionSuccess(null); + if (clearInProgress) { + _state.clearInProgressTransaction(notify: true); + } + + return txHash; + } on NetworkCongestedException { + _state.sendQueueAddTransaction( + CWTransaction.failed( + fromDoubleUnit( + parsedAmount.toString(), + decimals: _currentConfig.getPrimaryToken().decimals, + ), + id: tempId, + hash: '', + to: to, + description: message, + date: DateTime.now(), + error: NetworkCongestedException().message), + ); + } on NetworkInvalidBalanceException { + _state.sendQueueAddTransaction( + CWTransaction.failed( + fromDoubleUnit( + parsedAmount.toString(), + decimals: _currentConfig.getPrimaryToken().decimals, + ), + id: tempId, + hash: '', + to: to, + description: message, + date: DateTime.now(), + error: NetworkInvalidBalanceException().message), + ); + } catch (e, s) { + _state.sendQueueAddTransaction( + CWTransaction.failed( + fromDoubleUnit( + parsedAmount.toString(), + decimals: _currentConfig.getPrimaryToken().decimals, + ), + id: tempId, + hash: '', + to: to, + description: message, + date: DateTime.now(), + error: NetworkUnknownException().message), + ); + } + + _state.sendTransactionError(); + + return null; + } + bool isInvalidAmount(String amount, {unlimited = false}) { if (unlimited) { return false; @@ -1320,12 +1483,15 @@ class WalletLogic extends WidgetsBindingObserver { parsedAmount, ); + final accountFactoryAddress = await resolveAccountFactoryAddress(); + final (hash, userop) = await prepareUserop( _currentConfig, _currentAccount, _currentCredentials, [_currentConfig.getPrimaryToken().address], [calldata], + accountFactoryAddress: accountFactoryAddress, ); final args = { @@ -1450,6 +1616,8 @@ class WalletLogic extends WidgetsBindingObserver { final calldata = hexToBytes(data); + final accountFactoryAddress = await resolveAccountFactoryAddress(); + final (hash, userop) = await prepareUserop( _currentConfig, _currentAccount, @@ -1457,6 +1625,7 @@ class WalletLogic extends WidgetsBindingObserver { [to], [calldata], value: BigInt.parse(value.isEmpty ? '0' : value), + accountFactoryAddress: accountFactoryAddress, ); final txHash = await submitUserop( @@ -1535,12 +1704,15 @@ class WalletLogic extends WidgetsBindingObserver { parsedAmount, ); + final accountFactoryAddress = await resolveAccountFactoryAddress(); + final (hash, userop) = await prepareUserop( _currentConfig, _currentAccount, _currentCredentials, [_currentConfig.getPrimaryToken().address], [calldata], + accountFactoryAddress: accountFactoryAddress, ); final args = { @@ -1686,12 +1858,15 @@ class WalletLogic extends WidgetsBindingObserver { parsedAmount, ); + final accountFactoryAddress = await resolveAccountFactoryAddress(); + final (_, userop) = await prepareUserop( _currentConfig, _currentAccount, _currentCredentials, [_currentConfig.getPrimaryToken().address], [calldata], + accountFactoryAddress: accountFactoryAddress, ); final args = { @@ -2080,6 +2255,168 @@ class WalletLogic extends WidgetsBindingObserver { _state.loadWalletsError(); } + Future getAccountFactoryAddressWithHiddenCommunityFallback() async { + try { + final dbAccount = await _encPrefs.getAccount( + _currentAccount.hexEip55, _currentConfig.community.alias, ''); + + if (dbAccount?.accountFactoryAddress != null && + dbAccount!.accountFactoryAddress.isNotEmpty) { + return dbAccount.accountFactoryAddress; + } + + final oldAccountFactories = { + 'bread': '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9', + 'gratitude': '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD', + 'wallet.commonshub.brussels': + '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87', + 'wallet.sfluv.org': '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e', + }; + + final oldFactory = oldAccountFactories[_currentConfig.community.alias]; + if (oldFactory != null) { + if (dbAccount != null) { + final updatedAccount = DBAccount( + alias: dbAccount.alias, + address: dbAccount.address, + name: dbAccount.name, + username: dbAccount.username, + accountFactoryAddress: oldFactory, + privateKey: dbAccount.privateKey, + profile: dbAccount.profile, + ); + await _encPrefs.setAccount(updatedAccount); + } + return oldFactory; + } + + final allAccounts = await _encPrefs.getAllAccounts(); + final matchingAccount = allAccounts + .where((acc) => acc.address.hexEip55 == _currentAccount.hexEip55) + .firstOrNull; + + if (matchingAccount != null && + matchingAccount.accountFactoryAddress.isNotEmpty) { + return matchingAccount.accountFactoryAddress; + } + + final legacyAccount = await _encPrefs.getAccount( + _currentAccount.hexEip55, + _currentConfig.community.alias, + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2'); + if (legacyAccount != null) { + const newFactoryAddress = '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + + final updatedAccount = DBAccount( + alias: legacyAccount.alias, + address: legacyAccount.address, + name: legacyAccount.name, + username: legacyAccount.username, + accountFactoryAddress: newFactoryAddress, + privateKey: legacyAccount.privateKey, + profile: legacyAccount.profile, + ); + await _encPrefs.setAccount(updatedAccount); + + return newFactoryAddress; + } + + return _currentConfig.community.primaryAccountFactory.address; + } catch (e) { + return _currentConfig.community.primaryAccountFactory.address; + } + } + + Future resolveAccountFactoryAddress() async { + try { + if (_currentConfig == null) { + throw Exception('Current config is null'); + } + + if (_currentConfig.community.primaryAccountFactory.address.isEmpty) { + throw Exception('Primary account factory address is empty'); + } + + if (_currentAccount == null) { + throw Exception('Current account is null'); + } + + try { + final factoryAddress = + await getAccountFactoryAddressWithHiddenCommunityFallback(); + if (factoryAddress.isNotEmpty) { + return factoryAddress; + } + } catch (e) {} + + try { + final possibleFactories = [ + '', + _currentConfig.community.primaryAccountFactory.address, + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2', + '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185', + '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9', + '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD', + '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87', + '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e', + ]; + + for (final factory in possibleFactories) { + try { + final dbAccount = await _encPrefs.getAccount( + _currentAccount.hexEip55, + _currentConfig.community.alias, + factory); + if (dbAccount != null && + dbAccount.accountFactoryAddress.isNotEmpty) { + return dbAccount.accountFactoryAddress; + } + } catch (e) {} + } + } catch (e) {} + + try { + final communityMappings = { + 'bread': '0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9', + 'gratitude': '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD', + 'wallet.commonshub.brussels': + '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87', + 'wallet.sfluv.org': '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e', + }; + + final mappedFactory = communityMappings[_currentConfig.community.alias]; + if (mappedFactory != null) { + return mappedFactory; + } + } catch (e) {} + + try { + final allAccounts = await _encPrefs.getAllAccounts(); + final matchingAccounts = allAccounts + .where((acc) => acc.address.hexEip55 == _currentAccount.hexEip55) + .toList(); + + for (final account in matchingAccounts) { + if (account.accountFactoryAddress.isNotEmpty) { + return account.accountFactoryAddress; + } + } + } catch (e) {} + + try { + final primaryFactory = + _currentConfig.community.primaryAccountFactory.address; + if (primaryFactory.isNotEmpty) { + return primaryFactory; + } + } catch (e) {} + + return '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + } catch (e) { + return '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185'; + } + } + void prepareReplyTransaction(String address) { try { _addressController.text = address; From 3313ec21a71a799fcf531485cdd5b153e275f3b8 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Tue, 12 Aug 2025 15:42:44 +0530 Subject: [PATCH 21/46] Repo Update --- lib/services/config/config.dart | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/services/config/config.dart b/lib/services/config/config.dart index e5590688..93d5d77a 100644 --- a/lib/services/config/config.dart +++ b/lib/services/config/config.dart @@ -597,7 +597,13 @@ class Config { final int version; bool online; - late Web3Client ethClient; + Web3Client? _ethClient; + + Web3Client get ethClient { + _initializeServices(); + return _ethClient!; + } + late APIService ipfsService; late APIService engine; late APIService engineRPC; @@ -626,11 +632,17 @@ class Config { this.version = 0, this.online = true, }) { + // Defer initialization to avoid errors during config loading + } + + void _initializeServices() { + if (_ethClient != null) return; + final chain = chains.values.first; final rpcUrl = getRpcUrl(chain.id.toString()); final nodeUrl = getNodeUrl(chain.id.toString()); - ethClient = Web3Client(rpcUrl, Client()); + _ethClient = Web3Client(rpcUrl, Client()); ipfsService = APIService(baseURL: ipfs.url); engine = APIService(baseURL: nodeUrl); engineRPC = APIService(baseURL: rpcUrl); From d1b1f6a610c48c1b9ec7a3d705b08ffff3b6510f Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Wed, 13 Aug 2025 14:07:09 +0530 Subject: [PATCH 22/46] migration fix --- lib/services/accounts/native/android.dart | 59 ++++++----- lib/services/accounts/native/apple.dart | 119 ++++++---------------- 2 files changed, 66 insertions(+), 112 deletions(-) diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index 43ad236f..994ebd5d 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -88,6 +88,8 @@ class AndroidAccountsService extends AccountsServiceInterface { await _credentials.init(); await migrate(super.version); + + await migratePrivateKeysFromOldFormat(); } @override @@ -186,8 +188,11 @@ class AndroidAccountsService extends AccountsServiceInterface { break; } - // Create new account with factory address - final newAccount = DBAccount( + final oldAccountId = account.id; + + final oldPrivateKey = await _credentials.read(oldAccountId); + + final updatedAccount = DBAccount( alias: account.alias, address: account.address, name: account.name, @@ -197,42 +202,24 @@ class AndroidAccountsService extends AccountsServiceInterface { profile: account.profile, ); - // Delete old account and insert new one - await _accountsDB.accounts.delete( - account.address, account.alias, account.accountFactoryAddress); - await _accountsDB.accounts.insert(newAccount); - - final oldKey = getAccountID( - account.address, account.alias, account.accountFactoryAddress); - final newKey = getAccountID( - account.address, account.alias, accountFactoryAddress); + final newAccountId = updatedAccount.id; - final privateKey = await _credentials.read(oldKey); - if (privateKey != null) { - await _credentials.write(newKey, privateKey); - await _credentials.delete(oldKey); - } + await _accountsDB.accounts.update(updatedAccount); - if (account.accountFactoryAddress == - '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - try { - await _fixSafeAccount(newAccount, config); - } catch (e) { - debugPrint('Failed to fix cw-safe account during migration: $e'); - } + if (oldPrivateKey != null) { + await _credentials.write(newAccountId, oldPrivateKey); + await _credentials.delete(oldAccountId); } } }, }; - // run all migrations - for (var i = oldVersion + 1; i <= version; i++) { + for (int i = oldVersion + 1; i <= version; i++) { if (migrations.containsKey(i)) { await migrations[i]!(); } } - // after success, we can update the version await _sharedPreferences.setString(versionPrefix, version.toString()); } @@ -432,4 +419,24 @@ class AndroidAccountsService extends AccountsServiceInterface { await _accountsDB.accounts.update(account); } } + + Future migratePrivateKeysFromOldFormat() async { + final allAccounts = await _accountsDB.accounts.all(); + + for (final account in allAccounts) { + final currentPrivateKey = await _credentials.read(account.id); + if (currentPrivateKey != null) { + continue; + } + + final oldFormatKey = '${account.address.hexEip55}@${account.alias}'; + + final oldPrivateKey = await _credentials.read(oldFormatKey); + if (oldPrivateKey != null) { + await _credentials.write(account.id, oldPrivateKey); + + await _credentials.delete(oldFormatKey); + } + } + } } diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index aed6b5a7..043e7fa7 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -86,6 +86,8 @@ class AppleAccountsService extends AccountsServiceInterface { _accountsDB = appleOptions.accountsDB; await migrate(super.version); + + await migratePrivateKeysFromOldFormat(); } @override @@ -98,64 +100,6 @@ class AppleAccountsService extends AccountsServiceInterface { } final migrations = { - 1: () async { - // coming from the old version, migrate all keys and delete the old ones - // all or nothing, first write all the new ones, then delete all the old ones - final allBackups = await getAllLegacyWalletBackups(); - - for (final backup in allBackups) { - // await setAccount(backup); - final saved = await _credentials.containsKey(backup.legacyKey2); - if (saved) { - await _credentials.delete(backup.legacyKey2); - } - - await _credentials.write( - backup.legacyKey2, - backup.value, - ); - } - - // delete all old keys - for (final backup in allBackups) { - // legacy delete - final saved = await _credentials.containsKey( - backup.legacyKey, - ); - if (saved) { - await _credentials.delete(backup.legacyKey); - } - } - }, - 2: () async { - final allBackups = await getAllLegacyWalletBackups(); - - for (final backup in allBackups) { - final saved = await _credentials.containsKey(backup.key); - if (saved) { - await _credentials.delete(backup.key); - } - - await _credentials.write( - backup.key, - backup.value, - ); - } - - // delete all old keys - for (final backup in allBackups) { - // delete legacy keys - final saved = await _credentials.containsKey( - backup.legacyKey2, - ); - - if (saved) { - await _credentials.delete( - backup.legacyKey2, - ); - } - } - }, 3: () async { final allBackups = await getAllLegacyWalletBackups(); @@ -193,7 +137,6 @@ class AppleAccountsService extends AccountsServiceInterface { continue; } - // delete legacy keys final saved = await _credentials.containsKey( backup.key, ); @@ -243,7 +186,6 @@ class AppleAccountsService extends AccountsServiceInterface { // delete all old keys for (final key in toDelete) { - // delete legacy keys final saved = await _credentials.containsKey( key, ); @@ -300,8 +242,11 @@ class AppleAccountsService extends AccountsServiceInterface { break; } - // Create new account with factory address - final newAccount = DBAccount( + final oldAccountId = account.id; + + final oldPrivateKey = await _credentials.read(oldAccountId); + + final updatedAccount = DBAccount( alias: account.alias, address: account.address, name: account.name, @@ -311,42 +256,24 @@ class AppleAccountsService extends AccountsServiceInterface { profile: account.profile, ); - // Delete old account and insert new one - await _accountsDB.accounts.delete( - account.address, account.alias, account.accountFactoryAddress); - await _accountsDB.accounts.insert(newAccount); + final newAccountId = updatedAccount.id; - final oldKey = getAccountID( - account.address, account.alias, account.accountFactoryAddress); - final newKey = getAccountID( - account.address, account.alias, accountFactoryAddress); - - final privateKey = await _credentials.read(oldKey); - if (privateKey != null) { - await _credentials.write(newKey, privateKey); - await _credentials.delete(oldKey); - } + await _accountsDB.accounts.update(updatedAccount); - if (account.accountFactoryAddress == - '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - try { - await _fixSafeAccount(newAccount, config); - } catch (e) { - debugPrint('Failed to fix cw-safe account during migration: $e'); - } + if (oldPrivateKey != null) { + await _credentials.write(newAccountId, oldPrivateKey); + await _credentials.delete(oldAccountId); } } }, }; - // run all migrations - for (var i = oldVersion + 1; i <= version; i++) { + for (int i = oldVersion + 1; i <= version; i++) { if (migrations.containsKey(i)) { await migrations[i]!(); } } - // after success, we can update the version await _credentials.write(versionPrefix, version.toString()); } @@ -496,4 +423,24 @@ class AppleAccountsService extends AccountsServiceInterface { return backups; } + + Future migratePrivateKeysFromOldFormat() async { + final allAccounts = await _accountsDB.accounts.all(); + + for (final account in allAccounts) { + final currentPrivateKey = await _credentials.read(account.id); + if (currentPrivateKey != null) { + continue; + } + + final oldFormatKey = '${account.address.hexEip55}@${account.alias}'; + + final oldPrivateKey = await _credentials.read(oldFormatKey); + if (oldPrivateKey != null) { + await _credentials.write(account.id, oldPrivateKey); + + await _credentials.delete(oldFormatKey); + } + } + } } From 080ba73b7de41f97826cb2366031afd68d815890 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 14 Aug 2025 11:44:42 +0530 Subject: [PATCH 23/46] Json update --- assets/config/v5/communities.json | 4239 ++++++++++++------------ assets/config/v5/communities.test.json | 4239 ++++++++++++------------ 2 files changed, 4358 insertions(+), 4120 deletions(-) diff --git a/assets/config/v5/communities.json b/assets/config/v5/communities.json index 8580520d..053f16fb 100644 --- a/assets/config/v5/communities.json +++ b/assets/config/v5/communities.json @@ -1,2119 +1,2238 @@ [ { - "community": { - "name": "Citizen Wallet (CTZN)", - "description": "The token powering the Citizen Wallet economy.", - "url": "https://citizenwallet.xyz", - "alias": "ctzn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "theme": { - "primary": "#9563D3" - }, - "profile": { - "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", - "chain_id": 137 - }, - "primary_token": { - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { - "standard": "erc20", - "name": "Citizen Wallet", - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "symbol": "CTZN", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://citizenwallet.xyz/pay-with-ctzn", - "launch_mode": "browser" - }, - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://my.citizenwallet.xyz/onramp", - "action": "topup", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/ctzn", - "version": 5 + "community": { + "name": "Citizen Wallet (CTZN)", + "description": "The token powering the Citizen Wallet economy.", + "url": "https://citizenwallet.xyz", + "alias": "ctzn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "theme": { + "primary": "#9563D3" + }, + "profile": { + "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", + "chain_id": 137 + }, + "primary_token": { + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 + } + }, + "tokens": { + "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { + "standard": "erc20", + "name": "Citizen Wallet", + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "symbol": "CTZN", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://citizenwallet.xyz/pay-with-ctzn", + "launch_mode": "browser" + }, + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://my.citizenwallet.xyz/onramp", + "action": "topup", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/ctzn", + "version": 5 }, { - "community": { - "name": "Brussels Pay", - "description": "A community for the city of Brussels", - "url": "https://pay.brussels", - "alias": "wallet.pay.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "custom_domain": "wallet.pay.brussels", - "hidden": false, - "theme": { - "primary": "#4a90e2" - }, - "profile": { - "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", - "chain_id": 100 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "pay.brussels", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "EURb", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { - "chain_id": 100, - "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", - "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", - "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_type": "cw" - }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "cards": { - "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { - "chain_id": 100, - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "type": "classic" - }, - "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 100, - "instance_id": "brussels-pay", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.pay.brussels", - "ws_url": "wss://engine.pay.brussels" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "url": "https://checkout.pay.brussels/topup", - "action": "topup", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", - "version": 5 + "community": { + "name": "Brussels Pay", + "description": "A community for the city of Brussels", + "url": "https://pay.brussels", + "alias": "wallet.pay.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "custom_domain": "wallet.pay.brussels", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", + "chain_id": 100 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "pay.brussels", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "EURb", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { + "chain_id": 100, + "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", + "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", + "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_type": "cw" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 100, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + }, + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "brussels-pay", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.pay.brussels", + "ws_url": "wss://engine.pay.brussels" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "url": "https://checkout.pay.brussels/topup", + "action": "topup", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", + "version": 5 }, { - "community": { - "name": "Monerium EURe on Gnosis", - "description": "A community for EURe on Gnosis", - "url": "https://monerium.com/", - "alias": "eure.gnosis", - "logo": "https://eure.gnosis.citizenwallet.xyz/wallet-config/_images/eure.svg", - "custom_domain": "eure.gnosis.citizenwallet.xyz", - "hidden": false, - "theme": { - "primary": "#4a90e2" - }, - "profile": { - "address": "0x2e297B9ef4df73c8da5070E91EF0570FA312A698", - "chain_id": 100 - }, - "primary_token": { - "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430": { - "standard": "erc20", - "name": "EURe [Gnosis]", - "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", - "symbol": "EURe", - "decimals": 18, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xeBDd6ee8DB7055f62D14A5eAAB7c18ae36Cd2216", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "cards": { - "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 100, - "instance_id": "cw-discord-1", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/eure.gnosis", - "version": 5 + "community": { + "name": "Monerium EURe on Gnosis", + "description": "A community for EURe on Gnosis", + "url": "https://monerium.com/", + "alias": "eure.gnosis", + "logo": "https://eure.gnosis.citizenwallet.xyz/wallet-config/_images/eure.svg", + "custom_domain": "eure.gnosis.citizenwallet.xyz", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x2e297B9ef4df73c8da5070E91EF0570FA312A698", + "chain_id": 100 + }, + "primary_token": { + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430": { + "standard": "erc20", + "name": "EURe [Gnosis]", + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "symbol": "EURe", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xeBDd6ee8DB7055f62D14A5eAAB7c18ae36Cd2216", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "cards": { + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "cw-discord-1", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.gnosis", + "version": 5 }, { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token of gratitude.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gratitude", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "theme": { - "primary": "#4EC19D" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/gratitude", - "version": 5 + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token of gratitude.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gratitude", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "theme": { + "primary": "#4EC19D" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/gratitude", + "version": 5 }, { - "community": { - "name": "SFLUV Community", - "description": "A community currency for the city of San Francisco.", - "url": "https://sfluv.org", - "alias": "wallet.sfluv.org", - "custom_domain": "wallet.sfluv.org", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "theme": { - "primary": "#eb6c6c" - }, - "profile": { - "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "chain_id": 137 - }, - "primary_token": { - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { - "standard": "erc20", - "name": "SFLUV V1.1", - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "symbol": "SFLUV", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { - "chain_id": 137, - "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", - "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", - "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x5097dAD831FE21EF12dA31bf5d07A2e8ef6f5f1e", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "url": "https://app.sfluv.org", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.sfluv.org", - "version": 5 + "community": { + "name": "SFLUV Community", + "description": "A community currency for the city of San Francisco.", + "url": "https://sfluv.org", + "alias": "wallet.sfluv.org", + "custom_domain": "wallet.sfluv.org", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "theme": { + "primary": "#eb6c6c" + }, + "profile": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 137 + }, + "primary_token": { + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 + } + }, + "tokens": { + "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { + "standard": "erc20", + "name": "SFLUV V1.1", + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "symbol": "SFLUV", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x5097dAD831FE21EF12dA31bf5d07A2e8ef6f5f1e", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "url": "https://app.sfluv.org", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.sfluv.org", + "version": 5 }, { - "community": { - "name": "Txirrin", - "description": "A community for Txirrin", - "url": "https://citizenwallet.xyz/txirrin", - "alias": "txirrin", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", - "hidden": false, - "theme": { - "primary": "#FB7502" - }, - "profile": { - "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", - "chain_id": 100 - }, - "primary_token": { - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { - "standard": "erc20", - "name": "Txirrin", - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "symbol": "TXI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/txirrin", - "version": 5 + "community": { + "name": "Txirrin", + "description": "A community for Txirrin", + "url": "https://citizenwallet.xyz/txirrin", + "alias": "txirrin", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", + "hidden": false, + "theme": { + "primary": "#FB7502" + }, + "profile": { + "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", + "chain_id": 100 + }, + "primary_token": { + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { + "standard": "erc20", + "name": "Txirrin", + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "symbol": "TXI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/txirrin", + "version": 5 }, { - "community": { - "name": "Bolivia Pay", - "description": "A community for Ethereum Bolivia.", - "url": "https://www.ethereumbolivia.org", - "alias": "boliviapay", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", - "theme": { - "primary": "#009393" - }, - "profile": { - "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", - "chain_id": 137 - }, - "primary_token": { - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { - "standard": "erc20", - "name": "(PoS) Tether USD", - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "symbol": "USDT", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/boliviapay", - "version": 5 + "community": { + "name": "Bolivia Pay", + "description": "A community for Ethereum Bolivia.", + "url": "https://www.ethereumbolivia.org", + "alias": "boliviapay", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", + "theme": { + "primary": "#009393" + }, + "profile": { + "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", + "chain_id": 137 + }, + "primary_token": { + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 + } + }, + "tokens": { + "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "standard": "erc20", + "name": "(PoS) Tether USD", + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "symbol": "USDT", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/boliviapay", + "version": 5 }, { - "community": { - "name": "Breadchain Community Token", - "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", - "url": "https://breadchain.xyz/", - "alias": "bread", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "profile": { - "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", - "chain_id": 100 - }, - "primary_token": { - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { - "standard": "erc20", - "name": "Breadchain Community Token", - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "symbol": "BREAD", - "decimals": 18, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { - "chain_id": 100, - "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", - "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_type": "cw" - }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://marketplace.citizenwallet.xyz/bread", - "launch_mode": "webview", - "signature": true - }, - { - "name": "Breadcon 2025 Faucet", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://faucet.citizenwallet.xyz/breadcon2025", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/bread", - "version": 5 + "community": { + "name": "Breadchain Community Token", + "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", + "url": "https://breadchain.xyz/", + "alias": "bread", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "profile": { + "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", + "chain_id": 100 + }, + "primary_token": { + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { + "standard": "erc20", + "name": "Breadchain Community Token", + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "symbol": "BREAD", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { + "chain_id": 100, + "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", + "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_type": "cw" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://marketplace.citizenwallet.xyz/bread", + "launch_mode": "webview", + "signature": true + }, + { + "name": "Breadcon 2025 Faucet", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://faucet.citizenwallet.xyz/breadcon2025", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/bread", + "version": 5 }, { - "community": { - "name": "Commons Hub Brussels", - "description": "Community Token for the Commons Hub Brussels community", - "url": "https://commonshub.brussels", - "alias": "wallet.commonshub.brussels", - "custom_domain": "wallet.commonshub.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", - "theme": { - "primary": "#ff4c02" - }, - "profile": { - "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { - "standard": "erc20", - "name": "Commons Hub Token", - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "symbol": "CHT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { - "chain_id": 42220, - "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", - "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4860C0f127500F0cbF4a5Bd797cBb5aA50Eb0FbA", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "cards": { - "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { - "chain_id": 42220, - "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", - "type": "classic" - } - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.commonshub.brussels", - "version": 5 + "community": { + "name": "Commons Hub Brussels", + "description": "Community Token for the Commons Hub Brussels community", + "url": "https://commonshub.brussels", + "alias": "wallet.commonshub.brussels", + "custom_domain": "wallet.commonshub.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", + "theme": { + "primary": "#ff4c02" + }, + "profile": { + "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { + "standard": "erc20", + "name": "Commons Hub Token", + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "symbol": "CHT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4860C0f127500F0cbF4a5Bd797cBb5aA50Eb0FbA", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "cards": { + "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { + "chain_id": 42220, + "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", + "type": "classic" + } + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.commonshub.brussels", + "version": 5 }, { - "community": { - "name": "Sel de Salm", - "description": "La communauté de Sel de Salm", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "alias": "seldesalm", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "theme": { - "primary": "#6B5CA4" - }, - "profile": { - "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { - "standard": "erc20", - "name": "Myrtille", - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "symbol": "MYRT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "cards": { - "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 42220, - "instance_id": "cw-seldesalm", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Informations Générales", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "launch_mode": "webview" - }, - { - "name": "Échanges", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://marketplace.citizenwallet.xyz/seldesalm", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/seldesalm", - "version": 5 + "community": { + "name": "Sel de Salm", + "description": "La communauté de Sel de Salm", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "alias": "seldesalm", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "theme": { + "primary": "#6B5CA4" + }, + "profile": { + "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { + "standard": "erc20", + "name": "Myrtille", + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "symbol": "MYRT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "cards": { + "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 42220, + "instance_id": "cw-seldesalm", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Informations Générales", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "launch_mode": "webview" + }, + { + "name": "Échanges", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://marketplace.citizenwallet.xyz/seldesalm", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/seldesalm", + "version": 5 }, { - "community": { - "name": "TECHI", - "description": "A community for TECHI users", - "url": "https://my.techi.be", - "alias": "my.techi.be", - "logo": "https://my.techi.be/assets/token.svg", - "hidden": false, - "theme": { - "primary": "#617FF8" - }, - "profile": { - "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", - "chain_id": 100 - }, - "primary_token": { - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { - "standard": "erc20", - "name": "TECHI", - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "symbol": "TECHI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.my.techi.be", - "ws_url": "wss://engine.my.techi.be" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/my.techi.be", - "version": 5 + "community": { + "name": "TECHI", + "description": "A community for TECHI users", + "url": "https://my.techi.be", + "alias": "my.techi.be", + "logo": "https://my.techi.be/assets/token.svg", + "hidden": false, + "theme": { + "primary": "#617FF8" + }, + "profile": { + "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", + "chain_id": 100 + }, + "primary_token": { + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { + "standard": "erc20", + "name": "TECHI", + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "symbol": "TECHI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.my.techi.be", + "ws_url": "wss://engine.my.techi.be" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/my.techi.be", + "version": 5 }, { - "community": { - "name": "Regens Unite", - "description": "A community currency for the Regens Unite community.", - "url": "https://www.regensunite.earth/", - "alias": "wallet.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "custom_domain": "wallet.regensunite.earth", - "hidden": true, - "profile": { - "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "Regens Unite Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "RGN", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 137, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.regensunite.earth", - "version": 5 + "community": { + "name": "Regens Unite", + "description": "A community currency for the Regens Unite community.", + "url": "https://www.regensunite.earth/", + "alias": "wallet.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "custom_domain": "wallet.regensunite.earth", + "hidden": true, + "profile": { + "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "Regens Unite Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "RGN", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 137, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.regensunite.earth", + "version": 5 }, { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gt.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "custom_domain": null, - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/gt.celo", - "version": 5 + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gt.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "custom_domain": null, + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/gt.celo", + "version": 5 }, { - "community": { - "name": "Celo Euro", - "description": "Celo Euro is a stablecoin for the Celo Community.", - "url": "https://celo.org/", - "alias": "ceur.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { - "standard": "erc20", - "name": "Celo Euro", - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "symbol": "cEUR", - "decimals": 18, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { - "chain_id": 42220, - "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", - "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/ceur.celo", - "version": 5 + "community": { + "name": "Celo Euro", + "description": "Celo Euro is a stablecoin for the Celo Community.", + "url": "https://celo.org/", + "alias": "ceur.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { + "standard": "erc20", + "name": "Celo Euro", + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "symbol": "cEUR", + "decimals": 18, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/ceur.celo", + "version": 5 }, { - "community": { - "name": "EUR e-money", - "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", - "url": "https://monerium.com/tokens/", - "alias": "eure.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", - "hidden": true, - "profile": { - "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { - "standard": "erc20", - "name": "EUR emoney", - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "symbol": "EURe", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { - "chain_id": 137, - "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", - "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", - "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/eure.polygon", - "version": 5 + "community": { + "name": "EUR e-money", + "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", + "url": "https://monerium.com/tokens/", + "alias": "eure.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", + "hidden": true, + "profile": { + "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { + "standard": "erc20", + "name": "EUR emoney", + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "symbol": "EURe", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { + "chain_id": 137, + "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.polygon", + "version": 5 }, { - "community": { - "name": "USDC on Polygon", - "description": "The community of people using USDC on Polygon.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "app", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "chain_id": 137 - }, - "primary_token": { - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "symbol": "USDC", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { - "chain_id": 137, - "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", - "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", - "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/app", - "version": 5 + "community": { + "name": "USDC on Polygon", + "description": "The community of people using USDC on Polygon.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "app", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "chain_id": 137 + }, + "primary_token": { + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "symbol": "USDC", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { + "chain_id": 137, + "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/app", + "version": 5 }, { - "community": { - "name": "USDC on Base", - "description": "The community of people using USDC on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "usdc.base", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "symbol": "USDC", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { - "chain_id": 8453, - "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/usdc.base", - "version": 5 + "community": { + "name": "USDC on Base", + "description": "The community of people using USDC on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "usdc.base", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "symbol": "USDC", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { + "chain_id": 8453, + "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/usdc.base", + "version": 5 }, { - "community": { - "name": "OAK Community", - "description": "A community currency for the city of Oakland.", - "url": "https://www.oak.community/", - "alias": "wallet.oak.community", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", - "custom_domain": "wallet.oak.community", - "hidden": true, - "profile": { - "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { - "standard": "erc20", - "name": "OAK Community Currency", - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "symbol": "OAK", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 8453, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x123", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg" - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.oak.community", - "version": 5 + "community": { + "name": "OAK Community", + "description": "A community currency for the city of Oakland.", + "url": "https://www.oak.community/", + "alias": "wallet.oak.community", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", + "custom_domain": "wallet.oak.community", + "hidden": true, + "profile": { + "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { + "standard": "erc20", + "name": "OAK Community Currency", + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "symbol": "OAK", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 8453, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x123", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg" + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.oak.community", + "version": 5 }, { - "community": { - "name": "Stable Coin", - "description": "SBC is a digital dollar stablecoin issued by Brale", - "url": "https://brale.xyz/", - "alias": "sbc.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", - "hidden": true, - "profile": { - "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "chain_id": 137 - }, - "primary_token": { - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { - "standard": "erc20", - "name": "Stable Coin", - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "symbol": "SBC", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { - "chain_id": 137, - "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", - "paymaster_address": "0x123", - "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", - "paymaster_type": "cw" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/sbc.polygon", - "version": 5 + "community": { + "name": "Stable Coin", + "description": "SBC is a digital dollar stablecoin issued by Brale", + "url": "https://brale.xyz/", + "alias": "sbc.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", + "hidden": true, + "profile": { + "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "chain_id": 137 + }, + "primary_token": { + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { + "standard": "erc20", + "name": "Stable Coin", + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "symbol": "SBC", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { + "chain_id": 137, + "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", + "paymaster_address": "0x123", + "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/sbc.polygon", + "version": 5 }, { - "community": { - "name": "Zinne.brussels", - "description": "A community currency for the city of Brussels", - "url": "https://zinne.brussels", - "alias": "zinne", - "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", - "hidden": true, - "profile": { - "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", - "chain_id": 137 - }, - "primary_token": { - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { - "standard": "erc20", - "name": "Zinne.brussels Token", - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "symbol": "ZINNE", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { - "chain_id": 137, - "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", - "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", - "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", - "paymaster_type": "cw" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/zinne", - "version": 5 + "community": { + "name": "Zinne.brussels", + "description": "A community currency for the city of Brussels", + "url": "https://zinne.brussels", + "alias": "zinne", + "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", + "hidden": true, + "profile": { + "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", + "chain_id": 137 + }, + "primary_token": { + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { + "standard": "erc20", + "name": "Zinne.brussels Token", + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "symbol": "ZINNE", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { + "chain_id": 137, + "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/zinne", + "version": 5 }, { - "community": { - "name": "Regens Unite Time Bank", - "description": "Make time to regen", - "url": "https://regensunite.earth", - "alias": "timebank.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "hidden": true, - "profile": { - "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x186DaBD027e228C988777907465807FDab270894", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x186DaBD027e228C988777907465807FDab270894": { - "standard": "erc20", - "name": "Regen Hour", - "address": "0x186DaBD027e228C988777907465807FDab270894", - "symbol": "rHour", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x39b77d77f7677997871b304094a05295eb71e240": { - "chain_id": 42220, - "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", - "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", - "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/timebank.regensunite.earth", - "version": 5 + "community": { + "name": "Regens Unite Time Bank", + "description": "Make time to regen", + "url": "https://regensunite.earth", + "alias": "timebank.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "hidden": true, + "profile": { + "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x186DaBD027e228C988777907465807FDab270894", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x186DaBD027e228C988777907465807FDab270894": { + "standard": "erc20", + "name": "Regen Hour", + "address": "0x186DaBD027e228C988777907465807FDab270894", + "symbol": "rHour", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x39b77d77f7677997871b304094a05295eb71e240": { + "chain_id": 42220, + "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/timebank.regensunite.earth", + "version": 5 }, { - "community": { - "name": "MOOS Token", - "description": "A community currency for MOOS.", - "url": "https://www.moos.garden/", - "alias": "moos", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", - "hidden": true, - "profile": { - "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { - "standard": "erc20", - "name": "MOOS Token", - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "symbol": "MOOS", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { - "chain_id": 42220, - "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", - "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", - "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", - "url": "https://marketplace.citizenwallet.xyz/moos", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/moos", - "version": 5 + "community": { + "name": "MOOS Token", + "description": "A community currency for MOOS.", + "url": "https://www.moos.garden/", + "alias": "moos", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", + "hidden": true, + "profile": { + "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { + "standard": "erc20", + "name": "MOOS Token", + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "symbol": "MOOS", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { + "chain_id": 42220, + "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", + "url": "https://marketplace.citizenwallet.xyz/moos", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/moos", + "version": 5 }, { - "community": { - "name": "Bonne Heure", - "description": "Système d'Échange Local de Villers-la-Ville", - "url": "https://selcoupdepouce.be", - "alias": "selcoupdepouce", - "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", - "hidden": true, - "profile": { - "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { - "standard": "erc20", - "name": "Bonne Heure", - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "symbol": "BHR", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { - "chain_id": 42220, - "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", - "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", - "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", - "launch_mode": "browser", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/selcoupdepouce", - "version": 5 + "community": { + "name": "Bonne Heure", + "description": "Système d'Échange Local de Villers-la-Ville", + "url": "https://selcoupdepouce.be", + "alias": "selcoupdepouce", + "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", + "hidden": true, + "profile": { + "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { + "standard": "erc20", + "name": "Bonne Heure", + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "symbol": "BHR", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { + "chain_id": 42220, + "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", + "launch_mode": "browser", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/selcoupdepouce", + "version": 5 }, { - "community": { - "name": "CI token", - "description": "Monnaie locale du Cercle Informatique de l’ULB", - "url": "https://citizenwallet.xyz/cit", - "alias": "cit.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", - "hidden": true, - "profile": { - "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { - "standard": "erc20", - "name": "CI token", - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "symbol": "CIT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { - "chain_id": 42220, - "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", - "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", - "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/cit.celo", - "version": 5 + "community": { + "name": "CI token", + "description": "Monnaie locale du Cercle Informatique de l’ULB", + "url": "https://citizenwallet.xyz/cit", + "alias": "cit.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", + "hidden": true, + "profile": { + "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { + "standard": "erc20", + "name": "CI token", + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "symbol": "CIT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { + "chain_id": 42220, + "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/cit.celo", + "version": 5 }, { - "community": { - "name": "Wolugo", - "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", - "url": "https://wolugo.be", - "alias": "wallet.wolugo.be", - "custom_domain": "wallet.wolugo.be", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", - "theme": { - "primary": "#81e2c1" - }, - "hidden": true, - "profile": { - "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - }, - "card_factory": { - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { - "standard": "erc20", - "name": "Wolu", - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "symbol": "WOLU", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { - "chain_id": 42220, - "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", - "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", - "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", - "paymaster_type": "cw" - } - }, - "cards": { - "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { - "chain_id": 42220, - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "type": "classic" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.wolugo.be", - "version": 5 + "community": { + "name": "Wolugo", + "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", + "url": "https://wolugo.be", + "alias": "wallet.wolugo.be", + "custom_domain": "wallet.wolugo.be", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", + "theme": { + "primary": "#81e2c1" + }, + "hidden": true, + "profile": { + "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "card_factory": { + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { + "standard": "erc20", + "name": "Wolu", + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "symbol": "WOLU", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { + "chain_id": 42220, + "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { + "chain_id": 42220, + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.wolugo.be", + "version": 5 }, { - "community": { - "name": "Woluwe Test", - "description": "Local currency for the Woluwe Test community.", - "url": "https://wollet-v2.citizenwallet.net/token", - "alias": "wtc.celo", - "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", - "hidden": true, - "profile": { - "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { - "standard": "erc20", - "name": "Woluwe Test Coin", - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "symbol": "WTC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xE79E19594A749330036280c685E2719d58d99052": { - "chain_id": 42220, - "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", - "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wtc.celo", - "version": 5 + "community": { + "name": "Woluwe Test", + "description": "Local currency for the Woluwe Test community.", + "url": "https://wollet-v2.citizenwallet.net/token", + "alias": "wtc.celo", + "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", + "hidden": true, + "profile": { + "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { + "standard": "erc20", + "name": "Woluwe Test Coin", + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "symbol": "WTC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xE79E19594A749330036280c685E2719d58d99052": { + "chain_id": 42220, + "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wtc.celo", + "version": 5 }, { - "community": { - "name": "ETHGlobal London Token", - "description": "The community of people using ETHLDN on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "testnet-ethldn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", - "hidden": true, - "profile": { - "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", - "chain_id": 84532 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 84532 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 84532 - } - }, - "tokens": { - "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "ETHGlobal London Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "ETHLDN", - "decimals": 6, - "chain_id": 84532 - } - }, - "scan": { - "url": "https://sepolia.basescan.org", - "name": "Base Sepolia Explorer" - }, - "accounts": { - "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { - "chain_id": 84532, - "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", - "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", - "paymaster_type": "cw" - } - }, - "chains": { - "84532": { - "id": 84532, - "node": { - "url": "https://84532.engine.citizenwallet.xyz", - "ws_url": "wss://84532.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/testnet-ethldn", - "version": 5 + "community": { + "name": "ETHGlobal London Token", + "description": "The community of people using ETHLDN on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "testnet-ethldn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", + "hidden": true, + "profile": { + "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", + "chain_id": 84532 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 84532 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 84532 + } + }, + "tokens": { + "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "ETHGlobal London Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "ETHLDN", + "decimals": 6, + "chain_id": 84532 + } + }, + "scan": { + "url": "https://sepolia.basescan.org", + "name": "Base Sepolia Explorer" + }, + "accounts": { + "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { + "chain_id": 84532, + "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "paymaster_type": "cw" + }, + "84532:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 84532, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "84532": { + "id": 84532, + "node": { + "url": "https://84532.engine.citizenwallet.xyz", + "ws_url": "wss://84532.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/testnet-ethldn", + "version": 5 }, { - "community": { - "name": "Celo Community Point", - "description": "This is a community for the Celo Point", - "url": "https://citizenwallet.xyz", - "alias": "celo-c.citizenwallet.xyz", - "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", - "hidden": true, - "profile": { - "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { - "standard": "erc20", - "name": "Celo Community Point", - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "symbol": "CeloC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { - "chain_id": 42220, - "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", - "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", - "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/celo-c.citizenwallet.xyz", - "version": 5 + "community": { + "name": "Celo Community Point", + "description": "This is a community for the Celo Point", + "url": "https://citizenwallet.xyz", + "alias": "celo-c.citizenwallet.xyz", + "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", + "hidden": true, + "profile": { + "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { + "standard": "erc20", + "name": "Celo Community Point", + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "symbol": "CeloC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { + "chain_id": 42220, + "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/celo-c.citizenwallet.xyz", + "version": 5 }, { - "community": { - "name": "KFMEDIA℠", - "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", - "url": "https://kingfishersmedia.io", - "alias": "wallet.kingfishersmedia.io", - "custom_domain": "wallet.kingfishersmedia.io", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", - "theme": { - "primary": "#88292c" - }, - "profile": { - "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { - "standard": "erc1155", - "name": "KFMEDIA℠ Pathways for LATAM™", - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "symbol": "KFMPFL", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", - "version": 5 + "community": { + "name": "KFMEDIA℠", + "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", + "url": "https://kingfishersmedia.io", + "alias": "wallet.kingfishersmedia.io", + "custom_domain": "wallet.kingfishersmedia.io", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", + "theme": { + "primary": "#88292c" + }, + "profile": { + "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { + "standard": "erc1155", + "name": "KFMEDIA℠ Pathways for LATAM™", + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "symbol": "KFMPFL", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", + "version": 5 } -] +] \ No newline at end of file diff --git a/assets/config/v5/communities.test.json b/assets/config/v5/communities.test.json index 8580520d..053f16fb 100644 --- a/assets/config/v5/communities.test.json +++ b/assets/config/v5/communities.test.json @@ -1,2119 +1,2238 @@ [ { - "community": { - "name": "Citizen Wallet (CTZN)", - "description": "The token powering the Citizen Wallet economy.", - "url": "https://citizenwallet.xyz", - "alias": "ctzn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "theme": { - "primary": "#9563D3" - }, - "profile": { - "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", - "chain_id": 137 - }, - "primary_token": { - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { - "standard": "erc20", - "name": "Citizen Wallet", - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "symbol": "CTZN", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://citizenwallet.xyz/pay-with-ctzn", - "launch_mode": "browser" - }, - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://my.citizenwallet.xyz/onramp", - "action": "topup", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/ctzn", - "version": 5 + "community": { + "name": "Citizen Wallet (CTZN)", + "description": "The token powering the Citizen Wallet economy.", + "url": "https://citizenwallet.xyz", + "alias": "ctzn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "theme": { + "primary": "#9563D3" + }, + "profile": { + "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", + "chain_id": 137 + }, + "primary_token": { + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 + } + }, + "tokens": { + "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { + "standard": "erc20", + "name": "Citizen Wallet", + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "symbol": "CTZN", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://citizenwallet.xyz/pay-with-ctzn", + "launch_mode": "browser" + }, + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://my.citizenwallet.xyz/onramp", + "action": "topup", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/ctzn", + "version": 5 }, { - "community": { - "name": "Brussels Pay", - "description": "A community for the city of Brussels", - "url": "https://pay.brussels", - "alias": "wallet.pay.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "custom_domain": "wallet.pay.brussels", - "hidden": false, - "theme": { - "primary": "#4a90e2" - }, - "profile": { - "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", - "chain_id": 100 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "pay.brussels", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "EURb", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { - "chain_id": 100, - "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", - "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", - "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_type": "cw" - }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "cards": { - "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { - "chain_id": 100, - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "type": "classic" - }, - "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 100, - "instance_id": "brussels-pay", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.pay.brussels", - "ws_url": "wss://engine.pay.brussels" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "url": "https://checkout.pay.brussels/topup", - "action": "topup", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", - "version": 5 + "community": { + "name": "Brussels Pay", + "description": "A community for the city of Brussels", + "url": "https://pay.brussels", + "alias": "wallet.pay.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "custom_domain": "wallet.pay.brussels", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", + "chain_id": 100 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "pay.brussels", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "EURb", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { + "chain_id": 100, + "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", + "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", + "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_type": "cw" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 100, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + }, + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "brussels-pay", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.pay.brussels", + "ws_url": "wss://engine.pay.brussels" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "url": "https://checkout.pay.brussels/topup", + "action": "topup", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", + "version": 5 }, { - "community": { - "name": "Monerium EURe on Gnosis", - "description": "A community for EURe on Gnosis", - "url": "https://monerium.com/", - "alias": "eure.gnosis", - "logo": "https://eure.gnosis.citizenwallet.xyz/wallet-config/_images/eure.svg", - "custom_domain": "eure.gnosis.citizenwallet.xyz", - "hidden": false, - "theme": { - "primary": "#4a90e2" - }, - "profile": { - "address": "0x2e297B9ef4df73c8da5070E91EF0570FA312A698", - "chain_id": 100 - }, - "primary_token": { - "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430": { - "standard": "erc20", - "name": "EURe [Gnosis]", - "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", - "symbol": "EURe", - "decimals": 18, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xeBDd6ee8DB7055f62D14A5eAAB7c18ae36Cd2216", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "cards": { - "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 100, - "instance_id": "cw-discord-1", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/eure.gnosis", - "version": 5 + "community": { + "name": "Monerium EURe on Gnosis", + "description": "A community for EURe on Gnosis", + "url": "https://monerium.com/", + "alias": "eure.gnosis", + "logo": "https://eure.gnosis.citizenwallet.xyz/wallet-config/_images/eure.svg", + "custom_domain": "eure.gnosis.citizenwallet.xyz", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x2e297B9ef4df73c8da5070E91EF0570FA312A698", + "chain_id": 100 + }, + "primary_token": { + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430": { + "standard": "erc20", + "name": "EURe [Gnosis]", + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "symbol": "EURe", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xeBDd6ee8DB7055f62D14A5eAAB7c18ae36Cd2216", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "cards": { + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "cw-discord-1", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.gnosis", + "version": 5 }, { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token of gratitude.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gratitude", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "theme": { - "primary": "#4EC19D" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/gratitude", - "version": 5 + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token of gratitude.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gratitude", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "theme": { + "primary": "#4EC19D" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/gratitude", + "version": 5 }, { - "community": { - "name": "SFLUV Community", - "description": "A community currency for the city of San Francisco.", - "url": "https://sfluv.org", - "alias": "wallet.sfluv.org", - "custom_domain": "wallet.sfluv.org", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "theme": { - "primary": "#eb6c6c" - }, - "profile": { - "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "chain_id": 137 - }, - "primary_token": { - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { - "standard": "erc20", - "name": "SFLUV V1.1", - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "symbol": "SFLUV", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { - "chain_id": 137, - "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", - "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", - "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x5097dAD831FE21EF12dA31bf5d07A2e8ef6f5f1e", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "url": "https://app.sfluv.org", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.sfluv.org", - "version": 5 + "community": { + "name": "SFLUV Community", + "description": "A community currency for the city of San Francisco.", + "url": "https://sfluv.org", + "alias": "wallet.sfluv.org", + "custom_domain": "wallet.sfluv.org", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "theme": { + "primary": "#eb6c6c" + }, + "profile": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 137 + }, + "primary_token": { + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 + } + }, + "tokens": { + "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { + "standard": "erc20", + "name": "SFLUV V1.1", + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "symbol": "SFLUV", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x5097dAD831FE21EF12dA31bf5d07A2e8ef6f5f1e", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "url": "https://app.sfluv.org", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.sfluv.org", + "version": 5 }, { - "community": { - "name": "Txirrin", - "description": "A community for Txirrin", - "url": "https://citizenwallet.xyz/txirrin", - "alias": "txirrin", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", - "hidden": false, - "theme": { - "primary": "#FB7502" - }, - "profile": { - "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", - "chain_id": 100 - }, - "primary_token": { - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { - "standard": "erc20", - "name": "Txirrin", - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "symbol": "TXI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/txirrin", - "version": 5 + "community": { + "name": "Txirrin", + "description": "A community for Txirrin", + "url": "https://citizenwallet.xyz/txirrin", + "alias": "txirrin", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", + "hidden": false, + "theme": { + "primary": "#FB7502" + }, + "profile": { + "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", + "chain_id": 100 + }, + "primary_token": { + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { + "standard": "erc20", + "name": "Txirrin", + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "symbol": "TXI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/txirrin", + "version": 5 }, { - "community": { - "name": "Bolivia Pay", - "description": "A community for Ethereum Bolivia.", - "url": "https://www.ethereumbolivia.org", - "alias": "boliviapay", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", - "theme": { - "primary": "#009393" - }, - "profile": { - "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", - "chain_id": 137 - }, - "primary_token": { - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { - "standard": "erc20", - "name": "(PoS) Tether USD", - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "symbol": "USDT", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/boliviapay", - "version": 5 + "community": { + "name": "Bolivia Pay", + "description": "A community for Ethereum Bolivia.", + "url": "https://www.ethereumbolivia.org", + "alias": "boliviapay", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", + "theme": { + "primary": "#009393" + }, + "profile": { + "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", + "chain_id": 137 + }, + "primary_token": { + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 + } + }, + "tokens": { + "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "standard": "erc20", + "name": "(PoS) Tether USD", + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "symbol": "USDT", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/boliviapay", + "version": 5 }, { - "community": { - "name": "Breadchain Community Token", - "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", - "url": "https://breadchain.xyz/", - "alias": "bread", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "profile": { - "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", - "chain_id": 100 - }, - "primary_token": { - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { - "standard": "erc20", - "name": "Breadchain Community Token", - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "symbol": "BREAD", - "decimals": 18, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { - "chain_id": 100, - "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", - "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_type": "cw" - }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://marketplace.citizenwallet.xyz/bread", - "launch_mode": "webview", - "signature": true - }, - { - "name": "Breadcon 2025 Faucet", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://faucet.citizenwallet.xyz/breadcon2025", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/bread", - "version": 5 + "community": { + "name": "Breadchain Community Token", + "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", + "url": "https://breadchain.xyz/", + "alias": "bread", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "profile": { + "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", + "chain_id": 100 + }, + "primary_token": { + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { + "standard": "erc20", + "name": "Breadchain Community Token", + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "symbol": "BREAD", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { + "chain_id": 100, + "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", + "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_type": "cw" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://marketplace.citizenwallet.xyz/bread", + "launch_mode": "webview", + "signature": true + }, + { + "name": "Breadcon 2025 Faucet", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://faucet.citizenwallet.xyz/breadcon2025", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/bread", + "version": 5 }, { - "community": { - "name": "Commons Hub Brussels", - "description": "Community Token for the Commons Hub Brussels community", - "url": "https://commonshub.brussels", - "alias": "wallet.commonshub.brussels", - "custom_domain": "wallet.commonshub.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", - "theme": { - "primary": "#ff4c02" - }, - "profile": { - "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { - "standard": "erc20", - "name": "Commons Hub Token", - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "symbol": "CHT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { - "chain_id": 42220, - "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", - "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4860C0f127500F0cbF4a5Bd797cBb5aA50Eb0FbA", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "cards": { - "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { - "chain_id": 42220, - "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", - "type": "classic" - } - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.commonshub.brussels", - "version": 5 + "community": { + "name": "Commons Hub Brussels", + "description": "Community Token for the Commons Hub Brussels community", + "url": "https://commonshub.brussels", + "alias": "wallet.commonshub.brussels", + "custom_domain": "wallet.commonshub.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", + "theme": { + "primary": "#ff4c02" + }, + "profile": { + "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { + "standard": "erc20", + "name": "Commons Hub Token", + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "symbol": "CHT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4860C0f127500F0cbF4a5Bd797cBb5aA50Eb0FbA", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "cards": { + "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { + "chain_id": 42220, + "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", + "type": "classic" + } + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.commonshub.brussels", + "version": 5 }, { - "community": { - "name": "Sel de Salm", - "description": "La communauté de Sel de Salm", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "alias": "seldesalm", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "theme": { - "primary": "#6B5CA4" - }, - "profile": { - "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { - "standard": "erc20", - "name": "Myrtille", - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "symbol": "MYRT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "cards": { - "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 42220, - "instance_id": "cw-seldesalm", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Informations Générales", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "launch_mode": "webview" - }, - { - "name": "Échanges", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://marketplace.citizenwallet.xyz/seldesalm", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/seldesalm", - "version": 5 + "community": { + "name": "Sel de Salm", + "description": "La communauté de Sel de Salm", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "alias": "seldesalm", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "theme": { + "primary": "#6B5CA4" + }, + "profile": { + "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { + "standard": "erc20", + "name": "Myrtille", + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "symbol": "MYRT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "cards": { + "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 42220, + "instance_id": "cw-seldesalm", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Informations Générales", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "launch_mode": "webview" + }, + { + "name": "Échanges", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://marketplace.citizenwallet.xyz/seldesalm", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/seldesalm", + "version": 5 }, { - "community": { - "name": "TECHI", - "description": "A community for TECHI users", - "url": "https://my.techi.be", - "alias": "my.techi.be", - "logo": "https://my.techi.be/assets/token.svg", - "hidden": false, - "theme": { - "primary": "#617FF8" - }, - "profile": { - "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", - "chain_id": 100 - }, - "primary_token": { - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { - "standard": "erc20", - "name": "TECHI", - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "symbol": "TECHI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.my.techi.be", - "ws_url": "wss://engine.my.techi.be" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/my.techi.be", - "version": 5 + "community": { + "name": "TECHI", + "description": "A community for TECHI users", + "url": "https://my.techi.be", + "alias": "my.techi.be", + "logo": "https://my.techi.be/assets/token.svg", + "hidden": false, + "theme": { + "primary": "#617FF8" + }, + "profile": { + "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", + "chain_id": 100 + }, + "primary_token": { + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { + "standard": "erc20", + "name": "TECHI", + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "symbol": "TECHI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.my.techi.be", + "ws_url": "wss://engine.my.techi.be" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/my.techi.be", + "version": 5 }, { - "community": { - "name": "Regens Unite", - "description": "A community currency for the Regens Unite community.", - "url": "https://www.regensunite.earth/", - "alias": "wallet.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "custom_domain": "wallet.regensunite.earth", - "hidden": true, - "profile": { - "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "Regens Unite Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "RGN", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 137, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.regensunite.earth", - "version": 5 + "community": { + "name": "Regens Unite", + "description": "A community currency for the Regens Unite community.", + "url": "https://www.regensunite.earth/", + "alias": "wallet.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "custom_domain": "wallet.regensunite.earth", + "hidden": true, + "profile": { + "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "Regens Unite Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "RGN", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 137, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.regensunite.earth", + "version": 5 }, { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gt.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "custom_domain": null, - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/gt.celo", - "version": 5 + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gt.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "custom_domain": null, + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/gt.celo", + "version": 5 }, { - "community": { - "name": "Celo Euro", - "description": "Celo Euro is a stablecoin for the Celo Community.", - "url": "https://celo.org/", - "alias": "ceur.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { - "standard": "erc20", - "name": "Celo Euro", - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "symbol": "cEUR", - "decimals": 18, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { - "chain_id": 42220, - "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", - "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/ceur.celo", - "version": 5 + "community": { + "name": "Celo Euro", + "description": "Celo Euro is a stablecoin for the Celo Community.", + "url": "https://celo.org/", + "alias": "ceur.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { + "standard": "erc20", + "name": "Celo Euro", + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "symbol": "cEUR", + "decimals": 18, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/ceur.celo", + "version": 5 }, { - "community": { - "name": "EUR e-money", - "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", - "url": "https://monerium.com/tokens/", - "alias": "eure.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", - "hidden": true, - "profile": { - "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { - "standard": "erc20", - "name": "EUR emoney", - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "symbol": "EURe", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { - "chain_id": 137, - "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", - "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", - "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/eure.polygon", - "version": 5 + "community": { + "name": "EUR e-money", + "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", + "url": "https://monerium.com/tokens/", + "alias": "eure.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", + "hidden": true, + "profile": { + "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { + "standard": "erc20", + "name": "EUR emoney", + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "symbol": "EURe", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { + "chain_id": 137, + "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.polygon", + "version": 5 }, { - "community": { - "name": "USDC on Polygon", - "description": "The community of people using USDC on Polygon.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "app", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "chain_id": 137 - }, - "primary_token": { - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "symbol": "USDC", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { - "chain_id": 137, - "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", - "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", - "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/app", - "version": 5 + "community": { + "name": "USDC on Polygon", + "description": "The community of people using USDC on Polygon.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "app", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "chain_id": 137 + }, + "primary_token": { + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "symbol": "USDC", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { + "chain_id": 137, + "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/app", + "version": 5 }, { - "community": { - "name": "USDC on Base", - "description": "The community of people using USDC on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "usdc.base", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "symbol": "USDC", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { - "chain_id": 8453, - "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/usdc.base", - "version": 5 + "community": { + "name": "USDC on Base", + "description": "The community of people using USDC on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "usdc.base", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "symbol": "USDC", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { + "chain_id": 8453, + "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/usdc.base", + "version": 5 }, { - "community": { - "name": "OAK Community", - "description": "A community currency for the city of Oakland.", - "url": "https://www.oak.community/", - "alias": "wallet.oak.community", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", - "custom_domain": "wallet.oak.community", - "hidden": true, - "profile": { - "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { - "standard": "erc20", - "name": "OAK Community Currency", - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "symbol": "OAK", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 8453, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x123", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg" - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.oak.community", - "version": 5 + "community": { + "name": "OAK Community", + "description": "A community currency for the city of Oakland.", + "url": "https://www.oak.community/", + "alias": "wallet.oak.community", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", + "custom_domain": "wallet.oak.community", + "hidden": true, + "profile": { + "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { + "standard": "erc20", + "name": "OAK Community Currency", + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "symbol": "OAK", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 8453, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x123", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg" + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.oak.community", + "version": 5 }, { - "community": { - "name": "Stable Coin", - "description": "SBC is a digital dollar stablecoin issued by Brale", - "url": "https://brale.xyz/", - "alias": "sbc.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", - "hidden": true, - "profile": { - "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "chain_id": 137 - }, - "primary_token": { - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { - "standard": "erc20", - "name": "Stable Coin", - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "symbol": "SBC", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { - "chain_id": 137, - "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", - "paymaster_address": "0x123", - "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", - "paymaster_type": "cw" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/sbc.polygon", - "version": 5 + "community": { + "name": "Stable Coin", + "description": "SBC is a digital dollar stablecoin issued by Brale", + "url": "https://brale.xyz/", + "alias": "sbc.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", + "hidden": true, + "profile": { + "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "chain_id": 137 + }, + "primary_token": { + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { + "standard": "erc20", + "name": "Stable Coin", + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "symbol": "SBC", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { + "chain_id": 137, + "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", + "paymaster_address": "0x123", + "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/sbc.polygon", + "version": 5 }, { - "community": { - "name": "Zinne.brussels", - "description": "A community currency for the city of Brussels", - "url": "https://zinne.brussels", - "alias": "zinne", - "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", - "hidden": true, - "profile": { - "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", - "chain_id": 137 - }, - "primary_token": { - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { - "standard": "erc20", - "name": "Zinne.brussels Token", - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "symbol": "ZINNE", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { - "chain_id": 137, - "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", - "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", - "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", - "paymaster_type": "cw" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/zinne", - "version": 5 + "community": { + "name": "Zinne.brussels", + "description": "A community currency for the city of Brussels", + "url": "https://zinne.brussels", + "alias": "zinne", + "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", + "hidden": true, + "profile": { + "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", + "chain_id": 137 + }, + "primary_token": { + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { + "standard": "erc20", + "name": "Zinne.brussels Token", + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "symbol": "ZINNE", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { + "chain_id": 137, + "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/zinne", + "version": 5 }, { - "community": { - "name": "Regens Unite Time Bank", - "description": "Make time to regen", - "url": "https://regensunite.earth", - "alias": "timebank.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "hidden": true, - "profile": { - "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x186DaBD027e228C988777907465807FDab270894", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x186DaBD027e228C988777907465807FDab270894": { - "standard": "erc20", - "name": "Regen Hour", - "address": "0x186DaBD027e228C988777907465807FDab270894", - "symbol": "rHour", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x39b77d77f7677997871b304094a05295eb71e240": { - "chain_id": 42220, - "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", - "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", - "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/timebank.regensunite.earth", - "version": 5 + "community": { + "name": "Regens Unite Time Bank", + "description": "Make time to regen", + "url": "https://regensunite.earth", + "alias": "timebank.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "hidden": true, + "profile": { + "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x186DaBD027e228C988777907465807FDab270894", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x186DaBD027e228C988777907465807FDab270894": { + "standard": "erc20", + "name": "Regen Hour", + "address": "0x186DaBD027e228C988777907465807FDab270894", + "symbol": "rHour", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x39b77d77f7677997871b304094a05295eb71e240": { + "chain_id": 42220, + "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/timebank.regensunite.earth", + "version": 5 }, { - "community": { - "name": "MOOS Token", - "description": "A community currency for MOOS.", - "url": "https://www.moos.garden/", - "alias": "moos", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", - "hidden": true, - "profile": { - "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { - "standard": "erc20", - "name": "MOOS Token", - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "symbol": "MOOS", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { - "chain_id": 42220, - "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", - "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", - "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", - "url": "https://marketplace.citizenwallet.xyz/moos", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/moos", - "version": 5 + "community": { + "name": "MOOS Token", + "description": "A community currency for MOOS.", + "url": "https://www.moos.garden/", + "alias": "moos", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", + "hidden": true, + "profile": { + "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { + "standard": "erc20", + "name": "MOOS Token", + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "symbol": "MOOS", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { + "chain_id": 42220, + "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", + "url": "https://marketplace.citizenwallet.xyz/moos", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/moos", + "version": 5 }, { - "community": { - "name": "Bonne Heure", - "description": "Système d'Échange Local de Villers-la-Ville", - "url": "https://selcoupdepouce.be", - "alias": "selcoupdepouce", - "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", - "hidden": true, - "profile": { - "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { - "standard": "erc20", - "name": "Bonne Heure", - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "symbol": "BHR", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { - "chain_id": 42220, - "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", - "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", - "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", - "launch_mode": "browser", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/selcoupdepouce", - "version": 5 + "community": { + "name": "Bonne Heure", + "description": "Système d'Échange Local de Villers-la-Ville", + "url": "https://selcoupdepouce.be", + "alias": "selcoupdepouce", + "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", + "hidden": true, + "profile": { + "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { + "standard": "erc20", + "name": "Bonne Heure", + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "symbol": "BHR", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { + "chain_id": 42220, + "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", + "launch_mode": "browser", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/selcoupdepouce", + "version": 5 }, { - "community": { - "name": "CI token", - "description": "Monnaie locale du Cercle Informatique de l’ULB", - "url": "https://citizenwallet.xyz/cit", - "alias": "cit.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", - "hidden": true, - "profile": { - "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { - "standard": "erc20", - "name": "CI token", - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "symbol": "CIT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { - "chain_id": 42220, - "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", - "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", - "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/cit.celo", - "version": 5 + "community": { + "name": "CI token", + "description": "Monnaie locale du Cercle Informatique de l’ULB", + "url": "https://citizenwallet.xyz/cit", + "alias": "cit.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", + "hidden": true, + "profile": { + "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { + "standard": "erc20", + "name": "CI token", + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "symbol": "CIT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { + "chain_id": 42220, + "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/cit.celo", + "version": 5 }, { - "community": { - "name": "Wolugo", - "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", - "url": "https://wolugo.be", - "alias": "wallet.wolugo.be", - "custom_domain": "wallet.wolugo.be", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", - "theme": { - "primary": "#81e2c1" - }, - "hidden": true, - "profile": { - "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - }, - "card_factory": { - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { - "standard": "erc20", - "name": "Wolu", - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "symbol": "WOLU", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { - "chain_id": 42220, - "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", - "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", - "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", - "paymaster_type": "cw" - } - }, - "cards": { - "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { - "chain_id": 42220, - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "type": "classic" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.wolugo.be", - "version": 5 + "community": { + "name": "Wolugo", + "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", + "url": "https://wolugo.be", + "alias": "wallet.wolugo.be", + "custom_domain": "wallet.wolugo.be", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", + "theme": { + "primary": "#81e2c1" + }, + "hidden": true, + "profile": { + "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "card_factory": { + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { + "standard": "erc20", + "name": "Wolu", + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "symbol": "WOLU", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { + "chain_id": 42220, + "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { + "chain_id": 42220, + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.wolugo.be", + "version": 5 }, { - "community": { - "name": "Woluwe Test", - "description": "Local currency for the Woluwe Test community.", - "url": "https://wollet-v2.citizenwallet.net/token", - "alias": "wtc.celo", - "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", - "hidden": true, - "profile": { - "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { - "standard": "erc20", - "name": "Woluwe Test Coin", - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "symbol": "WTC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xE79E19594A749330036280c685E2719d58d99052": { - "chain_id": 42220, - "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", - "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wtc.celo", - "version": 5 + "community": { + "name": "Woluwe Test", + "description": "Local currency for the Woluwe Test community.", + "url": "https://wollet-v2.citizenwallet.net/token", + "alias": "wtc.celo", + "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", + "hidden": true, + "profile": { + "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { + "standard": "erc20", + "name": "Woluwe Test Coin", + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "symbol": "WTC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xE79E19594A749330036280c685E2719d58d99052": { + "chain_id": 42220, + "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wtc.celo", + "version": 5 }, { - "community": { - "name": "ETHGlobal London Token", - "description": "The community of people using ETHLDN on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "testnet-ethldn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", - "hidden": true, - "profile": { - "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", - "chain_id": 84532 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 84532 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 84532 - } - }, - "tokens": { - "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "ETHGlobal London Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "ETHLDN", - "decimals": 6, - "chain_id": 84532 - } - }, - "scan": { - "url": "https://sepolia.basescan.org", - "name": "Base Sepolia Explorer" - }, - "accounts": { - "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { - "chain_id": 84532, - "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", - "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", - "paymaster_type": "cw" - } - }, - "chains": { - "84532": { - "id": 84532, - "node": { - "url": "https://84532.engine.citizenwallet.xyz", - "ws_url": "wss://84532.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/testnet-ethldn", - "version": 5 + "community": { + "name": "ETHGlobal London Token", + "description": "The community of people using ETHLDN on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "testnet-ethldn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", + "hidden": true, + "profile": { + "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", + "chain_id": 84532 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 84532 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 84532 + } + }, + "tokens": { + "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "ETHGlobal London Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "ETHLDN", + "decimals": 6, + "chain_id": 84532 + } + }, + "scan": { + "url": "https://sepolia.basescan.org", + "name": "Base Sepolia Explorer" + }, + "accounts": { + "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { + "chain_id": 84532, + "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "paymaster_type": "cw" + }, + "84532:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 84532, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "84532": { + "id": 84532, + "node": { + "url": "https://84532.engine.citizenwallet.xyz", + "ws_url": "wss://84532.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/testnet-ethldn", + "version": 5 }, { - "community": { - "name": "Celo Community Point", - "description": "This is a community for the Celo Point", - "url": "https://citizenwallet.xyz", - "alias": "celo-c.citizenwallet.xyz", - "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", - "hidden": true, - "profile": { - "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { - "standard": "erc20", - "name": "Celo Community Point", - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "symbol": "CeloC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { - "chain_id": 42220, - "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", - "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", - "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/celo-c.citizenwallet.xyz", - "version": 5 + "community": { + "name": "Celo Community Point", + "description": "This is a community for the Celo Point", + "url": "https://citizenwallet.xyz", + "alias": "celo-c.citizenwallet.xyz", + "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", + "hidden": true, + "profile": { + "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { + "standard": "erc20", + "name": "Celo Community Point", + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "symbol": "CeloC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { + "chain_id": 42220, + "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/celo-c.citizenwallet.xyz", + "version": 5 }, { - "community": { - "name": "KFMEDIA℠", - "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", - "url": "https://kingfishersmedia.io", - "alias": "wallet.kingfishersmedia.io", - "custom_domain": "wallet.kingfishersmedia.io", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", - "theme": { - "primary": "#88292c" - }, - "profile": { - "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { - "standard": "erc1155", - "name": "KFMEDIA℠ Pathways for LATAM™", - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "symbol": "KFMPFL", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", - "version": 5 + "community": { + "name": "KFMEDIA℠", + "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", + "url": "https://kingfishersmedia.io", + "alias": "wallet.kingfishersmedia.io", + "custom_domain": "wallet.kingfishersmedia.io", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", + "theme": { + "primary": "#88292c" + }, + "profile": { + "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { + "standard": "erc1155", + "name": "KFMEDIA℠ Pathways for LATAM™", + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "symbol": "KFMPFL", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", + "version": 5 } -] +] \ No newline at end of file From 6861afde46ed5c070d51bad493fdb2577222940f Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 14 Aug 2025 13:26:26 +0530 Subject: [PATCH 24/46] added removed migration --- lib/services/accounts/native/apple.dart | 58 +++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index 043e7fa7..16f6dcbd 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -100,6 +100,64 @@ class AppleAccountsService extends AccountsServiceInterface { } final migrations = { + 1: () async { + // coming from the old version, migrate all keys and delete the old ones + // all or nothing, first write all the new ones, then delete all the old ones + final allBackups = await getAllLegacyWalletBackups(); + + for (final backup in allBackups) { + // await setAccount(backup); + final saved = await _credentials.containsKey(backup.legacyKey2); + if (saved) { + await _credentials.delete(backup.legacyKey2); + } + + await _credentials.write( + backup.legacyKey2, + backup.value, + ); + } + + // delete all old keys + for (final backup in allBackups) { + // legacy delete + final saved = await _credentials.containsKey( + backup.legacyKey, + ); + if (saved) { + await _credentials.delete(backup.legacyKey); + } + } + }, + 2: () async { + final allBackups = await getAllLegacyWalletBackups(); + + for (final backup in allBackups) { + final saved = await _credentials.containsKey(backup.key); + if (saved) { + await _credentials.delete(backup.key); + } + + await _credentials.write( + backup.key, + backup.value, + ); + } + + // delete all old keys + for (final backup in allBackups) { + // delete legacy keys + final saved = await _credentials.containsKey( + backup.legacyKey2, + ); + + if (saved) { + await _credentials.delete( + backup.legacyKey2, + ); + } + } + }, 3: () async { final allBackups = await getAllLegacyWalletBackups(); From a56b49bf7339139d6dc0fff0e4cdb5023c8381b6 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Fri, 15 Aug 2025 09:25:33 +0530 Subject: [PATCH 25/46] pubspec update --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 47df4926..d412b8bb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: citizenwallet -version: 2.0.18+261 +version: 2.0.19+262 publish_to: none description: A mobile wallet for your community. environment: From 544adc5ac6aa37034c9e184c57b20cbd6fbbf84b Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Mon, 18 Aug 2025 18:51:14 +0530 Subject: [PATCH 26/46] cursorrules --- .cursorrules | 277 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 .cursorrules diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 00000000..ae0d10c1 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,277 @@ +# Citizen Wallet Flutter Project - Coding Patterns & Conventions + +## Project Overview + +This is a Flutter-based mobile wallet application for community tokens, built with a focus on blockchain integration, state management, and cross-platform compatibility. + +## Architecture Patterns + +### 1. State Management + +- **Provider Pattern**: Uses `provider` package for state management +- **State/Logic Separation**: Each feature has separate `state.dart` and `logic.dart` files +- **ChangeNotifier**: All state classes extend `ChangeNotifier` for reactive updates +- **MultiProvider**: Centralized state provisioning in `lib/state/state.dart` + +### 2. Directory Structure + +``` +lib/ +├── models/ # Data models and DTOs +├── screens/ # UI screens organized by feature +├── widgets/ # Reusable UI components +├── services/ # Business logic and external integrations +├── state/ # State management (state + logic files) +├── router/ # Navigation and routing +├── theme/ # UI theming and styling +├── utils/ # Utility functions and helpers +├── modals/ # Modal dialogs and sheets +└── l10n/ # Localization files +``` + +### 3. File Naming Conventions + +- **snake_case**: All file names use snake_case +- **Feature-based**: Files organized by feature/domain +- **Platform suffixes**: `.android.dart`, `.apple.dart`, `.web.dart` for platform-specific code +- **State files**: `state.dart` for state classes, `logic.dart` for business logic + +## Code Style & Patterns + +### 1. Dart/Flutter Conventions + +- **Null Safety**: Full null safety implementation +- **Async/Await**: Prefer async/await over Future.then() +- **Const Constructors**: Use const constructors where possible +- **Final Variables**: Use final for immutable variables +- **Type Annotations**: Explicit type annotations for clarity + +### 2. State Management Patterns + +```dart +// State class pattern +class WalletState with ChangeNotifier { + bool loading = false; + String? error; + + void setLoading(bool value) { + loading = value; + notifyListeners(); + } +} + +// Logic class pattern +class WalletLogic { + final WalletState _state; + + Future loadWallet() async { + _state.setLoading(true); + try { + // business logic + } catch (e) { + _state.setError(e.toString()); + } finally { + _state.setLoading(false); + } + } +} +``` + +### 3. Service Layer Patterns + +- **Singleton Services**: Services like `ConfigService`, `AccountDBService` +- **Interface-based**: Use interfaces for service contracts +- **Error Handling**: Comprehensive try-catch blocks with proper error propagation +- **Async Operations**: All external operations are async + +### 4. UI Patterns + +- **Cupertino Design**: Uses Cupertino widgets for iOS-style design +- **Responsive Design**: Platform-aware UI components +- **Modal Sheets**: Heavy use of modal bottom sheets for user interactions +- **Loading States**: Consistent loading indicators and skeleton screens +- **Error Handling**: Toast notifications and error banners + +### 5. Navigation Patterns + +- **GoRouter**: Uses go_router for navigation +- **Deep Linking**: Comprehensive deep link support +- **Route Guards**: Conditional navigation based on app state +- **Platform-specific**: Different navigation patterns for web/mobile + +## Blockchain Integration + +### 1. Web3 Integration + +- **web3dart**: Primary Web3 library +- **Smart Contracts**: Custom contract interactions +- **Account Abstraction**: ERC-4337 account abstraction support +- **Gas Management**: Custom gas estimation and management + +### 2. Wallet Patterns + +- **Multi-wallet Support**: Multiple wallet accounts per user +- **Secure Storage**: Encrypted key storage +- **Transaction Management**: Queue-based transaction handling +- **Event Listening**: Real-time blockchain event monitoring + +## Database & Storage + +### 1. Local Storage + +- **SQLite**: Primary local database (sqflite) +- **Shared Preferences**: Simple key-value storage +- **Secure Storage**: Encrypted sensitive data storage +- **File System**: Asset and backup file management + +### 2. Data Models + +- **JSON Serialization**: All models support JSON serialization +- **Copy Methods**: Immutable data with copyWith methods +- **Validation**: Input validation and sanitization + +## Error Handling + +### 1. Exception Patterns + +- **Custom Exceptions**: Domain-specific exception classes +- **Graceful Degradation**: Fallback mechanisms for failures +- **User Feedback**: Clear error messages to users +- **Logging**: Comprehensive error logging and monitoring + +### 2. Error Recovery + +- **Retry Logic**: Exponential backoff for network operations +- **Offline Support**: Offline-first architecture +- **State Recovery**: Automatic state recovery mechanisms + +## Testing Patterns + +### 1. Test Organization + +- **Unit Tests**: Service and utility function tests +- **Widget Tests**: UI component testing +- **Integration Tests**: End-to-end workflow testing +- **Mock Services**: Comprehensive mocking for external dependencies + +### 2. Test Utilities + +- **Mock HTTP**: Network request mocking +- **Test Helpers**: Reusable test utilities +- **Test Data**: Consistent test data fixtures + +## Security Patterns + +### 1. Cryptography + +- **Encryption**: AES encryption for sensitive data +- **Key Management**: Secure key generation and storage +- **Digital Signatures**: Transaction signing and verification +- **Secure Communication**: HTTPS and secure WebSocket connections + +### 2. Authentication + +- **Biometric Auth**: Touch ID/Face ID integration +- **OAuth**: Google Sign-In integration +- **Session Management**: Secure session handling + +## Performance Patterns + +### 1. Optimization + +- **Lazy Loading**: On-demand resource loading +- **Caching**: Multi-level caching strategies +- **Image Optimization**: Efficient image handling and caching +- **Memory Management**: Proper disposal of resources + +### 2. Background Processing + +- **Event Listeners**: Efficient event handling +- **Background Tasks**: Non-blocking background operations +- **State Synchronization**: Efficient state updates + +## Internationalization + +### 1. Localization + +- **ARB Files**: Flutter's localization format +- **Multi-language**: English, French, Dutch support +- **RTL Support**: Right-to-left language support +- **Currency Formatting**: Localized currency display + +## Platform-Specific Code + +### 1. Platform Detection + +- **kIsWeb**: Web platform detection +- **Platform-specific Files**: Separate implementations for different platforms +- **Conditional Compilation**: Platform-specific code blocks + +### 2. Native Integrations + +- **iOS**: Apple-specific features (Face ID, iCloud) +- **Android**: Android-specific features (Google Sign-In) +- **Web**: Web-specific optimizations and features + +## Dependencies & Packages + +### 1. Core Dependencies + +- **Flutter**: Latest stable version +- **Provider**: State management +- **GoRouter**: Navigation +- **web3dart**: Blockchain integration +- **sqflite**: Local database + +### 2. UI Dependencies + +- **flutter_svg**: SVG support +- **lottie**: Animation support +- **cached_network_image**: Image caching +- **modal_bottom_sheet**: Modal dialogs + +### 3. Blockchain Dependencies + +- **smartcontracts**: Custom smart contract library +- **contractforge**: Contract interaction utilities +- **reown_walletkit**: Wallet functionality + +## Development Workflow + +### 1. Code Organization + +- **Feature-based**: Organize code by business features +- **Separation of Concerns**: Clear separation between UI, business logic, and data +- **Dependency Injection**: Service locator pattern for dependencies + +### 2. Code Quality + +- **Linting**: Flutter lints for code quality +- **Analysis**: Static analysis with custom rules +- **Documentation**: Comprehensive code documentation +- **Type Safety**: Strong typing throughout the codebase + +## Best Practices + +### 1. General + +- **Immutability**: Prefer immutable data structures +- **Composition**: Use composition over inheritance +- **Single Responsibility**: Each class has a single responsibility +- **Dependency Inversion**: Depend on abstractions, not concretions + +### 2. Flutter-specific + +- **Stateless Widgets**: Prefer stateless widgets when possible +- **Const Constructors**: Use const constructors for performance +- **Keys**: Use keys for widget identification +- **Dispose**: Properly dispose of controllers and listeners + +### 3. State Management + +- **Minimal State**: Keep state as minimal as possible +- **Predictable Updates**: State updates should be predictable +- **Performance**: Avoid unnecessary rebuilds +- **Testing**: Make state easily testable + +This project follows a well-structured, maintainable architecture with clear separation of concerns, comprehensive error handling, and strong typing throughout the codebase. From f594aec94f40d070d6be4fc7f96a2e925038f098 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Tue, 19 Aug 2025 10:32:55 +0530 Subject: [PATCH 27/46] fixed duplicate issue --- lib/state/wallet/logic.dart | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index 72ce1b1c..5e6e61cd 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -2233,20 +2233,28 @@ class WalletLogic extends WidgetsBindingObserver { final wallets = await _encPrefs.getAllAccounts(); final List cwwallets = await compute((ws) { - return ws.where((w) => w.privateKey != null).map((w) { + final Map uniqueWallets = {}; + + for (final w in ws.where((w) => w.privateKey != null)) { final creds = w.privateKey!; - return CWWallet( - '0.0', - name: w.name, - address: creds.address.hexEip55, - alias: w.alias, - account: w.address.hexEip55, - currencyName: '', - symbol: '', - currencyLogo: '', - locked: false, - ); - }).toList(); + final walletKey = '${w.address.hexEip55}_${w.alias}'; + + if (!uniqueWallets.containsKey(walletKey)) { + uniqueWallets[walletKey] = CWWallet( + '0.0', + name: w.name, + address: creds.address.hexEip55, + alias: w.alias, + account: w.address.hexEip55, + currencyName: '', + symbol: '', + currencyLogo: '', + locked: false, + ); + } + } + + return uniqueWallets.values.toList(); }, wallets); _state.loadWalletsSuccess(cwwallets); From 42bd4e3bd01907588576d5c678a91711e5c4fc4b Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Fri, 22 Aug 2025 01:14:03 +0530 Subject: [PATCH 28/46] Repo Update --- lib/services/accounts/accounts.dart | 4 +- lib/services/accounts/native/android.dart | 84 +++++++++++++++++++++- lib/services/accounts/native/apple.dart | 85 ++++++++++++++++++++++- lib/services/preferences/preferences.dart | 7 ++ lib/state/app/logic.dart | 10 ++- lib/state/backup/logic.dart | 4 ++ lib/state/wallet/logic.dart | 37 +++++----- 7 files changed, 199 insertions(+), 32 deletions(-) diff --git a/lib/services/accounts/accounts.dart b/lib/services/accounts/accounts.dart index 09b5280f..4576c184 100644 --- a/lib/services/accounts/accounts.dart +++ b/lib/services/accounts/accounts.dart @@ -14,7 +14,7 @@ abstract class AccountsOptionsInterface {} /// /// This is used to store wallet backups and the implementation is platform specific. abstract class AccountsServiceInterface { - final int _version = 5; + final int _version = 6; int get version => _version; @@ -37,7 +37,7 @@ abstract class AccountsServiceInterface { Future setAccount(DBAccount account); // get account - Future getAccount(String address, String alias, [String accountFactoryAddress]); + Future getAccount(String address, String alias, String accountFactoryAddress); // get accounts for alias Future> getAccountsForAlias(String alias); diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index 994ebd5d..04a58cde 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -189,7 +189,6 @@ class AndroidAccountsService extends AccountsServiceInterface { } final oldAccountId = account.id; - final oldPrivateKey = await _credentials.read(oldAccountId); final updatedAccount = DBAccount( @@ -198,20 +197,99 @@ class AndroidAccountsService extends AccountsServiceInterface { name: account.name, username: account.username, accountFactoryAddress: accountFactoryAddress, - privateKey: account.privateKey, profile: account.profile, ); final newAccountId = updatedAccount.id; - await _accountsDB.accounts.update(updatedAccount); + // Check if the account actually exists in the database with the expected ID + final existingAccount = await _accountsDB.accounts.db.query( + 't_accounts', + where: 'id = ?', + whereArgs: [oldAccountId], + ); + + if (existingAccount.isNotEmpty) { + // Delete using the expected ID + await _accountsDB.accounts.delete(account.address, account.alias, account.accountFactoryAddress); + } else { + // Try to find by address and alias with empty accountFactoryAddress + final foundByAddress = await _accountsDB.accounts.db.query( + 't_accounts', + where: 'address = ? AND alias = ? AND accountFactoryAddress = ""', + whereArgs: [account.address.hexEip55, account.alias], + ); + + if (foundByAddress.isNotEmpty) { + final actualId = foundByAddress.first['id'] as String; + + // Delete using the actual ID + await _accountsDB.accounts.db.delete( + 't_accounts', + where: 'id = ?', + whereArgs: [actualId], + ); + } + } + // Insert the new record + await _accountsDB.accounts.insert(updatedAccount); + if (oldPrivateKey != null) { await _credentials.write(newAccountId, oldPrivateKey); await _credentials.delete(oldAccountId); } } }, + 6: () async { + final allAccounts = await _accountsDB.accounts.all(); + final toDelete = []; + + for (final account in allAccounts) { + if (account.accountFactoryAddress.isEmpty) { + toDelete.add(account); + } + } + + for (final account in toDelete) { + // Check if the account actually exists in the database + final existingAccount = await _accountsDB.accounts.db.query( + 't_accounts', + where: 'id = ?', + whereArgs: [account.id], + ); + + if (existingAccount.isNotEmpty) { + // Delete the account from database using the actual ID + await _accountsDB.accounts.db.delete( + 't_accounts', + where: 'id = ?', + whereArgs: [account.id], + ); + } else { + // Try to find by address and alias instead + final foundByAddress = await _accountsDB.accounts.db.query( + 't_accounts', + where: 'address = ? AND alias = ? AND accountFactoryAddress = ""', + whereArgs: [account.address.hexEip55, account.alias], + ); + + if (foundByAddress.isNotEmpty) { + final actualId = foundByAddress.first['id'] as String; + + // Delete using the actual ID + await _accountsDB.accounts.db.delete( + 't_accounts', + where: 'id = ?', + whereArgs: [actualId], + ); + } + } + + // Delete the private key from credentials + await _credentials.delete(account.id); + } + }, }; for (int i = oldVersion + 1; i <= version; i++) { diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index 16f6dcbd..fb5f1a70 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -301,7 +301,6 @@ class AppleAccountsService extends AccountsServiceInterface { } final oldAccountId = account.id; - final oldPrivateKey = await _credentials.read(oldAccountId); final updatedAccount = DBAccount( @@ -310,20 +309,100 @@ class AppleAccountsService extends AccountsServiceInterface { name: account.name, username: account.username, accountFactoryAddress: accountFactoryAddress, - privateKey: account.privateKey, profile: account.profile, ); final newAccountId = updatedAccount.id; - await _accountsDB.accounts.update(updatedAccount); + // Check if the account actually exists in the database with the expected ID + final existingAccount = await _accountsDB.accounts.db.query( + 't_accounts', + where: 'id = ?', + whereArgs: [oldAccountId], + ); + + if (existingAccount.isNotEmpty) { + // Delete using the expected ID + await _accountsDB.accounts.delete( + account.address, account.alias, account.accountFactoryAddress); + } else { + // Try to find by address and alias with empty accountFactoryAddress + final foundByAddress = await _accountsDB.accounts.db.query( + 't_accounts', + where: 'address = ? AND alias = ? AND accountFactoryAddress = ""', + whereArgs: [account.address.hexEip55, account.alias], + ); + + if (foundByAddress.isNotEmpty) { + final actualId = foundByAddress.first['id'] as String; + + // Delete using the actual ID + await _accountsDB.accounts.db.delete( + 't_accounts', + where: 'id = ?', + whereArgs: [actualId], + ); + } + } + + // Insert the new record + await _accountsDB.accounts.insert(updatedAccount); + // Write credentials into Keychain Services if (oldPrivateKey != null) { await _credentials.write(newAccountId, oldPrivateKey); await _credentials.delete(oldAccountId); } } }, + 6: () async { + final allAccounts = await _accountsDB.accounts.all(); + final toDelete = []; + + for (final account in allAccounts) { + if (account.accountFactoryAddress.isEmpty) { + toDelete.add(account); + } + } + + for (final account in toDelete) { + final existingAccount = await _accountsDB.accounts.db.query( + 't_accounts', + where: 'id = ?', + whereArgs: [account.id], + ); + + if (existingAccount.isNotEmpty) { + // Delete the account from database using the actual ID + await _accountsDB.accounts.db.delete( + 't_accounts', + where: 'id = ?', + whereArgs: [account.id], + ); + } else { + // Try to find by address and alias instead + final foundByAddress = await _accountsDB.accounts.db.query( + 't_accounts', + where: 'address = ? AND alias = ? AND accountFactoryAddress = ""', + whereArgs: [account.address.hexEip55, account.alias], + ); + + if (foundByAddress.isNotEmpty) { + final actualId = foundByAddress.first['id'] as String; + + // Delete using the actual ID + await _accountsDB.accounts.db.delete( + 't_accounts', + where: 'id = ?', + whereArgs: [actualId], + ); + } + } + + // Delete the private key from credentials + await _credentials.delete(account.id); + } + }, }; for (int i = oldVersion + 1; i <= version; i++) { diff --git a/lib/services/preferences/preferences.dart b/lib/services/preferences/preferences.dart index 4539535b..5173ffb7 100644 --- a/lib/services/preferences/preferences.dart +++ b/lib/services/preferences/preferences.dart @@ -79,6 +79,13 @@ class PreferencesService { String? get lastAlias => _preferences.getString('lastAlias'); + // save the last account factory address that was opened + Future setLastAccountFactoryAddress(String accountFactoryAddress) async { + await _preferences.setString('lastAccountFactoryAddress', accountFactoryAddress); + } + + String? get lastAccountFactoryAddress => _preferences.getString('lastAccountFactoryAddress'); + // save the last link that was opened on web Future setLastWalletLink(String link) async { await _preferences.setString('lastWalletLink', link); diff --git a/lib/state/app/logic.dart b/lib/state/app/logic.dart index 2610a294..ead20a5c 100644 --- a/lib/state/app/logic.dart +++ b/lib/state/app/logic.dart @@ -68,10 +68,11 @@ class AppLogic { _appState.importLoadingReq(); final String? lastWallet = _preferences.lastWallet; final String? lastAlias = _preferences.lastAlias; + final String? lastAccountFactoryAddress = _preferences.lastAccountFactoryAddress; DBAccount? dbWallet; - if (lastWallet != null && lastAlias != null) { - dbWallet = await _accounts.getAccount(lastWallet, lastAlias); + if (lastWallet != null && lastAlias != null && lastAccountFactoryAddress != null) { + dbWallet = await _accounts.getAccount(lastWallet, lastAlias, lastAccountFactoryAddress); } if (dbWallet == null) { @@ -97,6 +98,7 @@ class AppLogic { await _preferences.setLastWallet(address); await _preferences.setLastAlias(dbWallet.alias); + await _preferences.setLastAccountFactoryAddress(dbWallet.accountFactoryAddress); _appState.importLoadingSuccess(); @@ -201,6 +203,7 @@ class AppLogic { await _preferences.setLastWallet(address.hexEip55); await _preferences.setLastAlias(communityConfig.community.alias); + await _preferences.setLastAccountFactoryAddress(communityConfig.community.primaryAccountFactory.address); _appState.importLoadingSuccess(); @@ -367,7 +370,7 @@ class AppLogic { final address = EthereumAddress.fromHex(decodedSplit[0]); final existing = await _accounts.getAccount( - address.hexEip55, communityConfig.community.alias); + address.hexEip55, communityConfig.community.alias, ''); if (existing != null) { return (existing.address.hexEip55, alias); } @@ -387,6 +390,7 @@ class AppLogic { await _preferences.setLastWallet(address.hexEip55); await _preferences.setLastAlias(communityConfig.community.alias); + await _preferences.setLastAccountFactoryAddress(communityConfig.community.primaryAccountFactory.address); _appState.importLoadingSuccess(); diff --git a/lib/state/backup/logic.dart b/lib/state/backup/logic.dart index b10ab213..9c4672d9 100644 --- a/lib/state/backup/logic.dart +++ b/lib/state/backup/logic.dart @@ -201,6 +201,8 @@ class BackupLogic { // set up the first wallet as the default, this will allow the app to start normally _preferences.setLastAlias(accounts.first.alias); _preferences.setLastWallet(accounts.first.address.hexEip55); + _preferences + .setLastAccountFactoryAddress(accounts.first.accountFactoryAddress); _state.decryptSuccess(backupTime, username); @@ -290,6 +292,8 @@ class BackupLogic { // set up the first wallet as the default, this will allow the app to start normally _preferences.setLastAlias(accounts.first.alias); _preferences.setLastWallet(accounts.first.address.hexEip55); + _preferences + .setLastAccountFactoryAddress(accounts.first.accountFactoryAddress); } on BackupNotFoundException { _state.setStatus(BackupStatus.nobackup); _state.backupError(); diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index 5e6e61cd..c8e2ba9a 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -554,6 +554,7 @@ class WalletLogic extends WidgetsBindingObserver { await _preferences.setLastWallet(accAddress); await _preferences.setLastAlias(communityConfig.community.alias); + await _preferences.setLastAccountFactoryAddress(dbWallet.accountFactoryAddress); return accAddress; } on NotFoundException { @@ -621,6 +622,7 @@ class WalletLogic extends WidgetsBindingObserver { await _preferences.setLastWallet(address.hexEip55); await _preferences.setLastAlias(communityConfig.community.alias); + await _preferences.setLastAccountFactoryAddress(communityConfig.community.primaryAccountFactory.address); _state.createWalletSuccess( cwwallet, @@ -690,6 +692,7 @@ class WalletLogic extends WidgetsBindingObserver { await _preferences.setLastWallet(address.hexEip55); await _preferences.setLastAlias(communityConfig.community.alias); + await _preferences.setLastAccountFactoryAddress(communityConfig.community.primaryAccountFactory.address); _state.createWalletSuccess(cwwallet); @@ -2233,28 +2236,20 @@ class WalletLogic extends WidgetsBindingObserver { final wallets = await _encPrefs.getAllAccounts(); final List cwwallets = await compute((ws) { - final Map uniqueWallets = {}; - - for (final w in ws.where((w) => w.privateKey != null)) { + return ws.where((w) => w.privateKey != null).map((w) { final creds = w.privateKey!; - final walletKey = '${w.address.hexEip55}_${w.alias}'; - - if (!uniqueWallets.containsKey(walletKey)) { - uniqueWallets[walletKey] = CWWallet( - '0.0', - name: w.name, - address: creds.address.hexEip55, - alias: w.alias, - account: w.address.hexEip55, - currencyName: '', - symbol: '', - currencyLogo: '', - locked: false, - ); - } - } - - return uniqueWallets.values.toList(); + return CWWallet( + '0.0', + name: w.name, + address: creds.address.hexEip55, + alias: w.alias, + account: w.address.hexEip55, + currencyName: '', + symbol: '', + currencyLogo: '', + locked: false, + ); + }).toList(); }, wallets); _state.loadWalletsSuccess(cwwallets); From a3ada88412e0644e308ebe833785def713e6ec06 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Mon, 25 Aug 2025 20:26:53 +0530 Subject: [PATCH 29/46] bug issue fixed --- lib/services/accounts/native/android.dart | 42 ++++++++++++++++------- lib/services/accounts/native/apple.dart | 19 ++++++++-- lib/services/wallet/wallet.dart | 5 ++- lib/state/profile/logic.dart | 5 +++ 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index 04a58cde..034c17c0 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -55,7 +55,7 @@ class AndroidAccountsService extends AccountsServiceInterface { [account.address.hexEip55], [calldata], deploy: false, - accountFactoryAddress: account.accountFactoryAddress, + accountFactoryAddress: '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185', ); final txHash = await submitUserop(config, userop); @@ -208,10 +208,11 @@ class AndroidAccountsService extends AccountsServiceInterface { where: 'id = ?', whereArgs: [oldAccountId], ); - + if (existingAccount.isNotEmpty) { // Delete using the expected ID - await _accountsDB.accounts.delete(account.address, account.alias, account.accountFactoryAddress); + await _accountsDB.accounts.delete( + account.address, account.alias, account.accountFactoryAddress); } else { // Try to find by address and alias with empty accountFactoryAddress final foundByAddress = await _accountsDB.accounts.db.query( @@ -219,10 +220,10 @@ class AndroidAccountsService extends AccountsServiceInterface { where: 'address = ? AND alias = ? AND accountFactoryAddress = ""', whereArgs: [account.address.hexEip55, account.alias], ); - + if (foundByAddress.isNotEmpty) { final actualId = foundByAddress.first['id'] as String; - + // Delete using the actual ID await _accountsDB.accounts.db.delete( 't_accounts', @@ -232,9 +233,26 @@ class AndroidAccountsService extends AccountsServiceInterface { } } + if (account.accountFactoryAddress == + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + final accountForFix = DBAccount( + alias: account.alias, + address: account.address, + name: account.name, + username: account.username, + accountFactoryAddress: account.accountFactoryAddress, + profile: account.profile, + ); + + accountForFix.privateKey = + account.privateKey ?? EthPrivateKey.fromHex(oldPrivateKey!); + + await _fixSafeAccount(accountForFix, config); + } + // Insert the new record await _accountsDB.accounts.insert(updatedAccount); - + if (oldPrivateKey != null) { await _credentials.write(newAccountId, oldPrivateKey); await _credentials.delete(oldAccountId); @@ -244,13 +262,13 @@ class AndroidAccountsService extends AccountsServiceInterface { 6: () async { final allAccounts = await _accountsDB.accounts.all(); final toDelete = []; - + for (final account in allAccounts) { if (account.accountFactoryAddress.isEmpty) { toDelete.add(account); } } - + for (final account in toDelete) { // Check if the account actually exists in the database final existingAccount = await _accountsDB.accounts.db.query( @@ -258,7 +276,7 @@ class AndroidAccountsService extends AccountsServiceInterface { where: 'id = ?', whereArgs: [account.id], ); - + if (existingAccount.isNotEmpty) { // Delete the account from database using the actual ID await _accountsDB.accounts.db.delete( @@ -273,10 +291,10 @@ class AndroidAccountsService extends AccountsServiceInterface { where: 'address = ? AND alias = ? AND accountFactoryAddress = ""', whereArgs: [account.address.hexEip55, account.alias], ); - + if (foundByAddress.isNotEmpty) { final actualId = foundByAddress.first['id'] as String; - + // Delete using the actual ID await _accountsDB.accounts.db.delete( 't_accounts', @@ -285,7 +303,7 @@ class AndroidAccountsService extends AccountsServiceInterface { ); } } - + // Delete the private key from credentials await _credentials.delete(account.id); } diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index fb5f1a70..3cf293b1 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -51,7 +51,7 @@ class AppleAccountsService extends AccountsServiceInterface { [account.address.hexEip55], [calldata], deploy: false, - accountFactoryAddress: account.accountFactoryAddress, + accountFactoryAddress: '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185', ); final txHash = await submitUserop(config, userop); @@ -344,11 +344,26 @@ class AppleAccountsService extends AccountsServiceInterface { ); } } + if (account.accountFactoryAddress == + '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { + final accountForFix = DBAccount( + alias: account.alias, + address: account.address, + name: account.name, + username: account.username, + accountFactoryAddress: account.accountFactoryAddress, + profile: account.profile, + ); + + accountForFix.privateKey = + account.privateKey ?? EthPrivateKey.fromHex(oldPrivateKey!); + + await _fixSafeAccount(accountForFix, config); + } // Insert the new record await _accountsDB.accounts.insert(updatedAccount); - // Write credentials into Keychain Services if (oldPrivateKey != null) { await _credentials.write(newAccountId, oldPrivateKey); await _credentials.delete(oldAccountId); diff --git a/lib/services/wallet/wallet.dart b/lib/services/wallet/wallet.dart index bd733ac1..5469e5e7 100644 --- a/lib/services/wallet/wallet.dart +++ b/lib/services/wallet/wallet.dart @@ -223,6 +223,7 @@ Future setProfile( ProfileRequest profile, { required List image, required String fileType, + String? accountFactoryAddress, }) async { try { final url = @@ -253,13 +254,15 @@ Future setProfile( final calldata = config.profileContract .setCallData(account.hexEip55, profile.username, profileUrl); + final factoryAddress = + accountFactoryAddress ?? config.community.primaryAccountFactory.address; final (_, userop) = await prepareUserop( config, account, credentials, [config.profileContract.addr], [calldata], - accountFactoryAddress: config.community.primaryAccountFactory.address, + accountFactoryAddress: factoryAddress, ); final txHash = await submitUserop(config, userop); diff --git a/lib/state/profile/logic.dart b/lib/state/profile/logic.dart index 8d564139..a89d0a05 100644 --- a/lib/state/profile/logic.dart +++ b/lib/state/profile/logic.dart @@ -335,6 +335,9 @@ class ProfileLogic { ? convertBytesToUint8List(image) : await _photos.photoFromBundle('assets/icons/profile.jpg'); + final accountForFactory = await _accountBackupDBService.accounts + .get(_account!, _config!.community.alias, ''); + final url = await setProfile( _config, _account, @@ -342,6 +345,7 @@ class ProfileLogic { ProfileRequest.fromProfileV1(profile), image: newImage, fileType: '.jpg', + accountFactoryAddress: accountForFactory?.accountFactoryAddress, ); if (url == null) { throw Exception('Failed to save profile'); @@ -595,6 +599,7 @@ class ProfileLogic { ProfileRequest.fromProfileV1(profile), image: await _photos.photoFromBundle('assets/icons/profile.jpg'), fileType: '.jpg', + accountFactoryAddress: account.accountFactoryAddress, ); if (url == null) { throw Exception('Failed to create profile url'); From 05de2cc877a2d56089a3d91169efa58323d17700 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Tue, 26 Aug 2025 21:09:49 +0530 Subject: [PATCH 30/46] updates to v5 community config --- assets/config/v4/communities.json | 3938 ++++++++++----------- assets/config/v4/communities.test.json | 2 +- assets/config/v5/communities.json | 4411 ++++++++++++------------ assets/config/v5/communities.test.json | 4411 ++++++++++++------------ 4 files changed, 6434 insertions(+), 6328 deletions(-) diff --git a/assets/config/v4/communities.json b/assets/config/v4/communities.json index 7e138629..0726f7ee 100644 --- a/assets/config/v4/communities.json +++ b/assets/config/v4/communities.json @@ -1,1970 +1,1970 @@ [ - { - "community": { - "name": "Citizen Wallet (CTZN)", - "description": "The token powering the Citizen Wallet economy.", - "url": "https://citizenwallet.xyz", - "alias": "ctzn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "theme": { - "primary": "#9563D3" - }, - "profile": { - "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", - "chain_id": 137 - }, - "primary_token": { - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { - "standard": "erc20", - "name": "Citizen Wallet", - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "symbol": "CTZN", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://citizenwallet.xyz/pay-with-ctzn", - "launch_mode": "browser" - }, - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://my.citizenwallet.xyz/onramp", - "action": "topup", - "signature": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/ctzn.json", - "version": 4 - }, - { - "community": { - "name": "Brussels Pay", - "description": "A community for the city of Brussels", - "url": "https://pay.brussels", - "alias": "wallet.pay.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "custom_domain": "wallet.pay.brussels", - "hidden": false, - "theme": { - "primary": "#4a90e2" - }, - "profile": { - "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", - "chain_id": 100 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "chain_id": 100 - } - }, - "tokens": { - "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "pay.brussels", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "EURb", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { - "chain_id": 100, - "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", - "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", - "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_type": "cw" - }, - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - } - }, - "cards": { - "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { - "chain_id": 100, - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "type": "classic" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.pay.brussels", - "ws_url": "wss://engine.pay.brussels" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "url": "https://checkout.pay.brussels/topup", - "action": "topup", - "signature": true - } - ], - "config_location": "https://wallet.pay.brussels/config/community.json", - "version": 4 - }, - { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token of gratitude.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gratitude", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "theme": { - "primary": "#4EC19D" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "chain_id": 42220 - }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - }, - "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - } - }, - "cards": { - "42220:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { - "chain_id": 42220, - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "type": "classic" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://gratitude.citizenwallet.xyz/config/community.json", - "version": 4 - }, - { - "community": { - "name": "SFLUV Community", - "description": "A community currency for the city of San Francisco.", - "url": "https://sfluv.org", - "alias": "wallet.berachain.sfluv.org", - "custom_domain": "wallet.sfluv.org", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "theme": { - "primary": "#eb6c6c" - }, - "profile": { - "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "chain_id": 80094 - }, - "primary_token": { - "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", - "chain_id": 80094 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 80094 - } - }, - "tokens": { - "80094:0x881cad4f885c6701d8481c0ed347f6d35444ea7e": { - "standard": "erc20", - "name": "SFLUV V1.1", - "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", - "symbol": "SFLUV", - "decimals": 18, - "chain_id": 80094 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "80094:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 80094, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x9A5be02B65f9Aa00060cB8c951dAFaBAB9B860cd", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "80094": { - "id": 80094, - "node": { - "url": "https://80094.engine.citizenwallet.xyz", - "ws_url": "wss://80094.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "url": "https://app.sfluv.org", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", - "version": 4 - }, - { - "community": { - "name": "SFLUV Community (Polygon)", - "description": "A community currency for the city of San Francisco.", - "url": "https://sfluv.org", - "alias": "wallet.sfluv.org", - "custom_domain": "wallet.polygon.sfluv.org", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "theme": { - "primary": "#eb6c6c" - }, - "profile": { - "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "chain_id": 137 - }, - "primary_token": { - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", - "chain_id": 137 - } - }, - "tokens": { - "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { - "standard": "erc20", - "name": "SFLUV V1.1", - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "symbol": "SFLUV", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { - "chain_id": 137, - "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", - "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", - "paymaster_type": "cw" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "url": "https://app.sfluv.org", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", - "version": 4 - }, - { - "community": { - "name": "Txirrin", - "description": "A community for Txirrin", - "url": "https://citizenwallet.xyz/txirrin", - "alias": "txirrin", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", - "hidden": false, - "theme": { - "primary": "#FB7502" - }, - "profile": { - "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", - "chain_id": 100 - }, - "primary_token": { - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 100 - } - }, - "tokens": { - "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { - "standard": "erc20", - "name": "Txirrin", - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "symbol": "TXI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/txirrin.json", - "version": 4 - }, - { - "community": { - "name": "Bolivia Pay", - "description": "A community for Ethereum Bolivia.", - "url": "https://www.ethereumbolivia.org", - "alias": "boliviapay", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", - "theme": { - "primary": "#009393" - }, - "profile": { - "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", - "chain_id": 137 - }, - "primary_token": { - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 137 - } - }, - "tokens": { - "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { - "standard": "erc20", - "name": "(PoS) Tether USD", - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "symbol": "USDT", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/boliviapay.json", - "version": 4 - }, - { - "community": { - "name": "Breadchain Community Token", - "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", - "url": "https://breadchain.xyz/", - "alias": "bread", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "profile": { - "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", - "chain_id": 100 - }, - "primary_token": { - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "chain_id": 100 - } - }, - "tokens": { - "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { - "standard": "erc20", - "name": "Breadchain Community Token", - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "symbol": "BREAD", - "decimals": 18, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { - "chain_id": 100, - "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", - "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_type": "cw" - }, - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://marketplace.citizenwallet.xyz/bread", - "launch_mode": "webview", - "signature": true - }, - { - "name": "Breadcon 2025 Faucet", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://faucet.citizenwallet.xyz/breadcon2025", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/bread.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "Commons Hub Brussels", - "description": "Community Token for the Commons Hub Brussels community", - "url": "https://commonshub.brussels", - "alias": "wallet.commonshub.brussels", - "custom_domain": "wallet.commonshub.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", - "theme": { - "primary": "#ff4c02" - }, - "profile": { - "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { - "standard": "erc20", - "name": "Commons Hub Token", - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "symbol": "CHT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { - "chain_id": 42220, - "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", - "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "cards": { - "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { - "chain_id": 42220, - "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", - "type": "classic" - } - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.commonshub.brussels.json", - "version": 4 - }, - { - "community": { - "name": "Sel de Salm", - "description": "La communauté de Sel de Salm", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "alias": "seldesalm", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "theme": { - "primary": "#6B5CA4" - }, - "profile": { - "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { - "standard": "erc20", - "name": "Myrtille", - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "symbol": "MYRT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "cards": { - "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 42220, - "instance_id": "cw-seldesalm", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Informations Générales", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "launch_mode": "webview" - }, - { - "name": "Échanges", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://marketplace.citizenwallet.xyz/seldesalm", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://seldesalm.citizenwallet.xyz/config/community.json", - "version": 4 - }, - { - "community": { - "name": "TECHI", - "description": "A community for TECHI users", - "url": "https://my.techi.be", - "alias": "my.techi.be", - "logo": "https://my.techi.be/assets/token.svg", - "hidden": false, - "theme": { - "primary": "#617FF8" - }, - "profile": { - "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", - "chain_id": 100 - }, - "primary_token": { - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "chain_id": 100 - } - }, - "tokens": { - "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { - "standard": "erc20", - "name": "TECHI", - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "symbol": "TECHI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.my.techi.be", - "ws_url": "wss://engine.my.techi.be" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.techi.be/assets/community.json", - "version": 4 - }, - { - "community": { - "name": "Regens Unite", - "description": "A community currency for the Regens Unite community.", - "url": "https://www.regensunite.earth/", - "alias": "wallet.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "custom_domain": "wallet.regensunite.earth", - "hidden": true, - "profile": { - "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x9406Cc6185a346906296840746125a0E44976454", - "chain_id": 137 - } - }, - "tokens": { - "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "Regens Unite Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "RGN", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 137, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.regensunite.earth.json", - "version": 4 - }, - { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gt.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "custom_domain": null, - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/gt.celo.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "Celo Euro", - "description": "Celo Euro is a stablecoin for the Celo Community.", - "url": "https://celo.org/", - "alias": "ceur.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { - "standard": "erc20", - "name": "Celo Euro", - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "symbol": "cEUR", - "decimals": 18, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { - "chain_id": 42220, - "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", - "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/ceur.celo.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "EUR e-money", - "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", - "url": "https://monerium.com/tokens/", - "alias": "eure.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", - "hidden": true, - "profile": { - "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", - "chain_id": 137 - } - }, - "tokens": { - "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { - "standard": "erc20", - "name": "EUR emoney", - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "symbol": "EURe", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { - "chain_id": 137, - "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", - "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", - "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/eure.polygon.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "USDC on Polygon", - "description": "The community of people using USDC on Polygon.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "app", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "chain_id": 137 - }, - "primary_token": { - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x270758454C012A1f51428b68aE473D728CCdFe88", - "chain_id": 137 - } - }, - "tokens": { - "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "symbol": "USDC", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { - "chain_id": 137, - "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", - "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", - "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/app.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "USDC on Base", - "description": "The community of people using USDC on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "usdc.base", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "symbol": "USDC", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { - "chain_id": 8453, - "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/usdc.base.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "OAK Community", - "description": "A community currency for the city of Oakland.", - "url": "https://www.oak.community/", - "alias": "wallet.oak.community", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", - "custom_domain": "wallet.oak.community", - "hidden": true, - "profile": { - "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x9406Cc6185a346906296840746125a0E44976454", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { - "standard": "erc20", - "name": "OAK Community Currency", - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "symbol": "OAK", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 8453, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x123", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg" - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.oak.community.json", - "version": 4 - }, - { - "community": { - "name": "Stable Coin", - "description": "SBC is a digital dollar stablecoin issued by Brale", - "url": "https://brale.xyz/", - "alias": "sbc.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", - "hidden": true, - "profile": { - "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "chain_id": 137 - }, - "primary_token": { - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", - "chain_id": 137 - } - }, - "tokens": { - "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { - "standard": "erc20", - "name": "Stable Coin", - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "symbol": "SBC", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { - "chain_id": 137, - "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", - "paymaster_address": "0x123", - "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", - "paymaster_type": "cw" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/sbc.polygon.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "Zinne.brussels", - "description": "A community currency for the city of Brussels", - "url": "https://zinne.brussels", - "alias": "zinne", - "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", - "hidden": true, - "profile": { - "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", - "chain_id": 137 - }, - "primary_token": { - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x11af2639817692D2b805BcE0e1e405E530B20006", - "chain_id": 137 - } - }, - "tokens": { - "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { - "standard": "erc20", - "name": "Zinne.brussels Token", - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "symbol": "ZINNE", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { - "chain_id": 137, - "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", - "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", - "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", - "paymaster_type": "cw" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://config.internal.citizenwallet.xyz/v4/zinne.brussels.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "Regens Unite Time Bank", - "description": "Make time to regen", - "url": "https://regensunite.earth", - "alias": "timebank.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "hidden": true, - "profile": { - "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x186DaBD027e228C988777907465807FDab270894", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x39b77d77f7677997871b304094a05295eb71e240", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x186DaBD027e228C988777907465807FDab270894": { - "standard": "erc20", - "name": "Regen Hour", - "address": "0x186DaBD027e228C988777907465807FDab270894", - "symbol": "rHour", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x39b77d77f7677997871b304094a05295eb71e240": { - "chain_id": 42220, - "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", - "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", - "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://timebank.regensunite.earth/indexer", - "version": 4 - }, - { - "community": { - "name": "MOOS Token", - "description": "A community currency for MOOS.", - "url": "https://www.moos.garden/", - "alias": "moos", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", - "hidden": true, - "profile": { - "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { - "standard": "erc20", - "name": "MOOS Token", - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "symbol": "MOOS", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { - "chain_id": 42220, - "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", - "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", - "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", - "url": "https://marketplace.citizenwallet.xyz/moos", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/moos.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "Bonne Heure", - "description": "Système d'Échange Local de Villers-la-Ville", - "url": "https://selcoupdepouce.be", - "alias": "selcoupdepouce", - "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", - "hidden": true, - "profile": { - "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { - "standard": "erc20", - "name": "Bonne Heure", - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "symbol": "BHR", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { - "chain_id": 42220, - "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", - "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", - "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", - "launch_mode": "browser", - "signature": true - } - ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/selcoupdepouce.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "CI token", - "description": "Monnaie locale du Cercle Informatique de l’ULB", - "url": "https://citizenwallet.xyz/cit", - "alias": "cit.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", - "hidden": true, - "profile": { - "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { - "standard": "erc20", - "name": "CI token", - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "symbol": "CIT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { - "chain_id": 42220, - "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", - "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", - "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/cit.celo.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "Wolugo", - "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", - "url": "https://wolugo.be", - "alias": "wallet.wolugo.be", - "custom_domain": "wallet.wolugo.be", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", - "theme": { - "primary": "#81e2c1" - }, - "hidden": true, - "profile": { - "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", - "chain_id": 42220 - }, - "card_factory": { - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { - "standard": "erc20", - "name": "Wolu", - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "symbol": "WOLU", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { - "chain_id": 42220, - "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", - "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", - "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", - "paymaster_type": "cw" - } - }, - "cards": { - "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { - "chain_id": 42220, - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "type": "classic" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.wolugo.be.json", - "version": 4 - }, - { - "community": { - "name": "Woluwe Test", - "description": "Local currency for the Woluwe Test community.", - "url": "https://wollet-v2.citizenwallet.net/token", - "alias": "wtc.celo", - "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", - "hidden": true, - "profile": { - "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0xE79E19594A749330036280c685E2719d58d99052", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { - "standard": "erc20", - "name": "Woluwe Test Coin", - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "symbol": "WTC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xE79E19594A749330036280c685E2719d58d99052": { - "chain_id": 42220, - "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", - "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/wtc.celo.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "ETHGlobal London Token", - "description": "The community of people using ETHLDN on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "testnet-ethldn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", - "hidden": true, - "profile": { - "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", - "chain_id": 84532 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 84532 - }, - "primary_account_factory": { - "address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", - "chain_id": 84532 - } - }, - "tokens": { - "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "ETHGlobal London Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "ETHLDN", - "decimals": 6, - "chain_id": 84532 - } - }, - "scan": { - "url": "https://sepolia.basescan.org", - "name": "Base Sepolia Explorer" - }, - "accounts": { - "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { - "chain_id": 84532, - "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", - "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", - "paymaster_type": "cw" - } - }, - "chains": { - "84532": { - "id": 84532, - "node": { - "url": "https://84532.engine.citizenwallet.xyz", - "ws_url": "wss://84532.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/testnet-ethldn.json", - "version": 4 - }, - { - "community": { - "name": "Celo Community Point", - "description": "This is a community for the Celo Point", - "url": "https://citizenwallet.xyz", - "alias": "celo-c.citizenwallet.xyz", - "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", - "hidden": true, - "profile": { - "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { - "standard": "erc20", - "name": "Celo Community Point", - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "symbol": "CeloC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { - "chain_id": 42220, - "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", - "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", - "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", - "paymaster_type": "cw" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/celo-c.citizenwallet.xyz.json", - "version": 4 - }, - { - "community": { - "name": "KFMEDIA℠", - "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", - "url": "https://kingfishersmedia.io", - "alias": "wallet.kingfishersmedia.io", - "custom_domain": "wallet.kingfishersmedia.io", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", - "theme": { - "primary": "#88292c" - }, - "profile": { - "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "chain_id": 42220 - }, - "primary_card_manager": { - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { - "standard": "erc1155", - "name": "KFMEDIA℠ Pathways for LATAM™", - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "symbol": "KFMPFL", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", - "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.kingfishersmedia.io.json", - "version": 4 - } -] \ No newline at end of file + { + "community": { + "name": "Citizen Wallet (CTZN)", + "description": "The token powering the Citizen Wallet economy.", + "url": "https://citizenwallet.xyz", + "alias": "ctzn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "theme": { + "primary": "#9563D3" + }, + "profile": { + "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", + "chain_id": 137 + }, + "primary_token": { + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "chain_id": 137 + } + }, + "tokens": { + "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { + "standard": "erc20", + "name": "Citizen Wallet", + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "symbol": "CTZN", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://citizenwallet.xyz/pay-with-ctzn", + "launch_mode": "browser" + }, + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://my.citizenwallet.xyz/onramp", + "action": "topup", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/ctzn.json", + "version": 4 + }, + { + "community": { + "name": "Brussels Pay", + "description": "A community for the city of Brussels", + "url": "https://pay.brussels", + "alias": "wallet.pay.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "custom_domain": "wallet.pay.brussels", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", + "chain_id": 100 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 100 + } + }, + "tokens": { + "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "pay.brussels", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "EURb", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { + "chain_id": 100, + "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", + "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", + "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_type": "cw" + }, + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 100, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.pay.brussels", + "ws_url": "wss://engine.pay.brussels" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "url": "https://checkout.pay.brussels/topup", + "action": "topup", + "signature": true + } + ], + "config_location": "https://wallet.pay.brussels/config/community.json", + "version": 4 + }, + { + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token of gratitude.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gratitude", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "theme": { + "primary": "#4EC19D" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "42220:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 42220, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://gratitude.citizenwallet.xyz/config/community.json", + "version": 4 + }, + { + "community": { + "name": "SFLUV Community", + "description": "A community currency for the city of San Francisco.", + "url": "https://sfluv.org", + "alias": "wallet.berachain.sfluv.org", + "custom_domain": "wallet.sfluv.org", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "theme": { + "primary": "#eb6c6c" + }, + "profile": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 80094 + }, + "primary_token": { + "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", + "chain_id": 80094 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 80094 + } + }, + "tokens": { + "80094:0x881cad4f885c6701d8481c0ed347f6d35444ea7e": { + "standard": "erc20", + "name": "SFLUV V1.1", + "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", + "symbol": "SFLUV", + "decimals": 18, + "chain_id": 80094 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "80094:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 80094, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9A5be02B65f9Aa00060cB8c951dAFaBAB9B860cd", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "80094": { + "id": 80094, + "node": { + "url": "https://80094.engine.citizenwallet.xyz", + "ws_url": "wss://80094.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "url": "https://app.sfluv.org", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", + "version": 4 + }, + { + "community": { + "name": "SFLUV Community (Polygon)", + "description": "A community currency for the city of San Francisco.", + "url": "https://sfluv.org", + "alias": "wallet.sfluv.org", + "custom_domain": "wallet.polygon.sfluv.org", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "theme": { + "primary": "#eb6c6c" + }, + "profile": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 137 + }, + "primary_token": { + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "chain_id": 137 + } + }, + "tokens": { + "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { + "standard": "erc20", + "name": "SFLUV V1.1", + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "symbol": "SFLUV", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "paymaster_type": "cw" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "url": "https://app.sfluv.org", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", + "version": 4 + }, + { + "community": { + "name": "Txirrin", + "description": "A community for Txirrin", + "url": "https://citizenwallet.xyz/txirrin", + "alias": "txirrin", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", + "hidden": false, + "theme": { + "primary": "#FB7502" + }, + "profile": { + "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", + "chain_id": 100 + }, + "primary_token": { + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "chain_id": 100 + } + }, + "tokens": { + "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { + "standard": "erc20", + "name": "Txirrin", + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "symbol": "TXI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/txirrin.json", + "version": 4 + }, + { + "community": { + "name": "Bolivia Pay", + "description": "A community for Ethereum Bolivia.", + "url": "https://www.ethereumbolivia.org", + "alias": "boliviapay", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", + "theme": { + "primary": "#009393" + }, + "profile": { + "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", + "chain_id": 137 + }, + "primary_token": { + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "chain_id": 137 + } + }, + "tokens": { + "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "standard": "erc20", + "name": "(PoS) Tether USD", + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "symbol": "USDT", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/boliviapay.json", + "version": 4 + }, + { + "community": { + "name": "Breadchain Community Token", + "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", + "url": "https://breadchain.xyz/", + "alias": "bread", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "profile": { + "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", + "chain_id": 100 + }, + "primary_token": { + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "chain_id": 100 + } + }, + "tokens": { + "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { + "standard": "erc20", + "name": "Breadchain Community Token", + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "symbol": "BREAD", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { + "chain_id": 100, + "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", + "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_type": "cw" + }, + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://marketplace.citizenwallet.xyz/bread", + "launch_mode": "webview", + "signature": true + }, + { + "name": "Breadcon 2025 Faucet", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://faucet.citizenwallet.xyz/breadcon2025", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/bread.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Commons Hub Brussels", + "description": "Community Token for the Commons Hub Brussels community", + "url": "https://commonshub.brussels", + "alias": "wallet.commonshub.brussels", + "custom_domain": "wallet.commonshub.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", + "theme": { + "primary": "#ff4c02" + }, + "profile": { + "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { + "standard": "erc20", + "name": "Commons Hub Token", + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "symbol": "CHT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "cards": { + "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { + "chain_id": 42220, + "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", + "type": "classic" + } + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.commonshub.brussels.json", + "version": 4 + }, + { + "community": { + "name": "Sel de Salm", + "description": "La communauté de Sel de Salm", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "alias": "seldesalm", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "theme": { + "primary": "#6B5CA4" + }, + "profile": { + "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { + "standard": "erc20", + "name": "Myrtille", + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "symbol": "MYRT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "cards": { + "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 42220, + "instance_id": "cw-seldesalm", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Informations Générales", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "launch_mode": "webview" + }, + { + "name": "Échanges", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://marketplace.citizenwallet.xyz/seldesalm", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://seldesalm.citizenwallet.xyz/config/community.json", + "version": 4 + }, + { + "community": { + "name": "TECHI", + "description": "A community for TECHI users", + "url": "https://my.techi.be", + "alias": "my.techi.be", + "logo": "https://my.techi.be/assets/token.svg", + "hidden": false, + "theme": { + "primary": "#617FF8" + }, + "profile": { + "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", + "chain_id": 100 + }, + "primary_token": { + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 100 + } + }, + "tokens": { + "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { + "standard": "erc20", + "name": "TECHI", + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "symbol": "TECHI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.my.techi.be", + "ws_url": "wss://engine.my.techi.be" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.techi.be/assets/community.json", + "version": 4 + }, + { + "community": { + "name": "Regens Unite", + "description": "A community currency for the Regens Unite community.", + "url": "https://www.regensunite.earth/", + "alias": "wallet.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "custom_domain": "wallet.regensunite.earth", + "hidden": true, + "profile": { + "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "chain_id": 137 + } + }, + "tokens": { + "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "Regens Unite Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "RGN", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 137, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg", + "gas_extra_percentage": 50 + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.regensunite.earth.json", + "version": 4 + }, + { + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gt.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "custom_domain": null, + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/gt.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Celo Euro", + "description": "Celo Euro is a stablecoin for the Celo Community.", + "url": "https://celo.org/", + "alias": "ceur.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { + "standard": "erc20", + "name": "Celo Euro", + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "symbol": "cEUR", + "decimals": 18, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/ceur.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "EUR e-money", + "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", + "url": "https://monerium.com/tokens/", + "alias": "eure.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", + "hidden": true, + "profile": { + "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "chain_id": 137 + } + }, + "tokens": { + "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { + "standard": "erc20", + "name": "EUR emoney", + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "symbol": "EURe", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { + "chain_id": 137, + "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/eure.polygon.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "USDC on Polygon", + "description": "The community of people using USDC on Polygon.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "app", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "chain_id": 137 + }, + "primary_token": { + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "chain_id": 137 + } + }, + "tokens": { + "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "symbol": "USDC", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { + "chain_id": 137, + "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/app.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "USDC on Base", + "description": "The community of people using USDC on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "usdc.base", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "symbol": "USDC", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { + "chain_id": 8453, + "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/usdc.base.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "OAK Community", + "description": "A community currency for the city of Oakland.", + "url": "https://www.oak.community/", + "alias": "wallet.oak.community", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", + "custom_domain": "wallet.oak.community", + "hidden": true, + "profile": { + "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { + "standard": "erc20", + "name": "OAK Community Currency", + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "symbol": "OAK", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 8453, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x123", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.oak.community.json", + "version": 4 + }, + { + "community": { + "name": "Stable Coin", + "description": "SBC is a digital dollar stablecoin issued by Brale", + "url": "https://brale.xyz/", + "alias": "sbc.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", + "hidden": true, + "profile": { + "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "chain_id": 137 + }, + "primary_token": { + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "chain_id": 137 + } + }, + "tokens": { + "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { + "standard": "erc20", + "name": "Stable Coin", + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "symbol": "SBC", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { + "chain_id": 137, + "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", + "paymaster_address": "0x123", + "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "paymaster_type": "cw" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/sbc.polygon.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Zinne.brussels", + "description": "A community currency for the city of Brussels", + "url": "https://zinne.brussels", + "alias": "zinne", + "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", + "hidden": true, + "profile": { + "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", + "chain_id": 137 + }, + "primary_token": { + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "chain_id": 137 + } + }, + "tokens": { + "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { + "standard": "erc20", + "name": "Zinne.brussels Token", + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "symbol": "ZINNE", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { + "chain_id": 137, + "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "paymaster_type": "cw" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://config.internal.citizenwallet.xyz/v4/zinne.brussels.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Regens Unite Time Bank", + "description": "Make time to regen", + "url": "https://regensunite.earth", + "alias": "timebank.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "hidden": true, + "profile": { + "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x186DaBD027e228C988777907465807FDab270894", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x39b77d77f7677997871b304094a05295eb71e240", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x186DaBD027e228C988777907465807FDab270894": { + "standard": "erc20", + "name": "Regen Hour", + "address": "0x186DaBD027e228C988777907465807FDab270894", + "symbol": "rHour", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x39b77d77f7677997871b304094a05295eb71e240": { + "chain_id": 42220, + "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://timebank.regensunite.earth/indexer", + "version": 4 + }, + { + "community": { + "name": "MOOS Token", + "description": "A community currency for MOOS.", + "url": "https://www.moos.garden/", + "alias": "moos", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", + "hidden": true, + "profile": { + "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { + "standard": "erc20", + "name": "MOOS Token", + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "symbol": "MOOS", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { + "chain_id": 42220, + "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", + "url": "https://marketplace.citizenwallet.xyz/moos", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/moos.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Bonne Heure", + "description": "Système d'Échange Local de Villers-la-Ville", + "url": "https://selcoupdepouce.be", + "alias": "selcoupdepouce", + "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", + "hidden": true, + "profile": { + "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { + "standard": "erc20", + "name": "Bonne Heure", + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "symbol": "BHR", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { + "chain_id": 42220, + "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", + "launch_mode": "browser", + "signature": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/selcoupdepouce.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "CI token", + "description": "Monnaie locale du Cercle Informatique de l’ULB", + "url": "https://citizenwallet.xyz/cit", + "alias": "cit.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", + "hidden": true, + "profile": { + "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { + "standard": "erc20", + "name": "CI token", + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "symbol": "CIT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { + "chain_id": 42220, + "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/cit.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "Wolugo", + "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", + "url": "https://wolugo.be", + "alias": "wallet.wolugo.be", + "custom_domain": "wallet.wolugo.be", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", + "theme": { + "primary": "#81e2c1" + }, + "hidden": true, + "profile": { + "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "chain_id": 42220 + }, + "card_factory": { + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { + "standard": "erc20", + "name": "Wolu", + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "symbol": "WOLU", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { + "chain_id": 42220, + "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "paymaster_type": "cw" + } + }, + "cards": { + "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { + "chain_id": 42220, + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.wolugo.be.json", + "version": 4 + }, + { + "community": { + "name": "Woluwe Test", + "description": "Local currency for the Woluwe Test community.", + "url": "https://wollet-v2.citizenwallet.net/token", + "alias": "wtc.celo", + "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", + "hidden": true, + "profile": { + "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xE79E19594A749330036280c685E2719d58d99052", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { + "standard": "erc20", + "name": "Woluwe Test Coin", + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "symbol": "WTC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xE79E19594A749330036280c685E2719d58d99052": { + "chain_id": 42220, + "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/wtc.celo.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "ETHGlobal London Token", + "description": "The community of people using ETHLDN on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "testnet-ethldn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", + "hidden": true, + "profile": { + "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", + "chain_id": 84532 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 84532 + }, + "primary_account_factory": { + "address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "chain_id": 84532 + } + }, + "tokens": { + "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "ETHGlobal London Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "ETHLDN", + "decimals": 6, + "chain_id": 84532 + } + }, + "scan": { + "url": "https://sepolia.basescan.org", + "name": "Base Sepolia Explorer" + }, + "accounts": { + "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { + "chain_id": 84532, + "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "paymaster_type": "cw" + } + }, + "chains": { + "84532": { + "id": 84532, + "node": { + "url": "https://84532.engine.citizenwallet.xyz", + "ws_url": "wss://84532.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/testnet-ethldn.json", + "version": 4 + }, + { + "community": { + "name": "Celo Community Point", + "description": "This is a community for the Celo Point", + "url": "https://citizenwallet.xyz", + "alias": "celo-c.citizenwallet.xyz", + "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", + "hidden": true, + "profile": { + "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { + "standard": "erc20", + "name": "Celo Community Point", + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "symbol": "CeloC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { + "chain_id": 42220, + "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "paymaster_type": "cw" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/celo-c.citizenwallet.xyz.json", + "version": 4 + }, + { + "community": { + "name": "KFMEDIA℠", + "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", + "url": "https://kingfishersmedia.io", + "alias": "wallet.kingfishersmedia.io", + "custom_domain": "wallet.kingfishersmedia.io", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", + "theme": { + "primary": "#88292c" + }, + "profile": { + "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { + "standard": "erc1155", + "name": "KFMEDIA℠ Pathways for LATAM™", + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "symbol": "KFMPFL", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.kingfishersmedia.io.json", + "version": 4 + } +] diff --git a/assets/config/v4/communities.test.json b/assets/config/v4/communities.test.json index cb367088..0726f7ee 100644 --- a/assets/config/v4/communities.test.json +++ b/assets/config/v4/communities.test.json @@ -1967,4 +1967,4 @@ "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.kingfishersmedia.io.json", "version": 4 } -] \ No newline at end of file +] diff --git a/assets/config/v5/communities.json b/assets/config/v5/communities.json index 053f16fb..1ba386bf 100644 --- a/assets/config/v5/communities.json +++ b/assets/config/v5/communities.json @@ -1,2238 +1,2291 @@ [ { - "community": { - "name": "Citizen Wallet (CTZN)", - "description": "The token powering the Citizen Wallet economy.", - "url": "https://citizenwallet.xyz", - "alias": "ctzn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "theme": { - "primary": "#9563D3" - }, - "profile": { - "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", - "chain_id": 137 - }, - "primary_token": { - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { - "standard": "erc20", - "name": "Citizen Wallet", - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "symbol": "CTZN", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://citizenwallet.xyz/pay-with-ctzn", - "launch_mode": "browser" - }, - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://my.citizenwallet.xyz/onramp", - "action": "topup", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/ctzn", - "version": 5 + "community": { + "name": "Citizen Wallet (CTZN)", + "description": "The token powering the Citizen Wallet economy.", + "url": "https://citizenwallet.xyz", + "alias": "ctzn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "theme": { + "primary": "#9563D3" + }, + "profile": { + "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", + "chain_id": 137 + }, + "primary_token": { + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 + } + }, + "tokens": { + "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { + "standard": "erc20", + "name": "Citizen Wallet", + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "symbol": "CTZN", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://citizenwallet.xyz/pay-with-ctzn", + "launch_mode": "browser" + }, + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://my.citizenwallet.xyz/onramp", + "action": "topup", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/ctzn", + "version": 5 }, { - "community": { - "name": "Brussels Pay", - "description": "A community for the city of Brussels", - "url": "https://pay.brussels", - "alias": "wallet.pay.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "custom_domain": "wallet.pay.brussels", - "hidden": false, - "theme": { - "primary": "#4a90e2" - }, - "profile": { - "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", - "chain_id": 100 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "pay.brussels", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "EURb", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { - "chain_id": 100, - "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", - "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", - "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_type": "cw" - }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "cards": { - "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { - "chain_id": 100, - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "type": "classic" - }, - "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 100, - "instance_id": "brussels-pay", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.pay.brussels", - "ws_url": "wss://engine.pay.brussels" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "url": "https://checkout.pay.brussels/topup", - "action": "topup", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", - "version": 5 + "community": { + "name": "Brussels Pay", + "description": "A community for the city of Brussels", + "url": "https://pay.brussels", + "alias": "wallet.pay.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "custom_domain": "wallet.pay.brussels", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", + "chain_id": 100 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "pay.brussels", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "EURb", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { + "chain_id": 100, + "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", + "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", + "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_type": "cw" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 100, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + }, + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "brussels-pay", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.pay.brussels", + "ws_url": "wss://engine.pay.brussels" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "url": "https://checkout.pay.brussels/topup", + "action": "topup", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", + "version": 5 }, { - "community": { - "name": "Monerium EURe on Gnosis", - "description": "A community for EURe on Gnosis", - "url": "https://monerium.com/", - "alias": "eure.gnosis", - "logo": "https://eure.gnosis.citizenwallet.xyz/wallet-config/_images/eure.svg", - "custom_domain": "eure.gnosis.citizenwallet.xyz", - "hidden": false, - "theme": { - "primary": "#4a90e2" - }, - "profile": { - "address": "0x2e297B9ef4df73c8da5070E91EF0570FA312A698", - "chain_id": 100 - }, - "primary_token": { - "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430": { - "standard": "erc20", - "name": "EURe [Gnosis]", - "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", - "symbol": "EURe", - "decimals": 18, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xeBDd6ee8DB7055f62D14A5eAAB7c18ae36Cd2216", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "cards": { - "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 100, - "instance_id": "cw-discord-1", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/eure.gnosis", - "version": 5 + "community": { + "name": "Monerium EURe on Gnosis", + "description": "A community for EURe on Gnosis", + "url": "https://monerium.com/", + "alias": "eure.gnosis", + "logo": "https://eure.gnosis.citizenwallet.xyz/wallet-config/_images/eure.svg", + "custom_domain": "eure.gnosis.citizenwallet.xyz", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x2e297B9ef4df73c8da5070E91EF0570FA312A698", + "chain_id": 100 + }, + "primary_token": { + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430": { + "standard": "erc20", + "name": "EURe [Gnosis]", + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "symbol": "EURe", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xeBDd6ee8DB7055f62D14A5eAAB7c18ae36Cd2216", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "cards": { + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "cw-discord-1", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.gnosis", + "version": 5 }, { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token of gratitude.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gratitude", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "theme": { - "primary": "#4EC19D" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/gratitude", - "version": 5 + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token of gratitude.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gratitude", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "theme": { + "primary": "#4EC19D" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/gratitude", + "version": 5 }, { - "community": { - "name": "SFLUV Community", - "description": "A community currency for the city of San Francisco.", - "url": "https://sfluv.org", - "alias": "wallet.sfluv.org", - "custom_domain": "wallet.sfluv.org", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "theme": { - "primary": "#eb6c6c" - }, - "profile": { - "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "chain_id": 137 - }, - "primary_token": { - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { - "standard": "erc20", - "name": "SFLUV V1.1", - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "symbol": "SFLUV", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { - "chain_id": 137, - "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", - "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", - "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x5097dAD831FE21EF12dA31bf5d07A2e8ef6f5f1e", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "url": "https://app.sfluv.org", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.sfluv.org", - "version": 5 + "community": { + "name": "SFLUV Community", + "description": "A community currency for the city of San Francisco.", + "url": "https://sfluv.org", + "alias": "wallet.berachain.sfluv.org", + "custom_domain": "wallet.sfluv.org", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "theme": { + "primary": "#eb6c6c" + }, + "profile": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 80094 + }, + "primary_token": { + "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", + "chain_id": 80094 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 80094 + } + }, + "tokens": { + "80094:0x881cad4f885c6701d8481c0ed347f6d35444ea7e": { + "standard": "erc20", + "name": "SFLUV V1.1", + "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", + "symbol": "SFLUV", + "decimals": 18, + "chain_id": 80094 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "80094:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 80094, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9A5be02B65f9Aa00060cB8c951dAFaBAB9B860cd", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "80094": { + "id": 80094, + "node": { + "url": "https://80094.engine.citizenwallet.xyz", + "ws_url": "wss://80094.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "url": "https://app.sfluv.org", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", + "version": 4 }, { - "community": { - "name": "Txirrin", - "description": "A community for Txirrin", - "url": "https://citizenwallet.xyz/txirrin", - "alias": "txirrin", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", - "hidden": false, - "theme": { - "primary": "#FB7502" - }, - "profile": { - "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", - "chain_id": 100 - }, - "primary_token": { - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { - "standard": "erc20", - "name": "Txirrin", - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "symbol": "TXI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/txirrin", - "version": 5 + "community": { + "name": "SFLUV Community (Polygon)", + "description": "A community currency for the city of San Francisco.", + "url": "https://sfluv.org", + "alias": "wallet.sfluv.org", + "custom_domain": "wallet.polygon.sfluv.org", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "theme": { + "primary": "#eb6c6c" + }, + "profile": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 137 + }, + "primary_token": { + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "chain_id": 137 + } + }, + "tokens": { + "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { + "standard": "erc20", + "name": "SFLUV V1.1", + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "symbol": "SFLUV", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "paymaster_type": "cw" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "url": "https://app.sfluv.org", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", + "version": 4 }, { - "community": { - "name": "Bolivia Pay", - "description": "A community for Ethereum Bolivia.", - "url": "https://www.ethereumbolivia.org", - "alias": "boliviapay", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", - "theme": { - "primary": "#009393" - }, - "profile": { - "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", - "chain_id": 137 - }, - "primary_token": { - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { - "standard": "erc20", - "name": "(PoS) Tether USD", - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "symbol": "USDT", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/boliviapay", - "version": 5 + "community": { + "name": "Txirrin", + "description": "A community for Txirrin", + "url": "https://citizenwallet.xyz/txirrin", + "alias": "txirrin", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", + "hidden": false, + "theme": { + "primary": "#FB7502" + }, + "profile": { + "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", + "chain_id": 100 + }, + "primary_token": { + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { + "standard": "erc20", + "name": "Txirrin", + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "symbol": "TXI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/txirrin", + "version": 5 }, { - "community": { - "name": "Breadchain Community Token", - "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", - "url": "https://breadchain.xyz/", - "alias": "bread", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "profile": { - "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", - "chain_id": 100 - }, - "primary_token": { - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { - "standard": "erc20", - "name": "Breadchain Community Token", - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "symbol": "BREAD", - "decimals": 18, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { - "chain_id": 100, - "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", - "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_type": "cw" - }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://marketplace.citizenwallet.xyz/bread", - "launch_mode": "webview", - "signature": true - }, - { - "name": "Breadcon 2025 Faucet", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://faucet.citizenwallet.xyz/breadcon2025", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/bread", - "version": 5 + "community": { + "name": "Bolivia Pay", + "description": "A community for Ethereum Bolivia.", + "url": "https://www.ethereumbolivia.org", + "alias": "boliviapay", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", + "theme": { + "primary": "#009393" + }, + "profile": { + "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", + "chain_id": 137 + }, + "primary_token": { + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 + } + }, + "tokens": { + "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "standard": "erc20", + "name": "(PoS) Tether USD", + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "symbol": "USDT", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/boliviapay", + "version": 5 }, { - "community": { - "name": "Commons Hub Brussels", - "description": "Community Token for the Commons Hub Brussels community", - "url": "https://commonshub.brussels", - "alias": "wallet.commonshub.brussels", - "custom_domain": "wallet.commonshub.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", - "theme": { - "primary": "#ff4c02" - }, - "profile": { - "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { - "standard": "erc20", - "name": "Commons Hub Token", - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "symbol": "CHT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { - "chain_id": 42220, - "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", - "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4860C0f127500F0cbF4a5Bd797cBb5aA50Eb0FbA", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "cards": { - "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { - "chain_id": 42220, - "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", - "type": "classic" - } - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.commonshub.brussels", - "version": 5 + "community": { + "name": "Breadchain Community Token", + "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", + "url": "https://breadchain.xyz/", + "alias": "bread", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "profile": { + "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", + "chain_id": 100 + }, + "primary_token": { + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { + "standard": "erc20", + "name": "Breadchain Community Token", + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "symbol": "BREAD", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { + "chain_id": 100, + "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", + "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_type": "cw" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://marketplace.citizenwallet.xyz/bread", + "launch_mode": "webview", + "signature": true + }, + { + "name": "Breadcon 2025 Faucet", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://faucet.citizenwallet.xyz/breadcon2025", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/bread", + "version": 5 }, { - "community": { - "name": "Sel de Salm", - "description": "La communauté de Sel de Salm", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "alias": "seldesalm", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "theme": { - "primary": "#6B5CA4" - }, - "profile": { - "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { - "standard": "erc20", - "name": "Myrtille", - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "symbol": "MYRT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "cards": { - "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 42220, - "instance_id": "cw-seldesalm", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Informations Générales", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "launch_mode": "webview" - }, - { - "name": "Échanges", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://marketplace.citizenwallet.xyz/seldesalm", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/seldesalm", - "version": 5 + "community": { + "name": "Commons Hub Brussels", + "description": "Community Token for the Commons Hub Brussels community", + "url": "https://commonshub.brussels", + "alias": "wallet.commonshub.brussels", + "custom_domain": "wallet.commonshub.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", + "theme": { + "primary": "#ff4c02" + }, + "profile": { + "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { + "standard": "erc20", + "name": "Commons Hub Token", + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "symbol": "CHT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4860C0f127500F0cbF4a5Bd797cBb5aA50Eb0FbA", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "cards": { + "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { + "chain_id": 42220, + "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", + "type": "classic" + } + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.commonshub.brussels", + "version": 5 }, { - "community": { - "name": "TECHI", - "description": "A community for TECHI users", - "url": "https://my.techi.be", - "alias": "my.techi.be", - "logo": "https://my.techi.be/assets/token.svg", - "hidden": false, - "theme": { - "primary": "#617FF8" - }, - "profile": { - "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", - "chain_id": 100 - }, - "primary_token": { - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { - "standard": "erc20", - "name": "TECHI", - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "symbol": "TECHI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.my.techi.be", - "ws_url": "wss://engine.my.techi.be" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/my.techi.be", - "version": 5 + "community": { + "name": "Sel de Salm", + "description": "La communauté de Sel de Salm", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "alias": "seldesalm", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "theme": { + "primary": "#6B5CA4" + }, + "profile": { + "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { + "standard": "erc20", + "name": "Myrtille", + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "symbol": "MYRT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "cards": { + "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 42220, + "instance_id": "cw-seldesalm", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Informations Générales", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "launch_mode": "webview" + }, + { + "name": "Échanges", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://marketplace.citizenwallet.xyz/seldesalm", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/seldesalm", + "version": 5 }, { - "community": { - "name": "Regens Unite", - "description": "A community currency for the Regens Unite community.", - "url": "https://www.regensunite.earth/", - "alias": "wallet.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "custom_domain": "wallet.regensunite.earth", - "hidden": true, - "profile": { - "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "Regens Unite Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "RGN", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 137, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg", - "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.regensunite.earth", - "version": 5 + "community": { + "name": "TECHI", + "description": "A community for TECHI users", + "url": "https://my.techi.be", + "alias": "my.techi.be", + "logo": "https://my.techi.be/assets/token.svg", + "hidden": false, + "theme": { + "primary": "#617FF8" + }, + "profile": { + "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", + "chain_id": 100 + }, + "primary_token": { + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { + "standard": "erc20", + "name": "TECHI", + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "symbol": "TECHI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.my.techi.be", + "ws_url": "wss://engine.my.techi.be" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/my.techi.be", + "version": 5 }, { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gt.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "custom_domain": null, - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/gt.celo", - "version": 5 + "community": { + "name": "Regens Unite", + "description": "A community currency for the Regens Unite community.", + "url": "https://www.regensunite.earth/", + "alias": "wallet.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "custom_domain": "wallet.regensunite.earth", + "hidden": true, + "profile": { + "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "Regens Unite Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "RGN", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 137, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.regensunite.earth", + "version": 5 }, { - "community": { - "name": "Celo Euro", - "description": "Celo Euro is a stablecoin for the Celo Community.", - "url": "https://celo.org/", - "alias": "ceur.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { - "standard": "erc20", - "name": "Celo Euro", - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "symbol": "cEUR", - "decimals": 18, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { - "chain_id": 42220, - "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", - "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/ceur.celo", - "version": 5 + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gt.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "custom_domain": null, + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/gt.celo", + "version": 5 }, { - "community": { - "name": "EUR e-money", - "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", - "url": "https://monerium.com/tokens/", - "alias": "eure.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", - "hidden": true, - "profile": { - "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { - "standard": "erc20", - "name": "EUR emoney", - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "symbol": "EURe", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { - "chain_id": 137, - "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", - "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", - "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/eure.polygon", - "version": 5 + "community": { + "name": "Celo Euro", + "description": "Celo Euro is a stablecoin for the Celo Community.", + "url": "https://celo.org/", + "alias": "ceur.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { + "standard": "erc20", + "name": "Celo Euro", + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "symbol": "cEUR", + "decimals": 18, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/ceur.celo", + "version": 5 }, { - "community": { - "name": "USDC on Polygon", - "description": "The community of people using USDC on Polygon.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "app", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "chain_id": 137 - }, - "primary_token": { - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "symbol": "USDC", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { - "chain_id": 137, - "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", - "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", - "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/app", - "version": 5 + "community": { + "name": "EUR e-money", + "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", + "url": "https://monerium.com/tokens/", + "alias": "eure.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", + "hidden": true, + "profile": { + "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { + "standard": "erc20", + "name": "EUR emoney", + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "symbol": "EURe", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { + "chain_id": 137, + "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.polygon", + "version": 5 }, { - "community": { - "name": "USDC on Base", - "description": "The community of people using USDC on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "usdc.base", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "symbol": "USDC", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { - "chain_id": 8453, - "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - }, - "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 8453, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/usdc.base", - "version": 5 + "community": { + "name": "USDC on Polygon", + "description": "The community of people using USDC on Polygon.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "app", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "chain_id": 137 + }, + "primary_token": { + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "symbol": "USDC", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { + "chain_id": 137, + "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/app", + "version": 5 }, { - "community": { - "name": "OAK Community", - "description": "A community currency for the city of Oakland.", - "url": "https://www.oak.community/", - "alias": "wallet.oak.community", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", - "custom_domain": "wallet.oak.community", - "hidden": true, - "profile": { - "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { - "standard": "erc20", - "name": "OAK Community Currency", - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "symbol": "OAK", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 8453, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x123", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg" - }, - "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 8453, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x123", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.oak.community", - "version": 5 + "community": { + "name": "USDC on Base", + "description": "The community of people using USDC on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "usdc.base", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "symbol": "USDC", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { + "chain_id": 8453, + "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/usdc.base", + "version": 5 }, { - "community": { - "name": "Stable Coin", - "description": "SBC is a digital dollar stablecoin issued by Brale", - "url": "https://brale.xyz/", - "alias": "sbc.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", - "hidden": true, - "profile": { - "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "chain_id": 137 - }, - "primary_token": { - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { - "standard": "erc20", - "name": "Stable Coin", - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "symbol": "SBC", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { - "chain_id": 137, - "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", - "paymaster_address": "0x123", - "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", - "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x123", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/sbc.polygon", - "version": 5 + "community": { + "name": "OAK Community", + "description": "A community currency for the city of Oakland.", + "url": "https://www.oak.community/", + "alias": "wallet.oak.community", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", + "custom_domain": "wallet.oak.community", + "hidden": true, + "profile": { + "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { + "standard": "erc20", + "name": "OAK Community Currency", + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "symbol": "OAK", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 8453, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x123", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg" + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.oak.community", + "version": 5 }, { - "community": { - "name": "Zinne.brussels", - "description": "A community currency for the city of Brussels", - "url": "https://zinne.brussels", - "alias": "zinne", - "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", - "hidden": true, - "profile": { - "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", - "chain_id": 137 - }, - "primary_token": { - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { - "standard": "erc20", - "name": "Zinne.brussels Token", - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "symbol": "ZINNE", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { - "chain_id": 137, - "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", - "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", - "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", - "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/zinne", - "version": 5 + "community": { + "name": "Stable Coin", + "description": "SBC is a digital dollar stablecoin issued by Brale", + "url": "https://brale.xyz/", + "alias": "sbc.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", + "hidden": true, + "profile": { + "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "chain_id": 137 + }, + "primary_token": { + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { + "standard": "erc20", + "name": "Stable Coin", + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "symbol": "SBC", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { + "chain_id": 137, + "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", + "paymaster_address": "0x123", + "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/sbc.polygon", + "version": 5 }, { - "community": { - "name": "Regens Unite Time Bank", - "description": "Make time to regen", - "url": "https://regensunite.earth", - "alias": "timebank.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "hidden": true, - "profile": { - "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x186DaBD027e228C988777907465807FDab270894", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x186DaBD027e228C988777907465807FDab270894": { - "standard": "erc20", - "name": "Regen Hour", - "address": "0x186DaBD027e228C988777907465807FDab270894", - "symbol": "rHour", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x39b77d77f7677997871b304094a05295eb71e240": { - "chain_id": 42220, - "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", - "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", - "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/timebank.regensunite.earth", - "version": 5 + "community": { + "name": "Zinne.brussels", + "description": "A community currency for the city of Brussels", + "url": "https://zinne.brussels", + "alias": "zinne", + "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", + "hidden": true, + "profile": { + "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", + "chain_id": 137 + }, + "primary_token": { + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { + "standard": "erc20", + "name": "Zinne.brussels Token", + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "symbol": "ZINNE", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { + "chain_id": 137, + "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/zinne", + "version": 5 }, { - "community": { - "name": "MOOS Token", - "description": "A community currency for MOOS.", - "url": "https://www.moos.garden/", - "alias": "moos", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", - "hidden": true, - "profile": { - "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { - "standard": "erc20", - "name": "MOOS Token", - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "symbol": "MOOS", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { - "chain_id": 42220, - "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", - "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", - "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", - "url": "https://marketplace.citizenwallet.xyz/moos", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/moos", - "version": 5 + "community": { + "name": "Regens Unite Time Bank", + "description": "Make time to regen", + "url": "https://regensunite.earth", + "alias": "timebank.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "hidden": true, + "profile": { + "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x186DaBD027e228C988777907465807FDab270894", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x186DaBD027e228C988777907465807FDab270894": { + "standard": "erc20", + "name": "Regen Hour", + "address": "0x186DaBD027e228C988777907465807FDab270894", + "symbol": "rHour", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x39b77d77f7677997871b304094a05295eb71e240": { + "chain_id": 42220, + "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/timebank.regensunite.earth", + "version": 5 }, { - "community": { - "name": "Bonne Heure", - "description": "Système d'Échange Local de Villers-la-Ville", - "url": "https://selcoupdepouce.be", - "alias": "selcoupdepouce", - "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", - "hidden": true, - "profile": { - "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { - "standard": "erc20", - "name": "Bonne Heure", - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "symbol": "BHR", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { - "chain_id": 42220, - "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", - "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", - "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", - "launch_mode": "browser", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/selcoupdepouce", - "version": 5 + "community": { + "name": "MOOS Token", + "description": "A community currency for MOOS.", + "url": "https://www.moos.garden/", + "alias": "moos", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", + "hidden": true, + "profile": { + "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { + "standard": "erc20", + "name": "MOOS Token", + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "symbol": "MOOS", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { + "chain_id": 42220, + "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", + "url": "https://marketplace.citizenwallet.xyz/moos", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/moos", + "version": 5 }, { - "community": { - "name": "CI token", - "description": "Monnaie locale du Cercle Informatique de l’ULB", - "url": "https://citizenwallet.xyz/cit", - "alias": "cit.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", - "hidden": true, - "profile": { - "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { - "standard": "erc20", - "name": "CI token", - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "symbol": "CIT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { - "chain_id": 42220, - "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", - "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", - "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/cit.celo", - "version": 5 + "community": { + "name": "Bonne Heure", + "description": "Système d'Échange Local de Villers-la-Ville", + "url": "https://selcoupdepouce.be", + "alias": "selcoupdepouce", + "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", + "hidden": true, + "profile": { + "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { + "standard": "erc20", + "name": "Bonne Heure", + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "symbol": "BHR", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { + "chain_id": 42220, + "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", + "launch_mode": "browser", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/selcoupdepouce", + "version": 5 }, { - "community": { - "name": "Wolugo", - "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", - "url": "https://wolugo.be", - "alias": "wallet.wolugo.be", - "custom_domain": "wallet.wolugo.be", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", - "theme": { - "primary": "#81e2c1" - }, - "hidden": true, - "profile": { - "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "card_factory": { - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { - "standard": "erc20", - "name": "Wolu", - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "symbol": "WOLU", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { - "chain_id": 42220, - "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", - "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", - "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "cards": { - "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { - "chain_id": 42220, - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "type": "classic" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.wolugo.be", - "version": 5 + "community": { + "name": "CI token", + "description": "Monnaie locale du Cercle Informatique de l’ULB", + "url": "https://citizenwallet.xyz/cit", + "alias": "cit.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", + "hidden": true, + "profile": { + "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { + "standard": "erc20", + "name": "CI token", + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "symbol": "CIT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { + "chain_id": 42220, + "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/cit.celo", + "version": 5 }, { - "community": { - "name": "Woluwe Test", - "description": "Local currency for the Woluwe Test community.", - "url": "https://wollet-v2.citizenwallet.net/token", - "alias": "wtc.celo", - "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", - "hidden": true, - "profile": { - "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { - "standard": "erc20", - "name": "Woluwe Test Coin", - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "symbol": "WTC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xE79E19594A749330036280c685E2719d58d99052": { - "chain_id": 42220, - "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", - "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wtc.celo", - "version": 5 + "community": { + "name": "Wolugo", + "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", + "url": "https://wolugo.be", + "alias": "wallet.wolugo.be", + "custom_domain": "wallet.wolugo.be", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", + "theme": { + "primary": "#81e2c1" + }, + "hidden": true, + "profile": { + "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "card_factory": { + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { + "standard": "erc20", + "name": "Wolu", + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "symbol": "WOLU", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { + "chain_id": 42220, + "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { + "chain_id": 42220, + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.wolugo.be", + "version": 5 }, { - "community": { - "name": "ETHGlobal London Token", - "description": "The community of people using ETHLDN on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "testnet-ethldn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", - "hidden": true, - "profile": { - "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", - "chain_id": 84532 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 84532 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 84532 - } - }, - "tokens": { - "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "ETHGlobal London Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "ETHLDN", - "decimals": 6, - "chain_id": 84532 - } - }, - "scan": { - "url": "https://sepolia.basescan.org", - "name": "Base Sepolia Explorer" - }, - "accounts": { - "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { - "chain_id": 84532, - "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", - "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", - "paymaster_type": "cw" - }, - "84532:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 84532, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "84532": { - "id": 84532, - "node": { - "url": "https://84532.engine.citizenwallet.xyz", - "ws_url": "wss://84532.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/testnet-ethldn", - "version": 5 + "community": { + "name": "Woluwe Test", + "description": "Local currency for the Woluwe Test community.", + "url": "https://wollet-v2.citizenwallet.net/token", + "alias": "wtc.celo", + "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", + "hidden": true, + "profile": { + "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { + "standard": "erc20", + "name": "Woluwe Test Coin", + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "symbol": "WTC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xE79E19594A749330036280c685E2719d58d99052": { + "chain_id": 42220, + "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wtc.celo", + "version": 5 }, { - "community": { - "name": "Celo Community Point", - "description": "This is a community for the Celo Point", - "url": "https://citizenwallet.xyz", - "alias": "celo-c.citizenwallet.xyz", - "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", - "hidden": true, - "profile": { - "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { - "standard": "erc20", - "name": "Celo Community Point", - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "symbol": "CeloC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { - "chain_id": 42220, - "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", - "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", - "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/celo-c.citizenwallet.xyz", - "version": 5 + "community": { + "name": "ETHGlobal London Token", + "description": "The community of people using ETHLDN on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "testnet-ethldn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", + "hidden": true, + "profile": { + "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", + "chain_id": 84532 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 84532 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 84532 + } + }, + "tokens": { + "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "ETHGlobal London Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "ETHLDN", + "decimals": 6, + "chain_id": 84532 + } + }, + "scan": { + "url": "https://sepolia.basescan.org", + "name": "Base Sepolia Explorer" + }, + "accounts": { + "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { + "chain_id": 84532, + "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "paymaster_type": "cw" + }, + "84532:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 84532, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "84532": { + "id": 84532, + "node": { + "url": "https://84532.engine.citizenwallet.xyz", + "ws_url": "wss://84532.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/testnet-ethldn", + "version": 5 }, { - "community": { - "name": "KFMEDIA℠", - "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", - "url": "https://kingfishersmedia.io", - "alias": "wallet.kingfishersmedia.io", - "custom_domain": "wallet.kingfishersmedia.io", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", - "theme": { - "primary": "#88292c" - }, - "profile": { - "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { - "standard": "erc1155", - "name": "KFMEDIA℠ Pathways for LATAM™", - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "symbol": "KFMPFL", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", - "version": 5 + "community": { + "name": "Celo Community Point", + "description": "This is a community for the Celo Point", + "url": "https://citizenwallet.xyz", + "alias": "celo-c.citizenwallet.xyz", + "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", + "hidden": true, + "profile": { + "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { + "standard": "erc20", + "name": "Celo Community Point", + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "symbol": "CeloC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { + "chain_id": 42220, + "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/celo-c.citizenwallet.xyz", + "version": 5 + }, + { + "community": { + "name": "KFMEDIA℠", + "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", + "url": "https://kingfishersmedia.io", + "alias": "wallet.kingfishersmedia.io", + "custom_domain": "wallet.kingfishersmedia.io", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", + "theme": { + "primary": "#88292c" + }, + "profile": { + "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { + "standard": "erc1155", + "name": "KFMEDIA℠ Pathways for LATAM™", + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "symbol": "KFMPFL", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", + "version": 5 } -] \ No newline at end of file +] diff --git a/assets/config/v5/communities.test.json b/assets/config/v5/communities.test.json index 053f16fb..1ba386bf 100644 --- a/assets/config/v5/communities.test.json +++ b/assets/config/v5/communities.test.json @@ -1,2238 +1,2291 @@ [ { - "community": { - "name": "Citizen Wallet (CTZN)", - "description": "The token powering the Citizen Wallet economy.", - "url": "https://citizenwallet.xyz", - "alias": "ctzn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "theme": { - "primary": "#9563D3" - }, - "profile": { - "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", - "chain_id": 137 - }, - "primary_token": { - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { - "standard": "erc20", - "name": "Citizen Wallet", - "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", - "symbol": "CTZN", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://citizenwallet.xyz/pay-with-ctzn", - "launch_mode": "browser" - }, - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", - "url": "https://my.citizenwallet.xyz/onramp", - "action": "topup", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/ctzn", - "version": 5 + "community": { + "name": "Citizen Wallet (CTZN)", + "description": "The token powering the Citizen Wallet economy.", + "url": "https://citizenwallet.xyz", + "alias": "ctzn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "theme": { + "primary": "#9563D3" + }, + "profile": { + "address": "0x8dA817724Eb6A2aA47c0F8d8b8A98b9B3C2Ddb68", + "chain_id": 137 + }, + "primary_token": { + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 + } + }, + "tokens": { + "137:0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607": { + "standard": "erc20", + "name": "Citizen Wallet", + "address": "0x0D9B0790E97e3426C161580dF4Ee853E4A7C4607", + "symbol": "CTZN", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3A3E25871c5C6C84D5f397829FF316a37F7FD596", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://citizenwallet.xyz/pay-with-ctzn", + "launch_mode": "browser" + }, + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/ctzn.svg", + "url": "https://my.citizenwallet.xyz/onramp", + "action": "topup", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/ctzn", + "version": 5 }, { - "community": { - "name": "Brussels Pay", - "description": "A community for the city of Brussels", - "url": "https://pay.brussels", - "alias": "wallet.pay.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "custom_domain": "wallet.pay.brussels", - "hidden": false, - "theme": { - "primary": "#4a90e2" - }, - "profile": { - "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", - "chain_id": 100 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "pay.brussels", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "EURb", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { - "chain_id": 100, - "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", - "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", - "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_type": "cw" - }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "cards": { - "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { - "chain_id": 100, - "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "type": "classic" - }, - "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 100, - "instance_id": "brussels-pay", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.pay.brussels", - "ws_url": "wss://engine.pay.brussels" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Top Up", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", - "url": "https://checkout.pay.brussels/topup", - "action": "topup", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", - "version": 5 + "community": { + "name": "Brussels Pay", + "description": "A community for the city of Brussels", + "url": "https://pay.brussels", + "alias": "wallet.pay.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "custom_domain": "wallet.pay.brussels", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x56Cc38bDa01bE6eC6D854513C995f6621Ee71229", + "chain_id": 100 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "pay.brussels", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "EURb", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE": { + "chain_id": 100, + "entrypoint_address": "0xAAEb9DC18aDadae9b3aE7ec2b47842565A81113f", + "paymaster_address": "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F", + "account_factory_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_type": "cw" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x8fc2e97671C691e7Ff7B42e5c7cCbDD38fC8B729", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "100:0x1EaF6B6A6967608aF6c77224f087b042095891EB": { + "chain_id": 100, + "address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "type": "classic" + }, + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "brussels-pay", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.pay.brussels", + "ws_url": "wss://engine.pay.brussels" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Top Up", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/wallet.pay.brussels.png", + "url": "https://checkout.pay.brussels/topup", + "action": "topup", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.pay.brussels", + "version": 5 }, { - "community": { - "name": "Monerium EURe on Gnosis", - "description": "A community for EURe on Gnosis", - "url": "https://monerium.com/", - "alias": "eure.gnosis", - "logo": "https://eure.gnosis.citizenwallet.xyz/wallet-config/_images/eure.svg", - "custom_domain": "eure.gnosis.citizenwallet.xyz", - "hidden": false, - "theme": { - "primary": "#4a90e2" - }, - "profile": { - "address": "0x2e297B9ef4df73c8da5070E91EF0570FA312A698", - "chain_id": 100 - }, - "primary_token": { - "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430": { - "standard": "erc20", - "name": "EURe [Gnosis]", - "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", - "symbol": "EURe", - "decimals": 18, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xeBDd6ee8DB7055f62D14A5eAAB7c18ae36Cd2216", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "cards": { - "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 100, - "instance_id": "cw-discord-1", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/eure.gnosis", - "version": 5 + "community": { + "name": "Monerium EURe on Gnosis", + "description": "A community for EURe on Gnosis", + "url": "https://monerium.com/", + "alias": "eure.gnosis", + "logo": "https://eure.gnosis.citizenwallet.xyz/wallet-config/_images/eure.svg", + "custom_domain": "eure.gnosis.citizenwallet.xyz", + "hidden": false, + "theme": { + "primary": "#4a90e2" + }, + "profile": { + "address": "0x2e297B9ef4df73c8da5070E91EF0570FA312A698", + "chain_id": 100 + }, + "primary_token": { + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430": { + "standard": "erc20", + "name": "EURe [Gnosis]", + "address": "0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", + "symbol": "EURe", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xeBDd6ee8DB7055f62D14A5eAAB7c18ae36Cd2216", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "cards": { + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 100, + "instance_id": "cw-discord-1", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.gnosis", + "version": 5 }, { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token of gratitude.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gratitude", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "theme": { - "primary": "#4EC19D" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/gratitude", - "version": 5 + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token of gratitude.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gratitude", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "theme": { + "primary": "#4EC19D" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF05ba2641b31AF70c2678e3324eD8b9C53093FbE", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/gratitude", + "version": 5 }, { - "community": { - "name": "SFLUV Community", - "description": "A community currency for the city of San Francisco.", - "url": "https://sfluv.org", - "alias": "wallet.sfluv.org", - "custom_domain": "wallet.sfluv.org", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "theme": { - "primary": "#eb6c6c" - }, - "profile": { - "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "chain_id": 137 - }, - "primary_token": { - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { - "standard": "erc20", - "name": "SFLUV V1.1", - "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", - "symbol": "SFLUV", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { - "chain_id": 137, - "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", - "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", - "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", - "paymaster_address": "0x5097dAD831FE21EF12dA31bf5d07A2e8ef6f5f1e", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", - "url": "https://app.sfluv.org", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.sfluv.org", - "version": 5 + "community": { + "name": "SFLUV Community", + "description": "A community currency for the city of San Francisco.", + "url": "https://sfluv.org", + "alias": "wallet.berachain.sfluv.org", + "custom_domain": "wallet.sfluv.org", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "theme": { + "primary": "#eb6c6c" + }, + "profile": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 80094 + }, + "primary_token": { + "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", + "chain_id": 80094 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 80094 + } + }, + "tokens": { + "80094:0x881cad4f885c6701d8481c0ed347f6d35444ea7e": { + "standard": "erc20", + "name": "SFLUV V1.1", + "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", + "symbol": "SFLUV", + "decimals": 18, + "chain_id": 80094 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "80094:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 80094, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9A5be02B65f9Aa00060cB8c951dAFaBAB9B860cd", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "80094": { + "id": 80094, + "node": { + "url": "https://80094.engine.citizenwallet.xyz", + "ws_url": "wss://80094.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "url": "https://app.sfluv.org", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", + "version": 4 }, { - "community": { - "name": "Txirrin", - "description": "A community for Txirrin", - "url": "https://citizenwallet.xyz/txirrin", - "alias": "txirrin", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", - "hidden": false, - "theme": { - "primary": "#FB7502" - }, - "profile": { - "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", - "chain_id": 100 - }, - "primary_token": { - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { - "standard": "erc20", - "name": "Txirrin", - "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", - "symbol": "TXI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/txirrin", - "version": 5 + "community": { + "name": "SFLUV Community (Polygon)", + "description": "A community currency for the city of San Francisco.", + "url": "https://sfluv.org", + "alias": "wallet.sfluv.org", + "custom_domain": "wallet.polygon.sfluv.org", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "theme": { + "primary": "#eb6c6c" + }, + "profile": { + "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "chain_id": 137 + }, + "primary_token": { + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "chain_id": 137 + } + }, + "tokens": { + "137:0x58a2993A618Afee681DE23dECBCF535A58A080BA": { + "standard": "erc20", + "name": "SFLUV V1.1", + "address": "0x58a2993A618Afee681DE23dECBCF535A58A080BA", + "symbol": "SFLUV", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5e987a6c4bb4239d498E78c34e986acf29c81E8e": { + "chain_id": 137, + "entrypoint_address": "0x2d01C5E40Aa6a8478eD0FFbF2784EBb9bf67C46A", + "paymaster_address": "0x7FC98D0a2bd7f766bAca37388eB0F6Db37666B33", + "account_factory_address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", + "paymaster_type": "cw" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "About", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "url": "https://app.sfluv.org", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", + "version": 4 }, { - "community": { - "name": "Bolivia Pay", - "description": "A community for Ethereum Bolivia.", - "url": "https://www.ethereumbolivia.org", - "alias": "boliviapay", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", - "theme": { - "primary": "#009393" - }, - "profile": { - "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", - "chain_id": 137 - }, - "primary_token": { - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 137 - } - }, - "tokens": { - "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { - "standard": "erc20", - "name": "(PoS) Tether USD", - "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", - "symbol": "USDT", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 137, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/boliviapay", - "version": 5 + "community": { + "name": "Txirrin", + "description": "A community for Txirrin", + "url": "https://citizenwallet.xyz/txirrin", + "alias": "txirrin", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/txirrin.png", + "hidden": false, + "theme": { + "primary": "#FB7502" + }, + "profile": { + "address": "0xd47f7198bf335bfe66dD29C0f3EeEf0cFE9D05D8", + "chain_id": 100 + }, + "primary_token": { + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x6c6611244547a6E9AaCfBA8744115ca1076756fc": { + "standard": "erc20", + "name": "Txirrin", + "address": "0x6c6611244547a6E9AaCfBA8744115ca1076756fc", + "symbol": "TXI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x33500E7Eb3452421e56c2f4117530B1C4C85E0A5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/txirrin", + "version": 5 }, { - "community": { - "name": "Breadchain Community Token", - "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", - "url": "https://breadchain.xyz/", - "alias": "bread", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "profile": { - "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", - "chain_id": 100 - }, - "primary_token": { - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { - "standard": "erc20", - "name": "Breadchain Community Token", - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", - "symbol": "BREAD", - "decimals": 18, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { - "chain_id": 100, - "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", - "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_type": "cw" - }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://100.engine.citizenwallet.xyz", - "ws_url": "wss://100.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://marketplace.citizenwallet.xyz/bread", - "launch_mode": "webview", - "signature": true - }, - { - "name": "Breadcon 2025 Faucet", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://faucet.citizenwallet.xyz/breadcon2025", - "launch_mode": "webview", - "signature": true, - "hidden": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/bread", - "version": 5 + "community": { + "name": "Bolivia Pay", + "description": "A community for Ethereum Bolivia.", + "url": "https://www.ethereumbolivia.org", + "alias": "boliviapay", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/boliviapay.png", + "theme": { + "primary": "#009393" + }, + "profile": { + "address": "0x898C2737f2Cb52622711A89D85A1D5E0B881BDeA", + "chain_id": 137 + }, + "primary_token": { + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 + } + }, + "tokens": { + "137:0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "standard": "erc20", + "name": "(PoS) Tether USD", + "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "symbol": "USDT", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x9a81Bd50D56485Cc863Ecb169812c7a821996C8c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/boliviapay", + "version": 5 }, { - "community": { - "name": "Commons Hub Brussels", - "description": "Community Token for the Commons Hub Brussels community", - "url": "https://commonshub.brussels", - "alias": "wallet.commonshub.brussels", - "custom_domain": "wallet.commonshub.brussels", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", - "theme": { - "primary": "#ff4c02" - }, - "profile": { - "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { - "standard": "erc20", - "name": "Commons Hub Token", - "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", - "symbol": "CHT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { - "chain_id": 42220, - "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", - "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", - "paymaster_address": "0x4860C0f127500F0cbF4a5Bd797cBb5aA50Eb0FbA", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "cards": { - "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { - "chain_id": 42220, - "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", - "type": "classic" - } - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.commonshub.brussels", - "version": 5 + "community": { + "name": "Breadchain Community Token", + "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", + "url": "https://breadchain.xyz/", + "alias": "bread", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "profile": { + "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", + "chain_id": 100 + }, + "primary_token": { + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { + "standard": "erc20", + "name": "Breadchain Community Token", + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "symbol": "BREAD", + "decimals": 18, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { + "chain_id": 100, + "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", + "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_type": "cw" + }, + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://marketplace.citizenwallet.xyz/bread", + "launch_mode": "webview", + "signature": true + }, + { + "name": "Breadcon 2025 Faucet", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "url": "https://faucet.citizenwallet.xyz/breadcon2025", + "launch_mode": "webview", + "signature": true, + "hidden": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/bread", + "version": 5 }, { - "community": { - "name": "Sel de Salm", - "description": "La communauté de Sel de Salm", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "alias": "seldesalm", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "theme": { - "primary": "#6B5CA4" - }, - "profile": { - "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_card_manager": { - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { - "standard": "erc20", - "name": "Myrtille", - "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", - "symbol": "MYRT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "cards": { - "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { - "chain_id": 42220, - "instance_id": "cw-seldesalm", - "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", - "type": "safe" - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Informations Générales", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", - "launch_mode": "webview" - }, - { - "name": "Échanges", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", - "url": "https://marketplace.citizenwallet.xyz/seldesalm", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/seldesalm", - "version": 5 + "community": { + "name": "Commons Hub Brussels", + "description": "Community Token for the Commons Hub Brussels community", + "url": "https://commonshub.brussels", + "alias": "wallet.commonshub.brussels", + "custom_domain": "wallet.commonshub.brussels", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/chb.png", + "theme": { + "primary": "#ff4c02" + }, + "profile": { + "address": "0xc06bE1BbbeEAF2f34F3d5b76069D2560aee184Ae", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x65DD32834927de9E57E72a3E2130a19f81C6371D": { + "standard": "erc20", + "name": "Commons Hub Token", + "address": "0x65DD32834927de9E57E72a3E2130a19f81C6371D", + "symbol": "CHT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4E127A1DAa66568B4a91E8c5615120a6Ea5442E3", + "account_factory_address": "0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xb7608dDA592d319687C89c4479e320b5a7740117", + "paymaster_address": "0x4860C0f127500F0cbF4a5Bd797cBb5aA50Eb0FbA", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "cards": { + "42220:0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570": { + "chain_id": 42220, + "address": "0xc0F9e0907C8de79fd5902b61e463dFEdc5dc8570", + "type": "classic" + } + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/wallet.commonshub.brussels", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.commonshub.brussels", + "version": 5 }, { - "community": { - "name": "TECHI", - "description": "A community for TECHI users", - "url": "https://my.techi.be", - "alias": "my.techi.be", - "logo": "https://my.techi.be/assets/token.svg", - "hidden": false, - "theme": { - "primary": "#617FF8" - }, - "profile": { - "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", - "chain_id": 100 - }, - "primary_token": { - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "chain_id": 100 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 100 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 100 - } - }, - "tokens": { - "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { - "standard": "erc20", - "name": "TECHI", - "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", - "symbol": "TECHI", - "decimals": 6, - "chain_id": 100 - } - }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, - "accounts": { - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 100, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "100": { - "id": 100, - "node": { - "url": "https://engine.my.techi.be", - "ws_url": "wss://engine.my.techi.be" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/my.techi.be", - "version": 5 + "community": { + "name": "Sel de Salm", + "description": "La communauté de Sel de Salm", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "alias": "seldesalm", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "theme": { + "primary": "#6B5CA4" + }, + "profile": { + "address": "0x4083724953cC1cC13e76b436149B2b1e1a3E5970", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2": { + "standard": "erc20", + "name": "Myrtille", + "address": "0x83DfEB42347a7Ce46F1497F307a5c156D1f19CB2", + "symbol": "MYRT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xd07412020dA5054c3b49f47Ca61224637F1703af", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "cards": { + "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 42220, + "instance_id": "cw-seldesalm", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Informations Générales", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://citizenwallet.xyz/community-currency-documentation/sel-de-salm", + "launch_mode": "webview" + }, + { + "name": "Échanges", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/myrt.png", + "url": "https://marketplace.citizenwallet.xyz/seldesalm", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/seldesalm", + "version": 5 }, { - "community": { - "name": "Regens Unite", - "description": "A community currency for the Regens Unite community.", - "url": "https://www.regensunite.earth/", - "alias": "wallet.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "custom_domain": "wallet.regensunite.earth", - "hidden": true, - "profile": { - "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "Regens Unite Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "RGN", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 137, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg", - "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.regensunite.earth", - "version": 5 + "community": { + "name": "TECHI", + "description": "A community for TECHI users", + "url": "https://my.techi.be", + "alias": "my.techi.be", + "logo": "https://my.techi.be/assets/token.svg", + "hidden": false, + "theme": { + "primary": "#617FF8" + }, + "profile": { + "address": "0x80C141861607b8FEfD53C9E71a9c7D2D3e2e76dc", + "chain_id": 100 + }, + "primary_token": { + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 + } + }, + "tokens": { + "100:0x01D0E7117510b371Ac38f52Cc6689ff8875280FA": { + "standard": "erc20", + "name": "TECHI", + "address": "0x01D0E7117510b371Ac38f52Cc6689ff8875280FA", + "symbol": "TECHI", + "decimals": 6, + "chain_id": 100 + } + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x68c5a20f233264DB124a3c95a200bbD20b3b9762", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://engine.my.techi.be", + "ws_url": "wss://engine.my.techi.be" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/my.techi.be", + "version": 5 }, { - "community": { - "name": "Gratitude Token", - "description": "Express your gratitude towards someone by sending them a token.", - "url": "https://citizenwallet.xyz/gratitude", - "alias": "gt.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", - "custom_domain": null, - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { - "standard": "erc20", - "name": "Gratitude Token", - "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", - "symbol": "GT", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", - "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/gt.celo", - "version": 5 + "community": { + "name": "Regens Unite", + "description": "A community currency for the Regens Unite community.", + "url": "https://www.regensunite.earth/", + "alias": "wallet.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "custom_domain": "wallet.regensunite.earth", + "hidden": true, + "profile": { + "address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "Regens Unite Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "RGN", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 137, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x250711045d58b6310f0635C7D110BFe663cE1da5", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.regensunite.earth", + "version": 5 }, { - "community": { - "name": "Celo Euro", - "description": "Celo Euro is a stablecoin for the Celo Community.", - "url": "https://celo.org/", - "alias": "ceur.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", - "hidden": true, - "theme": { - "primary": "#a256ff" - }, - "profile": { - "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { - "standard": "erc20", - "name": "Celo Euro", - "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", - "symbol": "cEUR", - "decimals": 18, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { - "chain_id": 42220, - "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", - "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", - "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/ceur.celo", - "version": 5 + "community": { + "name": "Gratitude Token", + "description": "Express your gratitude towards someone by sending them a token.", + "url": "https://citizenwallet.xyz/gratitude", + "alias": "gt.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/gt.svg", + "custom_domain": null, + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0xEEc0F3257369c6bCD2Fd8755CbEf8A95b12Bc4c9", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1": { + "standard": "erc20", + "name": "Gratitude Token", + "address": "0x5815E61eF72c9E6107b5c5A05FD121F334f7a7f1", + "symbol": "GT", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x985ec7d08D9d15Ea79876E35FAdEFD58A627187E", + "paymaster_address": "0x8dd43eE72f6A816b8eB0411B712D96cDd95246d8", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/gt.celo", + "version": 5 }, { - "community": { - "name": "EUR e-money", - "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", - "url": "https://monerium.com/tokens/", - "alias": "eure.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", - "hidden": true, - "profile": { - "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", - "chain_id": 137 - }, - "primary_token": { - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { - "standard": "erc20", - "name": "EUR emoney", - "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", - "symbol": "EURe", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { - "chain_id": 137, - "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", - "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", - "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/eure.polygon", - "version": 5 + "community": { + "name": "Celo Euro", + "description": "Celo Euro is a stablecoin for the Celo Community.", + "url": "https://celo.org/", + "alias": "ceur.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/ceur.svg", + "hidden": true, + "theme": { + "primary": "#a256ff" + }, + "profile": { + "address": "0x0334C579E61aF6922D5deFEF02A361FBb2D6f406", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73": { + "standard": "erc20", + "name": "Celo Euro", + "address": "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73", + "symbol": "cEUR", + "decimals": 18, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0xdA529eBEd3D459dac9d9D3D45b8Cae2D5796c098", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0xc3142BCBA2285d0a48A38e7Ea9Cbf28a12B235bB", + "paymaster_address": "0xedbEA8c0F25B34510149EaD4f72867B0d3D2264F", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/ceur.celo", + "version": 5 }, { - "community": { - "name": "USDC on Polygon", - "description": "The community of people using USDC on Polygon.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "app", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "chain_id": 137 - }, - "primary_token": { - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", - "symbol": "USDC", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { - "chain_id": 137, - "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", - "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", - "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/app", - "version": 5 + "community": { + "name": "EUR e-money", + "description": "Token by Monerium EMI, a regulated entity, licensed in the EEA.", + "url": "https://monerium.com/tokens/", + "alias": "eure.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/eure.svg", + "hidden": true, + "profile": { + "address": "0xF5F7317EDb8E88CaE09071B0C4F0fd6EA20B21f9", + "chain_id": 137 + }, + "primary_token": { + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6": { + "standard": "erc20", + "name": "EUR emoney", + "address": "0x18ec0A6E18E5bc3784fDd3a3634b31245ab704F6", + "symbol": "EURe", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616": { + "chain_id": 137, + "entrypoint_address": "0x2027Bde7C276D5F128587E3107c68A488ee31c72", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x5bA08d9fC7b90f79B2b856bdB09FC9EB32e83616", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB2cb6b75C2357Ca94dBdF58897E468E45fAC83Ec", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/eure.polygon", + "version": 5 }, { - "community": { - "name": "USDC on Base", - "description": "The community of people using USDC on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "usdc.base", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", - "hidden": true, - "theme": { - "primary": "#0052ff" - }, - "profile": { - "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { - "standard": "erc20", - "name": "USD Coin", - "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - "symbol": "USDC", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { - "chain_id": 8453, - "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", - "paymaster_type": "cw", - "gas_extra_percentage": 50 - }, - "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 8453, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/usdc.base", - "version": 5 + "community": { + "name": "USDC on Polygon", + "description": "The community of people using USDC on Polygon.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "app", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "chain_id": 137 + }, + "primary_token": { + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "symbol": "USDC", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x270758454C012A1f51428b68aE473D728CCdFe88": { + "chain_id": 137, + "entrypoint_address": "0x466AA6ed2B7Bb829841F5aAEA9e82B840eC0feF9", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x270758454C012A1f51428b68aE473D728CCdFe88", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xB5D1C0167E6325466E2918e9fda8cc41384C0291", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/app", + "version": 5 }, { - "community": { - "name": "OAK Community", - "description": "A community currency for the city of Oakland.", - "url": "https://www.oak.community/", - "alias": "wallet.oak.community", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", - "custom_domain": "wallet.oak.community", - "hidden": true, - "profile": { - "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", - "chain_id": 8453 - }, - "primary_token": { - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "chain_id": 8453 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 8453 - } - }, - "tokens": { - "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { - "standard": "erc20", - "name": "OAK Community Currency", - "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", - "symbol": "OAK", - "decimals": 6, - "chain_id": 8453 - } - }, - "scan": { - "url": "https://basescan.org", - "name": "Base Explorer" - }, - "accounts": { - "8453:0x9406Cc6185a346906296840746125a0E44976454": { - "chain_id": 8453, - "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "paymaster_address": "0x123", - "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", - "paymaster_type": "payg" - }, - "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 8453, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x123", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "8453": { - "id": 8453, - "node": { - "url": "https://8453.engine.citizenwallet.xyz", - "ws_url": "wss://8453.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.oak.community", - "version": 5 + "community": { + "name": "USDC on Base", + "description": "The community of people using USDC on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "usdc.base", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/usdc.svg", + "hidden": true, + "theme": { + "primary": "#0052ff" + }, + "profile": { + "address": "0x51Ef5Add405CCF63c206A80AF8c2B3cEE0282830", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { + "standard": "erc20", + "name": "USD Coin", + "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "symbol": "USDC", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99": { + "chain_id": 8453, + "entrypoint_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", + "paymaster_type": "cw", + "gas_extra_percentage": 50 + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xA63DFccB8a39a3DFE4479b33190b12019Ee594E7", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/usdc.base", + "version": 5 }, { - "community": { - "name": "Stable Coin", - "description": "SBC is a digital dollar stablecoin issued by Brale", - "url": "https://brale.xyz/", - "alias": "sbc.polygon", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", - "hidden": true, - "profile": { - "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "chain_id": 137 - }, - "primary_token": { - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { - "standard": "erc20", - "name": "Stable Coin", - "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", - "symbol": "SBC", - "decimals": 18, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { - "chain_id": 137, - "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", - "paymaster_address": "0x123", - "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", - "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x123", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/sbc.polygon", - "version": 5 + "community": { + "name": "OAK Community", + "description": "A community currency for the city of Oakland.", + "url": "https://www.oak.community/", + "alias": "wallet.oak.community", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/oak.svg", + "custom_domain": "wallet.oak.community", + "hidden": true, + "profile": { + "address": "0xFE213c74e25505B232CE4C7f89647408bE6f71d2", + "chain_id": 8453 + }, + "primary_token": { + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "chain_id": 8453 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 8453 + } + }, + "tokens": { + "8453:0x845598Da418890a674cbaBA26b70807aF0c61dFE": { + "standard": "erc20", + "name": "OAK Community Currency", + "address": "0x845598Da418890a674cbaBA26b70807aF0c61dFE", + "symbol": "OAK", + "decimals": 6, + "chain_id": 8453 + } + }, + "scan": { + "url": "https://basescan.org", + "name": "Base Explorer" + }, + "accounts": { + "8453:0x9406Cc6185a346906296840746125a0E44976454": { + "chain_id": 8453, + "entrypoint_address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "paymaster_address": "0x123", + "account_factory_address": "0x9406Cc6185a346906296840746125a0E44976454", + "paymaster_type": "payg" + }, + "8453:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 8453, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "8453": { + "id": 8453, + "node": { + "url": "https://8453.engine.citizenwallet.xyz", + "ws_url": "wss://8453.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.oak.community", + "version": 5 }, { - "community": { - "name": "Zinne.brussels", - "description": "A community currency for the city of Brussels", - "url": "https://zinne.brussels", - "alias": "zinne", - "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", - "hidden": true, - "profile": { - "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", - "chain_id": 137 - }, - "primary_token": { - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "chain_id": 137 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 137 - } - }, - "tokens": { - "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { - "standard": "erc20", - "name": "Zinne.brussels Token", - "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", - "symbol": "ZINNE", - "decimals": 6, - "chain_id": 137 - } - }, - "scan": { - "url": "https://polygonscan.com", - "name": "Polygon Explorer" - }, - "accounts": { - "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { - "chain_id": 137, - "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", - "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", - "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", - "paymaster_type": "cw" - }, - "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 137, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "137": { - "id": 137, - "node": { - "url": "https://137.engine.citizenwallet.xyz", - "ws_url": "wss://137.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [], - "config_location": "https://my.citizenwallet.xyz/api/communities/zinne", - "version": 5 + "community": { + "name": "Stable Coin", + "description": "SBC is a digital dollar stablecoin issued by Brale", + "url": "https://brale.xyz/", + "alias": "sbc.polygon", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sbc.svg", + "hidden": true, + "profile": { + "address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "chain_id": 137 + }, + "primary_token": { + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798": { + "standard": "erc20", + "name": "Stable Coin", + "address": "0xfdcC3dd6671eaB0709A4C0f3F53De9a333d80798", + "symbol": "SBC", + "decimals": 18, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5": { + "chain_id": 137, + "entrypoint_address": "0xe84423Ba1A3f3535B09237245e22dBda5E27eB88", + "paymaster_address": "0x123", + "account_factory_address": "0x3Be13D9325C8C9174C3819d3d868D5D3aB8Fc8a5", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x123", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/sbc.polygon", + "version": 5 }, { - "community": { - "name": "Regens Unite Time Bank", - "description": "Make time to regen", - "url": "https://regensunite.earth", - "alias": "timebank.regensunite.earth", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "hidden": true, - "profile": { - "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x186DaBD027e228C988777907465807FDab270894", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x186DaBD027e228C988777907465807FDab270894": { - "standard": "erc20", - "name": "Regen Hour", - "address": "0x186DaBD027e228C988777907465807FDab270894", - "symbol": "rHour", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x39b77d77f7677997871b304094a05295eb71e240": { - "chain_id": 42220, - "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", - "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", - "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", - "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/timebank.regensunite.earth", - "version": 5 + "community": { + "name": "Zinne.brussels", + "description": "A community currency for the city of Brussels", + "url": "https://zinne.brussels", + "alias": "zinne", + "logo": "https://citizenwallet.xyz/zinne/zinne-coin.svg", + "hidden": true, + "profile": { + "address": "0x23DB3D3Da510e60aF40902A04850E1F3a744905c", + "chain_id": 137 + }, + "primary_token": { + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "chain_id": 137 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 137 + } + }, + "tokens": { + "137:0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D": { + "standard": "erc20", + "name": "Zinne.brussels Token", + "address": "0x5491a3d35F148a44F0af4D718B9636A6e55eBc2D", + "symbol": "ZINNE", + "decimals": 6, + "chain_id": 137 + } + }, + "scan": { + "url": "https://polygonscan.com", + "name": "Polygon Explorer" + }, + "accounts": { + "137:0x11af2639817692D2b805BcE0e1e405E530B20006": { + "chain_id": 137, + "entrypoint_address": "0xF5507B3042f1C63625D856a2ABFF046243A5D74e", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x11af2639817692D2b805BcE0e1e405E530B20006", + "paymaster_type": "cw" + }, + "137:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 137, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xBb796D122Ec1aBDeD081D50B06a072f981c7E62b", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "137": { + "id": 137, + "node": { + "url": "https://137.engine.citizenwallet.xyz", + "ws_url": "wss://137.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [], + "config_location": "https://my.citizenwallet.xyz/api/communities/zinne", + "version": 5 }, { - "community": { - "name": "MOOS Token", - "description": "A community currency for MOOS.", - "url": "https://www.moos.garden/", - "alias": "moos", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", - "hidden": true, - "profile": { - "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { - "standard": "erc20", - "name": "MOOS Token", - "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", - "symbol": "MOOS", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { - "chain_id": 42220, - "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", - "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", - "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", - "url": "https://marketplace.citizenwallet.xyz/moos", - "launch_mode": "webview", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/moos", - "version": 5 + "community": { + "name": "Regens Unite Time Bank", + "description": "Make time to regen", + "url": "https://regensunite.earth", + "alias": "timebank.regensunite.earth", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "hidden": true, + "profile": { + "address": "0x605A827DF8C405D16Ec70AAb8d9a47D21db45c09", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x186DaBD027e228C988777907465807FDab270894", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x186DaBD027e228C988777907465807FDab270894": { + "standard": "erc20", + "name": "Regen Hour", + "address": "0x186DaBD027e228C988777907465807FDab270894", + "symbol": "rHour", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x39b77d77f7677997871b304094a05295eb71e240": { + "chain_id": 42220, + "entrypoint_address": "0x41176F0C9b8f795Cb99e2DD5Db16017978eeFa4d", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x39b77d77f7677997871b304094a05295eb71e240", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xe45858bf63176595c2920822581917c7C705a12f", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/rgn.svg", + "url": "https://marketplace.citizenwallet.xyz/timebank.regensunite.earth", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/timebank.regensunite.earth", + "version": 5 }, { - "community": { - "name": "Bonne Heure", - "description": "Système d'Échange Local de Villers-la-Ville", - "url": "https://selcoupdepouce.be", - "alias": "selcoupdepouce", - "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", - "hidden": true, - "profile": { - "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { - "standard": "erc20", - "name": "Bonne Heure", - "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", - "symbol": "BHR", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { - "chain_id": 42220, - "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", - "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", - "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "plugins": [ - { - "name": "Market", - "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", - "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", - "launch_mode": "browser", - "signature": true - } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/selcoupdepouce", - "version": 5 + "community": { + "name": "MOOS Token", + "description": "A community currency for MOOS.", + "url": "https://www.moos.garden/", + "alias": "moos", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/moos.svg", + "hidden": true, + "profile": { + "address": "0x2e4542Be47408d05F41703386eFaf4338Ee1D341", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3": { + "standard": "erc20", + "name": "MOOS Token", + "address": "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3", + "symbol": "MOOS", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x671f0662de72268d0f3966Fb62dFc6ee6389e244": { + "chain_id": 42220, + "entrypoint_address": "0x45a8e6AaDCc48D1Ce19eCbE07Ccd3a536EF712ed", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x671f0662de72268d0f3966Fb62dFc6ee6389e244", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x55E519bfD63c7152D9F7B88Acd712A37F0BEC482", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://moos.citizenwallet.xyz/wallet-config/_images/moos.svg", + "url": "https://marketplace.citizenwallet.xyz/moos", + "launch_mode": "webview", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/moos", + "version": 5 }, { - "community": { - "name": "CI token", - "description": "Monnaie locale du Cercle Informatique de l’ULB", - "url": "https://citizenwallet.xyz/cit", - "alias": "cit.celo", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", - "hidden": true, - "profile": { - "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { - "standard": "erc20", - "name": "CI token", - "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", - "symbol": "CIT", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { - "chain_id": 42220, - "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", - "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", - "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/cit.celo", - "version": 5 + "community": { + "name": "Bonne Heure", + "description": "Système d'Échange Local de Villers-la-Ville", + "url": "https://selcoupdepouce.be", + "alias": "selcoupdepouce", + "logo": "https://topup.citizenwallet.xyz/communities/selcoupdepouce/sel-coin.svg", + "hidden": true, + "profile": { + "address": "0xfB8F1e7ED42599638B3c509679E2F43937002C56", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3": { + "standard": "erc20", + "name": "Bonne Heure", + "address": "0x5Cdbc862BF4E20D98456D4c41D4A5239aDd496d3", + "symbol": "BHR", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284": { + "chain_id": 42220, + "entrypoint_address": "0xA90904F33df36899d810d040b8d5b3b77265Bb05", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x4Cc883b7E8E0BCB2e293703EF06426F9b4A5A284", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x635032605337aB36A46D767905108e67EE687a72", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "plugins": [ + { + "name": "Market", + "icon": "https://marketplace.citizenwallet.xyz/marketplace.svg", + "url": "https://marketplace.citizenwallet.xyz/selcoupdepouce", + "launch_mode": "browser", + "signature": true + } + ], + "config_location": "https://my.citizenwallet.xyz/api/communities/selcoupdepouce", + "version": 5 }, { - "community": { - "name": "Wolugo", - "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", - "url": "https://wolugo.be", - "alias": "wallet.wolugo.be", - "custom_domain": "wallet.wolugo.be", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", - "theme": { - "primary": "#81e2c1" - }, - "hidden": true, - "profile": { - "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "card_factory": { - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { - "standard": "erc20", - "name": "Wolu", - "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", - "symbol": "WOLU", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { - "chain_id": 42220, - "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", - "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", - "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "cards": { - "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { - "chain_id": 42220, - "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", - "type": "classic" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.wolugo.be", - "version": 5 + "community": { + "name": "CI token", + "description": "Monnaie locale du Cercle Informatique de l’ULB", + "url": "https://citizenwallet.xyz/cit", + "alias": "cit.celo", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/cit.celo.svg", + "hidden": true, + "profile": { + "address": "0x4cB296BEc9FAd0B5e1E4FF1A2F307B425724AC82", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9": { + "standard": "erc20", + "name": "CI token", + "address": "0x12e26FAED228c425BceA8a8dd7658a9CeD944dd9", + "symbol": "CIT", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970": { + "chain_id": 42220, + "entrypoint_address": "0xB8d9412f3A91A00ca762B5c35cd0863E9b716D68", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x0a9f4B7e7Ec393fF25dc9267289Be259Ec3FB970", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x452F7ff3e55fe29f481841985dE7f4939FD645fa", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/cit.celo", + "version": 5 }, { - "community": { - "name": "Woluwe Test", - "description": "Local currency for the Woluwe Test community.", - "url": "https://wollet-v2.citizenwallet.net/token", - "alias": "wtc.celo", - "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", - "hidden": true, - "profile": { - "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", - "chain_id": 42220 - }, - "primary_token": { - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { - "standard": "erc20", - "name": "Woluwe Test Coin", - "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", - "symbol": "WTC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0xE79E19594A749330036280c685E2719d58d99052": { - "chain_id": 42220, - "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", - "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", - "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wtc.celo", - "version": 5 + "community": { + "name": "Wolugo", + "description": "A community for the Woluwe-Saint-Pierre civic engagement platform", + "url": "https://wolugo.be", + "alias": "wallet.wolugo.be", + "custom_domain": "wallet.wolugo.be", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/wolugo.svg", + "theme": { + "primary": "#81e2c1" + }, + "hidden": true, + "profile": { + "address": "0x07e7b95B35866302b3A089feF4CFA3061061a51d", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "card_factory": { + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451": { + "standard": "erc20", + "name": "Wolu", + "address": "0x13Dd4B3cD2f2Be3eb41cD0C3E2ce9F8d8C93A451", + "symbol": "WOLU", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0x8474153A00C959f2cB64852949954DBC68415Bb3": { + "chain_id": 42220, + "entrypoint_address": "0x0F805BC1ED718FB9C7C18439cB11E1C17C6538C4", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x8474153A00C959f2cB64852949954DBC68415Bb3", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0xF2EFEC3cBFaDE0bB6108620cbF7Cc608d27DCF3c", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "cards": { + "42220:0xA3E1446E332a098A1f3b0555c5d149b4784A095F": { + "chain_id": 42220, + "address": "0xA3E1446E332a098A1f3b0555c5d149b4784A095F", + "type": "classic" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.wolugo.be", + "version": 5 }, { - "community": { - "name": "ETHGlobal London Token", - "description": "The community of people using ETHLDN on Base.", - "url": "https://en.wikipedia.org/wiki/USD_Coin", - "alias": "testnet-ethldn", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", - "hidden": true, - "profile": { - "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", - "chain_id": 84532 - }, - "primary_token": { - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "chain_id": 84532 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 84532 - } - }, - "tokens": { - "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { - "standard": "erc20", - "name": "ETHGlobal London Token", - "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", - "symbol": "ETHLDN", - "decimals": 6, - "chain_id": 84532 - } - }, - "scan": { - "url": "https://sepolia.basescan.org", - "name": "Base Sepolia Explorer" - }, - "accounts": { - "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { - "chain_id": 84532, - "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", - "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", - "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", - "paymaster_type": "cw" - }, - "84532:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 84532, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "84532": { - "id": 84532, - "node": { - "url": "https://84532.engine.citizenwallet.xyz", - "ws_url": "wss://84532.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/testnet-ethldn", - "version": 5 + "community": { + "name": "Woluwe Test", + "description": "Local currency for the Woluwe Test community.", + "url": "https://wollet-v2.citizenwallet.net/token", + "alias": "wtc.celo", + "logo": "https://wtc.celo.citizenwallet.xyz/wallet-config/_images/wtc.celo.svg", + "hidden": true, + "profile": { + "address": "0xB99a7B1574f051020EB4cb2fce5d48EE07592AfF", + "chain_id": 42220 + }, + "primary_token": { + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0xc53Cb35591959cA62471dA9fF6AC16629A89874a": { + "standard": "erc20", + "name": "Woluwe Test Coin", + "address": "0xc53Cb35591959cA62471dA9fF6AC16629A89874a", + "symbol": "WTC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0xE79E19594A749330036280c685E2719d58d99052": { + "chain_id": 42220, + "entrypoint_address": "0x1EaF6B6A6967608aF6c77224f087b042095891EB", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0xE79E19594A749330036280c685E2719d58d99052", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x3fefC19674f3F6E43B1dFf1861E07c303B9eAAc9", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wtc.celo", + "version": 5 }, { - "community": { - "name": "Celo Community Point", - "description": "This is a community for the Celo Point", - "url": "https://citizenwallet.xyz", - "alias": "celo-c.citizenwallet.xyz", - "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", - "hidden": true, - "profile": { - "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { - "standard": "erc20", - "name": "Celo Community Point", - "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", - "symbol": "CeloC", - "decimals": 6, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "CELO Explorer" - }, - "accounts": { - "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { - "chain_id": 42220, - "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", - "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", - "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", - "paymaster_type": "cw" - }, - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/celo-c.citizenwallet.xyz", - "version": 5 + "community": { + "name": "ETHGlobal London Token", + "description": "The community of people using ETHLDN on Base.", + "url": "https://en.wikipedia.org/wiki/USD_Coin", + "alias": "testnet-ethldn", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/testnet-ethldn.svg", + "hidden": true, + "profile": { + "address": "0x0785D720279f42326846D5396b5F44b97d0BfECd", + "chain_id": 84532 + }, + "primary_token": { + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "chain_id": 84532 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 84532 + } + }, + "tokens": { + "84532:0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e": { + "standard": "erc20", + "name": "ETHGlobal London Token", + "address": "0x9b1a0D2951b11Ac26A6cBbd5aEf2c4cb014b3B6e", + "symbol": "ETHLDN", + "decimals": 6, + "chain_id": 84532 + } + }, + "scan": { + "url": "https://sepolia.basescan.org", + "name": "Base Sepolia Explorer" + }, + "accounts": { + "84532:0xc1654087C580f868F08E34cd1c01eDB1d3673b82": { + "chain_id": 84532, + "entrypoint_address": "0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0xc1654087C580f868F08E34cd1c01eDB1d3673b82", + "paymaster_type": "cw" + }, + "84532:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 84532, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x389182aCCeE26D953d5188BF4b92c49339DcC9FC", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "84532": { + "id": 84532, + "node": { + "url": "https://84532.engine.citizenwallet.xyz", + "ws_url": "wss://84532.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/testnet-ethldn", + "version": 5 }, { - "community": { - "name": "KFMEDIA℠", - "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", - "url": "https://kingfishersmedia.io", - "alias": "wallet.kingfishersmedia.io", - "custom_domain": "wallet.kingfishersmedia.io", - "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", - "theme": { - "primary": "#88292c" - }, - "profile": { - "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", - "chain_id": 42220 - }, - "primary_token": { - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "chain_id": 42220 - }, - "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "chain_id": 42220 - }, - "primary_session_manager": { - "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "chain_id": 42220 - } - }, - "tokens": { - "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { - "standard": "erc1155", - "name": "KFMEDIA℠ Pathways for LATAM™", - "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", - "symbol": "KFMPFL", - "decimals": 0, - "chain_id": 42220 - } - }, - "scan": { - "url": "https://celoscan.io", - "name": "Celo Explorer" - }, - "accounts": { - "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { - "chain_id": 42220, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" - } - }, - "sessions": { - "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { - "chain_id": 42220, - "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", - "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", - "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" - } - }, - "chains": { - "42220": { - "id": 42220, - "node": { - "url": "https://42220.engine.citizenwallet.xyz", - "ws_url": "wss://42220.engine.citizenwallet.xyz" - } - } - }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" - }, - "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", - "version": 5 + "community": { + "name": "Celo Community Point", + "description": "This is a community for the Celo Point", + "url": "https://citizenwallet.xyz", + "alias": "celo-c.citizenwallet.xyz", + "logo": "https://celo-c.citizenwallet.xyz/uploads/logo.svg", + "hidden": true, + "profile": { + "address": "0x14004E13907282cFaD05f742022E56926eE92dAd", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x3C960E72BBbD837293e75080E1d0Fee6a4640357": { + "standard": "erc20", + "name": "Celo Community Point", + "address": "0x3C960E72BBbD837293e75080E1d0Fee6a4640357", + "symbol": "CeloC", + "decimals": 6, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "CELO Explorer" + }, + "accounts": { + "42220:0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA": { + "chain_id": 42220, + "entrypoint_address": "0x66fE9c22CcA49B257dd4F00508AC90198d99Bf27", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0xcd8b1B9E760148c5026Bc5B0D56a5374e301FDcA", + "paymaster_type": "cw" + }, + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x7f4011845Ea914b6cefc60629e1e00600c972c75", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/celo-c.citizenwallet.xyz", + "version": 5 + }, + { + "community": { + "name": "KFMEDIA℠", + "description": "Certified Education Organization. Solving systemic educational disparity using Web3 solutions, removing barriers of entry for underdeveloped economies.", + "url": "https://kingfishersmedia.io", + "alias": "wallet.kingfishersmedia.io", + "custom_domain": "wallet.kingfishersmedia.io", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/kfmpfl.png", + "theme": { + "primary": "#88292c" + }, + "profile": { + "address": "0x5f6FEb03ad8EfeCdD2a837FAA1a29DEA2bAcfd55", + "chain_id": 42220 + }, + "primary_token": { + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "chain_id": 42220 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 42220 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 42220 + } + }, + "tokens": { + "42220:0x56744910f7dEcD48c1a7FA61B4C317b15E99F156": { + "standard": "erc1155", + "name": "KFMEDIA℠ Pathways for LATAM™", + "address": "0x56744910f7dEcD48c1a7FA61B4C317b15E99F156", + "symbol": "KFMPFL", + "decimals": 0, + "chain_id": 42220 + } + }, + "scan": { + "url": "https://celoscan.io", + "name": "Celo Explorer" + }, + "accounts": { + "42220:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 42220, + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "paymaster_address": "0x02BDA8370d9497A5C808B2db237cfaA8f0733F36", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "paymaster_type": "cw-safe" + } + }, + "sessions": { + "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 42220, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "chains": { + "42220": { + "id": 42220, + "node": { + "url": "https://42220.engine.citizenwallet.xyz", + "ws_url": "wss://42220.engine.citizenwallet.xyz" + } + } + }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", + "version": 5 } -] \ No newline at end of file +] From 12045f91570ca57f4a9ec0fc32e939cf86ece97d Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Tue, 26 Aug 2025 21:45:21 +0530 Subject: [PATCH 31/46] pubspec update --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 4a094198..d374f0d6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: citizenwallet -version: 2.0.19+265 +version: 2.0.20+266 publish_to: none description: A mobile wallet for your community. environment: From 7f40057f44e92565d0e7b2adc67ceee5e19716cf Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 28 Aug 2025 18:11:50 +0530 Subject: [PATCH 32/46] network bug fixed --- lib/services/accounts/accounts.dart | 2 + lib/services/accounts/native/android.dart | 75 ++++++++++++++++----- lib/services/accounts/native/apple.dart | 81 +++++++++++++++++++---- lib/services/config/service.dart | 17 ++--- lib/state/wallet/logic.dart | 37 +++++++---- 5 files changed, 161 insertions(+), 51 deletions(-) diff --git a/lib/services/accounts/accounts.dart b/lib/services/accounts/accounts.dart index 4576c184..bec9387e 100644 --- a/lib/services/accounts/accounts.dart +++ b/lib/services/accounts/accounts.dart @@ -51,4 +51,6 @@ abstract class AccountsServiceInterface { Future populatePrivateKeysFromEncryptedStorage() async {} Future purgePrivateKeysAndAddToEncryptedStorage() async {} + + Future fixSafeAccounts() async {} } diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index 034c17c0..bdda2be5 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -235,19 +235,8 @@ class AndroidAccountsService extends AccountsServiceInterface { if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - final accountForFix = DBAccount( - alias: account.alias, - address: account.address, - name: account.name, - username: account.username, - accountFactoryAddress: account.accountFactoryAddress, - profile: account.profile, - ); - - accountForFix.privateKey = - account.privateKey ?? EthPrivateKey.fromHex(oldPrivateKey!); - - await _fixSafeAccount(accountForFix, config); + final accountId = account.id; + await _sharedPreferences.setBool('needs_fixing_$accountId', true); } // Insert the new record @@ -502,17 +491,67 @@ class AndroidAccountsService extends AccountsServiceInterface { @override Future purgePrivateKeysAndAddToEncryptedStorage() async { - final allAccounts = await getAllAccounts(); // accounts with private keys + final accounts = await _accountsDB.accounts.all(); + + for (final account in accounts) { + final privateKey = await _credentials.read(account.id); + if (privateKey == null) { + continue; + } + + account.privateKey = EthPrivateKey.fromHex(privateKey); + } + + await _credentials.deleteCredentials(); + + for (final account in accounts) { + if (account.privateKey == null) { + continue; + } - for (final account in allAccounts) { await _credentials.write( account.id, bytesToHex(account.privateKey!.privateKey), ); + } + } + + @override + Future fixSafeAccounts() async { + try { + final allAccounts = await _accountsDB.accounts.all(); + + for (final account in allAccounts) { + final needsFixing = + _sharedPreferences.getBool('needs_fixing_${account.id}') ?? false; + if (!needsFixing) { + continue; + } + + final privateKey = await _credentials.read(account.id); + if (privateKey == null) { + continue; + } - // null private key before updating in DB - account.privateKey = null; - await _accountsDB.accounts.update(account); + account.privateKey = EthPrivateKey.fromHex(privateKey); + + final community = await AppDBService().communities.get(account.alias); + if (community == null) { + continue; + } + + final config = Config.fromJson(community.config); + + try { + await _fixSafeAccount(account, config); + + await _sharedPreferences.setBool('needs_fixing_${account.id}', false); + } catch (e, stackTrace) { + debugPrint('Stack trace: $stackTrace'); + } + } + } catch (e, stackTrace) { + debugPrint('Stack trace: $stackTrace'); } } diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index 3cf293b1..bf0eb964 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -346,19 +346,8 @@ class AppleAccountsService extends AccountsServiceInterface { } if (account.accountFactoryAddress == '0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2') { - final accountForFix = DBAccount( - alias: account.alias, - address: account.address, - name: account.name, - username: account.username, - accountFactoryAddress: account.accountFactoryAddress, - profile: account.profile, - ); - - accountForFix.privateKey = - account.privateKey ?? EthPrivateKey.fromHex(oldPrivateKey!); - - await _fixSafeAccount(accountForFix, config); + final accountId = account.id; + await _credentials.write('needs_fixing_$accountId', 'true'); } // Insert the new record @@ -595,4 +584,70 @@ class AppleAccountsService extends AccountsServiceInterface { } } } + + Future purgePrivateKeysAndAddToEncryptedStorage() async { + final accounts = await _accountsDB.accounts.all(); + + for (final account in accounts) { + final privateKey = await _credentials.read(account.id); + if (privateKey == null) { + continue; + } + + account.privateKey = EthPrivateKey.fromHex(privateKey); + } + + await _credentials.deleteCredentials(); + + for (final account in accounts) { + if (account.privateKey == null) { + continue; + } + + await _credentials.write( + account.id, + bytesToHex(account.privateKey!.privateKey), + ); + } + } + + @override + Future fixSafeAccounts() async { + try { + final allAccounts = await _accountsDB.accounts.all(); + + for (final account in allAccounts) { + final needsFixingStr = + await _credentials.read('needs_fixing_${account.id}'); + final needsFixing = needsFixingStr == 'true'; + if (!needsFixing) { + continue; + } + + final privateKey = await _credentials.read(account.id); + if (privateKey == null) { + continue; + } + + account.privateKey = EthPrivateKey.fromHex(privateKey); + + final community = await AppDBService().communities.get(account.alias); + if (community == null) { + continue; + } + + final config = Config.fromJson(community.config); + + try { + await _fixSafeAccount(account, config); + + await _credentials.delete('needs_fixing_${account.id}'); + } catch (e, stackTrace) { + debugPrint('Stack trace: $stackTrace'); + } + } + } catch (e, stackTrace) { + debugPrint('Stack trace: $stackTrace'); + } + } } diff --git a/lib/services/config/service.dart b/lib/services/config/service.dart index 0f361b14..52f2a576 100644 --- a/lib/services/config/service.dart +++ b/lib/services/config/service.dart @@ -116,7 +116,7 @@ class ConfigService { void initWeb() { final scheme = Uri.base.scheme.isNotEmpty ? Uri.base.scheme : 'http'; final url = kDebugMode || Uri.base.host.contains('localhost') - ? 'https://config.internal.citizenwallet.xyz' + ? 'https://dashboard-orpin-xi.vercel.app' : '$scheme://${Uri.base.host}:${Uri.base.port}/wallet-config'; _api = APIService(baseURL: url); @@ -145,9 +145,7 @@ class ConfigService { return [Config.fromJson(response)]; } - final response = await _api.get( - url: - '/v$version/$communityConfigListFileName.json?cachebuster=${generateCacheBusterValue()}'); + final response = await _api.get(url: '/api/communities'); _pref.setConfigs(response); @@ -201,7 +199,12 @@ class ConfigService { } try { - final response = await _api.get(url: configLocation); + String alias = configLocation; + if (configLocation.contains('/')) { + alias = configLocation.split('/').last; + } + + final response = await _api.get(url: '/api/communities/$alias'); final config = Config.fromJson(response); return config; } catch (e, s) { @@ -222,9 +225,7 @@ class ConfigService { return configs; } - final List response = await _api.get( - url: - '/v$version/$communityConfigListS3FileName.json?cachebuster=${generateCacheBusterValue()}'); + final List response = await _api.get(url: '/api/communities'); final List communities = response.map((item) => Config.fromJson(item)).toList(); diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index c8e2ba9a..d5e931f5 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -513,17 +513,20 @@ class WalletLogic extends WidgetsBindingObserver { _state.setWalletReady(true); _state.setWalletReadyLoading(false); - _config - .isCommunityOnline( - communityConfig.chains[token.chainId.toString()]!.node.url) - .then((isOnline) { - communityConfig.online = isOnline; + final isOnline = await _config.isCommunityOnline( + communityConfig.chains[token.chainId.toString()]!.node.url); - _state.setWalletConfig(communityConfig); + communityConfig.online = isOnline; + _state.setWalletConfig(communityConfig); + await _appDBService.communities + .updateOnlineStatus(communityConfig.community.alias, isOnline); - _appDBService.communities - .updateOnlineStatus(communityConfig.community.alias, isOnline); - }); + try { + final accountsService = getAccountsService(); + await accountsService.fixSafeAccounts(); + } catch (e) { + debugPrint('Error fixing accounts: $e'); + } _state.setWallet( CWWallet( @@ -554,7 +557,8 @@ class WalletLogic extends WidgetsBindingObserver { await _preferences.setLastWallet(accAddress); await _preferences.setLastAlias(communityConfig.community.alias); - await _preferences.setLastAccountFactoryAddress(dbWallet.accountFactoryAddress); + await _preferences + .setLastAccountFactoryAddress(dbWallet.accountFactoryAddress); return accAddress; } on NotFoundException { @@ -622,7 +626,8 @@ class WalletLogic extends WidgetsBindingObserver { await _preferences.setLastWallet(address.hexEip55); await _preferences.setLastAlias(communityConfig.community.alias); - await _preferences.setLastAccountFactoryAddress(communityConfig.community.primaryAccountFactory.address); + await _preferences.setLastAccountFactoryAddress( + communityConfig.community.primaryAccountFactory.address); _state.createWalletSuccess( cwwallet, @@ -692,7 +697,8 @@ class WalletLogic extends WidgetsBindingObserver { await _preferences.setLastWallet(address.hexEip55); await _preferences.setLastAlias(communityConfig.community.alias); - await _preferences.setLastAccountFactoryAddress(communityConfig.community.primaryAccountFactory.address); + await _preferences.setLastAccountFactoryAddress( + communityConfig.community.primaryAccountFactory.address); _state.createWalletSuccess(cwwallet); @@ -2605,6 +2611,13 @@ class WalletLogic extends WidgetsBindingObserver { _state.setWalletConfig(communityConfig); + try { + final accountsService = getAccountsService(); + await accountsService.fixSafeAccounts(); + } catch (e) { + debugPrint('Error fixing accounts: $e'); + } + break; default: pauseFetching(); From f936ecb6e7570e4d9b74e28ffe074d16af778f9f Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 4 Sep 2025 16:13:57 +0530 Subject: [PATCH 33/46] fix for search and account username --- lib/screens/send/send_to.dart | 18 ++++- lib/services/wallet/contracts/profile.dart | 7 +- lib/services/wallet/wallet.dart | 6 ++ lib/state/profile/logic.dart | 13 ++-- lib/state/profiles/logic.dart | 76 ++++++++++++++++++++-- 5 files changed, 101 insertions(+), 19 deletions(-) diff --git a/lib/screens/send/send_to.dart b/lib/screens/send/send_to.dart index 141ff696..f78f6392 100644 --- a/lib/screens/send/send_to.dart +++ b/lib/screens/send/send_to.dart @@ -118,6 +118,16 @@ class _SendToScreenState extends State { final walletLogic = widget.walletLogic; final profilesLogic = widget.profilesLogic; + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { + profilesLogic.setWalletState( + walletLogic.config!, + walletLogic.credentials!, + walletLogic.accountAddress!, + ); + } + profilesLogic.allProfiles(); walletLogic.updateAddress(); @@ -135,9 +145,15 @@ class _SendToScreenState extends State { void handleThrottledUpdateAddress(String value) { final profilesLogic = widget.profilesLogic; + final walletLogic = widget.walletLogic; debouncedAddressUpdate(); - profilesLogic.searchProfile(value); + + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { + profilesLogic.searchProfile(value); + } } void handleAddressFieldSubmitted(String value) { diff --git a/lib/services/wallet/contracts/profile.dart b/lib/services/wallet/contracts/profile.dart index e2296980..788d9653 100644 --- a/lib/services/wallet/contracts/profile.dart +++ b/lib/services/wallet/contracts/profile.dart @@ -168,12 +168,15 @@ class ProfileContract { } Future getURL(String addr) async { - return contract.get(EthereumAddress.fromHex(addr)); + final result = await contract.get(EthereumAddress.fromHex(addr)); + return result; } Future getURLFromUsername(String username) async { - return contract.getFromUsername( + final result = await contract.getFromUsername( convertStringToUint8List(username, forcePadLength: 32)); + + return result; } Uint8List setCallData(String addr, String username, String url) { diff --git a/lib/services/wallet/wallet.dart b/lib/services/wallet/wallet.dart index 5469e5e7..2b3e31c0 100644 --- a/lib/services/wallet/wallet.dart +++ b/lib/services/wallet/wallet.dart @@ -150,6 +150,9 @@ Future getProfile(Config config, String addr) async { try { final url = await config.profileContract.getURL(addr); + if (url.isEmpty) { + return null; + } final profileData = await config.ipfsService.get(url: '/$url'); final profile = ProfileV1.fromJson(profileData); @@ -169,6 +172,9 @@ Future getProfileByUsername(Config config, String username) async { try { final url = await config.profileContract.getURLFromUsername(username); + if (url.isEmpty) { + return null; + } final profileData = await config.ipfsService.get(url: '/$url'); final profile = ProfileV1.fromJson(profileData); diff --git a/lib/state/profile/logic.dart b/lib/state/profile/logic.dart index a89d0a05..d8c8a0f1 100644 --- a/lib/state/profile/logic.dart +++ b/lib/state/profile/logic.dart @@ -90,7 +90,7 @@ class ProfileLogic { throw Exception('account or config not found'); } - final community = await _appDBService.communities.get(_account.hexEip55); + final community = await _appDBService.communities.get(_config.community.alias); if (community == null) { throw Exception('community not found'); @@ -106,7 +106,8 @@ class ProfileLogic { _state.setProfileLinkSuccess('$url&receiveParams=$compressedParams'); return; } catch (e) { - // + // Add logging to help debug future issues + debugPrint('Error loading profile link: $e'); } _state.setProfileLinkError(); @@ -552,8 +553,6 @@ class ProfileLogic { return; } - _state.setUsernameSuccess(username: username); - final address = _account.hexEip55; final alias = _config.community.alias; @@ -574,11 +573,6 @@ class ProfileLogic { name: account.name, ); - _profiles.isLoaded( - profile.account, - profile, - ); - if (_pauseProfileCreation) { return; } @@ -614,6 +608,7 @@ class ProfileLogic { throw Exception('Failed to get profile from url $url'); } + _state.setUsernameSuccess(username: newProfile.username); _profiles.isLoaded( newProfile.account, newProfile, diff --git a/lib/state/profiles/logic.dart b/lib/state/profiles/logic.dart index 534f4649..4fa12d10 100644 --- a/lib/state/profiles/logic.dart +++ b/lib/state/profiles/logic.dart @@ -57,7 +57,7 @@ class ProfilesLogic extends WidgetsBindingObserver { Future _loadCachedProfile(String addr) async { try { - if (_currentConfig == null) { + if (_currentConfig == null || !_isInitialized) { return null; } @@ -95,6 +95,10 @@ class ProfilesLogic extends WidgetsBindingObserver { return; } + if (!_isInitialized) { + return; + } + final toLoadCopy = [...toLoad]; toLoad = []; @@ -124,6 +128,10 @@ class ProfilesLogic extends WidgetsBindingObserver { Future loadProfile(String addr) async { try { + if (!_isInitialized) { + return; + } + if (!toLoad.contains(addr) && !_state.exists(addr)) { toLoad.add(addr); debouncedLoad(); @@ -135,7 +143,7 @@ class ProfilesLogic extends WidgetsBindingObserver { Future _searchProfile(String value) async { try { - if (_currentConfig == null) { + if (_currentConfig == null || !_isInitialized) { _state.isSearchingError(); return; } @@ -156,7 +164,7 @@ class ProfilesLogic extends WidgetsBindingObserver { ); if (profile != null) { - _db.contacts.upsert(DBContact( + await _db.contacts.upsert(DBContact( account: profile.account, username: profile.username, name: profile.name, @@ -176,6 +184,11 @@ class ProfilesLogic extends WidgetsBindingObserver { Future getLocalProfile(String addr) async { try { + if (!_isInitialized) { + _state.isSearchingError(); + return null; + } + _state.isSearching(); final profile = await _loadCachedProfile(addr); @@ -194,12 +207,27 @@ class ProfilesLogic extends WidgetsBindingObserver { } Future searchProfile(String username) async { + if (username.trim().isEmpty) { + allProfiles(); + return; + } + + if (!_isInitialized) { + _state.isSearchingError(); + return; + } + _state.isSearching(); debouncedSearchProfile([username]); } Future allProfiles() async { try { + if (!_isInitialized) { + _state.isSearchingError(); + return; + } + _state.isSearching(); final results = await _db.contacts.getAll(); @@ -218,6 +246,11 @@ class ProfilesLogic extends WidgetsBindingObserver { Future loadProfiles() async { try { + if (!_isInitialized) { + _state.profileListFail(); + return; + } + _state.profileListRequest(); final results = await _db.contacts.getAll(); @@ -235,6 +268,10 @@ class ProfilesLogic extends WidgetsBindingObserver { Future loadProfilesFromAllAccounts() async { try { + if (!_isInitialized) { + return; + } + final accounts = await _accountBackupDBService.accounts.all(); final profilesMap = {}; @@ -270,24 +307,49 @@ class ProfilesLogic extends WidgetsBindingObserver { } void selectProfile(ProfileV1? profile) { + if (!_isInitialized) { + return; + } + _state.isSelected(profile); } Future getAccountAddressWithAlias(String alias) async { - final accounts = await _accountBackupDBService.accounts.allForAlias(alias); - return accounts.first.address.hex; + if (!_isInitialized) { + return null; + } + + try { + final accounts = + await _accountBackupDBService.accounts.allForAlias(alias); + return accounts.first.address.hex; + } catch (e) { + return null; + } } Future getSendToProfile(String address) async { + if (!_isInitialized) { + return null; + } + final profile = await getLocalProfile(address); return profile; } void deSelectProfile() { + if (!_isInitialized) { + return; + } + _state.isDeSelected(); } void clearSearch({bool notify = true}) { + if (!_isInitialized) { + return; + } + _state.clearSearch(notify: notify); } @@ -298,11 +360,11 @@ class ProfilesLogic extends WidgetsBindingObserver { void resume() { stopLoading = false; - + if (!_isInitialized) { return; } - + debouncedLoad(); } From c6175be67bd3dfdbc520207593138df8cd384885 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Mon, 8 Sep 2025 22:21:30 +0530 Subject: [PATCH 34/46] repo update --- lib/services/wallet/wallet.dart | 105 +++++++++++++++++++++++++++----- lib/state/wallet/logic.dart | 2 +- 2 files changed, 92 insertions(+), 15 deletions(-) diff --git a/lib/services/wallet/wallet.dart b/lib/services/wallet/wallet.dart index 2b3e31c0..d2182739 100644 --- a/lib/services/wallet/wallet.dart +++ b/lib/services/wallet/wallet.dart @@ -523,8 +523,8 @@ Future<(PaymasterData?, Exception?)> getPaymasterData( try { final response = await requestPaymaster(config, body, legacy: legacy); - - return (PaymasterData.fromJson(response.result), null); + final result = PaymasterData.fromJson(response.result); + return (result, null); } catch (exception) { final strerr = exception.toString(); @@ -804,9 +804,40 @@ Future<(String, UserOp)> _prepareUseropOriginal( '0xAE6E18a9Cd26de5C8f89B886283Fc3f0bE5f04DD', // Old Gratitude factory '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87', // Old Brussels factory '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e', // Old SFLUV factory + '0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE', // Brussels Pay old factory ]; - final isOldAccount = accountFactoryAddress != null && - oldFactoryAddresses.contains(accountFactoryAddress); + + // Determine if this account should use legacy SimpleAccount execution + bool needsLegacyExecution = false; + + try { + // Check if using an old factory address - these definitely need legacy execution + final isUsingOldFactory = accountFactoryAddress != null && + oldFactoryAddresses.contains(accountFactoryAddress); + + if (isUsingOldFactory) { + needsLegacyExecution = true; + } else { + final paymasterTypeFromConfig = + accountConfig?.paymasterType ?? paymasterType; + + if (paymasterTypeFromConfig == 'cw-safe') { + if (nonce > BigInt.zero && _needsLegacyExecution(config)) { + needsLegacyExecution = true; + } else { + needsLegacyExecution = false; + } + } else { + // For other paymaster types, existing accounts might need legacy execution + needsLegacyExecution = nonce > BigInt.zero; + } + } + } catch (e) { + // Default to legacy for safety + needsLegacyExecution = true; + } + + final isOldAccount = needsLegacyExecution; if (isOldAccount) { // Use SimpleAccount execution for legacy accounts @@ -818,8 +849,35 @@ Future<(String, UserOp)> _prepareUseropOriginal( ); // Apply account-specific configuration overrides - if (accountConfig != null) { - // Override entry point if different from current + // For legacy accounts, use old configuration + if (needsLegacyExecution && _needsLegacyExecution(config)) { + final oldAccountConfig = _getOldAccountConfig(config); + if (oldAccountConfig != null) { + try { + // Override with old configuration + if (config.entryPointContract.addr != + oldAccountConfig.entrypointAddress) { + config.entryPointContract = StackupEntryPoint( + config.chains.values.first.id, + config.ethClient, + oldAccountConfig.entrypointAddress, + ); + await config.entryPointContract.init(); + } + + if (paymasterType != oldAccountConfig.paymasterType) { + paymasterType = oldAccountConfig.paymasterType; + } + + final paymasterUrl = + '${config.chains.values.first.node.url}/v1/rpc/${oldAccountConfig.paymasterAddress}'; + config.engineRPC = APIService(baseURL: paymasterUrl); + } catch (e) { + // Ignore config errors, will use defaults + } + } + } else if (accountConfig != null) { + // Use the new cw-safe configuration for SafeAccount execution if (config.entryPointContract.addr != accountConfig.entrypointAddress) { config.entryPointContract = StackupEntryPoint( @@ -830,12 +888,10 @@ Future<(String, UserOp)> _prepareUseropOriginal( await config.entryPointContract.init(); } - // Override paymaster type if different if (paymasterType != accountConfig.paymasterType) { paymasterType = accountConfig.paymasterType; } - // Override paymaster URL if we have a paymaster address if (accountConfig.paymasterAddress != null) { final paymasterUrl = '${config.chains.values.first.node.url}/v1/rpc/${accountConfig.paymasterAddress!}'; @@ -905,7 +961,7 @@ Future<(String, UserOp)> _prepareUseropOriginal( userop.generateSignature(cred, hash); return (bytesToHex(hash, include0x: true), userop); - } catch (e, s) { + } catch (e) { rethrow; } } @@ -1099,7 +1155,6 @@ Future _submitUseropOriginal( }) async { try { final entryPoint = config.entryPointContract; - final params = [userop.toJson(), entryPoint.addr]; if (data != null) { @@ -1115,9 +1170,8 @@ Future _submitUseropOriginal( ); final response = await requestBundler(config, body); - return response.result as String; - } catch (exception, s) { + } catch (exception) { final strerr = exception.toString(); if (strerr.contains(gasFeeErrorMessage)) { @@ -1127,9 +1181,9 @@ Future _submitUseropOriginal( if (strerr.contains(invalidBalanceErrorMessage)) { throw NetworkInvalidBalanceException(); } - } - throw NetworkUnknownException(); + throw NetworkUnknownException(); + } } Future submitUseropWithRetry( @@ -1296,6 +1350,29 @@ Uint8List tokenMintCallData( return Uint8List.fromList([]); } +bool _needsLegacyExecution(Config config) { + const problematicCommunities = { + 'wallet.pay.brussels', + }; + + return problematicCommunities.contains(config.community.alias); +} + +ERC4337Config? _getOldAccountConfig(Config config) { + const oldFactoryMap = { + 'wallet.pay.brussels': '0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE', + }; + + final oldFactoryAddress = oldFactoryMap[config.community.alias]; + if (oldFactoryAddress == null) return null; + + try { + return config.getAccountAbstractionConfig(oldFactoryAddress); + } catch (e) { + return null; + } +} + /// construct simple faucet redeem call data Future simpleFaucetRedeemCallData( Config config, diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index d5e931f5..fa895685 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -1493,7 +1493,6 @@ class WalletLogic extends WidgetsBindingObserver { ); final accountFactoryAddress = await resolveAccountFactoryAddress(); - final (hash, userop) = await prepareUserop( _currentConfig, _currentAccount, @@ -2280,6 +2279,7 @@ class WalletLogic extends WidgetsBindingObserver { 'wallet.commonshub.brussels': '0x307A9456C4057F7C7438a174EFf3f25fc0eA6e87', 'wallet.sfluv.org': '0x5e987a6c4bb4239d498E78c34e986acf29c81E8e', + 'wallet.pay.brussels': '0xBABCf159c4e3186cf48e4a48bC0AeC17CF9d90FE', }; final oldFactory = oldAccountFactories[_currentConfig.community.alias]; From 9d226cf2d9d40eeb45e99517e0e48029f780703a Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Wed, 10 Sep 2025 23:19:53 +0530 Subject: [PATCH 35/46] pubspec update --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index d374f0d6..2c7c314d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: citizenwallet -version: 2.0.20+266 +version: 2.0.23+269 publish_to: none description: A mobile wallet for your community. environment: From 2777e62948b501c0df6bcb784fe607a85333361a Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 11 Sep 2025 09:18:14 +0530 Subject: [PATCH 36/46] logic update --- .example.env | 1 + lib/modals/account/switch_account.dart | 203 +++++++++++--------- lib/modals/landing/migration_modal.dart | 80 ++++++-- lib/screens/accounts/screen.dart | 219 ++++++++++++---------- lib/screens/landing/screen.dart | 7 +- lib/services/api/api.dart | 15 ++ lib/services/migration/service.dart | 115 ++++++++++++ lib/services/preferences/preferences.dart | 18 +- lib/state/app/logic.dart | 15 ++ lib/state/app/state.dart | 24 +++ lib/utils/migration_modal.dart | 32 +++- 11 files changed, 525 insertions(+), 204 deletions(-) create mode 100644 lib/services/migration/service.dart diff --git a/.example.env b/.example.env index b0537ed0..8fdec574 100644 --- a/.example.env +++ b/.example.env @@ -6,6 +6,7 @@ ENCRYPTED_STORAGE_GROUP_ID='x' ORIGIN_HEADER='https://app.citizenwallet.xyz' MAIN_APP_SCHEME='citizenwallet://app.citizenwallet.xyz' APP_LINK_SUFFIX='.citizenwallet.xyz' +DASHBOARD_API='' WALLET_CONFIG_URL='https://config.internal.citizenwallet.xyz' SENTRY_URL='x' WC_PROJECT_ID='x' diff --git a/lib/modals/account/switch_account.dart b/lib/modals/account/switch_account.dart index b9ac3b90..e23e4a99 100644 --- a/lib/modals/account/switch_account.dart +++ b/lib/modals/account/switch_account.dart @@ -1,6 +1,7 @@ // import 'package:citizenwallet/l10n/app_localizations.dart'; import 'package:citizenwallet/modals/wallet/community_picker.dart'; import 'package:citizenwallet/screens/wallet/wallet_row.dart'; +import 'package:citizenwallet/state/app/state.dart'; import 'package:citizenwallet/state/communities/logic.dart'; import 'package:citizenwallet/state/communities/selectors.dart'; import 'package:citizenwallet/state/profiles/logic.dart'; @@ -16,6 +17,7 @@ import 'package:citizenwallet/widgets/export_wallet_modal.dart'; import 'package:citizenwallet/widgets/header.dart'; import 'package:citizenwallet/widgets/scanner/scanner_modal.dart'; import 'package:citizenwallet/widgets/text_input_modal.dart'; +import 'package:citizenwallet/utils/migration_modal.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; @@ -83,8 +85,12 @@ class SwitchAccountModalState extends State { GoRouter.of(context).pop(); } - void handleMigration(BuildContext context) { + void handleMigration(BuildContext context) async { GoRouter.of(context).pop(); + + await Future.delayed(const Duration(milliseconds: 300)); + + await MigrationModalUtils.showMigrationModal(context); } void handleCreate(BuildContext context) async { @@ -406,101 +412,120 @@ class SwitchAccountModalState extends State { bottom: 20, left: 20, right: 20, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CupertinoButton( - padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), - onPressed: () => handleMigration(context), - borderRadius: BorderRadius.circular(25), - color: Theme.of(context) - .colors - .uiBackground - .resolveFrom(context), - child: Row( + child: Consumer( + builder: (context, appState, child) { + // Show migrate button if migration is required + if (appState.migrationRequired) { + return Row( mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text( - "Migrate Accounts", - style: TextStyle( - color: Theme.of(context) - .colors - .text - .resolveFrom(context), - ), - ), - const SizedBox(width: 5), - Icon( - CupertinoIcons.up_arrow, + CupertinoButton( + padding: + const EdgeInsets.fromLTRB(15, 5, 15, 5), + onPressed: () => handleMigration(context), + borderRadius: BorderRadius.circular(25), color: Theme.of(context) .colors - .text + .uiBackground .resolveFrom(context), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + "Migrate Accounts", + style: TextStyle( + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(width: 5), + Icon( + CupertinoIcons.up_arrow, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ], + ), ), ], - ), - ), - // CupertinoButton( - // padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), - // onPressed: () => handleImport(context), - // borderRadius: BorderRadius.circular(25), - // color: Theme.of(context) - // .colors - // .uiBackground - // .resolveFrom(context), - // child: Row( - // mainAxisAlignment: MainAxisAlignment.center, - // crossAxisAlignment: CrossAxisAlignment.center, - // children: [ - // Text( - // AppLocalizations.of(context)!.importText, - // style: TextStyle( - // color: Theme.of(context) - // .colors - // .text - // .resolveFrom(context), - // ), - // ), - // const SizedBox(width: 5), - // Icon( - // CupertinoIcons.down_arrow, - // color: Theme.of(context) - // .colors - // .text - // .resolveFrom(context), - // ), - // ], - // ), - // ), - // const SizedBox(width: 10), - // CupertinoButton( - // padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), - // onPressed: () => handleCreate(context), - // borderRadius: BorderRadius.circular(25), - // color: Theme.of(context) - // .colors - // .surfacePrimary - // .resolveFrom(context), - // child: Row( - // mainAxisAlignment: MainAxisAlignment.center, - // crossAxisAlignment: CrossAxisAlignment.center, - // children: [ - // Text( - // AppLocalizations.of(context)!.joinCommunity, - // style: TextStyle( - // color: Theme.of(context).colors.black, - // ), - // ), - // const SizedBox(width: 5), - // Icon( - // CupertinoIcons.plus, - // color: Theme.of(context).colors.black, - // ), - // ], - // ), - // ), - ], + ); + } + + // Show original import and join community buttons if migration is not required + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CupertinoButton( + padding: + const EdgeInsets.fromLTRB(15, 5, 15, 5), + onPressed: () => handleImport(context), + borderRadius: BorderRadius.circular(25), + color: Theme.of(context) + .colors + .uiBackground + .resolveFrom(context), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + AppLocalizations.of(context)!.importText, + style: TextStyle( + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(width: 5), + Icon( + CupertinoIcons.down_arrow, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ], + ), + ), + const SizedBox(width: 10), + CupertinoButton( + padding: + const EdgeInsets.fromLTRB(15, 5, 15, 5), + onPressed: () => handleCreate(context), + borderRadius: BorderRadius.circular(25), + color: Theme.of(context) + .colors + .surfacePrimary + .resolveFrom(context), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + AppLocalizations.of(context)! + .joinCommunity, + style: TextStyle( + color: Theme.of(context).colors.black, + ), + ), + const SizedBox(width: 5), + Icon( + CupertinoIcons.plus, + color: Theme.of(context).colors.black, + ), + ], + ), + ), + ], + ); + }, ), ), ], diff --git a/lib/modals/landing/migration_modal.dart b/lib/modals/landing/migration_modal.dart index 76cee0d6..81ee5279 100644 --- a/lib/modals/landing/migration_modal.dart +++ b/lib/modals/landing/migration_modal.dart @@ -1,23 +1,73 @@ import 'package:citizenwallet/theme/provider.dart' as theme_provider; import 'package:citizenwallet/utils/platform.dart'; import 'package:citizenwallet/widgets/button.dart'; +import 'package:citizenwallet/services/preferences/preferences.dart'; +import 'package:citizenwallet/services/migration/service.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:go_router/go_router.dart'; import 'package:url_launcher/url_launcher.dart'; class MigrationModal extends StatefulWidget { - const MigrationModal({super.key}); + final bool isWalletScreen; + + const MigrationModal({ + super.key, + this.isWalletScreen = false, + }); @override MigrationModalState createState() => MigrationModalState(); } class MigrationModalState extends State { - void handleDismiss() { - GoRouter.of(context).pop(); + final PreferencesService _preferences = PreferencesService(); + final MigrationService _migrationService = MigrationService(); + bool _isMigrating = false; + + void handleDismiss() async { + await _preferences.incrementMigrationModalDismissalCount(); + + if (mounted) { + GoRouter.of(context).pop(); + } + } + + void handleMigrate() async { + if (widget.isWalletScreen) { + // Wallet screen: perform actual migration + await _performMigration(); + } else { + // Landing screen: launch app store + await _launchAppStore(); + } + + if (mounted) { + GoRouter.of(context).pop(); + } } - void handleDownload() async { + Future _performMigration() async { + setState(() { + _isMigrating = true; + }); + + try { + await _migrationService.performMigration(); + } catch (e) { + if (mounted) { + debugPrint('Migration failed: $e'); + } + } finally { + if (mounted) { + setState(() { + _isMigrating = false; + }); + } + } + } + + Future _launchAppStore() async { String url; if (isPlatformApple()) { url = ''; @@ -33,11 +83,7 @@ class MigrationModalState extends State { await launchUrl(uri, mode: LaunchMode.externalApplication); } } catch (e) { - debugPrint('Could not launch URL: $url'); - } - - if (mounted) { - GoRouter.of(context).pop(); + // URL launch failed } } @@ -79,7 +125,7 @@ class MigrationModalState extends State { const SizedBox(height: 24), Text( - 'We\'ve Moved!', + widget.isWalletScreen ? 'Migrate Your Data' : 'We\'ve Moved!', style: const TextStyle( fontSize: 24, fontWeight: FontWeight.bold, @@ -90,7 +136,9 @@ class MigrationModalState extends State { const SizedBox(height: 16), Text( - 'We\'ve migrated to a new and improved application. Download the new app to continue enjoying all the features.', + widget.isWalletScreen + ? 'Migrate your wallet data to the new app. Your accounts and settings will be securely transferred.' + : 'We\'ve migrated to a new and improved application. Download the new app to continue enjoying all the features.', style: TextStyle( fontSize: 16, color: @@ -104,10 +152,12 @@ class MigrationModalState extends State { SizedBox( width: double.infinity, child: Button( - onPressed: handleDownload, - text: isPlatformApple() - ? 'Download on App Store' - : 'Download on Play Store', + onPressed: _isMigrating ? null : handleMigrate, + text: _isMigrating + ? 'Migrating...' + : widget.isWalletScreen + ? 'Migrate' + : 'Download New App', color: theme.colors.surfacePrimary.resolveFrom(context), ), ), diff --git a/lib/screens/accounts/screen.dart b/lib/screens/accounts/screen.dart index 540e2b87..b04cad9d 100644 --- a/lib/screens/accounts/screen.dart +++ b/lib/screens/accounts/screen.dart @@ -12,6 +12,7 @@ import 'package:citizenwallet/state/wallet/state.dart'; import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/utils/delay.dart'; import 'package:citizenwallet/utils/formatters.dart'; +import 'package:citizenwallet/utils/migration_modal.dart'; import 'package:citizenwallet/utils/ratio.dart'; import 'package:citizenwallet/widgets/confirm_modal.dart'; import 'package:citizenwallet/widgets/export_wallet_modal.dart'; @@ -90,8 +91,18 @@ class AccountsScreenState extends State { GoRouter.of(context).pop(); } - void handleMigration(BuildContext context) { + Future handleMigration(BuildContext context) async { + final rootContext = + GoRouter.of(context).routerDelegate.navigatorKey.currentContext; + GoRouter.of(context).pop(); + + await Future.delayed(const Duration(milliseconds: 300)); + + if (rootContext != null) { + await MigrationModalUtils.showMigrationModal(rootContext, + isWalletScreen: true); + } } void handleJoin(BuildContext context) async { @@ -675,108 +686,124 @@ class AccountsScreenState extends State { bottom: 20, left: 20, right: 20, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CupertinoButton( - padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), - onPressed: () => handleMigration(context), - borderRadius: BorderRadius.circular(25), - color: Theme.of(context) - .colors - .uiBackground - .resolveFrom(context), - child: Row( + child: Consumer( + builder: (context, appState, child) { + if (appState.migrationRequired) { + return Row( mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text( - "Migrate Accounts", - style: TextStyle( - color: Theme.of(context) - .colors - .text - .resolveFrom(context), - ), - ), - const SizedBox(width: 5), - Icon( - CupertinoIcons.up_arrow, + CupertinoButton( + padding: + const EdgeInsets.fromLTRB(15, 5, 15, 5), + onPressed: () => handleMigration(context), + borderRadius: BorderRadius.circular(25), color: Theme.of(context) .colors - .text + .uiBackground .resolveFrom(context), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + "Migrate Accounts", + style: TextStyle( + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(width: 5), + Icon( + CupertinoIcons.up_arrow, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ], + ), ), ], - ), - ), - // CupertinoButton( - // padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), - // onPressed: () => handleImport(context), - // borderRadius: BorderRadius.circular(25), - // color: Theme.of(context) - // .colors - // .uiBackground - // .resolveFrom(context), - // child: Row( - // mainAxisAlignment: MainAxisAlignment.center, - // crossAxisAlignment: CrossAxisAlignment.center, - // children: [ - // Text( - // AppLocalizations.of(context)!.importText, - // style: TextStyle( - // color: Theme.of(context) - // .colors - // .text - // .resolveFrom(context), - // ), - // ), - // const SizedBox(width: 5), - // Icon( - // CupertinoIcons.down_arrow, - // color: Theme.of(context) - // .colors - // .text - // .resolveFrom(context), - // ), - // ], - // ), - // ), - // const SizedBox(width: 10), - // CupertinoButton( - // padding: const EdgeInsets.fromLTRB(15, 5, 15, 5), - // onPressed: singleCommunityMode - // ? () => - // handleCreate(context, currentWallet?.alias) - // : () => handleJoin(context), - // borderRadius: BorderRadius.circular(25), - // color: Theme.of(context) - // .colors - // .surfacePrimary - // .resolveFrom(context), - // child: Row( - // mainAxisAlignment: MainAxisAlignment.center, - // crossAxisAlignment: CrossAxisAlignment.center, - // children: [ - // Text( - // singleCommunityMode - // ? AppLocalizations.of(context)! - // .createNewAccount - // : AppLocalizations.of(context)! - // .joinCommunity, - // style: TextStyle( - // color: Theme.of(context).colors.black, - // ), - // ), - // const SizedBox(width: 5), - // Icon( - // CupertinoIcons.plus, - // color: Theme.of(context).colors.black, - // ), - // ], - // ), - // ), - ], + ); + } + + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CupertinoButton( + padding: + const EdgeInsets.fromLTRB(15, 5, 15, 5), + onPressed: () => handleImport(context), + borderRadius: BorderRadius.circular(25), + color: Theme.of(context) + .colors + .uiBackground + .resolveFrom(context), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + AppLocalizations.of(context)!.importText, + style: TextStyle( + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(width: 5), + Icon( + CupertinoIcons.down_arrow, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ], + ), + ), + const SizedBox(width: 10), + CupertinoButton( + padding: + const EdgeInsets.fromLTRB(15, 5, 15, 5), + onPressed: singleCommunityMode + ? () => handleCreate( + context, currentWallet?.alias) + : () => handleJoin(context), + borderRadius: BorderRadius.circular(25), + color: Theme.of(context) + .colors + .surfacePrimary + .resolveFrom(context), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + singleCommunityMode + ? AppLocalizations.of(context)! + .createNewAccount + : AppLocalizations.of(context)! + .joinCommunity, + style: TextStyle( + color: Theme.of(context).colors.black, + ), + ), + const SizedBox(width: 5), + Icon( + CupertinoIcons.plus, + color: Theme.of(context).colors.black, + ), + ], + ), + ), + ], + ); + }, ), ), ], diff --git a/lib/screens/landing/screen.dart b/lib/screens/landing/screen.dart index b3c5cef2..954f0b63 100644 --- a/lib/screens/landing/screen.dart +++ b/lib/screens/landing/screen.dart @@ -11,8 +11,8 @@ import 'package:citizenwallet/state/backup/state.dart'; import 'package:citizenwallet/state/communities/logic.dart'; import 'package:citizenwallet/state/vouchers/logic.dart'; import 'package:citizenwallet/theme/provider.dart'; -import 'package:citizenwallet/utils/migration_modal.dart'; import 'package:citizenwallet/utils/platform.dart'; +import 'package:citizenwallet/utils/migration_modal.dart'; import 'package:citizenwallet/widgets/scanner/scanner_modal.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; @@ -128,6 +128,8 @@ class LandingScreenState extends State _appLogic.loadApp(); + await _appLogic.checkMigrationRequired(); + // set up recovery await handleAppleRecover(); await handleAndroidRecover(); @@ -169,7 +171,7 @@ class LandingScreenState extends State // pick an appropriate wallet to load if (widget.deepLink != null) { (address, alias) = await handleLoadFromParams(widget.deepLinkParams, - overrideAlias: alias); + overrideAlias: alias); } // handle send to params @@ -391,6 +393,7 @@ class LandingScreenState extends State navigator.go('/wallet/$address$params'); } + @override Widget build(BuildContext context) { final height = MediaQuery.of(context).size.height; diff --git a/lib/services/api/api.dart b/lib/services/api/api.dart index eef4a92c..f50d6bb1 100644 --- a/lib/services/api/api.dart +++ b/lib/services/api/api.dart @@ -339,3 +339,18 @@ RPCException parseRPCErrorText(String errorText) { ); } } + +extension MigrationAPI on APIService { + Future checkMigrationRequired() async { + try { + final response = await get(url: '/migration'); + + return false; + } on NotFoundException { + return true; + } catch (e) { + return false; + } + } +} + diff --git a/lib/services/migration/service.dart b/lib/services/migration/service.dart new file mode 100644 index 00000000..8dfb8f6e --- /dev/null +++ b/lib/services/migration/service.dart @@ -0,0 +1,115 @@ +import 'dart:io'; +import 'dart:math'; +import 'package:citizenwallet/services/backup/backup.dart'; +import 'package:citizenwallet/services/db/backup/db.dart'; +import 'package:citizenwallet/utils/encrypt.dart'; +import 'package:flutter/foundation.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:web3dart/crypto.dart'; +import 'package:web3dart/web3dart.dart'; + +class MigrationService { + static final MigrationService _instance = MigrationService._internal(); + factory MigrationService() => _instance; + MigrationService._internal(); + + EthPrivateKey generateMigrationKey() { + final random = Random.secure(); + final privateKey = EthPrivateKey.createRandom(random); + return privateKey; + } + + // Encrypts the database file using the provided private key + Future encryptDatabase(String dbPath, EthPrivateKey privateKey) async { + try { + final dbFile = File(dbPath); + if (!dbFile.existsSync()) { + throw Exception('Database file not found: $dbPath'); + } + + final dbBytes = await dbFile.readAsBytes(); + + final keyBytes = privateKey.privateKey; + final encryptKey = keyBytes.length == 33 ? keyBytes.sublist(1) : keyBytes; + + final encrypt = Encrypt(encryptKey); + + final encryptedBytes = await encrypt.encrypt(dbBytes); + + final encryptedFile = File('${dbPath}.encrypted'); + await encryptedFile.writeAsBytes(encryptedBytes); + + return encryptedFile; + } catch (e) { + rethrow; + } + } + + //Uploads the encrypted database using the existing backup service + Future uploadEncryptedDatabase( + File encryptedFile, + String fileName, + ) async { + try { + final backupService = getBackupService(); + + final username = await backupService.init(); + + await backupService.upload(encryptedFile.path, fileName); + + await encryptedFile.delete(); + } catch (e) { + debugPrint('Error uploading database: $e'); + rethrow; + } + } + + // Launches the new app with the migration deep link + Future launchNewApp(String privateKeyHex) async { + try { + final deepLink = 'citizenwallet2://migrate?key=$privateKeyHex'; + final uri = Uri.parse(deepLink); + final canLaunch = await canLaunchUrl(uri); + if (canLaunch) { + // Use url_launcher to open the external app + await launchUrl(uri, mode: LaunchMode.externalApplication); + } else { + throw Exception('Cannot launch new app: $deepLink'); + } + } catch (e) { + debugPrint('Error launching new app: $e'); + rethrow; + } + } + + /// Performs the complete migration process + Future performMigration() async { + try { + final privateKey = generateMigrationKey(); + final privateKeyHex = bytesToHex(privateKey.privateKey); + final address = privateKey.address.hexEip55; + + final accountsDB = AccountBackupDBService(); + await accountsDB.init('accounts'); + final dbPath = accountsDB.path; + + final dbFile = File(dbPath); + if (dbFile.existsSync()) { + final dbSize = await dbFile.length(); + } else {} + + final encryptedFile = await encryptDatabase(dbPath, privateKey); + final encryptedSize = await encryptedFile.length(); + + final fileName = '${address}.db'; + + await uploadEncryptedDatabase(encryptedFile, fileName); + + await launchNewApp(privateKeyHex); + } catch (e, stackTrace) { + debugPrint(' 🚨 Error: $e'); + debugPrint(' 📍 Stack Trace: $stackTrace'); + rethrow; + } + } +} diff --git a/lib/services/preferences/preferences.dart b/lib/services/preferences/preferences.dart index b19c967a..84db975b 100644 --- a/lib/services/preferences/preferences.dart +++ b/lib/services/preferences/preferences.dart @@ -163,6 +163,22 @@ class PreferencesService { await _preferences.setBool('migrationModalShown', shown); } - bool get migrationModalShown => _preferences.getBool('migrationModalShown') ?? false; + bool get migrationModalShown => + _preferences.getBool('migrationModalShown') ?? false; + Future setMigrationModalDismissalCount(int count) async { + await _preferences.setInt('migrationModalDismissalCount', count); + } + + int get migrationModalDismissalCount => + _preferences.getInt('migrationModalDismissalCount') ?? 0; + + Future incrementMigrationModalDismissalCount() async { + final currentCount = migrationModalDismissalCount; + await setMigrationModalDismissalCount(currentCount + 1); + } + + Future resetMigrationModalDismissalCount() async { + await setMigrationModalDismissalCount(0); + } } diff --git a/lib/state/app/logic.dart b/lib/state/app/logic.dart index 2610a294..2870c278 100644 --- a/lib/state/app/logic.dart +++ b/lib/state/app/logic.dart @@ -11,6 +11,7 @@ import 'package:citizenwallet/services/db/backup/accounts.dart'; import 'package:citizenwallet/services/preferences/preferences.dart'; import 'package:citizenwallet/services/wallet/contracts/account_factory.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; +import 'package:citizenwallet/services/api/api.dart'; import 'package:citizenwallet/state/app/state.dart'; import 'package:citizenwallet/state/theme/logic.dart'; import 'package:citizenwallet/utils/delay.dart'; @@ -55,6 +56,20 @@ class AppLogic { _appState.appLoaded(); } + Future checkMigrationRequired() async { + try { + _appState.migrationCheckRequest(); + + final apiService = APIService(baseURL: dotenv.get('DASHBOARD_API')); + final migrationRequired = await apiService.checkMigrationRequired(); + + _appState.migrationCheckSuccess(migrationRequired); + } catch (e) { + debugPrint('Migration check error: $e'); + _appState.migrationCheckFailed(); + } + } + void setFirstLaunch(bool firstLaunch) { try { _preferences.setFirstLaunch(firstLaunch); diff --git a/lib/state/app/state.dart b/lib/state/app/state.dart index 2ec8c65e..733a9def 100644 --- a/lib/state/app/state.dart +++ b/lib/state/app/state.dart @@ -37,6 +37,10 @@ class AppState with ChangeNotifier { bool muted = false; + bool migrationRequired = false; + bool migrationCheckLoading = false; + bool migrationCheckError = false; + AppState() { muted = PreferencesService().muted; @@ -174,4 +178,24 @@ class AppState with ChangeNotifier { singleCommunityMode = ConfigService().singleCommunityMode; notifyListeners(); } + + void migrationCheckRequest() { + migrationCheckLoading = true; + migrationCheckError = false; + notifyListeners(); + } + + void migrationCheckSuccess(bool required) { + migrationRequired = required; + migrationCheckLoading = false; + migrationCheckError = false; + notifyListeners(); + } + + void migrationCheckFailed() { + migrationRequired = false; + migrationCheckLoading = false; + migrationCheckError = true; + notifyListeners(); + } } diff --git a/lib/utils/migration_modal.dart b/lib/utils/migration_modal.dart index e6769d56..a64d93d0 100644 --- a/lib/utils/migration_modal.dart +++ b/lib/utils/migration_modal.dart @@ -1,14 +1,44 @@ import 'package:citizenwallet/modals/landing/migration_modal.dart'; +import 'package:citizenwallet/services/preferences/preferences.dart'; +import 'package:citizenwallet/state/app/state.dart'; import 'package:flutter/cupertino.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; +import 'package:provider/provider.dart'; class MigrationModalUtils { static Future showMigrationModalIfNeeded(BuildContext context) async { + final preferences = PreferencesService(); + final appState = context.read(); + + if (!appState.migrationRequired) { + return; + } + + final dismissalCount = preferences.migrationModalDismissalCount; + if (dismissalCount >= 3) { + return; + } + await showCupertinoModalBottomSheet( context: context, + topRadius: const Radius.circular(40), + useRootNavigator: true, builder: (context) => const MigrationModal(), isDismissible: false, enableDrag: false, ); } -} \ No newline at end of file + + static Future showMigrationModal(BuildContext context, + {bool isWalletScreen = false}) async { + // Always show the modal when manually triggered from the migrate button + await showCupertinoModalBottomSheet( + context: context, + topRadius: const Radius.circular(40), + useRootNavigator: true, + builder: (context) => MigrationModal(isWalletScreen: isWalletScreen), + isDismissible: false, + enableDrag: false, + ); + } +} From 92327fcf60da36a2676007ce2f0eeaf25f60c6dd Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 11 Sep 2025 19:16:17 +0530 Subject: [PATCH 37/46] updated config --- assets/config/v5/communities.json | 300 +++++++++++++++++++------ assets/config/v5/communities.test.json | 300 +++++++++++++++++++------ lib/screens/wallet/tip_to.dart | 21 +- lib/services/config/service.dart | 38 +++- lib/services/wallet/models/userop.dart | 9 + lib/services/wallet/wallet.dart | 6 + lib/state/wallet/logic.dart | 22 +- 7 files changed, 540 insertions(+), 156 deletions(-) diff --git a/assets/config/v5/communities.json b/assets/config/v5/communities.json index 1ba386bf..cf9be999 100644 --- a/assets/config/v5/communities.json +++ b/assets/config/v5/communities.json @@ -24,6 +24,10 @@ "primary_session_manager": { "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 137 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 137 } }, "tokens": { @@ -57,6 +61,14 @@ "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" } }, + "cards": { + "137:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "type": "safe", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 137, + "instance_id": "cw-discord-1" + } + }, "chains": { "137": { "id": 137, @@ -308,6 +320,10 @@ "primary_session_manager": { "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 42220 } }, "tokens": { @@ -340,6 +356,14 @@ "paymaster_type": "cw-safe" } }, + "cards": { + "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 42220, + "instance_id": "cw-discord-1", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, "sessions": { "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { "chain_id": 42220, @@ -366,12 +390,10 @@ }, { "community": { - "name": "SFLUV Community", - "description": "A community currency for the city of San Francisco.", "url": "https://sfluv.org", - "alias": "wallet.berachain.sfluv.org", - "custom_domain": "wallet.sfluv.org", "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "name": "SFLUV Community", + "alias": "wallet.berachain.sfluv.org", "theme": { "primary": "#eb6c6c" }, @@ -379,36 +401,38 @@ "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", "chain_id": 80094 }, + "description": "A community currency for the city of San Francisco.", + "custom_domain": "wallet.sfluv.org", "primary_token": { "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", "chain_id": 80094 }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 80094 + }, "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 80094 - } - }, - "tokens": { - "80094:0x881cad4f885c6701d8481c0ed347f6d35444ea7e": { - "standard": "erc20", - "name": "SFLUV V1.1", - "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", - "symbol": "SFLUV", - "decimals": 18, + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 80094 } }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, "scan": { "url": "https://polygonscan.com", "name": "Polygon Explorer" }, - "accounts": { - "80094:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "cards": { + "80094:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "type": "safe", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", "chain_id": 80094, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x9A5be02B65f9Aa00060cB8c951dAFaBAB9B860cd", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" + "instance_id": "cw-discord-1" } }, "chains": { @@ -420,33 +444,57 @@ } } }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" + "tokens": { + "80094:0x881cad4f885c6701d8481c0ed347f6d35444ea7e": { + "name": "SFLUV V1.1", + "symbol": "SFLUV", + "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", + "chain_id": 80094, + "decimals": 18, + "standard": "erc20" + } }, "plugins": [ { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", "url": "https://app.sfluv.org", - "launch_mode": "webview", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "name": "About", + "hidden": true, "signature": true, - "hidden": true + "launch_mode": "webview" } ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", - "version": 4 + "version": 5, + "accounts": { + "80094:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 80094, + "paymaster_type": "cw-safe", + "paymaster_address": "0x9A5be02B65f9Aa00060cB8c951dAFaBAB9B860cd", + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185" + } + }, + "sessions": { + "80094:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 80094, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.berachain.sfluv.org" }, { "community": { - "name": "SFLUV Community (Polygon)", - "description": "A community currency for the city of San Francisco.", "url": "https://sfluv.org", - "alias": "wallet.sfluv.org", - "custom_domain": "wallet.polygon.sfluv.org", "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "name": "SFLUV Community (Polygon)", + "alias": "wallet.sfluv.org", "theme": { "primary": "#eb6c6c" }, + "description": "A community currency for the city of San Francisco.", + "custom_domain": "wallet.polygon.sfluv.org", "profile": { "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", "chain_id": 137 @@ -458,6 +506,10 @@ "primary_account_factory": { "address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 } }, "tokens": { @@ -483,6 +535,14 @@ "paymaster_type": "cw" } }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "137": { "id": 137, @@ -505,8 +565,8 @@ "hidden": true } ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", - "version": 4 + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.sfluv.org", + "version": 5 }, { "community": { @@ -658,21 +718,25 @@ }, { "community": { - "name": "Breadchain Community Token", - "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", "url": "https://breadchain.xyz/", - "alias": "bread", "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "name": "Breadchain Community Token", + "alias": "bread", "profile": { "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", "chain_id": 100 }, + "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", "primary_token": { "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", "chain_id": 100 }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 100 }, "primary_session_manager": { @@ -680,34 +744,69 @@ "chain_id": 100 } }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "cards": { + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "type": "safe", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100, + "instance_id": "cw-discord-1" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, "tokens": { "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { - "standard": "erc20", "name": "Breadchain Community Token", - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", "symbol": "BREAD", + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "chain_id": 100, "decimals": 18, - "chain_id": 100 + "standard": "erc20" } }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, + "plugins": [ + { + "url": "https://topup.citizenspring.earth/bread", + "icon": "https://bread.citizenwallet.xyz/uploads/logo.svg", + "name": "Top Up", + "action": "topup" + }, + { + "url": "https://marketplace.citizenwallet.xyz/bread", + "icon": "https://bread.citizenwallet.xyz/uploads/logo.svg", + "name": "Market", + "launch_mode": "webview" + } + ], + "version": 5, "accounts": { - "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { "chain_id": 100, - "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", - "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_type": "cw" + "paymaster_type": "cw-safe", + "paymaster_address": "0x5987e57e85014B5A56C880313580346c20a5d1c1", + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2" }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" + "paymaster_type": "cw", + "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", + "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9" } }, "sessions": { @@ -718,6 +817,24 @@ "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" } }, + "config_location": "https://my.citizenwallet.xyz/api/communities/bread" + }, + { + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "cards": { + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "type": "safe", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100, + "instance_id": "cw-discord-1" + } + }, "chains": { "100": { "id": 100, @@ -727,28 +844,63 @@ } } }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" + "tokens": { + "100:0x3d36ddFfa4666Ef12a176CaA8C3e67C1047bC007": { + "name": "Labor Hour Token", + "symbol": "HOUR", + "address": "0x3d36ddFfa4666Ef12a176CaA8C3e67C1047bC007", + "chain_id": 100, + "decimals": 6, + "standard": "erc20" + } }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://marketplace.citizenwallet.xyz/bread", - "launch_mode": "webview", - "signature": true + "plugins": [], + "version": 5, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "paymaster_type": "cw-safe", + "paymaster_address": "0xa7fa16C933f51d8623f39FA0dF34D3065B99Bd1c", + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "community": { + "url": "https://breadchain.xyz/", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/laborhour.png", + "name": "Labor Hour Token", + "alias": "laborhour", + "profile": { + "address": "0x673601Eb36820bC9718214AC041E96f79383351B", + "chain_id": 100 }, - { - "name": "Breadcon 2025 Faucet", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://faucet.citizenwallet.xyz/breadcon2025", - "launch_mode": "webview", - "signature": true, - "hidden": true + "description": "Labor Hour Token aims to reward contributors for hours of labor, particularly targeting non-blockchain native users", + "primary_token": { + "address": "0x3d36ddFfa4666Ef12a176CaA8C3e67C1047bC007", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/bread", - "version": 5 + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/laborhour" }, { "community": { @@ -2288,4 +2440,4 @@ "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", "version": 5 } -] +] \ No newline at end of file diff --git a/assets/config/v5/communities.test.json b/assets/config/v5/communities.test.json index 1ba386bf..cf9be999 100644 --- a/assets/config/v5/communities.test.json +++ b/assets/config/v5/communities.test.json @@ -24,6 +24,10 @@ "primary_session_manager": { "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 137 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 137 } }, "tokens": { @@ -57,6 +61,14 @@ "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" } }, + "cards": { + "137:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "type": "safe", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 137, + "instance_id": "cw-discord-1" + } + }, "chains": { "137": { "id": 137, @@ -308,6 +320,10 @@ "primary_session_manager": { "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 42220 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 42220 } }, "tokens": { @@ -340,6 +356,14 @@ "paymaster_type": "cw-safe" } }, + "cards": { + "42220:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "chain_id": 42220, + "instance_id": "cw-discord-1", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "type": "safe" + } + }, "sessions": { "42220:0xE2F3DC3E638113b9496060349e5332963d9C1152": { "chain_id": 42220, @@ -366,12 +390,10 @@ }, { "community": { - "name": "SFLUV Community", - "description": "A community currency for the city of San Francisco.", "url": "https://sfluv.org", - "alias": "wallet.berachain.sfluv.org", - "custom_domain": "wallet.sfluv.org", "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "name": "SFLUV Community", + "alias": "wallet.berachain.sfluv.org", "theme": { "primary": "#eb6c6c" }, @@ -379,36 +401,38 @@ "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", "chain_id": 80094 }, + "description": "A community currency for the city of San Francisco.", + "custom_domain": "wallet.sfluv.org", "primary_token": { "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", "chain_id": 80094 }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 80094 + }, "primary_account_factory": { "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", "chain_id": 80094 - } - }, - "tokens": { - "80094:0x881cad4f885c6701d8481c0ed347f6d35444ea7e": { - "standard": "erc20", - "name": "SFLUV V1.1", - "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", - "symbol": "SFLUV", - "decimals": 18, + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", "chain_id": 80094 } }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, "scan": { "url": "https://polygonscan.com", "name": "Polygon Explorer" }, - "accounts": { - "80094:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "cards": { + "80094:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "type": "safe", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", "chain_id": 80094, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x9A5be02B65f9Aa00060cB8c951dAFaBAB9B860cd", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" + "instance_id": "cw-discord-1" } }, "chains": { @@ -420,33 +444,57 @@ } } }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" + "tokens": { + "80094:0x881cad4f885c6701d8481c0ed347f6d35444ea7e": { + "name": "SFLUV V1.1", + "symbol": "SFLUV", + "address": "0x881cad4f885c6701d8481c0ed347f6d35444ea7e", + "chain_id": 80094, + "decimals": 18, + "standard": "erc20" + } }, "plugins": [ { - "name": "About", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", "url": "https://app.sfluv.org", - "launch_mode": "webview", + "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "name": "About", + "hidden": true, "signature": true, - "hidden": true + "launch_mode": "webview" } ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", - "version": 4 + "version": 5, + "accounts": { + "80094:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 80094, + "paymaster_type": "cw-safe", + "paymaster_address": "0x9A5be02B65f9Aa00060cB8c951dAFaBAB9B860cd", + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185" + } + }, + "sessions": { + "80094:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 80094, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.berachain.sfluv.org" }, { "community": { - "name": "SFLUV Community (Polygon)", - "description": "A community currency for the city of San Francisco.", "url": "https://sfluv.org", - "alias": "wallet.sfluv.org", - "custom_domain": "wallet.polygon.sfluv.org", "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/sfluv.svg", + "name": "SFLUV Community (Polygon)", + "alias": "wallet.sfluv.org", "theme": { "primary": "#eb6c6c" }, + "description": "A community currency for the city of San Francisco.", + "custom_domain": "wallet.polygon.sfluv.org", "profile": { "address": "0x05e2Fb34b4548990F96B3ba422eA3EF49D5dAa99", "chain_id": 137 @@ -458,6 +506,10 @@ "primary_account_factory": { "address": "0x5e987a6c4bb4239d498E78c34e986acf29c81E8e", "chain_id": 137 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 137 } }, "tokens": { @@ -483,6 +535,14 @@ "paymaster_type": "cw" } }, + "sessions": { + "137:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 137, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, "chains": { "137": { "id": 137, @@ -505,8 +565,8 @@ "hidden": true } ], - "config_location": "https://config.internal.citizenwallet.xyz/v4/wallet.sfluv.org.json", - "version": 4 + "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.sfluv.org", + "version": 5 }, { "community": { @@ -658,21 +718,25 @@ }, { "community": { - "name": "Breadchain Community Token", - "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", "url": "https://breadchain.xyz/", - "alias": "bread", "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", + "name": "Breadchain Community Token", + "alias": "bread", "profile": { "address": "0x6b3a1f4277391526413F583c23D5B9EF4d2fE986", "chain_id": 100 }, + "description": "BREAD is a digital community token and solidarity primitive developed by Breadchain Cooperative that generates yield for post-capitalist organizations", "primary_token": { "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", "chain_id": 100 }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, "primary_account_factory": { - "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2", "chain_id": 100 }, "primary_session_manager": { @@ -680,34 +744,69 @@ "chain_id": 100 } }, + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "cards": { + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "type": "safe", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100, + "instance_id": "cw-discord-1" + } + }, + "chains": { + "100": { + "id": 100, + "node": { + "url": "https://100.engine.citizenwallet.xyz", + "ws_url": "wss://100.engine.citizenwallet.xyz" + } + } + }, "tokens": { "100:0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3": { - "standard": "erc20", "name": "Breadchain Community Token", - "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", "symbol": "BREAD", + "address": "0xa555d5344f6fb6c65da19e403cb4c1ec4a1a5ee3", + "chain_id": 100, "decimals": 18, - "chain_id": 100 + "standard": "erc20" } }, - "scan": { - "url": "https://gnosisscan.io", - "name": "Gnosis Explorer" - }, + "plugins": [ + { + "url": "https://topup.citizenspring.earth/bread", + "icon": "https://bread.citizenwallet.xyz/uploads/logo.svg", + "name": "Top Up", + "action": "topup" + }, + { + "url": "https://marketplace.citizenwallet.xyz/bread", + "icon": "https://bread.citizenwallet.xyz/uploads/logo.svg", + "name": "Market", + "launch_mode": "webview" + } + ], + "version": 5, "accounts": { - "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { + "100:0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2": { "chain_id": 100, - "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", - "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", - "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9", - "paymaster_type": "cw" + "paymaster_type": "cw-safe", + "paymaster_address": "0x5987e57e85014B5A56C880313580346c20a5d1c1", + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "account_factory_address": "0x940Cbb155161dc0C4aade27a4826a16Ed8ca0cb2" }, - "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "100:0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9": { "chain_id": 100, - "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", - "paymaster_address": "0x5C41F1114AB13aF5d66bac485924D03556d0cd51", - "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", - "paymaster_type": "cw-safe" + "paymaster_type": "cw", + "paymaster_address": "0xbE2Cb3358aa14621134e923B68b8429315368E32", + "entrypoint_address": "0xcA0a75EF803a364C83c5EAE7Eb889aE7419c9dF2", + "account_factory_address": "0xAE76B1C6818c1DD81E20ccefD3e72B773068ABc9" } }, "sessions": { @@ -718,6 +817,24 @@ "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" } }, + "config_location": "https://my.citizenwallet.xyz/api/communities/bread" + }, + { + "ipfs": { + "url": "https://ipfs.internal.citizenwallet.xyz" + }, + "scan": { + "url": "https://gnosisscan.io", + "name": "Gnosis Explorer" + }, + "cards": { + "100:0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28": { + "type": "safe", + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100, + "instance_id": "cw-discord-1" + } + }, "chains": { "100": { "id": 100, @@ -727,28 +844,63 @@ } } }, - "ipfs": { - "url": "https://ipfs.internal.citizenwallet.xyz" + "tokens": { + "100:0x3d36ddFfa4666Ef12a176CaA8C3e67C1047bC007": { + "name": "Labor Hour Token", + "symbol": "HOUR", + "address": "0x3d36ddFfa4666Ef12a176CaA8C3e67C1047bC007", + "chain_id": 100, + "decimals": 6, + "standard": "erc20" + } }, - "plugins": [ - { - "name": "Market", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://marketplace.citizenwallet.xyz/bread", - "launch_mode": "webview", - "signature": true + "plugins": [], + "version": 5, + "accounts": { + "100:0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185": { + "chain_id": 100, + "paymaster_type": "cw-safe", + "paymaster_address": "0xa7fa16C933f51d8623f39FA0dF34D3065B99Bd1c", + "entrypoint_address": "0x7079253c0358eF9Fd87E16488299Ef6e06F403B6", + "account_factory_address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185" + } + }, + "sessions": { + "100:0xE2F3DC3E638113b9496060349e5332963d9C1152": { + "chain_id": 100, + "module_address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "factory_address": "0xEd0cD3886b84369A0e29Db9a4480ADF5051c76C9", + "provider_address": "0xF3004A1690f97Cf5d307eDc5958a7F76b62f9FC9" + } + }, + "community": { + "url": "https://breadchain.xyz/", + "logo": "https://assets.citizenwallet.xyz/wallet-config/_images/laborhour.png", + "name": "Labor Hour Token", + "alias": "laborhour", + "profile": { + "address": "0x673601Eb36820bC9718214AC041E96f79383351B", + "chain_id": 100 }, - { - "name": "Breadcon 2025 Faucet", - "icon": "https://assets.citizenwallet.xyz/wallet-config/_images/bread.svg", - "url": "https://faucet.citizenwallet.xyz/breadcon2025", - "launch_mode": "webview", - "signature": true, - "hidden": true + "description": "Labor Hour Token aims to reward contributors for hours of labor, particularly targeting non-blockchain native users", + "primary_token": { + "address": "0x3d36ddFfa4666Ef12a176CaA8C3e67C1047bC007", + "chain_id": 100 + }, + "primary_card_manager": { + "address": "0xBA861e2DABd8316cf11Ae7CdA101d110CF581f28", + "chain_id": 100 + }, + "primary_account_factory": { + "address": "0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185", + "chain_id": 100 + }, + "primary_session_manager": { + "address": "0xE2F3DC3E638113b9496060349e5332963d9C1152", + "chain_id": 100 } - ], - "config_location": "https://my.citizenwallet.xyz/api/communities/bread", - "version": 5 + }, + "config_location": "https://my.citizenwallet.xyz/api/communities/laborhour" }, { "community": { @@ -2288,4 +2440,4 @@ "config_location": "https://my.citizenwallet.xyz/api/communities/wallet.kingfishersmedia.io", "version": 5 } -] +] \ No newline at end of file diff --git a/lib/screens/wallet/tip_to.dart b/lib/screens/wallet/tip_to.dart index 38d588d7..8229827e 100644 --- a/lib/screens/wallet/tip_to.dart +++ b/lib/screens/wallet/tip_to.dart @@ -7,6 +7,7 @@ import 'package:citizenwallet/state/profiles/state.dart'; import 'package:citizenwallet/state/wallet/logic.dart'; import 'package:citizenwallet/state/wallet/state.dart'; import 'package:citizenwallet/theme/provider.dart'; +import 'package:citizenwallet/utils/delay.dart'; import 'package:citizenwallet/widgets/button.dart'; import 'package:citizenwallet/widgets/header.dart'; import 'package:citizenwallet/widgets/persistent_header_delegate.dart'; @@ -72,9 +73,21 @@ class _TipToScreenState extends State { } void onLoad() async { + await delay(const Duration(milliseconds: 250)); + final walletLogic = widget.walletLogic; final profilesLogic = widget.profilesLogic; + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { + profilesLogic?.setWalletState( + walletLogic.config!, + walletLogic.credentials!, + walletLogic.accountAddress!, + ); + } + profilesLogic?.allProfiles(); walletLogic.updateAddress(); @@ -83,9 +96,15 @@ class _TipToScreenState extends State { void handleThrottledUpdateAddress(String value) { final profilesLogic = widget.profilesLogic; + final walletLogic = widget.walletLogic; debouncedAddressUpdate(); - profilesLogic?.searchProfile(value); + + if (walletLogic.config != null && + walletLogic.credentials != null && + walletLogic.accountAddress != null) { + profilesLogic?.searchProfile(value); + } } void handleAddressFieldSubmitted(String value) { diff --git a/lib/services/config/service.dart b/lib/services/config/service.dart index 52f2a576..9fb274e0 100644 --- a/lib/services/config/service.dart +++ b/lib/services/config/service.dart @@ -36,6 +36,7 @@ class ConfigService { late APIService _api; late APIService _communityServer; bool singleCommunityMode = false; + bool _isWebInitialized = false; List _configs = []; @@ -54,6 +55,14 @@ class ConfigService { return _configs.first; } + if (!kIsWeb) { + throw Exception('getWebConfig should only be called on web platform'); + } + + if (!_isWebInitialized) { + initWeb(); + } + if (_configs.isNotEmpty && _configs.length == 1) { _communityServer.get(url: '/config/community.json').then((response) { final config = Config.fromJson(response); @@ -121,6 +130,7 @@ class ConfigService { _api = APIService(baseURL: url); _communityServer = APIService(baseURL: '$scheme://${Uri.base.host}'); + _isWebInitialized = true; } void init(String endpoint) { @@ -149,7 +159,14 @@ class ConfigService { _pref.setConfigs(response); - final configs = (response as List).map((e) => Config.fromJson(e)).toList(); + final configs = (response as List) + .map((e) { + final configData = e['json']; + return configData != null ? Config.fromJson(configData) : null; + }) + .where((config) => config != null) + .cast() + .toList(); return configs; } @@ -205,7 +222,14 @@ class ConfigService { } final response = await _api.get(url: '/api/communities/$alias'); - final config = Config.fromJson(response); + + final configData = response['json']; + if (configData == null) { + debugPrint('No config data found in response for alias: $alias'); + return null; + } + + final config = Config.fromJson(configData); return config; } catch (e, s) { debugPrint('Error fetching single community config: $e'); @@ -227,8 +251,14 @@ class ConfigService { final List response = await _api.get(url: '/api/communities'); - final List communities = - response.map((item) => Config.fromJson(item)).toList(); + final List communities = response + .map((item) { + final configData = item['json']; + return configData != null ? Config.fromJson(configData) : null; + }) + .where((config) => config != null) + .cast() + .toList(); return communities; } diff --git a/lib/services/wallet/models/userop.dart b/lib/services/wallet/models/userop.dart index 8bbb473d..05ada3f4 100644 --- a/lib/services/wallet/models/userop.dart +++ b/lib/services/wallet/models/userop.dart @@ -6,6 +6,9 @@ import 'package:web3dart/web3dart.dart'; const String gasFeeErrorMessage = 'pending ops: replacement op must increase maxFeePerGas and MaxPriorityFeePerGas'; const String invalidBalanceErrorMessage = 'transfer amount exceeds balance'; +const String unauthorizedErrorMessage = 'Unauthorized'; +const String accessDeniedErrorMessage = 'Access Denied'; +const String forbiddenErrorMessage = 'Forbidden'; class NetworkCongestedException implements Exception { final String message = 'network congestion'; @@ -25,6 +28,12 @@ class NetworkUnknownException implements Exception { NetworkUnknownException(); } +class NetworkUnauthorizedException implements Exception { + final String message = 'unauthorized access'; + + NetworkUnauthorizedException(); +} + const String zeroAddress = '0x0000000000000000000000000000000000000000'; final BigInt defaultCallGasLimit = BigInt.from(35000); final BigInt defaultVerificationGasLimit = BigInt.from(70000); diff --git a/lib/services/wallet/wallet.dart b/lib/services/wallet/wallet.dart index d2182739..cb910d34 100644 --- a/lib/services/wallet/wallet.dart +++ b/lib/services/wallet/wallet.dart @@ -1182,6 +1182,12 @@ Future _submitUseropOriginal( throw NetworkInvalidBalanceException(); } + if (strerr.contains(unauthorizedErrorMessage) || + strerr.contains(accessDeniedErrorMessage) || + strerr.contains(forbiddenErrorMessage)) { + throw NetworkUnauthorizedException(); + } + throw NetworkUnknownException(); } } diff --git a/lib/state/wallet/logic.dart b/lib/state/wallet/logic.dart index fa895685..0a7cc4ad 100644 --- a/lib/state/wallet/logic.dart +++ b/lib/state/wallet/logic.dart @@ -189,10 +189,12 @@ class WalletLogic extends WidgetsBindingObserver { Future fetchWalletConfig() async { try { - final config = - await _config.getWebConfig(dotenv.get('APP_LINK_SUFFIX'), null); + if (kIsWeb) { + final config = + await _config.getWebConfig(dotenv.get('APP_LINK_SUFFIX'), null); - _state.setWalletConfig(config); + _state.setWalletConfig(config); + } return; } catch (_) {} @@ -1360,6 +1362,20 @@ class WalletLogic extends WidgetsBindingObserver { date: DateTime.now(), error: NetworkInvalidBalanceException().message), ); + } on NetworkUnauthorizedException { + _state.sendQueueAddTransaction( + CWTransaction.failed( + fromDoubleUnit( + parsedAmount.toString(), + decimals: _currentConfig.getPrimaryToken().decimals, + ), + id: tempId, + hash: '', + to: to, + description: message, + date: DateTime.now(), + error: NetworkUnauthorizedException().message), + ); } catch (e, s) { _state.sendQueueAddTransaction( CWTransaction.failed( From 92ded9a4d1b7dfb809e3929366df4675f8f90f14 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Fri, 12 Sep 2025 17:00:30 +0530 Subject: [PATCH 38/46] pubspec update --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 2c7c314d..5b8b6d9d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: citizenwallet -version: 2.0.23+269 +version: 2.0.24+271 publish_to: none description: A mobile wallet for your community. environment: From 3206e48d43fe3e9d36a979c1698704167097327c Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Fri, 12 Sep 2025 22:40:50 +0530 Subject: [PATCH 39/46] repo update --- lib/state/profiles/selectors.dart | 2 +- lib/state/profiles/state.dart | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/state/profiles/selectors.dart b/lib/state/profiles/selectors.dart index 12cc1037..878e0816 100644 --- a/lib/state/profiles/selectors.dart +++ b/lib/state/profiles/selectors.dart @@ -4,7 +4,7 @@ import 'package:citizenwallet/state/profiles/state.dart'; List selectProfileSuggestions(ProfilesState state) { Map profiles = {}; - if (state.searchedProfile != null) { + if (state.searchedProfile != null && state.isActiveSearch) { profiles[state.searchedProfile!.username] = state.searchedProfile!; } diff --git a/lib/state/profiles/state.dart b/lib/state/profiles/state.dart index 08fc38c0..f4bc8056 100644 --- a/lib/state/profiles/state.dart +++ b/lib/state/profiles/state.dart @@ -35,6 +35,7 @@ class ProfilesState with ChangeNotifier { List searchResults = []; bool searchLoading = false; bool searchError = false; + bool isActiveSearch = false; ProfileV1? selectedProfile; @@ -73,6 +74,7 @@ class ProfilesState with ChangeNotifier { searchResults = []; searchLoading = false; searchError = false; + isActiveSearch = false; selectedProfile = null; if (notify) notifyListeners(); @@ -87,6 +89,7 @@ class ProfilesState with ChangeNotifier { void isSearching() { searchLoading = true; searchError = false; + isActiveSearch = true; notifyListeners(); } @@ -95,6 +98,9 @@ class ProfilesState with ChangeNotifier { searchedProfile = profile; searchLoading = false; searchError = false; + // Keep isActiveSearch true if we have a searched profile or results + // Set to false only when showing all profiles (profile is null and we have results) + isActiveSearch = profile != null || results.isEmpty; notifyListeners(); } @@ -102,6 +108,7 @@ class ProfilesState with ChangeNotifier { searchedProfile = null; searchLoading = false; searchError = true; + isActiveSearch = false; notifyListeners(); } From 620b4a3e021bb9e82ab675c51e61362bef03340c Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Mon, 15 Sep 2025 11:03:33 +0530 Subject: [PATCH 40/46] repo update --- lib/screens/send/send_to.dart | 2 +- lib/screens/wallet/tip_to.dart | 2 +- lib/state/profiles/logic.dart | 21 +++++++++++++-------- lib/state/profiles/selectors.dart | 8 +++++++- lib/state/profiles/state.dart | 7 ------- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/lib/screens/send/send_to.dart b/lib/screens/send/send_to.dart index f78f6392..f3ce8b6b 100644 --- a/lib/screens/send/send_to.dart +++ b/lib/screens/send/send_to.dart @@ -128,7 +128,7 @@ class _SendToScreenState extends State { ); } - profilesLogic.allProfiles(); + profilesLogic.clearSearch(); walletLogic.updateAddress(); nameFocusNode.requestFocus(); diff --git a/lib/screens/wallet/tip_to.dart b/lib/screens/wallet/tip_to.dart index 8229827e..4c8842ee 100644 --- a/lib/screens/wallet/tip_to.dart +++ b/lib/screens/wallet/tip_to.dart @@ -88,7 +88,7 @@ class _TipToScreenState extends State { ); } - profilesLogic?.allProfiles(); + profilesLogic?.clearSearch(); walletLogic.updateAddress(); nameFocusNode.requestFocus(); diff --git a/lib/state/profiles/logic.dart b/lib/state/profiles/logic.dart index 4fa12d10..8cc4518a 100644 --- a/lib/state/profiles/logic.dart +++ b/lib/state/profiles/logic.dart @@ -156,14 +156,8 @@ class ProfilesLogic extends WidgetsBindingObserver { ? await getProfile(_currentConfig, cleanValue) : await getProfileByUsername(_currentConfig, cleanValue); - final results = await _db.contacts.search(cleanValue.toLowerCase()); - - _state.isSearchingSuccess( - profile, - results.map((e) => ProfileV1.fromMap(e.toMap())).toList(), - ); - if (profile != null) { + _state.isSearchingSuccess(profile, []); await _db.contacts.upsert(DBContact( account: profile.account, username: profile.username, @@ -173,6 +167,14 @@ class ProfilesLogic extends WidgetsBindingObserver { imageMedium: profile.imageMedium, imageSmall: profile.imageSmall, )); + } else { + if (cleanValue.length >= 3) { + final results = await _db.contacts.search(cleanValue.toLowerCase()); + _state.isSearchingSuccess( + null, results.map((e) => ProfileV1.fromMap(e.toMap())).toList()); + } else { + _state.isSearchingSuccess(null, []); + } } return; } catch (e) { @@ -208,7 +210,8 @@ class ProfilesLogic extends WidgetsBindingObserver { Future searchProfile(String username) async { if (username.trim().isEmpty) { - allProfiles(); + debouncedSearchProfile.cancel(); + _state.clearSearch(); return; } @@ -350,6 +353,8 @@ class ProfilesLogic extends WidgetsBindingObserver { return; } + debouncedSearchProfile.cancel(); + _state.clearSearch(notify: notify); } diff --git a/lib/state/profiles/selectors.dart b/lib/state/profiles/selectors.dart index 878e0816..22d5c85e 100644 --- a/lib/state/profiles/selectors.dart +++ b/lib/state/profiles/selectors.dart @@ -2,9 +2,15 @@ import 'package:citizenwallet/services/wallet/contracts/profile.dart'; import 'package:citizenwallet/state/profiles/state.dart'; List selectProfileSuggestions(ProfilesState state) { + if (!state.searchLoading && + state.searchedProfile == null && + state.searchResults.isEmpty) { + return []; + } + Map profiles = {}; - if (state.searchedProfile != null && state.isActiveSearch) { + if (state.searchedProfile != null) { profiles[state.searchedProfile!.username] = state.searchedProfile!; } diff --git a/lib/state/profiles/state.dart b/lib/state/profiles/state.dart index f4bc8056..08fc38c0 100644 --- a/lib/state/profiles/state.dart +++ b/lib/state/profiles/state.dart @@ -35,7 +35,6 @@ class ProfilesState with ChangeNotifier { List searchResults = []; bool searchLoading = false; bool searchError = false; - bool isActiveSearch = false; ProfileV1? selectedProfile; @@ -74,7 +73,6 @@ class ProfilesState with ChangeNotifier { searchResults = []; searchLoading = false; searchError = false; - isActiveSearch = false; selectedProfile = null; if (notify) notifyListeners(); @@ -89,7 +87,6 @@ class ProfilesState with ChangeNotifier { void isSearching() { searchLoading = true; searchError = false; - isActiveSearch = true; notifyListeners(); } @@ -98,9 +95,6 @@ class ProfilesState with ChangeNotifier { searchedProfile = profile; searchLoading = false; searchError = false; - // Keep isActiveSearch true if we have a searched profile or results - // Set to false only when showing all profiles (profile is null and we have results) - isActiveSearch = profile != null || results.isEmpty; notifyListeners(); } @@ -108,7 +102,6 @@ class ProfilesState with ChangeNotifier { searchedProfile = null; searchLoading = false; searchError = true; - isActiveSearch = false; notifyListeners(); } From 9146e102b748c3725c6f33cd19089f603b95bb33 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Tue, 16 Sep 2025 15:26:11 +0530 Subject: [PATCH 41/46] fixed issue with api and added network crash protection --- lib/services/config/service.dart | 167 +++++++++++++++++++++---------- lib/state/communities/logic.dart | 88 ++++++++++------ 2 files changed, 172 insertions(+), 83 deletions(-) diff --git a/lib/services/config/service.dart b/lib/services/config/service.dart index 9fb274e0..b3e522ac 100644 --- a/lib/services/config/service.dart +++ b/lib/services/config/service.dart @@ -1,4 +1,6 @@ +import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'package:citizenwallet/services/api/api.dart'; import 'package:citizenwallet/services/config/config.dart'; @@ -138,37 +140,67 @@ class ConfigService { } Future> getConfigs({String? location}) async { - if (kDebugMode) { - final localConfigs = jsonDecode(await rootBundle.loadString( - 'assets/config/v$version/$communityConfigListFileName.json')); + try { + if (location != null) { + final response = await _api.get(url: location); + return [Config.fromJson(response)]; + } - final configs = - (localConfigs as List).map((e) => Config.fromJson(e)).toList(); + final response = await _api.get(url: '/api/communities'); - return configs; - } + try { + _pref.setConfigs(response); + } catch (e) { + debugPrint('Error saving configs to preferences: $e'); + } - if (location != null) { - // we only need a single file for the web - final response = await _api.get(url: location); + final configs = (response as List) + .map((e) { + try { + final configData = e['json']; + return configData != null ? Config.fromJson(configData) : null; + } catch (e) { + debugPrint('Error parsing config item: $e'); + return null; + } + }) + .where((config) => config != null) + .cast() + .toList(); - return [Config.fromJson(response)]; + return configs; + } on TimeoutException catch (e) { + debugPrint('Timeout fetching configs from API: $e'); + return _handleConfigAPIFailure(); + } on SocketException catch (e) { + debugPrint('Network error fetching configs from API: $e'); + return _handleConfigAPIFailure(); + } on FormatException catch (e) { + debugPrint('Invalid JSON response from configs API: $e'); + return _handleConfigAPIFailure(); + } catch (e, s) { + debugPrint('Error fetching configs from API: $e'); + debugPrintStack(stackTrace: s); + return _handleConfigAPIFailure(); } + } - final response = await _api.get(url: '/api/communities'); - - _pref.setConfigs(response); - - final configs = (response as List) - .map((e) { - final configData = e['json']; - return configData != null ? Config.fromJson(configData) : null; - }) - .where((config) => config != null) - .cast() - .toList(); + Future> _handleConfigAPIFailure() async { + if (kDebugMode) { + debugPrint('Falling back to local configs in debug mode'); + try { + final localConfigs = jsonDecode(await rootBundle.loadString( + 'assets/config/v$version/$communityConfigListFileName.json')); + + return (localConfigs as List).map((e) => Config.fromJson(e)).toList(); + } catch (e) { + debugPrint('Error loading local configs: $e'); + return []; + } + } - return configs; + debugPrint('Config API failed in production mode, returning empty list'); + return []; } Future> getLocalConfigs() async { @@ -211,10 +243,6 @@ class ConfigService { } Future getSingleCommunityConfig(String configLocation) async { - if (kDebugMode) { - return null; - } - try { String alias = configLocation; if (configLocation.contains('/')) { @@ -239,41 +267,78 @@ class ConfigService { } Future> getCommunitiesFromRemote() async { - if (kDebugMode) { - final localConfigs = jsonDecode(await rootBundle.loadString( - 'assets/config/v$version/$communityConfigListFileName.json')); + try { + final List response = await _api.get(url: '/api/communities'); - final configs = - (localConfigs as List).map((e) => Config.fromJson(e)).toList(); + if (response.isEmpty) { + debugPrint('Empty response from communities API'); + throw Exception('Empty response from communities API'); + } - return configs; + final List communities = response + .map((item) { + try { + final configData = item['json']; + return configData != null ? Config.fromJson(configData) : null; + } catch (e) { + debugPrint('Error parsing community config: $e'); + return null; + } + }) + .where((config) => config != null) + .cast() + .toList(); + + return communities; + } on TimeoutException catch (e) { + debugPrint('Timeout fetching communities from API: $e'); + return _handleCommunityAPIFailure(); + } on SocketException catch (e) { + debugPrint('Network error fetching communities from API: $e'); + return _handleCommunityAPIFailure(); + } on FormatException catch (e) { + debugPrint('Invalid JSON response from communities API: $e'); + return _handleCommunityAPIFailure(); + } catch (e, s) { + debugPrint('Error fetching communities from API: $e'); + debugPrintStack(stackTrace: s); + return _handleCommunityAPIFailure(); } + } - final List response = await _api.get(url: '/api/communities'); - - final List communities = response - .map((item) { - final configData = item['json']; - return configData != null ? Config.fromJson(configData) : null; - }) - .where((config) => config != null) - .cast() - .toList(); + Future> _handleCommunityAPIFailure() async { + if (kDebugMode) { + debugPrint('Falling back to local configs in debug mode'); + try { + final localConfigs = jsonDecode(await rootBundle.loadString( + 'assets/config/v$version/$communityConfigListFileName.json')); + + return (localConfigs as List).map((e) => Config.fromJson(e)).toList(); + } catch (e) { + debugPrint('Error loading local configs: $e'); + return []; + } + } - return communities; + debugPrint('API failed in production mode, returning empty community list'); + return []; } Future isCommunityOnline(String indexerUrl) async { - final indexer = APIService(baseURL: indexerUrl, netTimeoutSeconds: 20); + final indexer = APIService(baseURL: indexerUrl, netTimeoutSeconds: 10); try { await indexer.get(url: '/health'); return true; - } catch (e, s) { - debugPrint('indexerUrl: $indexerUrl'); - debugPrint('Error checking if community is online: $e, $indexerUrl'); - debugPrint('Stacktrace: $s, $indexerUrl'); - + } on TimeoutException catch (e) { + debugPrint('Timeout checking if community is online: $indexerUrl - $e'); + return false; + } on SocketException catch (e) { + debugPrint( + 'Network error checking if community is online: $indexerUrl - $e'); + return false; + } catch (e) { + debugPrint('Error checking if community is online: $indexerUrl - $e'); return false; } } diff --git a/lib/state/communities/logic.dart b/lib/state/communities/logic.dart index 439679fa..523a015d 100644 --- a/lib/state/communities/logic.dart +++ b/lib/state/communities/logic.dart @@ -92,7 +92,7 @@ class CommunitiesLogic { _state.fetchCommunitiesRequest(); final communities = await _db.communities.getAll(); - List communityConfigs = + final communityConfigs = communities.map((c) => Config.fromJson(c.config)).toList(); _state.fetchCommunitiesSuccess(communityConfigs); @@ -114,32 +114,58 @@ class CommunitiesLogic { void _fetchAllCommunitiesFromRemote() async { try { - final communities = await _db.communities.getAll(); - for (final community in communities) { - final config = Config.fromJson(community.config); - if (config.community.hidden) { - continue; - } + final remoteCommunities = await config.getCommunitiesFromRemote(); - final token = config.getPrimaryToken(); - final chain = config.chains[token.chainId.toString()]; + if (remoteCommunities.isNotEmpty) { + await _db.communities.upsert(remoteCommunities + .map((config) => DBCommunity.fromConfig(config)) + .toList()); + _state.upsertCommunities(remoteCommunities); + } + } catch (e) { + debugPrint('Error fetching communities from remote API: $e'); + } - if (chain != null) { - final isOnline = await this.config.isCommunityOnline(chain.node.url); - await _db.communities - .updateOnlineStatus(config.community.alias, isOnline); + try { + final communities = await _db.communities.getAll(); + for (final community in communities) { + try { + final config = Config.fromJson(community.config); + if (config.community.hidden) { + continue; + } + + final token = config.getPrimaryToken(); + final chain = config.chains[token.chainId.toString()]; + + if (chain != null) { + try { + final isOnline = + await this.config.isCommunityOnline(chain.node.url); + await _db.communities + .updateOnlineStatus(config.community.alias, isOnline); + _state.setCommunityOnline(config.community.alias, isOnline); + } catch (e) { + debugPrint( + 'Error checking online status for ${config.community.alias}: $e'); + await _db.communities + .updateOnlineStatus(config.community.alias, false); + _state.setCommunityOnline(config.community.alias, false); + } + } + } catch (e) { + debugPrint('Error processing community ${community.alias}: $e'); } } - return; } catch (e) { - // + debugPrint('Error checking community online status: $e'); } } void _fetchSingleCommunityFromRemote() async { try { final communities = await _db.communities.getAll(); - List communityConfigs = + final communityConfigs = communities.map((c) => Config.fromJson(c.config)).toList(); if (communityConfigs.isEmpty) { @@ -148,27 +174,26 @@ class CommunitiesLogic { final first = communityConfigs.first; - final remoteCommunity = - await config.getRemoteConfig(first.configLocation); + try { + final remoteCommunity = + await config.getRemoteConfig(first.configLocation); - if (remoteCommunity == null) { - return; + if (remoteCommunity != null) { + await _db.communities + .upsert([DBCommunity.fromConfig(remoteCommunity)]); + _state.upsertCommunities([remoteCommunity]); + } + } catch (e) { + debugPrint( + 'Error fetching remote config for ${first.community.alias}: $e'); } - - await _db.communities.upsert([DBCommunity.fromConfig(remoteCommunity)]); - return; } catch (e) { - // + debugPrint('Error in single community remote fetch: $e'); } } Future isAliasFromDeeplinkExist(String alias) async { - bool communityExists = await _db.communities.exists(alias); - if (communityExists) { - return true; - } - - return false; + return await _db.communities.exists(alias); } Future initializeAppDB() async { @@ -199,8 +224,7 @@ class CommunitiesLogic { if (existingIndex != -1) { remoteConfig.online = _state.communities[existingIndex].online; - _state.communities[existingIndex] = remoteConfig; - _state.notifyListeners(); + _state.upsertCommunities([remoteConfig]); } } } catch (e) { From d1299ad9f63b87a4bdeec6fa19e13c17f9a5c099 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Tue, 16 Sep 2025 21:32:27 +0530 Subject: [PATCH 42/46] Fixed save profile bu --- lib/modals/profile/edit.dart | 11 ++- lib/modals/profile/profile.dart | 5 +- lib/router/router.dart | 48 +++++++--- lib/screens/account/screen.dart | 2 +- lib/screens/accounts/screen.dart | 2 +- lib/screens/send/send_progress.dart | 3 +- lib/screens/send/send_to.dart | 1 + lib/screens/transaction/screen.dart | 144 +++++++++++++++++++++++++++- lib/screens/wallet/screen.dart | 4 +- lib/screens/wallet/screen.web.dart | 5 +- lib/state/profile/logic.dart | 31 +++--- lib/state/profiles/logic.dart | 1 + pubspec.yaml | 4 +- 13 files changed, 215 insertions(+), 46 deletions(-) diff --git a/lib/modals/profile/edit.dart b/lib/modals/profile/edit.dart index 8d762c5d..61628a6f 100644 --- a/lib/modals/profile/edit.dart +++ b/lib/modals/profile/edit.dart @@ -21,8 +21,11 @@ import 'package:rate_limiter/rate_limiter.dart'; import 'package:citizenwallet/l10n/app_localizations.dart'; class EditProfileModal extends StatefulWidget { + final WalletLogic? walletLogic; + const EditProfileModal({ super.key, + this.walletLogic, }); @override @@ -50,11 +53,14 @@ class EditProfileModalState extends State { _logic = ProfileLogic(context); _notificationsLogic = NotificationsLogic(context); - _walletLogic = WalletLogic(context, _notificationsLogic); + _walletLogic = + widget.walletLogic ?? WalletLogic(context, _notificationsLogic); debouncedHandleUsernameUpdate = debounce( (String username) { - _logic.checkUsername(username); + if (_logic.isInitialized) { + _logic.checkUsername(username); + } }, const Duration(milliseconds: 500), ); @@ -91,6 +97,7 @@ class EditProfileModalState extends State { _walletLogic.accountAddress!, ); } + _logic.startEdit(); } diff --git a/lib/modals/profile/profile.dart b/lib/modals/profile/profile.dart index 806e45f5..48ebf047 100644 --- a/lib/modals/profile/profile.dart +++ b/lib/modals/profile/profile.dart @@ -1,6 +1,7 @@ import 'package:citizenwallet/modals/profile/edit.dart'; import 'package:citizenwallet/state/profile/logic.dart'; import 'package:citizenwallet/state/profile/state.dart'; +import 'package:citizenwallet/state/wallet/logic.dart'; import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/utils/delay.dart'; import 'package:citizenwallet/widgets/profile/profile_qr_badge.dart'; @@ -15,12 +16,14 @@ class ProfileModal extends StatefulWidget { final String account; final bool readonly; final bool keepLink; + final WalletLogic? walletLogic; const ProfileModal({ super.key, required this.account, this.readonly = false, this.keepLink = false, + this.walletLogic, }); @override @@ -70,7 +73,7 @@ class ProfileModalState extends State { context: context, expand: true, topRadius: const Radius.circular(40), - builder: (context) => const EditProfileModal(), + builder: (context) => EditProfileModal(walletLogic: widget.walletLogic), ); } diff --git a/lib/router/router.dart b/lib/router/router.dart index 140dbcbc..e87882c1 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -188,15 +188,22 @@ GoRouter createRouter( } final extra = state.extra as Map; + final logic = extra['logic'] as WalletLogic; return ChangeNotifierProvider( key: Key('transaction-$transactionHash'), - create: (_) => TransactionState( - transactionHash: transactionHash, - ), + create: (_) { + final transactionState = TransactionState( + transactionHash: transactionHash, + ); + if (logic.config != null) { + transactionState.setConfig(logic.config!); + } + return transactionState; + }, child: TransactionScreen( transactionId: transactionHash, - logic: extra['logic'], + logic: logic, profilesLogic: extra['profilesLogic'], ), ); @@ -570,14 +577,33 @@ GoRouter createWebRouter( return const SizedBox(); } - final extra = state.extra as Map; + final transactionHash = + state.pathParameters['transactionId']; + if (transactionHash == null) { + return const SizedBox(); + } - return PopScope( - canPop: false, - child: TransactionScreen( - transactionId: state.pathParameters['transactionId'], - logic: extra['logic'], - profilesLogic: extra['profilesLogic'], + final extra = state.extra as Map; + final logic = extra['logic'] as WalletLogic; + + return ChangeNotifierProvider( + key: Key('transaction-$transactionHash'), + create: (_) { + final transactionState = TransactionState( + transactionHash: transactionHash, + ); + if (logic.config != null) { + transactionState.setConfig(logic.config!); + } + return transactionState; + }, + child: PopScope( + canPop: false, + child: TransactionScreen( + transactionId: transactionHash, + logic: logic, + profilesLogic: extra['profilesLogic'], + ), ), ); }, diff --git a/lib/screens/account/screen.dart b/lib/screens/account/screen.dart index 0e5feeaf..496f707e 100644 --- a/lib/screens/account/screen.dart +++ b/lib/screens/account/screen.dart @@ -112,7 +112,7 @@ class AccountScreenState extends State { context: context, expand: true, useRootNavigator: true, - builder: (context) => const EditProfileModal(), + builder: (context) => EditProfileModal(walletLogic: _walletLogic), ); } diff --git a/lib/screens/accounts/screen.dart b/lib/screens/accounts/screen.dart index b04cad9d..93af4bb0 100644 --- a/lib/screens/accounts/screen.dart +++ b/lib/screens/accounts/screen.dart @@ -339,7 +339,7 @@ class AccountsScreenState extends State { await showCupertinoModalBottomSheet?>( context: context, topRadius: const Radius.circular(40), - builder: (context) => const EditProfileModal(), + builder: (context) => EditProfileModal(walletLogic: widget.logic), ); } diff --git a/lib/screens/send/send_progress.dart b/lib/screens/send/send_progress.dart index 13ac9ab5..9ef2e7fa 100644 --- a/lib/screens/send/send_progress.dart +++ b/lib/screens/send/send_progress.dart @@ -163,8 +163,7 @@ class _SendProgressState extends State { final formattedAmount = inProgressTransaction.amount; - final profilesState = Provider.of(context, listen: true); - final selectedProfile = profilesState.selectedProfile; + final selectedProfile = context.watch().selectedProfile; final date = DateFormat.yMMMd().add_Hm().format(inProgressTransaction.date); diff --git a/lib/screens/send/send_to.dart b/lib/screens/send/send_to.dart index f3ce8b6b..2bd4c9cf 100644 --- a/lib/screens/send/send_to.dart +++ b/lib/screens/send/send_to.dart @@ -129,6 +129,7 @@ class _SendToScreenState extends State { } profilesLogic.clearSearch(); + await profilesLogic.allProfiles(); walletLogic.updateAddress(); nameFocusNode.requestFocus(); diff --git a/lib/screens/transaction/screen.dart b/lib/screens/transaction/screen.dart index 5783c09f..96f8217e 100644 --- a/lib/screens/transaction/screen.dart +++ b/lib/screens/transaction/screen.dart @@ -171,6 +171,7 @@ class TransactionScreenState extends State builder: (_) => ProfileModal( account: account, readonly: true, + walletLogic: widget.logic, ), ); } @@ -181,14 +182,151 @@ class TransactionScreenState extends State final wallet = context.select((WalletState state) => state.wallet); - final transaction = - context.watch().transaction; + final transactionState = + context.watch(); + final transaction = transactionState.transaction; + final transactionLoading = transactionState.loading; final loading = context.select((WalletState state) => state.loading); final blockSending = context.select(selectShouldBlockSending); - if (wallet == null || transaction == null) { + if (wallet == null) { + return const SizedBox(); + } + + if (transaction == null && transactionLoading) { + return CupertinoScaffold( + topRadius: const Radius.circular(40), + transitionBackgroundColor: Theme.of(context).colors.transparent, + body: CupertinoPageScaffold( + backgroundColor: + Theme.of(context).colors.uiBackgroundAlt.resolveFrom(context), + child: SafeArea( + top: false, + minimum: const EdgeInsets.only(left: 10, right: 10), + child: Flex( + direction: Axis.vertical, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), + child: Stack( + alignment: Alignment.center, + children: [ + const Center( + child: CupertinoActivityIndicator(), + ), + Positioned( + top: MediaQuery.of(context).padding.top, + left: 0, + child: CupertinoButton( + padding: const EdgeInsets.all(5), + onPressed: () => handleDismiss(context), + child: Icon( + CupertinoIcons.back, + color: Theme.of(context) + .colors + .primary + .resolveFrom(context), + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ); + } + + if (transaction == null && !transactionLoading) { + return CupertinoScaffold( + topRadius: const Radius.circular(40), + transitionBackgroundColor: Theme.of(context).colors.transparent, + body: CupertinoPageScaffold( + backgroundColor: + Theme.of(context).colors.uiBackgroundAlt.resolveFrom(context), + child: SafeArea( + top: false, + minimum: const EdgeInsets.only(left: 10, right: 10), + child: Flex( + direction: Axis.vertical, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), + child: Stack( + alignment: Alignment.center, + children: [ + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + CupertinoIcons.exclamationmark_triangle, + size: 48, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + const SizedBox(height: 16), + Text( + 'Transaction not found', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + const SizedBox(height: 8), + Text( + 'The transaction could not be loaded.', + style: TextStyle( + fontSize: 14, + color: Theme.of(context) + .colors + .text + .resolveFrom(context), + ), + ), + ], + ), + ), + Positioned( + top: MediaQuery.of(context).padding.top, + left: 0, + child: CupertinoButton( + padding: const EdgeInsets.all(5), + onPressed: () => handleDismiss(context), + child: Icon( + CupertinoIcons.back, + color: Theme.of(context) + .colors + .primary + .resolveFrom(context), + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ); + } + + if (transaction == null) { return const SizedBox(); } diff --git a/lib/screens/wallet/screen.dart b/lib/screens/wallet/screen.dart index f9fa2353..991ff076 100644 --- a/lib/screens/wallet/screen.dart +++ b/lib/screens/wallet/screen.dart @@ -516,6 +516,7 @@ class WalletScreenState extends State account: wallet.account, readonly: true, keepLink: true, + walletLogic: _logic, ), ); @@ -667,7 +668,7 @@ class WalletScreenState extends State await showCupertinoModalBottomSheet?>( context: context, topRadius: const Radius.circular(40), - builder: (context) => const EditProfileModal(), + builder: (context) => EditProfileModal(walletLogic: _logic), ); _profileLogic.resume(); @@ -1176,7 +1177,6 @@ class WalletScreenState extends State case ActionButtonType.plugins: handlePlugin(pluginConfig); break; - } } diff --git a/lib/screens/wallet/screen.web.dart b/lib/screens/wallet/screen.web.dart index 2546ebc7..76b4fedb 100644 --- a/lib/screens/wallet/screen.web.dart +++ b/lib/screens/wallet/screen.web.dart @@ -192,8 +192,7 @@ class BurnerWalletScreenState extends State { switch (deepLink) { case 'plugin': - final pluginConfig = - await _logic.getPluginConfig(widget.alias, params); + final pluginConfig = await _logic.getPluginConfig(widget.alias, params); if (pluginConfig == null) { return; } @@ -510,7 +509,7 @@ class BurnerWalletScreenState extends State { context: context, expand: true, useRootNavigator: true, - builder: (context) => const EditProfileModal(), + builder: (context) => EditProfileModal(walletLogic: _logic), ); _profileLogic.resume(); diff --git a/lib/state/profile/logic.dart b/lib/state/profile/logic.dart index d8c8a0f1..2e6de653 100644 --- a/lib/state/profile/logic.dart +++ b/lib/state/profile/logic.dart @@ -36,6 +36,7 @@ class ProfileLogic { late EthPrivateKey _credentials; late EthereumAddress _account; + bool _isInitialized = false; bool _pauseProfileCreation = false; ProfileLogic(BuildContext context) { @@ -48,8 +49,11 @@ class ProfileLogic { _config = config; _credentials = credentials; _account = account; + _isInitialized = true; } + bool get isInitialized => _isInitialized; + void resetAll() { _state.resetAll(); } @@ -86,9 +90,6 @@ class ProfileLogic { try { _state.setProfileLinkRequest(); - if (_account == null || _config == null) { - throw Exception('account or config not found'); - } final community = await _appDBService.communities.get(_config.community.alias); @@ -132,6 +133,11 @@ class ProfileLogic { } Future checkUsername(String username) async { + if (!_isInitialized) { + _state.setUsernameError(); + return; + } + if (username == '') { _state.setUsernameError(); } @@ -157,11 +163,6 @@ class ProfileLogic { return; } - if (_config == null) { - _state.setUsernameError(); - return; - } - try { _state.setUsernameRequest(); @@ -312,7 +313,7 @@ class ProfileLogic { } Future save(ProfileV1 profile, Uint8List? image) async { - if (_config == null || _account == null || _credentials == null) { + if (!_isInitialized) { return false; } @@ -337,8 +338,8 @@ class ProfileLogic { : await _photos.photoFromBundle('assets/icons/profile.jpg'); final accountForFactory = await _accountBackupDBService.accounts - .get(_account!, _config!.community.alias, ''); - + .get(_account, _config.community.alias, ''); + final url = await setProfile( _config, _account, @@ -413,7 +414,7 @@ class ProfileLogic { } Future update(ProfileV1 profile) async { - if (_config == null || _account == null || _credentials == null) { + if (!_isInitialized) { return false; } @@ -513,9 +514,6 @@ class ProfileLogic { } Future generateProfileUsername() async { - if (_config == null) { - return null; - } String username = await getRandomUsername(); _state.setUsernameSuccess(username: username); @@ -542,9 +540,6 @@ class ProfileLogic { Future giveProfileUsername() async { debugPrint('handleNewProfile'); - if (_config == null || _account == null || _credentials == null) { - return; - } try { final username = await generateProfileUsername(); diff --git a/lib/state/profiles/logic.dart b/lib/state/profiles/logic.dart index 8cc4518a..705590ab 100644 --- a/lib/state/profiles/logic.dart +++ b/lib/state/profiles/logic.dart @@ -212,6 +212,7 @@ class ProfilesLogic extends WidgetsBindingObserver { if (username.trim().isEmpty) { debouncedSearchProfile.cancel(); _state.clearSearch(); + await allProfiles(); return; } diff --git a/pubspec.yaml b/pubspec.yaml index 71e2bcb1..d2470a82 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: citizenwallet -version: 2.0.25+272 +version: 2.0.26+273 publish_to: none description: A mobile wallet for your community. environment: @@ -61,7 +61,7 @@ dependencies: firebase_messaging: ^15.1.3 firebase_core: ^3.6.0 flutter_inappwebview: ^6.0.0 - credential_manager: ^2.0.1 + credential_manager: ^2.0.4 googleapis: ^14.0.0 path_provider: ^2.1.2 icloud_storage: ^2.2.0 From 2eb38a4f482cd3ba5e3ff00e7a03567c4533f898 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Wed, 17 Sep 2025 18:55:07 +0530 Subject: [PATCH 43/46] repo update --- lib/modals/profile/edit.dart | 43 ++------- lib/modals/profile/profile.dart | 2 +- lib/router/router.dart | 6 +- lib/screens/account/screen.dart | 8 +- lib/screens/accounts/screen.dart | 2 +- lib/screens/landing/screen.dart | 6 +- lib/screens/wallet/screen.dart | 11 +-- lib/screens/wallet/screen.web.dart | 2 +- lib/services/config/service.dart | 5 ++ lib/services/migration/service.dart | 4 +- lib/state/profile/logic.dart | 134 ++++++++++++++++++---------- 11 files changed, 114 insertions(+), 109 deletions(-) diff --git a/lib/modals/profile/edit.dart b/lib/modals/profile/edit.dart index 61628a6f..67d68671 100644 --- a/lib/modals/profile/edit.dart +++ b/lib/modals/profile/edit.dart @@ -1,8 +1,6 @@ import 'package:citizenwallet/services/wallet/contracts/profile.dart'; -import 'package:citizenwallet/state/notifications/logic.dart'; import 'package:citizenwallet/state/profile/logic.dart'; import 'package:citizenwallet/state/profile/state.dart'; -import 'package:citizenwallet/state/wallet/logic.dart'; import 'package:citizenwallet/state/wallet/state.dart'; import 'package:citizenwallet/theme/provider.dart'; import 'package:citizenwallet/utils/delay.dart'; @@ -21,11 +19,8 @@ import 'package:rate_limiter/rate_limiter.dart'; import 'package:citizenwallet/l10n/app_localizations.dart'; class EditProfileModal extends StatefulWidget { - final WalletLogic? walletLogic; - const EditProfileModal({ super.key, - this.walletLogic, }); @override @@ -39,9 +34,7 @@ class EditProfileModalState extends State { final FocusNode nameFocusNode = FocusNode(); final FocusNode descriptionFocusNode = FocusNode(); - late ProfileLogic _logic; - late WalletLogic _walletLogic; - late NotificationsLogic _notificationsLogic; + late final ProfileLogic _logic = ProfileLogic(context); late Debounce debouncedHandleUsernameUpdate; late Debounce debouncedHandleNameUpdate; @@ -51,16 +44,10 @@ class EditProfileModalState extends State { void initState() { super.initState(); - _logic = ProfileLogic(context); - _notificationsLogic = NotificationsLogic(context); - _walletLogic = - widget.walletLogic ?? WalletLogic(context, _notificationsLogic); debouncedHandleUsernameUpdate = debounce( (String username) { - if (_logic.isInitialized) { - _logic.checkUsername(username); - } + _logic.checkUsername(username); }, const Duration(milliseconds: 500), ); @@ -87,17 +74,7 @@ class EditProfileModalState extends State { void onLoad() async { await delay(const Duration(milliseconds: 250)); - - if (_walletLogic.config != null && - _walletLogic.credentials != null && - _walletLogic.accountAddress != null) { - _logic.setWalletState( - _walletLogic.config!, - _walletLogic.credentials!, - _walletLogic.accountAddress!, - ); - } - + _logic.startEdit(); } @@ -139,7 +116,6 @@ class EditProfileModalState extends State { HapticFeedback.lightImpact(); final wallet = context.read().wallet; - final newName = context.read().nameController.value.text; if (wallet == null) { return; @@ -156,10 +132,6 @@ class EditProfileModalState extends State { return; } - if (newName.isNotEmpty) { - await _walletLogic.editWallet(wallet.account, wallet.alias, newName); - } - HapticFeedback.heavyImpact(); navigator.pop(); } @@ -170,8 +142,8 @@ class EditProfileModalState extends State { FocusManager.instance.primaryFocus?.unfocus(); HapticFeedback.lightImpact(); - final wallet = context.read().wallet; - final newName = context.read().nameController.value.text; + final walletState = context.read(); + final wallet = walletState.wallet; if (wallet == null) { return; @@ -187,10 +159,6 @@ class EditProfileModalState extends State { return; } - if (newName.isNotEmpty) { - await _walletLogic.editWallet(wallet.account, wallet.alias, newName); - } - HapticFeedback.heavyImpact(); navigator.pop(); } @@ -201,6 +169,7 @@ class EditProfileModalState extends State { _logic.selectPhoto(); } + @override Widget build(BuildContext context) { final width = MediaQuery.of(context).size.width; diff --git a/lib/modals/profile/profile.dart b/lib/modals/profile/profile.dart index 48ebf047..9104dc35 100644 --- a/lib/modals/profile/profile.dart +++ b/lib/modals/profile/profile.dart @@ -73,7 +73,7 @@ class ProfileModalState extends State { context: context, expand: true, topRadius: const Radius.circular(40), - builder: (context) => EditProfileModal(walletLogic: widget.walletLogic), + builder: (context) => const EditProfileModal(), ); } diff --git a/lib/router/router.dart b/lib/router/router.dart index e87882c1..9ccdd9a9 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -584,7 +584,6 @@ GoRouter createWebRouter( } final extra = state.extra as Map; - final logic = extra['logic'] as WalletLogic; return ChangeNotifierProvider( key: Key('transaction-$transactionHash'), @@ -592,16 +591,13 @@ GoRouter createWebRouter( final transactionState = TransactionState( transactionHash: transactionHash, ); - if (logic.config != null) { - transactionState.setConfig(logic.config!); - } return transactionState; }, child: PopScope( canPop: false, child: TransactionScreen( transactionId: transactionHash, - logic: logic, + logic: extra['logic'], profilesLogic: extra['profilesLogic'], ), ), diff --git a/lib/screens/account/screen.dart b/lib/screens/account/screen.dart index 496f707e..df568816 100644 --- a/lib/screens/account/screen.dart +++ b/lib/screens/account/screen.dart @@ -72,12 +72,6 @@ class AccountScreenState extends State { widget.address!, widget.alias!, (bool hasChanged) async { - _logic.setWalletState( - _walletLogic.config!, - _walletLogic.credentials!, - _walletLogic.accountAddress!, - ); - await _logic.loadProfileLink(); if (hasChanged) { @@ -112,7 +106,7 @@ class AccountScreenState extends State { context: context, expand: true, useRootNavigator: true, - builder: (context) => EditProfileModal(walletLogic: _walletLogic), + builder: (context) => const EditProfileModal(), ); } diff --git a/lib/screens/accounts/screen.dart b/lib/screens/accounts/screen.dart index 93af4bb0..b04cad9d 100644 --- a/lib/screens/accounts/screen.dart +++ b/lib/screens/accounts/screen.dart @@ -339,7 +339,7 @@ class AccountsScreenState extends State { await showCupertinoModalBottomSheet?>( context: context, topRadius: const Radius.circular(40), - builder: (context) => EditProfileModal(walletLogic: widget.logic), + builder: (context) => const EditProfileModal(), ); } diff --git a/lib/screens/landing/screen.dart b/lib/screens/landing/screen.dart index 954f0b63..25c13e77 100644 --- a/lib/screens/landing/screen.dart +++ b/lib/screens/landing/screen.dart @@ -128,7 +128,11 @@ class LandingScreenState extends State _appLogic.loadApp(); - await _appLogic.checkMigrationRequired(); + // Feature flag for migration check - set to false to disable + const bool enableMigrationCheck = false; + if (enableMigrationCheck) { + await _appLogic.checkMigrationRequired(); + } // set up recovery await handleAppleRecover(); diff --git a/lib/screens/wallet/screen.dart b/lib/screens/wallet/screen.dart index 991ff076..4d9d5954 100644 --- a/lib/screens/wallet/screen.dart +++ b/lib/screens/wallet/screen.dart @@ -87,7 +87,6 @@ class WalletScreenState extends State String? _deepLink; String? _deepLinkParams; String? _sendToURL; - Config? _config; @override void initState() { @@ -187,12 +186,6 @@ class WalletScreenState extends State _address!, _alias!, (bool hasChanged) async { - _profileLogic.setWalletState( - _logic.config!, - _logic.credentials!, - _logic.accountAddress!, - ); - _voucherLogic.setWalletState( _logic.config!, _logic.credentials!, @@ -668,7 +661,7 @@ class WalletScreenState extends State await showCupertinoModalBottomSheet?>( context: context, topRadius: const Radius.circular(40), - builder: (context) => EditProfileModal(walletLogic: _logic), + builder: (context) => const EditProfileModal(), ); _profileLogic.resume(); @@ -1392,7 +1385,7 @@ class WalletScreenState extends State ), OfflineBanner( communityUrl: config?.community.url ?? '', - display: isOffline, + display: showOfflineBanner, loading: eventServiceState == EventServiceState.connecting, ), ], diff --git a/lib/screens/wallet/screen.web.dart b/lib/screens/wallet/screen.web.dart index 76b4fedb..a95e0333 100644 --- a/lib/screens/wallet/screen.web.dart +++ b/lib/screens/wallet/screen.web.dart @@ -509,7 +509,7 @@ class BurnerWalletScreenState extends State { context: context, expand: true, useRootNavigator: true, - builder: (context) => EditProfileModal(walletLogic: _logic), + builder: (context) => const EditProfileModal(), ); _profileLogic.resume(); diff --git a/lib/services/config/service.dart b/lib/services/config/service.dart index b3e522ac..3875d1be 100644 --- a/lib/services/config/service.dart +++ b/lib/services/config/service.dart @@ -251,6 +251,11 @@ class ConfigService { final response = await _api.get(url: '/api/communities/$alias'); + if (response == null) { + debugPrint('No response received for community alias: $alias'); + return null; + } + final configData = response['json']; if (configData == null) { debugPrint('No config data found in response for alias: $alias'); diff --git a/lib/services/migration/service.dart b/lib/services/migration/service.dart index 8dfb8f6e..cf3f194f 100644 --- a/lib/services/migration/service.dart +++ b/lib/services/migration/service.dart @@ -107,8 +107,8 @@ class MigrationService { await launchNewApp(privateKeyHex); } catch (e, stackTrace) { - debugPrint(' 🚨 Error: $e'); - debugPrint(' 📍 Stack Trace: $stackTrace'); + debugPrint('Error: $e'); + debugPrint('Stack Trace: $stackTrace'); rethrow; } } diff --git a/lib/state/profile/logic.dart b/lib/state/profile/logic.dart index 2e6de653..77d92e5d 100644 --- a/lib/state/profile/logic.dart +++ b/lib/state/profile/logic.dart @@ -1,3 +1,4 @@ +import 'package:citizenwallet/services/accounts/accounts.dart'; import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/db/account/contacts.dart'; import 'package:citizenwallet/services/db/account/db.dart'; @@ -10,6 +11,7 @@ import 'package:citizenwallet/services/wallet/utils.dart'; import 'package:citizenwallet/services/wallet/wallet.dart'; import 'package:citizenwallet/state/profile/state.dart'; import 'package:citizenwallet/state/profiles/state.dart'; +import 'package:citizenwallet/state/wallet/state.dart'; import 'package:citizenwallet/utils/delay.dart'; import 'package:citizenwallet/utils/formatters.dart'; import 'package:citizenwallet/utils/random.dart'; @@ -30,29 +32,48 @@ class ProfileLogic { late ProfileState _state; late ProfilesState _profiles; final PhotosService _photos = PhotosService(); + final AccountsServiceInterface _accountsService = getAccountsService(); final AccountDBService _db = AccountDBService(); - late Config _config; - late EthPrivateKey _credentials; - late EthereumAddress _account; - - bool _isInitialized = false; + late BuildContext _context; bool _pauseProfileCreation = false; ProfileLogic(BuildContext context) { + _context = context; _state = context.read(); _profiles = context.read(); } - void setWalletState( - Config config, EthPrivateKey credentials, EthereumAddress account) { - _config = config; - _credentials = credentials; - _account = account; - _isInitialized = true; + Config? get _config => _context.read().config; + String? get _walletAccount => _context.read().wallet?.account; + String? get _walletAlias => _context.read().wallet?.alias; + + Future get _credentials async { + final account = _walletAccount; + final alias = _walletAlias; + if (account == null || alias == null) return null; + + final dbAccount = await _accountsService.getAccount(account, alias, ''); + return dbAccount?.privateKey; + } + + EthereumAddress? get _account { + final account = _walletAccount; + return account != null ? EthereumAddress.fromHex(account) : null; + } + + Future<({Config? config, EthPrivateKey? credentials, EthereumAddress? account})?> get _walletData async { + final config = _config; + final credentials = await _credentials; + final account = _account; + + if (config == null || credentials == null || account == null) { + return null; + } + + return (config: config, credentials: credentials, account: account); } - bool get isInitialized => _isInitialized; void resetAll() { _state.resetAll(); @@ -90,8 +111,10 @@ class ProfileLogic { try { _state.setProfileLinkRequest(); + final walletData = await _walletData; + if (walletData == null) return; - final community = await _appDBService.communities.get(_config.community.alias); + final community = await _appDBService.communities.get(walletData.config!.community.alias); if (community == null) { throw Exception('community not found'); @@ -102,7 +125,7 @@ class ProfileLogic { final url = communityConfig.community.walletUrl(deepLinkURL); final compressedParams = compress( - '?address=${_account.hexEip55}&alias=${communityConfig.community.alias}'); + '?address=${walletData.account!.hexEip55}&alias=${communityConfig.community.alias}'); _state.setProfileLinkSuccess('$url&receiveParams=$compressedParams'); return; @@ -133,7 +156,8 @@ class ProfileLogic { } Future checkUsername(String username) async { - if (!_isInitialized) { + final walletData = await _walletData; + if (walletData == null) { _state.setUsernameError(); return; } @@ -166,12 +190,12 @@ class ProfileLogic { try { _state.setUsernameRequest(); - final exists = await profileExists(_config, username.toLowerCase()); + final exists = await profileExists(walletData.config!, username.toLowerCase()); if (exists) { final existingProfile = - await getProfileByUsername(_config, username.toLowerCase()); + await getProfileByUsername(walletData.config!, username.toLowerCase()); if (existingProfile != null && - existingProfile.account == _account.hexEip55) { + existingProfile.account == walletData.account!.hexEip55) { _state.setUsernameSuccess(); return; } @@ -192,8 +216,11 @@ class ProfileLogic { } Future loadProfile({String? account, bool online = false}) async { - final ethAccount = _account; - final alias = _config.community.alias; + final walletData = await _walletData; + if (walletData == null) return; + + final ethAccount = walletData.account!; + final alias = walletData.config!.community.alias; final acc = account ?? ethAccount.hexEip55; resume(); @@ -226,7 +253,7 @@ class ProfileLogic { throw Exception('community is offline'); } - final profile = await getProfile(_config, acc); + final profile = await getProfile(walletData.config!, acc); if (profile == null) { _state.setProfileNoChangeSuccess(); @@ -288,7 +315,10 @@ class ProfileLogic { _state.viewProfileSuccess(cachedProfile!.profile); } - final profile = await getProfile(_config, account); + final config = _config; + if (config == null) return; + + final profile = await getProfile(config, account); if (profile == null) { await delay(const Duration(milliseconds: 500)); _state.setViewProfileNoChangeSuccess(); @@ -312,8 +342,13 @@ class ProfileLogic { _state.viewProfileError(); } + /// Save a new profile with optional image Future save(ProfileV1 profile, Uint8List? image) async { - if (!_isInitialized) { + final config = _config; + final credentials = await _credentials; + final account = _account; + + if (config == null || credentials == null || account == null) { return false; } @@ -326,7 +361,7 @@ class ProfileLogic { profile.name = _state.nameController.value.text; profile.description = _state.descriptionController.value.text; - final exists = await createAccount(_config, _account, _credentials); + final exists = await createAccount(config, account, credentials); if (!exists) { throw Exception('Failed to create account'); } @@ -338,12 +373,12 @@ class ProfileLogic { : await _photos.photoFromBundle('assets/icons/profile.jpg'); final accountForFactory = await _accountBackupDBService.accounts - .get(_account, _config.community.alias, ''); + .get(account, config.community.alias, ''); final url = await setProfile( - _config, - _account, - _credentials, + config, + account, + credentials, ProfileRequest.fromProfileV1(profile), image: newImage, fileType: '.jpg', @@ -355,7 +390,7 @@ class ProfileLogic { _state.setProfileFetching(); - final newProfile = await getProfileFromUrl(_config, url); + final newProfile = await getProfileFromUrl(config, url); if (newProfile == null) { throw Exception('Failed to load profile'); } @@ -386,12 +421,12 @@ class ProfileLogic { final existingAccount = await _accountBackupDBService.accounts.get( EthereumAddress.fromHex(newProfile.account), - _config.community.alias, + config.community.alias, ''); _accountBackupDBService.accounts.update( DBAccount( - alias: _config.community.alias, + alias: config.community.alias, address: EthereumAddress.fromHex(newProfile.account), name: newProfile.name, username: newProfile.username, @@ -413,8 +448,13 @@ class ProfileLogic { return false; } + /// Update an existing profile Future update(ProfileV1 profile) async { - if (!_isInitialized) { + final config = _config; + final credentials = await _credentials; + final account = _account; + + if (config == null || credentials == null || account == null) { return false; } @@ -430,7 +470,7 @@ class ProfileLogic { _state.setProfileExisting(); - final existing = await getProfile(_config, profile.account); + final existing = await getProfile(config, profile.account); if (existing == null) { throw Exception('Failed to load profile'); } @@ -442,14 +482,14 @@ class ProfileLogic { _state.setProfileUploading(); - final url = await updateProfile(_config, _account, _credentials, profile); + final url = await updateProfile(config, account, credentials, profile); if (url == null) { throw Exception('Failed to save profile'); } _state.setProfileFetching(); - final newProfile = await getProfileFromUrl(_config, url); + final newProfile = await getProfileFromUrl(config, url); if (newProfile == null) { throw Exception('Failed to load profile'); } @@ -478,12 +518,12 @@ class ProfileLogic { final existingAccount = await _accountBackupDBService.accounts.get( EthereumAddress.fromHex(newProfile.account), - _config.community.alias, + config.community.alias, ''); _accountBackupDBService.accounts.update( DBAccount( - alias: _config.community.alias, + alias: config.community.alias, address: EthereumAddress.fromHex(newProfile.account), name: newProfile.name, username: newProfile.username, @@ -514,6 +554,8 @@ class ProfileLogic { } Future generateProfileUsername() async { + final walletData = await _walletData; + if (walletData == null) return null; String username = await getRandomUsername(); _state.setUsernameSuccess(username: username); @@ -522,7 +564,7 @@ class ProfileLogic { const baseDelay = Duration(milliseconds: 100); for (int tries = 1; tries <= maxTries; tries++) { - final exists = await profileExists(_config, username); + final exists = await profileExists(walletData.config!, username); if (!exists) { return username; @@ -540,6 +582,8 @@ class ProfileLogic { Future giveProfileUsername() async { debugPrint('handleNewProfile'); + final walletData = await _walletData; + if (walletData == null) return; try { final username = await generateProfileUsername(); @@ -548,8 +592,8 @@ class ProfileLogic { return; } - final address = _account.hexEip55; - final alias = _config.community.alias; + final address = walletData.account!.hexEip55; + final alias = walletData.config!.community.alias; final account = await _accountBackupDBService.accounts .get(EthereumAddress.fromHex(address), alias, ''); @@ -572,7 +616,7 @@ class ProfileLogic { return; } - final exists = await createAccount(_config, _account, _credentials); + final exists = await createAccount(walletData.config!, walletData.account!, walletData.credentials!); if (!exists) { throw Exception('Failed to create account'); } @@ -582,9 +626,9 @@ class ProfileLogic { } final url = await setProfile( - _config, - _account, - _credentials, + walletData.config!, + walletData.account!, + walletData.credentials!, ProfileRequest.fromProfileV1(profile), image: await _photos.photoFromBundle('assets/icons/profile.jpg'), fileType: '.jpg', @@ -598,7 +642,7 @@ class ProfileLogic { return; } - final newProfile = await getProfileFromUrl(_config, url); + final newProfile = await getProfileFromUrl(walletData.config!, url); if (newProfile == null) { throw Exception('Failed to get profile from url $url'); } From f57f896e90af3a8363edd13ab82df47c05139860 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Thu, 18 Sep 2025 14:30:33 +0530 Subject: [PATCH 44/46] pubspec update --- android/app/build.gradle | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 3f68756f..c9ebe859 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -31,7 +31,7 @@ if (keystorePropertiesFile.exists()) { android { // compileSdkVersion flutter.compileSdkVersion - compileSdkVersion 35 + compileSdkVersion 36 // ndkVersion flutter.ndkVersion ndkVersion = "27.0.12077973" diff --git a/pubspec.yaml b/pubspec.yaml index d2470a82..6a73850e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: citizenwallet -version: 2.0.26+273 +version: 2.0.26+274 publish_to: none description: A mobile wallet for your community. environment: From 1caef657964238d6e5c31490d7ba136bd014922c Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Mon, 22 Sep 2025 17:09:54 +0530 Subject: [PATCH 45/46] repo update --- .metadata | 12 +- .../citizenwallet/MainActivity.kt | 5 + ios/Podfile.lock | 48 ++++---- lib/modals/profile/edit.dart | 7 +- lib/services/accounts/native/android.dart | 2 +- lib/services/accounts/native/apple.dart | 108 +----------------- lib/services/wallet/wallet.dart | 46 ++++++-- lib/state/profile/logic.dart | 57 ++++++--- pubspec.lock | 34 +++--- 9 files changed, 130 insertions(+), 189 deletions(-) create mode 100644 android/app/src/main/kotlin/xyz/citizenwallet/citizenwallet/MainActivity.kt diff --git a/.metadata b/.metadata index 0d9855ef..38038067 100644 --- a/.metadata +++ b/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "be698c48a6750c8cb8e61c740ca9991bb947aba2" + revision: "a402d9a4376add5bc2d6b1e33e53edaae58c07f8" channel: "stable" project_type: app @@ -13,11 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2 - base_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2 - - platform: ios - create_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2 - base_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2 + create_revision: a402d9a4376add5bc2d6b1e33e53edaae58c07f8 + base_revision: a402d9a4376add5bc2d6b1e33e53edaae58c07f8 + - platform: android + create_revision: a402d9a4376add5bc2d6b1e33e53edaae58c07f8 + base_revision: a402d9a4376add5bc2d6b1e33e53edaae58c07f8 # User provided section diff --git a/android/app/src/main/kotlin/xyz/citizenwallet/citizenwallet/MainActivity.kt b/android/app/src/main/kotlin/xyz/citizenwallet/citizenwallet/MainActivity.kt new file mode 100644 index 00000000..e0db280a --- /dev/null +++ b/android/app/src/main/kotlin/xyz/citizenwallet/citizenwallet/MainActivity.kt @@ -0,0 +1,5 @@ +package xyz.citizenwallet.citizenwallet + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/ios/Podfile.lock b/ios/Podfile.lock index cf296501..c30fca89 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -159,9 +159,9 @@ PODS: - reown_yttrium (0.0.1): - Flutter - YttriumWrapper (= 0.8.35) - - SDWebImage (5.21.0): - - SDWebImage/Core (= 5.21.0) - - SDWebImage/Core (5.21.0) + - SDWebImage (5.21.2): + - SDWebImage/Core (= 5.21.2) + - SDWebImage/Core (5.21.2) - share_plus (0.0.1): - Flutter - shared_preferences_foundation (0.0.1): @@ -265,43 +265,43 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f - audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40 - connectivity_plus: 2a701ffec2c0ae28a48cf7540e279787e77c447d - credential_manager: feb21034894e469e3686461dc96fb24bb7d350e4 + audioplayers_darwin: ccf9c770ee768abb07e26d90af093f7bab1c12ab + connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd + credential_manager: e32c96e222e95368067810f7529eea06d9c5c171 DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 - file_picker: be9a674155d9f334323856cb266e0d145d75d5c0 + file_picker: 6d4bf27b7318804adf4ddc1827dbc5cd4b78042d Firebase: 1fe1c0a7d9aaea32efe01fbea5f0ebd8d70e53a2 - firebase_core: 3c2f323cae65c97a636a05a23b17730ef93df2cf - firebase_messaging: 456e01ff29a451c90097d0b45925551d5be0c143 + firebase_core: ba71b44041571da878cb624ce0d80250bcbe58ad + firebase_messaging: 13129fe2ca166d1ed2d095062d76cee88943d067 FirebaseCore: 8344daef5e2661eb004b177488d6f9f0f24251b7 FirebaseCoreInternal: ef4505d2afb1d0ebbc33162cb3795382904b5679 FirebaseInstallations: 9980995bdd06ec8081dfb6ab364162bdd64245c3 FirebaseMessaging: 2b9f56aa4ed286e1f0ce2ee1d413aabb8f9f5cb9 - Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4 - flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 - google_sign_in_ios: 7411fab6948df90490dc4620ecbcabdc3ca04017 + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99 + flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 + google_sign_in_ios: b48bb9af78576358a168361173155596c845f0b9 GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 GoogleSignIn: ce8c89bb9b37fb624b92e7514cc67335d1e277e4 GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - icloud_storage: d9ac7a33ced81df08ba7ea1bf3099cc0ee58f60a - mobile_scanner: 77265f3dc8d580810e91849d4a0811a90467ed5e + icloud_storage: e55639f0c0d7cb2b0ba9c0b3d5968ccca9cd9aa2 + mobile_scanner: 9157936403f5a0644ca3779a38ff8404c5434a93 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - nfc_manager: d7da7cb781f7744b94df5fe9dbca904ac4a0939e + nfc_manager: 9c40fe22528ab871ca11e52ea8b95790e9d92ca2 OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 - package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 - path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 + path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - reown_yttrium: c0e87e5965fa60a3559564cc35cffbba22976089 - SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868 - share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f - shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 - sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + reown_yttrium: cee334ade64725b1d83f7b34c706a6aae2696d58 + SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a + share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a + shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 + sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 - url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe + url_launcher_ios: 694010445543906933d732453a59da0a173ae33d YttriumWrapper: 31e937fe9fbe0f1314d2ca6be9ce9b379a059966 PODFILE CHECKSUM: f90b7b7d52ec0d905039aa6f51266424548151c7 diff --git a/lib/modals/profile/edit.dart b/lib/modals/profile/edit.dart index 67d68671..cc94824d 100644 --- a/lib/modals/profile/edit.dart +++ b/lib/modals/profile/edit.dart @@ -44,7 +44,6 @@ class EditProfileModalState extends State { void initState() { super.initState(); - debouncedHandleUsernameUpdate = debounce( (String username) { _logic.checkUsername(username); @@ -74,7 +73,7 @@ class EditProfileModalState extends State { void onLoad() async { await delay(const Duration(milliseconds: 250)); - + _logic.startEdit(); } @@ -169,7 +168,6 @@ class EditProfileModalState extends State { _logic.selectPhoto(); } - @override Widget build(BuildContext context) { final width = MediaQuery.of(context).size.width; @@ -247,7 +245,8 @@ class EditProfileModalState extends State { child: ListView( controller: ModalScrollController.of(context), physics: const ScrollPhysics( - parent: BouncingScrollPhysics()), + parent: BouncingScrollPhysics(), + ), children: [ Stack( alignment: Alignment.center, diff --git a/lib/services/accounts/native/android.dart b/lib/services/accounts/native/android.dart index bdda2be5..2a486506 100644 --- a/lib/services/accounts/native/android.dart +++ b/lib/services/accounts/native/android.dart @@ -58,7 +58,7 @@ class AndroidAccountsService extends AccountsServiceInterface { accountFactoryAddress: '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185', ); - final txHash = await submitUserop(config, userop); + final txHash = await submitUserop(config, userop, migrationSafe: true); if (txHash != null) { debugPrint('fixed cw-safe account ${account.address.hexEip55}'); diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index bf0eb964..d08576f8 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -54,7 +54,7 @@ class AppleAccountsService extends AccountsServiceInterface { accountFactoryAddress: '0x7cC54D54bBFc65d1f0af7ACee5e4042654AF8185', ); - final txHash = await submitUserop(config, userop); + final txHash = await submitUserop(config, userop, migrationSafe: true); if (txHash != null) { debugPrint('fixed cw-safe account ${account.address.hexEip55}'); @@ -100,112 +100,6 @@ class AppleAccountsService extends AccountsServiceInterface { } final migrations = { - 1: () async { - // coming from the old version, migrate all keys and delete the old ones - // all or nothing, first write all the new ones, then delete all the old ones - final allBackups = await getAllLegacyWalletBackups(); - - for (final backup in allBackups) { - // await setAccount(backup); - final saved = await _credentials.containsKey(backup.legacyKey2); - if (saved) { - await _credentials.delete(backup.legacyKey2); - } - - await _credentials.write( - backup.legacyKey2, - backup.value, - ); - } - - // delete all old keys - for (final backup in allBackups) { - // legacy delete - final saved = await _credentials.containsKey( - backup.legacyKey, - ); - if (saved) { - await _credentials.delete(backup.legacyKey); - } - } - }, - 2: () async { - final allBackups = await getAllLegacyWalletBackups(); - - for (final backup in allBackups) { - final saved = await _credentials.containsKey(backup.key); - if (saved) { - await _credentials.delete(backup.key); - } - - await _credentials.write( - backup.key, - backup.value, - ); - } - - // delete all old keys - for (final backup in allBackups) { - // delete legacy keys - final saved = await _credentials.containsKey( - backup.legacyKey2, - ); - - if (saved) { - await _credentials.delete( - backup.legacyKey2, - ); - } - } - }, - 3: () async { - final allBackups = await getAllLegacyWalletBackups(); - - final toDelete = []; - - for (final backup in allBackups) { - bool saved = await _credentials.containsKey(backup.key); - if (!saved) { - continue; - } - - final account = await getLegacyAccountAddress(backup); - if (account == null) { - continue; - } - - final newBackup = LegacyBackupWallet( - address: account.hexEip55, - privateKey: backup.privateKey, - name: backup.name, - alias: backup.alias, - ); - - await _credentials.write( - newBackup.key, - newBackup.value, - ); - - toDelete.add(backup.key); - } - - // delete all old keys - for (final backup in allBackups) { - if (!toDelete.contains(backup.key)) { - continue; - } - - final saved = await _credentials.containsKey( - backup.key, - ); - - if (saved) { - await _credentials.delete( - backup.key, - ); - } - } - }, 4: () async { final allLegacyBackups = await getAllLegacyWalletBackups(); diff --git a/lib/services/wallet/wallet.dart b/lib/services/wallet/wallet.dart index cb910d34..2fcca7eb 100644 --- a/lib/services/wallet/wallet.dart +++ b/lib/services/wallet/wallet.dart @@ -208,14 +208,11 @@ Future profileExists(Config config, String username) async { Future getProfileFromUrl(Config config, String url) async { try { final profileData = await config.ipfsService.get(url: '/$url'); - final profile = ProfileV1.fromJson(profileData); - profile.parseIPFSImageURLs(config.ipfs.url); - return profile; } catch (exception) { - // + debugPrint('Error: $exception'); } return null; @@ -271,7 +268,14 @@ Future setProfile( accountFactoryAddress: factoryAddress, ); - final txHash = await submitUserop(config, userop); + final paymasterType = config.getPaymasterType(); + final isCWSafeAccount = paymasterType == 'cw-safe'; + + final txHash = await submitUserop( + config, + userop, + migrationSafe: isCWSafeAccount, + ); if (txHash == null) { throw Exception('profile update failed'); } @@ -291,8 +295,13 @@ Future setProfile( } /// update profile data -Future updateProfile(Config config, EthereumAddress account, - EthPrivateKey credentials, ProfileV1 profile) async { +Future updateProfile( + Config config, + EthereumAddress account, + EthPrivateKey credentials, + ProfileV1 profile, { + String? accountFactoryAddress, +}) async { try { final url = '/v1/profiles/${config.profileContract.addr}/${account.hexEip55}'; @@ -320,16 +329,27 @@ Future updateProfile(Config config, EthereumAddress account, final calldata = config.profileContract .setCallData(account.hexEip55, profile.username, profileUrl); + final factoryAddress = + accountFactoryAddress ?? config.community.primaryAccountFactory.address; + final (_, userop) = await prepareUserop( config, account, credentials, [config.profileContract.addr], [calldata], - accountFactoryAddress: config.community.primaryAccountFactory.address, + accountFactoryAddress: factoryAddress, + ); + + final paymasterType = config.getPaymasterType(); + final isCWSafeAccount = paymasterType == 'cw-safe'; + + final txHash = await submitUserop( + config, + userop, + migrationSafe: isCWSafeAccount, ); - final txHash = await submitUserop(config, userop); if (txHash == null) { throw Exception('profile update failed'); } @@ -340,7 +360,9 @@ Future updateProfile(Config config, EthereumAddress account, } return profileUrl; - } catch (_) {} + } catch (e, stackTrace) { + debugPrint('Stack trace: $stackTrace'); + } return null; } @@ -1182,8 +1204,8 @@ Future _submitUseropOriginal( throw NetworkInvalidBalanceException(); } - if (strerr.contains(unauthorizedErrorMessage) || - strerr.contains(accessDeniedErrorMessage) || + if (strerr.contains(unauthorizedErrorMessage) || + strerr.contains(accessDeniedErrorMessage) || strerr.contains(forbiddenErrorMessage)) { throw NetworkUnauthorizedException(); } diff --git a/lib/state/profile/logic.dart b/lib/state/profile/logic.dart index 77d92e5d..5e1ff11d 100644 --- a/lib/state/profile/logic.dart +++ b/lib/state/profile/logic.dart @@ -52,7 +52,7 @@ class ProfileLogic { final account = _walletAccount; final alias = _walletAlias; if (account == null || alias == null) return null; - + final dbAccount = await _accountsService.getAccount(account, alias, ''); return dbAccount?.privateKey; } @@ -62,19 +62,23 @@ class ProfileLogic { return account != null ? EthereumAddress.fromHex(account) : null; } - Future<({Config? config, EthPrivateKey? credentials, EthereumAddress? account})?> get _walletData async { + Future< + ({ + Config? config, + EthPrivateKey? credentials, + EthereumAddress? account + })?> get _walletData async { final config = _config; final credentials = await _credentials; final account = _account; - + if (config == null || credentials == null || account == null) { return null; } - + return (config: config, credentials: credentials, account: account); } - void resetAll() { _state.resetAll(); } @@ -114,7 +118,8 @@ class ProfileLogic { final walletData = await _walletData; if (walletData == null) return; - final community = await _appDBService.communities.get(walletData.config!.community.alias); + final community = await _appDBService.communities + .get(walletData.config!.community.alias); if (community == null) { throw Exception('community not found'); @@ -181,8 +186,6 @@ class ProfileLogic { } if (username.toLowerCase() == _state.username.toLowerCase()) { - debugPrint( - 'Username unchanged: "$username" matches current username "${_state.username}"'); _state.setUsernameSuccess(); return; } @@ -190,10 +193,11 @@ class ProfileLogic { try { _state.setUsernameRequest(); - final exists = await profileExists(walletData.config!, username.toLowerCase()); + final exists = + await profileExists(walletData.config!, username.toLowerCase()); if (exists) { - final existingProfile = - await getProfileByUsername(walletData.config!, username.toLowerCase()); + final existingProfile = await getProfileByUsername( + walletData.config!, username.toLowerCase()); if (existingProfile != null && existingProfile.account == walletData.account!.hexEip55) { _state.setUsernameSuccess(); @@ -218,7 +222,7 @@ class ProfileLogic { Future loadProfile({String? account, bool online = false}) async { final walletData = await _walletData; if (walletData == null) return; - + final ethAccount = walletData.account!; final alias = walletData.config!.community.alias; final acc = account ?? ethAccount.hexEip55; @@ -347,7 +351,7 @@ class ProfileLogic { final config = _config; final credentials = await _credentials; final account = _account; - + if (config == null || credentials == null || account == null) { return false; } @@ -374,7 +378,7 @@ class ProfileLogic { final accountForFactory = await _accountBackupDBService.accounts .get(account, config.community.alias, ''); - + final url = await setProfile( config, account, @@ -453,7 +457,7 @@ class ProfileLogic { final config = _config; final credentials = await _credentials; final account = _account; - + if (config == null || credentials == null || account == null) { return false; } @@ -482,7 +486,20 @@ class ProfileLogic { _state.setProfileUploading(); - final url = await updateProfile(config, account, credentials, profile); + final accountForFactory = await _accountBackupDBService.accounts + .get(account, config.community.alias, ''); + + if (accountForFactory == null) {} + + final factoryAddress = accountForFactory?.accountFactoryAddress; + + final url = await updateProfile( + config, + account, + credentials, + profile, + accountFactoryAddress: factoryAddress, + ); if (url == null) { throw Exception('Failed to save profile'); } @@ -539,7 +556,10 @@ class ProfileLogic { ); return true; - } catch (_) {} + } catch (e, stackTrace) { + debugPrint('ProfileLogic.update() - Error during profile update: $e'); + debugPrint('Stack trace: $stackTrace'); + } _state.setProfileError(); return false; @@ -616,7 +636,8 @@ class ProfileLogic { return; } - final exists = await createAccount(walletData.config!, walletData.account!, walletData.credentials!); + final exists = await createAccount( + walletData.config!, walletData.account!, walletData.credentials!); if (!exists) { throw Exception('Failed to create account'); } diff --git a/pubspec.lock b/pubspec.lock index 827cd02d..1c61ba3d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -302,10 +302,10 @@ packages: dependency: "direct main" description: name: credential_manager - sha256: "91d54ed2eade14880e381edc604722d400966b6f2e50e87c38eb02ff988c5238" + sha256: "4dbd38e17fb9a8fd30d591826246b7d327d69d7c33bd15e8a9192aa40c178374" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.4" cross_file: dependency: transitive description: @@ -914,26 +914,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.9" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: @@ -1592,26 +1592,26 @@ packages: dependency: transitive description: name: test - sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" + sha256: "65e29d831719be0591f7b3b1a32a3cda258ec98c58c7b25f7b84241bc31215bb" url: "https://pub.dev" source: hosted - version: "1.25.15" + version: "1.26.2" test_api: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.6" test_core: dependency: transitive description: name: test_core - sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" + sha256: "80bf5a02b60af04b09e14f6fe68b921aad119493e26e490deaca5993fef1b05a" url: "https://pub.dev" source: hosted - version: "0.6.8" + version: "0.6.11" timeago: dependency: "direct main" description: @@ -1752,10 +1752,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: @@ -1861,5 +1861,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.7.2 <4.0.0" + dart: ">=3.8.0-0 <4.0.0" flutter: ">=3.29.0" From cc407c231251cac79e7a290f158a5141927dee87 Mon Sep 17 00:00:00 2001 From: Viran Ranaraja Date: Wed, 24 Sep 2025 16:25:29 +0530 Subject: [PATCH 46/46] repo update --- lib/services/accounts/native/apple.dart | 201 +++++++++++++++++++++--- lib/state/app/logic.dart | 129 +++++++++------ lib/state/backup/logic.dart | 6 +- 3 files changed, 264 insertions(+), 72 deletions(-) diff --git a/lib/services/accounts/native/apple.dart b/lib/services/accounts/native/apple.dart index d08576f8..9e5bc39c 100644 --- a/lib/services/accounts/native/apple.dart +++ b/lib/services/accounts/native/apple.dart @@ -1,22 +1,21 @@ -import 'package:citizenwallet/services/accounts/backup.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:web3dart/credentials.dart'; +import 'package:web3dart/crypto.dart'; +import 'package:web3dart/web3dart.dart'; + import 'package:citizenwallet/services/accounts/accounts.dart'; +import 'package:citizenwallet/services/accounts/backup.dart'; import 'package:citizenwallet/services/accounts/options.dart'; -import 'package:citizenwallet/services/accounts/utils.dart'; +import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/credentials/credentials.dart'; import 'package:citizenwallet/services/credentials/native/apple.dart'; +import 'package:citizenwallet/services/db/app/db.dart'; import 'package:citizenwallet/services/db/backup/accounts.dart'; import 'package:citizenwallet/services/db/backup/db.dart'; -import 'package:citizenwallet/services/db/app/db.dart'; -import 'package:citizenwallet/services/config/config.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:web3dart/credentials.dart'; -import 'package:web3dart/crypto.dart'; -import 'package:web3dart/web3dart.dart'; -import 'package:flutter/foundation.dart'; -import 'package:citizenwallet/services/wallet/wallet.dart'; import 'package:citizenwallet/services/wallet/contracts/safe_account.dart'; +import 'package:citizenwallet/services/wallet/wallet.dart'; -/// AppleAccountsService implements an AccountsServiceInterface for iOS and macOS class AppleAccountsService extends AccountsServiceInterface { static final AppleAccountsService _instance = AppleAccountsService._internal(); @@ -85,6 +84,9 @@ class AppleAccountsService extends AccountsServiceInterface { _accountsDB = appleOptions.accountsDB; + await restoreAccountsFromKeychain(); + + // Run migrations on the complete dataset (existing + restored accounts) await migrate(super.version); await migratePrivateKeysFromOldFormat(); @@ -250,6 +252,12 @@ class AppleAccountsService extends AccountsServiceInterface { if (oldPrivateKey != null) { await _credentials.write(newAccountId, oldPrivateKey); await _credentials.delete(oldAccountId); + + final legacyKeychainKey = + '${account.address.hexEip55}@${account.alias}'; + if (await _credentials.containsKey(legacyKeychainKey)) { + await _credentials.delete(legacyKeychainKey); + } } } }, @@ -335,6 +343,145 @@ class AppleAccountsService extends AccountsServiceInterface { return accounts; } + Future restoreAccountsFromKeychain() async { + int restoredCount = 0; + try { + final allKeychainData = await _credentials.readAll(); + + if (allKeychainData.isEmpty) { + return 0; + } + + final existingAccounts = await _accountsDB.accounts.all(); + final existingAddresses = existingAccounts + .map((acc) => acc.address.hexEip55.toLowerCase()) + .toSet(); + + final existingAccountIds = existingAccounts.map((acc) => acc.id).toSet(); + + if (existingAccounts.length >= (allKeychainData.length - 1)) { + return 0; + } + + final allLegacyBackups = await getAllLegacyWalletBackups(); + + for (final legacyBackup in allLegacyBackups) { + final saved = await _credentials.containsKey(legacyBackup.key); + if (!saved) { + continue; + } + + final addressLower = legacyBackup.address.toLowerCase(); + if (existingAddresses.contains(addressLower)) { + continue; + } + + try { + final account = DBAccount( + alias: legacyBackup.alias, + address: EthereumAddress.fromHex(legacyBackup.address), + name: legacyBackup.name, + accountFactoryAddress: '', + privateKey: null, + ); + + await _accountsDB.accounts.insert(account); + + final backup = BackupWallet( + address: legacyBackup.address, + alias: legacyBackup.alias, + privateKey: legacyBackup.privateKey, + ); + + await _credentials.write(backup.key, backup.value); + restoredCount++; + } catch (e, stackTrace) { + if (kDebugMode) { + debugPrint('Error restoring legacy account: $e'); + debugPrintStack(stackTrace: stackTrace); + } + } + } + + for (final entry in allKeychainData.entries) { + try { + final key = entry.key; + + if (_isSystemKey(key) || key.startsWith(backupPrefix)) { + continue; + } + + if (!key.contains('@')) { + continue; + } + + final parts = key.split('@'); + if (parts.length != 2 && parts.length != 3) { + continue; + } + + String accountAddress; + String factoryAddress; + String alias; + + if (parts.length == 2) { + accountAddress = parts[0]; + factoryAddress = ''; + alias = parts[1]; + } else { + accountAddress = parts[0]; + factoryAddress = parts[1]; + alias = parts[2]; + } + + final potentialAccount = DBAccount( + alias: alias, + address: EthereumAddress.fromHex(accountAddress), + name: alias.toUpperCase(), + accountFactoryAddress: factoryAddress.isEmpty ? '' : factoryAddress, + ); + + if (existingAddresses.contains(accountAddress.toLowerCase()) || + existingAccountIds.contains(potentialAccount.id)) { + continue; + } + + final account = DBAccount( + alias: alias, + address: EthereumAddress.fromHex(accountAddress), + name: alias.toUpperCase(), + accountFactoryAddress: factoryAddress.isEmpty ? '' : factoryAddress, + privateKey: null, + ); + + await _accountsDB.accounts.insert(account); + + await _credentials.write(account.id, entry.value); + restoredCount++; + } catch (e, stackTrace) { + if (kDebugMode) { + debugPrint('Error processing keychain entry ${entry.key}: $e'); + debugPrintStack(stackTrace: stackTrace); + } + } + } + } catch (e, stackTrace) { + if (kDebugMode) { + debugPrint('Error restoring accounts from keychain: $e'); + debugPrintStack(stackTrace: stackTrace); + } + } + + return restoredCount; + } + + bool _isSystemKey(String key) { + return key.startsWith('credential_storage_key') || + key.startsWith('version_') || + key.startsWith(versionPrefix) || + key.length < 10; + } + // set wallet backup @override Future setAccount(DBAccount account) async { @@ -460,22 +607,30 @@ class AppleAccountsService extends AccountsServiceInterface { } Future migratePrivateKeysFromOldFormat() async { - final allAccounts = await _accountsDB.accounts.all(); - - for (final account in allAccounts) { - final currentPrivateKey = await _credentials.read(account.id); - if (currentPrivateKey != null) { - continue; - } + try { + final allAccounts = await _accountsDB.accounts.all(); - final oldFormatKey = '${account.address.hexEip55}@${account.alias}'; + for (final account in allAccounts) { + try { + final currentPrivateKey = await _credentials.read(account.id); + if (currentPrivateKey != null) { + continue; + } - final oldPrivateKey = await _credentials.read(oldFormatKey); - if (oldPrivateKey != null) { - await _credentials.write(account.id, oldPrivateKey); + final oldFormatKey = '${account.address.hexEip55}@${account.alias}'; - await _credentials.delete(oldFormatKey); + final oldPrivateKey = await _credentials.read(oldFormatKey); + if (oldPrivateKey != null) { + await _credentials.write(account.id, oldPrivateKey); + await _credentials.delete(oldFormatKey); + } + } catch (e) { + debugPrint( + 'Error migrating private key for account ${account.id}: $e'); + } } + } catch (e) { + debugPrint('Error during private key migration: $e'); } } diff --git a/lib/state/app/logic.dart b/lib/state/app/logic.dart index 1793641a..d19a129a 100644 --- a/lib/state/app/logic.dart +++ b/lib/state/app/logic.dart @@ -1,26 +1,27 @@ import 'dart:convert'; import 'dart:math'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:provider/provider.dart'; +import 'package:web3dart/web3dart.dart'; import 'package:citizenwallet/models/wallet.dart'; +import 'package:citizenwallet/services/accounts/accounts.dart'; +import 'package:citizenwallet/services/accounts/native/apple.dart'; +import 'package:citizenwallet/services/api/api.dart'; import 'package:citizenwallet/services/audio/audio.dart'; import 'package:citizenwallet/services/config/config.dart'; import 'package:citizenwallet/services/config/service.dart'; -import 'package:citizenwallet/services/accounts/accounts.dart'; import 'package:citizenwallet/services/db/app/db.dart'; import 'package:citizenwallet/services/db/backup/accounts.dart'; import 'package:citizenwallet/services/preferences/preferences.dart'; import 'package:citizenwallet/services/wallet/contracts/account_factory.dart'; import 'package:citizenwallet/services/wallet/utils.dart'; -import 'package:citizenwallet/services/api/api.dart'; import 'package:citizenwallet/state/app/state.dart'; import 'package:citizenwallet/state/theme/logic.dart'; import 'package:citizenwallet/utils/delay.dart'; import 'package:citizenwallet/utils/uint8.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:provider/provider.dart'; -import 'package:web3dart/web3dart.dart'; class AppLogic { final ThemeLogic _theme = ThemeLogic(); @@ -79,64 +80,94 @@ class AppLogic { } Future<(String?, String?)> loadLastWallet() async { - try { - _appState.importLoadingReq(); - final String? lastWallet = _preferences.lastWallet; - final String? lastAlias = _preferences.lastAlias; - final String? lastAccountFactoryAddress = _preferences.lastAccountFactoryAddress; + return _loadLastWalletWithRetry(); + } - DBAccount? dbWallet; - if (lastWallet != null && lastAlias != null && lastAccountFactoryAddress != null) { - dbWallet = await _accounts.getAccount(lastWallet, lastAlias, lastAccountFactoryAddress); - } + Future<(String?, String?)> _loadLastWalletWithRetry( + {int maxRetries = 3}) async { + for (int attempt = 0; attempt < maxRetries; attempt++) { + try { + _appState.importLoadingReq(); + final String? lastWallet = _preferences.lastWallet; + final String? lastAlias = _preferences.lastAlias; + final String? lastAccountFactoryAddress = + _preferences.lastAccountFactoryAddress; + + DBAccount? dbWallet; + if (lastWallet != null && + lastAlias != null && + lastAccountFactoryAddress != null) { + dbWallet = await _accounts.getAccount( + lastWallet, lastAlias, lastAccountFactoryAddress); + } - if (dbWallet == null) { - // attempt to see if there are any other wallets backed up - final dbWallets = await _accounts.getAllAccounts(); + if (dbWallet == null) { + final dbWallets = await _accounts.getAllAccounts(); - if (dbWallets.isNotEmpty) { - final dbWallet = dbWallets[0]; + if (dbWallets.isNotEmpty) { + final dbWallet = dbWallets[0]; + final address = dbWallet.address.hexEip55; - final address = dbWallet.address.hexEip55; + final community = + await _appDBService.communities.get(dbWallet.alias); - // final config = await _config.getConfig(dbWallet.alias); + if (community == null) { + throw Exception('community not found'); + } - final community = await _appDBService.communities.get(dbWallet.alias); + Config communityConfig = Config.fromJson(community.config); - if (community == null) { - throw Exception('community not found'); - } + _theme.changeTheme(communityConfig.community.theme); - Config communityConfig = Config.fromJson(community.config); + await _preferences.setLastWallet(address); + await _preferences.setLastAlias(dbWallet.alias); + await _preferences + .setLastAccountFactoryAddress(dbWallet.accountFactoryAddress); - _theme.changeTheme(communityConfig.community.theme); + _appState.importLoadingSuccess(); - await _preferences.setLastWallet(address); - await _preferences.setLastAlias(dbWallet.alias); - await _preferences.setLastAccountFactoryAddress(dbWallet.accountFactoryAddress); + return (address, dbWallet.alias); + } - _appState.importLoadingSuccess(); + // If this is not the last attempt and no accounts found, try recovery and retry + if (attempt < maxRetries - 1) { + // Try to restore missing accounts from keychain on each retry + try { + final accountsService = getAccountsService(); + if (accountsService is AppleAccountsService) { + await accountsService.restoreAccountsFromKeychain(); + } + } catch (e) { + debugPrint('Error during account restoration: $e'); + } + + await delay(Duration( + milliseconds: 1000 + (attempt * 500))); // Progressive delay + continue; + } - return (address, dbWallet.alias); + _appState.importLoadingError(); + return (null, null); } - _appState.importLoadingError(); - - return (null, null); - } - - await delay( - const Duration(milliseconds: 1500)); // smoother launch experience + await delay( + const Duration(milliseconds: 1500)); // smoother launch experience - _appState.importLoadingSuccess(); + _appState.importLoadingSuccess(); - final address = dbWallet.address.hexEip55; + final address = dbWallet.address.hexEip55; - return (address, dbWallet.alias); - } catch (_) {} + return (address, dbWallet.alias); + } catch (e) { + if (attempt < maxRetries - 1) { + await delay(Duration( + milliseconds: 1000 + (attempt * 500))); // Progressive delay + continue; + } + } + } _appState.importLoadingError(); - return (null, null); } @@ -218,7 +249,8 @@ class AppLogic { await _preferences.setLastWallet(address.hexEip55); await _preferences.setLastAlias(communityConfig.community.alias); - await _preferences.setLastAccountFactoryAddress(communityConfig.community.primaryAccountFactory.address); + await _preferences.setLastAccountFactoryAddress( + communityConfig.community.primaryAccountFactory.address); _appState.importLoadingSuccess(); @@ -405,7 +437,8 @@ class AppLogic { await _preferences.setLastWallet(address.hexEip55); await _preferences.setLastAlias(communityConfig.community.alias); - await _preferences.setLastAccountFactoryAddress(communityConfig.community.primaryAccountFactory.address); + await _preferences.setLastAccountFactoryAddress( + communityConfig.community.primaryAccountFactory.address); _appState.importLoadingSuccess(); diff --git a/lib/state/backup/logic.dart b/lib/state/backup/logic.dart index 9c4672d9..1c69c6c5 100644 --- a/lib/state/backup/logic.dart +++ b/lib/state/backup/logic.dart @@ -54,7 +54,11 @@ class BackupLogic { accountsDB: AccountBackupDBService(), ), ); - } catch (_) {} + await delay(const Duration(milliseconds: 500)); + + } catch (e) { + debugPrint('Error setting up Apple keychain: $e'); + } } Future hasAccounts() async {