Skip to content

Commit 0b56274

Browse files
committed
refactor: switch perps margin limits to min_amount and max_amount
1 parent 1815518 commit 0b56274

File tree

7 files changed

+64
-42
lines changed

7 files changed

+64
-42
lines changed

app/schemas/one.mixin.android.db.PerpsDatabase/1.json

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"formatVersion": 1,
33
"database": {
44
"version": 1,
5-
"identityHash": "05fceb901a48fd5e06c755017d38bf94",
5+
"identityHash": "523f621632813387fa5c95335f1ef136",
66
"entities": [
77
{
88
"tableName": "positions",
@@ -210,7 +210,7 @@
210210
},
211211
{
212212
"tableName": "markets",
213-
"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_order_size` TEXT NOT NULL, `max_order_size` TEXT NOT NULL, `min_order_value` TEXT NOT NULL, `max_order_value` 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`))",
213+
"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`))",
214214
"fields": [
215215
{
216216
"fieldPath": "marketId",
@@ -261,26 +261,14 @@
261261
"notNull": true
262262
},
263263
{
264-
"fieldPath": "minOrderSize",
265-
"columnName": "min_order_size",
264+
"fieldPath": "minAmount",
265+
"columnName": "min_amount",
266266
"affinity": "TEXT",
267267
"notNull": true
268268
},
269269
{
270-
"fieldPath": "maxOrderSize",
271-
"columnName": "max_order_size",
272-
"affinity": "TEXT",
273-
"notNull": true
274-
},
275-
{
276-
"fieldPath": "minOrderValue",
277-
"columnName": "min_order_value",
278-
"affinity": "TEXT",
279-
"notNull": true
280-
},
281-
{
282-
"fieldPath": "maxOrderValue",
283-
"columnName": "max_order_value",
270+
"fieldPath": "maxAmount",
271+
"columnName": "max_amount",
284272
"affinity": "TEXT",
285273
"notNull": true
286274
},
@@ -361,7 +349,7 @@
361349
],
362350
"setupQueries": [
363351
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
364-
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '05fceb901a48fd5e06c755017d38bf94')"
352+
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '523f621632813387fa5c95335f1ef136')"
365353
]
366354
}
367-
}
355+
}

