Skip to content

Commit

Permalink
Merge pull request #639 from rainlanguage/2024-05-13-remove-order-fix
Browse files Browse the repository at this point in the history
using orderJSONstring for the OrderV2 conversion
  • Loading branch information
hardyjosh committed May 13, 2024
2 parents 8101cb8 + 1d0a599 commit abf3f17
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 22 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/subgraph/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ reqwest = { workspace = true }
thiserror = { workspace = true }
typeshare = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
alloy-primitives = { workspace = true }
rain_orderbook_bindings = { workspace = true }
chrono = { workspace = true }
Expand Down
2 changes: 2 additions & 0 deletions crates/subgraph/src/types/order_detail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ pub struct Order {
pub valid_inputs: Option<Vec<Io>>,
pub valid_outputs: Option<Vec<Io>>,
pub meta: Option<RainMetaV1>,
#[cynic(rename = "orderJSONString")]
pub order_json: String,
}

#[typeshare]
Expand Down
118 changes: 96 additions & 22 deletions crates/subgraph/src/types/order_detail_traits.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::types::order_detail;
use crate::utils::base10_str_to_u256;
use alloy_primitives::U256;
use alloy_primitives::{hex::FromHexError, ruint::ParseError, Address};
use rain_orderbook_bindings::IOrderBookV3::{EvaluableV2, OrderV2, IO};
use std::num::TryFromIntError;
Expand All @@ -12,7 +13,11 @@ pub enum OrderDetailError {
#[error(transparent)]
TryFromIntError(#[from] TryFromIntError),
#[error(transparent)]
ParseIntError(#[from] std::num::ParseIntError),
#[error(transparent)]
ParseError(#[from] ParseError),
#[error(transparent)]
SerdeJson(#[from] serde_json::Error),
}

impl TryInto<IO> for order_detail::Io {
Expand All @@ -33,26 +38,51 @@ impl TryInto<IO> for order_detail::Io {
impl TryInto<OrderV2> for order_detail::Order {
type Error = OrderDetailError;

fn try_into(self) -> Result<OrderV2, OrderDetailError> {
fn try_into(self) -> Result<OrderV2, Self::Error> {
let parsed: serde_json::Value = serde_json::from_str(&self.order_json)?;
Ok(OrderV2 {
owner: self.owner.id.0.parse::<Address>()?,
handleIO: self.handle_io,
owner: parsed["owner"]
.as_str()
.unwrap_or_default()
.parse::<Address>()?,
handleIO: parsed["handleIo"].as_bool().unwrap_or_default(),
evaluable: EvaluableV2 {
interpreter: self.interpreter.0.parse::<Address>()?,
store: self.interpreter_store.0.parse::<Address>()?,
expression: self.expression.0.parse::<Address>()?,
interpreter: parsed["evaluable"]["interpreter"]
.as_str()
.unwrap_or_default()
.parse::<Address>()?,
store: parsed["evaluable"]["store"]
.as_str()
.unwrap_or_default()
.parse::<Address>()?,
expression: parsed["evaluable"]["expression"]
.as_str()
.unwrap_or_default()
.parse::<Address>()?,
},
validInputs: self
.valid_inputs
.unwrap_or_default()
.into_iter()
.map(|v| v.try_into())
validInputs: parsed["validInputs"]
.as_array()
.unwrap_or(&vec![])
.iter()
.map(|v| {
Ok(IO {
token: v["token"].as_str().unwrap_or_default().parse::<Address>()?,
decimals: v["decimals"].as_str().unwrap_or_default().parse::<u8>()?,
vaultId: v["vaultId"].as_str().unwrap_or_default().parse::<U256>()?,
})
})
.collect::<Result<Vec<IO>, OrderDetailError>>()?,
validOutputs: self
.valid_outputs
.unwrap_or_default()
.into_iter()
.map(|v| v.try_into())
validOutputs: parsed["validOutputs"]
.as_array()
.unwrap_or(&vec![])
.iter()
.map(|v| {
Ok(IO {
token: v["token"].as_str().unwrap_or_default().parse::<Address>()?,
decimals: v["decimals"].as_str().unwrap_or_default().parse::<u8>()?,
vaultId: v["vaultId"].as_str().unwrap_or_default().parse::<U256>()?,
})
})
.collect::<Result<Vec<IO>, OrderDetailError>>()?,
})
}
Expand All @@ -68,6 +98,8 @@ mod tests {
#[test]
fn test_try_into_call() {
let order_detail = order_detail::Order {
// This is a dummy order detail object
// All of these values are actually ignored by the conversion
id: "1".into(),
owner: Account {
id: Bytes("0x0000000000000000000000000000000000000001".into()),
Expand Down Expand Up @@ -117,46 +149,88 @@ mod tests {
meta_bytes: Bytes("0x1".into()),
content: vec![],
}),
// This is the JSON string that will actually be used for the conversion
order_json: "{\"owner\":\"0x77199602114bdecb272ac9d5038d7e01cccec362\",\"handleIo\":true,\"evaluable\":{\"interpreter\":\"0xa10ac76b0681d3e8ca826b0a10299b99b2eb2452\",\"store\":\"0x948533c15d2d9eba8cec4deb0b72662cf57d4db1\",\"expression\":\"0x3c7e0efd0cf9bd539221eb15d9da4b9d97f8837b\"},\"validInputs\":[{\"token\":\"0x96b41289d90444b8add57e6f265db5ae8651df29\",\"decimals\":\"6\",\"vaultId\":\"0xb39eed084711b7e383c97ae5a9e0aa76e01f7a641457726ebfd912fe33dd67f5\"},{\"token\":\"0x1d80c49bbbcd1c0911346656b529df9e5c2f783d\",\"decimals\":\"18\",\"vaultId\":\"0xb39eed084711b7e383c97ae5a9e0aa76e01f7a641457726ebfd912fe33dd67f5\"}],\"validOutputs\":[{\"token\":\"0x1d80c49bbbcd1c0911346656b529df9e5c2f783d\",\"decimals\":\"18\",\"vaultId\":\"0xb39eed084711b7e383c97ae5a9e0aa76e01f7a641457726ebfd912fe33dd67f5\"},{\"token\":\"0x96b41289d90444b8add57e6f265db5ae8651df29\",\"decimals\":\"6\",\"vaultId\":\"0xb39eed084711b7e383c97ae5a9e0aa76e01f7a641457726ebfd912fe33dd67f5\"}]}".into()
};

let order_v2: OrderV2 = order_detail.try_into().unwrap();

assert_eq!(
order_v2.owner,
"0x0000000000000000000000000000000000000001"
"0x77199602114bdecb272ac9d5038d7e01cccec362"
.parse::<Address>()
.unwrap()
);
assert!(order_v2.handleIO);
assert_eq!(
order_v2.evaluable.interpreter,
"0x0000000000000000000000000000000000000002"
"0xa10ac76b0681d3e8ca826b0a10299b99b2eb2452"
.parse::<Address>()
.unwrap()
);
assert_eq!(
order_v2.evaluable.store,
"0x0000000000000000000000000000000000000003"
"0x948533c15d2d9eba8cec4deb0b72662cf57d4db1"
.parse::<Address>()
.unwrap()
);
assert_eq!(
order_v2.evaluable.expression,
"0x0000000000000000000000000000000000000004"
"0x3c7e0efd0cf9bd539221eb15d9da4b9d97f8837b"
.parse::<Address>()
.unwrap()
);
assert_eq!(
order_v2.validInputs[0].token,
"0x0000000000000000000000000000000000000005"
"0x96b41289d90444b8add57e6f265db5ae8651df29"
.parse::<Address>()
.unwrap()
);
assert_eq!(order_v2.validInputs[0].decimals, 6);
assert_eq!(
order_v2.validInputs[0].vaultId,
"0xb39eed084711b7e383c97ae5a9e0aa76e01f7a641457726ebfd912fe33dd67f5"
.parse::<U256>()
.unwrap()
);
assert_eq!(
order_v2.validInputs[1].token,
"0x1d80c49bbbcd1c0911346656b529df9e5c2f783d"
.parse::<Address>()
.unwrap()
);
assert_eq!(order_v2.validInputs[1].decimals, 18);
assert_eq!(
order_v2.validInputs[1].vaultId,
"0xb39eed084711b7e383c97ae5a9e0aa76e01f7a641457726ebfd912fe33dd67f5"
.parse::<U256>()
.unwrap()
);
assert_eq!(
order_v2.validOutputs[0].token,
"0x0000000000000000000000000000000000000006"
"0x1d80c49bbbcd1c0911346656b529df9e5c2f783d"
.parse::<Address>()
.unwrap()
);
assert_eq!(order_v2.validOutputs[0].decimals, 18);
assert_eq!(
order_v2.validOutputs[0].vaultId,
"0xb39eed084711b7e383c97ae5a9e0aa76e01f7a641457726ebfd912fe33dd67f5"
.parse::<U256>()
.unwrap()
);
assert_eq!(
order_v2.validOutputs[1].token,
"0x96b41289d90444b8add57e6f265db5ae8651df29"
.parse::<Address>()
.unwrap()
);
assert_eq!(order_v2.validOutputs[1].decimals, 6);
assert_eq!(
order_v2.validOutputs[1].vaultId,
"0xb39eed084711b7e383c97ae5a9e0aa76e01f7a641457726ebfd912fe33dd67f5"
.parse::<U256>()
.unwrap()
);
}
}

0 comments on commit abf3f17

Please sign in to comment.