# Đáp án ### Question 158160 ``` use aiken/dict use aiken/interval use aiken/list use aiken/transaction.{ Mint, NoDatum, Output, ScriptContext, Transaction, TransactionId, } use aiken/transaction/credential.{Address} use aiken/transaction/value pub type Config { allowed_name: ByteArray, target_address: Address, minimum_ada: Int, minting_amount: Int, } fn certificate(config: Config, _redeemer: Data, ctx: ScriptContext) -> Bool { expect Mint(pid) = ctx.purpose let txn = ctx.transaction let address_ada = list.foldl( txn.outputs, 0, fn(o, result) { if o.address == config.target_address { value.lovelace_of(o.value) + result } else { result } }, ) expect [(token_name, qty)] = txn.mint |> value.from_minted_value() |> value.tokens(pid) |> dict.to_list() (address_ada >= config.minimum_ada)? && // (token_name == config.allowed_name)? && // (qty == config.minting_amount)? } ``` ### Question 158163 ``` use aiken/list use aiken/transaction.{Transaction, OutputReference, Input, TransactionId, ScriptContext, Output, NoDatum, InlineDatum, Spend} use aiken/hash.{Blake2b_224, Hash} use aiken/transaction/credential.{VerificationKey, from_verification_key, from_script, VerificationKeyCredential} use aiken/transaction/value.{Value} use aiken/dict use aiken/interval pub type FundraisingCampaignDatum { beneficiary: Hash<Blake2b_224, VerificationKey>, target_amount: Int, // lovelace current_amount: Int, // lovelace } pub type Redeemer { // create fund raising FundRasingCampaign // add money to fund FundAddingMoney } pub fn find_own_input(tx: Transaction, out_ref: OutputReference) -> Option<Input> { list.find(tx.inputs, fn(input) { input.output_reference == out_ref }) } fn raise_fund_campaign(datum: FundraisingCampaignDatum, redeemer: Redeemer, context: ScriptContext) -> Bool { let ScriptContext { purpose, transaction } = context expect Spend(out_ref) = purpose expect Some(own_input) = find_own_input(transaction, out_ref) when redeemer is { FundRasingCampaign -> { list.has(transaction.extra_signatories, datum.beneficiary)? && // datum.target_amount > 0 && // datum.current_amount == 0 } FundAddingMoney -> { expect [treasury] = list.filter( transaction.outputs, fn(output) { output.address == own_input.output.address }, ) expect InlineDatum(inl_dtm) = treasury.datum expect fund_raising_datum: FundraisingCampaignDatum = inl_dtm let total_money_added = list.foldl( transaction.outputs, 0, fn(output, total) { if output.address.payment_credential == VerificationKeyCredential(datum.beneficiary) { total + value.lovelace_of(output.value) } else { total } } ) and { (datum.current_amount < datum.target_amount)?, // (fund_raising_datum.beneficiary == datum.beneficiary)?, // (fund_raising_datum.target_amount == datum.target_amount)?, // (fund_raising_datum.current_amount == datum.current_amount + total_money_added)? // } } } } ``` ### Question 4 (DeleteDigit) ``` use aiken/bytearray use aiken/list use aiken/int fn deleteDigit(n: Int) { let n_str = string.to_bytearray(string.from_int(n)) let length = bytearray.length(n_str) let numbers = list.repeat(n_str, length) let deleted_numbers = list.indexed_map(numbers, fn(i, num) { let deleted_num = bytearray.concat(bytearray.take(num, i), bytearray.drop(num, i)) let new_num = int.from_utf8(deleted_num) when new_num is { Some(a) -> a None -> None } }) list.max(deleted_numbers) } ```