Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Type fixes #41

Merged
merged 7 commits into from
Nov 17, 2024
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
14 changes: 14 additions & 0 deletions contracts/sprungsui/Move.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[package]
name = "sprungsui"
edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move

[dependencies]
Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/testnet" }

[addresses]
sprungsui = "0x0"

[dev-dependencies]

[dev-addresses]

20 changes: 20 additions & 0 deletions contracts/sprungsui/sources/sprungsui.move
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module sprungsui::sprungsui {
use sui::coin::{Self};

public struct SPRUNGSUI has drop {}

fun init(witness: SPRUNGSUI, ctx: &mut TxContext) {
let (treasury, metadata) = coin::create_currency(
witness,
9,
b"",
b"Staked SUI",
b"",
option::none(),
ctx
);

transfer::public_share_object(metadata);
transfer::public_transfer(treasury, ctx.sender())
}
}
3 changes: 3 additions & 0 deletions contracts/suilend/Move.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ git = "https://github.com/solendprotocol/liquid-staking.git"
subdir = "contracts"
rev = "main"

[dependencies.sprungsui]
local = "../sprungsui"

[addresses]
sui = "0x2"
# suilend = "0x0"
Expand Down
7 changes: 3 additions & 4 deletions contracts/suilend/sources/lending_market.move
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ module suilend::lending_market {
use suilend::liquidity_mining::{Self};
use sui::package;
use sui::sui::SUI;
use suilend::staker::{STAKER};

// === Errors ===
const EIncorrectVersion: u64 = 1;
Expand Down Expand Up @@ -726,19 +725,19 @@ module suilend::lending_market {
}

/* Staker operations */
public fun init_staker<P>(
public fun init_staker<P, S: drop>(
lending_market: &mut LendingMarket<P>,
_: &LendingMarketOwnerCap<P>,
sui_reserve_array_index: u64,
treasury_cap: TreasuryCap<STAKER>,
treasury_cap: TreasuryCap<S>,
ctx: &mut TxContext
) {
assert!(lending_market.version == CURRENT_VERSION, EIncorrectVersion);

let reserve = vector::borrow_mut(&mut lending_market.reserves, sui_reserve_array_index);
assert!(reserve::coin_type(reserve) == type_name::get<SUI>(), EWrongType);

reserve::init_staker<P>(reserve, treasury_cap, ctx);
reserve::init_staker<P, S>(reserve, treasury_cap, ctx);
}

public fun rebalance_staker<P>(
Expand Down
14 changes: 8 additions & 6 deletions contracts/suilend/sources/reserve.move
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,9 @@ module suilend::reserve {
liquidation_bonus
};
use suilend::liquidity_mining::{Self, PoolRewardManager};
use suilend::staker::{Self, Staker, STAKER};
use suilend::staker::{Self, Staker};
use sui_system::sui_system::{SuiSystemState};
use sprungsui::sprungsui::SPRUNGSUI;

// === Errors ===
const EPriceStale: u64 = 0;
Expand Down Expand Up @@ -497,7 +498,7 @@ module suilend::reserve {
request.fee
}

public fun staker<P>(reserve: &Reserve<P>): &Staker {
public fun staker<P, S>(reserve: &Reserve<P>): &Staker<S> {
dynamic_field::borrow(&reserve.id, StakerKey {})
}

Expand Down Expand Up @@ -731,12 +732,13 @@ module suilend::reserve {
liquidity
}

public(package) fun init_staker<P>(
public(package) fun init_staker<P, S: drop>(
reserve: &mut Reserve<P>,
treasury_cap: TreasuryCap<STAKER>,
treasury_cap: TreasuryCap<S>,
ctx: &mut TxContext
) {
assert!(!dynamic_field::exists_(&reserve.id, StakerKey {}), EStakerAlreadyInitialized);
assert!(type_name::get<S>() == type_name::get<SPRUNGSUI>(), EWrongType);

let staker = staker::create_staker(treasury_cap, ctx);
dynamic_field::add(&mut reserve.id, StakerKey {}, staker);
Expand All @@ -754,7 +756,7 @@ module suilend::reserve {
);
let sui = balance::withdraw_all(&mut balances.available_amount);

let staker: &mut Staker = dynamic_field::borrow_mut(&mut reserve.id, StakerKey {});
let staker: &mut Staker<SPRUNGSUI> = dynamic_field::borrow_mut(&mut reserve.id, StakerKey {});

staker::deposit(staker, sui);
staker::rebalance(staker, system_state, ctx);
Expand Down Expand Up @@ -797,7 +799,7 @@ module suilend::reserve {
};
let withdraw_amount = liquidity_request.amount - balance::value(&balances.available_amount);

let staker: &mut Staker = dynamic_field::borrow_mut(&mut reserve.id, StakerKey {});
let staker: &mut Staker<SPRUNGSUI> = dynamic_field::borrow_mut(&mut reserve.id, StakerKey {});
let sui = staker::withdraw(
staker,
withdraw_amount,
Expand Down
61 changes: 22 additions & 39 deletions contracts/suilend/sources/staker.move
Original file line number Diff line number Diff line change
Expand Up @@ -22,58 +22,41 @@ module suilend::staker {
const MIN_DEPLOY_AMOUNT: u64 = 1_000_000; // 1 SUI
const MIST_PER_SUI: u64 = 1_000_000_000;

public struct STAKER has drop {}

fun init(otw: STAKER, ctx: &mut TxContext) {
let (treasury, metadata) = coin::create_currency(
otw,
9,
b"SprungSui",
b"",
b"",
option::none(),
ctx
);

transfer::public_freeze_object(metadata);
transfer::public_transfer(treasury, ctx.sender())
}

public struct Staker has store {
admin: AdminCap<STAKER>,
liquid_staking_info: LiquidStakingInfo<STAKER>,
lst_balance: Balance<STAKER>,
public struct Staker<phantom P> has store {
admin: AdminCap<P>,
liquid_staking_info: LiquidStakingInfo<P>,
lst_balance: Balance<P>,
sui_balance: Balance<SUI>,
liabilities: u64, // how much sui is owed to the reserve
}

/* Public-View Functions */
public(package) fun liabilities(staker: &Staker): u64 {
public(package) fun liabilities<P>(staker: &Staker<P>): u64 {
staker.liabilities
}

public(package) fun lst_balance(staker: &Staker): &Balance<STAKER> {
public(package) fun lst_balance<P>(staker: &Staker<P>): &Balance<P> {
&staker.lst_balance
}

public(package) fun sui_balance(staker: &Staker): &Balance<SUI> {
public(package) fun sui_balance<P>(staker: &Staker<P>): &Balance<SUI> {
&staker.sui_balance
}

// this value can be stale if the staker hasn't refreshed the liquid_staking_info
public(package) fun total_sui_supply(staker: &Staker): u64 {
public(package) fun total_sui_supply<P>(staker: &Staker<P>): u64 {
staker.liquid_staking_info.total_sui_supply() + staker.sui_balance.value()
}

public(package) fun liquid_staking_info(staker: &Staker): &LiquidStakingInfo<STAKER> {
public(package) fun liquid_staking_info<P>(staker: &Staker<P>): &LiquidStakingInfo<P> {
&staker.liquid_staking_info
}

/* Public Mutative Functions */
public(package) fun create_staker(
treasury_cap: TreasuryCap<STAKER>,
public(package) fun create_staker<P: drop>(
treasury_cap: TreasuryCap<P>,
ctx: &mut TxContext
): Staker {
): Staker<P> {
assert!(coin::total_supply(&treasury_cap) == 0, ETreasuryCapNonZeroSupply);

let (admin_cap, liquid_staking_info) = liquid_staking::create_lst(
Expand All @@ -91,16 +74,16 @@ module suilend::staker {
}
}

public(package) fun deposit(
staker: &mut Staker,
public(package) fun deposit<P>(
staker: &mut Staker<P>,
sui: Balance<SUI>,
) {
staker.liabilities = staker.liabilities + sui.value();
staker.sui_balance.join(sui);
}

public(package) fun withdraw(
staker: &mut Staker,
public(package) fun withdraw<P: drop>(
staker: &mut Staker<P>,
withdraw_amount: u64,
system_state: &mut SuiSystemState,
ctx: &mut TxContext
Expand All @@ -118,8 +101,8 @@ module suilend::staker {
sui
}

public(package) fun rebalance(
staker: &mut Staker,
public(package) fun rebalance<P: drop>(
staker: &mut Staker<P>,
system_state: &mut SuiSystemState,
ctx: &mut TxContext
) {
Expand All @@ -146,8 +129,8 @@ module suilend::staker {
);
}

public(package) fun claim_fees(
staker: &mut Staker,
public(package) fun claim_fees<P: drop>(
staker: &mut Staker<P>,
system_state: &mut SuiSystemState,
ctx: &mut TxContext
): Balance<SUI> {
Expand Down Expand Up @@ -178,8 +161,8 @@ module suilend::staker {

// liquid_staking_info must be refreshed before calling this
// this function can unstake slightly more sui than requested due to rounding.
fun unstake_n_sui(
staker: &mut Staker,
fun unstake_n_sui<P: drop>(
staker: &mut Staker<P>,
system_state: &mut SuiSystemState,
sui_amount_out: u64,
ctx: &mut TxContext
Expand Down
34 changes: 17 additions & 17 deletions contracts/suilend/tests/lending_market_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ module suilend::lending_market_tests {
use suilend::lending_market::{Self, create_lending_market, LendingMarketOwnerCap, LendingMarket};
use suilend::mock_pyth::{PriceState};
use sui::sui::SUI;
use suilend::staker::{STAKER};
use sprungsui::sprungsui::SPRUNGSUI;

public struct LENDING_MARKET has drop {}

Expand Down Expand Up @@ -1705,8 +1705,8 @@ module suilend::lending_market_tests {
}, &mut scenario);

clock::set_for_testing(&mut clock, 1 * 1000);
let treasury_cap = coin::create_treasury_cap_for_testing<STAKER>(scenario.ctx());
lending_market::init_staker<LENDING_MARKET>(
let treasury_cap = coin::create_treasury_cap_for_testing<SPRUNGSUI>(scenario.ctx());
lending_market::init_staker(
&mut lending_market,
&owner_cap,
*bag::borrow(&type_to_index, type_name::get<SUI>()),
Expand All @@ -1715,7 +1715,7 @@ module suilend::lending_market_tests {
);

let sui_reserve = lending_market::reserve<LENDING_MARKET, SUI>(&lending_market);
let staker = reserve::staker<LENDING_MARKET>(sui_reserve);
let staker = reserve::staker<LENDING_MARKET, SPRUNGSUI>(sui_reserve);
assert!(staker.total_sui_supply() == 0);
assert!(staker.liabilities() == 0);

Expand All @@ -1728,7 +1728,7 @@ module suilend::lending_market_tests {
);

let sui_reserve = lending_market::reserve<LENDING_MARKET, SUI>(&lending_market);
let staker = reserve::staker<LENDING_MARKET>(sui_reserve);
let staker = reserve::staker<LENDING_MARKET, SPRUNGSUI>(sui_reserve);
assert!(staker.total_sui_supply() == 100 * MIST_PER_SUI);
assert!(staker.liabilities() == 100 * MIST_PER_SUI);

Expand All @@ -1749,12 +1749,12 @@ module suilend::lending_market_tests {
);

let sui_reserve = lending_market::reserve<LENDING_MARKET, SUI>(&lending_market);
let staker = reserve::staker<LENDING_MARKET>(sui_reserve);
let staker = reserve::staker<LENDING_MARKET, SPRUNGSUI>(sui_reserve);
assert!(staker.total_sui_supply() == 200 * MIST_PER_SUI);
assert!(staker.liabilities() == 200 * MIST_PER_SUI);

let sui_reserve = lending_market::reserve<LENDING_MARKET, SUI>(&lending_market);
let staker = reserve::staker<LENDING_MARKET>(sui_reserve);
let staker = reserve::staker<LENDING_MARKET, SPRUNGSUI>(sui_reserve);
std::debug::print(staker);

let liquidity_request = lending_market::redeem_ctokens_and_withdraw_liquidity_request<LENDING_MARKET, SUI>(
Expand Down Expand Up @@ -1783,7 +1783,7 @@ module suilend::lending_market_tests {
assert!(coin::value(&sui) == 100 * MIST_PER_SUI, 0);

let sui_reserve = lending_market::reserve<LENDING_MARKET, SUI>(&lending_market);
let staker = reserve::staker<LENDING_MARKET>(sui_reserve);
let staker = reserve::staker<LENDING_MARKET, SPRUNGSUI>(sui_reserve);
assert!(staker.total_sui_supply() == 100 * MIST_PER_SUI);
assert!(staker.liabilities() == 100 * MIST_PER_SUI);

Expand Down Expand Up @@ -1856,8 +1856,8 @@ module suilend::lending_market_tests {
}, &mut scenario);

clock::set_for_testing(&mut clock, 1 * 1000);
let treasury_cap = coin::create_treasury_cap_for_testing<STAKER>(scenario.ctx());
lending_market::init_staker<LENDING_MARKET>(
let treasury_cap = coin::create_treasury_cap_for_testing<SPRUNGSUI>(scenario.ctx());
lending_market::init_staker(
&mut lending_market,
&owner_cap,
*bag::borrow(&type_to_index, type_name::get<SUI>()),
Expand All @@ -1866,7 +1866,7 @@ module suilend::lending_market_tests {
);

let sui_reserve = lending_market::reserve<LENDING_MARKET, SUI>(&lending_market);
let staker = reserve::staker<LENDING_MARKET>(sui_reserve);
let staker = reserve::staker<LENDING_MARKET, SPRUNGSUI>(sui_reserve);
assert!(staker.total_sui_supply() == 0);
assert!(staker.liabilities() == 0);

Expand Down Expand Up @@ -1971,8 +1971,8 @@ module suilend::lending_market_tests {
}, &mut scenario);

clock::set_for_testing(&mut clock, 1 * 1000);
let treasury_cap = coin::create_treasury_cap_for_testing<STAKER>(scenario.ctx());
lending_market::init_staker<LENDING_MARKET>(
let treasury_cap = coin::create_treasury_cap_for_testing<SPRUNGSUI>(scenario.ctx());
lending_market::init_staker(
&mut lending_market,
&owner_cap,
*bag::borrow(&type_to_index, type_name::get<SUI>()),
Expand All @@ -1981,7 +1981,7 @@ module suilend::lending_market_tests {
);

let sui_reserve = lending_market::reserve<LENDING_MARKET, SUI>(&lending_market);
let staker = reserve::staker<LENDING_MARKET>(sui_reserve);
let staker = reserve::staker<LENDING_MARKET, SPRUNGSUI>(sui_reserve);
assert!(staker.total_sui_supply() == 0);
assert!(staker.liabilities() == 0);

Expand All @@ -1995,7 +1995,7 @@ module suilend::lending_market_tests {
test_scenario::return_shared(system_state);

let sui_reserve = lending_market::reserve<LENDING_MARKET, SUI>(&lending_market);
let staker = reserve::staker<LENDING_MARKET>(sui_reserve);
let staker = reserve::staker<LENDING_MARKET, SPRUNGSUI>(sui_reserve);
assert!(staker.total_sui_supply() == 100 * MIST_PER_SUI);
assert!(staker.sui_balance().value() == 0);
assert!(staker.liabilities() == 100 * MIST_PER_SUI);
Expand All @@ -2013,7 +2013,7 @@ module suilend::lending_market_tests {
test_scenario::return_shared(system_state);

let sui_reserve = lending_market::reserve<LENDING_MARKET, SUI>(&lending_market);
let staker = reserve::staker<LENDING_MARKET>(sui_reserve);
let staker = reserve::staker<LENDING_MARKET, SPRUNGSUI>(sui_reserve);
std::debug::print(&staker.total_sui_supply());
// the extra 50 sui gained has been transferred to the fees balance already
assert!(staker.total_sui_supply() == 101 * MIST_PER_SUI);
Expand All @@ -2039,4 +2039,4 @@ module suilend::lending_market_tests {
test_utils::destroy(type_to_index);
test_scenario::end(scenario);
}
}
}
Loading
Loading