From d7e08df9a9aaaab78821b3939bdc0cb20b90c43d Mon Sep 17 00:00:00 2001 From: Teppy Date: Sun, 23 Jun 2024 18:50:48 -0400 Subject: [PATCH] changes --- src/main.rs | 89 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 16 deletions(-) diff --git a/src/main.rs b/src/main.rs index f02a7bc..5a4da2d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -278,11 +278,13 @@ impl Market { self.traders[who as usize].sub_balance(cur,delta); *self.money_supply.get_mut(&cur).unwrap()-=delta; } - fn register_asset(&mut self, name:&str) -> usize { + fn register_asset(&mut self, name:&str) -> Option { + if self.asset_name2num.contains_key(name) { return None } self.assets.push(Asset::new(name)); self.asset_name2num.insert(String::from(name),self.assets.len()-1); self.money_supply.insert(self.assets.len()-1,FiNum::new(0)); - self.assets.len()-1 + let rval=self.assets.len()-1; + Some(rval) } fn number_to_asset(&self, n: usize) -> Asset { self.assets[n].clone() @@ -290,8 +292,8 @@ impl Market { fn number_to_name(&self, n: usize) -> String { self.assets[n].name.clone() } - fn name_to_number(&self, name:&str) -> usize { - *self.asset_name2num.get(name).unwrap() + fn name_to_number(&self, name:&str) -> Option<&usize> { + self.asset_name2num.get(name) } fn dump(&self) { println!("Dumping Market:"); @@ -373,17 +375,18 @@ impl Market { let bids=self.orders.get_mut(&ap).unwrap(); let sell_qty_remain=sell_qty*buy_qty/buy_qty_initial; if sell_qty_remain>0.into() { + self.royalties.entry(sell_type).or_insert(RoyaltyTree::new()).add_royalty(royalty0_qty); let rt=self.royalties.entry(buy_type).or_insert(RoyaltyTree::new()); rt.add_weight(rt.next_entry,buy_qty); // Weight should really be the quantity you would be able to immediately transact rather than how much you wish for. - // Still to do: add to royalty tree the remaining royalty0 amount, and add to the house the remaining commission0 amounts, and then add royalty1 and commission1 to the Order let neworder=Rc::new(RefCell::new( - Order { owner:owner, sell_qty:sell_qty_remain, sell_remain:sell_qty_remain, buy_qty:buy_qty, rt_loc: rt.next_entry, royalty_remain:royalty0_qty, commission_remain:commission0_qty } )); + Order { owner:owner, sell_qty:sell_qty_remain, sell_remain:sell_qty_remain, buy_qty:buy_qty, rt_loc: rt.next_entry, royalty_remain:royalty1_qty, commission_remain:commission1_qty } )); rt.next_entry+=1; bids.insert(neworder); self.traders[owner].sub_balance(sell_type,sell_qty_remain); + self.traders[0].add_balance(sell_type,commission0_qty); } } - self.traders[0].add_balance(sell_type,royalty_acc+commission_acc); + self.traders[0].add_balance(sell_type,commission_acc); self.traders[owner].sub_balance(sell_type,royalty_acc+commission_acc); true } @@ -471,8 +474,8 @@ impl Market { let mut rng: StdRng=StdRng::seed_from_u64(13u64); let teppy=self.register_trader("Teppy"); let luni =self.register_trader("Luni"); - let usd =self.register_asset("USD"); - let btc =self.register_asset("BTC"); + let usd =self.register_asset("USD").unwrap(); + let btc =self.register_asset("BTC").unwrap(); self.add_trader_balance(teppy,btc,100000.into()); self.add_trader_balance(luni ,usd,650000000.into()); let mut count=0; @@ -577,18 +580,72 @@ fn process_file(fname: &str) { println!("Processing file: {}",fname) } -fn interactive() { + +fn interactive(m: &mut Market) { + println!("Trading interactively in Tuesday Markets (demo)"); let stdin = io::stdin(); + let mut trader:usize=0; for line in stdin.lock().lines() { - if let Ok(input) = line { - let words: Vec<&str> = input.split_whitespace().collect(); - match line { - "quit" => break, - _ => println!("Unknown Command"), + match line { + Ok(input) => { + let tokens: Vec<&str> = input.split_whitespace().collect(); + match tokens.as_slice() { + ["dump"] => m.dump(), + ["login", username] => + if let Some(t)=m.trader_name2num.get_mut(*username) { trader=*t; println!("Logged in as {}",m.traders[trader].name) } else { println!("Trader {} not found.",username) }, + ["whoami" ] => { println!("Logged in as {}, id {}",m.traders[trader].name,trader ); } + ["addtrader", username] => { let id=m.register_trader(username); println!("Added user {} as id {}",username,id); }, + ["balances"] => { + println!("Balances for trader {}",m.traders[trader].name); + for (key,value) in &m.traders[trader].balances { println!(" {} {}",m.number_to_name(*key),value); } + } + ["addasset", assetname] => { + if let Some(cur)=m.register_asset(assetname) { println!("Added asset {} ",m.number_to_name(cur)) } + else { println!("Asset {} already exists.",assetname) } + } + ["addfunds", username, qty0, cur0 ] => { + let id=m.trader_name2num.get(*username); + let qty=FiNum::new_str(qty0); + let cur=m.name_to_number(cur0); + if id.is_none() { println!("Could not find trader {}",username); } + else if qty.is_zero() { println!("Could not parse quantity {}",qty0) } + else if cur.is_none() { println!("Could not find asset {}",cur0) } + else { + let id=*id.unwrap(); + let cur=*cur.unwrap(); + m.add_trader_balance(id,cur,qty); + println!("Added {} {} to {}",qty,m.number_to_asset(cur).name,m.traders[id].name) + } + } + ["order", qty0, cur0, qty1, cur1 ] => { + let qty0=FiNum::new_str(qty0); + let cur0=m.name_to_number(cur0); + let qty1=FiNum::new_str(qty1); + let cur1=m.name_to_number(cur1); + if !qty0.is_zero() && cur0.is_some() && !qty1.is_zero() && cur1.is_some() { + m.make_order(trader,*cur0.unwrap(),*cur1.unwrap(),qty0,qty1); + } + } + ["quit"] => { + break; + } + _ => println!("Invalid command. Please try again."), } } + Err(error) => println!("Error reading input: {}", error), } } +} + +fn erase(filename: &str) { + // Stub function for erasing a file + println!("Erasing file: {}", filename); +} + +fn copy(source: &str, destination: &str) { + // Stub function for copying a file + println!("Copying file from {} to {}", source, destination); +} fn main() { @@ -596,7 +653,7 @@ fn main() { let mode=if args.len()<=1 { "--interactive" } else { args[1].as_str() }; let mut m=Market::new(); // USD type is 1, EUR type is 2, BTC type is 10, ETH type is 11, zKN6FBdD SOL type is 12 match mode { - "--interactive" => interactive(), + "--interactive" => interactive(&mut m), "--exercise" => m.exercise(), "--treestuff" => tree_stuff(), "--royaltystuff" => royalty_stuff(),