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

Reworks the Buy/Sell order api to support creating multiple identical positions #4817

Closed
wants to merge 1 commit into from
Closed
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
21 changes: 16 additions & 5 deletions crates/bin/pcli/src/command/tx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -954,20 +954,31 @@ impl TxCmd {

tracing::info!(?order);
let source = AddressIndex::new(order.source());
let position = order.as_position(&asset_cache, OsRng)?;
tracing::info!(?position);
let positions = order.as_position(&asset_cache)?;
tracing::info!(?positions);

let plan = Planner::new(OsRng)
for position in &positions {
println!("Position id: {}", position.id());
}

let mut planner = Planner::new(OsRng);
planner
.set_gas_prices(gas_prices)
.set_fee_tier(order.fee_tier().into())
.position_open(position)
.set_fee_tier(order.fee_tier().into());

for position in positions {
planner.position_open(position);
}

let plan = planner
.plan(
app.view
.as_mut()
.context("view service must be initialized")?,
source,
)
.await?;

app.build_and_submit_transaction(plan).await?;
}
TxCmd::Withdraw {
Expand Down
50 changes: 37 additions & 13 deletions crates/bin/pcli/src/command/tx/liquidity_position.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use penumbra_dex::{
},
TradingPair,
};
use rand_core::CryptoRngCore;
use rand_core::OsRng;
Copy link
Contributor

Choose a reason for hiding this comment

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

I wonder if we might not be able to make this use a generic RNG for easier testing


use super::{replicate::ReplicateCmd, FeeTier};

Expand Down Expand Up @@ -104,6 +104,9 @@ pub enum OrderCmd {
/// The selected fee tier to multiply the fee amount by.
#[clap(short, long, default_value_t)]
fee_tier: FeeTier,
/// Duplicate the order for the given number of times.
#[clap(short, long, default_value = "1")]
duplicate: u32,
Copy link
Contributor

Choose a reason for hiding this comment

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

IMO we should change this to something starting with n to match the dutch auctions

},
Sell {
/// The desired sale, formatted as a string, e.g. `[email protected]` would attempt
Expand All @@ -121,6 +124,9 @@ pub enum OrderCmd {
/// The selected fee tier to multiply the fee amount by.
#[clap(short, long, default_value_t)]
fee_tier: FeeTier,
/// Duplicate the order for the given number of times.
#[clap(short, long, default_value = "1")]
duplicate: u32,
},
}

Expand All @@ -146,30 +152,48 @@ impl OrderCmd {
}
}

pub fn as_position<R: CryptoRngCore>(
pub fn duplicate(&self) -> u32 {
match self {
OrderCmd::Buy { duplicate, .. } => *duplicate,
OrderCmd::Sell { duplicate, .. } => *duplicate,
}
}

pub fn as_position(
&self,
// Preserved since we'll need it after denom metadata refactor
_asset_cache: &asset::Cache,
rng: R,
) -> Result<Position> {
let mut position = match self {
) -> Result<Vec<Position>> {
let positions = match self {
OrderCmd::Buy { buy_order, .. } => {
tracing::info!(?buy_order, "parsing buy order");
let order = BuyOrder::parse_str(buy_order)?;
order.into_position(rng)
let mut positions = Vec::new();
for _ in 0..self.duplicate() {
let mut position = order.into_position(OsRng);
if self.is_auto_closing() {
position.close_on_fill = true;
}
positions.push(position);
}
positions
}
OrderCmd::Sell { sell_order, .. } => {
tracing::info!(?sell_order, "parsing sell order");
let order = SellOrder::parse_str(sell_order)?;
order.into_position(rng)
let mut positions = Vec::new();

for _ in 0..self.duplicate() {
let mut position = order.into_position(OsRng);
if self.is_auto_closing() {
position.close_on_fill = true;
}
positions.push(position);
}
positions
}
};
tracing::info!(?position);

if self.is_auto_closing() {
position.close_on_fill = true;
}

Ok(position)
Ok(positions)
}
}