Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions contracts/predict-iq/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ mod modules;
mod test;
mod test_snapshot_voting;
mod test_resolution_state_machine;
mod test_multi_token;

use crate::types::{ConfigKey, CircuitBreakerState};
use crate::modules::admin;
Expand Down Expand Up @@ -40,6 +41,7 @@ impl PredictIQ {
deadline: u64,
resolution_deadline: u64,
oracle_config: crate::types::OracleConfig,
token_address: Address,
) -> Result<u64, ErrorCode> {
crate::modules::markets::create_market(
&e,
Expand All @@ -49,6 +51,7 @@ impl PredictIQ {
deadline,
resolution_deadline,
oracle_config,
token_address,
)
}

Expand All @@ -67,9 +70,8 @@ impl PredictIQ {
e: Env,
bettor: Address,
market_id: u64,
token_address: Address,
) -> Result<i128, ErrorCode> {
crate::modules::bets::claim_winnings(&e, bettor, market_id, token_address)
crate::modules::bets::claim_winnings(&e, bettor, market_id)
}

pub fn get_market(e: Env, id: u64) -> Option<crate::types::Market> {
Expand Down
8 changes: 6 additions & 2 deletions contracts/predict-iq/src/modules/bets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ pub fn place_bet(
return Err(ErrorCode::InvalidOutcome);
}

// Validate token_address matches market's configured asset
if token_address != market.token_address {
return Err(ErrorCode::InvalidBetAmount);
}

// Transfer tokens from bettor to contract
let client = token::Client::new(e, &token_address);
client.transfer(&bettor, &e.current_contract_address(), &amount);
Expand Down Expand Up @@ -74,7 +79,6 @@ pub fn claim_winnings(
e: &Env,
bettor: Address,
market_id: u64,
token_address: Address,
) -> Result<i128, ErrorCode> {
bettor.require_auth();

Expand Down Expand Up @@ -104,7 +108,7 @@ pub fn claim_winnings(

e.storage().persistent().remove(&bet_key);

let client = token::Client::new(e, &token_address);
let client = token::Client::new(e, &market.token_address);
client.transfer(&e.current_contract_address(), &bettor, &payout);

e.events().publish(
Expand Down
2 changes: 2 additions & 0 deletions contracts/predict-iq/src/modules/markets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ pub fn create_market(
deadline: u64,
resolution_deadline: u64,
oracle_config: OracleConfig,
token_address: Address,
) -> Result<u64, ErrorCode> {
creator.require_auth();

Expand All @@ -37,6 +38,7 @@ pub fn create_market(
dispute_snapshot_ledger: None,
pending_resolution_timestamp: None,
dispute_timestamp: None,
token_address,
};

e.storage().persistent().set(&DataKey::Market(count), &market);
Expand Down
21 changes: 13 additions & 8 deletions contracts/predict-iq/src/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,17 @@ fn test_market_lifecycle() {
min_responses: 1,
};

let market_id = client.create_market(&creator, &description, &options, &deadline, &resolution_deadline, &oracle_config);
let token_admin = Address::generate(&e);
let token_id = e.register_stellar_asset_contract_v2(token_admin.clone());
let token_address = token_id.address();

let market_id = client.create_market(&creator, &description, &options, &deadline, &resolution_deadline, &oracle_config, &token_address);
assert_eq!(market_id, 1);

let market = client.get_market(&market_id).unwrap();
assert_eq!(market.id, 1);
assert_eq!(market.status, types::MarketStatus::Active);
assert_eq!(market.token_address, token_address);
}

#[test]
Expand Down Expand Up @@ -76,7 +81,7 @@ fn test_claim_winnings_three_winners() {
min_responses: 1,
};

let market_id = client.create_market(&creator, &description, &options, &100, &200, &oracle_config);
let market_id = client.create_market(&creator, &description, &options, &100, &200, &oracle_config, &token_address);

client.place_bet(&bettor1, &market_id, &0, &1000, &token_address);
client.place_bet(&bettor2, &market_id, &0, &2000, &token_address);
Expand All @@ -94,17 +99,17 @@ fn test_claim_winnings_three_winners() {
let net_pool = total_staked - fee;
let winning_stake = 6000_i128;

let payout1 = client.claim_winnings(&bettor1, &market_id, &token_address);
let payout1 = client.claim_winnings(&bettor1, &market_id);
let expected1 = (1000 * net_pool) / winning_stake;
assert_eq!(payout1, expected1);
assert_eq!(token_std_client.balance(&bettor1), expected1);

let payout2 = client.claim_winnings(&bettor2, &market_id, &token_address);
let payout2 = client.claim_winnings(&bettor2, &market_id);
let expected2 = (2000 * net_pool) / winning_stake;
assert_eq!(payout2, expected2);
assert_eq!(token_std_client.balance(&bettor2), expected2);

let payout3 = client.claim_winnings(&bettor3, &market_id, &token_address);
let payout3 = client.claim_winnings(&bettor3, &market_id);
let expected3 = (3000 * net_pool) / winning_stake;
assert_eq!(payout3, expected3);
assert_eq!(token_std_client.balance(&bettor3), expected3);
Expand Down Expand Up @@ -143,10 +148,10 @@ fn test_claim_winnings_double_claim() {
min_responses: 1,
};

let market_id = client.create_market(&creator, &description, &options, &100, &200, &oracle_config);
let market_id = client.create_market(&creator, &description, &options, &100, &200, &oracle_config, &token_address);
client.place_bet(&bettor, &market_id, &0, &1000, &token_address);
client.resolve_market(&market_id, &0);

client.claim_winnings(&bettor, &market_id, &token_address);
client.claim_winnings(&bettor, &market_id, &token_address);
client.claim_winnings(&bettor, &market_id);
client.claim_winnings(&bettor, &market_id);
}
Loading