Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
ba35bb3
Trading perpetual
SeniorZhai Feb 9, 2026
43be0e5
Update candle
SeniorZhai Feb 10, 2026
c79cdd3
Update open position
SeniorZhai Feb 10, 2026
591d219
Perpetual database
SeniorZhai Feb 11, 2026
f80faaa
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Feb 11, 2026
9984fbe
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Feb 12, 2026
50a3a7a
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Feb 13, 2026
d79f6f6
Open position
SeniorZhai Feb 13, 2026
ab20a8d
Close position
SeniorZhai Feb 13, 2026
8cf3617
Merge branch 'master' into feature/trading_perpetual
SeniorZhai Feb 13, 2026
1eb3f8f
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Feb 24, 2026
0087f0d
Update
SeniorZhai Feb 24, 2026
59e2ec5
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Feb 25, 2026
e7ea59b
Update perps comfirm
SeniorZhai Feb 25, 2026
ef66c18
Update open position page
SeniorZhai Feb 26, 2026
943b7ad
Update close position
SeniorZhai Feb 26, 2026
22fe884
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Feb 26, 2026
2e28b0c
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Feb 28, 2026
a35b594
Update perpetual page
SeniorZhai Feb 28, 2026
4c6ad83
Update market bottom
SeniorZhai Feb 28, 2026
65ca95c
All positions page and detail
SeniorZhai Mar 1, 2026
de8b90d
Closed position, open position
SeniorZhai Mar 2, 2026
80349f0
Update positions page
SeniorZhai Mar 2, 2026
1910fa2
Update database schema
SeniorZhai Mar 2, 2026
ffee14b
Update positions page
SeniorZhai Mar 2, 2026
f8dea9c
Update total
SeniorZhai Mar 3, 2026
a9937e4
Update position item
SeniorZhai Mar 3, 2026
fff415d
Update position item
SeniorZhai Mar 3, 2026
64fe24c
View all
SeniorZhai Mar 3, 2026
feae921
All markets
SeniorZhai Mar 3, 2026
8155575
Update
SeniorZhai Mar 3, 2026
59360df
Position share
SeniorZhai Mar 3, 2026
830affd
Update detail
SeniorZhai Mar 3, 2026
82c7ffc
Update empty
SeniorZhai Mar 4, 2026
ea89aed
Update quote color
SeniorZhai Mar 4, 2026
829a616
Update price format
SeniorZhai Mar 4, 2026
6330bcc
Move package and update
SeniorZhai Mar 4, 2026
6ced697
Update position detail
SeniorZhai Mar 4, 2026
17b7270
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Mar 4, 2026
5003b12
Refresh timer
SeniorZhai Mar 4, 2026
f24e9fe
Support perps url
SeniorZhai Mar 4, 2026
6daa36c
Update tip icon
SeniorZhai Mar 4, 2026
dc735d2
Update deposit
SeniorZhai Mar 4, 2026
7f3c770
Update
SeniorZhai Mar 4, 2026
b984f31
Update refresh
SeniorZhai Mar 4, 2026
9ab8e6f
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Mar 5, 2026
50673f4
Update guide
SeniorZhai Mar 5, 2026
5fa0d6a
Update direction color
SeniorZhai Mar 5, 2026
4d069c1
Update position detail
SeniorZhai Mar 5, 2026
2db4ace
Update red dot logic
SeniorZhai Mar 5, 2026
c30c29b
feat(perps): cache accepted assets and restrict TYPE_FROM_PERP token …
SeniorZhai Mar 5, 2026
f64f010
Update
SeniorZhai Mar 5, 2026
38b5b54
Support opening position
SeniorZhai Mar 5, 2026
3eaa5fd
feat(perps): add periodic position refresh and switch market detail t…
SeniorZhai Mar 5, 2026
896f02a
feat(perps): polish trading flow, data refresh, and share UX
SeniorZhai Mar 5, 2026
6824fc3
feat(perps): polish position labels and open-position input UI
SeniorZhai Mar 5, 2026
7706836
Max leverage
SeniorZhai Mar 6, 2026
5e688c4
Guide tab
SeniorZhai Mar 6, 2026
884a6d8
fix(trade): separate perps order badge from tab badge and remove test…
SeniorZhai Mar 6, 2026
462d3f1
feat(trade): refine perps order badge, guide controls, and position d…
SeniorZhai Mar 6, 2026
0ef0a0e
feat(perps): improve deposit flow for USD token and unify empty-state…
SeniorZhai Mar 6, 2026
976c775
fix(perps): include zero-balance USD tokens in TYPE_FROM_PERP list
SeniorZhai Mar 6, 2026
40949f2
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Mar 8, 2026
ef0d138
some fine-tuning
SeniorZhai Mar 8, 2026
e8075b2
Update candle chart
SeniorZhai Mar 8, 2026
ad438ce
Update closed pnl
SeniorZhai Mar 9, 2026
0119276
Update font
SeniorZhai Mar 9, 2026
2cd8381
Update refresh logic
SeniorZhai Mar 9, 2026
5b75cc7
Update guide page
SeniorZhai Mar 9, 2026
e4ed47d
Update candle chart
SeniorZhai Mar 9, 2026
f05e20e
Update closed item
SeniorZhai Mar 9, 2026
87acfe6
Update guide and position refresh interval
SeniorZhai Mar 9, 2026
f3f56b4
Delete .codex/environments/environment.toml
SeniorZhai Mar 9, 2026
78b49eb
Fix guide and trade again
SeniorZhai Mar 10, 2026
fc3c8c4
Update strings
SeniorZhai Mar 10, 2026
dfda175
Update database schema
SeniorZhai Mar 10, 2026
4f15c7d
Update
SeniorZhai Mar 11, 2026
4cd5286
Update strings
SeniorZhai Mar 11, 2026
b4c1bef
Update page
SeniorZhai Mar 11, 2026
4eb6625
Update strings
SeniorZhai Mar 12, 2026
1efb504
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Mar 12, 2026
f4cf59f
fix: update perpetual order value copy to position size
SeniorZhai Mar 12, 2026
6e1778e
fix: refresh perps position history from latest local offset, updates
SeniorZhai Mar 12, 2026
bf4f914
Update scheme
SeniorZhai Mar 12, 2026
305ec36
Update database schema
SeniorZhai Mar 12, 2026
fc65603
refactor: align perps bottom sheet naming and polish perps UI
SeniorZhai Mar 13, 2026
16a1dcb
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Mar 13, 2026
0302d1f
Revert market page
SeniorZhai Mar 13, 2026
a4184e4
Update refresh logic
SeniorZhai Mar 13, 2026
dbb3c92
Fix router error handle
SeniorZhai Mar 13, 2026
1815518
Open perps market
SeniorZhai Mar 13, 2026
0b56274
refactor: switch perps margin limits to min_amount and max_amount
SeniorZhai Mar 13, 2026
2b36e1b
Merge remote-tracking branch 'origin/master' into feature/trading_per…
SeniorZhai Mar 13, 2026
6a0b645
fix: leverage option on open position page
SeniorZhai Mar 13, 2026
3900c65
Update titles
SeniorZhai Mar 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
355 changes: 355 additions & 0 deletions app/schemas/one.mixin.android.db.PerpsDatabase/1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,355 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "523f621632813387fa5c95335f1ef136",
"entities": [
{
"tableName": "positions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`position_id` TEXT NOT NULL, `market_id` TEXT NOT NULL, `side` TEXT NOT NULL, `quantity` TEXT NOT NULL, `entry_price` TEXT NOT NULL, `margin` TEXT NOT NULL, `leverage` INTEGER NOT NULL, `state` TEXT NOT NULL, `mark_price` TEXT NOT NULL, `unrealized_pnl` TEXT NOT NULL, `roe` TEXT NOT NULL, `settle_asset_id` TEXT NOT NULL, `open_pay_amount` TEXT NOT NULL, `open_pay_asset_id` TEXT NOT NULL, `bot_id` TEXT NOT NULL, `wallet_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `updated_at` TEXT NOT NULL, PRIMARY KEY(`position_id`))",
"fields": [
{
"fieldPath": "positionId",
"columnName": "position_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "marketId",
"columnName": "market_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "side",
"columnName": "side",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "quantity",
"columnName": "quantity",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "entryPrice",
"columnName": "entry_price",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "margin",
"columnName": "margin",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "leverage",
"columnName": "leverage",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "markPrice",
"columnName": "mark_price",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "unrealizedPnl",
"columnName": "unrealized_pnl",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roe",
"columnName": "roe",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "settleAssetId",
"columnName": "settle_asset_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "openPayAmount",
"columnName": "open_pay_amount",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "openPayAssetId",
"columnName": "open_pay_asset_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "botId",
"columnName": "bot_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "walletId",
"columnName": "wallet_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "created_at",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updated_at",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"position_id"
]
}
},
{
"tableName": "position_histories",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`history_id` TEXT NOT NULL, `position_id` TEXT NOT NULL, `market_id` TEXT NOT NULL, `side` TEXT NOT NULL, `quantity` TEXT NOT NULL, `entry_price` TEXT NOT NULL, `close_price` TEXT NOT NULL, `realized_pnl` TEXT NOT NULL, `leverage` INTEGER NOT NULL, `margin_method` TEXT NOT NULL, `open_at` TEXT NOT NULL, `closed_at` TEXT NOT NULL, PRIMARY KEY(`history_id`))",
"fields": [
{
"fieldPath": "historyId",
"columnName": "history_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "positionId",
"columnName": "position_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "marketId",
"columnName": "market_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "side",
"columnName": "side",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "quantity",
"columnName": "quantity",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "entryPrice",
"columnName": "entry_price",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "closePrice",
"columnName": "close_price",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "realizedPnl",
"columnName": "realized_pnl",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "leverage",
"columnName": "leverage",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "marginMethod",
"columnName": "margin_method",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "openAt",
"columnName": "open_at",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "closedAt",
"columnName": "closed_at",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"history_id"
]
}
},
{
"tableName": "markets",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`market_id` TEXT NOT NULL, `display_symbol` TEXT NOT NULL, `token_symbol` TEXT NOT NULL, `quote_symbol` TEXT NOT NULL, `mark_price` TEXT NOT NULL, `leverage` INTEGER NOT NULL, `icon_url` TEXT NOT NULL, `funding_rate` TEXT NOT NULL, `min_amount` TEXT NOT NULL, `max_amount` TEXT NOT NULL, `last` TEXT NOT NULL, `volume` TEXT NOT NULL, `amount` TEXT NOT NULL, `high` TEXT NOT NULL, `low` TEXT NOT NULL, `open` TEXT NOT NULL, `change` TEXT NOT NULL, `bid_price` TEXT NOT NULL, `ask_price` TEXT NOT NULL, `created_at` TEXT NOT NULL, `updated_at` TEXT NOT NULL, PRIMARY KEY(`market_id`))",
"fields": [
{
"fieldPath": "marketId",
"columnName": "market_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "displaySymbol",
"columnName": "display_symbol",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "tokenSymbol",
"columnName": "token_symbol",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "quoteSymbol",
"columnName": "quote_symbol",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "markPrice",
"columnName": "mark_price",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "leverage",
"columnName": "leverage",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "iconUrl",
"columnName": "icon_url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "fundingRate",
"columnName": "funding_rate",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "minAmount",
"columnName": "min_amount",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "maxAmount",
"columnName": "max_amount",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "last",
"columnName": "last",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "volume",
"columnName": "volume",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "amount",
"columnName": "amount",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "high",
"columnName": "high",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "low",
"columnName": "low",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "open",
"columnName": "open",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "change",
"columnName": "change",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "bidPrice",
"columnName": "bid_price",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "askPrice",
"columnName": "ask_price",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "created_at",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "updatedAt",
"columnName": "updated_at",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"market_id"
]
}
}
],
"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, '523f621632813387fa5c95335f1ef136')"
]
}
}
10 changes: 10 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,11 @@
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize|stateAlwaysHidden" />
<activity
android:name=".ui.home.web3.trade.perps.PerpsActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize|stateAlwaysHidden" />
<activity
android:name=".ui.conversation.ConversationActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Expand Down Expand Up @@ -331,6 +336,11 @@
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:theme="@style/AppTheme.Blur"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
<activity
android:name=".ui.home.web3.trade.perps.PerpsPositionShareActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:theme="@style/AppTheme.Blur"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
<activity
android:name=".ui.player.MusicActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/one/mixin/android/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,12 @@ object Constants {
const val PREF_HAS_USED_SWAP = "pref_has_used_swap"
const val PREF_HAS_USED_SWAP_TRANSACTION = "pref_has_used_swap_transaction" // -1: No data, 0: Never used, 1: Used before
const val PREF_HAS_USED_MARKET = "pref_has_used_market"
const val PREF_NAV_MORE_BADGE_DISMISSED = "pref_nav_more_badge_dismissed"

const val PREF_TRADE_LIMIT_ORDER_BADGE_DISMISSED = "pref_trade_limit_order_badge_dismissed"
const val PREF_TRADE_PERPETUAL_BADGE_DISMISSED = "pref_trade_perpetual_badge_dismissed"
const val PREF_TRADE_PERPETUAL_ORDER_BADGE_DISMISSED = "pref_trade_perpetual_order_badge_dismissed"
const val PREF_PERPS_ACCEPTED_ASSET_IDS = "pref_perps_accepted_asset_ids"

const val PREF_USED_WALLET = "pref_used_wallet"

Expand Down
Loading
Loading