11use aiken/ collection/ list
22use aiken/ collection/ pairs
3+ use cardano/ address.{Address }
34use cardano/ assets.{PolicyId }
45use cardano/ transaction.{Input , Mint , Output , OutputReference , Transaction }
56use ibc/ auth.{AuthToken }
@@ -27,7 +28,7 @@ validator spend_channel(
2728 spent_output_ref: OutputReference ,
2829 transaction: Transaction ,
2930 ) {
30- let Transaction { inputs, redeemers, .. } = transaction
31+ let Transaction { inputs, redeemers, outputs, .. } = transaction
3132 expect Some (spent_input) = transaction.find_input (inputs, spent_output_ref)
3233 expect Some (datum) = optional_datum
3334 let spent_output = spent_input.output
@@ -38,6 +39,8 @@ validator spend_channel(
3839
3940 expect redeemer: AuthToken = redeemer
4041
42+ expect _ = validate_output_datum (spent_output.address, outputs)
43+
4144 redeemer == datum.token
4245 }
4346
@@ -47,14 +50,16 @@ validator spend_channel(
4750
4851 expect redeemer: AuthToken = redeemer
4952
53+ expect _ = validate_output_datum (spent_output.address, outputs)
54+
5055 redeemer == datum.token
5156 }
5257 ChanCloseInit -> {
5358 expect Some (redeemer) =
5459 pairs.get_first (redeemers, Mint (chan_close_init_policy_id))
5560
5661 expect redeemer: AuthToken = redeemer
57-
62+ expect _ = validate_output_datum (spent_output.address, outputs)
5863 redeemer == datum.token
5964 }
6065 ChanCloseConfirm { .. } -> {
@@ -70,43 +75,38 @@ validator spend_channel(
7075 pairs.get_first (redeemers, Mint (recv_packet_policy_id))
7176
7277 expect redeemer: AuthToken = redeemer
73-
78+ expect _ = validate_output_datum (spent_output.address, outputs)
7479 redeemer == datum.token
7580 }
7681 SendPacket { .. } -> {
7782 expect Some (redeemer) =
7883 pairs.get_first (redeemers, Mint (send_packet_policy_id))
7984
8085 expect redeemer: AuthToken = redeemer
81-
86+ expect _ = validate_output_datum (spent_output.address, outputs)
8287 redeemer == datum.token
8388 }
8489 TimeoutPacket { .. } -> {
8590 expect Some (redeemer) =
8691 pairs.get_first (redeemers, Mint (timeout_packet_policy_id))
8792
8893 expect redeemer: AuthToken = redeemer
89-
94+ expect _ = validate_output_datum (spent_output.address, outputs)
9095 redeemer == datum.token
9196 }
9297 AcknowledgePacket { .. } -> {
9398 expect Some (redeemer) =
9499 pairs.get_first (redeemers, Mint (acknowledge_packet_policy_id))
95100
96101 expect redeemer: AuthToken = redeemer
97-
102+ expect _ = validate_output_datum (spent_output.address, outputs)
98103 redeemer == datum.token
99104 }
100105 RefreshUtxo -> {
101106 expect auth.contain_auth_token (spent_output, datum.token)
102107
103- expect [updated_output] =
104- list.filter (
105- transaction.outputs,
106- fn (output) { output.address == spent_output.address },
107- )
108- expect updated_datum: ChannelDatum =
109- validator_utils.get_inline_datum (updated_output)
108+ let updated_output = find_updated_output (spent_output.address, outputs)
109+ let updated_datum = extract_output_datum (updated_output)
110110
111111 and {
112112 auth.contain_auth_token (updated_output, datum.token),
@@ -120,3 +120,18 @@ validator spend_channel(
120120 fail
121121 }
122122}
123+
124+ fn find_updated_output (address: Address , outputs: List < Output > ) -> Output {
125+ expect [updated_output] =
126+ list.filter (outputs, fn (output) { output.address == address })
127+ updated_output
128+ }
129+
130+ fn extract_output_datum (output: Output ) -> ChannelDatum {
131+ expect datum: ChannelDatum = validator_utils.get_inline_datum (output)
132+ datum
133+ }
134+
135+ fn validate_output_datum (address: Address , outputs: List < Output > ) {
136+ find_updated_output (address, outputs) |> extract_output_datum ()
137+ }
0 commit comments