Skip to content

Commit ec65699

Browse files
feat: implement market model and storage
1 parent e1f1882 commit ec65699

3 files changed

Lines changed: 92 additions & 5 deletions

File tree

contracts/src/market.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
use soroban_sdk::{contracttype, String};
1+
use soroban_sdk::{contracttype, Address, String, Vec};
22

33
#[contracttype]
44
#[derive(Clone, Debug, Eq, PartialEq)]
5-
pub struct MarketDraft {
5+
pub struct Market {
6+
pub id: u64,
7+
pub creator: Address,
68
pub title: String,
9+
pub description: String,
10+
pub end_time: u64,
11+
pub outcomes: Vec<String>,
12+
pub resolved: bool,
713
}

contracts/src/storage.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,34 @@
1-
use soroban_sdk::{contracttype, Symbol};
1+
use crate::market::Market;
2+
use soroban_sdk::{contracttype, Env};
23

34
#[contracttype]
45
#[derive(Clone, Debug, Eq, PartialEq)]
56
pub enum DataKey {
6-
Placeholder(Symbol),
7+
Market(u64),
8+
MarketCounter,
9+
}
10+
11+
pub fn get_next_market_id(env: &Env) -> u64 {
12+
let current_id = env
13+
.storage()
14+
.instance()
15+
.get(&DataKey::MarketCounter)
16+
.unwrap_or(0_u64);
17+
let next_id = current_id.checked_add(1).expect("market counter overflow");
18+
19+
env.storage()
20+
.instance()
21+
.set(&DataKey::MarketCounter, &next_id);
22+
23+
next_id
24+
}
25+
26+
pub fn save_market(env: &Env, market: &Market) {
27+
env.storage()
28+
.persistent()
29+
.set(&DataKey::Market(market.id), market);
30+
}
31+
32+
pub fn get_market(env: &Env, market_id: u64) -> Option<Market> {
33+
env.storage().persistent().get(&DataKey::Market(market_id))
734
}

contracts/src/tests.rs

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
use super::{PredictXContract, PredictXContractClient};
2-
use soroban_sdk::{Env, String};
2+
use crate::{
3+
market::Market,
4+
storage::{get_market, get_next_market_id, save_market},
5+
};
6+
use soroban_sdk::{testutils::Address as _, vec, Address, Env, String};
37

48
#[test]
59
fn exposes_contract_version() {
@@ -9,3 +13,53 @@ fn exposes_contract_version() {
913

1014
assert_eq!(client.version(), String::from_str(&env, "0.1.0"));
1115
}
16+
17+
#[test]
18+
fn increments_market_ids_from_one() {
19+
let env = Env::default();
20+
let contract_id = env.register(PredictXContract, ());
21+
22+
env.as_contract(&contract_id, || {
23+
assert_eq!(get_next_market_id(&env), 1);
24+
assert_eq!(get_next_market_id(&env), 2);
25+
assert_eq!(get_next_market_id(&env), 3);
26+
});
27+
}
28+
29+
#[test]
30+
fn saves_and_loads_market_by_id() {
31+
let env = Env::default();
32+
let contract_id = env.register(PredictXContract, ());
33+
let creator = Address::generate(&env);
34+
35+
env.as_contract(&contract_id, || {
36+
let market_id = get_next_market_id(&env);
37+
let market = Market {
38+
id: market_id,
39+
creator,
40+
title: String::from_str(&env, "Will PredictX launch on testnet?"),
41+
description: String::from_str(&env, "Placeholder market model test."),
42+
end_time: 1_789_000_000,
43+
outcomes: vec![
44+
&env,
45+
String::from_str(&env, "Yes"),
46+
String::from_str(&env, "No"),
47+
],
48+
resolved: false,
49+
};
50+
51+
save_market(&env, &market);
52+
53+
assert_eq!(get_market(&env, market_id), Some(market));
54+
});
55+
}
56+
57+
#[test]
58+
fn returns_none_for_missing_market() {
59+
let env = Env::default();
60+
let contract_id = env.register(PredictXContract, ());
61+
62+
env.as_contract(&contract_id, || {
63+
assert_eq!(get_market(&env, 404), None);
64+
});
65+
}

0 commit comments

Comments
 (0)