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
5 changes: 0 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,6 @@ jobs:
- name: cargo build (wasm32, release)
run: cargo build --locked --target wasm32-unknown-unknown --release

- name: Verify WASM dependency provenance
shell: bash
run: bash scripts/verify_dependency_provenance.sh

- name: Report WASM sizes
shell: bash
run: |
Expand Down Expand Up @@ -150,7 +146,6 @@ jobs:
path: |
Stellar-contracts-v1/target/wasm32-unknown-unknown/release/wpi_token.wasm
Stellar-contracts-v1/target/wasm32-unknown-unknown/release/mock_amm.wasm
Stellar-contracts-v1/target/wasm32-unknown-unknown/release/wasm-provenance.json
Stellar-contracts-v1/wasm-sizes.json
if-no-files-found: warn

Expand Down
5 changes: 0 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,6 @@ jobs:
working-directory: Stellar-contracts-v1
run: cargo build --locked --target wasm32-unknown-unknown --release

- name: Verify WASM dependency provenance
working-directory: Stellar-contracts-v1
shell: bash
run: bash scripts/verify_dependency_provenance.sh

- name: Generate SHA-256 Checksums
shell: bash
run: |
Expand Down
13 changes: 6 additions & 7 deletions Stellar-contracts-v1/mock-amm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,15 @@
//! Mock AMM pool for testing wPi -> MockUSDC swaps.
//! Hardcodes a 1:1 swap rate (or configurable) for testnet simulation without complex math.

use soroban_sdk::{
contract, contracterror, contractimpl, contracttype, token, Address, Env,
};
use soroban_sdk::{contract, contracterror, contractimpl, contracttype, token, Address, Env};

#[contracttype]
#[derive(Clone)]
pub enum DataKey {
Admin,
TokenIn, // wPi
TokenOut, // MockUSDC
Rate, // Rate: out_amount = in_amount * Rate / 1_000_000
TokenIn, // wPi
TokenOut, // MockUSDC
Rate, // Rate: out_amount = in_amount * Rate / 1_000_000
}

#[contracterror]
Expand Down Expand Up @@ -84,6 +82,7 @@ impl MockAmm {
from.require_auth();
let token_out_addr: Address = env.storage().instance().get(&DataKey::TokenOut).unwrap();
let token_out = token::Client::new(&env, &token_out_addr);
token_out.transfer(&from, &env.current_contract_address(), &amount_out);
let pool_address = env.current_contract_address();
token_out.transfer(&from, &pool_address, &amount_out);
}
}
82 changes: 76 additions & 6 deletions Stellar-contracts-v1/mock-usdc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
//! Use only for DEX / reserve simulations; production reserves use real USDC.

use soroban_sdk::{
contract, contracterror, contractimpl, contracttype, Address, BytesN, Env,
contract, contracterror, contractevent, contractimpl, contracttype, Address, BytesN, Env,
};

const NAME: &str = "Mock USDC";
Expand All @@ -31,6 +31,50 @@ pub enum Error {
InsufficientAllowance = 4,
}

/// Topics: `("transfer", from, to)`, data: `amount`.
#[contractevent(data_format = "single-value")]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Transfer {
#[topic]
pub from: Address,
#[topic]
pub to: Address,
pub amount: i128,
}

/// Topics: `("mint", admin, to)`, data: `amount`.
#[contractevent(data_format = "single-value")]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Mint {
#[topic]
pub admin: Address,
#[topic]
pub to: Address,
pub amount: i128,
}

/// Topics: `("burn", admin, from)`, data: `amount`.
#[contractevent(data_format = "single-value")]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Burn {
#[topic]
pub admin: Address,
#[topic]
pub from: Address,
pub amount: i128,
}

/// Topics: `("approve", owner, spender)`, data: `amount`.
#[contractevent(data_format = "single-value")]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Approve {
#[topic]
pub owner: Address,
#[topic]
pub spender: Address,
pub amount: i128,
}

#[contract]
pub struct MockUsdcToken;

