Skip to main content

Smart Contracts

Evolution SDK provides full support for Cardano smart contracts — Plutus V1, V2, and V3. Lock funds to script addresses with datums, spend from scripts with redeemers, mint tokens with minting policies, and reference on-chain scripts to reduce transaction size.

The transaction builder handles script evaluation, redeemer indexing, and collateral selection automatically. You focus on your contract logic.

Smart Contract Flow

How It Works

Smart contract interaction in Cardano involves three concepts:

ConceptPurposeWhen Used
DatumData attached to a UTxO at a script addressWhen locking funds to a script
RedeemerData provided to unlock a script UTxOWhen spending from a script
ScriptThe validator logic (Plutus or Native)Attached to transactions or referenced on-chain

Typical Workflow

Locking (sending funds to a script):

import { Address, Assets, Data, InlineDatum, preprod, Client } from "@evolution-sdk/evolution"

const client = Client.make(preprod)
.withBlockfrost({
baseUrl: "https://cardano-preprod.blockfrost.io/api/v0",
projectId: process.env.BLOCKFROST_API_KEY!
})
.withSeed({ mnemonic: process.env.WALLET_MNEMONIC!, accountIndex: 0 })

// Lock 10 ADA to a script address with an inline datum
const tx = await client
.newTx()
.payToAddress({
address: Address.fromBech32("addr_test1wrm9x2dgvdau8vckj4duc89m638t8djmluqw5pdrFollw8qnmqsyu"),
assets: Assets.fromLovelace(10_000_000n),
datum: new InlineDatum.InlineDatum({ data: Data.constr(0n, []) })
})
.build()

const signed = await tx.sign()
const hash = await signed.submit()

Spending (unlocking funds from a script):

import { Address, Assets, Data, preprod, type UTxO, Client } from "@evolution-sdk/evolution"

const client = Client.make(preprod)
.withBlockfrost({
baseUrl: "https://cardano-preprod.blockfrost.io/api/v0",
projectId: process.env.BLOCKFROST_API_KEY!
})
.withSeed({ mnemonic: process.env.WALLET_MNEMONIC!, accountIndex: 0 })

declare const scriptUtxos: UTxO.UTxO[] // from client.getUtxos(scriptAddress)
declare const validatorScript: any // compiled Plutus script (from Aiken build or Blueprint codegen)

// Spend from script with a redeemer
const tx = await client
.newTx()
.collectFrom({
inputs: scriptUtxos,
redeemer: Data.constr(0n, []) // "Claim" action
})
.attachScript({ script: validatorScript })
.build()

const signed = await tx.sign()
const hash = await signed.submit()

Supported Script Types

TypeDescriptionUse Case
PlutusV1First-generation Plutus scriptsLegacy contracts
PlutusV2Reference scripts, inline datumsMost current contracts
PlutusV3Conway-era features, governanceLatest contracts
NativeScriptTime-locks, multi-sigSimple policies without Plutus

What the Builder Handles

info

You focus on your contract logic — the builder handles the rest. When you build a transaction with scripts, Evolution SDK automatically evaluates scripts (computes execution units), indexes redeemers (after coin selection reorders inputs), selects collateral, calculates fees (including script execution costs), and attaches cost models.

Next Steps