{"id":18245060,"url":"https://github.com/edgeapp/proposed-redux-state","last_synced_at":"2026-01-21T18:12:59.360Z","repository":{"id":76840367,"uuid":"127348132","full_name":"EdgeApp/Proposed-Redux-State","owner":"EdgeApp","description":null,"archived":false,"fork":false,"pushed_at":"2018-07-03T21:13:02.000Z","size":14,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-21T08:13:34.600Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EdgeApp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-03-29T21:15:05.000Z","updated_at":"2021-05-28T02:19:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"c3c9f114-7891-4a2d-9b06-16806461b297","html_url":"https://github.com/EdgeApp/Proposed-Redux-State","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/EdgeApp/Proposed-Redux-State","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdgeApp%2FProposed-Redux-State","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdgeApp%2FProposed-Redux-State/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdgeApp%2FProposed-Redux-State/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdgeApp%2FProposed-Redux-State/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EdgeApp","download_url":"https://codeload.github.com/EdgeApp/Proposed-Redux-State/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdgeApp%2FProposed-Redux-State/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28638693,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T18:04:35.752Z","status":"ssl_error","status_checked_at":"2026-01-21T18:03:55.054Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-05T09:18:45.693Z","updated_at":"2026-01-21T18:12:59.344Z","avatar_url":"https://github.com/EdgeApp.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Proposed Redux State\n\n## Table of Contents\n\n1.  [Helper Types](#helper-types)\n2.  [Root State](#root-state)\n3.  [Edge](#edge)\n4.  [Account](#account)\n5.  [Account Settings](#account-settings)\n6.  [Wallet Settings](#wallet-settings)\n7.  [Currency Settings](#currency-settings)\n8.  [Local Settings](#local-settings)\n9.  [Synced Settings](#synced-settings)\n10. [Settings](#settings)\n11. [Wallets](#wallets)\n12. [Scenes](#scenes)\n13. [Exchange](#exchange)\n14. [Scan](#scan)\n15. [Send](#send)\n16. [Request](#request)\n17. [Device](#device)\n18. [Errors](#errors)\n\n### \u003ca name=\"helper-types\"\u003e\u003c/a\u003eHelper Types\n\n```typescript\ntype WalletId = string\ntype CurrencyCode = string\ntype IsoCurrencyCode = string\ntype NativeAmount = string\ntype DisplayAmount = string\ntype ExchangeAmount = string\ntype FiatAmount = string\ntype GuiAmount = {\n  native: NativeAmount\n  display: DisplayAmount\n  exchange: ExchangeAmount\n  fiat: (CurrencyConverter, IsoCurrencyCode) =\u003e FiatAmount // ??? keto-derived?\n}\ntype FeesSettings = Object\ntype PluginName = string\ntype SceneKey = string\ntype SceneState = Object\n```\n\n### \u003ca name=\"root-state\"\u003e\u003c/a\u003eRoot State\n\n```typescript\nexport type State = {\n  edge: EdgeState, // everything non-serializable\n  account: AccountState,\n  wallets: WalletsState,\n  settings: SettingsState,\n  scenes: ScenesState,\n  device: DeviceState,\n  errors: ErrorsState,\n}\n```\n\n### \u003ca name=\"edge\"\u003e\u003c/a\u003eEdge\n\n```typescript\nexport type EdgeState = {\n  // everything non-serializable\n  account: EdgeAccount | null,\n  context: EdgeContext | null,\n  wallets: {[WalletId]: EdgeCurrencyWallet} // keto-derived from account?\n}\n```\n\n### \u003ca name=\"account\"\u003e\u003c/a\u003eAccount\n\n```typescript\nexport type LoginTypeState = \n  | ‘newAccount’\n  | ‘password’\n  | ‘pin’\n  | ‘recovery’\n  | ‘key’,\n  | ‘edge’\n\nexport type AccountState = {\n  username: string, // keto-derived from state.edge.account.username\n  loginType: LoginTypeState, // keto-derived from state.edge.account\n  passwordReminder: PasswordReminderState\n}\n\nexport type PasswordReminderState = {\n  needsPasswordCheck: boolean,\n  lastPasswordUse: number,\n  nonPasswordDaysRemaining: number,\n  nonPasswordLoginsRemaining: number,\n  nonPasswordDaysLimit: number,\n  nonPasswordLoginsLimit: number\n}\n```\n\n### \u003ca name=\"wallet-settings\"\u003e\u003c/a\u003eWallet Settings\n\n```typescript\nexport type LocalWalletSettingsState = {\n  [WalletId]: {\n    privacyMode: {\n      // used to show or hide wallet balance in fiat\n      isEnabled: boolean\n    }\n  }\n}\n```\n\n```typescript\nexport type SyncedWalletSettingsState = { [WalletId]: {} }\n```\n\n```typescript\nexport type WalletSettingsState = LocalWalletSettingsState \u0026 SyncedWalletSettingsState\n```\n\n### \u003ca name=\"currency-settings\"\u003e\u003c/a\u003eCurrency Settings\n\n```typescript\nexport type LocalCurrencySettingsState = {\n  [CurrencyCode]: {\n    denominations: {[key: string]: EdgeDenomination}\n    displayDenomination: EdgeDenomination, // keto-derived\n    exchangeDenomination: EdgeDenomination, // keto-derived\n    spendingLimits: {\n      daily: {\n        isEnabled: boolean,\n        nativeAmount: string\n      }\n    }\n  }\n}\n```\n\n```typescript\nexport type SyncedCurrencySettingsState = {\n  [CurrencyCode]: {\n    spendingLimits: {\n      transaction: {\n        isEnabled: boolean,\n        nativeAmount: string\n      }\n    }\n  }\n}\n```\n\n```typescript\nexport type CurrencySettingsState = LocalCurrencySettingsState \u0026 SyncedCurrencySettingsState\n```\n\n### \u003ca name=\"local-settings\"\u003e\u003c/a\u003eLocal Settings\n\n```typescript\nexport type LocalSettingsState = {\n  bluetoothMode: {\n    isEnabled: boolean,\n    isSupported: boolean\n  },\n  otpMode: {\n    isEnabled: boolean,\n    key: string,\n    resetDate: number,\n    expireDate: number\n  },\n  touchId: {\n    isEnabled: boolean,\n    isSupported: boolean\n  },\n  byWalletId: LocalWalletSettingsState,\n  byCurrencyCode: LocalCurrencySettingsState\n}\n```\n\n### \u003ca name=\"synced-settings\"\u003e\u003c/a\u003eSynced Settings\n\n```typescript\nexport type SyncedSettingsState = {\n  autoLogoutMode: {\n    isEnabled: boolean,\n    seconds: number\n  },\n  defaultFiat: IsoCurrencyCode,\n  merchantMode: {\n    isEnabled: boolean\n  },\n  privacyModeAccount: {\n    // used to show or hide total account balance in fiat\n    isEnabled: boolean\n  },\n  byWalletId: SyncedWalletSettingsState,\n  byCurrencyCode: SyncedCurrencySettingsState\n}\n```\n\n### \u003ca name=\"settings\"\u003e\u003c/a\u003eSettings\n\n```typescript\nexport type SettingsState = {\n  autoLogoutMode: SyncedSettingsState.autoLogoutMode, // keto-derived\n  bluetoothMode: LocalSettings.bluetoothMode, // keto-derived\n  defaultFiat: SyncedSettingsState.defaulFiat, // keto-derived\n  merchantMode: SyncedSettingsState.merchantMode, // keto-derived\n  otpMode: LocalSettings.otpMode, // keto-derived\n  privacyMode: SyncedSettings.privacyMode, // keto-derived\n  touchId: { LocalSettings.touchId, // keto-derived\n  byWalletId: SynchedSettingsState.byWalletId, // keto-derived\n  byCurrencyCode: SyncedSettings.byCurrencyCode, // keto-derived\n  localSettings: LocalSettingsState, // store in EdgeState?\n  syncedSettings: SyncedSettingsState // store in EdgeState?\n}\n```\n\n### \u003ca name=\"wallets\"\u003e\u003c/a\u003eWallets\n\n```typescript\nexport type WalletsState = {\n  byId: {[WalletId]: GuiWallet},\n  activeWalletIds: Array\u003cWalletId\u003e,\n  archivedWalletIds: Array\u003cWalletId\u003e,\n  selectedWalletId: WalletId,\n  selectedCurrencyCode: CurrencyCode,\n  selectedWallet: GuiWallet // derived from byId[selectedWalletId]\n}\n```\n\n### \u003ca name=\"scenes\"\u003e\u003c/a\u003eScenes\n\n```typescript\nexport type ScenesState = {\n  // INCOMPLETE, JUST AN EXAMPLE\n  [SceneKey]: SceneState,\n  main: {\n    errorAlert: {\n      isVisible: boolean // keto-derived?\n    },\n    dropdownAlert: {\n      // displays globally\n      isVisible: boolean\n    },\n    popupModal: {\n      // displays globally\n      isVisible: boolean\n    },\n    passwordReminderModal: {\n      // displays globally\n      isVisible: boolean\n    },\n  },\n  walletList: {\n    deleteWalletModal: {\n      // displays only on this scene\n      isVisible: boolean,\n      walletId: WalletId\n    },\n    privateSeedModal: {\n      // displays only on this scene\n      isVisible: boolean,\n      walletId: WalletId\n    },\n    renameWalletModal: {\n      // displays only on this scene\n      isVisible: boolean,\n      walletId: WalletId\n    },\n    resyncWalletModal: {\n      // displays only on this scene\n      isVisible: boolean,\n      walletId: WalletId\n    }\n  }\n  exchange: ExchangeState,\n  request: RequestState,\n  Scan: ScanState,\n  Send: SendState\n}\n```\n\n### \u003ca name=\"exchange\"\u003e\u003c/a\u003eExchange\n\n```typescript\nexport type ExchangeInfo = {\n  walletId: Id,\n  currencyCode: CurrencyCode,\n  amount: GuiAmount\n}\n\nexport type ExchangeState = {\n  source: ExchangeInfo | null,\n  destination: ExchangeInfo | null,\n  transaction: EdgeTransaction | null,\n  error: Error | null\n}\n```\n\n### \u003ca name=\"scan\"\u003e\u003c/a\u003eScan\n```typescript\nexport type ScanState = {\n  uri: EdgeParsedUri | null,\n  data: string | null,\n  error: Error | null,\n  legacyAddressModal: {\n    isVisible: boolean,\n    currencyName: string\n  }\n}\n```\n\n### \u003ca name=\"send\"\u003e\u003c/a\u003eSend\n\n```typescript\nexport type SendInfo = {\n  walletId: Id, // possibly keto-derived\n  currencyCode: CurrencyCode, // possibly keto-derived\n  amount: GuiAmount\n}\n\nexport type SendState = {\n  uri: EdgeParsedUri | null,\n  spendInfo: EdgeSpendInfo | null, // keto-derived\n  source: SendInfo,\n  destination: {\n    address: string\n  },\n  feeSettings: FeesSettings | null,\n  transaction: EdgeTransaction | null,\n  metadata: EdgeMetadata | null,\n  error: Error | null\n}\n```\n\n### \u003ca name=\"request\"\u003e\u003c/a\u003eRequest\n\n```typescript\nexport type RequestInfo = {\n  walletId: Id, // possibly keto-derived\n  currencyCode: CurrencyCode, // possibly keto-derived\n  amount: GuiAmount\n}\n\nexport type RequestState = {\n  destination: RequestInfo,\n  amountCurrent: GuiAmount,\n  amountRemaining: GuiAmount // keto-derived\n}\n```\n\n### \u003ca name=\"device\"\u003e\u003c/a\u003eDevice\n\n```typescript\nexport type DeviceState = {\n  contacts: ContactsState,\n  locale: LocaleState,\n  permissions: PermissionsState,\n  specs: SpecsState\n}\n\nexport type PermissionState = \n  | ‘granted’\n  | ‘denied’\n  | ‘restricted’\n  | null\n\nexport type Permission = \n  | ‘bluetooth’\n  | ‘camera’\n  | ‘contacts’\n  | ‘photos’\n  | ‘bluetooth’\n\nexport type PermissionsState = {\n  [Permission]: PermissionState\n}\n\nexport type ContactsState = Array\u003cGuiContact\u003e | null\n\nexport type LocaleState = {\n  localeIdentifier: string,\n  decimalSeparator: string,\n  quotationBeginDelimiterKey: string,\n  quotationEndDelimiterKey: string,\n  currencySymbol: string,\n  currencyCode: string,\n\n  // ios only:\n  usesMetricSystem: boolean,\n  localeLanguageCode: string,\n  countryCode: string,\n  calendar: string,\n  groupingSeparator: string,\n  collatorIdentifier: string,\n  alternateQuotationBeginDelimiterKey: string,\n  alternateQuotationEndDelimiterKey: string,\n  measurementSystem: string,\n  preferredLanguages: Array\u003cstring\u003e\n} | null\n\nexport type SpecsState = {\n  // android only\n  // apiLevel: number,\n  // firstInstallTime: number,\n  // ipAddress: Promise\u003cstring\u003e,\n  // instanceId: string,\n  // lastUpdateTime: number,\n  // macAddress: Promise\u003cstring\u003e,\n  // maxMemory: number,\n  // phoneNumber: string,\n  // serialNumber: string,\n  applicationName: string,\n  brand: string,\n  buildNumber: string,\n  bundleId: string,\n  carrier: string,\n  deviceCountry: string,\n  deviceId: string,\n  deviceLocale: string,\n  deviceName: string,\n  freeDiskStorage: number,\n  manufacturer: string,\n  model: string,\n  readableVersion: string,\n  systemName: string,\n  systemVersion: string,\n  timezone: string,\n  totalDiskCapacity: number,\n  totalMemory: number,\n  uniqueId: string,\n  userAgent: string,\n  version: string,\n  is24Hour: boolean,\n  isEmulator: string,\n  isPinOrFingerprintSet: boolean,\n  isTablet: boolean\n} | null\n```\n\n### \u003ca name=\"errors\"\u003e\u003c/a\u003eErrors\n\n```typescript\nexport type ErrorsState = {\n  all: Array\u003cError\u003e,\n  bySeverity: {\n    critical: Array\u003cError\u003e,\n    high: Array\u003cError\u003e,\n    medium: Array\u003cError\u003e,\n    low: Array\u003cError\u003e\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedgeapp%2Fproposed-redux-state","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedgeapp%2Fproposed-redux-state","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedgeapp%2Fproposed-redux-state/lists"}