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

Feat/new solver #136

Closed
wants to merge 83 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
f0b5ebc
feat: LogNormalSolver
0xJepsen Apr 2, 2024
a19b93c
wip: save constant sum
0xJepsen Apr 2, 2024
34249eb
feat: constant sum
0xJepsen Apr 2, 2024
3d98aa4
Add `PairSolver` abstract contract to avoid custom allo/deallo delta …
kinrezC Apr 2, 2024
2a8ceec
Merge branch 'fix/spearbit-audit' into solvers
clemlak Apr 3, 2024
46cbea6
chore: natspec
0xJepsen Apr 3, 2024
793697c
Merge branch 'main' into solvers
0xJepsen Apr 3, 2024
16abc1f
chore: bindings
0xJepsen Apr 3, 2024
0f84472
feat: constant sum pool type
0xJepsen Apr 3, 2024
d6f5df7
feat: geometric mean pool type
0xJepsen Apr 3, 2024
d61cb51
feat: log normal pool type
0xJepsen Apr 3, 2024
e36f731
feat: n token geometric mean
0xJepsen Apr 3, 2024
2710bbc
feat: n token geometric mean
0xJepsen Apr 3, 2024
0db5c15
fmt
0xJepsen Apr 3, 2024
d47157f
return abi encoded allo/deallo data
kinrezC Apr 4, 2024
0056bad
feat: n-token bindings + pool types + tests
0xJepsen Apr 4, 2024
c002d1e
feat: n-token pooltype
0xJepsen Apr 4, 2024
b8c246f
feat: deploy n token geometric mean
0xJepsen Apr 4, 2024
9d051f2
feat: generic allocate and deallocate and update
0xJepsen Apr 5, 2024
6692071
feat: token admin
0xJepsen Apr 8, 2024
02a1117
feat: mint request
0xJepsen Apr 8, 2024
1557985
version v0.3.0
Alexangelj Apr 10, 2024
41e38be
Flash swap feature (#123)
Alexangelj Apr 10, 2024
6874aca
Feat/bring back tau (#121)
kinrezC Apr 10, 2024
c182dbd
patch: fix order of setting block.timestamp as lastTimestamp in `Cove…
kinrezC Apr 10, 2024
5b1b5df
patch: fix tests to align with correct block timestamp initialization
kinrezC Apr 11, 2024
3582603
patch: fix capital efficiency test and increase EPSILON to 1000
kinrezC Apr 11, 2024
469e524
Merge branch 'main' into tokenAdmin
clemlak Apr 11, 2024
e93f4c6
feat: add wip ISolver
clemlak Apr 12, 2024
82ac894
chore: amount is now called delta in allocate and deallocate
clemlak Apr 15, 2024
8424e9b
feat: G3MSolver is now using the ISolver interface
clemlak Apr 15, 2024
11c5bc7
test: update G3M deallocate tests
clemlak Apr 15, 2024
4efe611
test: update G3M allocate tests
clemlak Apr 15, 2024
576d171
test: update G3M swap tests
clemlak Apr 15, 2024
13d14c3
test: fix prepare allocation and deallocation params order for G3M tests
clemlak Apr 15, 2024
c8b4e48
feat: add InvalidTokenIndex error to ISolver
clemlak Apr 15, 2024
b1cf6fe
feat: implement ISolver in ConstantSumSolver
clemlak Apr 15, 2024
5f2177d
chore: remove unused Reserves struct in ConstantSumSolver
clemlak Apr 15, 2024
3a1cb57
test: update tests using ConstantSumSolver
clemlak Apr 15, 2024
ffae452
feat: implement ISolver in LogNormalSolver
clemlak Apr 15, 2024
0d6fa61
test: update LogNormal tests
clemlak Apr 15, 2024
f696cc3
feat: implement ISolver in NTokenG3MSolver
clemlak Apr 15, 2024
7b14363
test: update NTokenG3M tests
clemlak Apr 15, 2024
b9decb5
feat: update ISolver getPrice function
clemlak Apr 15, 2024
134fac7
feat: update getPrice in ConstantSumSolver
clemlak Apr 15, 2024
afff6d7
feat: update G3M getPrice function
clemlak Apr 15, 2024
5589b86
feat: update ISolver interface
clemlak Apr 24, 2024
ff4c0b4
feat: update GeometricMeanSolver
clemlak Apr 24, 2024
9483ccc
chore: add NatSpec to ISolver
clemlak Apr 25, 2024
c3a66ad
chore: add prepareInit and getPoolParams mentions in ISolver
clemlak Apr 25, 2024
a85c1b8
feat: update LogNormalSolver with new ISolver
clemlak Apr 25, 2024
93d74c1
feat: update ConstantSumSolver with new ISolver changes
clemlak Apr 25, 2024
507d0ac
feat: update G3MSolver with new ISolver changes
clemlak Apr 25, 2024
f5eb6b3
feat: use IStrategy interface for startegy getter in ISolver
clemlak Apr 25, 2024
30b2b2a
test: update LogNormal getPrice tests
clemlak Apr 25, 2024
7a5f853
feat: import errors from ISolver
clemlak Apr 26, 2024
a46b6f0
feat: add InvalidDeltasLength error to ISolver
clemlak Apr 26, 2024
0644fee
feat: import errors from ISolver in LogNormalSolver
clemlak Apr 26, 2024
5ddbbcd
feat: rework NTokenG3MSolver to fit with new ISolver
clemlak Apr 26, 2024
74275a2
test: update ConstantSum setup
clemlak Apr 26, 2024
6b9e08c
test: use prepareInit for ConstantSumSolver
clemlak Apr 26, 2024
e2993d7
test: use prepareInit for ConstantSumSolver
clemlak Apr 26, 2024
8239eea
test: import NotEnoughLiquidity from ConstantSumSolver file
clemlak Apr 26, 2024
065ac93
test: cast G3M strategy as IStrategy in G3M test setup
clemlak Apr 26, 2024
88930c2
test: update G3M allocate tests with new solver
clemlak Apr 26, 2024
f5dbe25
test: update G3M deallocate tests with new solver
clemlak Apr 26, 2024
890735e
test: use IStrategy type to init G3MSolver
clemlak Apr 26, 2024
1745f77
test: use prepareInit for LogNormal tests
clemlak Apr 26, 2024
5a2d554
test: use getEstimatedPrice in LogNormal allocate tests
clemlak Apr 26, 2024
85f4c2d
test: use IStrategy type to init LogNormal solver
clemlak Apr 26, 2024
8fdd9de
test: update NTokenG3M tests to new solver updates
clemlak Apr 26, 2024
45b2cb1
feat: use ISolver errors in G3MSolver
clemlak Apr 26, 2024
b7b827d
chore: add NatSpec to ConstantSumSolver
clemlak Apr 26, 2024
16b0e1d
chore: update NatSpec, remove unused imports in ConstantSumSolver
clemlak Apr 26, 2024
fb9b7da
chore: move G3M and NTokenG3M READMEs around
clemlak Apr 26, 2024
a504c53
chore: add NatSpec, remove unused imports in G3MSolver
clemlak Apr 26, 2024
df0e589
feat: add token index check in G3M prepareSwap
clemlak Apr 26, 2024
7bbff79
feat: add NatSpec, remove unused functions, add token index checks
clemlak Apr 26, 2024
30882d3
chore: add NatSpec to NTokenG3MSolver
clemlak Apr 26, 2024
1d86f3b
test: update tests with solver changes
clemlak Apr 26, 2024
a9cd91d
test: fix G3M transfer tokens test
clemlak Apr 26, 2024
60146fa
feat: change rounding direction in NTokenG3MSolver
clemlak Apr 26, 2024
58cae0e
Merge branch 'feat/v0.3.0' into feat/new-solver
clemlak Apr 26, 2024
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: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
> Version: `v0.3.0`

# DFMM

This repository contains the smart contracts source code for the DFMM protocol.



## What is DFMM?

The DFMM protocol is a novel portfolio management system designed to leverage external strategy contracts. This system separates the operational logic and the mathematical model: the `DFMM` core contract completely relies on the strategies to validate the state of each interaction. On the other hand, this core contract acts as a single entry point and performs all the operations, such as:
Expand Down
18 changes: 18 additions & 0 deletions kit/src/behaviors/allocate.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#[allow(unused_imports)]
use arbiter_engine::machine::ControlFlow;

use super::*;

#[derive(Debug, Deserialize, Serialize)]
pub struct Allocate {}
#[allow(unused_variables)]
#[async_trait::async_trait]
impl Behavior<()> for Allocate {
async fn startup(
&mut self,
client: Arc<ArbiterMiddleware>,
messager: Messager,
) -> Result<Option<EventStream<()>>> {
Ok(None)
}
}
15 changes: 12 additions & 3 deletions kit/src/behaviors/deployer.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use arbiter_bindings::bindings::weth::WETH;
use arbiter_engine::messager::To;
use bindings::{
constant_sum::ConstantSum, dfmm::DFMM, geometric_mean::GeometricMean, log_normal::LogNormal,
};
Expand All @@ -11,6 +10,7 @@ use super::*;
pub struct Deployer {}
#[derive(Debug, Deserialize, Serialize)]
pub struct DeploymentData {
pub n_token_geometric_mean: Address,
pub weth: Address,
pub dfmm: Address,
pub geometric_mean: Address,
Expand Down Expand Up @@ -48,13 +48,13 @@ impl Behavior<()> for Deployer {
.await?;
trace!("ConstantSum deployed at {:?}", constant_sum.address());

let token_x = arbiter_bindings::bindings::arbiter_token::ArbiterToken::deploy(
let token_x = ArbiterToken::deploy(
client.clone(),
("Token X".to_owned(), "ARBX".to_owned(), 18u8),
)?
.send()
.await?;
let token_y = arbiter_bindings::bindings::arbiter_token::ArbiterToken::deploy(
let token_y = ArbiterToken::deploy(
client.clone(),
("Token Y".to_owned(), "ARBY".to_owned(), 18u8),
)?
Expand All @@ -67,7 +67,12 @@ impl Behavior<()> for Deployer {
token_y.address()
);

let n_token_geometric_mean = GeometricMean::deploy(client.clone(), dfmm.address())?
.send()
.await?;

let deployment_data = DeploymentData {
n_token_geometric_mean: n_token_geometric_mean.address(),
weth: weth.address(),
dfmm: dfmm.address(),
geometric_mean: geometric_mean.address(),
Expand Down Expand Up @@ -141,6 +146,10 @@ mod tests {
Address::from_str("0xaeb166f1355c6254d01a54317ef8d4d21bfcb4b0").unwrap(),
parsed_data.constant_sum
);
assert_eq!(
Address::from_str("0xa4bb88cbfc92d86ae00842dcfa5a1ac32b0714b3").unwrap(),
parsed_data.n_token_geometric_mean
);
} else {
panic!("No message received");
}
Expand Down
19 changes: 16 additions & 3 deletions kit/src/behaviors/mod.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
use std::sync::Arc;

use arbiter_bindings::bindings::arbiter_token::ArbiterToken;
use arbiter_engine::{
machine::{Behavior, CreateStateMachine, Engine, EventStream, StateMachine},
messager::Messager,
machine::{Behavior, ControlFlow, CreateStateMachine, Engine, EventStream, StateMachine},
messager::{Message, Messager, To},
};
use arbiter_macros::Behaviors;
use serde::{Deserialize, Serialize};

use self::deployer::Deployer;
use self::{allocate::Allocate, deployer::Deployer, token_admin::TokenAdmin};
use super::*;

pub mod allocate;
pub mod deployer;
pub mod token_admin;

#[derive(Behaviors, Debug, Deserialize, Serialize)]
pub enum Behaviors {
Allocate(Allocate),
Deployer(Deployer),
TokenAdmin(TokenAdmin),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenData {
pub name: String,
pub symbol: String,
pub decimals: u8,
pub address: Option<eAddress>,
}
128 changes: 128 additions & 0 deletions kit/src/behaviors/token_admin.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
use std::collections::HashMap;

use super::*;

#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct TokenAdmin {
/// The identifier of the token admin.
pub token_data: HashMap<String, TokenData>,
#[serde(skip)]
pub tokens: Option<HashMap<String, ArbiterToken<ArbiterMiddleware>>>,
#[serde(skip)]
pub client: Option<Arc<ArbiterMiddleware>>,
#[serde(skip)]
pub messager: Option<Messager>,
#[serde(default)]
pub count: u64,
#[serde(default = "default_max_count")]
pub max_count: Option<u64>,
}

pub fn default_max_count() -> Option<u64> {
Some(3)
}

/// Used as an action to ask what tokens are available.
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum TokenAdminQuery {
/// Get the address of the token.
AddressOf(String),

/// Mint tokens.
MintRequest(MintRequest),
}

/// Used as an action to mint tokens.
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct MintRequest {
/// The token to mint.
pub token: String,

/// The address to mint to.
pub mint_to: eAddress,

/// The amount to mint.
pub mint_amount: u64,
}

#[async_trait::async_trait]
impl Behavior<Message> for TokenAdmin {
#[tracing::instrument(skip(self), fields(id = messager.id.as_deref()))]
async fn startup(
&mut self,
client: Arc<ArbiterMiddleware>,
messager: Messager,
) -> Result<Option<EventStream<Message>>> {
self.messager = Some(messager.clone());
self.client = Some(client.clone());
for token_data in self.token_data.values_mut() {
let token = ArbiterToken::deploy(
client.clone(),
(
token_data.name.clone(),
token_data.symbol.clone(),
token_data.decimals,
),
)
.unwrap()
.send()
.await
.unwrap();

token_data.address = Some(token.address());
self.tokens
.get_or_insert_with(HashMap::new)
.insert(token_data.name.clone(), token.clone());
}
Ok(None)
}

#[tracing::instrument(skip(self), fields(id =
self.messager.as_ref().unwrap().id.as_deref()))]
async fn process(&mut self, event: Message) -> Result<ControlFlow> {
if self.tokens.is_none() {
error!(
"There were no tokens to deploy! You must add tokens to
the token admin before running the simulation."
);
}

let query: TokenAdminQuery = serde_json::from_str(&event.data).unwrap();
trace!("Got query: {:?}", query);
let messager = self.messager.as_ref().unwrap();
match query {
TokenAdminQuery::AddressOf(token_name) => {
trace!(
"Getting address of token with name: {:?}",
token_name.clone()
);
let token_data = self.token_data.get(&token_name).unwrap();
messager
.send(To::Agent(event.from.clone()), token_data.address)
.await?;
}
TokenAdminQuery::MintRequest(mint_request) => {
trace!("Minting tokens: {:?}", mint_request);
let token = self
.tokens
.as_ref()
.unwrap()
.get(&mint_request.token)
.unwrap();
token
.mint(mint_request.mint_to, eU256::from(mint_request.mint_amount))
.send()
.await
.unwrap()
.await
.unwrap();
self.count += 1;
if self.count == self.max_count.unwrap_or(u64::MAX) {
warn!("Reached max count. Halting behavior.");
return Ok(ControlFlow::Halt);
}
}
}
Ok(ControlFlow::Continue)
}
}
4 changes: 2 additions & 2 deletions kit/src/bindings/arb_math.rs

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions kit/src/bindings/arbiter_token.rs

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions kit/src/bindings/atomic_v2.rs

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions kit/src/bindings/coin.rs

Large diffs are not rendered by default.

Loading
Loading