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
4 changes: 2 additions & 2 deletions .github/workflows/pull-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ name: Pull Request
on:
pull_request:
push:
branches: [mainnet, devel, add_ci]
branches: [mainnet]

jobs:
move-test:
runs-on: ubuntu-latest
container:
image: mysten/sui-tools:mainnet-v1.62.1
image: mysten/sui-tools:mainnet
ports:
- 80
steps:
Expand Down
73 changes: 27 additions & 46 deletions contracts/Move.lock
Original file line number Diff line number Diff line change
@@ -1,48 +1,29 @@
# @generated by Move, please check-in and do not edit manually.
# Generated by move; do not edit
# This file should be checked in.

[move]
version = 3
manifest_digest = "B6D6C734105D94569A4952D271B434F37A5816AB5E868FF6AF09C757B103B56A"
deps_digest = "F9B494B64F0615AED0E98FC12A85B85ECD2BC5185C22D30E7F67786BB52E507C"
dependencies = [
{ id = "Bridge", name = "Bridge" },
{ id = "MoveStdlib", name = "MoveStdlib" },
{ id = "Sui", name = "Sui" },
{ id = "SuiSystem", name = "SuiSystem" },
]

[[move.package]]
id = "Bridge"
source = { git = "https://github.com/MystenLabs/sui.git", rev = "ad937889f2f99bc666b05aaeadccb0d3d7d1f863", subdir = "crates/sui-framework/packages/bridge" }

dependencies = [
{ id = "MoveStdlib", name = "MoveStdlib" },
{ id = "Sui", name = "Sui" },
{ id = "SuiSystem", name = "SuiSystem" },
]

[[move.package]]
id = "MoveStdlib"
source = { git = "https://github.com/MystenLabs/sui.git", rev = "ad937889f2f99bc666b05aaeadccb0d3d7d1f863", subdir = "crates/sui-framework/packages/move-stdlib" }

[[move.package]]
id = "Sui"
source = { git = "https://github.com/MystenLabs/sui.git", rev = "ad937889f2f99bc666b05aaeadccb0d3d7d1f863", subdir = "crates/sui-framework/packages/sui-framework" }

dependencies = [
{ id = "MoveStdlib", name = "MoveStdlib" },
]

[[move.package]]
id = "SuiSystem"
source = { git = "https://github.com/MystenLabs/sui.git", rev = "ad937889f2f99bc666b05aaeadccb0d3d7d1f863", subdir = "crates/sui-framework/packages/sui-system" }

dependencies = [
{ id = "MoveStdlib", name = "MoveStdlib" },
{ id = "Sui", name = "Sui" },
]

[move.toolchain-version]
compiler-version = "1.62.1"
edition = "2024"
flavor = "sui"
version = 4

[pinned.mainnet.MoveStdlib]
source = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/move-stdlib", rev = "868c226359ef914f1f3b080518f27eb13d8967f5" }
use_environment = "mainnet"
manifest_digest = "C4FE4C91DE74CBF223B2E380AE40F592177D21870DC2D7EB6227D2D694E05363"
deps = {}

[pinned.mainnet.Sui]
source = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "868c226359ef914f1f3b080518f27eb13d8967f5" }
use_environment = "mainnet"
manifest_digest = "CD547CB1ACCE0880C835DAED2D8FFCB91D56C833AE5240D3AA5B918398263195"
deps = { MoveStdlib = "MoveStdlib" }

[pinned.mainnet.SuiSystem]
source = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-system", rev = "868c226359ef914f1f3b080518f27eb13d8967f5" }
use_environment = "mainnet"
manifest_digest = "CCBB2DE961DACC94644C65D54E808DEF86BC7E9C42A494D5250CC5F99392E069"
deps = { MoveStdlib = "MoveStdlib", Sui = "Sui" }

[pinned.mainnet.liquid_staking]
source = { root = true }
use_environment = "mainnet"
manifest_digest = "5088FADDD8E68B81993124941C625140D78354C8DCD372C440055B66B7604874"
deps = { std = "MoveStdlib", sui = "Sui", sui_system = "SuiSystem" }
48 changes: 48 additions & 0 deletions contracts/Move.lock.legacy
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# @generated by Move, please check-in and do not edit manually.

[move]
version = 3
manifest_digest = "B6D6C734105D94569A4952D271B434F37A5816AB5E868FF6AF09C757B103B56A"
deps_digest = "F9B494B64F0615AED0E98FC12A85B85ECD2BC5185C22D30E7F67786BB52E507C"
dependencies = [
{ id = "Bridge", name = "Bridge" },
{ id = "MoveStdlib", name = "MoveStdlib" },
{ id = "Sui", name = "Sui" },
{ id = "SuiSystem", name = "SuiSystem" },
]

[[move.package]]
id = "Bridge"
source = { git = "https://github.com/MystenLabs/sui.git", rev = "ad937889f2f99bc666b05aaeadccb0d3d7d1f863", subdir = "crates/sui-framework/packages/bridge" }

