Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
cad8053
wip on exact swap
thedavidmeister Dec 19, 2025
d479f78
order exact output for take orders
thedavidmeister Dec 19, 2025
c9b02c8
update orderbook int
thedavidmeister Dec 23, 2025
921f588
bump int
thedavidmeister Dec 23, 2025
a4ff8ac
wip on v6
thedavidmeister Dec 23, 2025
0bf8930
wip on ob 6
thedavidmeister Dec 23, 2025
71642d2
wip on compiling
thedavidmeister Dec 26, 2025
51c86e0
v6 compiling
thedavidmeister Dec 26, 2025
7d3a147
Merge branch 'main' into 2025-12-18-exact-swap
thedavidmeister Dec 26, 2025
774e682
rename minimum input error
thedavidmeister Dec 27, 2025
ea43d29
lint
thedavidmeister Dec 27, 2025
9cdbea6
lint
thedavidmeister Dec 27, 2025
63a2682
lint
thedavidmeister Dec 27, 2025
7ac6638
lint
thedavidmeister Dec 27, 2025
7893dba
lint
thedavidmeister Dec 27, 2025
30faaf2
wip on tests
thedavidmeister Dec 28, 2025
8fb6434
foundry lock
thedavidmeister Dec 28, 2025
f03a724
update rain.interpreter
thedavidmeister Dec 28, 2025
65afba9
update tofu
thedavidmeister Dec 28, 2025
89465c3
tofu decimals update
thedavidmeister Dec 28, 2025
f822a10
fix tests
thedavidmeister Dec 28, 2025
d205f66
test max output zero error
thedavidmeister Dec 29, 2025
5e640a0
test maximum output unlimited max
thedavidmeister Dec 30, 2025
6ad1984
limit from order for output max
thedavidmeister Dec 30, 2025
c80a569
test for vault cap on max output
thedavidmeister Dec 30, 2025
4a7e240
fix tests
rouzwelt Dec 30, 2025
8cd8487
Update subgraph.yaml
rouzwelt Dec 31, 2025
432a78e
fmt
rouzwelt Dec 31, 2025
e668c65
fix remote token parse bug
rouzwelt Dec 31, 2025
9b116c9
Merge branch 'main' into 2025-12-18-exact-swap
thedavidmeister Dec 31, 2025
8c53d90
wip on tests
thedavidmeister Jan 1, 2026
579da40
Merge branch '2025-12-18-exact-swap' of github.com:rainlanguage/rain.…
thedavidmeister Jan 1, 2026
0e8dc85
multiple orders max output
thedavidmeister Jan 2, 2026
6c13228
max output tests
thedavidmeister Jan 2, 2026
88104f7
snapshot
thedavidmeister Jan 2, 2026
9bafc9d
lint
thedavidmeister Jan 2, 2026
ed69e74
slither false positive
thedavidmeister Jan 2, 2026
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
511 changes: 260 additions & 251 deletions .gas-snapshot

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion crates/bindings/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ WASM and JS Interop
- `EvaluableV4`: `{ interpreter: string; store: string; bytecode: string; }`
- `SignedContextV1`: `{ signer: string; context: string[]; signature: string; }`
- `TakeOrderConfigV4`: `{ order: OrderV4; inputIOIndex: string; outputIOIndex: string; signedContext: SignedContextV1[]; }`
- `TakeOrdersConfigV4`: `{ minimumInput: string; maximumInput: string; maximumIORatio: string; orders: TakeOrderConfigV4[]; data: string; }`
- `TakeOrdersConfigV5`: `{ minimumIO: string; maximumIO: string; maximumIORatio: string; IOIsInput: string; orders: TakeOrderConfigV4[]; data: string; }`

