Skip to content

Commit

Permalink
Merge branch 'main' into feat/rooch/da/stat
Browse files Browse the repository at this point in the history
  • Loading branch information
popcnt1 authored Oct 24, 2024
2 parents 8b48cb6 + 2b1d0e2 commit f7de7b4
Show file tree
Hide file tree
Showing 14 changed files with 684 additions and 281 deletions.
194 changes: 97 additions & 97 deletions Cargo.lock

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ smallvec = "1.6.1"
thiserror = "1.0.65"
tiny-keccak = { version = "2", features = ["keccak", "sha3"] }
tiny-bip39 = "1.0.1"
tokio = { version = "1.40.0", features = ["full"] }
tokio = { version = "1.41.0", features = ["full"] }
tokio-util = "0.7.12"
tokio-tungstenite = { version = "0.24.0", features = ["native-tls"] }
tokio-stream = "0.1.16"
Expand All @@ -242,7 +242,7 @@ versions = "4.1.0"
pretty_assertions = "1.4.1"
syn = { version = "1.0.104", features = ["full", "extra-traits"] }
quote = "1.0"
proc-macro2 = "1.0.88"
proc-macro2 = "1.0.89"
derive-syn-parse = "0.1.5"
unescape = "0.1.0"
tempfile = "3.13.0"
Expand Down
2 changes: 1 addition & 1 deletion examples/orderbook/Move.toml → apps/orderbook/Move.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ version = "0.0.1"
[dependencies]
MoveosStdlib = { local = "../../frameworks/moveos-stdlib" }
BitcoinMove = { local = "../../frameworks/bitcoin-move" }
RoochNursery = { local = "../../frameworks/rooch-nursery" }
app_admin = { local = "../app_admin" }

