fluidex/dingir-exchange

Refund quote asset when user put a higher price buy order

Closed this issue · 3 comments

refund = (taker.price-maker.price) * traded_base_amount

https://github.com/Fluidex/dingir-exchange/blob/cc808e3fae92f5f596aa6958fe449078a0512af9/src/matchengine/market.rs#L568

当用户以高于卖一价格进行买入,成交时需要退还多余的计价币种资产,或者将多余的的计价币种资产计入交易所营收。

lispc commented

我感觉好像没问题?

https://github.com/Fluidex/dingir-exchange/blob/cc808e3fae92f5f596aa6958fe449078a0512af9/src/matchengine/market.rs#L557

taker 之所以能以超过卖一的价格成交,是因为卖一已经被他吃了?

或者你觉得说不清楚可以给我个 PR。我们合作过多次了,如果真有 bug 肯定会有报酬的哈哈~

设一个简单的场景:手续费均为 0,BTC/USDT 盘面上现在只要一笔价格为 1000,数量为 1 的卖单。
然后另外的用户下了一笔价格为 1001,数量为 1 的限价买单。

那么成交价是 1000(成交价以 maker 为准),成交量是 1 BTC。

成交前

卖方冻结资产是 1 BTC,买方冻结资产是 1001 USDT。

成交后

卖方冻结资产 -1BTC,可用资产 +1000 USDT,卖方收到的 USDT 数量是成交价乘以成交量
买方冻结资产 -1000 USDT,可用资产 +1 BTC。

经过成交后,买方还有 1 USDT 的冻结资产,是否有将这个 1 USDT归还的逻辑?

具体的代码位置应该是在如下

https://github.com/Fluidex/dingir-exchange/blob/6cc9a0c893574efc4b3604e0480016bc1b747ac3/src/matchengine/market.rs#L424-L430

order.remain 为 0,但是 order.frozen 是否一定为 0 呢?

@lispc

lispc commented

实际上我们这里对于 new order(taker),不是先 freeze 再成交再 unfreeze 的。而是先成交,如果没有完全成交,才 freeze 和 insert into orderbook 的。见:

https://github.com/Fluidex/dingir-exchange/blob/cc808e3fae92f5f596aa6958fe449078a0512af9/src/matchengine/market.rs#L709

unfrozen_balance 和 order_finish 只会针对已经在 orderbook 里面的 maker,他们 remain == 0 时候,frozen 就是 0。