From 80f2b2fa79fb2bcf8027a7024aa2b7a6703dfb04 Mon Sep 17 00:00:00 2001 From: Giovanni Gargiulo Date: Mon, 10 Mar 2025 10:58:06 +0000 Subject: [PATCH 1/9] chore: resolving conflicts --- .../onchain/lib/ibc/utils/validator_utils.ak | 73 ++++----- .../lib/ibc/utils/validator_utils.test.ak | 151 +++++++++--------- cardano/onchain/validators/minting_channel.ak | 12 +- .../onchain/validators/minting_connection.ak | 8 +- .../spending_channel/acknowledge_packet.ak | 4 +- .../spending_channel/chan_close_confirm.ak | 4 +- .../spending_channel/chan_close_init.ak | 4 +- .../spending_channel/chan_open_ack.ak | 4 +- .../spending_channel/chan_open_confirm.ak | 4 +- .../spending_channel/recv_packet.ak | 13 +- .../spending_channel/send_packet.ak | 4 +- .../spending_channel/timeout_packet.ak | 4 +- cardano/onchain/validators/spending_client.ak | 3 +- .../onchain/validators/spending_connection.ak | 4 +- 14 files changed, 147 insertions(+), 145 deletions(-) diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.ak b/cardano/onchain/lib/ibc/utils/validator_utils.ak index 332b2aac..ba5a4bb1 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.ak @@ -1,7 +1,7 @@ use aiken/collection/list use aiken/collection/pairs use aiken/interval.{Finite} -use aiken/option +use aiken/option.{and_then, map} use aiken/primitive/bytearray use cardano/assets.{ AssetName, PolicyId, Value, ada_asset_name, ada_policy_id, quantity_of, @@ -67,16 +67,14 @@ pub fn get_tx_valid_to(validity_range: ValidityRange) -> PosixTime { valid_to } -pub fn get_tx_valid_from(validity_range: ValidityRange) -> Option { +pub fn get_tx_valid_from(validity_range: ValidityRange) -> PosixTime { let lower_bound = validity_range.lower_bound if lower_bound.is_inclusive { - when lower_bound.bound_type is { - Finite(valid_from) -> Some(valid_from) - _ -> None - } + expect Finite(valid_from) = lower_bound.bound_type + valid_from } else { - None + fail @"Lower bound is not inclusive" } } @@ -85,32 +83,32 @@ pub fn validate_handler_redeemer( redeemers: Pairs, handler_token: AuthToken, expected_redeemer: HandlerOperator, -) -> Option { - when +) -> HandlerDatum { + expect Some(handler_datum) = list.find( inputs, fn(input) { input.output |> auth.contain_auth_token(handler_token) }, ) - is { - Some(handler_input) -> - when - pairs.get_first(redeemers, Spend(handler_input.output_reference)) - is { - Some(spent_handler_redeemer) -> { - expect handler_operator: HandlerOperator = spent_handler_redeemer - if handler_operator == expected_redeemer { - let handler_output = handler_input.output - expect handler_datum: HandlerDatum = - get_inline_datum(handler_output) - Some(handler_datum) - } else { - None - } - } - None -> None - } - None -> None - } + |> and_then( + fn(handler_input) { + pairs.get_first(redeemers, Spend(handler_input.output_reference)) + |> map( + fn(spent_handler_redeemer) { + expect handler_operator: HandlerOperator = + spent_handler_redeemer + if handler_operator == expected_redeemer { + let handler_output = handler_input.output + expect handler_datum: HandlerDatum = + get_inline_datum(handler_output) + handler_datum + } else { + fail @"Handler is not matching" + } + }, + ) + }, + ) + handler_datum } pub fn extract_module_redeemer( @@ -119,7 +117,7 @@ pub fn extract_module_redeemer( channel_token_name: ByteArray, port_minting_policy_id: PolicyId, port_id: ByteArray, -) -> Option { +) -> IBCModuleRedeemer { let port_number = port_keys.parse_port_id_number(port_id) let port_token_name = auth.generate_token_name_from_another( @@ -140,7 +138,7 @@ pub fn extract_module_redeemer( pairs.get_first(redeemers, Spend(module_input.output_reference)) expect ibc_module_redeemer: IBCModuleRedeemer = spent_module_redeemer - Some(ibc_module_redeemer) + ibc_module_redeemer } pub fn validate_referred_client( @@ -148,7 +146,7 @@ pub fn validate_referred_client( referrer_token_name: ByteArray, client_minting_policy_id: PolicyId, client_id: ByteArray, -) -> Option { +) -> ClientDatum { let client_sequence = client_keys.parse_client_id_sequence(client_id) let client_token_name = @@ -160,18 +158,13 @@ pub fn validate_referred_client( let client_token = AuthToken { policy_id: client_minting_policy_id, name: client_token_name } - when + expect Some(client_input) = list.find( reference_inputs, fn(input) { input.output |> auth.contain_auth_token(client_token) }, ) - is { - Some(client_input) -> { - expect client_datum: ClientDatum = get_inline_datum(client_input.output) - Some(client_datum) - } - None -> None - } + expect client_datum: ClientDatum = get_inline_datum(client_input.output) + client_datum } pub fn validate_referred_connection( diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak index b9de6c67..1cd53182 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak @@ -329,7 +329,7 @@ test extract_module_redeemer_succeed() { channel_token_name, port_minting_policy_id, port_id, - ) == Some(module_redeemer) + ) == module_redeemer } test extract_module_redeemer_fail_if_inputs_not_contain_port_token() fail { @@ -342,8 +342,7 @@ test extract_module_redeemer_fail_if_inputs_not_contain_port_token() fail { module_redeemer, ) = setup_extract_module_redeemer() - let inputs = - [] + let inputs = [] validator_utils.extract_module_redeemer( inputs, @@ -351,7 +350,7 @@ test extract_module_redeemer_fail_if_inputs_not_contain_port_token() fail { channel_token_name, port_minting_policy_id, port_id, - ) == Some(module_redeemer) + ) == module_redeemer } test extract_module_redeemer_fail_if_redeemers_not_contain_module_redeemer() fail { @@ -364,8 +363,7 @@ test extract_module_redeemer_fail_if_redeemers_not_contain_module_redeemer() fai module_redeemer, ) = setup_extract_module_redeemer() - let redeemers = - [] + let redeemers = [] validator_utils.extract_module_redeemer( inputs, @@ -373,7 +371,7 @@ test extract_module_redeemer_fail_if_redeemers_not_contain_module_redeemer() fai channel_token_name, port_minting_policy_id, port_id, - ) == Some(module_redeemer) + ) == module_redeemer } test extract_module_redeemer_fail_if_found_redeemer_is_not_ibc_redeemer() fail { @@ -399,7 +397,7 @@ test extract_module_redeemer_fail_if_found_redeemer_is_not_ibc_redeemer() fail { channel_token_name, port_minting_policy_id, port_id, - ) == Some(module_redeemer) + ) == module_redeemer } //==================================validate_token_remain================================ @@ -430,8 +428,7 @@ fn setup_validate_token_remain() -> ( reference_script: None, } - let outputs = - [spent_output] + let outputs = [spent_output] let updated_output = spent_output @@ -557,37 +554,39 @@ test validate_handler_redeemer_succeed() { redeemers, handler_token, handler_redeemer, - ) == Some(handler_datum) + ) == handler_datum } -test validate_handler_redeemer_fail_inputs_not_contain_handler_input() { +test validate_handler_redeemer_fail_inputs_not_contain_handler_input() fail { let (_inputs, redeemers, handler_token, handler_redeemer, _handler_datum) = setup_validate_handler_redeemer() - let inputs = - [] + let inputs = [] - validator_utils.validate_handler_redeemer( - inputs, - redeemers, - handler_token, - handler_redeemer, - ) == None + let result = + validator_utils.validate_handler_redeemer( + inputs, + redeemers, + handler_token, + handler_redeemer, + ) + result == result } -test validate_handler_redeemer_fail_redeemers_not_contain_handler_redeemer() { +test validate_handler_redeemer_fail_redeemers_not_contain_handler_redeemer() fail { let (inputs, _redeemers, handler_token, handler_redeemer, _handler_datum) = setup_validate_handler_redeemer() - let redeemers = - [] + let redeemers = [] - validator_utils.validate_handler_redeemer( - inputs, - redeemers, - handler_token, - handler_redeemer, - ) == None + let result = + validator_utils.validate_handler_redeemer( + inputs, + redeemers, + handler_token, + handler_redeemer, + ) + result == result } test validate_handler_redeemer_fail_found_redeemer_is_not_handler_operator() fail { @@ -600,15 +599,17 @@ test validate_handler_redeemer_fail_found_redeemer_is_not_handler_operator() fai let redeemers: Pairs = [Pair(Spend(handler_input.output_reference), invalid_handler_redeemer)] - validator_utils.validate_handler_redeemer( - inputs, - redeemers, - handler_token, - handler_redeemer, - ) == None + let result = + validator_utils.validate_handler_redeemer( + inputs, + redeemers, + handler_token, + handler_redeemer, + ) + result == result } -test validate_handler_redeemer_fail_found_redeemer_is_not_expected_operator() { +test validate_handler_redeemer_fail_found_redeemer_is_not_expected_operator() fail { let (inputs, _redeemers, handler_token, handler_redeemer, _handler_datum) = setup_validate_handler_redeemer() @@ -619,12 +620,14 @@ test validate_handler_redeemer_fail_found_redeemer_is_not_expected_operator() { let redeemers: Pairs = [Pair(Spend(handler_input.output_reference), invalid_handler_redeemer)] - validator_utils.validate_handler_redeemer( - inputs, - redeemers, - handler_token, - handler_redeemer, - ) == None + let result = + validator_utils.validate_handler_redeemer( + inputs, + redeemers, + handler_token, + handler_redeemer, + ) + result == result } test validate_handler_redeemer_fail_handler_datum_is_invalid() fail { @@ -639,12 +642,14 @@ test validate_handler_redeemer_fail_handler_datum_is_invalid() fail { output: Output { ..handler_input.output, datum: InlineDatum(Void) }, } - validator_utils.validate_handler_redeemer( - [handler_input], - redeemers, - handler_token, - handler_redeemer, - ) == None + let result = + validator_utils.validate_handler_redeemer( + [handler_input], + redeemers, + handler_token, + handler_redeemer, + ) + result == result } //=====================================validate_referred_client========================================= @@ -728,8 +733,7 @@ fn setup_validate_referred_client() -> ( let client_input = Input { output_reference: out_ref, output: client_output } - let reference_inputs = - [client_input] + let reference_inputs = [client_input] ( reference_inputs, @@ -754,10 +758,10 @@ test validate_referred_client_succeed() { referrer_token_name, client_minting_policy_id, client_id, - ) == Some(client_datum) + ) == client_datum } -test validate_referred_client_if_not_found_client_input() { +test validate_referred_client_if_not_found_client_input() fail { let ( _reference_inputs, referrer_token_name, @@ -766,15 +770,16 @@ test validate_referred_client_if_not_found_client_input() { _client_datum, ) = setup_validate_referred_client() - let reference_inputs = - [] + let reference_inputs = [] - validator_utils.validate_referred_client( - reference_inputs, - referrer_token_name, - client_minting_policy_id, - client_id, - ) == None + let result = + validator_utils.validate_referred_client( + reference_inputs, + referrer_token_name, + client_minting_policy_id, + client_id, + ) + result == result } test validate_referred_client_if_found_datum_is_not_client_datum() fail { @@ -794,15 +799,16 @@ test validate_referred_client_if_found_datum_is_not_client_datum() fail { output: Output { ..client_input.output, datum: InlineDatum(Void) }, } - let reference_inputs = - [client_input] + let reference_inputs = [client_input] - validator_utils.validate_referred_client( - reference_inputs, - referrer_token_name, - client_minting_policy_id, - client_id, - ) == None + let result = + validator_utils.validate_referred_client( + reference_inputs, + referrer_token_name, + client_minting_policy_id, + client_id, + ) + result == result } // =====================================validate_referred_connection========================================= @@ -876,8 +882,7 @@ fn setup_validate_referred_connection() -> ( let connection_input = Input { output_reference: out_ref, output: connection_output } - let reference_inputs = - [connection_input] + let reference_inputs = [connection_input] ( reference_inputs, @@ -914,8 +919,7 @@ test validate_referred_connection_if_not_found_connection_input() { _connection_datum, ) = setup_validate_referred_connection() - let reference_inputs = - [] + let reference_inputs = [] validator_utils.validate_referred_connection( reference_inputs, @@ -942,8 +946,7 @@ test validate_referred_connection_if_found_datum_is_not_connection_datum() fail output: Output { ..connection_input.output, datum: InlineDatum(Void) }, } - let reference_inputs = - [connection_input] + let reference_inputs = [connection_input] validator_utils.validate_referred_connection( reference_inputs, diff --git a/cardano/onchain/validators/minting_channel.ak b/cardano/onchain/validators/minting_channel.ak index 64081076..922b2296 100644 --- a/cardano/onchain/validators/minting_channel.ak +++ b/cardano/onchain/validators/minting_channel.ak @@ -80,7 +80,7 @@ validator mint_channel( ChanOpenInit { handler_token } -> { trace @"mint_channel: ChanOpenInit branch" - expect Some(handler_datum) = + let handler_datum = validator_utils.validate_handler_redeemer( inputs, redeemers, @@ -104,7 +104,7 @@ validator mint_channel( |> version.verify_supported_feature(connection_version, _) trace @"mint_channel: validate connection support channel ordering" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, channel_output_datum.token.name, @@ -143,7 +143,7 @@ validator mint_channel( string_utils.int_to_string(handler_datum.state.next_channel_sequence) |> channel_keys.format_channel_identifier() - expect Some(ibc_module_redeemer) = + let ibc_module_redeemer = validator_utils.extract_module_redeemer( inputs, redeemers, @@ -169,7 +169,7 @@ validator mint_channel( } -> { trace @"mint_channel: ChanOpenTry branch" - expect Some(handler_datum) = + let handler_datum = validator_utils.validate_handler_redeemer( inputs, redeemers, @@ -193,7 +193,7 @@ validator mint_channel( |> version.verify_supported_feature(connection_version, _) trace @"mint_channel: connection support channel ordering" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, channel_output_datum.token.name, @@ -245,7 +245,7 @@ validator mint_channel( string_utils.int_to_string(handler_datum.state.next_channel_sequence) |> channel_keys.format_channel_identifier() - expect Some(ibc_module_redeemer) = + let ibc_module_redeemer = validator_utils.extract_module_redeemer( inputs, redeemers, diff --git a/cardano/onchain/validators/minting_connection.ak b/cardano/onchain/validators/minting_connection.ak index 01944058..f1994b7b 100644 --- a/cardano/onchain/validators/minting_connection.ak +++ b/cardano/onchain/validators/minting_connection.ak @@ -72,7 +72,7 @@ validator mint_connection( ConnOpenInit { handler_auth_token } -> { trace @"mint_connection: ConnOpenInit branch" - expect Some(handler_datum) = + let handler_datum = validator_utils.validate_handler_redeemer( inputs, redeemers, @@ -81,7 +81,7 @@ validator mint_connection( ) trace @"mint_connection: validator_utils.validate_handler_redeemer" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, connection_output_datum.token.name, @@ -126,7 +126,7 @@ validator mint_connection( } -> { trace @"mint_connection: ConnOpenTry branch\n" - expect Some(handler_datum) = + let handler_datum = validator_utils.validate_handler_redeemer( inputs, redeemers, @@ -135,7 +135,7 @@ validator mint_connection( ) trace @"mint_connection: validator_utils.validate_handler_redeemer\n" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, connection_output_datum.token.name, diff --git a/cardano/onchain/validators/spending_channel/acknowledge_packet.ak b/cardano/onchain/validators/spending_channel/acknowledge_packet.ak index bcdd9996..951ab9ad 100644 --- a/cardano/onchain/validators/spending_channel/acknowledge_packet.ak +++ b/cardano/onchain/validators/spending_channel/acknowledge_packet.ak @@ -119,7 +119,7 @@ validator acknowledge_packet( connection_datum.state.state == conn_state_mod.Open trace @"acknowledge_packet: connection state is open" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, datum.token.name, @@ -162,7 +162,7 @@ validator acknowledge_packet( ) trace @"acknowledge_packet: channel datum is updated valid" - expect Some(ibc_module_redeemer) = + let ibc_module_redeemer = validator_utils.extract_module_redeemer( inputs, redeemers, diff --git a/cardano/onchain/validators/spending_channel/chan_close_confirm.ak b/cardano/onchain/validators/spending_channel/chan_close_confirm.ak index ebbaf544..1c88ecfa 100644 --- a/cardano/onchain/validators/spending_channel/chan_close_confirm.ak +++ b/cardano/onchain/validators/spending_channel/chan_close_confirm.ak @@ -94,7 +94,7 @@ validator chan_close_confirm( expect connection_datum.state.state == conn_state_mod.Open trace @"chan_close_confirm: Connection is open" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, datum.token.name, @@ -124,7 +124,7 @@ validator chan_close_confirm( ) trace @"chan_close_confirm: channel proof is valid" - expect Some(ibc_module_redeemer) = + let ibc_module_redeemer = validator_utils.extract_module_redeemer( inputs, redeemers, diff --git a/cardano/onchain/validators/spending_channel/chan_close_init.ak b/cardano/onchain/validators/spending_channel/chan_close_init.ak index e388bf86..8674404d 100644 --- a/cardano/onchain/validators/spending_channel/chan_close_init.ak +++ b/cardano/onchain/validators/spending_channel/chan_close_init.ak @@ -80,7 +80,7 @@ validator chan_close_init( expect connection_datum.state.state == conn_state_mod.Open trace @"chan_close_init: Connection is open" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, datum.token.name, @@ -97,7 +97,7 @@ validator chan_close_init( ) == client_status_mod.Active trace @"chan_close_init: client status is active" - expect Some(ibc_module_redeemer) = + let ibc_module_redeemer = validator_utils.extract_module_redeemer( inputs, redeemers, diff --git a/cardano/onchain/validators/spending_channel/chan_open_ack.ak b/cardano/onchain/validators/spending_channel/chan_open_ack.ak index e3c152a8..dd5da3d7 100644 --- a/cardano/onchain/validators/spending_channel/chan_open_ack.ak +++ b/cardano/onchain/validators/spending_channel/chan_open_ack.ak @@ -90,7 +90,7 @@ validator chan_open_ack( |> version_mod.verify_supported_feature(connection_version, _) trace @"chan_open_ack: connection support channel ordering" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, datum.token.name, @@ -123,7 +123,7 @@ validator chan_open_ack( ) trace @"chan_open_ack: channel proof is valid" - expect Some(ibc_module_redeemer) = + let ibc_module_redeemer = validator_utils.extract_module_redeemer( inputs, redeemers, diff --git a/cardano/onchain/validators/spending_channel/chan_open_confirm.ak b/cardano/onchain/validators/spending_channel/chan_open_confirm.ak index 582fbe40..2609be60 100644 --- a/cardano/onchain/validators/spending_channel/chan_open_confirm.ak +++ b/cardano/onchain/validators/spending_channel/chan_open_confirm.ak @@ -96,7 +96,7 @@ validator chan_open_confirm( |> version_mod.verify_supported_feature(connection_version, _) trace @"chan_open_confirm: connection support channel ordering" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, datum.token.name, @@ -126,7 +126,7 @@ validator chan_open_confirm( ) trace @"chan_open_confirm: channel proof is valid" - expect Some(ibc_module_redeemer) = + let ibc_module_redeemer = validator_utils.extract_module_redeemer( inputs, redeemers, diff --git a/cardano/onchain/validators/spending_channel/recv_packet.ak b/cardano/onchain/validators/spending_channel/recv_packet.ak index 49ec3445..60782aba 100644 --- a/cardano/onchain/validators/spending_channel/recv_packet.ak +++ b/cardano/onchain/validators/spending_channel/recv_packet.ak @@ -98,7 +98,7 @@ validator recv_packet( expect connection_datum.state.state == conn_state_mod.Open trace @"recv_packet: Connection is open" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, datum.token.name, @@ -130,7 +130,7 @@ validator recv_packet( verify_proof_policy_id, ) - //expect Some(ibc_module_redeemer) = + //let ibc_module_redeemer = // validator_utils.extract_module_redeemer( // inputs, // redeemers, @@ -142,6 +142,14 @@ validator recv_packet( //expect Callback(ibc_module_callback) = ibc_module_redeemer //expect OnRecvPacket { channel_id: module_chan_id, acknowledgement, data: _ } = // ibc_module_callback + // This block below was removed during the recv_packet.ak merge + // let valid_ordering = + // when cur_channel.ordering is { + // chan_order_mod.Unordered -> + // !pairs.has_key(cur_packet_receipt, packet.sequence) + // chan_order_mod.Ordered -> packet.sequence == next_sequence_recv + // _ -> False + // } //let bz_ack = acknowledgement_mod.acknowledgement(acknowledgement) //let commit_ack = acknowledgement_mod.commit_acknowledgement(bz_ack) //let valid_packet = @@ -151,7 +159,6 @@ validator recv_packet( // packet, // commit_ack, // ) - and { channel_token == datum.token, auth.contain_auth_token(updated_output, datum.token), diff --git a/cardano/onchain/validators/spending_channel/send_packet.ak b/cardano/onchain/validators/spending_channel/send_packet.ak index 563d43c8..b0f6ba94 100644 --- a/cardano/onchain/validators/spending_channel/send_packet.ak +++ b/cardano/onchain/validators/spending_channel/send_packet.ak @@ -89,7 +89,7 @@ validator send_packet( ) trace @"send_packet: reference_inputs contain Connection utxo" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, datum.token.name, @@ -127,7 +127,7 @@ validator send_packet( trace @"send_packet: channel_datum is updated valid" - expect Some(ibc_module_redeemer) = + let ibc_module_redeemer = validator_utils.extract_module_redeemer( inputs, redeemers, diff --git a/cardano/onchain/validators/spending_channel/timeout_packet.ak b/cardano/onchain/validators/spending_channel/timeout_packet.ak index fc9b2552..29fcbb08 100644 --- a/cardano/onchain/validators/spending_channel/timeout_packet.ak +++ b/cardano/onchain/validators/spending_channel/timeout_packet.ak @@ -109,7 +109,7 @@ validator timeout_packet( ) trace @"timeout_packet: reference_inputs contain Connection utxo" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, datum.token.name, @@ -173,7 +173,7 @@ validator timeout_packet( _ -> False } - expect Some(ibc_module_redeemer) = + let ibc_module_redeemer = validator_utils.extract_module_redeemer( inputs, redeemers, diff --git a/cardano/onchain/validators/spending_client.ak b/cardano/onchain/validators/spending_client.ak index 753153cb..127b0c2f 100644 --- a/cardano/onchain/validators/spending_client.ak +++ b/cardano/onchain/validators/spending_client.ak @@ -49,8 +49,7 @@ validator spend_client { let tx_valid_to = validator_utils.get_tx_valid_to(validity_range) - expect Some(tx_valid_from) = - validator_utils.get_tx_valid_from(validity_range) + let tx_valid_from = validator_utils.get_tx_valid_from(validity_range) expect client_state_mod.status( diff --git a/cardano/onchain/validators/spending_connection.ak b/cardano/onchain/validators/spending_connection.ak index a198c71f..eabb2b8a 100644 --- a/cardano/onchain/validators/spending_connection.ak +++ b/cardano/onchain/validators/spending_connection.ak @@ -92,7 +92,7 @@ validator spend_connection( } -> { trace @"spend_connection: ConnOpenAck branch" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, datum.token.name, @@ -131,7 +131,7 @@ validator spend_connection( ConnOpenConfirm { proof_ack, proof_height } -> { trace @"spend_connection: ConnOpenConfirm branch" - expect Some(client_datum) = + let client_datum = validator_utils.validate_referred_client( reference_inputs, datum.token.name, From 5bf65a996f7942a67bff168f120f0575c184ba16 Mon Sep 17 00:00:00 2001 From: Giovanni Gargiulo Date: Wed, 5 Mar 2025 11:43:13 +0000 Subject: [PATCH 2/9] chore: added some additional test to debug issue --- .../onchain/lib/ibc/utils/validator_utils.ak | 3 ++ .../lib/ibc/utils/validator_utils.test.ak | 48 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.ak b/cardano/onchain/lib/ibc/utils/validator_utils.ak index ba5a4bb1..5689df9c 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.ak @@ -96,6 +96,9 @@ pub fn validate_handler_redeemer( fn(spent_handler_redeemer) { expect handler_operator: HandlerOperator = spent_handler_redeemer + trace @"validate_handler_redeemer" + trace handler_operator + trace expected_redeemer if handler_operator == expected_redeemer { let handler_output = handler_input.output expect handler_datum: HandlerDatum = diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak index 1cd53182..4aaf62d0 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak @@ -590,6 +590,7 @@ test validate_handler_redeemer_fail_redeemers_not_contain_handler_redeemer() fai } test validate_handler_redeemer_fail_found_redeemer_is_not_handler_operator() fail { + // FIX_ME: this should not pass let (inputs, _redeemers, handler_token, handler_redeemer, _handler_datum) = setup_validate_handler_redeemer() @@ -599,6 +600,11 @@ test validate_handler_redeemer_fail_found_redeemer_is_not_handler_operator() fai let redeemers: Pairs = [Pair(Spend(handler_input.output_reference), invalid_handler_redeemer)] + trace CreateClient + trace HandlerConnOpenInit + trace handler_redeemer + trace redeemers + let result = validator_utils.validate_handler_redeemer( inputs, @@ -955,3 +961,45 @@ test validate_referred_connection_if_found_datum_is_not_connection_datum() fail connection_id, ) == None } + +pub type Types { + MyType + NotMyType + SomeType { value: Int } +} + +pub type OtherTypes { + DefinitelyNotMyType + MyOtherType +} + +test test_my_type() fail { + let my_type = MyType + let not_my_type = NotMyType + // MyType == NotMyType + trace my_type + trace not_my_type + my_type == not_my_type +} + +test test_some_type() fail { + MyType == SomeType(42) +} + +test test_definitely_not_my_type() { + let my_type: Redeemer = MyType + let definitely_not_my_type: Redeemer = MyOtherType + my_type == definitely_not_my_type +} + +test test_void_is_constr_0() { + let it_should_be_void: Redeemer = Void + expect not_void_anymore: Types = it_should_be_void + not_void_anymore == MyType +} + +test test_void_is_not_constr_0() { + let it_should_be_void: Redeemer = Void + expect not_void_anymore: Types = it_should_be_void + not_void_anymore == NotMyType +} From fd7cf1b75926089e666ccd319a85a8f88e0dfb8a Mon Sep 17 00:00:00 2001 From: Giovanni Gargiulo Date: Wed, 5 Mar 2025 11:57:16 +0000 Subject: [PATCH 3/9] chore: fixed test --- .../onchain/lib/ibc/utils/validator_utils.ak | 3 -- .../lib/ibc/utils/validator_utils.test.ak | 50 +------------------ 2 files changed, 1 insertion(+), 52 deletions(-) diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.ak b/cardano/onchain/lib/ibc/utils/validator_utils.ak index 5689df9c..ba5a4bb1 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.ak @@ -96,9 +96,6 @@ pub fn validate_handler_redeemer( fn(spent_handler_redeemer) { expect handler_operator: HandlerOperator = spent_handler_redeemer - trace @"validate_handler_redeemer" - trace handler_operator - trace expected_redeemer if handler_operator == expected_redeemer { let handler_output = handler_input.output expect handler_datum: HandlerDatum = diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak index 4aaf62d0..c19756d5 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak @@ -590,21 +590,15 @@ test validate_handler_redeemer_fail_redeemers_not_contain_handler_redeemer() fai } test validate_handler_redeemer_fail_found_redeemer_is_not_handler_operator() fail { - // FIX_ME: this should not pass let (inputs, _redeemers, handler_token, handler_redeemer, _handler_datum) = setup_validate_handler_redeemer() - let invalid_handler_redeemer: Redeemer = Void + let invalid_handler_redeemer: Redeemer = HandlerConnOpenInit expect [handler_input, ..] = inputs let redeemers: Pairs = [Pair(Spend(handler_input.output_reference), invalid_handler_redeemer)] - trace CreateClient - trace HandlerConnOpenInit - trace handler_redeemer - trace redeemers - let result = validator_utils.validate_handler_redeemer( inputs, @@ -961,45 +955,3 @@ test validate_referred_connection_if_found_datum_is_not_connection_datum() fail connection_id, ) == None } - -pub type Types { - MyType - NotMyType - SomeType { value: Int } -} - -pub type OtherTypes { - DefinitelyNotMyType - MyOtherType -} - -test test_my_type() fail { - let my_type = MyType - let not_my_type = NotMyType - // MyType == NotMyType - trace my_type - trace not_my_type - my_type == not_my_type -} - -test test_some_type() fail { - MyType == SomeType(42) -} - -test test_definitely_not_my_type() { - let my_type: Redeemer = MyType - let definitely_not_my_type: Redeemer = MyOtherType - my_type == definitely_not_my_type -} - -test test_void_is_constr_0() { - let it_should_be_void: Redeemer = Void - expect not_void_anymore: Types = it_should_be_void - not_void_anymore == MyType -} - -test test_void_is_not_constr_0() { - let it_should_be_void: Redeemer = Void - expect not_void_anymore: Types = it_should_be_void - not_void_anymore == NotMyType -} From 6881a46a3bc814eaeb830c10f20b6390310a3d1a Mon Sep 17 00:00:00 2001 From: Giovanni Gargiulo Date: Wed, 5 Mar 2025 12:06:35 +0000 Subject: [PATCH 4/9] chore: one more redundant option removed --- .../onchain/lib/ibc/utils/validator_utils.ak | 15 +++------ .../lib/ibc/utils/validator_utils.test.ak | 32 +++++++++++-------- cardano/onchain/validators/minting_channel.ak | 4 +-- .../spending_channel/acknowledge_packet.ak | 2 +- .../spending_channel/chan_close_confirm.ak | 2 +- .../spending_channel/chan_close_init.ak | 2 +- .../spending_channel/chan_open_ack.ak | 2 +- .../spending_channel/chan_open_confirm.ak | 2 +- .../spending_channel/recv_packet.ak | 2 +- .../spending_channel/send_packet.ak | 2 +- .../spending_channel/timeout_packet.ak | 2 +- 11 files changed, 33 insertions(+), 34 deletions(-) diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.ak b/cardano/onchain/lib/ibc/utils/validator_utils.ak index ba5a4bb1..431c784c 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.ak @@ -172,7 +172,7 @@ pub fn validate_referred_connection( referrer_token_name: ByteArray, connection_minting_policy_id: PolicyId, connection_id: ByteArray, -) -> Option { +) -> ConnectionDatum { let connection_sequence = connection_keys.parse_connection_id_sequence(connection_id) @@ -188,19 +188,14 @@ pub fn validate_referred_connection( name: connection_token_name, } - when + expect Some(data) = list.find( reference_inputs, fn(input) { input.output |> auth.contain_auth_token(connection_token) }, ) - is { - Some(connection_input) -> { - expect connection_datum: ConnectionDatum = - get_inline_datum(connection_input.output) - Some(connection_datum) - } - None -> None - } + |> map(fn(connection_input) { get_inline_datum(connection_input.output) }) + expect connection_datum: ConnectionDatum = data + connection_datum } pub fn validate_mint( diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak index c19756d5..dc1db5fa 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak @@ -907,10 +907,10 @@ test validate_referred_connection_succeed() { referrer_token_name, connection_minting_policy_id, connection_id, - ) == Some(connection_datum) + ) == connection_datum } -test validate_referred_connection_if_not_found_connection_input() { +test validate_referred_connection_if_not_found_connection_input() fail { let ( _reference_inputs, referrer_token_name, @@ -921,12 +921,14 @@ test validate_referred_connection_if_not_found_connection_input() { let reference_inputs = [] - validator_utils.validate_referred_connection( - reference_inputs, - referrer_token_name, - connection_minting_policy_id, - connection_id, - ) == None + let result = + validator_utils.validate_referred_connection( + reference_inputs, + referrer_token_name, + connection_minting_policy_id, + connection_id, + ) + result == result } test validate_referred_connection_if_found_datum_is_not_connection_datum() fail { @@ -948,10 +950,12 @@ test validate_referred_connection_if_found_datum_is_not_connection_datum() fail let reference_inputs = [connection_input] - validator_utils.validate_referred_connection( - reference_inputs, - referrer_token_name, - connection_minting_policy_id, - connection_id, - ) == None + let result = + validator_utils.validate_referred_connection( + reference_inputs, + referrer_token_name, + connection_minting_policy_id, + connection_id, + ) + result == result } diff --git a/cardano/onchain/validators/minting_channel.ak b/cardano/onchain/validators/minting_channel.ak index 922b2296..02f8bc69 100644 --- a/cardano/onchain/validators/minting_channel.ak +++ b/cardano/onchain/validators/minting_channel.ak @@ -89,7 +89,7 @@ validator mint_channel( ) trace @"mint_channel: spent handler redeemer is valid" - expect Some(connection_datum) = + let connection_datum = validator_utils.validate_referred_connection( reference_inputs, channel_output_datum.token.name, @@ -178,7 +178,7 @@ validator mint_channel( ) trace @"mint_channel: spent handler redeemer is HandlerChanOpenTry" - expect Some(connection_datum) = + let connection_datum = validator_utils.validate_referred_connection( reference_inputs, channel_output_datum.token.name, diff --git a/cardano/onchain/validators/spending_channel/acknowledge_packet.ak b/cardano/onchain/validators/spending_channel/acknowledge_packet.ak index 951ab9ad..62785b6a 100644 --- a/cardano/onchain/validators/spending_channel/acknowledge_packet.ak +++ b/cardano/onchain/validators/spending_channel/acknowledge_packet.ak @@ -106,7 +106,7 @@ validator acknowledge_packet( } trace @"acknowledge_packet: packet info matched channel state" - expect Some(connection_datum) = + let connection_datum = validator_utils.validate_referred_connection( reference_inputs, datum.token.name, diff --git a/cardano/onchain/validators/spending_channel/chan_close_confirm.ak b/cardano/onchain/validators/spending_channel/chan_close_confirm.ak index 1c88ecfa..8a2bda68 100644 --- a/cardano/onchain/validators/spending_channel/chan_close_confirm.ak +++ b/cardano/onchain/validators/spending_channel/chan_close_confirm.ak @@ -82,7 +82,7 @@ validator chan_close_confirm( expect cur_channel.state != chan_state_mod.Closed trace @"chan_close_confirm: channel state is not Closed" - expect Some(connection_datum) = + let connection_datum = validator_utils.validate_referred_connection( reference_inputs, datum.token.name, diff --git a/cardano/onchain/validators/spending_channel/chan_close_init.ak b/cardano/onchain/validators/spending_channel/chan_close_init.ak index 8674404d..3ab07aac 100644 --- a/cardano/onchain/validators/spending_channel/chan_close_init.ak +++ b/cardano/onchain/validators/spending_channel/chan_close_init.ak @@ -68,7 +68,7 @@ validator chan_close_init( expect cur_channel.state != chan_state_mod.Closed trace @"chan_close_init: channel state is not Closed" - expect Some(connection_datum) = + let connection_datum = validator_utils.validate_referred_connection( reference_inputs, datum.token.name, diff --git a/cardano/onchain/validators/spending_channel/chan_open_ack.ak b/cardano/onchain/validators/spending_channel/chan_open_ack.ak index dd5da3d7..641432a2 100644 --- a/cardano/onchain/validators/spending_channel/chan_open_ack.ak +++ b/cardano/onchain/validators/spending_channel/chan_open_ack.ak @@ -72,7 +72,7 @@ validator chan_open_ack( trace @"chan_open_ack: tx context extracted" - expect Some(connection_datum) = + let connection_datum = validator_utils.validate_referred_connection( reference_inputs, datum.token.name, diff --git a/cardano/onchain/validators/spending_channel/chan_open_confirm.ak b/cardano/onchain/validators/spending_channel/chan_open_confirm.ak index 2609be60..2835e1a1 100644 --- a/cardano/onchain/validators/spending_channel/chan_open_confirm.ak +++ b/cardano/onchain/validators/spending_channel/chan_open_confirm.ak @@ -78,7 +78,7 @@ validator chan_open_confirm( trace @"chan_open_confirm: tx context extracted" - expect Some(connection_datum) = + let connection_datum = validator_utils.validate_referred_connection( reference_inputs, datum.token.name, diff --git a/cardano/onchain/validators/spending_channel/recv_packet.ak b/cardano/onchain/validators/spending_channel/recv_packet.ak index 60782aba..3d49b10a 100644 --- a/cardano/onchain/validators/spending_channel/recv_packet.ak +++ b/cardano/onchain/validators/spending_channel/recv_packet.ak @@ -86,7 +86,7 @@ validator recv_packet( expect cur_channel.state == chan_state_mod.Open trace @"recv_packet: channel state is open" - expect Some(connection_datum) = + let connection_datum = validator_utils.validate_referred_connection( reference_inputs, datum.token.name, diff --git a/cardano/onchain/validators/spending_channel/send_packet.ak b/cardano/onchain/validators/spending_channel/send_packet.ak index b0f6ba94..e63e3949 100644 --- a/cardano/onchain/validators/spending_channel/send_packet.ak +++ b/cardano/onchain/validators/spending_channel/send_packet.ak @@ -80,7 +80,7 @@ validator send_packet( } trace @"send_packet: packet info matched channel state" - expect Some(connection_datum) = + let connection_datum = validator_utils.validate_referred_connection( reference_inputs, datum.token.name, diff --git a/cardano/onchain/validators/spending_channel/timeout_packet.ak b/cardano/onchain/validators/spending_channel/timeout_packet.ak index 29fcbb08..744831c7 100644 --- a/cardano/onchain/validators/spending_channel/timeout_packet.ak +++ b/cardano/onchain/validators/spending_channel/timeout_packet.ak @@ -100,7 +100,7 @@ validator timeout_packet( } trace @"timeout_packet: packet info matched channel state" - expect Some(connection_datum) = + let connection_datum = validator_utils.validate_referred_connection( reference_inputs, datum.token.name, From cd960bcaf42cda449beabaee449280a8227db72d Mon Sep 17 00:00:00 2001 From: Giovanni Gargiulo Date: Wed, 5 Mar 2025 12:10:09 +0000 Subject: [PATCH 5/9] chore: removed one more optional from token auth validation --- cardano/onchain/lib/ibc/utils/validator_utils.ak | 6 +++--- cardano/onchain/lib/ibc/utils/validator_utils.test.ak | 4 ++-- cardano/onchain/validators/minting_channel.ak | 4 ++-- cardano/onchain/validators/minting_connection.ak | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.ak b/cardano/onchain/lib/ibc/utils/validator_utils.ak index 431c784c..25b92715 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.ak @@ -204,16 +204,16 @@ pub fn validate_mint( handler_token: AuthToken, token_name_prefix: ByteArray, sequence: ByteArray, -) -> Option { +) -> AuthToken { let token_name = auth.generate_token_name(handler_token, token_name_prefix, sequence) let token = AuthToken { policy_id: minting_policy_id, name: token_name } if auth.mint_auth_token(mint, token) { - Some(token) + token } else { - None + fail @"Auth Token Not Minted" } } diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak index dc1db5fa..21ad42eb 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak @@ -210,7 +210,7 @@ test test_validate_mint_succeed() { sequence, ) // Assert that the result is as expected - result == Some(AuthToken { ..handler_token, name: token_name }) + result == AuthToken { ..handler_token, name: token_name } } test test_validate_mint_fail_when_mint_value_not_contains_auth_token() fail { @@ -245,7 +245,7 @@ test test_validate_mint_fail_when_mint_value_not_contains_auth_token() fail { sequence, ) // Assert that the result is as expected - result == Some(AuthToken { ..handler_token, name: token_name }) + result == AuthToken { ..handler_token, name: token_name } } //==============================extract_module_redeemer=============================== diff --git a/cardano/onchain/validators/minting_channel.ak b/cardano/onchain/validators/minting_channel.ak index 02f8bc69..0153b955 100644 --- a/cardano/onchain/validators/minting_channel.ak +++ b/cardano/onchain/validators/minting_channel.ak @@ -121,7 +121,7 @@ validator mint_channel( ) == Active trace @"mint_channel: client status is active" - expect Some(channel_token) = + let channel_token = string_utils.int_to_string(handler_datum.state.next_channel_sequence) |> validator_utils.validate_mint( mint, @@ -210,7 +210,7 @@ validator mint_channel( ) == Active trace @"mint_channel: client status is active" - expect Some(channel_token) = + let channel_token = string_utils.int_to_string(handler_datum.state.next_channel_sequence) |> validator_utils.validate_mint( mint, diff --git a/cardano/onchain/validators/minting_connection.ak b/cardano/onchain/validators/minting_connection.ak index f1994b7b..3bfde28f 100644 --- a/cardano/onchain/validators/minting_connection.ak +++ b/cardano/onchain/validators/minting_connection.ak @@ -97,7 +97,7 @@ validator mint_connection( ) == Active trace @"mint_connection: client status is active" - expect Some(connection_token) = + let connection_token = string_utils.int_to_string( handler_datum.state.next_connection_sequence, ) @@ -152,7 +152,7 @@ validator mint_connection( ) == Active trace @"mint_connection: client status is active\n" - expect Some(connection_token) = + let connection_token = string_utils.int_to_string( handler_datum.state.next_connection_sequence, ) From dce37a7c61f61e4349bba6d23640ce42b8c32497 Mon Sep 17 00:00:00 2001 From: Giovanni Gargiulo Date: Wed, 5 Mar 2025 12:18:33 +0000 Subject: [PATCH 6/9] chore: removed one more optional from channel --- .../onchain/lib/ibc/utils/validator_utils.ak | 30 ++++++++----------- .../spending_channel/acknowledge_packet.ak | 2 +- .../spending_channel/chan_close_confirm.ak | 2 +- .../spending_channel/chan_close_init.ak | 2 +- .../spending_channel/chan_open_ack.ak | 2 +- .../spending_channel/chan_open_confirm.ak | 2 +- .../spending_channel/recv_packet.ak | 2 +- .../spending_channel/send_packet.ak | 2 +- .../spending_channel/timeout_packet.ak | 2 +- 9 files changed, 21 insertions(+), 25 deletions(-) diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.ak b/cardano/onchain/lib/ibc/utils/validator_utils.ak index 25b92715..52ece59f 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.ak @@ -284,28 +284,24 @@ pub fn extract_channel( inputs: List, redeemers: Pairs, channel_token: AuthToken, -) -> Option<(ChannelDatum, SpendChannelRedeemer, Output)> { - when +) -> (ChannelDatum, SpendChannelRedeemer, Output) { + expect [channel_input] = list.filter( inputs, fn(input) { input.output |> auth.contain_auth_token(channel_token) }, ) - is { - [channel_input] -> { - expect channel_datum: ChannelDatum = - get_inline_datum(channel_input.output) - pairs.get_first(redeemers, Spend(channel_input.output_reference)) - |> option.map( - fn(spend_channel_redeemer) { - expect spend_channel_redeemer: SpendChannelRedeemer = - spend_channel_redeemer + expect channel_datum: ChannelDatum = get_inline_datum(channel_input.output) - (channel_datum, spend_channel_redeemer, channel_input.output) - }, - ) - } + expect Some(channel_details) = + pairs.get_first(redeemers, Spend(channel_input.output_reference)) + |> option.map( + fn(spend_channel_redeemer) { + expect spend_channel_redeemer: SpendChannelRedeemer = + spend_channel_redeemer - _ -> None - } + (channel_datum, spend_channel_redeemer, channel_input.output) + }, + ) + channel_details } diff --git a/cardano/onchain/validators/spending_channel/acknowledge_packet.ak b/cardano/onchain/validators/spending_channel/acknowledge_packet.ak index 62785b6a..93ddc2e3 100644 --- a/cardano/onchain/validators/spending_channel/acknowledge_packet.ak +++ b/cardano/onchain/validators/spending_channel/acknowledge_packet.ak @@ -57,7 +57,7 @@ validator acknowledge_packet( .. } = transaction - expect Some((datum, channel_redeemer, spent_output)) = + let (datum, channel_redeemer, spent_output) = validator_utils.extract_channel(inputs, redeemers, channel_token) expect [updated_output] = diff --git a/cardano/onchain/validators/spending_channel/chan_close_confirm.ak b/cardano/onchain/validators/spending_channel/chan_close_confirm.ak index 8a2bda68..a3e3d252 100644 --- a/cardano/onchain/validators/spending_channel/chan_close_confirm.ak +++ b/cardano/onchain/validators/spending_channel/chan_close_confirm.ak @@ -53,7 +53,7 @@ validator chan_close_confirm( .. } = transaction - expect Some((datum, channel_redeemer, spent_output)) = + let (datum, channel_redeemer, spent_output) = validator_utils.extract_channel(inputs, redeemers, channel_token) expect [updated_output] = diff --git a/cardano/onchain/validators/spending_channel/chan_close_init.ak b/cardano/onchain/validators/spending_channel/chan_close_init.ak index 3ab07aac..feb6b010 100644 --- a/cardano/onchain/validators/spending_channel/chan_close_init.ak +++ b/cardano/onchain/validators/spending_channel/chan_close_init.ak @@ -39,7 +39,7 @@ validator chan_close_init( .. } = transaction - expect Some((datum, channel_redeemer, spent_output)) = + let (datum, channel_redeemer, spent_output) = validator_utils.extract_channel(inputs, redeemers, channel_token) expect [updated_output] = diff --git a/cardano/onchain/validators/spending_channel/chan_open_ack.ak b/cardano/onchain/validators/spending_channel/chan_open_ack.ak index 641432a2..4aef7e51 100644 --- a/cardano/onchain/validators/spending_channel/chan_open_ack.ak +++ b/cardano/onchain/validators/spending_channel/chan_open_ack.ak @@ -48,7 +48,7 @@ validator chan_open_ack( .. } = transaction - expect Some((datum, channel_redeemer, spent_output)) = + let (datum, channel_redeemer, spent_output) = validator_utils.extract_channel(inputs, redeemers, channel_token) expect [updated_output] = diff --git a/cardano/onchain/validators/spending_channel/chan_open_confirm.ak b/cardano/onchain/validators/spending_channel/chan_open_confirm.ak index 2835e1a1..5389c3fe 100644 --- a/cardano/onchain/validators/spending_channel/chan_open_confirm.ak +++ b/cardano/onchain/validators/spending_channel/chan_open_confirm.ak @@ -55,7 +55,7 @@ validator chan_open_confirm( .. } = transaction - expect Some((datum, channel_redeemer, spent_output)) = + let (datum, channel_redeemer, spent_output) = validator_utils.extract_channel(inputs, redeemers, channel_token) expect [updated_output] = diff --git a/cardano/onchain/validators/spending_channel/recv_packet.ak b/cardano/onchain/validators/spending_channel/recv_packet.ak index 3d49b10a..a377e701 100644 --- a/cardano/onchain/validators/spending_channel/recv_packet.ak +++ b/cardano/onchain/validators/spending_channel/recv_packet.ak @@ -49,7 +49,7 @@ validator recv_packet( .. } = transaction - expect Some((datum, channel_redeemer, spent_output)) = + let (datum, channel_redeemer, spent_output) = validator_utils.extract_channel(inputs, redeemers, channel_token) expect [updated_output] = diff --git a/cardano/onchain/validators/spending_channel/send_packet.ak b/cardano/onchain/validators/spending_channel/send_packet.ak index e63e3949..1e7a9beb 100644 --- a/cardano/onchain/validators/spending_channel/send_packet.ak +++ b/cardano/onchain/validators/spending_channel/send_packet.ak @@ -41,7 +41,7 @@ validator send_packet( .. } = transaction - expect Some((datum, channel_redeemer, spent_output)) = + let (datum, channel_redeemer, spent_output) = validator_utils.extract_channel(inputs, redeemers, channel_token) expect [updated_output] = diff --git a/cardano/onchain/validators/spending_channel/timeout_packet.ak b/cardano/onchain/validators/spending_channel/timeout_packet.ak index 744831c7..9fa7a066 100644 --- a/cardano/onchain/validators/spending_channel/timeout_packet.ak +++ b/cardano/onchain/validators/spending_channel/timeout_packet.ak @@ -54,7 +54,7 @@ validator timeout_packet( .. } = transaction - expect Some((datum, channel_redeemer, spent_output)) = + let (datum, channel_redeemer, spent_output) = validator_utils.extract_channel(inputs, redeemers, channel_token) expect [updated_output] = From 818b9a17f3b02fea77bd9bc968622bea2b1111e3 Mon Sep 17 00:00:00 2001 From: Giovanni Gargiulo Date: Wed, 5 Mar 2025 12:27:20 +0000 Subject: [PATCH 7/9] chore: last optional optional removed --- .../onchain/lib/ibc/utils/validator_utils.ak | 56 +++++++++---------- .../lib/ibc/utils/validator_utils.test.ak | 34 +++++------ .../validators/spending_transfer_module.ak | 8 +-- 3 files changed, 48 insertions(+), 50 deletions(-) diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.ak b/cardano/onchain/lib/ibc/utils/validator_utils.ak index 52ece59f..7d76c840 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.ak @@ -221,36 +221,32 @@ pub fn validate_token_remain( spent_output: Output, outputs: List, tokens: List, -) -> Option { - when +) -> Output { + expect [updated_output] = list.filter(outputs, fn(output) { output.address == spent_output.address }) - is { - [updated_output] -> { - let is_remain = - if list.is_empty(tokens) { - without_lovelace(spent_output.value) == without_lovelace( + + let is_remain = + if list.is_empty(tokens) { + without_lovelace(spent_output.value) == without_lovelace( + updated_output.value, + ) + } else { + list.all( + tokens, + fn(token) { + quantity_of(spent_output.value, token.policy_id, token.name) == quantity_of( updated_output.value, + token.policy_id, + token.name, ) - } else { - list.all( - tokens, - fn(token) { - quantity_of(spent_output.value, token.policy_id, token.name) == quantity_of( - updated_output.value, - token.policy_id, - token.name, - ) - }, - ) - } - - if is_remain { - Some(updated_output) - } else { - None - } + }, + ) } - _ -> None + + if is_remain { + updated_output + } else { + fail @"Invalid tokens amount" } } @@ -258,18 +254,18 @@ pub fn compare_purpose(_key1: ScriptPurpose, _key2: ScriptPurpose) -> Ordering { Greater } -pub fn extract_token_unit(unit: ByteArray) -> Option<(ByteArray, ByteArray)> { +pub fn extract_token_unit(unit: ByteArray) -> (ByteArray, ByteArray) { let len = bytearray.length(unit) if unit == "lovelace" { - Some((ada_policy_id, ada_asset_name)) + (ada_policy_id, ada_asset_name) } else if 28 <= len && len <= 60 { let policy_id = bytearray.take(unit, 28) let name = bytearray.slice(unit, 28, 59) - Some((policy_id, name)) + (policy_id, name) } else { - None + fail @"Could not extract token unit" } } diff --git a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak index 21ad42eb..fb94fc95 100644 --- a/cardano/onchain/lib/ibc/utils/validator_utils.test.ak +++ b/cardano/onchain/lib/ibc/utils/validator_utils.test.ak @@ -439,28 +439,26 @@ test validate_token_remain_succeed() { let (spent_output, outputs, tokens, updated_output) = setup_validate_token_remain() - validator_utils.validate_token_remain(spent_output, outputs, tokens) == Some( - updated_output, - ) + validator_utils.validate_token_remain(spent_output, outputs, tokens) == updated_output } test validate_token_remain_succeed_if_required_tokens_is_empty() { let (spent_output, outputs, _tokens, updated_output) = setup_validate_token_remain() - validator_utils.validate_token_remain(spent_output, outputs, []) == Some( - updated_output, - ) + validator_utils.validate_token_remain(spent_output, outputs, []) == updated_output } -test validate_token_remain_fail_if_token_not_remained() { +test validate_token_remain_fail_if_token_not_remained() fail { let (spent_output, outputs, tokens, _) = setup_validate_token_remain() expect [output, ..] = outputs let output = Output { ..output, value: zero } - validator_utils.validate_token_remain(spent_output, [output], tokens) == None + let result = + validator_utils.validate_token_remain(spent_output, [output], tokens) + result == result } //=====================================extract_token_unit=================================== @@ -476,24 +474,28 @@ fn setup_extract_token_unit() -> (ByteArray, ByteArray, ByteArray) { test extract_token_unit_succeed() { let (unit, policy_id, name) = setup_extract_token_unit() - validator_utils.extract_token_unit(unit) == Some((policy_id, name)) + validator_utils.extract_token_unit(unit) == (policy_id, name) } test extract_token_unit_succeed_if_unit_is_lovelace() { - validator_utils.extract_token_unit("lovelace") == Some( - (ada_policy_id, ada_asset_name), + validator_utils.extract_token_unit("lovelace") == ( + ada_policy_id, + ada_asset_name, ) } -test extract_token_unit_fail_if_unit_length_invalid() { +test extract_token_unit_fail_if_unit_length_invalid_too_long() fail { let too_long_unit = #"a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c2" + let result = validator_utils.extract_token_unit(too_long_unit) + result == result +} + +test extract_token_unit_fail_if_unit_length_invalid_too_short() fail { let too_short_unit = #"a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c2" - and { - validator_utils.extract_token_unit(too_long_unit) == None, - validator_utils.extract_token_unit(too_short_unit) == None, - } + let result = validator_utils.extract_token_unit(too_short_unit) + result == result } //===================================validate_handler_redeemer========================== diff --git a/cardano/onchain/validators/spending_transfer_module.ak b/cardano/onchain/validators/spending_transfer_module.ak index e00de75d..49462fce 100644 --- a/cardano/onchain/validators/spending_transfer_module.ak +++ b/cardano/onchain/validators/spending_transfer_module.ak @@ -56,7 +56,7 @@ validator spend_transfer_module( expect Some(spent_input) = transaction.find_input(inputs, spent_output_ref) let spent_output = spent_input.output - expect Some(updated_output) = + let updated_output = validator_utils.validate_token_remain( spent_output, transaction.outputs, @@ -233,7 +233,7 @@ fn handler_callback( string_utils.hex_string_to_bytes(unprefixed_denom) trace @"spend_transfer_module: demon convert to token unit valid" - expect Some((escrowed_token_policy_id, escrowed_token_name)) = + let (escrowed_token_policy_id, escrowed_token_name) = validator_utils.extract_token_unit(escrowed_token_unit) trace @"spend_transfer_module: extract escrowed token valid" @@ -415,7 +415,7 @@ fn handler_operator( string_utils.hex_string_to_bytes(data.denom) trace @"spend_transfer_module: demon convert to token unit valid" - expect Some((escrowed_token_policy_id, escrowed_token_name)) = + let (escrowed_token_policy_id, escrowed_token_name) = validator_utils.extract_token_unit(escrowed_token_unit) trace @"spend_transfer_module: extract escrowed token valid" @@ -690,7 +690,7 @@ fn validate_refund_packet_token( string_utils.hex_string_to_bytes(data.denom) trace @"spend_transfer_module: demon convert to token unit valid" - expect Some((escrowed_token_policy_id, escrowed_token_name)) = + let (escrowed_token_policy_id, escrowed_token_name) = validator_utils.extract_token_unit(escrowed_token_unit) trace @"spend_transfer_module: extract escrowed token valid" From 21f9163d612f749bf0e023d8ba6dc6d017a8fa04 Mon Sep 17 00:00:00 2001 From: Giovanni Gargiulo Date: Wed, 5 Mar 2025 12:37:21 +0000 Subject: [PATCH 8/9] chore: one more optional removed from auth token validation --- cardano/onchain/lib/ibc/auth.ak | 6 +++--- cardano/onchain/lib/ibc/auth.test.ak | 19 +++++++++++-------- .../spending_channel/acknowledge_packet.ak | 3 +-- .../spending_channel/chan_close_confirm.ak | 3 +-- .../spending_channel/chan_close_init.ak | 3 +-- .../spending_channel/chan_open_ack.ak | 3 +-- .../spending_channel/chan_open_confirm.ak | 3 +-- .../spending_channel/recv_packet.ak | 5 ++--- .../spending_channel/send_packet.ak | 3 +-- .../spending_channel/timeout_packet.ak | 3 +-- .../onchain/validators/spending_connection.ak | 3 +-- 11 files changed, 24 insertions(+), 30 deletions(-) diff --git a/cardano/onchain/lib/ibc/auth.ak b/cardano/onchain/lib/ibc/auth.ak index d207c3e5..f3cc6e06 100644 --- a/cardano/onchain/lib/ibc/auth.ak +++ b/cardano/onchain/lib/ibc/auth.ak @@ -79,13 +79,13 @@ pub fn extract_token_prefix(token_name: ByteArray) -> ByteArray { token_name |> bytearray.slice(20, 23) } -pub fn extract_token_sequence(token_name: ByteArray) -> Option { +pub fn extract_token_sequence(token_name: ByteArray) -> ByteArray { if is_valid_token_name(token_name) { let postfix = bytearray.drop(token_name, 24) - Some(postfix) + postfix } else { - None + fail @"Invalid token" } } diff --git a/cardano/onchain/lib/ibc/auth.test.ak b/cardano/onchain/lib/ibc/auth.test.ak index e9161338..7216522f 100644 --- a/cardano/onchain/lib/ibc/auth.test.ak +++ b/cardano/onchain/lib/ibc/auth.test.ak @@ -183,20 +183,23 @@ test test_extract_token_prefix() { } test test_extract_token_sequence() { - let test_cases: List<(ByteArray, Option)> = + let test_cases: List<(ByteArray, ByteArray)> = [ - ( - // length <= 24 - #"3f334ddd52c8f52f0ada7cce104ba1ba315cf0929ba0640b", - None, - ), - (#"f3b58dc840a819f86dc3477508463d4c3141e119239b722032", Some(#"32")), - (#"ce71a7ad3269dd1796020cd46744571e7e086bf427b1b82e33", Some(#"33")), + (#"f3b58dc840a819f86dc3477508463d4c3141e119239b722032", #"32"), + (#"ce71a7ad3269dd1796020cd46744571e7e086bf427b1b82e33", #"33"), ] test_cases |> list.all(fn(case) { auth.extract_token_sequence(case.1st) == case.2nd }) } +test test_extract_token_sequence_fail() fail { + let result = + auth.extract_token_sequence( + #"3f334ddd52c8f52f0ada7cce104ba1ba315cf0929ba0640b", + ) + result == result +} + //===================================mint_auth_token================================== fn setup_mint_auth_token() -> (AuthToken, Value) { let token = AuthToken { policy_id: "mock policy_id", name: "mock name" } diff --git a/cardano/onchain/validators/spending_channel/acknowledge_packet.ak b/cardano/onchain/validators/spending_channel/acknowledge_packet.ak index 93ddc2e3..12ada905 100644 --- a/cardano/onchain/validators/spending_channel/acknowledge_packet.ak +++ b/cardano/onchain/validators/spending_channel/acknowledge_packet.ak @@ -70,8 +70,7 @@ validator acknowledge_packet( let tx_valid_to = validator_utils.get_tx_valid_to(validity_range) - expect Some(channel_sequence) = - auth.extract_token_sequence(datum.token.name) + let channel_sequence = auth.extract_token_sequence(datum.token.name) let channel_id = chan_keys_mod.format_channel_identifier(channel_sequence) expect AcknowledgePacket { diff --git a/cardano/onchain/validators/spending_channel/chan_close_confirm.ak b/cardano/onchain/validators/spending_channel/chan_close_confirm.ak index a3e3d252..08ef2467 100644 --- a/cardano/onchain/validators/spending_channel/chan_close_confirm.ak +++ b/cardano/onchain/validators/spending_channel/chan_close_confirm.ak @@ -66,8 +66,7 @@ validator chan_close_confirm( let tx_valid_to = validator_utils.get_tx_valid_to(validity_range) - expect Some(channel_sequence) = - auth.extract_token_sequence(datum.token.name) + let channel_sequence = auth.extract_token_sequence(datum.token.name) let channel_id = chan_keys_mod.format_channel_identifier(channel_sequence) expect ChanCloseConfirm { proof_init, proof_height } = channel_redeemer diff --git a/cardano/onchain/validators/spending_channel/chan_close_init.ak b/cardano/onchain/validators/spending_channel/chan_close_init.ak index feb6b010..1258fa0e 100644 --- a/cardano/onchain/validators/spending_channel/chan_close_init.ak +++ b/cardano/onchain/validators/spending_channel/chan_close_init.ak @@ -52,8 +52,7 @@ validator chan_close_init( let tx_valid_to = validator_utils.get_tx_valid_to(validity_range) - expect Some(channel_sequence) = - auth.extract_token_sequence(datum.token.name) + let channel_sequence = auth.extract_token_sequence(datum.token.name) let channel_id = chan_keys_mod.format_channel_identifier(channel_sequence) expect ChanCloseInit == channel_redeemer diff --git a/cardano/onchain/validators/spending_channel/chan_open_ack.ak b/cardano/onchain/validators/spending_channel/chan_open_ack.ak index 4aef7e51..f313f784 100644 --- a/cardano/onchain/validators/spending_channel/chan_open_ack.ak +++ b/cardano/onchain/validators/spending_channel/chan_open_ack.ak @@ -63,8 +63,7 @@ validator chan_open_ack( expect [connection_id] = datum.state.channel.connection_hops - expect Some(channel_sequence) = - auth.extract_token_sequence(datum.token.name) + let channel_sequence = auth.extract_token_sequence(datum.token.name) let channel_id = chan_keys_mod.format_channel_identifier(channel_sequence) expect ChanOpenAck { counterparty_version, proof_try, proof_height } = diff --git a/cardano/onchain/validators/spending_channel/chan_open_confirm.ak b/cardano/onchain/validators/spending_channel/chan_open_confirm.ak index 5389c3fe..58ba52e4 100644 --- a/cardano/onchain/validators/spending_channel/chan_open_confirm.ak +++ b/cardano/onchain/validators/spending_channel/chan_open_confirm.ak @@ -70,8 +70,7 @@ validator chan_open_confirm( expect [connection_id] = datum.state.channel.connection_hops - expect Some(channel_sequence) = - auth.extract_token_sequence(datum.token.name) + let channel_sequence = auth.extract_token_sequence(datum.token.name) let channel_id = chan_keys_mod.format_channel_identifier(channel_sequence) expect ChanOpenConfirm { proof_ack, proof_height } = channel_redeemer diff --git a/cardano/onchain/validators/spending_channel/recv_packet.ak b/cardano/onchain/validators/spending_channel/recv_packet.ak index a377e701..3dd011a6 100644 --- a/cardano/onchain/validators/spending_channel/recv_packet.ak +++ b/cardano/onchain/validators/spending_channel/recv_packet.ak @@ -62,8 +62,7 @@ validator recv_packet( let tx_valid_to = validator_utils.get_tx_valid_to(validity_range) - expect Some(channel_sequence) = - auth.extract_token_sequence(datum.token.name) + let channel_sequence = auth.extract_token_sequence(datum.token.name) trace @"recv_packet: datum.token.name": datum.token.name let channel_id = chan_keys_mod.format_channel_identifier(channel_sequence) @@ -143,7 +142,7 @@ validator recv_packet( //expect OnRecvPacket { channel_id: module_chan_id, acknowledgement, data: _ } = // ibc_module_callback // This block below was removed during the recv_packet.ak merge - // let valid_ordering = + // let valid_ordering = // when cur_channel.ordering is { // chan_order_mod.Unordered -> // !pairs.has_key(cur_packet_receipt, packet.sequence) diff --git a/cardano/onchain/validators/spending_channel/send_packet.ak b/cardano/onchain/validators/spending_channel/send_packet.ak index 1e7a9beb..60f56c0b 100644 --- a/cardano/onchain/validators/spending_channel/send_packet.ak +++ b/cardano/onchain/validators/spending_channel/send_packet.ak @@ -54,8 +54,7 @@ validator send_packet( let tx_valid_to = validator_utils.get_tx_valid_to(validity_range) - expect Some(channel_sequence) = - auth.extract_token_sequence(datum.token.name) + let channel_sequence = auth.extract_token_sequence(datum.token.name) let channel_id = chan_keys_mod.format_channel_identifier(channel_sequence) expect SendPacket { packet } = channel_redeemer diff --git a/cardano/onchain/validators/spending_channel/timeout_packet.ak b/cardano/onchain/validators/spending_channel/timeout_packet.ak index 9fa7a066..036905a5 100644 --- a/cardano/onchain/validators/spending_channel/timeout_packet.ak +++ b/cardano/onchain/validators/spending_channel/timeout_packet.ak @@ -67,8 +67,7 @@ validator timeout_packet( let tx_valid_to = validator_utils.get_tx_valid_to(validity_range) - expect Some(channel_sequence) = - auth.extract_token_sequence(datum.token.name) + let channel_sequence = auth.extract_token_sequence(datum.token.name) let channel_id = chan_keys_mod.format_channel_identifier(channel_sequence) expect TimeoutPacket { diff --git a/cardano/onchain/validators/spending_connection.ak b/cardano/onchain/validators/spending_connection.ak index eabb2b8a..46fe23d4 100644 --- a/cardano/onchain/validators/spending_connection.ak +++ b/cardano/onchain/validators/spending_connection.ak @@ -77,8 +77,7 @@ validator spend_connection( let tx_valid_to = validator_utils.get_tx_valid_to(validity_range) trace @"spend_connection: extract tx valid_to" - expect Some(connection_sequence) = - auth.extract_token_sequence(datum.token.name) + let connection_sequence = auth.extract_token_sequence(datum.token.name) let connection_id = conn_keys.format_connection_identifier(connection_sequence) trace @"spend_connection: extract connection_id" From b9d5dd96d07d42712326aabf7c458381cbd4897c Mon Sep 17 00:00:00 2001 From: Giovanni Gargiulo Date: Wed, 5 Mar 2025 12:44:21 +0000 Subject: [PATCH 9/9] chore: removed last optional option :smile: --- cardano/onchain/validators/spending_handler.ak | 6 +++--- cardano/onchain/validators/spending_transfer_module.ak | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cardano/onchain/validators/spending_handler.ak b/cardano/onchain/validators/spending_handler.ak index 8e45b1a0..ef1e27bf 100644 --- a/cardano/onchain/validators/spending_handler.ak +++ b/cardano/onchain/validators/spending_handler.ak @@ -95,7 +95,7 @@ validator spend_handler( ), } HandlerBindPort -> { - expect Some(port_number) = + let port_number = validate_bind_port(redeemers, datum.token, port_minting_policy_id) handler_datum.validate_bind_port(datum, updated_datum, port_number) @@ -187,7 +187,7 @@ fn validate_bind_port( redeemers: Pairs, handler_token: AuthToken, port_minting_policy_id: PolicyId, -) -> Option { +) -> Int { // valid mint port redeemer for bind port expect Some(mint_port_redeemer) = pairs.get_first(redeemers, Mint(port_minting_policy_id)) @@ -199,5 +199,5 @@ fn validate_bind_port( expect port_handler_token == handler_token - Some(port_number) + port_number } diff --git a/cardano/onchain/validators/spending_transfer_module.ak b/cardano/onchain/validators/spending_transfer_module.ak index 49462fce..aa5bd28b 100644 --- a/cardano/onchain/validators/spending_transfer_module.ak +++ b/cardano/onchain/validators/spending_transfer_module.ak @@ -111,7 +111,7 @@ fn handler_callback( when cb is { OnChanOpenInit { channel_id } -> { - expect Some(output_channel) = + let output_channel = validate_channel_open_init( redeemers, channel_minting_policy_id, @@ -460,7 +460,7 @@ fn validate_channel_open_init( outputs: List, port_id: ByteArray, channel_id: ByteArray, -) -> Option { +) -> Channel { // validate mint channel redeemer expect Some(mint_channel_redeemer) = pairs.get_first(redeemers, Mint(channel_minting_policy_id)) @@ -495,7 +495,7 @@ fn validate_channel_open_init( expect channel_datum.port_id == port_id - Some(channel_datum.state.channel) + channel_datum.state.channel } fn validate_channel_open_try(