diff --git a/android/app/src/main/assets/chains/icons/sei.svg b/android/app/src/main/assets/chains/icons/seievm.svg similarity index 100% rename from android/app/src/main/assets/chains/icons/sei.svg rename to android/app/src/main/assets/chains/icons/seievm.svg diff --git a/android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/operators/TestCreateAccountOperator.kt b/android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/operators/TestCreateAccountOperator.kt index 1b1f128b0d..5cada8ac47 100644 --- a/android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/operators/TestCreateAccountOperator.kt +++ b/android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/operators/TestCreateAccountOperator.kt @@ -101,7 +101,6 @@ class TestCreateAccountOperator { Chain.Xrp -> "rPwE3gChNKtZ1mhH3Ko8YFGqKmGRWLWXV3" Chain.Celestia -> "celestia142j9u5eaduzd7faumygud6ruhdwme98qpwmfv7" Chain.Injective -> "inj13u6g7vqgw074mgmf2ze2cadzvkz9snlwcrtq8a" - Chain.Sei -> "sei142j9u5eaduzd7faumygud6ruhdwme98qagm0sj" Chain.Noble -> "noble142j9u5eaduzd7faumygud6ruhdwme98qc8l3wa" Chain.Near -> "0c91f6106ff835c0195d5388565a2d69e25038a7e23d26198f85caf6594117ec" Chain.Stellar -> "GA3H6I4C5XUBYGVB66KXR27JV5KS3APSTKRUWOIXZ5MVWZKVTLXWKZ2P" diff --git a/android/data/services/store/schemas/com.gemwallet.android.data.service.store.database.GemDatabase/86.json b/android/data/services/store/schemas/com.gemwallet.android.data.service.store.database.GemDatabase/86.json new file mode 100644 index 0000000000..e34e05dd69 --- /dev/null +++ b/android/data/services/store/schemas/com.gemwallet.android.data.service.store.database.GemDatabase/86.json @@ -0,0 +1,2702 @@ +{ + "formatVersion": 1, + "database": { + "version": 86, + "identityHash": "be79416139dd7439f83baef92c76ae11", + "entities": [ + { + "tableName": "wallets", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `domain_name` TEXT, `type` TEXT NOT NULL, `position` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `index` INTEGER NOT NULL, `source` TEXT NOT NULL DEFAULT 'Import', `imageUrl` TEXT, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "domainName", + "columnName": "domain_name", + "affinity": "TEXT" + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "pinned", + "columnName": "pinned", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "index", + "columnName": "index", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "source", + "columnName": "source", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'Import'" + }, + { + "fieldPath": "imageUrl", + "columnName": "imageUrl", + "affinity": "TEXT" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + } + }, + { + "tableName": "accounts", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`wallet_id` TEXT NOT NULL, `derivation_path` TEXT NOT NULL, `address` TEXT NOT NULL, `chain` TEXT NOT NULL, `extendedPublicKey` TEXT, PRIMARY KEY(`wallet_id`, `chain`), FOREIGN KEY(`chain`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`wallet_id`) REFERENCES `wallets`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "walletId", + "columnName": "wallet_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "derivationPath", + "columnName": "derivation_path", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "chain", + "columnName": "chain", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "extendedPublicKey", + "columnName": "extendedPublicKey", + "affinity": "TEXT" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "wallet_id", + "chain" + ] + }, + "indices": [ + { + "name": "index_accounts_chain", + "unique": false, + "columnNames": [ + "chain" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_accounts_chain` ON `${TABLE_NAME}` (`chain`)" + } + ], + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "chain" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "wallets", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "wallet_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "addresses", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`chain` TEXT NOT NULL, `address` TEXT NOT NULL, `walletId` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `status` TEXT NOT NULL, PRIMARY KEY(`chain`, `address`), FOREIGN KEY(`chain`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`walletId`) REFERENCES `wallets`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "chain", + "columnName": "chain", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "walletId", + "columnName": "walletId", + "affinity": "TEXT" + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "chain", + "address" + ] + }, + "indices": [ + { + "name": "index_addresses_chain", + "unique": false, + "columnNames": [ + "chain" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_addresses_chain` ON `${TABLE_NAME}` (`chain`)" + }, + { + "name": "index_addresses_walletId", + "unique": false, + "columnNames": [ + "walletId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_addresses_walletId` ON `${TABLE_NAME}` (`walletId`)" + } + ], + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "chain" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "wallets", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "walletId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "contacts", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `description` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT" + }, + { + "fieldPath": "createdAt", + "columnName": "createdAt", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "updatedAt", + "columnName": "updatedAt", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + } + }, + { + "tableName": "contacts_addresses", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `contactId` TEXT NOT NULL, `address` TEXT NOT NULL, `chain` TEXT NOT NULL, `memo` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`contactId`) REFERENCES `contacts`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contactId", + "columnName": "contactId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "chain", + "columnName": "chain", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "memo", + "columnName": "memo", + "affinity": "TEXT" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_contacts_addresses_contactId", + "unique": false, + "columnNames": [ + "contactId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_contacts_addresses_contactId` ON `${TABLE_NAME}` (`contactId`)" + } + ], + "foreignKeys": [ + { + "table": "contacts", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "contactId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "asset", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `symbol` TEXT NOT NULL, `decimals` INTEGER NOT NULL, `type` TEXT NOT NULL, `chain` TEXT NOT NULL, `is_enabled` INTEGER NOT NULL, `is_buy_enabled` INTEGER NOT NULL, `is_sell_enabled` INTEGER NOT NULL, `is_swap_enabled` INTEGER NOT NULL, `is_stake_enabled` INTEGER NOT NULL, `staking_apr` REAL, `rank` INTEGER NOT NULL, `updated_at` INTEGER NOT NULL, `associations` TEXT NOT NULL DEFAULT '[]', PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "decimals", + "columnName": "decimals", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "chain", + "columnName": "chain", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isEnabled", + "columnName": "is_enabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isBuyEnabled", + "columnName": "is_buy_enabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isSellEnabled", + "columnName": "is_sell_enabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isSwapEnabled", + "columnName": "is_swap_enabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isStakeEnabled", + "columnName": "is_stake_enabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "stakingApr", + "columnName": "staking_apr", + "affinity": "REAL" + }, + { + "fieldPath": "rank", + "columnName": "rank", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "updatedAt", + "columnName": "updated_at", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "associations", + "columnName": "associations", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'[]'" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + } + }, + { + "tableName": "balances", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`asset_id` TEXT NOT NULL, `wallet_id` TEXT NOT NULL, `available` TEXT NOT NULL, `available_amount` REAL NOT NULL, `frozen` TEXT NOT NULL, `frozen_amount` REAL NOT NULL, `locked` TEXT NOT NULL, `locked_amount` REAL NOT NULL, `staked` TEXT NOT NULL, `staked_amount` REAL NOT NULL, `pending` TEXT NOT NULL, `pending_amount` REAL NOT NULL, `rewards` TEXT NOT NULL, `rewards_amount` REAL NOT NULL, `reserved` TEXT NOT NULL, `reserved_amount` REAL NOT NULL, `withdrawable` TEXT NOT NULL, `withdrawableAmount` REAL NOT NULL, `total_amount` REAL NOT NULL, `is_active` INTEGER NOT NULL, `is_pinned` INTEGER NOT NULL, `is_visible` INTEGER NOT NULL, `list_position` INTEGER NOT NULL, `votes` INTEGER NOT NULL DEFAULT 0, `energy_available` INTEGER NOT NULL DEFAULT 0, `energy_total` INTEGER NOT NULL DEFAULT 0, `bandwidth_available` INTEGER NOT NULL DEFAULT 0, `bandwidth_total` INTEGER NOT NULL DEFAULT 0, `updated_at` INTEGER, PRIMARY KEY(`asset_id`, `wallet_id`), FOREIGN KEY(`asset_id`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`wallet_id`) REFERENCES `wallets`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "assetId", + "columnName": "asset_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "walletId", + "columnName": "wallet_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "available", + "columnName": "available", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "availableAmount", + "columnName": "available_amount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "frozen", + "columnName": "frozen", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "frozenAmount", + "columnName": "frozen_amount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "locked", + "columnName": "locked", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "lockedAmount", + "columnName": "locked_amount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "staked", + "columnName": "staked", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "stakedAmount", + "columnName": "staked_amount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "pending", + "columnName": "pending", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pendingAmount", + "columnName": "pending_amount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "rewards", + "columnName": "rewards", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "rewardsAmount", + "columnName": "rewards_amount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "reserved", + "columnName": "reserved", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "reservedAmount", + "columnName": "reserved_amount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "withdrawable", + "columnName": "withdrawable", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "withdrawableAmount", + "columnName": "withdrawableAmount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "totalAmount", + "columnName": "total_amount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "isActive", + "columnName": "is_active", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPinned", + "columnName": "is_pinned", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isVisible", + "columnName": "is_visible", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "listPosition", + "columnName": "list_position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "votes", + "columnName": "votes", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "energyAvailable", + "columnName": "energy_available", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "energyTotal", + "columnName": "energy_total", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "bandwidthAvailable", + "columnName": "bandwidth_available", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "bandwidthTotal", + "columnName": "bandwidth_total", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "updatedAt", + "columnName": "updated_at", + "affinity": "INTEGER" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "asset_id", + "wallet_id" + ] + }, + "indices": [ + { + "name": "index_balances_wallet_id", + "unique": false, + "columnNames": [ + "wallet_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_balances_wallet_id` ON `${TABLE_NAME}` (`wallet_id`)" + } + ], + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "asset_id" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "wallets", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "wallet_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "prices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`asset_id` TEXT NOT NULL, `value` REAL, `usd_value` REAL, `day_changed` REAL, `currency` TEXT NOT NULL, PRIMARY KEY(`asset_id`))", + "fields": [ + { + "fieldPath": "assetId", + "columnName": "asset_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL" + }, + { + "fieldPath": "usdValue", + "columnName": "usd_value", + "affinity": "REAL" + }, + { + "fieldPath": "dayChanged", + "columnName": "day_changed", + "affinity": "REAL" + }, + { + "fieldPath": "currency", + "columnName": "currency", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "asset_id" + ] + } + }, + { + "tableName": "transactions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `walletId` TEXT NOT NULL, `hash` TEXT NOT NULL, `assetId` TEXT NOT NULL, `feeAssetId` TEXT NOT NULL, `owner` TEXT NOT NULL, `recipient` TEXT NOT NULL, `contract` TEXT, `metadata` TEXT, `state` TEXT NOT NULL, `type` TEXT NOT NULL, `blockNumber` TEXT NOT NULL, `sequence` TEXT NOT NULL, `fee` TEXT NOT NULL, `value` TEXT NOT NULL, `payload` TEXT, `direction` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `estimatedConfirmationInSeconds` INTEGER, PRIMARY KEY(`id`, `walletId`), FOREIGN KEY(`walletId`) REFERENCES `wallets`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "walletId", + "columnName": "walletId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hash", + "columnName": "hash", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "assetId", + "columnName": "assetId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "feeAssetId", + "columnName": "feeAssetId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "owner", + "columnName": "owner", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "recipient", + "columnName": "recipient", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contract", + "columnName": "contract", + "affinity": "TEXT" + }, + { + "fieldPath": "metadata", + "columnName": "metadata", + "affinity": "TEXT" + }, + { + "fieldPath": "state", + "columnName": "state", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "blockNumber", + "columnName": "blockNumber", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sequence", + "columnName": "sequence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fee", + "columnName": "fee", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "payload", + "columnName": "payload", + "affinity": "TEXT" + }, + { + "fieldPath": "direction", + "columnName": "direction", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "createdAt", + "columnName": "createdAt", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "updatedAt", + "columnName": "updatedAt", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "confirmationEtaSeconds", + "columnName": "estimatedConfirmationInSeconds", + "affinity": "INTEGER" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id", + "walletId" + ] + }, + "indices": [ + { + "name": "index_transactions_walletId", + "unique": false, + "columnNames": [ + "walletId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_transactions_walletId` ON `${TABLE_NAME}` (`walletId`)" + } + ], + "foreignKeys": [ + { + "table": "wallets", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "walletId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "tx_swap_metadata", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tx_id` TEXT NOT NULL, `from_asset_id` TEXT NOT NULL, `to_asset_id` TEXT NOT NULL, `from_amount` TEXT NOT NULL, `to_amount` TEXT NOT NULL, PRIMARY KEY(`tx_id`))", + "fields": [ + { + "fieldPath": "txId", + "columnName": "tx_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fromAssetId", + "columnName": "from_asset_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "toAssetId", + "columnName": "to_asset_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fromAmount", + "columnName": "from_amount", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "toAmount", + "columnName": "to_amount", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "tx_id" + ] + } + }, + { + "tableName": "wallets_connections", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `wallet_id` TEXT NOT NULL, `session_id` TEXT NOT NULL, `state` TEXT NOT NULL, `chains` TEXT NOT NULL, `created_at` INTEGER NOT NULL, `expire_at` INTEGER NOT NULL, `app_name` TEXT NOT NULL, `app_description` TEXT NOT NULL, `app_url` TEXT NOT NULL, `app_icon` TEXT NOT NULL, `redirect_native` TEXT, `redirect_universal` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`wallet_id`) REFERENCES `wallets`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "walletId", + "columnName": "wallet_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sessionId", + "columnName": "session_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "state", + "columnName": "state", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "chains", + "columnName": "chains", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "createdAt", + "columnName": "created_at", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "expireAt", + "columnName": "expire_at", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "appName", + "columnName": "app_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "appDescription", + "columnName": "app_description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "appUrl", + "columnName": "app_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "appIcon", + "columnName": "app_icon", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "redirectNative", + "columnName": "redirect_native", + "affinity": "TEXT" + }, + { + "fieldPath": "redirectUniversal", + "columnName": "redirect_universal", + "affinity": "TEXT" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_wallets_connections_wallet_id", + "unique": false, + "columnNames": [ + "wallet_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_wallets_connections_wallet_id` ON `${TABLE_NAME}` (`wallet_id`)" + } + ], + "foreignKeys": [ + { + "table": "wallets", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "wallet_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "stake_validators", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `assetId` TEXT NOT NULL, `validatorId` TEXT NOT NULL, `name` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `commission` REAL NOT NULL, `apr` REAL NOT NULL, `providerType` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`assetId`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "assetId", + "columnName": "assetId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "validatorId", + "columnName": "validatorId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isActive", + "columnName": "isActive", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "commission", + "columnName": "commission", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "apr", + "columnName": "apr", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "providerType", + "columnName": "providerType", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_stake_validators_assetId", + "unique": false, + "columnNames": [ + "assetId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_stake_validators_assetId` ON `${TABLE_NAME}` (`assetId`)" + } + ], + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "assetId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "stake_delegations", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `walletId` TEXT NOT NULL, `assetId` TEXT NOT NULL, `validatorId` TEXT NOT NULL, `state` TEXT NOT NULL, `delegationId` TEXT NOT NULL, `balance` TEXT NOT NULL, `shares` TEXT NOT NULL, `rewards` TEXT NOT NULL, `completionDate` INTEGER, PRIMARY KEY(`walletId`, `id`), FOREIGN KEY(`walletId`) REFERENCES `wallets`(`id`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`assetId`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`validatorId`) REFERENCES `stake_validators`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "walletId", + "columnName": "walletId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "assetId", + "columnName": "assetId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "validatorId", + "columnName": "validatorId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "state", + "columnName": "state", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "delegationId", + "columnName": "delegationId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "balance", + "columnName": "balance", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shares", + "columnName": "shares", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "rewards", + "columnName": "rewards", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "completionDate", + "columnName": "completionDate", + "affinity": "INTEGER" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "walletId", + "id" + ] + }, + "indices": [ + { + "name": "index_stake_delegations_assetId", + "unique": false, + "columnNames": [ + "assetId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_stake_delegations_assetId` ON `${TABLE_NAME}` (`assetId`)" + }, + { + "name": "index_stake_delegations_validatorId", + "unique": false, + "columnNames": [ + "validatorId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_stake_delegations_validatorId` ON `${TABLE_NAME}` (`validatorId`)" + } + ], + "foreignKeys": [ + { + "table": "wallets", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "walletId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "assetId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "stake_validators", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "validatorId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "nodes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `status` TEXT NOT NULL, `priority` INTEGER NOT NULL, `chain` TEXT NOT NULL, PRIMARY KEY(`url`), FOREIGN KEY(`chain`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "chain", + "columnName": "chain", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "url" + ] + }, + "indices": [ + { + "name": "index_nodes_chain", + "unique": false, + "columnNames": [ + "chain" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_nodes_chain` ON `${TABLE_NAME}` (`chain`)" + } + ], + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "chain" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "session", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `wallet_id` TEXT NOT NULL, `currency` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "walletId", + "columnName": "wallet_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "currency", + "columnName": "currency", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + } + }, + { + "tableName": "banners", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`wallet_id` TEXT NOT NULL, `asset_id` TEXT NOT NULL, `chain` TEXT, `state` TEXT NOT NULL, `event` TEXT NOT NULL, PRIMARY KEY(`wallet_id`, `asset_id`), FOREIGN KEY(`chain`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "walletId", + "columnName": "wallet_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "assetId", + "columnName": "asset_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "chain", + "columnName": "chain", + "affinity": "TEXT" + }, + { + "fieldPath": "state", + "columnName": "state", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "event", + "columnName": "event", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "wallet_id", + "asset_id" + ] + }, + "indices": [ + { + "name": "index_banners_event", + "unique": false, + "columnNames": [ + "event" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_banners_event` ON `${TABLE_NAME}` (`event`)" + }, + { + "name": "index_banners_wallet_id", + "unique": false, + "columnNames": [ + "wallet_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_banners_wallet_id` ON `${TABLE_NAME}` (`wallet_id`)" + }, + { + "name": "index_banners_chain", + "unique": false, + "columnNames": [ + "chain" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_banners_chain` ON `${TABLE_NAME}` (`chain`)" + } + ], + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "chain" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "price_alerts", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `assetId` TEXT NOT NULL, `currency` TEXT NOT NULL, `price` REAL, `pricePercentChange` REAL, `priceDirection` TEXT, `lastNotifiedAt` INTEGER, `enabled` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "assetId", + "columnName": "assetId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "currency", + "columnName": "currency", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "price", + "columnName": "price", + "affinity": "REAL" + }, + { + "fieldPath": "pricePercentChange", + "columnName": "pricePercentChange", + "affinity": "REAL" + }, + { + "fieldPath": "priceDirection", + "columnName": "priceDirection", + "affinity": "TEXT" + }, + { + "fieldPath": "lastNotifiedAt", + "columnName": "lastNotifiedAt", + "affinity": "INTEGER" + }, + { + "fieldPath": "enabled", + "columnName": "enabled", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + } + }, + { + "tableName": "nft_collections", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `description` TEXT, `chain` TEXT NOT NULL, `contractAddress` TEXT NOT NULL, `imageUrl` TEXT NOT NULL, `previewImageUrl` TEXT NOT NULL, `originalSourceUrl` TEXT NOT NULL, `status` TEXT, `links` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`chain`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT" + }, + { + "fieldPath": "chain", + "columnName": "chain", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contractAddress", + "columnName": "contractAddress", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "imageUrl", + "columnName": "imageUrl", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "previewImageUrl", + "columnName": "previewImageUrl", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "originalSourceUrl", + "columnName": "originalSourceUrl", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "TEXT" + }, + { + "fieldPath": "links", + "columnName": "links", + "affinity": "TEXT" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_nft_collections_chain", + "unique": false, + "columnNames": [ + "chain" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_nft_collections_chain` ON `${TABLE_NAME}` (`chain`)" + } + ], + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "chain" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "nft_assets", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `collection_id` TEXT NOT NULL, `token_id` TEXT NOT NULL, `token_type` TEXT NOT NULL, `name` TEXT NOT NULL, `description` TEXT, `chain` TEXT NOT NULL, `contract_address` TEXT, `image_url` TEXT NOT NULL, `preview_image_url` TEXT NOT NULL, `original_image_url` TEXT NOT NULL, `attributes` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`collection_id`) REFERENCES `nft_collections`(`id`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`chain`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "collectionId", + "columnName": "collection_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "tokenId", + "columnName": "token_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "tokenType", + "columnName": "token_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT" + }, + { + "fieldPath": "chain", + "columnName": "chain", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contractAddress", + "columnName": "contract_address", + "affinity": "TEXT" + }, + { + "fieldPath": "imageUrl", + "columnName": "image_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "previewImageUrl", + "columnName": "preview_image_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "originalSourceUrl", + "columnName": "original_image_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attributes", + "columnName": "attributes", + "affinity": "TEXT" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_nft_assets_collection_id", + "unique": false, + "columnNames": [ + "collection_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_nft_assets_collection_id` ON `${TABLE_NAME}` (`collection_id`)" + }, + { + "name": "index_nft_assets_chain", + "unique": false, + "columnNames": [ + "chain" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_nft_assets_chain` ON `${TABLE_NAME}` (`chain`)" + } + ], + "foreignKeys": [ + { + "table": "nft_collections", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "collection_id" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "chain" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "nft_assets_associations", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`wallet_id` TEXT NOT NULL, `asset_id` TEXT NOT NULL, PRIMARY KEY(`wallet_id`, `asset_id`), FOREIGN KEY(`asset_id`) REFERENCES `nft_assets`(`id`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`wallet_id`) REFERENCES `wallets`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "walletId", + "columnName": "wallet_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "assetId", + "columnName": "asset_id", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "wallet_id", + "asset_id" + ] + }, + "indices": [ + { + "name": "index_nft_assets_associations_asset_id", + "unique": false, + "columnNames": [ + "asset_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_nft_assets_associations_asset_id` ON `${TABLE_NAME}` (`asset_id`)" + } + ], + "foreignKeys": [ + { + "table": "nft_assets", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "asset_id" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "wallets", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "wallet_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "asset_links", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`asset_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`asset_id`, `name`), FOREIGN KEY(`asset_id`) REFERENCES `asset`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "assetId", + "columnName": "asset_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "asset_id", + "name" + ] + }, + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "asset_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "asset_market", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`asset_id` TEXT NOT NULL, `marketCap` REAL, `marketCapFdv` REAL, `marketCapRank` INTEGER, `totalVolume` REAL, `circulatingSupply` REAL, `totalSupply` REAL, `maxSupply` REAL, `allTimeHigh` REAL, `allTimeHighDate` INTEGER, `allTimeHighChangePercentage` REAL, `allTimeLow` REAL, `allTimeLowDate` INTEGER, `allTimeLowChangePercentage` REAL, PRIMARY KEY(`asset_id`), FOREIGN KEY(`asset_id`) REFERENCES `asset`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "assetId", + "columnName": "asset_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "marketCap", + "columnName": "marketCap", + "affinity": "REAL" + }, + { + "fieldPath": "marketCapFdv", + "columnName": "marketCapFdv", + "affinity": "REAL" + }, + { + "fieldPath": "marketCapRank", + "columnName": "marketCapRank", + "affinity": "INTEGER" + }, + { + "fieldPath": "totalVolume", + "columnName": "totalVolume", + "affinity": "REAL" + }, + { + "fieldPath": "circulatingSupply", + "columnName": "circulatingSupply", + "affinity": "REAL" + }, + { + "fieldPath": "totalSupply", + "columnName": "totalSupply", + "affinity": "REAL" + }, + { + "fieldPath": "maxSupply", + "columnName": "maxSupply", + "affinity": "REAL" + }, + { + "fieldPath": "allTimeHigh", + "columnName": "allTimeHigh", + "affinity": "REAL" + }, + { + "fieldPath": "allTimeHighDate", + "columnName": "allTimeHighDate", + "affinity": "INTEGER" + }, + { + "fieldPath": "allTimeHighChangePercentage", + "columnName": "allTimeHighChangePercentage", + "affinity": "REAL" + }, + { + "fieldPath": "allTimeLow", + "columnName": "allTimeLow", + "affinity": "REAL" + }, + { + "fieldPath": "allTimeLowDate", + "columnName": "allTimeLowDate", + "affinity": "INTEGER" + }, + { + "fieldPath": "allTimeLowChangePercentage", + "columnName": "allTimeLowChangePercentage", + "affinity": "REAL" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "asset_id" + ] + }, + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "asset_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "asset_lists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `count` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "count", + "columnName": "count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + } + }, + { + "tableName": "search", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `query` TEXT NOT NULL, `assetId` TEXT, `perpetualId` TEXT, `listId` TEXT, `priority` INTEGER NOT NULL, FOREIGN KEY(`assetId`) REFERENCES `asset`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`perpetualId`) REFERENCES `perpetuals`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`listId`) REFERENCES `asset_lists`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "query", + "columnName": "query", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "assetId", + "columnName": "assetId", + "affinity": "TEXT" + }, + { + "fieldPath": "perpetualId", + "columnName": "perpetualId", + "affinity": "TEXT" + }, + { + "fieldPath": "listId", + "columnName": "listId", + "affinity": "TEXT" + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_search_query", + "unique": false, + "columnNames": [ + "query" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_search_query` ON `${TABLE_NAME}` (`query`)" + }, + { + "name": "index_search_assetId_query", + "unique": true, + "columnNames": [ + "assetId", + "query" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_search_assetId_query` ON `${TABLE_NAME}` (`assetId`, `query`)" + }, + { + "name": "index_search_perpetualId_query", + "unique": true, + "columnNames": [ + "perpetualId", + "query" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_search_perpetualId_query` ON `${TABLE_NAME}` (`perpetualId`, `query`)" + }, + { + "name": "index_search_listId_query", + "unique": true, + "columnNames": [ + "listId", + "query" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_search_listId_query` ON `${TABLE_NAME}` (`listId`, `query`)" + } + ], + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "assetId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "perpetuals", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "perpetualId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "asset_lists", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "listId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "currency_rates", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`currency` TEXT NOT NULL, `rate` REAL NOT NULL, PRIMARY KEY(`currency`))", + "fields": [ + { + "fieldPath": "currency", + "columnName": "currency", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "rate", + "columnName": "rate", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "currency" + ] + } + }, + { + "tableName": "fiat_transactions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `walletId` TEXT NOT NULL, `assetId` TEXT NOT NULL, `transactionType` TEXT NOT NULL, `provider` TEXT NOT NULL, `status` TEXT NOT NULL, `fiatAmount` REAL NOT NULL, `fiatCurrency` TEXT NOT NULL, `value` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `detailsUrl` TEXT, PRIMARY KEY(`id`, `walletId`), FOREIGN KEY(`walletId`) REFERENCES `wallets`(`id`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`assetId`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "walletId", + "columnName": "walletId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "assetId", + "columnName": "assetId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "transactionType", + "columnName": "transactionType", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "provider", + "columnName": "provider", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fiatAmount", + "columnName": "fiatAmount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "fiatCurrency", + "columnName": "fiatCurrency", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "createdAt", + "columnName": "createdAt", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "detailsUrl", + "columnName": "detailsUrl", + "affinity": "TEXT" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id", + "walletId" + ] + }, + "indices": [ + { + "name": "index_fiat_transactions_walletId", + "unique": false, + "columnNames": [ + "walletId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_fiat_transactions_walletId` ON `${TABLE_NAME}` (`walletId`)" + }, + { + "name": "index_fiat_transactions_assetId", + "unique": false, + "columnNames": [ + "assetId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_fiat_transactions_assetId` ON `${TABLE_NAME}` (`assetId`)" + } + ], + "foreignKeys": [ + { + "table": "wallets", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "walletId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "assetId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "recent_assets", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`asset_id` TEXT NOT NULL, `wallet_id` TEXT NOT NULL, `to_asset_id` TEXT, `type` TEXT NOT NULL, `addedAt` INTEGER NOT NULL, PRIMARY KEY(`asset_id`, `wallet_id`, `type`), FOREIGN KEY(`asset_id`) REFERENCES `asset`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`wallet_id`) REFERENCES `wallets`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "assetId", + "columnName": "asset_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "walletId", + "columnName": "wallet_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "toAssetId", + "columnName": "to_asset_id", + "affinity": "TEXT" + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "addedAt", + "columnName": "addedAt", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "asset_id", + "wallet_id", + "type" + ] + }, + "indices": [ + { + "name": "index_recent_assets_wallet_id", + "unique": false, + "columnNames": [ + "wallet_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_recent_assets_wallet_id` ON `${TABLE_NAME}` (`wallet_id`)" + } + ], + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "asset_id" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "wallets", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "wallet_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "perpetuals", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `provider` TEXT NOT NULL, `assetId` TEXT NOT NULL, `identifier` TEXT NOT NULL, `price` REAL NOT NULL, `pricePercentChange24h` REAL NOT NULL, `openInterest` REAL NOT NULL, `volume24h` REAL NOT NULL, `funding` REAL NOT NULL, `maxLeverage` INTEGER NOT NULL, `isIsolatedOnly` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`assetId`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "provider", + "columnName": "provider", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "assetId", + "columnName": "assetId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "identifier", + "columnName": "identifier", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "price", + "columnName": "price", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "pricePercentChange24h", + "columnName": "pricePercentChange24h", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "openInterest", + "columnName": "openInterest", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "volume24h", + "columnName": "volume24h", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "funding", + "columnName": "funding", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "maxLeverage", + "columnName": "maxLeverage", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isIsolatedOnly", + "columnName": "isIsolatedOnly", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPinned", + "columnName": "isPinned", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "perpetuals_asset_id_idx", + "unique": false, + "columnNames": [ + "assetId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `perpetuals_asset_id_idx` ON `${TABLE_NAME}` (`assetId`)" + } + ], + "foreignKeys": [ + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "assetId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "perpetuals_positions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `walletId` TEXT NOT NULL, `perpetualId` TEXT NOT NULL, `assetId` TEXT NOT NULL, `size` REAL NOT NULL, `sizeValue` REAL NOT NULL, `leverage` INTEGER NOT NULL, `entryPrice` REAL, `liquidationPrice` REAL, `marginType` TEXT NOT NULL, `direction` TEXT NOT NULL, `marginAmount` REAL NOT NULL, `takeProfitPrice` REAL, `takeProfitType` TEXT, `takeProfitOrderId` TEXT, `stopLossPrice` REAL, `stopLossType` TEXT, `stopLossOrderId` TEXT, `pnl` REAL NOT NULL, `funding` REAL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`, `walletId`), FOREIGN KEY(`walletId`) REFERENCES `wallets`(`id`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`perpetualId`) REFERENCES `perpetuals`(`id`) ON UPDATE CASCADE ON DELETE CASCADE , FOREIGN KEY(`assetId`) REFERENCES `asset`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "walletId", + "columnName": "walletId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "perpetualId", + "columnName": "perpetualId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "assetId", + "columnName": "assetId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "size", + "columnName": "size", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "sizeValue", + "columnName": "sizeValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "leverage", + "columnName": "leverage", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryPrice", + "columnName": "entryPrice", + "affinity": "REAL" + }, + { + "fieldPath": "liquidationPrice", + "columnName": "liquidationPrice", + "affinity": "REAL" + }, + { + "fieldPath": "marginType", + "columnName": "marginType", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "direction", + "columnName": "direction", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "marginAmount", + "columnName": "marginAmount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "takeProfitPrice", + "columnName": "takeProfitPrice", + "affinity": "REAL" + }, + { + "fieldPath": "takeProfitType", + "columnName": "takeProfitType", + "affinity": "TEXT" + }, + { + "fieldPath": "takeProfitOrderId", + "columnName": "takeProfitOrderId", + "affinity": "TEXT" + }, + { + "fieldPath": "stopLossPrice", + "columnName": "stopLossPrice", + "affinity": "REAL" + }, + { + "fieldPath": "stopLossType", + "columnName": "stopLossType", + "affinity": "TEXT" + }, + { + "fieldPath": "stopLossOrderId", + "columnName": "stopLossOrderId", + "affinity": "TEXT" + }, + { + "fieldPath": "pnl", + "columnName": "pnl", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "funding", + "columnName": "funding", + "affinity": "REAL" + }, + { + "fieldPath": "updatedAt", + "columnName": "updatedAt", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id", + "walletId" + ] + }, + "indices": [ + { + "name": "perpetuals_positions_wallet_id_idx", + "unique": false, + "columnNames": [ + "walletId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `perpetuals_positions_wallet_id_idx` ON `${TABLE_NAME}` (`walletId`)" + }, + { + "name": "perpetuals_positions_perpetual_id_idx", + "unique": false, + "columnNames": [ + "perpetualId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `perpetuals_positions_perpetual_id_idx` ON `${TABLE_NAME}` (`perpetualId`)" + }, + { + "name": "perpetuals_positions_asset_id_idx", + "unique": false, + "columnNames": [ + "assetId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `perpetuals_positions_asset_id_idx` ON `${TABLE_NAME}` (`assetId`)" + } + ], + "foreignKeys": [ + { + "table": "wallets", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "walletId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "perpetuals", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "perpetualId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "asset", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "assetId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "in_app_notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `wallet_id` TEXT NOT NULL, `read_at` INTEGER, `created_at` INTEGER NOT NULL, `item` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`wallet_id`) REFERENCES `wallets`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "walletId", + "columnName": "wallet_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "readAt", + "columnName": "read_at", + "affinity": "INTEGER" + }, + { + "fieldPath": "createdAt", + "columnName": "created_at", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "item", + "columnName": "item", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_in_app_notifications_wallet_id", + "unique": false, + "columnNames": [ + "wallet_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_in_app_notifications_wallet_id` ON `${TABLE_NAME}` (`wallet_id`)" + }, + { + "name": "index_in_app_notifications_created_at", + "unique": false, + "columnNames": [ + "created_at" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_in_app_notifications_created_at` ON `${TABLE_NAME}` (`created_at`)" + } + ], + "foreignKeys": [ + { + "table": "wallets", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "wallet_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "support_messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `content` TEXT NOT NULL, `sender` TEXT NOT NULL, `status` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `images` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "createdAt", + "columnName": "createdAt", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "images", + "columnName": "images", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_support_messages_createdAt", + "unique": false, + "columnNames": [ + "createdAt" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_support_messages_createdAt` ON `${TABLE_NAME}` (`createdAt`)" + } + ] + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'be79416139dd7439f83baef92c76ae11')" + ] + } +} \ No newline at end of file diff --git a/android/data/services/store/src/androidTest/kotlin/com/gemwallet/android/service/store/Migration_85_86Test.kt b/android/data/services/store/src/androidTest/kotlin/com/gemwallet/android/service/store/Migration_85_86Test.kt new file mode 100644 index 0000000000..c6d0c2731a --- /dev/null +++ b/android/data/services/store/src/androidTest/kotlin/com/gemwallet/android/service/store/Migration_85_86Test.kt @@ -0,0 +1,146 @@ +package com.gemwallet.android.service.store + +import androidx.room.testing.MigrationTestHelper +import androidx.sqlite.db.SupportSQLiteDatabase +import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import com.gemwallet.android.data.service.store.database.GemDatabase +import com.gemwallet.android.data.service.store.database.di.Migration_85_86 +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class Migration_85_86Test { + + private val testDb = "migration-85-86-test" + + @get:Rule + val helper = MigrationTestHelper( + InstrumentationRegistry.getInstrumentation(), + GemDatabase::class.java, + emptyList(), + FrameworkSQLiteOpenHelperFactory(), + ) + + @Before + fun setUp() { + InstrumentationRegistry.getInstrumentation().targetContext.deleteDatabase(testDb) + } + + @Test + fun migrate85To86RemovesSeiAndPreservesSeiEvm() { + helper.createDatabase(testDb, 85).apply { + seed() + close() + } + + val db = helper.runMigrationsAndValidate(testDb, 86, true, Migration_85_86) + + assertEquals(0, db.count("asset", "chain = 'sei'")) + assertEquals(2, db.count("asset", "chain = 'seievm'")) + assertEquals(0, db.count("accounts", "chain = 'sei'")) + assertEquals(1, db.count("accounts", "chain = 'seievm'")) + assertEquals(1, db.count("wallets")) + assertEquals(1, db.count("wallets_connections")) + assertEquals("seievm-connection", db.string("SELECT id FROM wallets_connections")) + assertEquals(1, db.count("in_app_notifications")) + assertEquals("seievm-notification", db.string("SELECT id FROM in_app_notifications")) + assertEquals(0, db.count("contacts_addresses", "chain = 'sei'")) + assertEquals(1, db.count("contacts_addresses", "chain = 'seievm'")) + assertEquals(1, db.count("transactions")) + assertEquals(1, db.count("tx_swap_metadata")) + assertEquals(1, db.count("prices")) + assertEquals(1, db.count("price_alerts")) + assertEquals(1, db.count("recent_assets")) + assertEquals(1, db.count("banners")) + assertEquals("[]", db.string("SELECT associations FROM asset WHERE id = 'seievm'")) + + db.query("PRAGMA foreign_key_check").use { cursor -> + assertFalse(cursor.moveToFirst()) + } + db.close() + } + + private fun SupportSQLiteDatabase.seed() { + execSQL("INSERT INTO wallets (id, name, type, position, pinned, `index`, source) VALUES ('wallet', 'Wallet', 'multicoin', 0, 0, 0, 'Import')") + execSQL("INSERT INTO contacts (id, name, createdAt, updatedAt) VALUES ('contact', 'Contact', 0, 0)") + insertAsset("sei", "sei", "[]") + insertAsset("sei_token", "sei", "[]") + insertAsset("seievm", "seievm", "[{\"assetId\":\"sei\"}]") + insertAsset("seievm_token", "seievm", "[]") + execSQL("INSERT INTO accounts (wallet_id, derivation_path, address, chain) VALUES ('wallet', '', 'sei-address', 'sei')") + execSQL("INSERT INTO accounts (wallet_id, derivation_path, address, chain) VALUES ('wallet', '', 'seievm-address', 'seievm')") + execSQL("INSERT INTO contacts_addresses (id, contactId, address, chain) VALUES ('sei-contact', 'contact', 'sei-address', 'sei')") + execSQL("INSERT INTO contacts_addresses (id, contactId, address, chain) VALUES ('seievm-contact', 'contact', 'seievm-address', 'seievm')") + seedDependentRecords() + execSQL("INSERT INTO wallets_connections (id, wallet_id, session_id, state, chains, created_at, expire_at, app_name, app_description, app_url, app_icon) VALUES ('sei-connection', 'wallet', 'sei-session', 'active', '[\"sei\"]', 0, 1, 'App', 'App', 'https://example.com', 'https://example.com/icon')") + execSQL("INSERT INTO wallets_connections (id, wallet_id, session_id, state, chains, created_at, expire_at, app_name, app_description, app_url, app_icon) VALUES ('seievm-connection', 'wallet', 'seievm-session', 'active', '[\"seievm\"]', 0, 1, 'App', 'App', 'https://example.com', 'https://example.com/icon')") + execSQL("INSERT INTO in_app_notifications (id, wallet_id, created_at, item) VALUES ('sei-notification', 'wallet', 0, '{\"chain\":\"sei\"}')") + execSQL("INSERT INTO in_app_notifications (id, wallet_id, created_at, item) VALUES ('seievm-notification', 'wallet', 0, '{\"chain\":\"seievm\"}')") + insertTransaction("sei-transaction", "sei", "seievm") + insertTransaction("sei-fee-transaction", "seievm", "sei") + insertTransaction("seievm-transaction", "seievm", "seievm") + execSQL("INSERT INTO tx_swap_metadata (tx_id, from_asset_id, to_asset_id, from_amount, to_amount) VALUES ('sei-transaction', 'seievm', 'seievm', '1', '1')") + execSQL("INSERT INTO tx_swap_metadata (tx_id, from_asset_id, to_asset_id, from_amount, to_amount) VALUES ('sei-fee-transaction', 'seievm', 'seievm', '1', '1')") + execSQL("INSERT INTO tx_swap_metadata (tx_id, from_asset_id, to_asset_id, from_amount, to_amount) VALUES ('seievm-transaction', 'seievm', 'seievm', '1', '1')") + execSQL("INSERT INTO prices (asset_id, currency) VALUES ('sei_token', 'USD'), ('seievm_token', 'USD')") + execSQL("INSERT INTO price_alerts (assetId, currency, enabled) VALUES ('sei_token', 'USD', 1), ('seievm_token', 'USD', 1)") + execSQL("INSERT INTO recent_assets (asset_id, wallet_id, to_asset_id, type, addedAt) VALUES ('seievm', 'wallet', 'sei_token', 'swap', 0), ('seievm', 'wallet', NULL, 'asset', 0)") + execSQL("INSERT INTO banners (wallet_id, asset_id, chain, state, event) VALUES ('wallet', 'sei_token', NULL, 'active', 'event'), ('wallet', 'seievm_token', 'seievm', 'active', 'event')") + } + + private fun SupportSQLiteDatabase.seedDependentRecords() { + execSQL("INSERT INTO addresses (chain, address, walletId, name, type, status) VALUES ('sei', 'address', 'wallet', 'Address', 'address', 'active')") + execSQL("INSERT INTO nodes (url, status, priority, chain) VALUES ('https://sei.example', 'active', 0, 'sei')") + execSQL("INSERT INTO asset_links (asset_id, name, url) VALUES ('sei_token', 'website', 'https://sei.example')") + execSQL("INSERT INTO asset_market (asset_id) VALUES ('sei_token')") + execSQL("INSERT INTO fiat_transactions (id, walletId, assetId, transactionType, provider, status, fiatAmount, fiatCurrency, value, createdAt) VALUES ('fiat', 'wallet', 'sei_token', 'buy', 'provider', 'complete', 1, 'USD', '1', 0)") + execSQL("INSERT INTO stake_validators (id, assetId, validatorId, name, isActive, commission, apr, providerType) VALUES ('validator', 'sei', 'validator', 'Validator', 1, 0, 0, 'stake')") + execSQL("INSERT INTO stake_delegations (id, walletId, assetId, validatorId, state, delegationId, balance, shares, rewards) VALUES ('delegation', 'wallet', 'sei', 'validator', 'active', 'delegation', '1', '1', '0')") + execSQL("INSERT INTO nft_collections (id, name, chain, contractAddress, imageUrl, previewImageUrl, originalSourceUrl) VALUES ('collection', 'Collection', 'sei', 'contract', '', '', '')") + execSQL("INSERT INTO nft_assets (id, collection_id, token_id, token_type, name, chain, image_url, preview_image_url, original_image_url) VALUES ('nft', 'collection', '1', 'token', 'NFT', 'sei', '', '', '')") + execSQL("INSERT INTO nft_assets_associations (wallet_id, asset_id) VALUES ('wallet', 'nft')") + execSQL("INSERT INTO perpetuals (id, name, provider, assetId, identifier, price, pricePercentChange24h, openInterest, volume24h, funding, maxLeverage, isIsolatedOnly, isPinned) VALUES ('perpetual', 'Perpetual', 'provider', 'sei_token', 'identifier', 1, 0, 0, 0, 0, 1, 0, 0)") + execSQL("INSERT INTO perpetuals_positions (id, walletId, perpetualId, assetId, size, sizeValue, leverage, marginType, direction, marginAmount, pnl, updatedAt) VALUES ('position', 'wallet', 'perpetual', 'sei_token', 1, 1, 1, 'cross', 'long', 1, 0, 0)") + execSQL("INSERT INTO search (query, assetId, priority) VALUES ('sei', 'sei_token', 0)") + execSQL("INSERT INTO search (query, perpetualId, priority) VALUES ('perpetual', 'perpetual', 0)") + execSQL( + "INSERT INTO balances (asset_id, wallet_id, available, available_amount, frozen, frozen_amount, locked, locked_amount, staked, staked_amount, pending, pending_amount, rewards, rewards_amount, reserved, reserved_amount, withdrawable, withdrawableAmount, total_amount, is_active, is_pinned, is_visible, list_position) " + + "VALUES ('sei_token', 'wallet', '0', 0, '0', 0, '0', 0, '0', 0, '0', 0, '0', 0, '0', 0, '0', 0, 0, 1, 0, 1, 0)", + ) + } + + private fun SupportSQLiteDatabase.insertAsset(id: String, chain: String, associations: String) { + execSQL( + "INSERT INTO asset (id, name, symbol, decimals, type, chain, is_enabled, is_buy_enabled, is_sell_enabled, is_swap_enabled, is_stake_enabled, rank, updated_at, associations) " + + "VALUES (?, ?, ?, 6, 'NATIVE', ?, 1, 0, 0, 0, 0, 1, 0, ?)", + arrayOf(id, id, id, chain, associations), + ) + } + + private fun SupportSQLiteDatabase.insertTransaction(id: String, assetId: String, feeAssetId: String) { + execSQL( + "INSERT INTO transactions (id, walletId, hash, assetId, feeAssetId, owner, recipient, state, type, blockNumber, sequence, fee, value, direction, createdAt, updatedAt) " + + "VALUES (?, 'wallet', ?, ?, ?, 'owner', 'recipient', 'confirmed', 'transfer', '1', '1', '1', '1', 'outgoing', 0, 0)", + arrayOf(id, id, assetId, feeAssetId), + ) + } + + private fun SupportSQLiteDatabase.count(table: String, where: String? = null): Long { + val suffix = where?.let { " WHERE $it" }.orEmpty() + return query("SELECT COUNT(*) FROM $table$suffix").use { cursor -> + cursor.moveToFirst() + cursor.getLong(0) + } + } + + private fun SupportSQLiteDatabase.string(sql: String): String = query(sql).use { cursor -> + cursor.moveToFirst() + cursor.getString(0) + } +} diff --git a/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/GemDatabase.kt b/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/GemDatabase.kt index ef88dad953..453f91f566 100644 --- a/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/GemDatabase.kt +++ b/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/GemDatabase.kt @@ -36,7 +36,7 @@ import com.gemwallet.android.data.service.store.database.entities.DbTxSwapMetada import com.gemwallet.android.data.service.store.database.entities.DbWallet @Database( - version = 85, + version = 86, entities = [ DbWallet::class, DbAccount::class, diff --git a/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/di/ChainRemoval.kt b/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/di/ChainRemoval.kt new file mode 100644 index 0000000000..f6a15e482b --- /dev/null +++ b/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/di/ChainRemoval.kt @@ -0,0 +1,78 @@ +package com.gemwallet.android.data.service.store.database.di + +import androidx.sqlite.db.SupportSQLiteDatabase + +internal fun SupportSQLiteDatabase.removeChain(chain: String) { + val assetIdPattern = "${chain}\\_%" + fun deleteAssetReferences(table: String, column: String) { + execSQL( + "DELETE FROM $table WHERE $column = ? OR $column LIKE ? ESCAPE '\\'", + arrayOf(chain, assetIdPattern), + ) + } + + execSQL("DELETE FROM wallets_connections WHERE instr(chains, '\"' || ? || '\"') > 0", arrayOf(chain)) + execSQL( + "DELETE FROM in_app_notifications WHERE " + + "instr(item, '\"' || ? || '\"') > 0 OR instr(item, '\"' || ? || '_') > 0", + arrayOf(chain, chain), + ) + execSQL( + "UPDATE asset SET associations = '[]' WHERE " + + "instr(associations, '\"' || ? || '\"') > 0 OR instr(associations, '\"' || ? || '_') > 0", + arrayOf(chain, chain), + ) + execSQL("DELETE FROM contacts_addresses WHERE chain = ?", arrayOf(chain)) + execSQL( + "DELETE FROM tx_swap_metadata WHERE " + + "from_asset_id = ? OR from_asset_id LIKE ? ESCAPE '\\' OR " + + "to_asset_id = ? OR to_asset_id LIKE ? ESCAPE '\\' OR " + + "tx_id IN (SELECT id FROM transactions WHERE " + + "assetId = ? OR assetId LIKE ? ESCAPE '\\' OR " + + "feeAssetId = ? OR feeAssetId LIKE ? ESCAPE '\\')", + arrayOf(chain, assetIdPattern, chain, assetIdPattern, chain, assetIdPattern, chain, assetIdPattern), + ) + execSQL( + "DELETE FROM transactions WHERE assetId = ? OR assetId LIKE ? ESCAPE '\\' OR " + + "feeAssetId = ? OR feeAssetId LIKE ? ESCAPE '\\'", + arrayOf(chain, assetIdPattern, chain, assetIdPattern), + ) + execSQL( + "DELETE FROM search WHERE assetId = ? OR assetId LIKE ? ESCAPE '\\' OR " + + "perpetualId IN (SELECT id FROM perpetuals WHERE assetId = ? OR assetId LIKE ? ESCAPE '\\')", + arrayOf(chain, assetIdPattern, chain, assetIdPattern), + ) + execSQL( + "DELETE FROM perpetuals_positions WHERE assetId = ? OR assetId LIKE ? ESCAPE '\\' OR " + + "perpetualId IN (SELECT id FROM perpetuals WHERE assetId = ? OR assetId LIKE ? ESCAPE '\\')", + arrayOf(chain, assetIdPattern, chain, assetIdPattern), + ) + deleteAssetReferences("perpetuals", "assetId") + deleteAssetReferences("stake_delegations", "assetId") + deleteAssetReferences("stake_validators", "assetId") + execSQL( + "DELETE FROM nft_assets_associations WHERE asset_id IN (SELECT id FROM nft_assets WHERE chain = ?)", + arrayOf(chain), + ) + execSQL("DELETE FROM nft_assets WHERE chain = ?", arrayOf(chain)) + execSQL("DELETE FROM nft_collections WHERE chain = ?", arrayOf(chain)) + deleteAssetReferences("balances", "asset_id") + deleteAssetReferences("asset_links", "asset_id") + deleteAssetReferences("asset_market", "asset_id") + deleteAssetReferences("fiat_transactions", "assetId") + deleteAssetReferences("prices", "asset_id") + deleteAssetReferences("price_alerts", "assetId") + execSQL( + "DELETE FROM recent_assets WHERE asset_id = ? OR asset_id LIKE ? ESCAPE '\\' OR " + + "to_asset_id = ? OR to_asset_id LIKE ? ESCAPE '\\'", + arrayOf(chain, assetIdPattern, chain, assetIdPattern), + ) + execSQL( + "DELETE FROM banners WHERE chain = ? OR asset_id = ? OR asset_id LIKE ? ESCAPE '\\'", + arrayOf(chain, chain, assetIdPattern), + ) + execSQL("DELETE FROM nodes WHERE chain = ?", arrayOf(chain)) + execSQL("DELETE FROM addresses WHERE chain = ?", arrayOf(chain)) + execSQL("DELETE FROM accounts WHERE chain = ?", arrayOf(chain)) + execSQL("DELETE FROM asset WHERE chain = ?", arrayOf(chain)) +} diff --git a/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/di/DatabaseModule.kt b/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/di/DatabaseModule.kt index c8dd24dddd..9644270e8f 100644 --- a/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/di/DatabaseModule.kt +++ b/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/di/DatabaseModule.kt @@ -89,6 +89,7 @@ object DatabaseModule { .addMigrations(Migration_82_83) .addMigrations(Migration_83_84) .addMigrations(Migration_84_85) + .addMigrations(Migration_85_86) .build() @Singleton diff --git a/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/di/Migration_85_86.kt b/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/di/Migration_85_86.kt new file mode 100644 index 0000000000..1b32a416a8 --- /dev/null +++ b/android/data/services/store/src/main/kotlin/com/gemwallet/android/data/service/store/database/di/Migration_85_86.kt @@ -0,0 +1,10 @@ +package com.gemwallet.android.data.service.store.database.di + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +object Migration_85_86 : Migration(85, 86) { + override fun migrate(db: SupportSQLiteDatabase) { + db.removeChain("sei") + } +} diff --git a/android/features/transfer_amount/presents/src/main/kotlin/com/gemwallet/android/features/transfer_amount/presents/ValidatorsScene.kt b/android/features/transfer_amount/presents/src/main/kotlin/com/gemwallet/android/features/transfer_amount/presents/ValidatorsScene.kt index 9c70eca03c..3721718dae 100644 --- a/android/features/transfer_amount/presents/src/main/kotlin/com/gemwallet/android/features/transfer_amount/presents/ValidatorsScene.kt +++ b/android/features/transfer_amount/presents/src/main/kotlin/com/gemwallet/android/features/transfer_amount/presents/ValidatorsScene.kt @@ -69,7 +69,7 @@ fun PreviewValidatorsScene() { recommended = emptyList(), validators = listOf( DelegationValidator( - chain = Chain.Sei, + chain = Chain.Cosmos, id = "some_validator_id", name = "Castlenode", isActive = true, @@ -78,7 +78,7 @@ fun PreviewValidatorsScene() { providerType = StakeProviderType.Stake, ), DelegationValidator( - chain = Chain.Sei, + chain = Chain.Cosmos, id = "some_validator_id_1", name = "Ubik Capital 0%Fee", isActive = true, @@ -87,7 +87,7 @@ fun PreviewValidatorsScene() { providerType = StakeProviderType.Stake, ), DelegationValidator( - chain = Chain.Sei, + chain = Chain.Cosmos, id = "some_validator_id_2", name = "Virtual Hive", isActive = true, diff --git a/android/gemcore/src/main/kotlin/com/gemwallet/android/domains/asset/IconUrlGeneration.kt b/android/gemcore/src/main/kotlin/com/gemwallet/android/domains/asset/IconUrlGeneration.kt index 6c932cbd27..f67322ee0c 100644 --- a/android/gemcore/src/main/kotlin/com/gemwallet/android/domains/asset/IconUrlGeneration.kt +++ b/android/gemcore/src/main/kotlin/com/gemwallet/android/domains/asset/IconUrlGeneration.kt @@ -19,13 +19,7 @@ import uniffi.gemstone.SwapperProvider //fun Int.getDrawableUri() = "android.resource://com.gemwallet.android/drawable/$this" -fun Chain.getIconUrl(): String { - val icon = when (this) { - Chain.SeiEvm -> Chain.Sei.string - else -> string - } - return "file:///android_asset/chains/icons/${icon}.svg" -} +fun Chain.getIconUrl(): String = "file:///android_asset/chains/icons/${string}.svg" fun AssetId.getIconUrl(): String = when { tokenId.isNullOrEmpty() -> when (chain) { diff --git a/android/gemcore/src/main/kotlin/com/gemwallet/android/ext/Chain.kt b/android/gemcore/src/main/kotlin/com/gemwallet/android/ext/Chain.kt index b4fe3590eb..af76b1c8b0 100644 --- a/android/gemcore/src/main/kotlin/com/gemwallet/android/ext/Chain.kt +++ b/android/gemcore/src/main/kotlin/com/gemwallet/android/ext/Chain.kt @@ -76,7 +76,6 @@ fun Chain.assetType(): AssetType? { Chain.Osmosis, Chain.Celestia, Chain.Injective, - Chain.Sei, Chain.Noble, Chain.Celo, Chain.Bitcoin, @@ -169,7 +168,6 @@ fun Chain.toChainType(): ChainType { Chain.Osmosis, Chain.Celestia, Chain.Injective, - Chain.Sei, Chain.Noble, Chain.Cosmos -> ChainType.Cosmos Chain.AvalancheC, diff --git a/android/gemcore/src/main/kotlin/com/gemwallet/android/ext/StakeChain.kt b/android/gemcore/src/main/kotlin/com/gemwallet/android/ext/StakeChain.kt index 3b920cce16..64393a976c 100644 --- a/android/gemcore/src/main/kotlin/com/gemwallet/android/ext/StakeChain.kt +++ b/android/gemcore/src/main/kotlin/com/gemwallet/android/ext/StakeChain.kt @@ -29,7 +29,6 @@ fun StakeChain.freezed(): Boolean = when (this) { StakeChain.Tron -> true StakeChain.Cosmos, StakeChain.Injective, - StakeChain.Sei, StakeChain.Celestia, StakeChain.Osmosis, StakeChain.Solana, @@ -45,7 +44,6 @@ fun StakeChain.toGemStakeChain(): GemStakeChain = when (this) { StakeChain.Cosmos -> GemStakeChain.COSMOS StakeChain.Osmosis -> GemStakeChain.OSMOSIS StakeChain.Injective -> GemStakeChain.INJECTIVE - StakeChain.Sei -> GemStakeChain.SEI StakeChain.Celestia -> GemStakeChain.CELESTIA StakeChain.Ethereum -> GemStakeChain.ETHEREUM StakeChain.Solana -> GemStakeChain.SOLANA diff --git a/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/Chain.kt b/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/Chain.kt index 2b7d4efa02..453201e304 100644 --- a/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/Chain.kt +++ b/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/Chain.kt @@ -63,8 +63,6 @@ enum class Chain(val string: String) { Celestia("celestia"), @SerialName("injective") Injective("injective"), - @SerialName("sei") - Sei("sei"), @SerialName("seievm") SeiEvm("seievm"), @SerialName("manta") diff --git a/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/ChainCosmos.kt b/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/ChainCosmos.kt index 370a8555e8..dce4933468 100644 --- a/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/ChainCosmos.kt +++ b/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/ChainCosmos.kt @@ -21,8 +21,6 @@ enum class CosmosChain(val string: String) { Mayachain("mayachain"), @SerialName("injective") Injective("injective"), - @SerialName("sei") - Sei("sei"), @SerialName("noble") Noble("noble"), } diff --git a/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/ChainStake.kt b/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/ChainStake.kt index d18ff56b03..6408f6ae36 100644 --- a/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/ChainStake.kt +++ b/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/ChainStake.kt @@ -15,8 +15,6 @@ enum class StakeChain(val string: String) { Osmosis("osmosis"), @SerialName("injective") Injective("injective"), - @SerialName("sei") - Sei("sei"), @SerialName("celestia") Celestia("celestia"), @SerialName("ethereum") diff --git a/android/gemcore/src/test/kotlin/com/gemwallet/android/ext/ChainExtTest.kt b/android/gemcore/src/test/kotlin/com/gemwallet/android/ext/ChainExtTest.kt index d78ecf15fb..92801afd71 100644 --- a/android/gemcore/src/test/kotlin/com/gemwallet/android/ext/ChainExtTest.kt +++ b/android/gemcore/src/test/kotlin/com/gemwallet/android/ext/ChainExtTest.kt @@ -16,7 +16,6 @@ class ChainExtTest { assertEquals(AssetType.ERC20, Chain.SeiEvm.assetType()) assertEquals(EVMChain.SeiEvm, Chain.SeiEvm.toEVM()) assertEquals(ChainType.Ethereum, Chain.SeiEvm.toChainType()) - assertEquals("file:///android_asset/chains/icons/sei.svg", Chain.SeiEvm.getIconUrl()) } @Test diff --git a/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/ValidatorItem.kt b/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/ValidatorItem.kt index abcc0511e0..4c4375a904 100644 --- a/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/ValidatorItem.kt +++ b/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/ValidatorItem.kt @@ -91,7 +91,7 @@ fun PreviewValidatorItem() { WalletTheme { ValidatorItem( data = DelegationValidator( - chain = Chain.Sei, + chain = Chain.Cosmos, id = "some_validator_id", name = "Castlenode", isActive = true, @@ -112,7 +112,7 @@ fun PreviewValidatorItemSelected() { WalletTheme { ValidatorItem( data = DelegationValidator( - chain = Chain.Sei, + chain = Chain.Cosmos, id = "some_validator_id", name = "Castlenode", isActive = true, diff --git a/core/crates/primitives/src/chain.rs b/core/crates/primitives/src/chain.rs index d114107c5b..03298ddedd 100644 --- a/core/crates/primitives/src/chain.rs +++ b/core/crates/primitives/src/chain.rs @@ -39,6 +39,8 @@ pub enum Chain { Gnosis, Celestia, Injective, + // TODO: Remove Sei after November 15, 2026. + #[typeshare(skip)] Sei, SeiEvm, Manta, @@ -171,7 +173,7 @@ impl Chain { } pub fn all() -> Vec { - Self::iter().collect::>() + Self::iter().filter(|chain| *chain != Self::Sei).collect() } pub fn stakeable() -> Vec { @@ -192,6 +194,13 @@ mod tests { assert!(!Chain::Mayachain.is_swap_supported()); } + #[test] + fn test_all_excludes_legacy_sei() { + let chains = Chain::all(); + assert!(!chains.contains(&Chain::Sei)); + assert!(chains.contains(&Chain::SeiEvm)); + } + #[test] fn test_robinhood_swap_supported() { assert!(Chain::Robinhood.is_swap_supported()); diff --git a/core/crates/primitives/src/chain_cosmos.rs b/core/crates/primitives/src/chain_cosmos.rs index ee17bd3d4c..948f68cb57 100644 --- a/core/crates/primitives/src/chain_cosmos.rs +++ b/core/crates/primitives/src/chain_cosmos.rs @@ -17,6 +17,7 @@ pub enum CosmosChain { Thorchain, Mayachain, Injective, + #[typeshare(skip)] Sei, Noble, } diff --git a/core/crates/primitives/src/chain_stake.rs b/core/crates/primitives/src/chain_stake.rs index 99f3894950..42b257453d 100644 --- a/core/crates/primitives/src/chain_stake.rs +++ b/core/crates/primitives/src/chain_stake.rs @@ -15,6 +15,7 @@ pub enum StakeChain { Cosmos, Osmosis, Injective, + #[typeshare(skip)] Sei, Celestia, Ethereum, diff --git a/ios/Packages/FeatureServices/BalanceService/Tests/BalanceServiceTests.swift b/ios/Packages/FeatureServices/BalanceService/Tests/BalanceServiceTests.swift index dffcf34600..86001baf13 100644 --- a/ios/Packages/FeatureServices/BalanceService/Tests/BalanceServiceTests.swift +++ b/ios/Packages/FeatureServices/BalanceService/Tests/BalanceServiceTests.swift @@ -13,32 +13,28 @@ import StoreTestKit import Testing struct BalanceServiceTests { - // `seievm` (Chain.seiEvm) has `sei` (Chain.sei) as a rawValue prefix, so a - // string-prefix asset match pulls a Sei-EVM token into the Sei account's - // token fetch. Matching by typed chain must skip it. Real colliding pairs in - // the current chain set: bitcoin/bitcoincash and sei/seievm. @Test func updateBalanceSkipsPrefixCollidingChainToken() async throws { - let sei = Chain.sei.assetId - let seiEvmToken = AssetId(chain: .seiEvm, tokenId: "0xtoken") + let bitcoin = Chain.bitcoin.assetId + let bitcoinCashToken = AssetId(chain: .bitcoinCash, tokenId: "token") - let db = DB.mockWithChains([.sei, .seiEvm]) - try AssetStore(db: db).add(assets: [.mock(asset: .mock(id: seiEvmToken))]) - let wallet = Wallet.mock(accounts: [.mock(chain: .sei, address: "sei-address")]) + let db = DB.mockWithChains([.bitcoin, .bitcoinCash]) + try AssetStore(db: db).add(assets: [.mock(asset: .mock(id: bitcoinCashToken))]) + let wallet = Wallet.mock(accounts: [.mock(chain: .bitcoin, address: "bitcoin-address")]) try WalletStore(db: db).addWallet(wallet) let balanceStore = BalanceStore.mock(db: db) let chainService = ChainServiceMock() - chainService.coinBalances["sei-address"] = AssetBalance(assetId: sei, balance: .mock(available: 100)) - chainService.tokenBalances["sei-address"] = [AssetBalance(assetId: seiEvmToken, balance: .mock(available: 50))] + chainService.coinBalances["bitcoin-address"] = AssetBalance(assetId: bitcoin, balance: .mock(available: 100)) + chainService.tokenBalances["bitcoin-address"] = [AssetBalance(assetId: bitcoinCashToken, balance: .mock(available: 50))] let service = BalanceService.mock( balanceStore: balanceStore, assetsService: .mock(assetStore: .mock(db: db), balanceStore: balanceStore), chainServiceFactory: ChainServiceFactoryMock(chainService: chainService), ) - await service.updateBalance(for: wallet, assetIds: [sei, seiEvmToken]) + await service.updateBalance(for: wallet, assetIds: [bitcoin, bitcoinCashToken]) - #expect(try balanceStore.getBalance(walletId: wallet.id, assetId: sei)?.available == 100) - #expect(try balanceStore.getBalance(walletId: wallet.id, assetId: seiEvmToken) == nil) + #expect(try balanceStore.getBalance(walletId: wallet.id, assetId: bitcoin)?.available == 100) + #expect(try balanceStore.getBalance(walletId: wallet.id, assetId: bitcoinCashToken) == nil) } } diff --git a/ios/Packages/GemstonePrimitives/Sources/Extensions/GemStakeChain+GemstonePrimitives.swift b/ios/Packages/GemstonePrimitives/Sources/Extensions/GemStakeChain+GemstonePrimitives.swift index 0216e1bd61..fb43608a7d 100644 --- a/ios/Packages/GemstonePrimitives/Sources/Extensions/GemStakeChain+GemstonePrimitives.swift +++ b/ios/Packages/GemstonePrimitives/Sources/Extensions/GemStakeChain+GemstonePrimitives.swift @@ -11,7 +11,6 @@ public extension StakeChain { case .cosmos: .cosmos case .osmosis: .osmosis case .injective: .injective - case .sei: .sei case .celestia: .celestia case .ethereum: .ethereum case .solana: .solana diff --git a/ios/Packages/Keystore/Tests/LocalKeystoreTests.swift b/ios/Packages/Keystore/Tests/LocalKeystoreTests.swift index 460c3a2abf..eff715d774 100644 --- a/ios/Packages/Keystore/Tests/LocalKeystoreTests.swift +++ b/ios/Packages/Keystore/Tests/LocalKeystoreTests.swift @@ -193,8 +193,6 @@ struct LocalKeystoreTests { "celestia142j9u5eaduzd7faumygud6ruhdwme98qpwmfv7" case .injective: "inj13u6g7vqgw074mgmf2ze2cadzvkz9snlwcrtq8a" - case .sei: - "sei142j9u5eaduzd7faumygud6ruhdwme98qagm0sj" case .noble: "noble142j9u5eaduzd7faumygud6ruhdwme98qc8l3wa" case .near: diff --git a/ios/Packages/Primitives/Sources/Extensions/CosmosChain+Primitives.swift b/ios/Packages/Primitives/Sources/Extensions/CosmosChain+Primitives.swift index 377f86d9d1..ead4797897 100644 --- a/ios/Packages/Primitives/Sources/Extensions/CosmosChain+Primitives.swift +++ b/ios/Packages/Primitives/Sources/Extensions/CosmosChain+Primitives.swift @@ -18,7 +18,6 @@ public extension CosmosChain { case .osmosis: CosmosDenom.uosmo case .celestia: CosmosDenom.utia case .injective: CosmosDenom.inj - case .sei: CosmosDenom.usei case .noble: CosmosDenom.uusdc } } diff --git a/ios/Packages/Primitives/Sources/Generated/Chain.swift b/ios/Packages/Primitives/Sources/Generated/Chain.swift index 9f64138ffa..712006299a 100644 --- a/ios/Packages/Primitives/Sources/Generated/Chain.swift +++ b/ios/Packages/Primitives/Sources/Generated/Chain.swift @@ -32,7 +32,6 @@ public enum Chain: String, Codable, CaseIterable, Equatable, Hashable, Sendable case gnosis case celestia case injective - case sei case seiEvm = "seievm" case manta case blast diff --git a/ios/Packages/Primitives/Sources/Generated/ChainCosmos.swift b/ios/Packages/Primitives/Sources/Generated/ChainCosmos.swift index 7c7c833182..663ee5bbc0 100644 --- a/ios/Packages/Primitives/Sources/Generated/ChainCosmos.swift +++ b/ios/Packages/Primitives/Sources/Generated/ChainCosmos.swift @@ -11,7 +11,6 @@ public enum CosmosChain: String, Codable, CaseIterable, Equatable, Sendable { case thorchain case mayachain case injective - case sei case noble } diff --git a/ios/Packages/Primitives/Sources/Generated/ChainStake.swift b/ios/Packages/Primitives/Sources/Generated/ChainStake.swift index b4442d3c24..44d998a790 100644 --- a/ios/Packages/Primitives/Sources/Generated/ChainStake.swift +++ b/ios/Packages/Primitives/Sources/Generated/ChainStake.swift @@ -8,7 +8,6 @@ public enum StakeChain: String, Codable, CaseIterable, Equatable, Sendable { case cosmos case osmosis case injective - case sei case celestia case ethereum case solana diff --git a/ios/Packages/PrimitivesComponents/Sources/Types/ChainImage.swift b/ios/Packages/PrimitivesComponents/Sources/Types/ChainImage.swift index 5319d8c661..33067b3e7a 100644 --- a/ios/Packages/PrimitivesComponents/Sources/Types/ChainImage.swift +++ b/ios/Packages/PrimitivesComponents/Sources/Types/ChainImage.swift @@ -48,7 +48,7 @@ public struct ChainImage: Sendable { case .gnosis: Images.Chains.gnosis case .celestia: Images.Chains.celestia case .injective: Images.Chains.injective - case .sei, .seiEvm: Images.Chains.sei + case .seiEvm: Images.Chains.seievm case .manta: Images.Chains.manta case .noble: Images.Chains.noble case .mantle: Images.Chains.mantle diff --git a/ios/Packages/PrimitivesComponents/Sources/ViewModels/BalanceViewModel.swift b/ios/Packages/PrimitivesComponents/Sources/ViewModels/BalanceViewModel.swift index 9f37659301..ff3a1b3ea5 100644 --- a/ios/Packages/PrimitivesComponents/Sources/ViewModels/BalanceViewModel.swift +++ b/ios/Packages/PrimitivesComponents/Sources/ViewModels/BalanceViewModel.swift @@ -66,7 +66,7 @@ public struct BalanceViewModel: Sendable { let amount = switch type { case .stake: switch StakeChain(rawValue: asset.chain.rawValue) { - case .celestia, .cosmos, .hyperCore, .injective, .osmosis, .sei, .smartChain, .solana, .sui, .ethereum, .aptos, .monad, .none: + case .celestia, .cosmos, .hyperCore, .injective, .osmosis, .smartChain, .solana, .sui, .ethereum, .aptos, .monad, .none: balance.staked + balance.pending case .tron: balance.frozen + balance.locked + balance.pending @@ -79,7 +79,7 @@ public struct BalanceViewModel: Sendable { public var hasStakingResources: Bool { switch StakeChain(rawValue: asset.chain.rawValue) { - case .celestia, .cosmos, .hyperCore, .injective, .osmosis, .sei, .smartChain, .solana, .sui, .ethereum, .aptos, .monad, .none: + case .celestia, .cosmos, .hyperCore, .injective, .osmosis, .smartChain, .solana, .sui, .ethereum, .aptos, .monad, .none: false case .tron: true @@ -88,7 +88,7 @@ public struct BalanceViewModel: Sendable { public var hasFrozenResources: Bool { switch StakeChain(rawValue: asset.chain.rawValue) { - case .celestia, .cosmos, .hyperCore, .injective, .osmosis, .sei, .smartChain, .solana, .sui, .ethereum, .aptos, .monad, .none: + case .celestia, .cosmos, .hyperCore, .injective, .osmosis, .smartChain, .solana, .sui, .ethereum, .aptos, .monad, .none: false case .tron: !(balance.frozen + balance.locked).isZero diff --git a/ios/Packages/Store/Sources/Migrations.swift b/ios/Packages/Store/Sources/Migrations.swift index 8d3b17e1d7..c6c690f791 100644 --- a/ios/Packages/Store/Sources/Migrations.swift +++ b/ios/Packages/Store/Sources/Migrations.swift @@ -23,6 +23,26 @@ struct Migrations { try? db.execute(sql: "DELETE FROM \(AssetRecord.databaseTableName) WHERE chain = ?", arguments: [chain]) } + static func removeChain(_ db: Database, chain: String) throws { + try db.execute( + sql: "DELETE FROM \(WalletConnectionRecord.databaseTableName) WHERE instr(chains, '\"' || ? || '\"') > 0", + arguments: [chain], + ) + try db.execute( + sql: "DELETE FROM \(NotificationRecord.databaseTableName) WHERE instr(item, '\"' || ? || '\"') > 0 OR instr(item, '\"' || ? || '_') > 0", + arguments: [chain, chain], + ) + try db.execute( + sql: "UPDATE \(AssetRecord.databaseTableName) SET associations = '[]' WHERE instr(associations, '\"' || ? || '\"') > 0 OR instr(associations, '\"' || ? || '_') > 0", + arguments: [chain, chain], + ) + try db.execute( + sql: "DELETE FROM \(ContactAddressRecord.databaseTableName) WHERE chain = ?", + arguments: [chain], + ) + try db.execute(sql: "DELETE FROM \(AssetRecord.databaseTableName) WHERE chain = ?", arguments: [chain]) + } + private static func clearTables(_ db: Database, tableNames: [String]) throws { for tableName in tableNames where try db.tableExists(tableName) { try db.execute(sql: "DELETE FROM \(tableName)") @@ -513,6 +533,10 @@ struct Migrations { } } + migrator.registerMigration("Remove Sei chain", foreignKeyChecks: .immediate) { db in + try Self.removeChain(db, chain: "sei") + } + try migrator.migrate(dbQueue) } } diff --git a/ios/Packages/Store/Tests/StoreTests/MigrationsTests.swift b/ios/Packages/Store/Tests/StoreTests/MigrationsTests.swift index 0b9e76e50b..2906e64db8 100644 --- a/ios/Packages/Store/Tests/StoreTests/MigrationsTests.swift +++ b/ios/Packages/Store/Tests/StoreTests/MigrationsTests.swift @@ -61,4 +61,65 @@ struct MigrationsTests { #expect(try! db.tableExists(AddressRecord.databaseTableName)) } } + + @Test + func removeChainRemovesSeiReferencesAndPreservesSeiEvm() throws { + let store = DB.mock() + + try store.dbQueue.write { db in + try seedChain(db, chain: "sei", associations: "[]") + try seedChain(db, chain: "seievm", associations: "[{\"assetId\":\"sei\"}]") + try db.execute( + sql: "INSERT INTO contacts (id, name, createdAt, updatedAt) VALUES ('contact', 'Contact', 0, 0)", + ) + try db.execute( + sql: "INSERT INTO contacts_addresses (id, contactId, address, chain) VALUES ('sei-contact', 'contact', 'sei-address', 'sei'), ('seievm-contact', 'contact', 'seievm-address', 'seievm')", + ) + } + + var migrator = DatabaseMigrator() + migrator.registerMigration("Remove chain", foreignKeyChecks: .immediate) { db in + try Migrations.removeChain(db, chain: "sei") + } + try migrator.migrate(store.dbQueue) + + try store.dbQueue.read { (db: Database) throws in + #expect(try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM assets WHERE chain = 'sei'") == 0) + #expect(try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM assets WHERE chain = 'seievm'") == 1) + #expect(try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM wallets_accounts WHERE chain = 'sei'") == 0) + #expect(try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM wallets_accounts WHERE chain = 'seievm'") == 1) + #expect(try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM wallets") == 2) + #expect(try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM wallets_connections") == 1) + #expect(try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM notifications") == 1) + #expect(try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM contacts_addresses") == 1) + #expect(try String.fetchOne(db, sql: "SELECT associations FROM assets WHERE id = 'seievm'") == "[]") + #expect(try Row.fetchAll(db, sql: "PRAGMA foreign_key_check").isEmpty) + } + } + + private func seedChain(_ db: Database, chain: String, associations: String) throws { + let walletId = "wallet-\(chain)" + try db.execute( + sql: "INSERT INTO wallets (id, name, type, `index`, `order`, isPinned) VALUES (?, ?, 'single', 0, 0, 0)", + arguments: [walletId, chain], + ) + try db.execute( + sql: "INSERT INTO assets (id, chain, name, symbol, decimals, type, isEnabled, isBuyable, isSellable, isSwappable, isStakeable, isEarnable, rank, hasImage, associations) " + + "VALUES (?, ?, ?, ?, 6, 'native', 1, 0, 0, 0, 0, 0, 1, 0, ?)", + arguments: [chain, chain, chain, chain, associations], + ) + try db.execute( + sql: "INSERT INTO wallets_accounts (walletId, chain, address, `index`, derivationPath) VALUES (?, ?, ?, 0, '')", + arguments: [walletId, chain, "\(chain)-address"], + ) + try db.execute( + sql: "INSERT INTO wallets_connections (id, sessionId, walletId, state, chains, createdAt, expireAt, appName, appDescription, appLink, appIcon) " + + "VALUES (?, ?, ?, 'active', ?, 0, 1, 'App', 'App', 'https://app.example', 'https://app.example/icon.png')", + arguments: ["connection-\(chain)", "session-\(chain)", walletId, "[\"\(chain)\"]"], + ) + try db.execute( + sql: "INSERT INTO notifications (id, walletId, createdAt, item) VALUES (?, ?, 0, ?)", + arguments: ["notification-\(chain)", walletId, "{\"icon\":{\"type\":\"asset\",\"value\":\"\(chain)\"}}"], + ) + } } diff --git a/ios/Packages/Style/Sources/Images.swift b/ios/Packages/Style/Sources/Images.swift index a1c004294e..af640790e9 100644 --- a/ios/Packages/Style/Sources/Images.swift +++ b/ios/Packages/Style/Sources/Images.swift @@ -41,7 +41,7 @@ public enum Images { public static let optimism = Image(.optimism) public static let osmosis = Image(.osmosis) public static let polygon = Image(.polygon) - public static let sei = Image(.sei) + public static let seievm = Image(.seievm) public static let smartchain = Image(.smartchain) public static let solana = Image(.solana) public static let sui = Image(.sui) @@ -260,7 +260,7 @@ public enum Images { (Images.Chains.optimism, "Optimism"), (Images.Chains.osmosis, "Osmosis"), (Images.Chains.polygon, "Polygon"), - (Images.Chains.sei, "Sei"), + (Images.Chains.seievm, "Sei EVM"), (Images.Chains.smartchain, "Smart Chain"), (Images.Chains.solana, "Solana"), (Images.Chains.sui, "Sui"), diff --git a/ios/Packages/Style/Sources/Resources/Assets.xcassets/chains/sei.imageset/Contents.json b/ios/Packages/Style/Sources/Resources/Assets.xcassets/chains/seievm.imageset/Contents.json similarity index 85% rename from ios/Packages/Style/Sources/Resources/Assets.xcassets/chains/sei.imageset/Contents.json rename to ios/Packages/Style/Sources/Resources/Assets.xcassets/chains/seievm.imageset/Contents.json index 67883e8a19..78271a15b1 100644 --- a/ios/Packages/Style/Sources/Resources/Assets.xcassets/chains/sei.imageset/Contents.json +++ b/ios/Packages/Style/Sources/Resources/Assets.xcassets/chains/seievm.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "sei.svg", + "filename" : "seievm.svg", "idiom" : "universal" } ], diff --git a/ios/Packages/Style/Sources/Resources/Assets.xcassets/chains/sei.imageset/sei.svg b/ios/Packages/Style/Sources/Resources/Assets.xcassets/chains/seievm.imageset/seievm.svg similarity index 100% rename from ios/Packages/Style/Sources/Resources/Assets.xcassets/chains/sei.imageset/sei.svg rename to ios/Packages/Style/Sources/Resources/Assets.xcassets/chains/seievm.imageset/seievm.svg