Draw: send NGNC from vault to hot wallet. ReytsCAD settlement to partner is handled off-chain by the API using the same ref_hash for linkage. OPS only.
fn draw(
env: soroban_sdk::Env,
partner: soroban_sdk::Address,
deposit_asset_sac: soroban_sdk::Address,
payment_asset_sac: soroban_sdk::Address,
deposit_amount: i128,
payment_amount: i128,
hot_wallet: soroban_sdk::Address,
ref_hash: soroban_sdk::BytesN<32>,
)
Block deposits, draws, normal withdrawals — admin only. Emergency withdraw still works.
fn pause(env: soroban_sdk::Env)
Returns (paused, admin, ops, max_draw_per_tx, throttled_max_draw).
fn status(
env: soroban_sdk::Env,
) -> (bool, soroban_sdk::Address, soroban_sdk::Address, i128, i128)
Rotate ops address — admin + new_ops must co-sign.
fn set_ops(env: soroban_sdk::Env, new_ops: soroban_sdk::Address)
Resume operations — admin only.
fn unpause(env: soroban_sdk::Env)
Normal withdrawal to partner's allowlisted wallet — OPS only.
fn withdraw(
env: soroban_sdk::Env,
partner: soroban_sdk::Address,
asset_sac: soroban_sdk::Address,
amount: i128,
destination: soroban_sdk::Address,
)
Rotate admin address — both admin and new_admin must co-sign.
fn set_admin(env: soroban_sdk::Env, new_admin: soroban_sdk::Address)
Check if address is an allowed partner.
fn is_partner(env: soroban_sdk::Env, partner: soroban_sdk::Address) -> bool
Add a KYC'd partner with an initial deposit cap for a specific asset (M-02). Caps for additional assets are added via set_deposit_cap. Admin only.
fn add_partner(
env: soroban_sdk::Env,
partner: soroban_sdk::Address,
asset: soroban_sdk::Address,
deposit_cap: i128,
)
Set exchange rate (7-decimal i128) — OPS only. Auto-calculates band. >=15% → pauses draws.
fn update_rate(
env: soroban_sdk::Env,
deposit_asset: soroban_sdk::Address,
payment_asset: soroban_sdk::Address,
new_rate: i128,
)
Get current rate for an asset pair.
fn current_rate(
env: soroban_sdk::Env,
deposit_asset: soroban_sdk::Address,
payment_asset: soroban_sdk::Address,
) -> (i128, u64)
Update normal max draw per tx — admin only.
fn set_max_draw(env: soroban_sdk::Env, new_max: i128)
I-01: deployment-time constructor. Runs atomically with contract creation, closing the deploy-init race window that initialize() had. Sets roles, draw limits, paused=false.
fn __constructor(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
ops: soroban_sdk::Address,
max_draw_per_tx: i128,
throttled_max_draw: i128,
)
Check if address is an allowed hot wallet.
fn is_hot_wallet(env: soroban_sdk::Env, addr: soroban_sdk::Address) -> bool
Add to draw source/destination allowlist — admin only.
fn add_hot_wallet(env: soroban_sdk::Env, addr: soroban_sdk::Address)
Cancel a pending upgrade — admin only.
fn cancel_upgrade(env: soroban_sdk::Env)
Remove partner from allowlist — admin only. Positions preserved for emergency withdraw.
fn remove_partner(env: soroban_sdk::Env, partner: soroban_sdk::Address)
Execute pending WASM upgrade after 24h — admin only.
fn execute_upgrade(env: soroban_sdk::Env)
Propose a WASM upgrade — admin only. Starts 24h timer.
fn propose_upgrade(env: soroban_sdk::Env, new_wasm_hash: soroban_sdk::BytesN<32>)
Set or update partner's deposit cap for a specific asset (M-02). Caps are enforced per (partner, asset). Admin only.
fn set_deposit_cap(
env: soroban_sdk::Env,
partner: soroban_sdk::Address,
asset: soroban_sdk::Address,
new_cap: i128,
)
Get partner position for a specific asset.
fn partner_position(
env: soroban_sdk::Env,
partner: soroban_sdk::Address,
asset_sac: soroban_sdk::Address,
) -> i128
Credit partner position after detecting incoming payment — OPS only. Checks cap + velocity + replay.
fn register_deposit(
env: soroban_sdk::Env,
partner: soroban_sdk::Address,
asset_sac: soroban_sdk::Address,
amount: i128,
tx_ref: soroban_sdk::BytesN<32>,
)
Check if wallet is allowlisted for partner withdrawals.
fn is_partner_wallet(
env: soroban_sdk::Env,
partner: soroban_sdk::Address,
wallet: soroban_sdk::Address,
) -> bool
Remove from allowlist — admin only.
fn remove_hot_wallet(env: soroban_sdk::Env, addr: soroban_sdk::Address)
Add a withdrawal destination for partner — admin only.
fn add_partner_wallet(
env: soroban_sdk::Env,
partner: soroban_sdk::Address,
wallet: soroban_sdk::Address,
)
Emergency withdrawal — partner auth (not OPS). Full balance for given asset. Works while paused and after removal.
fn emergency_withdraw(
env: soroban_sdk::Env,
partner: soroban_sdk::Address,
asset_sac: soroban_sdk::Address,
destination: soroban_sdk::Address,
)
Acknowledge >=15% rate move (single-step OR cumulative across multiple sub-15% updates per M-01), re-enable draws — admin only.
fn admin_override_rate(
env: soroban_sdk::Env,
deposit_asset: soroban_sdk::Address,
payment_asset: soroban_sdk::Address,
)
Get partner's deposit cap for a specific asset (M-02 per-asset cap).
fn partner_deposit_cap(
env: soroban_sdk::Env,
partner: soroban_sdk::Address,
asset: soroban_sdk::Address,
) -> i128
Remove a withdrawal destination for partner — admin only.
fn remove_partner_wallet(
env: soroban_sdk::Env,
partner: soroban_sdk::Address,
wallet: soroban_sdk::Address,
)
Update throttled max draw (5-15% band) — admin only.
fn set_throttled_max_draw(env: soroban_sdk::Env, new_max: i128)