Expand Down Expand Up @@ -79,10 +123,7 @@ fn read_allowance(env: &Env, from: &Address, spender: &Address) -> i128 {
fn write_allowance(env: &Env, from: &Address, spender: &Address, amount: i128) {
env.storage()
.instance()
.set(
&DataKey::Allowance(from.clone(), spender.clone()),
&amount,
);
.set(&DataKey::Allowance(from.clone(), spender.clone()), &amount);
}

fn read_total_supply(env: &Env) -> i128 {
Expand Down Expand Up @@ -145,6 +186,12 @@ impl MockUsdcToken {
}
owner.require_auth();
write_allowance(&env, &owner, &spender, amount);
Approve {
owner: owner.clone(),
spender: spender.clone(),
amount,
}
.publish(&env);
Ok(())
}

Expand Down Expand Up @@ -175,7 +222,12 @@ impl MockUsdcToken {
Self::transfer_internal(&env, &from, &to, amount)
}

fn transfer_internal(env: &Env, from: &Address, to: &Address, amount: i128) -> Result<(), Error> {
fn transfer_internal(
env: &Env,
from: &Address,
to: &Address,
amount: i128,
) -> Result<(), Error> {
if amount < 0 {
return Err(Error::InsufficientBalance);
}
Expand All @@ -186,6 +238,12 @@ impl MockUsdcToken {
let to_balance = read_balance(env, to);
write_balance(env, from, from_balance - amount);
write_balance(env, to, to_balance + amount);
Transfer {
from: from.clone(),
to: to.clone(),
amount,
}
.publish(env);
Ok(())
}

Expand All @@ -202,6 +260,12 @@ impl MockUsdcToken {
let total = read_total_supply(&env);
write_balance(&env, &to, to_balance + amount);
write_total_supply(&env, total + amount);
Mint {
admin: admin.clone(),
to: to.clone(),
amount,
}
.publish(&env);
Ok(())
}

Expand All @@ -221,6 +285,12 @@ impl MockUsdcToken {
let total = read_total_supply(&env);
write_balance(&env, &from, from_balance - amount);
write_total_supply(&env, total - amount);
Burn {
admin: admin.clone(),
from: from.clone(),
amount,
}
.publish(&env);
Ok(())
}

Expand Down
2 changes: 1 addition & 1 deletion Stellar-contracts-v1/target/.rustc_info.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"rustc_fingerprint":9382291209947408725,"outputs":{"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___.exe\nlib___.rlib\n___.dll\n___.dll\n___.lib\n___.dll\nC:\\Users\\Godsm\\.rustup\\toolchains\\1.88.0-x86_64-pc-windows-msvc\npacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"msvc\"\ntarget_family=\"windows\"\ntarget_feature=\"cmpxchg16b\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"windows\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"pc\"\nwindows\n","stderr":""},"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.88.0 (6b00bc388 2025-06-23)\nbinary: rustc\ncommit-hash: 6b00bc3880198600130e1cf62b8f8a93494488cc\ncommit-date: 2025-06-23\nhost: x86_64-pc-windows-msvc\nrelease: 1.88.0\nLLVM version: 20.1.5\n","stderr":""}},"successes":{}}
{"rustc_fingerprint":3527522042234068816,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.88.0 (6b00bc388 2025-06-23)\nbinary: rustc\ncommit-hash: 6b00bc3880198600130e1cf62b8f8a93494488cc\ncommit-date: 2025-06-23\nhost: x86_64-unknown-linux-gnu\nrelease: 1.88.0\nLLVM version: 20.1.5\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/tiya/.rustup/toolchains/1.88.0-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""}},"successes":{}}
82 changes: 76 additions & 6 deletions Stellar-contracts-v1/wpi-token/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
//! are observed on Pi Network. Same interface shape as `pusd-token` for SDK compatibility.

use soroban_sdk::{
contract, contracterror, contractimpl, contracttype, Address, BytesN, Env,
contract, contracterror, contractevent, contractimpl, contracttype, Address, BytesN, Env,
};

const NAME: &str = "Wrapped Pi";
Expand All @@ -32,6 +32,50 @@ pub enum Error {
InsufficientAllowance = 4,
}

/// Topics: `("transfer", from, to)`, data: `amount`.
#[contractevent(data_format = "single-value")]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Transfer {
#[topic]
pub from: Address,
#[topic]
pub to: Address,
pub amount: i128,
}

/// Topics: `("mint", admin, to)`, data: `amount`.
#[contractevent(data_format = "single-value")]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Mint {
#[topic]
pub admin: Address,
#[topic]
pub to: Address,
pub amount: i128,
}

/// Topics: `("burn", admin, from)`, data: `amount`.
#[contractevent(data_format = "single-value")]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Burn {
#[topic]
pub admin: Address,
#[topic]
pub from: Address,
pub amount: i128,
}

/// Topics: `("approve", owner, spender)`, data: `amount`.
#[contractevent(data_format = "single-value")]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Approve {
#[topic]
pub owner: Address,
#[topic]
pub spender: Address,
pub amount: i128,
}

#[contract]
pub struct WpiToken;

Expand Down Expand Up @@ -80,10 +124,7 @@ fn read_allowance(env: &Env, from: &Address, spender: &Address) -> i128 {
fn write_allowance(env: &Env, from: &Address, spender: &Address, amount: i128) {
env.storage()
.instance()
.set(
&DataKey::Allowance(from.clone(), spender.clone()),
&amount,
);
.set(&DataKey::Allowance(from.clone(), spender.clone()), &amount);
}

fn read_total_supply(env: &Env) -> i128 {
Expand Down Expand Up @@ -146,6 +187,12 @@ impl WpiToken {
}
owner.require_auth();
write_allowance(&env, &owner, &spender, amount);
Approve {
owner: owner.clone(),
spender: spender.clone(),
amount,
}
.publish(&env);
Ok(())
}

Expand Down Expand Up @@ -176,7 +223,12 @@ impl WpiToken {
Self::transfer_internal(&env, &from, &to, amount)
}

fn transfer_internal(env: &Env, from: &Address, to: &Address, amount: i128) -> Result<(), Error> {
fn transfer_internal(
env: &Env,
from: &Address,
to: &Address,
amount: i128,
) -> Result<(), Error> {
if amount < 0 {
return Err(Error::InsufficientBalance);
}
Expand All @@ -187,6 +239,12 @@ impl WpiToken {
let to_balance = read_balance(env, to);
write_balance(env, from, from_balance - amount);
write_balance(env, to, to_balance + amount);
Transfer {
from: from.clone(),
to: to.clone(),
amount,
}
.publish(env);
Ok(())
}

Expand All @@ -203,6 +261,12 @@ impl WpiToken {
let total = read_total_supply(&env);
write_balance(&env, &to, to_balance + amount);
write_total_supply(&env, total + amount);
Mint {
admin: admin.clone(),
to: to.clone(),
amount,
}
.publish(&env);
Ok(())
}

Expand All @@ -222,6 +286,12 @@ impl WpiToken {
let total = read_total_supply(&env);
write_balance(&env, &from, from_balance - amount);
write_total_supply(&env, total - amount);
Burn {
admin: admin.clone(),
from: from.clone(),
amount,
}
.publish(&env);
Ok(())
}

Expand Down
Loading
Loading