Skip to content

Commit ec40f68

Browse files
authored
Merge pull request #374 from rainlanguage/2024-02-29-new-yaml-structure
utilize new yaml structure
2 parents 778bccf + f15a630 commit ec40f68

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1587
-1920
lines changed

Cargo.lock

Lines changed: 258 additions & 240 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ comfy-table = "7.1.0"
3232
cynic-codegen = { version = "3.4.0", features = ["rkyv"] }
3333
cynic = "3.4.0"
3434
chrono = "0.4.31"
35-
typeshare = "1.0.1"
35+
typeshare = { git = "https://github.com/1password/typeshare", rev = "556b44aafd5304eedf17206800f69834e3820b7c" }
3636
thiserror = "1.0.56"
3737
strict-yaml-rust = "0.1.2"
3838
dotrain = { git = "https://github.com/rainlanguage/dotrain", rev = "b813542cb1c9a2399664a606761f3a3db7b842af" }
@@ -45,7 +45,6 @@ rain-interpreter-eval = { path = "lib/rain.interpreter/crates/eval" }
4545
csv = "1.3.0"
4646
insta = { version = "1.34.0" }
4747
proptest = "1.4.0"
48-
k256 = "=0.13.3"
4948
derive_builder = "0.20.0"
5049

5150
[workspace.dependencies.rain_orderbook_bindings]

crates/bindings/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ homepage.workspace = true
99
[dependencies]
1010
alloy-sol-types = { workspace = true, features = ["json"] }
1111
alloy-primitives = { workspace = true }
12+
serde = { workspace = true }

crates/bindings/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@ use alloy_sol_types::sol;
22

33
sol!(
44
#![sol(all_derives = true)]
5+
#[derive(serde::Serialize, serde::Deserialize)]
56
IOrderBookV3, "../../out/IOrderBookV3.sol/IOrderBookV3.json"
67
);
78

89
sol!(
910
#![sol(all_derives = true)]
1011
IERC20, "../../out/IERC20.sol/IERC20.json"
1112
);
13+
14+
sol!(
15+
#![sol(all_derives = true)]
16+
ERC20, "../../out/ERC20.sol/ERC20.json"
17+
);

crates/cli/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ rain_orderbook_subgraph_client = { workspace = true }
1414
rain_orderbook_bindings = { workspace = true }
1515
rain_orderbook_common = { workspace = true }
1616
rain_orderbook_app_settings = { workspace = true }
17-
serde_yaml = { workspace = true }
1817
anyhow = { workspace = true }
1918
clap = { workspace = true }
2019
reqwest = { workspace = true }

crates/cli/src/commands/chart/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::execute::Execute;
22
use anyhow::{anyhow, Result};
33
use clap::Args;
4-
use rain_orderbook_app_settings::string_structs::ConfigString;
4+
use rain_orderbook_app_settings::{string_structs::ConfigString, Config};
55
use rain_orderbook_common::dotrain::RainDocument;
66
use rain_orderbook_common::fuzz::FuzzRunner;
77
use std::fs::read_to_string;
@@ -22,7 +22,8 @@ impl Execute for Chart {
2222
async fn execute(&self) -> Result<()> {
2323
let dotrain = read_to_string(self.dotrain_file.clone()).map_err(|e| anyhow!(e))?;
2424
let frontmatter = RainDocument::get_front_matter(&dotrain).unwrap();
25-
let config = serde_yaml::from_str::<ConfigString>(frontmatter)?.try_into()?;
25+
let config_string: ConfigString = frontmatter.to_string().try_into()?;
26+
let config: Config = config_string.try_into()?;
2627
let mut fuzzer = FuzzRunner::new(&dotrain, config, None).await;
2728
let chart_data = fuzzer.build_chart_datas().await?;
2829

crates/cli/src/commands/order/add.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@ use crate::{
33
};
44
use anyhow::{anyhow, Result};
55
use clap::Args;
6+
use rain_orderbook_app_settings::Config;
67
use rain_orderbook_common::add_order::AddOrderArgs;
8+
use rain_orderbook_common::frontmatter::parse_frontmatter;
79
use rain_orderbook_common::transaction::TransactionArgs;
810
use std::fs::read_to_string;
11+
use std::ops::Deref;
912
use std::path::PathBuf;
1013
use tracing::info;
1114

@@ -18,22 +21,32 @@ pub struct CliOrderAddArgs {
1821
)]
1922
dotrain_file: PathBuf,
2023

24+
#[arg(short = 'e', long, help = "Deployment key to select from frontmatter")]
25+
deployment: String,
26+
2127
#[clap(flatten)]
2228
pub transaction_args: CliTransactionArgs,
2329
}
2430

