Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
c7c0e96
implementation sur course
fbielejec Sep 8, 2022
71d9c48
swaps done
fbielejec Sep 8, 2022
9f71ad0
add new role
fbielejec Sep 8, 2022
79b9e0a
added events
fbielejec Sep 8, 2022
974f056
wut
fbielejec Sep 8, 2022
ed2ad45
edited events
fbielejec Sep 8, 2022
56a4b04
set AC
fbielejec Sep 8, 2022
4476eaa
give why
fbielejec Sep 8, 2022
b12d883
docstring
fbielejec Sep 8, 2022
23f0cf3
modified docstring
fbielejec Sep 8, 2022
2012cfe
cleanup
fbielejec Sep 8, 2022
3be6987
Update contracts/simple_dex/lib.rs
fbielejec Sep 14, 2022
99952a4
simplified artihmetic
fbielejec Sep 14, 2022
e4d8211
moved roles to own mod
fbielejec Sep 15, 2022
1e31342
wZERO
fbielejec Sep 15, 2022
67cb4c8
dumbed down LP
fbielejec Sep 15, 2022
ff4e744
slippage check
fbielejec Sep 15, 2022
c2a36fc
check pool composition
fbielejec Sep 15, 2022
71523bf
explicitely check swap fee value that is set
fbielejec Sep 15, 2022
be7a316
change parameter name to avoid confusion, use integer operations
fbielejec Sep 16, 2022
b70278c
not payabale
fbielejec Sep 16, 2022
2c4213c
refactor
fbielejec Sep 16, 2022
d3fef1c
ok semver
fbielejec Sep 16, 2022
7210d54
refactor role check
fbielejec Sep 19, 2022
e767379
remove duplicated check
fbielejec Sep 19, 2022
ab507bf
Update contracts/wrapped_azero/lib.rs
fbielejec Sep 19, 2022
bed038f
remove unused dep
fbielejec Sep 19, 2022
bb854e9
Merge branch 'benjamin' into simple-dex
fbielejec Sep 20, 2022
00224a5
Update contracts/simple_dex/lib.rs
fbielejec Sep 23, 2022
40a42de
Update contracts/simple_dex/lib.rs
fbielejec Sep 23, 2022
65be1ac
added swap pairs
fbielejec Sep 23, 2022
9a67828
edited docstring
fbielejec Sep 23, 2022
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
Prev Previous commit
Next Next commit
change parameter name to avoid confusion, use integer operations
could use promils for better precision but meh
  • Loading branch information
fbielejec committed Sep 16, 2022
commit be7a3162f4b9bf68e246d653e1b5c6b9cb366ef1
51 changes: 31 additions & 20 deletions contracts/simple_dex/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,13 @@ mod simple_dex {
pub struct SwapFeeSet {
#[ink(topic)]
caller: AccountId,
swap_fee: u128,
swap_fee_percentage: u128,
}

#[ink(storage)]
#[derive(SpreadAllocate)]
pub struct SimpleDex {
pub swap_fee: u128,
pub swap_fee_percentage: u128,
pub access_control: AccountId,
// pool tokens
pub tokens: [AccountId; 4],
Expand Down Expand Up @@ -127,7 +127,6 @@ mod simple_dex {
) -> Result<(), DexError> {
let this = self.env().account_id();
let caller = self.env().caller();
let swap_fee = self.swap_fee;

// check if tokens are supported by the pool
if !self.tokens.contains(&token_in) {
Expand Down Expand Up @@ -155,7 +154,7 @@ mod simple_dex {
amount_token_in,
balance_token_in,
balance_token_out,
swap_fee,
self.swap_fee_percentage,
)?;

if balance_token_out < amount_token_out {
Expand Down Expand Up @@ -261,8 +260,11 @@ mod simple_dex {
///
/// Can only be called by the contract's Admin.
#[ink(message)]
pub fn set_swap_fee(&mut self, swap_fee: u128) -> Result<(), DexError> {
if swap_fee.gt(&100) || swap_fee.lt(&0) {
pub fn set_swap_fee_percentage(
&mut self,
swap_fee_percentage: u128,
) -> Result<(), DexError> {
if swap_fee_percentage.gt(&100) {
return Err(DexError::WrongParameterValue);
}

Expand All @@ -280,17 +282,20 @@ mod simple_dex {
// emit event
Self::emit_event(
self.env(),
Event::SwapFeeSet(SwapFeeSet { caller, swap_fee }),
Event::SwapFeeSet(SwapFeeSet {
caller,
swap_fee_percentage,
}),
);

self.swap_fee = swap_fee;
self.swap_fee_percentage = swap_fee_percentage;
Ok(())
}

/// Returns current value of the swap_fee parameter
/// Returns current value of the swap_fee_percentage parameter
#[ink(message)]
pub fn swap_fee(&mut self) -> Balance {
self.swap_fee
pub fn swap_fee_percentage(&mut self) -> Balance {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it have to be &mut?

self.swap_fee_percentage
}

/// Sets access_control to a new contract address
Expand Down Expand Up @@ -352,7 +357,7 @@ mod simple_dex {
fn new_init(&mut self, tokens: [AccountId; 4]) {
self.access_control = AccountId::from(ACCESS_CONTROL_PUBKEY);
self.tokens = tokens;
self.swap_fee = 0;
self.swap_fee_percentage = 0;
}

/// Transfers a given amount of a PSP22 token to a specified using the callers own balance
Expand Down Expand Up @@ -427,30 +432,36 @@ mod simple_dex {
.fire()
}

/// Swap trade output given a curve with equal token weights
///
/// swap_fee_percentage (integer) is a percentage of the trade that goes towards the pool
/// B_0 - (100 * B_0 * B_i) / (100 * (B_i + A_i) -A_i * fee)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just FYI, apparently Balancer deals with 0.0001 fee precision: https://docs.balancer.fi/getting-started/faqs/fees#what-are-the-fees-for-a-trade

fn out_given_in(
amount_token_in: Balance,
balance_token_in: Balance,
balance_token_out: Balance,
swap_fee: u128,
swap_fee_percentage: u128,
) -> Result<Balance, DexError> {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be good to have unit tests for this function. It's standalone (i.e. not hanging off of the contract) so should be relatively easy.

let op0 = amount_token_in
.checked_mul(swap_fee)
.and_then(|result| result.checked_div(100))
.checked_mul(swap_fee_percentage)
.ok_or(DexError::Arithmethic)?;

let op1 = balance_token_in
.checked_add(amount_token_in)
.and_then(|result| result.checked_sub(op0))
.and_then(|result| result.checked_mul(100))
.ok_or(DexError::Arithmethic)?;

let op2 = balance_token_out
.checked_mul(balance_token_in)
let op2 = op1.checked_sub(op0).ok_or(DexError::Arithmethic)?;

let op3 = balance_token_in
.checked_mul(balance_token_out)
.and_then(|result| result.checked_mul(100))
.ok_or(DexError::Arithmethic)?;

let op3 = op2.checked_div(op1).ok_or(DexError::Arithmethic)?;
let op4 = op3.checked_div(op2).ok_or(DexError::Arithmethic)?;

balance_token_out
.checked_sub(op3)
.checked_sub(op4)
.ok_or(DexError::Arithmethic)
}

Expand Down