// V3 - datum may be None
spend(datum: Option<Datum>, ...) {
expect Some(d) = datum // Fail if None when you need it
// or
when datum is {
Some(d) -> handle_datum(d)
None -> handle_no_datum()
}
}
3. Update return logic
// V2 - return Bool
if condition { True } else { False }
// V3 - return () or fail
if condition { () } else { fail @"Condition not met" }
// or use expect
expect condition
4. Script hash changes
V3 scripts have different hashes than V2 equivalents
Recalculate all script addresses
Update any hardcoded references
Examples
Example: Simple V3 spending validator
use aiken/collection/list
use cardano/transaction.{Transaction, OutputReference}
type Datum {
owner: ByteArray,
}
type Redeemer {
// empty
}
validator simple_lock {
spend(
datum: Option<Datum>,
_redeemer: Redeemer,
_own_ref: OutputReference,
tx: Transaction,
) {
expect Some(d) = datum
list.has(tx.extra_signatories, d.owner)
}
}
Example: Governance voting script
use cardano/transaction.{Transaction}
use cardano/governance.{Voter, ProposalProcedure}
validator dao_governance {
vote(
redeemer: Data,
voter: Voter,
tx: Transaction,
) {
// Check voter is authorized
// Check voting rules are followed
True
}
propose(
redeemer: Data,
proposal: ProposalProcedure,
tx: Transaction,
) {
// Check proposer has required stake
// Check proposal format
True
}
}