// Finance Rhai Script Example print("--- Starting Finance Rhai Script ---"); // 1. Create an Account using the builder pattern let user1_id = 1; // Assuming this user_id is a separate concept, e.g. from an auth system let acc1 = new_account() .set_name("User1 Main Account") .set_user_id(user1_id) // user_id is i64 in Rhai, u32 in Rust. Conversion handled by setter. .set_description("Primary account for User 1") .set_ledger("LedgerX") .set_address("0x123MainSt") .set_pubkey("pubkeyUser1"); print(`Created account (pre-save): ${acc1.name} with temp ID ${acc1.id}`); // 2. Save Account to Mock DB and get the version with DB-assigned ID let acc1 = set_account(acc1); // Shadowing acc1 with the returned instance print(`Account ${acc1.name} saved to DB with ID ${acc1.id}.`); // 3. Retrieve Account from Mock DB (using the new ID) let fetched_acc1 = get_account_by_id(acc1.id); // Use the ID from the saved acc1 print(`Fetched account from DB: ${fetched_acc1.name}, User ID: ${fetched_acc1.user_id}`); // 4. Create an Asset using the builder pattern let asset1 = new_asset() .set_name("HeroCoin") .set_description("Utility token for Hero Platform") .set_amount(1000.0) .set_address("0xTokenContract") .set_asset_type("Erc20") // Setter handles string to enum .set_decimals(18); print(`Created asset (pre-save): ${asset1.name} (temp ID: ${asset1.id}), Amount: ${asset1.amount}, Type: ${asset1.asset_type_str}`); // 5. Save Asset to Mock DB and get the version with DB-assigned ID let asset1 = set_asset(asset1); // Shadowing asset1 print(`Asset ${asset1.name} (ID: ${asset1.id}) saved to DB.`); // 6. Retrieve Asset from Mock DB (using the new ID) let fetched_asset1 = get_asset_by_id(asset1.id); // Use the ID from the saved asset1 print(`Fetched asset from DB: ${fetched_asset1.name}, Address: ${fetched_asset1.address}`); // 7. Add Asset to Account // We have 'acc1' and 'asset1' from previous steps, both saved to DB and have their IDs. print(`Attempting to add asset ${asset1.id} to account ${acc1.id}`); // Fetch the latest version of the account before modifying // let mut acc1_for_update = get_account_by_id(acc1.get_id()); // // Fetch the asset to add (or use fetched_asset1 if it's the correct one) // let asset_to_add = get_asset_by_id(asset1.get_id()); // // try { // acc1_for_update = acc1_for_update.add_asset(asset_to_add); // add_asset returns the modified account // acc1_for_update = set_account(acc1_for_update); // Save the account with the new asset // print(`Asset '${asset_to_add.name}' added to account '${acc1_for_update.name}'.`); // print(`Account now has ${acc1_for_update.get_assets_cloned().len()} assets.`); // // Verify the asset is there // if (acc1_for_update.get_assets_cloned().len() > 0) { // let first_asset_in_account = acc1_for_update.get_assets_cloned()[0]; // print(`First asset in account: ${first_asset_in_account.name} (ID: ${first_asset_in_account.id})`); // } // } catch (err) { // print(`Error adding asset to account: ${err}`); // } // 8. Create a Listing for the Asset using the builder pattern let current_timestamp = timestamp(); // Rhai's built-in for current unix timestamp (seconds) let expires_at_ts = current_timestamp + (24 * 60 * 60 * 7); // Expires in 7 days let listing1 = new_listing() .set_title("Rare HeroCoin Batch") .set_description("100 HeroCoins for sale") .set_asset_id(asset1.id.to_string()) // Use ID from the saved asset1 .set_asset_type_str("Erc20") // asset_type as string .set_seller_id(user1_id.to_string()) // seller_id as string (using the predefined user1_id) .set_price(50.0) // price .set_currency("USD") // currency .set_listing_type("FixedPrice") // listing_type as string .set_tags(["token", "herocoin", "sale"]); // tags as array of strings // image_url is None by default from new_listing(), so no need to call set_image_url_opt for None print(`Created listing (pre-save): ${listing1.title} (temp ID: ${listing1.id}), Price: ${listing1.price} ${listing1.currency}`); print(`Listing type: ${listing1.listing_type}, Status: ${listing1.status}`); print(`Listing expires_at_ts_opt: ${listing1.expires_at_ts_opt}`); // 9. Save Listing to Mock DB and get the version with DB-assigned ID let listing1 = set_listing(listing1); // Shadowing listing1 print(`Listing ${listing1.get_title()} (ID: ${listing1.get_id()}) saved to DB.`); // 10. Retrieve Listing from Mock DB (using the new ID) let fetched_listing1 = get_listing_by_id(listing1.get_id()); // Use the ID from the saved listing1 print(`Fetched listing from DB: ${fetched_listing1.get_title()}, Seller ID: ${fetched_listing1.get_seller_id()}`); print(`Fetched listing asset_id: ${fetched_listing1.get_asset_id()}, asset_type: ${fetched_listing1.get_asset_type_str()}`); // 11. Demonstrate an auction listing using the builder pattern let auction_listing = new_listing() .set_title("Vintage Hero Figurine") .set_description("Rare collectible, starting bid low!") .set_asset_id("asset_nft_123") // Mock asset ID for an NFT - this asset isn't created/saved in script .set_asset_type("Erc721") .set_seller_id(user1_id.to_string()) // Using the predefined user1_id .set_price(10.0) // Starting price .set_currency("USD") .set_listing_type("Auction") // expires_at_ts_opt is None by default .set_tags(["collectible", "rare", "auction"]) .set_image_url_opt("http://example.com/figurine.png"); // Save Auction Listing to Mock DB and get the version with DB-assigned ID let auction_listing = set_listing(auction_listing); // Shadowing auction_listing print(`Created auction listing: ${auction_listing.get_title()} (ID: ${auction_listing.get_id()})`); // 12. Create a Bid for the auction listing (Bid model not using builder pattern in this refactor) let bid1 = new_bid(auction_listing.get_id().to_string(), 2, 12.0, "USD"); // User 2 bids 12 USD print(`Created bid for listing ${bid1.listing_id} by bidder ${bid1.bidder_id} for ${bid1.amount} ${bid1.currency}`); print(`Bid status: ${bid1.status_str}, Created at: ${bid1.created_at_ts}`); // 13. Add bid to listing let auction_listing_for_bid = get_listing_by_id(auction_listing.get_id()); // print(`Listing '${auction_listing_for_bid.get_title()}' fetched for bidding. Current price: ${auction_listing_for_bid.get_price()}, Bids: ${auction_listing_for_bid.get_bids_cloned().len()}`); try { let updated_listing_after_bid = auction_listing_for_bid.add_listing_bid(bid1); print(`Bid added to '${updated_listing_after_bid.get_title()}'. New bid count: ${updated_listing_after_bid.get_bids_cloned().len()}, New price: ${updated_listing_after_bid.get_price()};`); set_listing(updated_listing_after_bid); // Save updated listing to DB print("Auction listing with new bid saved to DB;"); } catch (err) { print(`Error adding bid: ${err}`); } // 14. Try to complete sale for the fixed price listing let listing_to_sell = get_listing_by_id(listing1.id); let buyer_user_id = 3; print(`Attempting to complete sale for listing: ${listing_to_sell.title} by buyer ${buyer_user_id}`); try { let sold_listing = listing_to_sell.complete_listing_sale(buyer_user_id.to_string(), listing_to_sell.price); print(`Sale completed for listing ${sold_listing.id}. New status: ${sold_listing.status}`); print(`Buyer ID: ${sold_listing.buyer_id_opt}, Sale Price: ${sold_listing.sale_price_opt}`); set_listing(sold_listing); // Save updated listing } catch (err) { print(`Error completing sale: ${err}`); } print("--- Finance Rhai Script Finished ---");