Creates the offer. Must be called once. Starts INACTIVE — seller must call set_active(true) after deposit + SAC setup.
admin: high-privilege key (upgrade, withdraw, drain, freeze). Ideally multisig/cold.
seller: operational key (pause, price). Can be same as admin for MVP.
fixed_fee: flat fee per trade in stroops (e.g., 50_000_000 = $5 USDC). 0 = no fee.
deadline_ledger: ledger sequence after which trades are rejected (0 = no deadline).
min_buy_amount: minimum buy_token amount per trade in stroops (0 = no minimum).
max_buy_per_buyer: cumulative buy_token cap per buyer in stroops (0 = no cap).
fn create(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
seller: soroban_sdk::Address,
sell_token: soroban_sdk::Address,
buy_token: soroban_sdk::Address,
treasury: soroban_sdk::Address,
company: soroban_sdk::Address,
fixed_fee: i128,
sell_price: u32,
buy_price: u32,
deadline_ledger: u32,
min_buy_amount: i128,
max_buy_per_buyer: i128,
) -> Result<(), SaleError>
Buyer trades buy_token (USDC) for sell_token. Enforces: active, deadline, min amount, per-buyer cap, buyer not frozen. Atomic: all transfers succeed or all revert.
fn trade(
env: soroban_sdk::Env,
buyer: soroban_sdk::Address,
buy_token_amount: i128,
) -> Result<(), SaleError>
Admin withdraws any token from the contract.
fn withdraw(
env: soroban_sdk::Env,
token: soroban_sdk::Address,
amount: i128,
) -> Result<(), SaleError>
Emergency drain: atomically pauses the sale AND withdraws all sell_token to admin. Admin only. For the "oh shit" scenario.
fn emergency_drain(env: soroban_sdk::Env)
Pause or resume the sale. Seller only.
fn set_active(env: soroban_sdk::Env, active: bool)
Update price. Seller only. Emits "price" event.
fn updt_price(
env: soroban_sdk::Env,
sell_price: u32,
buy_price: u32,
) -> Result<(), SaleError>
Step 1: Current admin proposes a new admin.
fn propose_admin(env: soroban_sdk::Env, new_admin: soroban_sdk::Address)
Step 2: Proposed admin accepts the role.
fn accept_admin(env: soroban_sdk::Env) -> Result<(), SaleError>
Admin freezes or unfreezes a buyer. Frozen buyers cannot trade.
fn freeze_buyer(env: soroban_sdk::Env, buyer: soroban_sdk::Address, frozen: bool)
Returns whether a buyer is frozen.
fn is_frozen(env: soroban_sdk::Env, buyer: soroban_sdk::Address) -> bool
Upgrade contract WASM. Admin only (high-privilege).
fn upgrade(env: soroban_sdk::Env, new_wasm_hash: soroban_sdk::BytesN<32>)
Extend contract instance TTL. Anyone can call (allows cron jobs).
NOTE: WASM code TTL must be extended separately via
stellar contract extend --wasm-hash <HASH> --ledgers-to-extend 518400
fn extend_ttl(env: soroban_sdk::Env)
Returns the current offer state.
fn get_offer(env: soroban_sdk::Env) -> Offer
Returns the contract's balance of the sell token.
fn get_balance(env: soroban_sdk::Env) -> i128
Returns cumulative buy_token spent by a buyer.
fn get_buyer_spent(env: soroban_sdk::Env, buyer: soroban_sdk::Address) -> i128
Returns the contract version.
fn version(env: soroban_sdk::Env) -> u32