Skip to content

Commit e1bfa54

Browse files
committed
chore: implementing datum sanitazioen for spend channel
1 parent 5d2dea6 commit e1bfa54

File tree

2 files changed

+30
-14
lines changed

2 files changed

+30
-14
lines changed

cardano/onchain/validators/minting_port.ak

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use aiken/collection/list
22
use aiken/collection/pairs
33
use cardano/assets.{PolicyId}
4-
use cardano/transaction.{Input, Spend, Transaction}
4+
use cardano/transaction.{Input, NoDatum, Spend, Transaction}
55
use ibc/auth.{AuthToken}
66
use ibc/core/ics_005/port_redeemer.{MintPortRedeemer}
77
use ibc/core/ics_005/types/keys as port_keys
@@ -43,6 +43,7 @@ validator mint_port {
4343
expect [module_output] =
4444
outputs
4545
|> transaction.find_script_outputs(spend_module_script_hash)
46+
expect NoDatum = module_output.datum
4647
and {
4748
valid_handler_operator,
4849
auth.mint_auth_token(mint, port_token),

cardano/onchain/validators/spending_channel.ak

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use aiken/collection/list
22
use aiken/collection/pairs
3+
use cardano/address.{Address}
34
use cardano/assets.{PolicyId}
45
use cardano/transaction.{Input, Mint, Output, OutputReference, Transaction}
56
use 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

Comments
 (0)