Loading...
Loading...
Aiken workflows: validators, building, blueprints, .plutus generation. Safe guidance for smart contract development.
npx skill4agent add flux-point-studios/cardano-agent-skills aiken-smart-contractsaiken new my-project
cd my-projectmy-project/
├── aiken.toml # Project config
├── lib/ # Reusable modules
├── validators/ # Validator entry points
│ └── my_validator.ak
└── plutus.json # Generated blueprint// validators/my_validator.ak
use aiken/transaction.{ScriptContext}
validator {
fn spend(datum: Data, redeemer: Data, ctx: ScriptContext) -> Bool {
// Your validation logic
True
}
}# Build all validators
aiken build
# Run tests
aiken check
# Format code
aiken fmt# Blueprint is auto-generated at plutus.json
# Extract .plutus for cardano-cli:
aiken blueprint convert > my_validator.plutus
# Get script hash
cardano-cli conway transaction policyid \
--script-file my_validator.plutuscardano-cli conway address build \
--payment-script-file my_validator.plutus \
--testnet-magic 1 \
--out-file script.addr// validators/pubkey_lock.ak
use aiken/hash.{Blake2b_224, Hash}
use aiken/transaction.{ScriptContext, Spend}
use aiken/transaction/credential.{VerificationKey}
type Datum {
owner: Hash<Blake2b_224, VerificationKey>
}
type Redeemer {
// Could be unit if no redeemer data needed
}
validator {
fn spend(datum: Datum, _redeemer: Redeemer, ctx: ScriptContext) -> Bool {
let ScriptContext { transaction, purpose } = ctx
expect Spend(_) = purpose
// Check if owner signed the transaction
list.has(transaction.extra_signatories, datum.owner)
}
}# Build
aiken build
# Test
aiken check
# Generate .plutus
aiken blueprint convert > pubkey_lock.plutus// validators/time_lock.ak
use aiken/interval.{Finite, Interval, IntervalBound}
use aiken/transaction.{ScriptContext, ValidityRange}
type Datum {
lock_until: Int // POSIX time in milliseconds
}
validator {
fn spend(datum: Datum, _redeemer: Data, ctx: ScriptContext) -> Bool {
let valid_range: ValidityRange = ctx.transaction.validity_range
// Check if current time is past lock_until
when valid_range.lower_bound.bound_type is {
Finite(tx_earliest_time) -> tx_earliest_time > datum.lock_until
_ -> False
}
}
}aiken build --plutus-version v3shared/PRINCIPLES.mdcardano-cli-plutus-scripts