25-
impl TryFrom<CliOrderAddArgs> for AddOrderArgs {
26-
type Error = anyhow::Error;
31+
impl CliOrderAddArgs {
32+
async fn to_add_order_args(&self) -> Result<AddOrderArgs> {
33+
let text = read_to_string(&self.dotrain_file).map_err(|e| anyhow!(e))?;
34+
let config: Config = parse_frontmatter(text.clone())?.try_into()?;
35+
let config_deployment = config
36+
.deployments
37+
.get(&self.deployment)
38+
.ok_or(anyhow!("specified deployment is undefined!"))?;
2739

28-
fn try_from(val: CliOrderAddArgs) -> Result<Self> {
29-
let text = read_to_string(val.dotrain_file).map_err(|e| anyhow!(e))?;
30-
Ok(Self { dotrain: text })
40+
Ok(
41+
AddOrderArgs::new_from_deployment(text.clone(), config_deployment.deref().clone())
42+
.await?,
43+
)
3144
}
3245
}
3346

3447
impl Execute for CliOrderAddArgs {
3548
async fn execute(&self) -> Result<()> {
36-
let add_order_args: AddOrderArgs = self.clone().try_into()?;
49+
let add_order_args: AddOrderArgs = self.clone().to_add_order_args().await?;
3750
let mut tx_args: TransactionArgs = self.transaction_args.clone().into();
3851
tx_args.try_fill_chain_id().await?;
3952

crates/common/src/add_order.rs

Lines changed: 98 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
use crate::{
22
dotrain_add_order_lsp::LANG_SERVICES,
3-
frontmatter::{try_parse_frontmatter, FrontmatterError},
43
transaction::{TransactionArgs, TransactionArgsError},
54
};
65
use alloy_ethers_typecast::transaction::{
7-
ReadableClientError, ReadableClientHttp, WritableClientError, WriteTransaction,
8-
WriteTransactionStatus,
6+
ReadContractParameters, ReadableClientError, ReadableClientHttp, WritableClientError,
7+
WriteTransaction, WriteTransactionStatus,
98
};
109
use alloy_primitives::{hex::FromHexError, Address, U256};
11-
use dotrain::{error::ComposeError, RainDocument};
10+
use dotrain::{error::ComposeError, RainDocument, Rebind};
1211
use rain_interpreter_dispair::{DISPair, DISPairError};
1312
use rain_interpreter_parser::{Parser, ParserError, ParserV1};
1413
use rain_metadata::{
1514
ContentEncoding, ContentLanguage, ContentType, Error as RainMetaError, KnownMagic,
1615
RainMetaDocumentV1Item,
1716
};
18-
use rain_orderbook_bindings::IOrderBookV3::{addOrderCall, EvaluableConfigV3, OrderConfigV2};
17+
use rain_orderbook_app_settings::deployment::Deployment;
18+
use rain_orderbook_bindings::{
19+
IOrderBookV3::{addOrderCall, EvaluableConfigV3, OrderConfigV2, IO},
20+
ERC20::decimalsCall,
21+
};
1922
use serde::{Deserialize, Serialize};
2023
use serde_bytes::ByteBuf;
24+
use std::collections::HashMap;
2125
use thiserror::Error;
2226

2327
pub static ORDERBOOK_ORDER_ENTRYPOINTS: [&str; 2] = ["calculate-io", "handle-io"];
@@ -26,8 +30,6 @@ pub static ORDERBOOK_ORDER_ENTRYPOINTS: [&str; 2] = ["calculate-io", "handle-io"
2630
pub enum AddOrderArgsError {
2731
#[error("Empty Front Matter")]
2832
EmptyFrontmatter,
29-
#[error("Front Matter: {0}")]
30-
FrontmatterError(#[from] FrontmatterError),
3133
#[error(transparent)]
3234
DISPairError(#[from] DISPairError),
3335
#[error(transparent)]
@@ -47,40 +49,88 @@ pub enum AddOrderArgsError {
4749
}
4850

4951
#[derive(Serialize, Deserialize, Clone)]
52+
#[serde(rename = "kebab-case")]
5053
pub struct AddOrderArgs {
51-
/// Text of a dotrain file describing an addOrder call
52-
/// Text MUST have strict yaml frontmatter of the following structure
53-
///
54-
/// ```yaml
55-
/// orderbook:
56-
/// order:
57-
/// deployer: 0x1111111111111111111111111111111111111111
58-
/// valid-inputs:
59-
/// - address: 0x2222222222222222222222222222222222222222
60-
/// decimals: 18
61-
/// vault-id: 0x1234
62-
/// valid-outputs:
63-
/// - address: 0x5555555555555555555555555555555555555555
64-
/// decimals: 8
65-
/// vault-id: 0x5678
66-
/// ```
67-
///
68-
/// Text MUST have valid dotrain body succeding frontmatter.
69-
/// The dotrain body must contain two entrypoints: `calulate-io` and `handle-io`.
7054
pub dotrain: String,
55+
pub inputs: Vec<IO>,
56+
pub outputs: Vec<IO>,
57+
pub deployer: Address,
58+
pub bindings: HashMap<String, String>,
7159
}
7260

7361
impl AddOrderArgs {
62+
/// create a new instance from Deployment
63+
pub async fn new_from_deployment(
64+
dotrain: String,
65+
deployment: Deployment,
66+
) -> Result<AddOrderArgs, AddOrderArgsError> {
67+
let mut inputs = vec![];
68+
for input in &deployment.order.inputs {
69+
if let Some(decimals) = input.token.decimals {
70+
inputs.push(IO {
71+
token: input.token.address,
72+
vaultId: input.vault_id,
73+
decimals,
74+
});
75+
} else {
76+
let client = ReadableClientHttp::new_from_url(input.token.network.rpc.to_string())?;
77+
let parameters = ReadContractParameters {
78+
address: input.token.address,
79+
call: decimalsCall {},
80+
block_number: None,
81+
};
82+
let decimals = client.read(parameters).await?._0;
83+
inputs.push(IO {
84+
token: input.token.address,
85+
vaultId: input.vault_id,
86+
decimals,
87+
});
88+
}
89+
}
90+
91+
let mut outputs = vec![];
92+
for output in &deployment.order.inputs {
93+
if let Some(decimals) = output.token.decimals {
94+
outputs.push(IO {
95+
token: output.token.address,
96+
vaultId: output.vault_id,
97+
decimals,
98+
});
99+
} else {
100+
let client =
101+
ReadableClientHttp::new_from_url(output.token.network.rpc.to_string())?;
102+
let parameters = ReadContractParameters {
103+
address: output.token.address,
104+
call: decimalsCall {},
105+
block_number: None,
106+
};
107+
let decimals = client.read(parameters).await?._0;
108+
outputs.push(IO {
109+
token: output.token.address,
110+
vaultId: output.vault_id,
111+
decimals,
112+
});
113+
}
114+
}
115+
116+
Ok(AddOrderArgs {
117+
dotrain: dotrain.to_string(),
118+
inputs,
119+
outputs,
120+
deployer: deployment.scenario.deployer.address,
121+
bindings: deployment.scenario.bindings.to_owned(),
122+
})
123+
}
124+
74125
/// Read parser address from deployer contract, then call parser to parse rainlang into bytecode and constants
75126
async fn try_parse_rainlang(
76127
&self,
77128
rpc_url: String,
78-
deployer: Address,
79129
rainlang: String,
80130
) -> Result<(Vec<u8>, Vec<U256>), AddOrderArgsError> {
81131
let client = ReadableClientHttp::new_from_url(rpc_url)
82132
.map_err(AddOrderArgsError::ReadableClientError)?;
83-
let dispair = DISPair::from_deployer(deployer, client.clone())
133+
let dispair = DISPair::from_deployer(self.deployer, client.clone())
84134
.await
85135
.map_err(AddOrderArgsError::DISPairError)?;
86136

@@ -116,27 +166,29 @@ impl AddOrderArgs {
116166
// Parse file into dotrain document
117167
let meta_store = LANG_SERVICES.meta_store();
118168

119-
let frontmatter = RainDocument::get_front_matter(&self.dotrain)
120-
.ok_or(AddOrderArgsError::EmptyFrontmatter)?;
121-
122-
// Prepare call
123-
let (deployer, valid_inputs, valid_outputs, rebinds) = try_parse_frontmatter(frontmatter)?;
169+
let mut rebinds = None;
170+
if !self.bindings.is_empty() {
171+
rebinds = Some(
172+
self.bindings
173+
.iter()
174+
.map(|(key, value)| Rebind(key.clone(), value.clone()))
175+
.collect(),
176+
);
177+
};
124178

125179
let dotrain_doc =
126180
RainDocument::create(self.dotrain.clone(), Some(meta_store), None, rebinds);
127181
let rainlang = dotrain_doc.compose(&ORDERBOOK_ORDER_ENTRYPOINTS)?;
128182

129-
let (bytecode, constants) = self
130-
.try_parse_rainlang(rpc_url, deployer, rainlang.clone())
131-
.await?;
183+
let (bytecode, constants) = self.try_parse_rainlang(rpc_url, rainlang.clone()).await?;
132184
let meta = self.try_generate_meta(rainlang)?;
133185

134186
Ok(addOrderCall {
135187
config: OrderConfigV2 {
136-
validInputs: valid_inputs,
137-
validOutputs: valid_outputs,
188+
validInputs: self.inputs.clone(),
189+
validOutputs: self.outputs.clone(),
138190
evaluableConfig: EvaluableConfigV3 {
139-
deployer,
191+
deployer: self.deployer,
140192
bytecode,
141193
constants,
142194
},
@@ -182,7 +234,13 @@ max-amount: 100e18,
182234
price: 2e18;
183235
",
184236
);
185-
let args = AddOrderArgs { dotrain: "".into() };
237+
let args = AddOrderArgs {
238+
dotrain: "".into(),
239+
inputs: vec![],
240+
outputs: vec![],
241+
bindings: HashMap::new(),
242+
deployer: Address::default(),
243+
};
186244

187245
let meta_bytes = args.try_generate_meta(dotrain_body).unwrap();
188246
assert_eq!(

0 commit comments

Comments
 (0)