dependencies = [
{ id = "MoveStdlib", name = "MoveStdlib" },
{ id = "Sui", name = "Sui" },
{ id = "SuiSystem", name = "SuiSystem" },
]

[[move.package]]
id = "MoveStdlib"
source = { git = "https://github.com/MystenLabs/sui.git", rev = "ad937889f2f99bc666b05aaeadccb0d3d7d1f863", subdir = "crates/sui-framework/packages/move-stdlib" }

[[move.package]]
id = "Sui"
source = { git = "https://github.com/MystenLabs/sui.git", rev = "ad937889f2f99bc666b05aaeadccb0d3d7d1f863", subdir = "crates/sui-framework/packages/sui-framework" }

dependencies = [
{ id = "MoveStdlib", name = "MoveStdlib" },
]

[[move.package]]
id = "SuiSystem"
source = { git = "https://github.com/MystenLabs/sui.git", rev = "ad937889f2f99bc666b05aaeadccb0d3d7d1f863", subdir = "crates/sui-framework/packages/sui-system" }

dependencies = [
{ id = "MoveStdlib", name = "MoveStdlib" },
{ id = "Sui", name = "Sui" },
]

[move.toolchain-version]
compiler-version = "1.62.1"
edition = "2024"
flavor = "sui"
37 changes: 2 additions & 35 deletions contracts/Move.toml
Original file line number Diff line number Diff line change
@@ -1,39 +1,6 @@
[package]
name = "liquid_staking"
edition = "2024" # edition = "legacy" to use legacy (pre-2024) Move
published-at = "0xf89509a8b32205a362921d58a5a0b0bfb13981122a5a0dc49eef7947d4dd21a2"
# license = "" # e.g., "MIT", "GPL", "Apache 2.0"
# authors = ["..."] # e.g., ["Joe Smith ([email protected])", "John Snow ([email protected])"]
edition = "2024"

[dependencies]


# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`.
# Revision can be a branch, a tag, and a commit hash.
# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" }

# For local dependencies use `local = path`. Path is relative to the package root
# Local = { local = "../path/to" }

# To resolve a version conflict and force a specific version for dependency
# override use `override = true`
# Override = { local = "../conflicting/version", override = true }

[addresses]
# liquid_staking = "0x0"
liquid_staking = "0xb49e62ea76f58b8e02e7c31cbb939e9d019a0c2be1c30f3bc58a6249a58f9333"

# Named addresses will be accessible in Move as `@name`. They're also exported:
# for example, `std = "0x1"` is exported by the Standard Library.
# alice = "0xA11CE"

[dev-dependencies]
# The dev-dependencies section allows overriding dependencies for `--test` and
# `--dev` modes. You can introduce test-only dependencies here.
# Local = { local = "../path/to/dev-build" }

[dev-addresses]
# The dev-addresses section allows overwriting named addresses for the `--test`
# and `--dev` modes.
# alice = "0xB0B"

sui_system = { system = "sui_system" }
12 changes: 12 additions & 0 deletions contracts/Published.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Generated by Move
# This file contains metadata about published versions of this package in different environments
# This file SHOULD be committed to source control