app/src/main/java/one/mixin/android/api/response/perps/PerpsMarket.kt

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,21 +39,13 @@ data class PerpsMarket(
3939
@ColumnInfo(name = "funding_rate")
4040
val fundingRate: String,
4141

42-
@SerializedName("min_order_size")
43-
@ColumnInfo(name = "min_order_size")
44-
val minOrderSize: String,
42+
@SerializedName("min_amount")
43+
@ColumnInfo(name = "min_amount")
44+
val minAmount: String,
4545

46-
@SerializedName("max_order_size")
47-
@ColumnInfo(name = "max_order_size")
48-
val maxOrderSize: String,
49-
50-
@SerializedName("min_order_value")
51-
@ColumnInfo(name = "min_order_value")
52-
val minOrderValue: String,
53-
54-
@SerializedName("max_order_value")
55-
@ColumnInfo(name = "max_order_value")
56-
val maxOrderValue: String,
46+
@SerializedName("max_amount")
47+
@ColumnInfo(name = "max_amount")
48+
val maxAmount: String,
5749

5850
@SerializedName("last")
5951
@ColumnInfo(name = "last")

app/src/main/java/one/mixin/android/ui/home/web3/trade/TotalPositionValueAdapter.kt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import one.mixin.android.extension.priceFormat
1414
import one.mixin.android.vo.Fiats
1515
import java.math.BigDecimal
1616

17-
class TotalPositionValueAdapter : RecyclerView.Adapter<TotalPositionValueAdapter.ViewHolder>() {
17+
class TotalPositionValueAdapter(
18+
private val isQuoteColorReversed: Boolean = false,
19+
) : RecyclerView.Adapter<TotalPositionValueAdapter.ViewHolder>() {
1820
private var totalValue: BigDecimal = BigDecimal.ZERO
1921
private var subValue: BigDecimal = BigDecimal.ZERO
2022
private var subPercent: BigDecimal? = null
@@ -42,7 +44,7 @@ class TotalPositionValueAdapter : RecyclerView.Adapter<TotalPositionValueAdapter
4244
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
4345
val view = LayoutInflater.from(parent.context)
4446
.inflate(R.layout.item_total_position_value, parent, false)
45-
return ViewHolder(view)
47+
return ViewHolder(view, isQuoteColorReversed)
4648
}
4749

4850
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
@@ -51,7 +53,10 @@ class TotalPositionValueAdapter : RecyclerView.Adapter<TotalPositionValueAdapter
5153

5254
override fun getItemCount(): Int = 1
5355

54-
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
56+
class ViewHolder(
57+
itemView: View,
58+
private val isQuoteColorReversed: Boolean,
59+
) : RecyclerView.ViewHolder(itemView) {
5560
private val titleTv: TextView = itemView.findViewById(R.id.title_tv)
5661
private val valueTv: TextView = itemView.findViewById(R.id.value_tv)
5762
private val subtitleTv: TextView = itemView.findViewById(R.id.subtitle_tv)
@@ -67,8 +72,12 @@ class TotalPositionValueAdapter : RecyclerView.Adapter<TotalPositionValueAdapter
6772
val fiatRate = BigDecimal(Fiats.getRate())
6873
val fiatSymbol = Fiats.getSymbol()
6974
titleTv.text = context.getString(titleResId)
70-
val gainColor = context.getColor(R.color.wallet_green)
71-
val lossColor = context.getColor(R.color.wallet_red)
75+
val gainColor = context.getColor(
76+
if (isQuoteColorReversed) R.color.wallet_red else R.color.wallet_green,
77+
)
78+
val lossColor = context.getColor(
79+
if (isQuoteColorReversed) R.color.wallet_green else R.color.wallet_red,
80+
)
7281

7382
if (isClosed) {
7483
valueTv.text = "${

app/src/main/java/one/mixin/android/ui/home/web3/trade/perps/AllPositionsFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class AllPositionsFragment : BaseFragment(R.layout.fragment_all_closed_positions
6363

6464
private val binding by viewBinding(FragmentAllClosedPositionsBinding::bind)
6565
private val viewModel by viewModels<PerpetualViewModel>()
66-
private val totalValueAdapter by lazy { TotalPositionValueAdapter() }
66+
private val totalValueAdapter by lazy { TotalPositionValueAdapter(isQuoteColorReversed) }
6767
private val isQuoteColorReversed by lazy {
6868
requireContext().defaultSharedPreferences.getBoolean(Constants.Account.PREF_QUOTE_COLOR, false)
6969
}

app/src/main/java/one/mixin/android/ui/home/web3/trade/perps/OpenPositionPage.kt

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,26 @@ fun OpenPositionPage(
162162
val fiatSymbol = Fiats.getSymbol()
163163
val inputAmount = usdtAmount.toBigDecimalOrNull()
164164
val tokenBalance = currentToken?.balance?.toBigDecimalOrNull() ?: BigDecimal.ZERO
165+
val minimumMargin = currentMarket.minAmount.toBigDecimalOrNull() ?: BigDecimal.ZERO
166+
val maximumMargin = currentMarket.maxAmount.toBigDecimalOrNull() ?: BigDecimal.ZERO
165167
val hasInputAmount = inputAmount != null && inputAmount > BigDecimal.ZERO
168+
val belowMinimumMargin = hasInputAmount && minimumMargin > BigDecimal.ZERO && inputAmount < minimumMargin
169+
val aboveMaximumMargin = hasInputAmount && maximumMargin > BigDecimal.ZERO && inputAmount > maximumMargin
166170
val insufficientBalance = hasInputAmount && inputAmount > tokenBalance
167171
val showAddAction = insufficientBalance || tokenBalance <= BigDecimal.ZERO
168-
val canReview = hasInputAmount && !insufficientBalance
169-
val displayedErrorInfo = errorInfo?.takeIf { it.isNotBlank() }
172+
val canReview = hasInputAmount && !belowMinimumMargin && !aboveMaximumMargin && !insufficientBalance
173+
val marginLimitError = when {
174+
belowMinimumMargin -> stringResource(
175+
R.string.perps_minimum_margin,
176+
minimumMargin.stripTrailingZeros().toPlainString()
177+
)
178+
aboveMaximumMargin -> stringResource(
179+
R.string.perps_maximum_margin,
180+
maximumMargin.stripTrailingZeros().toPlainString()
181+
)
182+
else -> null
183+
}
184+
val displayedErrorInfo = errorInfo?.takeIf { it.isNotBlank() } ?: marginLimitError
170185
val tokenNetworkName = currentToken?.chainName
171186
?.takeIf { it.isNotBlank() }
172187
?: currentToken?.chainSymbol
@@ -543,6 +558,20 @@ fun OpenPositionPage(
543558
val amount = usdtAmount.toBigDecimalOrNull() ?: return@Button
544559

545560
if (amount <= BigDecimal.ZERO) return@Button
561+
if (minimumMargin > BigDecimal.ZERO && amount < minimumMargin) {
562+
errorInfo = context.getString(
563+
R.string.perps_minimum_margin,
564+
minimumMargin.stripTrailingZeros().toPlainString()
565+
)
566+
return@Button
567+
}
568+
if (maximumMargin > BigDecimal.ZERO && amount > maximumMargin) {
569+
errorInfo = context.getString(
570+
R.string.perps_maximum_margin,
571+
maximumMargin.stripTrailingZeros().toPlainString()
572+
)
573+
return@Button
574+
}
546575
if (amount > (token.balance.toBigDecimalOrNull() ?: BigDecimal.ZERO)) return@Button
547576

548577
val m = currentMarket

app/src/main/res/values-zh-rCN/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,6 +1618,8 @@
16181618
<string name="single_transaction_should_be_greater_than">最低金额 %1$s %2$s</string>
16191619
<string name="single_transaction_should_be_less_than">最高金额 %1$s %2$s</string>
16201620
<string name="single_transaction_should_be_between">金额范围 %1$s %2$s ~ %3$s %4$s</string>
1621+
<string name="perps_minimum_margin">最小保证金为 %1$s</string>
1622+
<string name="perps_maximum_margin">最大保证金为 %1$s</string>
16211623
<!-- Web3 -->
16221624
<string name="web3_approve">授权</string>
16231625
<string name="web3_borrow">借款</string>

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1664,6 +1664,8 @@
16641664
<string name="single_transaction_should_be_greater_than">Minimum amount %1$s %2$s</string>
16651665
<string name="single_transaction_should_be_less_than">Maximum amount %1$s %2$s</string>
16661666
<string name="single_transaction_should_be_between">Amount range be %1$s %2$s ~ %3$s %4$s</string>
1667+
<string name="perps_minimum_margin">The minimun margin is %1$s</string>
1668+
<string name="perps_maximum_margin">The maximum margin is %1$s</string>
16671669
<!-- Web3 -->
16681670
<string name="web3_approve">Approve</string>
16691671
<string name="web3_borrow">Borrow</string>

0 commit comments

Comments
 (0)