Skip to content

Commit 64ac179

Browse files
authored
Merge pull request #256 from cardano-foundation/fix/ID-203-Unintended-Voucher-Minting
Fix: Prevent unintended voucher(s) from being minted
2 parents 5547965 + 2f4ca5b commit 64ac179

File tree

3 files changed

+118
-1
lines changed

3 files changed

+118
-1
lines changed

cardano/onchain/validators/minting_voucher.test.ak

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use ibc/apps/transfer/types/coin as transfer_coin
1515
use ibc/apps/transfer/types/fungible_token_packet_data.{FungibleTokenPacketData}
1616
use ibc/auth.{AuthToken}
1717
use ibc/core/ics_004/types/acknowledgement
18-
use ibc/core/ics_004/types/acknowledgement_response.{AcknowledgementResult}
1918
use ibc/core/ics_005/types/ibc_module_redeemer.{
2019
Callback, OnAcknowledgementPacket, OnRecvPacket, OnTimeoutPacket, Operator,
2120
TransferModuleData, TransferModuleOperator,

cardano/onchain/validators/spending_transfer_module.ak

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,10 @@ fn handler_callback(
264264
packet.source_channel,
265265
data.denom,
266266
) {
267+
// check no minting voucher here
268+
expect None =
269+
pairs.get_first(redeemers, Mint(voucher_minting_policy_id))
270+
267271
let voucher_prefix_len =
268272
transfer_coin.get_denom_prefix(
269273
packet.source_port,
@@ -794,6 +798,9 @@ fn validate_refund_packet_token(
794798
packet.source_channel,
795799
data.denom,
796800
) {
801+
// check no minting voucher here
802+
expect None = pairs.get_first(redeemers, Mint(voucher_minting_policy_id))
803+
797804
expect Some(escrowed_token_unit) =
798805
string_utils.hex_string_to_bytes(data.denom)
799806
trace @"spend_transfer_module: demon convert to token unit valid"

cardano/onchain/validators/spending_transfer_module.test.ak

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,117 @@ test on_recv_packet_unescrow_succeed() {
712712
)
713713
}
714714

715+
test on_recv_packet_unescrow_fail_unwanted_voucher() fail {
716+
let mock = setup()
717+
718+
let transfer_amount = 1234
719+
720+
let receiver = mock.cardano_public_key_hash
721+
722+
//==========================arrange inputs=========================
723+
let inputs = [mock.module_input, mock.channel_input]
724+
725+
//==========================arrange outputs=========================
726+
let module_output =
727+
Output {
728+
..mock.module_output,
729+
value: mock.module_output.value
730+
|> add(ada_policy_id, ada_asset_name, -transfer_amount),
731+
}
732+
733+
expect Some(receiver_public_key_hash) =
734+
string_utils.hex_string_to_bytes(receiver)
735+
736+
let receiver_output =
737+
Output {
738+
address: from_verification_key(receiver_public_key_hash),
739+
value: from_asset(ada_policy_id, ada_asset_name, transfer_amount),
740+
datum: NoDatum,
741+
reference_script: None,
742+
}
743+
744+
let outputs = [module_output, mock.channel_output, receiver_output]
745+
746+
//==========================arrange redeemers=========================
747+
let acknowledgement = acknowledgement_mod.new_result_acknowledgement("AQ==")
748+
749+
let source_port = "port-0"
750+
let source_channel = "channel-0"
751+
752+
let denom =
753+
transfer_coin.get_denom_prefix(source_port, source_channel)
754+
|> bytearray.concat("6c6f76656c616365")
755+
756+
let (ftpd, packet) =
757+
build_packet(
758+
denom,
759+
transfer_amount,
760+
mock.cosmos_address,
761+
receiver,
762+
source_port,
763+
source_channel,
764+
mock.port_id,
765+
mock.channel_id,
766+
)
767+
768+
let packet_data = TransferModuleData(ftpd)
769+
770+
let module_redeemer: Redeemer =
771+
Callback(
772+
OnRecvPacket {
773+
channel_id: mock.channel_id,
774+
acknowledgement,
775+
data: packet_data,
776+
},
777+
)
778+
779+
let channel_redeemer: Redeemer =
780+
RecvPacket {
781+
packet,
782+
proof_commitment: mock.proof,
783+
proof_height: mock.proof_height,
784+
}
785+
786+
let mint_voucher_redeemer: Redeemer =
787+
MintVoucher {
788+
packet_source_port: packet.source_port,
789+
packet_source_channel: packet.source_channel,
790+
packet_dest_port: packet.destination_port,
791+
packet_dest_channel: packet.destination_channel,
792+
}
793+
794+
let redeemers: Pairs<ScriptPurpose, Redeemer> =
795+
[
796+
Pair(Spend(mock.module_input.output_reference), module_redeemer),
797+
Pair(Spend(mock.channel_input.output_reference), channel_redeemer),
798+
Pair(Mint(mock.voucher_minting_policy_id), mint_voucher_redeemer),
799+
]
800+
801+
//==========================arrange context=========================
802+
let transaction =
803+
Transaction {
804+
..transaction.placeholder,
805+
inputs: inputs,
806+
outputs: outputs,
807+
redeemers: redeemers,
808+
}
809+
810+
expect module_redeemer: IBCModuleRedeemer = module_redeemer
811+
812+
spending_transfer_module.spend_transfer_module.spend(
813+
mock.handler_token,
814+
mock.port_token,
815+
mock.module_token,
816+
mock.port_id,
817+
mock.channel_minting_policy_id,
818+
mock.voucher_minting_policy_id,
819+
None,
820+
module_redeemer,
821+
mock.module_input.output_reference,
822+
transaction,
823+
)
824+
}
825+
715826
test transfer_escrow_succeed() {
716827
let mock = setup()
717828

0 commit comments

Comments
 (0)