[addresses]
orderbook = "_"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ module orderbook::market {
use rooch_framework::coin_store;
use moveos_std::tx_context::sender;
use moveos_std::type_info::type_name;
use moveos_std::object::{Object, ObjectID, to_shared, new_named_object, transfer, new};
use moveos_std::object::{Object, ObjectID, to_shared, new_named_object};
use rooch_framework::coin_store::{CoinStore, create_coin_store};
use moveos_std::timestamp::now_milliseconds;
use orderbook::critbit::{CritbitTree, find_leaf, borrow_leaf_by_index, borrow_mut_leaf_by_index,
Expand All @@ -24,6 +24,7 @@ module orderbook::market {
use orderbook::critbit;
use moveos_std::table;
use moveos_std::table::Table;
use app_admin::admin::AdminCap;

const DEPLOYER: address = @orderbook;

Expand Down Expand Up @@ -105,18 +106,26 @@ module orderbook::market {
txs: u64
}

struct AdminCap has key, store {}
// struct AdminCap has key, store {}

struct MarketplaceHouse has key {
market_info: LinkedTable<String, ObjectID>,
}

fun init() {
let market_house = MarketplaceHouse {
market_info: linked_table::new(),
};

//TODO market create event
// transfer(new_named_object(AdminCap{}), sender());
to_shared(new_named_object(market_house))
}

public entry fun create_market<BaseAsset: key + store, QuoteAsset: key + store>(
market_house_obj: &mut Object<MarketplaceHouse>,
) {
let market_obj = new(Marketplace {
let market_obj = new_named_object(Marketplace {
is_paused: false,
version: VERSION,
bids: critbit::new(),
Expand Down Expand Up @@ -147,24 +156,14 @@ module orderbook::market {
to_shared(market_obj);
}

fun init() {
let market_house = MarketplaceHouse {
market_info: linked_table::new(),
};

//TODO market create event
transfer(new_named_object(AdminCap{}), sender());
to_shared(new_named_object(market_house))
}

///Listing NFT in the collection
public entry fun list<BaseAsset: key + store, QuoteAsset: key + store>(
signer: &signer,
market_obj: &mut Object<Marketplace<BaseAsset, QuoteAsset>>,
quantity: u256,
unit_price: u64,
) {
let coin= account_coin_store::withdraw<BaseAsset>(signer, quantity);
let coin= account_coin_store::withdraw<QuoteAsset>(signer, quantity);
let market = object::borrow_mut(market_obj);
assert!(market.version == VERSION, ErrorWrongVersion);
assert!(market.is_paused == false, ErrorWrongPaused);
Expand All @@ -180,17 +179,17 @@ module orderbook::market {
owner: sender(),
is_bid: false,
};
coin_store::deposit(&mut market.base_asset, coin);
coin_store::deposit(&mut market.quote_asset, coin);
let (find_price, index) = critbit::find_leaf(&market.asks, unit_price);
if (find_price) {
critbit::insert_leaf(&mut market.asks, unit_price, TickLevel{
if (!find_price) {
index = critbit::insert_leaf(&mut market.asks, unit_price, TickLevel{
price: unit_price,
open_orders: linked_table::new()
});
};
let tick_level = critbit::borrow_mut_leaf_by_index(&mut market.asks, index);
linked_table::push_back(&mut tick_level.open_orders, order_id, asks);

//
if (!table::contains(&market.user_order_info, sender())) {
table::add(&mut market.user_order_info, sender(), linked_table::new());
};
Expand All @@ -211,7 +210,7 @@ module orderbook::market {
assert!(unit_price > 0, ErrorWrongCreateBid);
// TODO here maybe wrap to u512?
let price = (unit_price as u256) * quantity;
let paid = account_coin_store::withdraw<QuoteAsset>(signer, price);
let paid = account_coin_store::withdraw<BaseAsset>(signer, price);
let order_id = market.next_bid_order_id;
market.next_bid_order_id = market.next_bid_order_id + 1;
let bid = Order {
Expand All @@ -221,17 +220,21 @@ module orderbook::market {
owner: sender(),
is_bid: true,
};
coin_store::deposit(&mut market.quote_asset, paid);
coin_store::deposit(&mut market.base_asset, paid);

let (find_price, index) = critbit::find_leaf(&market.bids, unit_price);
if (!find_price) {
critbit::insert_leaf(&mut market.bids, unit_price, TickLevel {
index = critbit::insert_leaf(&mut market.bids, unit_price, TickLevel {
price: unit_price,
open_orders: linked_table::new()
});
};
let tick_level = critbit::borrow_mut_leaf_by_index(&mut market.bids, index);
linked_table::push_back(&mut tick_level.open_orders, order_id, bid);
if (!table::contains(&market.user_order_info, sender())) {
table::add(&mut market.user_order_info, sender(), linked_table::new());
};
linked_table::push_back(table::borrow_mut(&mut market.user_order_info, sender()), order_id, unit_price);
}

///Cancel the listing of inscription
Expand All @@ -258,9 +261,9 @@ module orderbook::market {
if (is_bid) {
// TODO here maybe wrap to u512?
let total_balance = (order.unit_price as u256) * order.quantity;
account_coin_store::deposit(sender(), coin_store::withdraw(&mut market.quote_asset, total_balance))
account_coin_store::deposit(sender(), coin_store::withdraw(&mut market.base_asset, total_balance))
}else {
account_coin_store::deposit(sender(), coin_store::withdraw(&mut market.base_asset, order.quantity))
account_coin_store::deposit(sender(), coin_store::withdraw(&mut market.quote_asset, order.quantity))
}
}

Expand All @@ -271,7 +274,7 @@ module orderbook::market {
assert_order_exist: bool,
receiver: address
){
let option_coin = do_buy(signer, market_obj, order_id, assert_order_exist);
let option_coin = do_buy<BaseAsset, QuoteAsset>(signer, market_obj, order_id, assert_order_exist);
if (is_some(&option_coin)) {
account_coin_store::deposit(receiver, option::extract(&mut option_coin))
};
Expand Down Expand Up @@ -316,19 +319,19 @@ module orderbook::market {
// Here is trade fee is BaseAsset
let trade_fee = total_price * market.fee / TRADE_FEE_BASE_RATIO;
coin_store::deposit(&mut market.base_asset_trading_fees, coin::extract(&mut trade_coin, trade_fee));
coin_store::deposit(&mut market.base_asset, trade_coin);
account_coin_store::deposit(order.owner, trade_coin);
option::some(coin_store::withdraw(&mut market.quote_asset, order.quantity))
}


public fun accept_bid<BaseAsset: key + store, QuoteAsset: key + store>(
public entry fun accept_bid<BaseAsset: key + store, QuoteAsset: key + store>(
signer: &signer,
market_obj: &mut Object<Marketplace<BaseAsset, QuoteAsset>>,
order_id: u64,
assert_order_exist: bool,
receiver: address
){
let option_coin = do_accept_bid(signer, market_obj, order_id, assert_order_exist);
let option_coin = do_accept_bid<BaseAsset, QuoteAsset>(signer, market_obj, order_id, assert_order_exist);
if (is_some(&option_coin)) {
account_coin_store::deposit(receiver, option::extract(&mut option_coin))
};
Expand Down Expand Up @@ -359,7 +362,6 @@ module orderbook::market {
let trade_coin = account_coin_store::withdraw<QuoteAsset>(signer, order.quantity);
// assert!(coin::value(paid) >= order.quantity, ErrorInputCoin);
// let trade_coin = coin::extract(paid, order.quantity);

// TODO here maybe wrap to u512?
let total_price = (order.unit_price as u256) * order.quantity;
let trade_info = &mut market.trade_info;
Expand All @@ -376,8 +378,7 @@ module orderbook::market {
// Here trade fee is QuoteAsset
let trade_fee = order.quantity * market.fee / TRADE_FEE_BASE_RATIO;
coin_store::deposit(&mut market.quote_asset_trading_fees, coin::extract(&mut trade_coin, trade_fee));
coin_store::deposit(&mut market.quote_asset_trading_fees, trade_coin);

account_coin_store::deposit(order.owner, trade_coin);
option::some(coin_store::withdraw(&mut market.base_asset, total_price))
}

Expand Down Expand Up @@ -455,8 +456,9 @@ module orderbook::market {
public fun query_order<BaseAsset: key + store, QuoteAsset: key + store>(
market_obj: &Object<Marketplace<BaseAsset, QuoteAsset>>,
query_bid: bool,
from_order: Option<u64>,
start: u64
from_price: u64,
from_price_is_none: bool,
start_order_id: u64
): vector<u64> {
let market = object::borrow(market_obj);
let order_ids = vector<u64>[];
Expand All @@ -467,26 +469,40 @@ module orderbook::market {

if (query_bid) {
let i = 0;
let from = if (option::is_none(&from_order)) {
let from = if (from_price_is_none) {
let (key, _) = critbit::max_leaf(&market.bids);
key
}else {
*option::borrow(&from_order)
from_price
};
let count = start;
while (i < 50) {
let tick_level = critbit::borrow_leaf_by_key(&market.bids, from);
let order_count = linked_table::length(&tick_level.open_orders);

while (order_count > count) {
let order = linked_table::borrow(&tick_level.open_orders, count);
if (order_count == 0) {
event::emit(
QueryOrderEvent{
order_ids,
unit_prices,
quantitys,
owners,
is_bids
}
);
return order_ids
};
let option_order_id = if (!linked_table::contains(&tick_level.open_orders, start_order_id)){
linked_table::front(&tick_level.open_orders)
}else {
&option::some(start_order_id)
};
while (option::is_some(option_order_id)) {
let order_id = option::destroy_some(*option_order_id);
let order = linked_table::borrow(&tick_level.open_orders, order_id);
vector::push_back(&mut order_ids, order.order_id);
vector::push_back(&mut unit_prices, order.unit_price);
vector::push_back(&mut quantitys, order.quantity);
vector::push_back(&mut owners, order.owner);
vector::push_back(&mut is_bids, order.is_bid);

count = count + 1;
i = i + 1;
if (i >= 50) {
event::emit(
Expand All @@ -499,9 +515,9 @@ module orderbook::market {
}
);
return order_ids
}
};
option_order_id = linked_table::next(&tick_level.open_orders, order_id)
};
count = 0;
let (key, index) = critbit::previous_leaf(&market.bids, from);
if (index != 0x8000000000000000) {
from = key;
Expand All @@ -520,26 +536,41 @@ module orderbook::market {
};
}else {
let i = 0;
let from = if (option::is_none(&from_order)) {
let from = if (from_price_is_none) {
let (key, _) = critbit::min_leaf(&market.asks);
key
}else {
*option::borrow(&from_order)
from_price
};
let count = start;

while (i < 50) {
let tick_level = critbit::borrow_leaf_by_key(&market.asks, from);
let order_count = linked_table::length(&tick_level.open_orders);

while (order_count > count) {
let order = linked_table::borrow(&tick_level.open_orders, count);
if (order_count == 0) {
event::emit(
QueryOrderEvent{
order_ids,
unit_prices,
quantitys,
owners,
is_bids
}
);
return order_ids
};
let option_order_id = if (!linked_table::contains(&tick_level.open_orders, start_order_id)){
linked_table::front(&tick_level.open_orders)
}else {
&option::some(start_order_id)
};
while (option::is_some(option_order_id)) {
let order_id = option::destroy_some(*option_order_id);
let order = linked_table::borrow(&tick_level.open_orders, order_id);
vector::push_back(&mut order_ids, order.order_id);
vector::push_back(&mut unit_prices, order.unit_price);
vector::push_back(&mut quantitys, order.quantity);
vector::push_back(&mut owners, order.owner);
vector::push_back(&mut is_bids, order.is_bid);

count = count + 1;
i = i + 1;
if (i >= 50) {
event::emit(
Expand All @@ -552,9 +583,9 @@ module orderbook::market {
}
);
return order_ids
}
};
option_order_id = linked_table::next(&tick_level.open_orders, order_id)
};
count = 0;
let (key, index) = critbit::next_leaf(&market.asks, from);
if (index != 0x8000000000000000) {
from = key;
Expand Down Expand Up @@ -587,22 +618,25 @@ module orderbook::market {
public fun query_user_order<BaseAsset: key + store, QuoteAsset: key + store>(
market_obj: &Object<Marketplace<BaseAsset, QuoteAsset>>,
user: address,
from_order: Option<u64>,
from_order: u64,
from_order_is_none: bool,
count: u64
): vector<u64>{
let market = object::borrow(market_obj);
if (!table::contains(&market.user_order_info, user)) {
return vector[]
};
let user_table = table::borrow(&market.user_order_info, user);
let order_ids = vector<u64>[];
let unit_prices = vector<u64>[];
let quantitys = vector<u256>[];
let owners = vector<address>[];
let is_bids = vector<bool>[];
let from = if (option::is_none(&from_order)) {
let from = if (from_order_is_none) {
*option::borrow(linked_table::front(user_table))
}else {
*option::borrow(&from_order)
from_order
};

let i = 0;
while (i < count) {
let tick_price = *linked_table::borrow(user_table, from);
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion crates/testsuite/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ assert_cmd = "2.0"
cucumber = "0.21.1"
futures = { workspace = true }
testcontainers = { version = "0.15.0", git = "https://github.com/yubing744/testcontainers-rs", rev = "6b87dc53ab3bc6eb4d15c7e73a3c57dcbf40d0af" }
tokio = { version = "1.40", features = ["macros", "rt-multi-thread", "sync", "time"] }
tokio = { version = "1.41", features = ["macros", "rt-multi-thread", "sync", "time"] }
jpst = "0.1.1"
tracing = "0.1"
backtrace = "0.3"
Expand Down
Loading

0 comments on commit f7de7b4

Please sign in to comment.