Evolution SDK
Smart contracts

Spending from Script

Unlock funds from a script address using redeemers

Spending from Script

Spending from a script means consuming a UTxO locked at a script address by providing a redeemer — the data your validator checks to authorize the spend. Evolution SDK handles script evaluation, redeemer indexing, and collateral selection automatically.

Basic Spend

Use collectFrom to specify which script UTxOs to spend and what redeemer to provide:

import { , , , , type  } from "@evolution-sdk/evolution"

const  = ({
  : "preprod",
  : { : "blockfrost", : "https://cardano-preprod.blockfrost.io/api/v0", : ..! },
  : { : "seed", : ..!, : 0 }
})

declare const : .[]
declare const : any

// Spend script UTxOs with a "Claim" redeemer
const  = await 
  .()
  .({
    : ,
    : .(0n, []) // Constructor 0 = Claim
  })
  .({ :  })
  .()

const  = await .()
const  = await .()

With Required Signer

Many validators check that a specific key signed the transaction. Use addSigner to include the required signer:

import { , , , , , type  } from "@evolution-sdk/evolution"

const  = ({
  : "preprod",
  : { : "blockfrost", : "https://cardano-preprod.blockfrost.io/api/v0", : ..! },
  : { : "seed", : ..!, : 0 }
})

declare const : .[]
declare const : any
declare const : .

const  = await 
  .()
  .({
    : ,
    : .(0n, []) // Claim action
  })
  .({ :  })
  .({ :  })
  .()

const  = await .()
await .()

With Time Constraints

For time-locked validators, set the transaction validity interval so the script can verify the current time:

import { , , type  } from "@evolution-sdk/evolution"

const  = ({
  : "preprod",
  : { : "blockfrost", : "https://cardano-preprod.blockfrost.io/api/v0", : ..! },
  : { : "seed", : ..!, : 0 }
})

declare const : .[]
declare const : any

const  = (.())

const  = await 
  .()
  .({
    : ,
    : .(0n, [])
  })
  .({ :  })
  .({
    : ,           // Valid from now
    :  + 300_000n   // Expires in 5 minutes
  })
  .()

const  = await .()
await .()

Spend and Pay in One Transaction

Collect from a script and send the unlocked funds to a recipient:

import { , , , , type  } from "@evolution-sdk/evolution"

const  = ({
  : "preprod",
  : { : "blockfrost", : "https://cardano-preprod.blockfrost.io/api/v0", : ..! },
  : { : "seed", : ..!, : 0 }
})

declare const : .[]
declare const : any

const  = .(
  "addr_test1vrm9x2dgvdau8vckj4duc89m638t8djmluqw5pdrFollw8qd9k63"
)

const  = await 
  .()
  .({
    : ,
    : .(0n, [])
  })
  .({ :  })
  .({
    : ,
    : .(10_000_000n)
  })
  .()

const  = await .()
await .()

Redeemer Modes

The redeemer parameter supports three modes for different complexity levels. See the Redeemers page for details.

Static — Direct data value (most common):

redeemer: Data.constr(0n, [])

Self — Callback that receives the input's final index:

redeemer: (input) => Data.constr(0n, [BigInt(input.index)])

Batch — Callback for coordinating multiple inputs:

redeemer: {
  all: (inputs) => Data.constr(0n, inputs.map(i => BigInt(i.index))),
  inputs: [utxo1, utxo2]
}

Debug Labels

Add labels to identify operations in error messages when debugging script failures:

import { , , type  } from "@evolution-sdk/evolution"

const  = ({
  : "preprod",
  : { : "blockfrost", : "https://cardano-preprod.blockfrost.io/api/v0", : ..! },
  : { : "seed", : ..!, : 0 }
})

declare const : .[]
declare const : any

const  = await 
  .()
  .({
    : ,
    : .(0n, []),
    : "claim-escrow" // Appears in error messages
  })
  .({ :  })
  .()

Next Steps