[published.mainnet]
chain-id = "35834a8a"
published-at = "0xb49e62ea76f58b8e02e7c31cbb939e9d019a0c2be1c30f3bc58a6249a58f9333"
original-id = "0xb0575765166030556a6eafd3b1b970eba8183ff748860680245b9edd41c716e7"
version = 9
toolchain-version = "1.65.2"
build-config = { flavor = "sui", edition = "2024" }
upgrade-capability = "0x4dc657b6c0fe896f4b94fee1ceac96312dde0a36b94e799caaec30deb53dcd67"
2 changes: 1 addition & 1 deletion contracts/sources/cell.move
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module liquid_staking::cell {
public struct Cell<Element> has store {
element: Option<Element>
element: Option<Element>,
}

public fun new<Element>(element: Element): Cell<Element> {
Expand Down
2 changes: 1 addition & 1 deletion contracts/sources/events.move
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ module liquid_staking::events {
public(package) fun emit_event<T: copy + drop>(event: T) {
event::emit(Event { event });
}
}
}
50 changes: 27 additions & 23 deletions contracts/sources/fees.move
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ module liquid_staking::fees {
staked_sui_redeem_fee_bps: u64, // unused
spread_fee_bps: u64,
custom_redeem_fee_bps: u64, // unused
extra_fields: Bag // in case we add other fees later
extra_fields: Bag, // in case we add other fees later
}

public struct FeeConfigBuilder {
fields: Bag
fields: Bag,
}

public fun sui_mint_fee_bps(fees: &FeeConfig): u64 {
Expand Down Expand Up @@ -65,7 +65,10 @@ module liquid_staking::fees {
self
}

public fun set_staked_sui_redeem_fee_bps(mut self: FeeConfigBuilder, fee: u64): FeeConfigBuilder {
public fun set_staked_sui_redeem_fee_bps(
mut self: FeeConfigBuilder,
fee: u64,
): FeeConfigBuilder {
bag::add(&mut self.fields, b"staked_sui_redeem_fee_bps", fee);
self
}
Expand All @@ -84,7 +87,7 @@ module liquid_staking::fees {
let FeeConfigBuilder { mut fields } = builder;

let fees = FeeConfig {
sui_mint_fee_bps:if (bag::contains(&fields, b"sui_mint_fee_bps")) {
sui_mint_fee_bps: if (bag::contains(&fields, b"sui_mint_fee_bps")) {
bag::remove(&mut fields, b"sui_mint_fee_bps")
} else {
0
Expand Down Expand Up @@ -114,7 +117,7 @@ module liquid_staking::fees {
} else {
0
},
extra_fields: fields
extra_fields: fields,
};

validate_fees(&fees);
Expand All @@ -128,7 +131,7 @@ module liquid_staking::fees {
}

// Note that while it's technically exploitable, we allow lsts to be created with 0 mint/redeem fees.
// This is because having a 0 fee LST is useful in certain cases where mint/redemption can only be done by
// This is because having a 0 fee LST is useful in certain cases where mint/redemption can only be done by
// a single party. It is up to the pool creator to ensure that the fees are set correctly.
fun validate_fees(fees: &FeeConfig) {
assert!(fees.sui_mint_fee_bps <= MAX_BPS, EInvalidFeeConfig);
Expand Down Expand Up @@ -166,7 +169,8 @@ module liquid_staking::fees {
(((sui_amount as u128) * (self.custom_redeem_fee_bps as u128) + 9999) / 10_000) as u64
}

#[test_only] use sui::test_scenario::{Self, Scenario};
#[test_only]
use sui::test_scenario;

#[test]
public fun test_validate_fees_happy() {
Expand All @@ -178,12 +182,12 @@ module liquid_staking::fees {
staked_sui_redeem_fee_bps: 10_000,
spread_fee_bps: 10_000,
custom_redeem_fee_bps: 10_000,
extra_fields: bag::new(scenario.ctx())
extra_fields: bag::new(scenario.ctx()),
};

validate_fees(&fees);

sui::test_utils::destroy(fees);
std::unit_test::destroy(fees);
scenario.end();
}

Expand All @@ -198,12 +202,12 @@ module liquid_staking::fees {
staked_sui_redeem_fee_bps: 10_000,
spread_fee_bps: 10_000,
custom_redeem_fee_bps: 10_000,
extra_fields: bag::new(scenario.ctx())
extra_fields: bag::new(scenario.ctx()),
};

validate_fees(&fees);

sui::test_utils::destroy(fees);
std::unit_test::destroy(fees);
scenario.end();
}

Expand All @@ -217,15 +221,15 @@ module liquid_staking::fees {
staked_sui_redeem_fee_bps: 10_000,
spread_fee_bps: 10_000,
custom_redeem_fee_bps: 10_000,
extra_fields: bag::new(scenario.ctx())
extra_fields: bag::new(scenario.ctx()),
};

assert!(calculate_mint_fee(&fees, 1) == 1, 0);
assert!(calculate_mint_fee(&fees, 99) == 1, 0);
assert!(calculate_mint_fee(&fees, 100) == 1, 0);
assert!(calculate_mint_fee(&fees, 101) == 2, 0);
assert!(calculate_mint_fee(&fees, 1) == 1);
assert!(calculate_mint_fee(&fees, 99) == 1);
assert!(calculate_mint_fee(&fees, 100) == 1);
assert!(calculate_mint_fee(&fees, 101) == 2);

sui::test_utils::destroy(fees);
std::unit_test::destroy(fees);
scenario.end();
}

Expand All @@ -239,15 +243,15 @@ module liquid_staking::fees {
staked_sui_redeem_fee_bps: 10_000,
spread_fee_bps: 10_000,
custom_redeem_fee_bps: 10_000,
extra_fields: bag::new(scenario.ctx())
extra_fields: bag::new(scenario.ctx()),
};

assert!(calculate_redeem_fee(&fees, 1) == 1, 0);
assert!(calculate_redeem_fee(&fees, 99) == 1, 0);
assert!(calculate_redeem_fee(&fees, 100) == 1, 0);
assert!(calculate_redeem_fee(&fees, 101) == 2, 0);
assert!(calculate_redeem_fee(&fees, 1) == 1);
assert!(calculate_redeem_fee(&fees, 99) == 1);
assert!(calculate_redeem_fee(&fees, 100) == 1);
assert!(calculate_redeem_fee(&fees, 101) == 2);

sui::test_utils::destroy(fees);
std::unit_test::destroy(fees);
scenario.end();
}
}
Loading