- Updated dependencies [
d801fa1]:- @evolution-sdk/evolution@0.3.15
- @evolution-sdk/aiken-uplc@0.0.7
- @evolution-sdk/scalus-uplc@0.0.5
- Updated dependencies [
d21109b]:- @evolution-sdk/evolution@0.3.14
- @evolution-sdk/aiken-uplc@0.0.6
- @evolution-sdk/scalus-uplc@0.0.4
- Updated dependencies [
8494053,2742e40]:- @evolution-sdk/scalus-uplc@0.0.3
- @evolution-sdk/evolution@0.3.13
- @evolution-sdk/aiken-uplc@0.0.5
-
#125
8b8ade7Thanks @solidsnakedev! - # Remove SDK types and consolidate type systemThis release removes the duplicate SDK-level type wrappers and consolidates the type system to use core types throughout the codebase.
- Removed SDK type modules: Deleted redundant type wrappers including
sdk/Address.ts,sdk/AddressDetails.ts,sdk/Assets.ts,sdk/Credential.ts,sdk/Datum.ts,sdk/Delegation.ts,sdk/Network.ts,sdk/OutRef.ts,sdk/PolicyId.ts,sdk/PoolParams.ts,sdk/ProtocolParameters.ts,sdk/Relay.ts,sdk/RewardAddress.ts,sdk/Script.ts,sdk/UTxO.ts, andsdk/Unit.ts - Direct core type usage: All components now use core types directly instead of going through SDK wrappers, simplifying the type system and reducing maintenance burden
- Aiken UPLC evaluator: Fixed incorrect RedeemerTag mappings in the Aiken WASM evaluator
- Changed
cert: "publish"→cert: "cert" - Changed
reward: "withdraw"→reward: "reward" - Fixed
ex_unitsto properly instantiateRedeemer.ExUnitsclass instead of plain objects - Changed
Number()toBigInt()for ExUnits memory and steps values
- Changed
- TransactionHash type handling: Fixed numerous type errors related to
TransactionHashobject usage across test files- Removed incorrect
.fromHex()calls onTransactionHashobjects - Added proper
.toHex()conversions for string operations - Fixed length checks and string comparisons to use hex representation
- Removed incorrect
- Simplified type imports across the codebase
- Reduced code duplication between SDK and core type definitions
- Improved type safety by using Effect Schema validation throughout
- Removed SDK type modules: Deleted redundant type wrappers including
-
Updated dependencies [
15be602,150fde4,8b8ade7]:- @evolution-sdk/evolution@0.3.12
- @evolution-sdk/scalus-uplc@0.0.2
- @evolution-sdk/aiken-uplc@0.0.4
-
#122
079fd98Thanks @solidsnakedev! - Add propose and vote APIs: introduce new operations for creating governance proposals and casting votes, including supporting types, procedures, and validators. -
Updated dependencies [
079fd98]:- @evolution-sdk/evolution@0.3.11
- @evolution-sdk/aiken-uplc@0.0.3
-
#120
ed9bdc0Thanks @solidsnakedev! - Add governance and pool operation APIs to transaction builderThis release adds comprehensive support for Conway-era governance operations and stake pool management:
New Delegation APIs
delegateToPool: Delegate stake to a pool (with optional registration)delegateToDRep: Delegate voting power to a DRep (with optional registration)delegateToPoolAndDRep: Delegate to both pool and DRep simultaneously
DRep Operations
registerDRep: Register as a Delegated RepresentativeupdateDRep: Update DRep anchor/metadataderegisterDRep: Deregister DRep and reclaim deposit
Constitutional Committee Operations
authCommitteeHot: Authorize hot credential for committee memberresignCommitteeCold: Resign from constitutional committee
Stake Pool Operations
registerPool: Register a new stake pool with parametersretirePool: Retire a stake pool at specified epoch
Transaction Balance Improvements
- Proper accounting for certificate deposits and refunds
- Withdrawal balance calculations
- Minimum 1 input requirement enforcement (replay attack prevention)
-
Updated dependencies [
ed9bdc0]:- @evolution-sdk/aiken-uplc@0.0.2
- @evolution-sdk/evolution@0.3.10
-
#115
0503b96Thanks @solidsnakedev! - ### TxBuilder Composition APIAdd
compose()andgetPrograms()methods for modular transaction building:// Create reusable builder fragments const mintBuilder = client .newTx() .mintAssets({ policyId, assets: { tokenName: 1n }, redeemer }) .attachScript({ script: mintingPolicy }) const metadataBuilder = client.newTx().attachMetadata({ label: 674n, metadata: "Composed transaction" }) // Compose multiple builders into one transaction const tx = await client .newTx() .payToAddress({ address, assets: { lovelace: 5_000_000n } }) .compose(mintBuilder) .compose(metadataBuilder) .build()
Features:
- Merge operations from multiple builders into a single transaction
- Snapshot accumulated operations with
getPrograms()for inspection - Compose builders from different client instances
- Works with all builder methods (payments, validity, metadata, minting, staking, etc.)
Fixed bug where validity interval fields (
ttlandvalidityIntervalStart) were not included during fee calculation, causing "insufficient fee" errors when usingsetValidity().Root Cause: Validity fields were being added during transaction assembly AFTER fee calculation completed, causing the actual transaction to be 3-8 bytes larger than estimated.
Fix: Convert validity Unix times to slots BEFORE the fee calculation loop and include them in the TransactionBody during size estimation.
Corrected error types for pure constructor functions to use
neverinstead ofTransactionBuilderError:makeTxOutput- creates TransactionOutputtxOutputToTransactionOutput- creates TransactionOutputmergeAssetsIntoUTxO- creates UTxOmergeAssetsIntoOutput- creates TransactionOutputbuildTransactionInputs- creates and sorts TransactionInputs
Enhanced error messages throughout the builder to include underlying error details for better debugging.
-
Updated dependencies [
59b6187,0503b96]:- @evolution-sdk/aiken-uplc@0.0.1
- @evolution-sdk/evolution@0.3.9
- Updated dependencies [
7905507]:- @evolution-sdk/evolution@0.3.8
-
#109
0730f23Thanks @solidsnakedev! - ### TxBuilder setValidity APIAdd
setValidity()method to TxBuilder for setting transaction validity intervals:client.newTx() .setValidity({ from: Date.now(), // Valid after this Unix time (optional) to: Date.now() + 300_000 // Expires after this Unix time (optional) }) .payToAddress({ ... }) .build()
- Times are provided as Unix milliseconds and converted to slots during transaction assembly
- At least one of
fromortomust be specified - Validates that
from < towhen both are provided
Add
slotConfigparameter tocreateClient()for custom slot configurations:const slotConfig = Cluster.getSlotConfig(devnetCluster) const client = createClient({ network: 0, slotConfig, // Custom slot config for devnet provider: { ... }, wallet: { ... } })
Priority chain for slot config resolution:
BuildOptions.slotConfig(per-transaction override)TxBuilderConfig.slotConfig(client default)SLOT_CONFIG_NETWORK[network](hardcoded fallback)
Add
getSlotConfig()helper to derive slot configuration from devnet cluster genesis:const slotConfig = Cluster.getSlotConfig(cluster) // Returns: { zeroTime, zeroSlot, slotLength }
-
Updated dependencies [
c59507e,9ddc79d,0730f23]:- @evolution-sdk/evolution@0.3.7
-
#107
1e1aec8Thanks @solidsnakedev! - ### Added: Redeemer Labels for Script DebuggingAdded optional
labelproperty to redeemer operations (collectFrom,withdraw,mint, and stake operations) to help identify which script failed during evaluation.client .newTx() .collectFrom({ inputs: [utxo], redeemer: makeSpendRedeemer(999n), label: "coordinator-spend-utxo" // Shows in failure output }) .withdraw({ stakeCredential, amount: 0n, redeemer: makeWithdrawRedeemer([999n]), label: "coordinator-withdrawal" })
When scripts fail, the
EvaluationErrornow includes a structuredfailuresarray:interface ScriptFailure { purpose: "spend" | "mint" | "withdraw" | "cert" index: number label?: string // User-provided label redeemerKey: string // e.g., "spend:0", "withdraw:0" utxoRef?: string // For spend failures credential?: string // For withdraw/cert failures policyId?: string // For mint failures validationError: string traces: string[] }
Full support for Conway-era stake operations:
registerStake- Register stake credential (RegCert)deregisterStake- Deregister stake credential (UnregCert)delegateTo- Delegate to pool and/or DRep (StakeDelegation, VoteDelegCert, StakeVoteDelegCert)registerAndDelegateTo- Combined registration + delegation (StakeRegDelegCert, VoteRegDelegCert, StakeVoteRegDelegCert)withdraw- Withdraw staking rewards (supports coordinator pattern with amount: 0n)
All operations support script-controlled credentials with RedeemerBuilder for deferred redeemer resolution.
-
Updated dependencies [
1e1aec8]:- @evolution-sdk/evolution@0.3.6
-
#105
98b59faThanks @solidsnakedev! - Add deferred redeemer construction for dynamic index resolutionRedeemerBuilder module (
RedeemerBuilder.ts):IndexedInputtype:{ index: number, utxo: UTxO }- provides the final sorted index and original UTxO after coin selection- Three modes for redeemer construction:
Static: Direct Data value when index not neededSelf: Per-input function(input: IndexedInput) => Datafor single UTxO indexBatch: Multi-input function(inputs: IndexedInput[]) => Datafor stake validator coordinator pattern
- Type guards:
isSelfFn,isBatchBuilder,isStaticData - Internal types:
DeferredRedeemer,toDeferredRedeemer
Evaluation phase updates:
- Add
resolveDeferredRedeemersto convert deferred redeemers after coin selection - Build
refToIndexandrefToUtxomappings from sorted inputs - Invoke Self/Batch callbacks with resolved
IndexedInputobjects
Operations updates:
collectFromandmintTokensnow acceptRedeemerArg(Data | SelfRedeemerFn | BatchRedeemerBuilder)- Store deferred redeemers in
state.deferredRedeemersfor later resolution
Test coverage (
TxBuilder.RedeemerBuilder.test.ts):- Tests for all three modes with mint_multi_validator.ak spec
Architecture docs (
redeemer-indexing.mdx):- Document the circular dependency problem and deferred construction solution
- Explain stake validator coordinator pattern with O(1) index lookup
-
Updated dependencies [
98b59fa]:- @evolution-sdk/evolution@0.3.5
-
#101
aaf0882Thanks @solidsnakedev! - ### Core Module EnhancementsMint Module
- Added
Mint.getByHex()andMint.getAssetsByPolicyHex()utilities for hex-based lookups - Fixed
Mint.insert,removePolicy,removeAsset, andgetto use content-based equality (Equal.equals) instead of reference equality for PolicyId/AssetName lookups
Fee Calculation
- Fixed
calculateFeeIterativelyto include mint field in fee calculation via TxContext access - Removed unnecessary 5000n fee buffer that caused fee overpayment
Transaction Builder
- Added
.mint()method to TransactionBuilder for native token minting/burning .attachScript()now accepts{ script: CoreScript }parameter format- Improved type safety by using Core types directly instead of SDK wrappers
Test Infrastructure
- Added
TxBuilder.Mint.test.tswith devnet submit tests for minting and burning - Updated
TxBuilder.Scripts.test.tsto use Core types (PlutusV2.PlutusV2) instead of SDK format - Refactored
createCoreTestUtxohelper to accept CoreScripttypes directly - Removed unused
createTestUtxo(SDK format) helper - Added
Genesis.calculateUtxosFromConfig()for retrieving initial UTxOs from genesis config - Replaced all
Buffer.from().toString("hex")withText.toHex()in tests
attachScript()now requires{ script: ... }object format instead of passing script directly- Test helpers now use Core types exclusively
- Added
-
#104
c26391aThanks @solidsnakedev! - ### PlutusV3 Minting Support- Add PlutusV3 script minting with automatic script evaluation via Ogmios
- Add
mintAssetsbuilder method for Plutus script-based minting policies - Add
attachScriptbuilder method for attaching Plutus scripts to transactions - Support both minting (positive amounts) and burning (negative amounts)
- Breaking: Change
redeemerparameter type fromstring(CBOR hex) toData.Data- Affects
collectFrom()andmintAssets()builder methods - Provides type-safe redeemer construction without manual CBOR encoding
- Example:
redeemer: Data.constr(0n, [Data.int(1n)])instead of hex strings
- Affects
- Add
Redeemersmodule with Conway CDDL-compliant encoding (array format) - Refactor
hashScriptDatato use proper module encoders for redeemers and datums - Add
Redeemers.toCBORBytes()for script data hash computation
- Store
PlutusData.Datadirectly in builder state instead of CBOR hex strings - Remove redundant CBOR hex encoding/decoding in transaction assembly
- Add PlutusV3 minting devnet tests with real script evaluation
-
Updated dependencies [
aaf0882,65b7259,c26391a]:- @evolution-sdk/evolution@0.3.4
-
#98
ef563f3Thanks @solidsnakedev! - Migrate transaction builder and provider layer to use Core UTxO types throughout the SDK.Core.UTxO— Schema-validated UTxO with branded types (TransactionHash,Address,Assets)Core.Assets— Enhanced withmerge,subtract,negate,getAsset,setAsset,hasAssetoperationsCore.Time— New module for slot/time conversions withSlotConfig,Slot,UnixTimeCore.Address— AddedgetAddressDetails,getPaymentCredential,getStakingCredentialutilities
- Provider methods (
getUtxos,getUtxoByUnit,getUtxosWithUnit) now returnCore.UTxO.UTxO[] - Client methods (
getWalletUtxos,newTx) use Core UTxO internally - Transaction builder accepts
Core.UTxO.UTxO[]foravailableUtxos Genesis.calculateUtxosFromConfigandGenesis.queryUtxosreturn Core UTxOs
The SDK previously used a lightweight
{ txHash, outputIndex, address, assets }record for UTxOs, requiring constant conversions when interfacing with the Core layer (transaction building, CBOR serialization). This caused:- Conversion overhead — Every transaction build required converting SDK UTxOs to Core types
- Type ambiguity —
txHash: stringvsTransactionHash,address: stringvsAddressled to runtime errors - Inconsistent APIs — Some methods returned Core types, others SDK types
By standardizing on Core UTxO:
- Zero conversion — UTxOs flow directly from provider → wallet → builder → transaction
- Type safety — Branded types prevent mixing up transaction hashes, addresses, policy IDs
- Unified model — Single UTxO representation across the entire SDK
// Before const lovelace = Assets.getAsset(utxo.assets, "lovelace") const txId = utxo.txHash const idx = utxo.outputIndex const addr = utxo.address // string // After const lovelace = utxo.assets.lovelace const txId = Core.TransactionHash.toHex(utxo.transactionId) const idx = utxo.index // bigint const addr = Core.Address.toBech32(utxo.address) // or use Address directly
-
Updated dependencies [
ef563f3]:- @evolution-sdk/evolution@0.3.3
-
#93
7edb423Thanks @solidsnakedev! - Fix module resolution error by moving @noble/hashes from peerDependencies to dependencies. This resolves the "Package subpath './blake2' is not defined by exports" error when users install the package. -
Updated dependencies [
61ffded]:- @evolution-sdk/evolution@0.3.2
- Updated dependencies [
5ee95bc]:- @evolution-sdk/evolution@0.3.1
-
#80
b52e9c7Thanks @solidsnakedev! - Restructured module exports for better modularity and clarity:- Replaced monolithic
DevnetandDevnetDefaultexports with granular named exports:Cluster,Config,Container,Genesis, andImages - Renamed types:
DevNetCluster→Cluster.Cluster,DevNetContainer→Container.Container - Moved
DEFAULT_SHELLEY_GENESISfromDevnetDefaulttoConfigmodule
New Features:
- Genesis module - Calculate and query genesis UTxOs with Cardano's
initialFundsPseudoTxInalgorithm:calculateUtxosFromConfig()- Deterministically compute genesis UTxOs from Shelley genesis configuration using blake2b-256 hashingqueryUtxos()- Query actual genesis UTxOs from running node via cardano-cli- Provides predictable UTxO structure for testing without node interaction
- Images module - Docker image management utilities:
isAvailable()- Check if Docker image exists locallypull()- Pull Docker images with progress loggingensureAvailable()- Conditionally pull images only when needed
Improvements:
- Enhanced error handling with specific error reasons (
address_conversion_failed,utxo_query_failed,utxo_parse_failed,image_inspection_failed,image_pull_failed) - All operations provide both Effect-based and Promise-based APIs for flexibility
- Improved test coverage with descriptive cluster names for easier debugging
- Full Effect error channel integration throughout the package
Breaking Changes:
Migration required for existing devnet users:
// Before import { Devnet, DevnetDefault } from "@evolution-sdk/devnet" const cluster = await Devnet.Cluster.make() const config = DevnetDefault.DEFAULT_SHELLEY_GENESIS // After import { Cluster, Config } from "@evolution-sdk/devnet" const cluster = await Cluster.make() const config = Config.DEFAULT_SHELLEY_GENESIS
All module functionality remains the same, only import syntax has changed to use destructured named exports from the main package.
- Replaced monolithic
- #76
1f0671cThanks @solidsnakedev! - Initial release of @evolution-sdk/devnet as a standalone package. Extracted from @evolution-sdk/evolution for better modularity and maintainability.
- Updated dependencies [
1f0671c]:- @evolution-sdk/evolution@0.3.0
- Initial release of @evolution-sdk/devnet as a standalone package
- Extracted from @evolution-sdk/evolution for better modularity
- Full Docker-based local Cardano devnet support
- Configurable genesis parameters and network settings
- Optional Kupo and Ogmios service integration
- Effect-based API for type-safe async operations
- Deterministic genesis UTxO calculation
- Comprehensive test suite included