- Why many fields are `string` in TS
- Large numeric values (e.g., `U256`) are represented as strings to avoid precision issues and to keep interop predictable across JS runtimes. Hex strings are used for byte data. This matches how the rest of the workspace serializes on the boundary.
Expand Down
24 changes: 14 additions & 10 deletions crates/bindings/src/js_api.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::IOrderBookV5::{
EvaluableV4, OrderV4, QuoteV2, SignedContextV1, TakeOrderConfigV4, TakeOrdersConfigV4, IOV2,
use crate::IOrderBookV6::{
EvaluableV4, OrderV4, QuoteV2, SignedContextV1, TakeOrderConfigV4, TakeOrdersConfigV5, IOV2,
};
use wasm_bindgen_utils::{impl_custom_tsify, impl_wasm_traits, prelude::*};

Expand All @@ -9,7 +9,7 @@ impl_wasm_traits!(OrderV4);
impl_wasm_traits!(EvaluableV4);
impl_wasm_traits!(SignedContextV1);
impl_wasm_traits!(TakeOrderConfigV4);
impl_wasm_traits!(TakeOrdersConfigV4);
impl_wasm_traits!(TakeOrdersConfigV5);

impl_custom_tsify!(
IOV2,
Expand Down Expand Up @@ -63,11 +63,12 @@ impl_custom_tsify!(
}"
);
impl_custom_tsify!(
TakeOrdersConfigV4,
"export interface TakeOrdersConfigV4 {
minimumInput: string;
maximumInput: string;
TakeOrdersConfigV5,
"export interface TakeOrdersConfigV5 {
minimumIO: string;
maximumIO: string;
maximumIORatio: string;
IOIsInput: string;
orders: TakeOrderConfigV4[];
data: string;
}"
Expand Down Expand Up @@ -159,17 +160,20 @@ mod tests {

#[wasm_bindgen_test]
fn test_take_orders_config_v4_tsify() {
let js_take_orders_config = to_js_value(&TakeOrdersConfigV4::default()).unwrap();
let js_take_orders_config = to_js_value(&TakeOrdersConfigV5::default()).unwrap();
// validate serialized props match the tsify definition
assert!(JsString::from_str("minimumInput")
assert!(JsString::from_str("minimumIO")
.unwrap()
.js_in(&js_take_orders_config));
assert!(JsString::from_str("maximumInput")
assert!(JsString::from_str("maximumIO")
.unwrap()
.js_in(&js_take_orders_config));
assert!(JsString::from_str("maximumIORatio")
.unwrap()
.js_in(&js_take_orders_config));
assert!(JsString::from_str("IOIsInput")
.unwrap()
.js_in(&js_take_orders_config));
assert!(JsString::from_str("orders")
.unwrap()
.js_in(&js_take_orders_config));
Expand Down
6 changes: 3 additions & 3 deletions crates/bindings/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ use alloy::sol;
sol!(
#![sol(all_derives = true, rpc)]
#![sol(extra_derives(serde::Serialize, serde::Deserialize))]
IOrderBookV5, "../../out/IOrderBookV5.sol/IOrderBookV5.json"
IOrderBookV6, "../../out/IOrderBookV6.sol/IOrderBookV6.json"
);

sol!(
#![sol(all_derives = true)]
#![sol(extra_derives(serde::Serialize, serde::Deserialize))]
OrderBook, "../../out/OrderBook.sol/OrderBook.json"
OrderBook, "../../out/OrderBookV6.sol/OrderBookV6.json"
);

sol!(
Expand Down Expand Up @@ -39,7 +39,7 @@ pub mod wasm_traits;
pub mod topics {
use crate::{
IInterpreterStoreV3::Set,
IOrderBookV5::{
IOrderBookV6::{
AddOrderV3, AfterClearV2, ClearV3, DepositV2, RemoveOrderV3, TakeOrderV3, WithdrawV2,
},
OrderBook::MetaV1_2,
Expand Down
2 changes: 1 addition & 1 deletion crates/cli/src/commands/order/add.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ mod tests {
use super::*;
use alloy::primitives::{address, Address, B256, U256};
use rain_orderbook_app_settings::spec_version::SpecVersion;
use rain_orderbook_bindings::IOrderBookV5::IOV2;
use rain_orderbook_bindings::IOrderBookV6::IOV2;
use std::{collections::HashMap, str::FromStr};
use tempfile::NamedTempFile;

Expand Down
2 changes: 1 addition & 1 deletion crates/cli/src/commands/order/detail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ mod tests {
use super::*;
use alloy::{hex::encode_prefixed, primitives::B256, sol_types::SolValue};
use httpmock::MockServer;
use rain_orderbook_bindings::IOrderBookV5::{OrderV4, IOV2};
use rain_orderbook_bindings::IOrderBookV6::{OrderV4, IOV2};
use serde_json::{json, Value};

#[tokio::test]
Expand Down
2 changes: 1 addition & 1 deletion crates/cli/src/commands/order/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ mod tests {
use super::*;
use alloy::{hex::encode_prefixed, primitives::B256, sol_types::SolValue};
use httpmock::MockServer;
use rain_orderbook_bindings::IOrderBookV5::{OrderV4, IOV2};
use rain_orderbook_bindings::IOrderBookV6::{OrderV4, IOV2};
use serde_json::{json, Value};

#[tokio::test]
Expand Down
16 changes: 8 additions & 8 deletions crates/common/src/add_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ use rain_metadata::{
RainMetaDocumentV1Item,
};
use rain_orderbook_app_settings::deployment::DeploymentCfg;
use rain_orderbook_bindings::IOrderBookV5::{
addOrder3Call, EvaluableV4, OrderConfigV4, TaskV2, IOV2,
use rain_orderbook_bindings::IOrderBookV6::{
addOrder4Call, EvaluableV4, OrderConfigV4, TaskV2, IOV2,
};
use serde::{Deserialize, Serialize};
use serde_bytes::ByteBuf;
Expand Down Expand Up @@ -199,7 +199,7 @@ impl AddOrderArgs {
pub async fn try_into_call(
&self,
rpcs: Vec<String>,
) -> Result<addOrder3Call, AddOrderArgsError> {
) -> Result<addOrder4Call, AddOrderArgsError> {
let rainlang = self.compose_to_rainlang()?;
let bytecode = self
.try_parse_rainlang(rpcs.clone(), rainlang.clone())
Expand Down Expand Up @@ -229,7 +229,7 @@ impl AddOrderArgs {
signedContext: vec![],
};

Ok(addOrder3Call {
Ok(addOrder4Call {
config: OrderConfigV4 {
validInputs: self.inputs.clone(),
validOutputs: self.outputs.clone(),
Expand All @@ -249,7 +249,7 @@ impl AddOrderArgs {
pub async fn get_add_order_call_parameters(
&self,
transaction_args: TransactionArgs,
) -> Result<WriteContractParameters<addOrder3Call>, AddOrderArgsError> {
) -> Result<WriteContractParameters<addOrder4Call>, AddOrderArgsError> {
let add_order_call = self.try_into_call(transaction_args.clone().rpcs).await?;
let params = transaction_args.try_into_write_contract_parameters(
add_order_call,
Expand All @@ -259,7 +259,7 @@ impl AddOrderArgs {
}

#[cfg(not(target_family = "wasm"))]
pub async fn execute<S: Fn(WriteTransactionStatus<addOrder3Call>)>(
pub async fn execute<S: Fn(WriteTransactionStatus<addOrder4Call>)>(
&self,
transaction_args: TransactionArgs,
transaction_status_changed: S,
Expand Down Expand Up @@ -1408,7 +1408,7 @@ _ _: 0 0;
bindings: HashMap::new(),
};

let add_order_call = addOrder3Call {
let add_order_call = addOrder4Call {
config: OrderConfigV4 {
evaluable: EvaluableV4 {
interpreter: *local_evm.interpreter.address(),
Expand Down Expand Up @@ -1498,7 +1498,7 @@ _ _: 0 0;
.unwrap()
.into();

let expected_bytes: Bytes = addOrder3Call {
let expected_bytes: Bytes = addOrder4Call {
config: OrderConfigV4 {
evaluable: EvaluableV4 {
interpreter: *local_evm.interpreter.address(),
Expand Down
14 changes: 7 additions & 7 deletions crates/common/src/deposit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use alloy_ethers_typecast::{WriteTransaction, WriteTransactionStatus};
use rain_math_float::{Float, FloatError};
#[cfg(not(target_family = "wasm"))]
use rain_orderbook_bindings::IERC20::approveCall;
use rain_orderbook_bindings::{IOrderBookV5::deposit3Call, IERC20::allowanceCall};
use rain_orderbook_bindings::{IOrderBookV6::deposit4Call, IERC20::allowanceCall};
use serde::{Deserialize, Serialize};
use thiserror::Error;

Expand Down Expand Up @@ -42,11 +42,11 @@ pub struct DepositArgs {
pub decimals: u8,
}

impl TryFrom<DepositArgs> for deposit3Call {
impl TryFrom<DepositArgs> for deposit4Call {
type Error = FloatError;

fn try_from(val: DepositArgs) -> Result<Self, Self::Error> {
let call = deposit3Call {
let call = deposit4Call {
token: val.token,
vaultId: val.vault_id,
depositAmount: val.amount.get_inner(),
Expand Down Expand Up @@ -111,14 +111,14 @@ impl DepositArgs {

/// Execute OrderbookV3 deposit call
#[cfg(not(target_family = "wasm"))]
pub async fn execute_deposit<S: Fn(WriteTransactionStatus<deposit3Call>)>(
pub async fn execute_deposit<S: Fn(WriteTransactionStatus<deposit4Call>)>(
&self,
transaction_args: TransactionArgs,
transaction_status_changed: S,
) -> Result<(), DepositError> {
let (ledger_client, _) = transaction_args.clone().try_into_ledger_client().await?;

let deposit_call: deposit3Call = self.clone().try_into()?;
let deposit_call: deposit4Call = self.clone().try_into()?;
let params = transaction_args
.try_into_write_contract_parameters(deposit_call, transaction_args.orderbook_address)?;

Expand Down Expand Up @@ -147,7 +147,7 @@ mod tests {
decimals: 6,
};

let deposit_call: deposit3Call = args.try_into().unwrap();
let deposit_call: deposit4Call = args.try_into().unwrap();

assert_eq!(
deposit_call.token,
Expand Down Expand Up @@ -205,7 +205,7 @@ mod tests {
};

let amount = Float::parse("100".to_string()).unwrap().get_inner();
let deposit_call = deposit3Call {
let deposit_call = deposit4Call {
token: Address::ZERO,
vaultId: B256::from(U256::from(42)),
depositAmount: amount,
Expand Down
10 changes: 5 additions & 5 deletions crates/common/src/local_db/address_collectors.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use super::decode::{DecodedEvent, DecodedEventData};
use alloy::primitives::Address;
use rain_orderbook_bindings::IOrderBookV5::OrderV4;
use rain_orderbook_bindings::IOrderBookV6::OrderV4;
use std::collections::BTreeSet;

pub fn collect_token_addresses(
Expand Down Expand Up @@ -68,7 +68,7 @@ mod tests {
use super::*;
use alloy::primitives::{b256, Address, Bytes, FixedBytes, U256};
use rain_orderbook_bindings::IInterpreterStoreV3::Set;
use rain_orderbook_bindings::IOrderBookV5::{
use rain_orderbook_bindings::IOrderBookV6::{
AddOrderV3, DepositV2, OrderV4, RemoveOrderV3, SignedContextV1, TakeOrderConfigV4,
TakeOrderV3, WithdrawV2, IOV2,
};
Expand All @@ -90,7 +90,7 @@ mod tests {
OrderV4 {
owner: Address::from([1u8; 20]),
nonce: U256::from(1).into(),
evaluable: rain_orderbook_bindings::IOrderBookV5::EvaluableV4 {
evaluable: rain_orderbook_bindings::IOrderBookV6::EvaluableV4 {
interpreter: Address::from([2u8; 20]),
store: Address::from([3u8; 20]),
bytecode: alloy::primitives::Bytes::from(vec![]),
Expand Down Expand Up @@ -172,11 +172,11 @@ mod tests {
vaultId: U256::from(0).into(),
});

let clear = rain_orderbook_bindings::IOrderBookV5::ClearV3 {
let clear = rain_orderbook_bindings::IOrderBookV6::ClearV3 {
sender: Address::from([0u8; 20]),
alice,
bob,
clearConfig: rain_orderbook_bindings::IOrderBookV5::ClearConfigV2 {
clearConfig: rain_orderbook_bindings::IOrderBookV6::ClearConfigV2 {
aliceInputIOIndex: U256::from(0),
aliceOutputIOIndex: U256::from(0),
bobInputIOIndex: U256::from(0),
Expand Down
6 changes: 3 additions & 3 deletions crates/common/src/local_db/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use alloy::{
use core::convert::TryFrom;
use rain_orderbook_bindings::{
IInterpreterStoreV3::Set,
IOrderBookV5::{
IOrderBookV6::{
AddOrderV3, AfterClearV2, ClearV3, DepositV2, RemoveOrderV3, TakeOrderV3, WithdrawV2,
},
OrderBook::MetaV1_2,
Expand Down Expand Up @@ -210,11 +210,11 @@ mod test_helpers {
use alloy::hex;
use alloy::primitives::{address, b256, Address, Bytes, FixedBytes, B256, U256};
use rain_orderbook_bindings::{
IOrderBookV5::{
IOrderBookV6::{
AddOrderV3, AfterClearV2, ClearConfigV2, ClearStateChangeV2, ClearV3, DepositV2,
RemoveOrderV3, SignedContextV1, TakeOrderConfigV4, TakeOrderV3, WithdrawV2,
},
IOrderBookV5::{EvaluableV4, OrderV4, IOV2},
IOrderBookV6::{EvaluableV4, OrderV4, IOV2},
OrderBook::MetaV1_2,
};
use serde_json::Value;
Expand Down
2 changes: 1 addition & 1 deletion crates/common/src/local_db/fetch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ mod tests {
use alloy::rpc::types::FilterBlockError;
use alloy::sol_types::SolEvent;
use httpmock::prelude::*;
use rain_orderbook_bindings::{IInterpreterStoreV3::Set, IOrderBookV5::AddOrderV3};
use rain_orderbook_bindings::{IInterpreterStoreV3::Set, IOrderBookV6::AddOrderV3};
use serde_json::json;
use std::str::FromStr;
use std::sync::atomic::{AtomicUsize, Ordering};
Expand Down
4 changes: 2 additions & 2 deletions crates/common/src/local_db/insert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use alloy::{
};
use itertools::Itertools;
use rain_math_float::Float;
use rain_orderbook_bindings::IOrderBookV5::{
use rain_orderbook_bindings::IOrderBookV6::{
AddOrderV3, AfterClearV2, ClearV3, DepositV2, OrderV4, RemoveOrderV3, TakeOrderV3, WithdrawV2,
IOV2,
};
Expand Down Expand Up @@ -968,7 +968,7 @@ mod tests {
use alloy::hex;
use alloy::primitives::{address, b256, Address, Bytes, FixedBytes, B256, U256};
use rain_orderbook_bindings::IInterpreterStoreV3::Set;
use rain_orderbook_bindings::IOrderBookV5::{
use rain_orderbook_bindings::IOrderBookV6::{
ClearConfigV2, ClearStateChangeV2, EvaluableV4, SignedContextV1, TakeOrderConfigV4,
};
use std::collections::HashMap;
Expand Down
4 changes: 2 additions & 2 deletions crates/common/src/local_db/pipeline/adapters/apply.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ mod tests {

fn deposit_event(addr: Address) -> DecodedEventData<DecodedEvent> {
use crate::local_db::decode::EventType;
use rain_orderbook_bindings::IOrderBookV5::DepositV2;
use rain_orderbook_bindings::IOrderBookV6::DepositV2;
DecodedEventData {
event_type: EventType::DepositV2,
block_number: U256::from(1),
Expand All @@ -237,7 +237,7 @@ mod tests {

fn withdraw_event(addr: Address) -> DecodedEventData<DecodedEvent> {
use crate::local_db::decode::EventType;
use rain_orderbook_bindings::IOrderBookV5::WithdrawV2;
use rain_orderbook_bindings::IOrderBookV6::WithdrawV2;
DecodedEventData {
event_type: EventType::WithdrawV2,
block_number: U256::from(0x10),
Expand Down
4 changes: 2 additions & 2 deletions crates/common/src/local_db/pipeline/engine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ mod tests {
token: Address,
tx: u8,
) -> DecodedEventData<DecodedEvent> {
use rain_orderbook_bindings::IOrderBookV5::DepositV2;
use rain_orderbook_bindings::IOrderBookV6::DepositV2;
DecodedEventData {
event_type: EventType::DepositV2,
block_number: U256::from(block),
Expand All @@ -433,7 +433,7 @@ mod tests {
output_token: Address,
tx: u8,
) -> DecodedEventData<DecodedEvent> {
use rain_orderbook_bindings::IOrderBookV5::{AddOrderV3, EvaluableV4, OrderV4, IOV2};
use rain_orderbook_bindings::IOrderBookV6::{AddOrderV3, EvaluableV4, OrderV4, IOV2};
DecodedEventData {
event_type: EventType::AddOrderV3,
block_number: U256::from(block),
Expand Down
2 changes: 1 addition & 1 deletion crates/common/src/raindex_client/remove_orders.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use super::*;
use crate::raindex_client::orders::RaindexOrder;
use alloy::primitives::{hex::decode, Bytes, B256};
use alloy::sol_types::{SolCall, SolValue};
use rain_orderbook_bindings::IOrderBookV5::{removeOrder3Call, OrderV4};
use rain_orderbook_bindings::IOrderBookV6::{removeOrder3Call, OrderV4};
use rain_orderbook_subgraph_client::types::{order_detail_traits::OrderDetailError, Id};
use std::rc::Rc;

Expand Down
Loading