This commit is contained in:
2024-06-23 18:50:48 -04:00
parent 724e07b5ed
commit d7e08df9a9

View File

@@ -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<usize> {
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,17 +580,71 @@ 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"),
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);
}
@@ -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(),