diff --git a/api-server/scanner-lib/src/blockchain_state/mod.rs b/api-server/scanner-lib/src/blockchain_state/mod.rs index 881b7ef04..ef20bda99 100644 --- a/api-server/scanner-lib/src/blockchain_state/mod.rs +++ b/api-server/scanner-lib/src/blockchain_state/mod.rs @@ -651,8 +651,8 @@ async fn calculate_tx_fee_and_collect_token_info( OrderAccountCommand::FillOrder(order_id, _, _) | OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => { let order = db_tx.get_order(*order_id).await?.expect("must exist"); match order.ask_currency { @@ -934,8 +934,8 @@ async fn prefetch_orders( OrderAccountCommand::FillOrder(order_id, _, _) | OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => { let order = db_tx.get_order(*order_id).await?.expect("must be present "); let order_data = to_order_data(&order); @@ -1328,8 +1328,8 @@ async fn update_tables_from_transaction_inputs( } OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => { let order = db_tx.get_order(*order_id).await?.expect("must exist"); let order = order.conclude(); diff --git a/api-server/stack-test-suite/tests/v2/orders.rs b/api-server/stack-test-suite/tests/v2/orders.rs index fc246642d..d46cd760e 100644 --- a/api-server/stack-test-suite/tests/v2/orders.rs +++ b/api-server/stack-test-suite/tests/v2/orders.rs @@ -90,8 +90,8 @@ async fn create_fill_conclude_order(#[case] seed: Seed) { .add_input( TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: Amount::from_atoms(1), - give_balance: Amount::from_atoms(9), + filled_amount: Amount::from_atoms(1), + remaining_give_amount: Amount::from_atoms(9), }), InputWitness::NoSignature(None), ) diff --git a/api-server/web-server/src/api/json_helpers.rs b/api-server/web-server/src/api/json_helpers.rs index 75f21f63e..bb8fc1793 100644 --- a/api-server/web-server/src/api/json_helpers.rs +++ b/api-server/web-server/src/api/json_helpers.rs @@ -330,15 +330,15 @@ pub fn tx_input_to_json(inp: &TxInput, chain_config: &ChainConfig) -> serde_json } OrderAccountCommand::ConcludeOrder { order_id, - ask_balance, - give_balance, + filled_amount, + remaining_give_amount, } => { json!({ "input_type": "OrderAccountCommand", "command": "ConcludeOrder", "order_id": Address::new(chain_config, *order_id).expect("addressable").to_string(), - "ask_atoms": json!({"atoms": ask_balance.into_atoms().to_string()}), - "give_atoms": json!({"atoms": give_balance.into_atoms().to_string()}), + "filled_atoms": json!({"atoms": filled_amount.into_atoms().to_string()}), + "remaining_give_atoms": json!({"atoms": remaining_give_amount.into_atoms().to_string()}), }) } }, diff --git a/chainstate/constraints-value-accumulator/src/constraints_accumulator.rs b/chainstate/constraints-value-accumulator/src/constraints_accumulator.rs index bd0c46988..bd8c457dc 100644 --- a/chainstate/constraints-value-accumulator/src/constraints_accumulator.rs +++ b/chainstate/constraints-value-accumulator/src/constraints_accumulator.rs @@ -338,8 +338,8 @@ impl ConstrainedValueAccumulator { ), OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => self.process_conclude_order_command(*order_id, orders_accounting_delta), } } diff --git a/chainstate/src/detail/ban_score.rs b/chainstate/src/detail/ban_score.rs index e678552e1..0e2314137 100644 --- a/chainstate/src/detail/ban_score.rs +++ b/chainstate/src/detail/ban_score.rs @@ -143,6 +143,7 @@ impl BanScore for ConnectTransactionError { ConnectTransactionError::InputCheck(e) => e.ban_score(), ConnectTransactionError::OrdersAccountingError(err) => err.ban_score(), ConnectTransactionError::AttemptToCreateOrderFromAccounts => 100, + ConnectTransactionError::ConcludeInputAmountsDoesntMatch(_, _) => 100, } } } diff --git a/chainstate/src/detail/error_classification.rs b/chainstate/src/detail/error_classification.rs index 60815dcda..43fc5fbcd 100644 --- a/chainstate/src/detail/error_classification.rs +++ b/chainstate/src/detail/error_classification.rs @@ -301,7 +301,8 @@ impl BlockProcessingErrorClassification for ConnectTransactionError { | ConnectTransactionError::IOPolicyError(_, _) | ConnectTransactionError::TotalFeeRequiredOverflow | ConnectTransactionError::InsufficientCoinsFee(_, _) - | ConnectTransactionError::AttemptToSpendFrozenToken(_) => { + | ConnectTransactionError::AttemptToSpendFrozenToken(_) + | ConnectTransactionError::ConcludeInputAmountsDoesntMatch(_, _) => { BlockProcessingErrorClass::BadBlock } diff --git a/chainstate/src/rpc/types/account.rs b/chainstate/src/rpc/types/account.rs index 6b15cd2e4..252f9691f 100644 --- a/chainstate/src/rpc/types/account.rs +++ b/chainstate/src/rpc/types/account.rs @@ -141,8 +141,8 @@ impl RpcAccountCommand { pub enum RpcOrderAccountCommand { ConcludeOrder { order_id: RpcAddress, - ask_balance: RpcAmountOut, - give_balance: RpcAmountOut, + filled_amount: RpcAmountOut, + remaining_give_amount: RpcAmountOut, }, FillOrder { order_id: RpcAddress, @@ -159,13 +159,16 @@ impl RpcOrderAccountCommand { let result = match command { OrderAccountCommand::ConcludeOrder { order_id, - ask_balance, - give_balance, + filled_amount, + remaining_give_amount, } => RpcOrderAccountCommand::ConcludeOrder { order_id: RpcAddress::new(chain_config, *order_id)?, - ask_balance: RpcAmountOut::from_amount(*ask_balance, chain_config.coin_decimals()), - give_balance: RpcAmountOut::from_amount( - *give_balance, + filled_amount: RpcAmountOut::from_amount( + *filled_amount, + chain_config.coin_decimals(), + ), + remaining_give_amount: RpcAmountOut::from_amount( + *remaining_give_amount, chain_config.coin_decimals(), ), }, diff --git a/chainstate/test-framework/src/random_tx_maker.rs b/chainstate/test-framework/src/random_tx_maker.rs index 006b1083e..08d8022dc 100644 --- a/chainstate/test-framework/src/random_tx_maker.rs +++ b/chainstate/test-framework/src/random_tx_maker.rs @@ -536,8 +536,8 @@ impl<'a> RandomTxMaker<'a> { result_inputs.push(TxInput::OrderAccountCommand( OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: current_ask_balance, - give_balance: filled_amount, + filled_amount, + remaining_give_amount: available_give_balance, }, )); diff --git a/chainstate/test-framework/src/signature_destination_getter.rs b/chainstate/test-framework/src/signature_destination_getter.rs index 9a0653532..a32777625 100644 --- a/chainstate/test-framework/src/signature_destination_getter.rs +++ b/chainstate/test-framework/src/signature_destination_getter.rs @@ -190,8 +190,8 @@ impl<'a> SignatureDestinationGetter<'a> { OrderAccountCommand::FillOrder(_, _, d) => Ok(d.clone()), OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => { let order_data = orders_view .get_order_data(order_id) diff --git a/chainstate/test-suite/src/tests/orders_tests.rs b/chainstate/test-suite/src/tests/orders_tests.rs index 96f4faf88..ab8be07c0 100644 --- a/chainstate/test-suite/src/tests/orders_tests.rs +++ b/chainstate/test-suite/src/tests/orders_tests.rs @@ -487,8 +487,8 @@ fn conclude_order_check_storage(#[case] seed: Seed, #[case] version: OrdersVersi ), OrdersVersion::V1 => TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: ask_amount, - give_balance: give_amount, + filled_amount: Amount::ZERO, + remaining_give_amount: give_amount, }), }; let tx = TransactionBuilder::new() @@ -549,8 +549,8 @@ fn conclude_order_multiple_txs(#[case] seed: Seed, #[case] version: OrdersVersio ), OrdersVersion::V1 => TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: ask_amount, - give_balance: give_amount, + filled_amount: Amount::ZERO, + remaining_give_amount: give_amount, }), }; let tx1 = TransactionBuilder::new() @@ -568,8 +568,8 @@ fn conclude_order_multiple_txs(#[case] seed: Seed, #[case] version: OrdersVersio ), OrdersVersion::V1 => TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: (ask_amount - Amount::from_atoms(1)).unwrap(), // avoid duplicating input in a block - give_balance: give_amount, + filled_amount: Amount::ZERO, + remaining_give_amount: give_amount, }), }; let tx2 = TransactionBuilder::new() @@ -581,22 +581,37 @@ fn conclude_order_multiple_txs(#[case] seed: Seed, #[case] version: OrdersVersio .build(); let tx2_id = tx2.transaction().get_id(); - let res = tf - .make_block_builder() - .with_transactions(vec![tx1, tx2]) - .build_and_process(&mut rng); + let block = tf.make_block_builder().with_transactions(vec![tx1, tx2]).build(&mut rng); + let block_id = block.get_id(); + let res = tf.process_block(block, chainstate::BlockSource::Local); - assert_eq!( - res.unwrap_err(), - chainstate::ChainstateError::ProcessBlockError( - chainstate::BlockError::StateUpdateFailed( - ConnectTransactionError::ConstrainedValueAccumulatorError( - orders_accounting::Error::OrderDataNotFound(order_id).into(), - tx2_id.into() + match version { + OrdersVersion::V0 => { + assert_eq!( + res.unwrap_err(), + chainstate::ChainstateError::ProcessBlockError( + chainstate::BlockError::StateUpdateFailed( + ConnectTransactionError::ConstrainedValueAccumulatorError( + orders_accounting::Error::OrderDataNotFound(order_id).into(), + tx2_id.into() + ) + ) ) - ) - ) - ); + ); + } + OrdersVersion::V1 => { + assert_eq!( + res.unwrap_err(), + chainstate::ChainstateError::ProcessBlockError( + chainstate::BlockError::CheckBlockFailed( + chainstate::CheckBlockError::CheckTransactionFailed( + CheckBlockTransactionsError::DuplicateInputInBlock(block_id) + ) + ) + ) + ); + } + } }); } @@ -814,8 +829,8 @@ fn fill_partially_then_conclude(#[case] seed: Seed, #[case] version: OrdersVersi OrdersVersion::V1 => { TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: ask_amount, - give_balance: give_amount, + filled_amount: fill_amount, + remaining_give_amount: (give_amount - filled_amount).unwrap(), }) } }; @@ -859,8 +874,8 @@ fn fill_partially_then_conclude(#[case] seed: Seed, #[case] version: OrdersVersi OrdersVersion::V1 => { TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: ask_amount, - give_balance: give_amount, + filled_amount: fill_amount, + remaining_give_amount: (give_amount - filled_amount).unwrap(), }) } }; @@ -897,8 +912,8 @@ fn fill_partially_then_conclude(#[case] seed: Seed, #[case] version: OrdersVersi ), OrdersVersion::V1 => TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: ask_amount, - give_balance: give_amount, + filled_amount: fill_amount, + remaining_give_amount: (give_amount - filled_amount).unwrap(), }), }; let tx = TransactionBuilder::new() @@ -1232,8 +1247,8 @@ fn fill_completely_then_conclude(#[case] seed: Seed, #[case] version: OrdersVers OrdersVersion::V1 => { TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: ask_amount, - give_balance: give_amount, + filled_amount: ask_amount, + remaining_give_amount: Amount::ZERO, }) } }; @@ -1266,8 +1281,8 @@ fn fill_completely_then_conclude(#[case] seed: Seed, #[case] version: OrdersVers ), OrdersVersion::V1 => TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: ask_amount, - give_balance: give_amount, + filled_amount: ask_amount, + remaining_give_amount: Amount::ZERO, }), }; let tx = TransactionBuilder::new() @@ -1333,8 +1348,8 @@ fn conclude_order_check_signature(#[case] seed: Seed, #[case] version: OrdersVer OrdersVersion::V1 => { TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: ask_amount, - give_balance: give_amount, + filled_amount: Amount::ZERO, + remaining_give_amount: give_amount, }) } }; @@ -1370,8 +1385,8 @@ fn conclude_order_check_signature(#[case] seed: Seed, #[case] version: OrdersVer OrdersVersion::V1 => { TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: ask_amount, - give_balance: give_amount, + filled_amount: Amount::ZERO, + remaining_give_amount: give_amount, }) } }; @@ -1428,8 +1443,8 @@ fn conclude_order_check_signature(#[case] seed: Seed, #[case] version: OrdersVer ), OrdersVersion::V1 => TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: ask_amount, - give_balance: give_amount, + filled_amount: Amount::ZERO, + remaining_give_amount: give_amount, }), }; let tx = TransactionBuilder::new() @@ -1645,8 +1660,8 @@ fn reorg_after_create(#[case] seed: Seed, #[case] version: OrdersVersion) { ), OrdersVersion::V1 => TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: ask_amount, - give_balance: give_amount, + filled_amount: fill_amount, + remaining_give_amount: (give_amount - filled_amount).unwrap(), }), }; tf.make_block_builder() diff --git a/chainstate/tx-verifier/src/transaction_verifier/error.rs b/chainstate/tx-verifier/src/transaction_verifier/error.rs index fefdc08b1..6f385c762 100644 --- a/chainstate/tx-verifier/src/transaction_verifier/error.rs +++ b/chainstate/tx-verifier/src/transaction_verifier/error.rs @@ -123,6 +123,8 @@ pub enum ConnectTransactionError { OrdersAccountingError(#[from] orders_accounting::Error), #[error(transparent)] InputCheck(#[from] InputCheckError), + #[error("Transaction {0} has conclude order input {1} with amounts that doesn't match the db")] + ConcludeInputAmountsDoesntMatch(Id, OrderId), } impl From for ConnectTransactionError { diff --git a/chainstate/tx-verifier/src/transaction_verifier/mod.rs b/chainstate/tx-verifier/src/transaction_verifier/mod.rs index 6e65d11c7..095f93f5d 100644 --- a/chainstate/tx-verifier/src/transaction_verifier/mod.rs +++ b/chainstate/tx-verifier/src/transaction_verifier/mod.rs @@ -75,8 +75,8 @@ use common::{ signed_transaction::SignedTransaction, tokens::make_token_id, AccountCommand, AccountNonce, AccountSpending, AccountType, Block, ChainConfig, - DelegationId, FrozenTokensValidationVersion, GenBlock, OrderAccountCommand, OrdersVersion, - Transaction, TxInput, TxOutput, UtxoOutPoint, + DelegationId, FrozenTokensValidationVersion, GenBlock, OrderAccountCommand, OrderId, + OrdersVersion, Transaction, TxInput, TxOutput, UtxoOutPoint, }, primitives::{id::WithId, Amount, BlockHeight, Fee, Id, Idable}, }; @@ -778,8 +778,8 @@ where OrderAccountCommand::FillOrder(order_id, _, _) | OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => { let order_data = self.get_order_data(order_id)?.ok_or( ConnectTransactionError::OrdersAccountingError( @@ -829,6 +829,46 @@ where Ok(()) } + fn check_conclude_command_amounts( + view: &impl OrdersAccountingView, + tx_id: Id, + order_id: OrderId, + filled_amount: Amount, + remaining_give_amount: Amount, + ) -> Result<(), ConnectTransactionError> { + let order_data = view.get_order_data(&order_id)?.ok_or( + ConnectTransactionError::OrdersAccountingError( + orders_accounting::Error::OrderDataNotFound(order_id), + ), + )?; + + let original_ask_balance = match order_data.ask() { + OutputValue::TokenV0(_) => { + return Err(ConnectTransactionError::OrdersAccountingError( + orders_accounting::Error::UnsupportedTokenVersion, + )) + } + OutputValue::Coin(amount) | OutputValue::TokenV1(_, amount) => *amount, + }; + let current_ask_balance = view.get_ask_balance(&order_id)?; + let expected_filled_amount = (original_ask_balance - current_ask_balance).ok_or( + ConnectTransactionError::ConcludeInputAmountsDoesntMatch(tx_id, order_id), + )?; + + ensure!( + filled_amount == expected_filled_amount, + ConnectTransactionError::ConcludeInputAmountsDoesntMatch(tx_id, order_id) + ); + + let current_give_balance = view.get_give_balance(&order_id)?; + ensure!( + current_give_balance == remaining_give_amount, + ConnectTransactionError::ConcludeInputAmountsDoesntMatch(tx_id, order_id) + ); + + Ok(()) + } + fn connect_orders_outputs( &mut self, tx_source: &TransactionSourceForConnect, @@ -878,13 +918,21 @@ where } OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount, + remaining_give_amount, } => { - let res = self - .orders_accounting_cache - .conclude_order(*order_id) - .map_err(ConnectTransactionError::OrdersAccountingError); + let res = Self::check_conclude_command_amounts( + &self.orders_accounting_cache, + tx.get_id(), + *order_id, + *filled_amount, + *remaining_give_amount, + ) + .and_then(|_| { + self.orders_accounting_cache + .conclude_order(*order_id) + .map_err(ConnectTransactionError::OrdersAccountingError) + }); Some(res) } }, diff --git a/common/src/chain/transaction/account_outpoint.rs b/common/src/chain/transaction/account_outpoint.rs index 2dd1edd9d..ca5ad70bb 100644 --- a/common/src/chain/transaction/account_outpoint.rs +++ b/common/src/chain/transaction/account_outpoint.rs @@ -67,8 +67,8 @@ impl From for AccountType { OrderAccountCommand::FillOrder(order_id, _, _) | OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => AccountType::Order(order_id), } } @@ -193,11 +193,12 @@ pub enum OrderAccountCommand { FillOrder(OrderId, Amount, Destination), // Close an order and withdraw all remaining funds from both give and ask balances. // Only the address specified as `conclude_key` can authorize this command. + // Amounts are important because they get into a signature so that such a tx cannot be applied + // to an altered state. #[codec(index = 1)] ConcludeOrder { order_id: OrderId, - //FIXME: check these amounts on connect - ask_balance: Amount, - give_balance: Amount, + filled_amount: Amount, + remaining_give_amount: Amount, }, } diff --git a/common/src/chain/transaction/signature/tests/sign_and_mutate.rs b/common/src/chain/transaction/signature/tests/sign_and_mutate.rs index f93e748a6..5ff3fbce5 100644 --- a/common/src/chain/transaction/signature/tests/sign_and_mutate.rs +++ b/common/src/chain/transaction/signature/tests/sign_and_mutate.rs @@ -1069,12 +1069,12 @@ fn mutate_first_input( } OrderAccountCommand::ConcludeOrder { order_id, - ask_balance, - give_balance, + filled_amount, + remaining_give_amount, } => TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id: *order_id, - ask_balance: Amount::from_atoms(ask_balance.into_atoms() + 1), - give_balance: *give_balance, + filled_amount: Amount::from_atoms(filled_amount.into_atoms() + 1), + remaining_give_amount: *remaining_give_amount, }), }, }; diff --git a/mempool/src/error/ban_score.rs b/mempool/src/error/ban_score.rs index 0deea7fd0..81c14117c 100644 --- a/mempool/src/error/ban_score.rs +++ b/mempool/src/error/ban_score.rs @@ -144,6 +144,7 @@ impl MempoolBanScore for ConnectTransactionError { ConnectTransactionError::AttemptToCreateOrderFromAccounts => 100, ConnectTransactionError::TotalFeeRequiredOverflow => 100, ConnectTransactionError::InsufficientCoinsFee(_, _) => 100, + ConnectTransactionError::AttemptToSpendFrozenToken(_) => 100, // Need to drill down deeper into the error in these cases ConnectTransactionError::IOPolicyError(err, _) => err.ban_score(), @@ -166,7 +167,7 @@ impl MempoolBanScore for ConnectTransactionError { ConnectTransactionError::MissingTxUndo(_) => 0, ConnectTransactionError::MissingTransactionNonce(_) => 0, ConnectTransactionError::FailedToIncrementAccountNonce => 0, - ConnectTransactionError::AttemptToSpendFrozenToken(_) => 0, + ConnectTransactionError::ConcludeInputAmountsDoesntMatch(_, _) => 0, } } } diff --git a/mempool/src/pool/orphans/detect.rs b/mempool/src/pool/orphans/detect.rs index b426ba3e2..94b21eeee 100644 --- a/mempool/src/pool/orphans/detect.rs +++ b/mempool/src/pool/orphans/detect.rs @@ -78,6 +78,7 @@ impl OrphanType { | CTE::CheckTransactionError(_) | CTE::OrdersAccountingError(_) | CTE::AttemptToCreateOrderFromAccounts + | CTE::ConcludeInputAmountsDoesntMatch(_, _) | CTE::IOPolicyError(_, _) => Err(err), } } diff --git a/mintscript/src/translate.rs b/mintscript/src/translate.rs index b730134bd..b164749e6 100644 --- a/mintscript/src/translate.rs +++ b/mintscript/src/translate.rs @@ -250,8 +250,8 @@ impl TranslateInput for SignedTransaction { OrderAccountCommand::FillOrder(_, _, _) => Ok(WitnessScript::TRUE), OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => { let dest = ctx .get_orders_conclude_destination(order_id)? @@ -474,8 +474,8 @@ impl TranslateInput for SignatureOnlyTx { OrderAccountCommand::FillOrder(_, _, _) => Ok(WitnessScript::TRUE), OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => { let dest = ctx .get_orders_conclude_destination(order_id)? diff --git a/p2p/src/sync/tests/no_discouragement_after_tx_reorg.rs b/p2p/src/sync/tests/no_discouragement_after_tx_reorg.rs index 0ed23055c..d1651abe1 100644 --- a/p2p/src/sync/tests/no_discouragement_after_tx_reorg.rs +++ b/p2p/src/sync/tests/no_discouragement_after_tx_reorg.rs @@ -265,7 +265,7 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { token_id, another_order1_ask_amount_to_fill, ), - tfxt.make_tx_to_conclude_order(order_give_amount, order_id, token_id), + tfxt.make_tx_to_conclude_order(order_id, token_id, Amount::ZERO, order_give_amount), ]; let future_block = tfxt @@ -862,21 +862,22 @@ impl TestFixture { fn make_tx_to_conclude_order( &mut self, - give_amount: Amount, order_id: OrderId, token_id: TokenId, + filled_amount: Amount, + remaining_give_amount: Amount, ) -> SignedTransaction { TransactionBuilder::new() .add_input( TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: give_amount, - give_balance: give_amount, + filled_amount, + remaining_give_amount, }), InputWitness::NoSignature(None), ) .add_output(TxOutput::Transfer( - OutputValue::TokenV1(token_id, give_amount), + OutputValue::TokenV1(token_id, remaining_give_amount), Destination::AnyoneCanSpend, )) .build() diff --git a/wallet/src/account/output_cache/mod.rs b/wallet/src/account/output_cache/mod.rs index 444e99d78..c00281a96 100644 --- a/wallet/src/account/output_cache/mod.rs +++ b/wallet/src/account/output_cache/mod.rs @@ -785,8 +785,8 @@ impl OutputCache { OrderAccountCommand::FillOrder(order_id, _, _) | OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => self.order_data(order_id).is_some_and(|data| { [data.ask_currency, data.give_currency].iter().any(|v| match v { Currency::Coin => false, @@ -1155,8 +1155,8 @@ impl OutputCache { OrderAccountCommand::FillOrder(order_id, _, _) | OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => { if let Some(data) = self.orders.get_mut(order_id) { data.last_parent = @@ -1472,8 +1472,8 @@ impl OutputCache { OrderAccountCommand::FillOrder(order_id, _, _) | OrderAccountCommand::ConcludeOrder { order_id, - ask_balance: _, - give_balance: _, + filled_amount: _, + remaining_give_amount: _, } => { if let Some(data) = self.orders.get_mut(order_id) { data.last_parent = find_parent(