@hydra-sdk/core – Utilities
Hydra SDK provides a comprehensive collection of utility functions for working with Cardano blockchain data, WASM operations, and common development tasks.
Overview
Utilities are organized into multiple categories:
- Keys Utilities - Create and manage cryptographic keys
- Data Parsing - Convert between data formats
- Datum Utilities - Work with Plutus data structures
- Policy Utilities - Manage minting policies
- Metadata Utilities - Convert transaction metadata
- Time Utilities - Calculate slots and time
- Provider Utilities - Abstract blockchain data providers
- Cardano WASM Utilities - Low-level blockchain operations
Import
All utilities are exported as namespaced modules for better organization:
import {
Serializer,
Deserializer,
Resolver,
Converter,
BuildKeys,
ParserUtils,
TimeUtils,
DatumUtils,
PolicyUtils,
MetadataUtils,
ProviderUtils,
CostModels,
KeysUtils,
SLOT_CONFIG_NETWORK
} from '@hydra-sdk/core'
Keys Utilities 1.1.5+
KeysUtils.cardanoCliKeygen() → CardanoCLiKeyPair
Generate an ed25519 key pair compatible with Cardano CLI.
Description: Generate signing and verification keys compatible with Cardano CLI format.
Example:
import { KeysUtils } from '@hydra-sdk/core'
const cardanoKeys = KeysUtils.cardanoCliKeygen()
console.log({
skey: cardanoKeys.sk.cborHex, // PaymentSigningKeyShelley_ed25519
vkey: cardanoKeys.vk.cborHex // PaymentVerificationKeyShelley_ed25519
})
Returns: CardanoCLiKeyPair
{
sk: HydraCliSkey,
vk: HydraCliVkey,
}
KeysUtils.hydraCliKeygen() → HydraCliKeyPair
Generate an ed25519 key pair compatible with Hydra.
Description: Generate signing and verification keys compatible with Hydra CLI format.
Example:
import { KeysUtils } from '@hydra-sdk/core'
const hydraKeys = KeysUtils.hydraCliKeygen()
console.log({
skey: hydraKeys.sk.cborHex, // HydraSigningKey_ed25519
vkey: hydraKeys.vk.cborHex // HydraVerificationKey_ed25519
})
Returns: HydraCliKeyPair
{
sk: HydraCliSkey,
vk: HydraCliVkey,
}
KeysUtils.genVkey(skey: CardanoCLiSkey | HydraCliSkey) → CardanoCLiVkey | HydraCliVkey
Generate a verification key from a signing key.
Parameters:
skey(CardanoCLiSkey | HydraCliSkey): Source signing key
Example:
import { KeysUtils } from '@hydra-sdk/core'
const skey = KeysUtils.cardanoCliKeygen().sk
const vkey = KeysUtils.genVkey(skey)
console.log('Verification Key:', vkey.cborHex)
Returns: CardanoCLiVkey | HydraCliVkey
Corresponding verification key
KeysUtils.mnemonicToCliKey(mnemonic: string[], accountIndex?: number, keyIndex?: number)
→ CardanoCliKeyPair 1.1.6+
Convert a BIP-39 mnemonic phrase to Cardano CLI compatible key pair.
Description: Derives payment keys from a mnemonic phrase using BIP-44 derivation path (m/1852'/1815'/account'/0/keyIndex). This allows you to generate keys that are compatible with Cardano wallets and CLI tools.
Parameters:
mnemonic(string): BIP-39 mnemonic words (12 or 24 words)accountIndex(number, optional): Account index in derivation path (default: 0)keyIndex(number, optional): Key index in derivation path (default: 0)
Example:
import { KeysUtils, AppWallet } from '@hydra-sdk/core'
// Generate a random mnemonic
const mnemonic = AppWallet.brew()
// Convert to CLI keys with default indexes
const keys = KeysUtils.mnemonicToCliKey(mnemonic)
console.log({
skey: keys.sk.cborHex,
vkey: keys.vk.cborHex
})
// Use specific account index (for multiple accounts)
const account1Keys = KeysUtils.mnemonicToCliKey(mnemonic, 1)
// Use specific key index (for multiple addresses)
const addressKeys = KeysUtils.mnemonicToCliKey(mnemonic, 0, 5)
Returns: CardanoCLiKeyPair
{
sk: CardanoCLiSkey, // PaymentSigningKeyShelley_ed25519
vk: CardanoCLiVkey // PaymentVerificationKeyShelley_ed25519
}
Important Notes:
- Uses BIP-44 derivation path:
m/1852'/1815'/accountIndex'/0/keyIndex - Different
accountIndexvalues create different accounts from the same mnemonic - Different
keyIndexvalues create different payment addresses for the same account - Keys are deterministic - same mnemonic + indexes always produce the same keys
- Compatible with Cardano CLI and most Cardano wallets
Data Parsing
ParserUtils.bytesToHex(bytes: ArrayBuffer | Uint8Array | Buffer) → string
Convert bytes to hex string.
Parameters:
bytes(ArrayBuffer | Uint8Array | Buffer): Bytes data to convert
Example:
import { ParserUtils } from '@hydra-sdk/core'
const bytes = new Uint8Array([72, 101, 108, 108, 111])
const hex = ParserUtils.bytesToHex(bytes)
console.log(hex) // "48656c6c6f"
Returns: string
Hex string
ParserUtils.hexToBytes(hex: string) → Buffer
Convert hex string to bytes.
Parameters:
hex(string): Hex string to convert
Example:
import { ParserUtils } from '@hydra-sdk/core'
const bytes = ParserUtils.hexToBytes('48656c6c6f')
console.log(bytes) // <Buffer 48 65 6c 6c 6f>
Returns: Buffer
Bytes data
ParserUtils.stringToHex(str: string) → string
Convert UTF-8 string to hex.
Parameters:
str(string): UTF-8 string
Example:
import { ParserUtils } from '@hydra-sdk/core'
const hex = ParserUtils.stringToHex('Hello World')
console.log(hex) // "48656c6c6f20576f726c64"
Returns: string
Hex string
ParserUtils.hexToString(hex: string) → string
Convert hex string to UTF-8.
Parameters:
hex(string): Hex string to convert
Example:
import { ParserUtils } from '@hydra-sdk/core'
const str = ParserUtils.hexToString('48656c6c6f20576f726c64')
console.log(str) // "Hello World"
Returns: string
UTF-8 string
ParserUtils.toBytes(strOrHex: string) → Uint8Array
Convert string or hex to bytes.
Parameters:
strOrHex(string): String or hex string
Example:
import { ParserUtils } from '@hydra-sdk/core'
const bytes1 = ParserUtils.toBytes('Hello World')
const bytes2 = ParserUtils.toBytes('48656c6c6f')
console.log(bytes1, bytes2)
Returns: Uint8Array
Bytes data
ParserUtils.fromUTF8(str: string) → string
Convert UTF-8 string to hex (alias).
Parameters:
str(string): UTF-8 string
Example:
import { ParserUtils } from '@hydra-sdk/core'
const hex = ParserUtils.fromUTF8('Hello')
console.log(hex) // "48656c6c6f"
Returns: string
Hex string
ParserUtils.toUTF8(hex: string) → string
Convert hex string to UTF-8 (alias).
Parameters:
hex(string): Hex string
Example:
import { ParserUtils } from '@hydra-sdk/core'
const str = ParserUtils.toUTF8('48656c6c6f')
console.log(str) // "Hello"
Returns: string
UTF-8 string
Datum Utilities
DatumUtils.mkInt(n: string | number | bigint) → PlutusData
Create an integer datum.
Parameters:
n(string | number | bigint): Integer value
Example:
import { DatumUtils } from '@hydra-sdk/core'
const intDatum = DatumUtils.mkInt(42)
const bigIntDatum = DatumUtils.mkInt(9007199254740991n)
console.log(intDatum.to_hex())
Returns: PlutusData
Integer datum
DatumUtils.mkBytes(hex: string) → PlutusData
Create a bytes datum from hex string.
Parameters:
hex(string): Hex string of bytes data
Example:
import { DatumUtils } from '@hydra-sdk/core'
const bytesDatum = DatumUtils.mkBytes('deadbeef')
console.log(bytesDatum.to_hex())
Returns: PlutusData
Bytes datum
DatumUtils.mkConstr(alt: number, fields: PlutusData[]) → PlutusData
Create a constructor datum.
Parameters:
alt(number): Constructor index (0-based)fields(PlutusData): Array of Plutus data fields
Example:
import { DatumUtils } from '@hydra-sdk/core'
const constrDatum = DatumUtils.mkConstr(0, [
DatumUtils.mkInt(42),
DatumUtils.mkBytes('deadbeef')
])
console.log(constrDatum.to_hex())
Returns: PlutusData
Constructor datum
DatumUtils.mkMap(entries: Array<[PlutusData, PlutusMapValues]>) → PlutusData
Create a map datum.
Parameters:
entries(Array<PlutusData, PlutusMapValues>): Array of key-value pairs
Example:
import { DatumUtils } from '@hydra-sdk/core'
const mapDatum = DatumUtils.mkMap([
[DatumUtils.mkInt(1), DatumUtils.mkBytes('value1')],
[DatumUtils.mkInt(2), DatumUtils.mkBytes('value2')]
])
console.log(mapDatum.to_hex())
Returns: PlutusData
Map datum
Policy Utilities
PolicyUtils.buildPolicyScriptFromPubkey(pubkeyScript: PubkeyScript) → string
Build a policy script from public key.
Parameters:
pubkeyScript(PubkeyScript):type: 'sig'keyHash(string): Public key hash
Example:
import { PolicyUtils } from '@hydra-sdk/core'
const policyScript = PolicyUtils.buildPolicyScriptFromPubkey({
type: 'sig',
keyHash: 'abc123def456...'
})
console.log('Policy Script:', policyScript)
Returns: string
Native script in JSON format
PolicyUtils.buildMintingPolicyScriptFromAddress(addressBech32: string) → string
Build a minting policy script from an address.
Parameters:
addressBech32(string): Cardano address (bech32)
Example:
import { PolicyUtils } from '@hydra-sdk/core'
const mintingScript = PolicyUtils.buildMintingPolicyScriptFromAddress(
'addr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3jcu5d8ps7zex2k2xt3uqxgjqnnj83ws8lhrn648jjxtwq2ytjqp'
)
console.log('Minting Script:', mintingScript)
Returns: string
Script in JSON format
PolicyUtils.buildMintingPolicyScriptFromKeyHash(keyHash: string) → string
Build a minting policy script from key hash.
Parameters:
keyHash(string): Public key hash (hex)
Example:
import { PolicyUtils } from '@hydra-sdk/core'
const mintingScript =
PolicyUtils.buildMintingPolicyScriptFromKeyHash('abc123...')
console.log('Minting Script:', mintingScript)
Returns: string
Script in JSON format
PolicyUtils.policyIdFromNativeScript(nativeScript: string) → string
Extract Policy ID from native script.
Parameters:
nativeScript(string): Native script in JSON string format
Example:
import { PolicyUtils } from '@hydra-sdk/core'
const policyId = PolicyUtils.policyIdFromNativeScript(policyScript)
console.log('Policy ID:', policyId)
Returns: string
Policy ID (hex hash)
Metadata Utilities
MetadataUtils.metadataObjToMetadatum(metadata: any) → TransactionMetadatum
Convert various data types to Cardano transaction metadata.
Parameters:
metadata(any): Data to convert (string, number, bigint, Uint8Array, array, object, Map)
Example:
import { MetadataUtils } from '@hydra-sdk/core'
// Convert string
const stringMetadata = MetadataUtils.metadataObjToMetadatum('Hello World')
// Convert number
const numberMetadata = MetadataUtils.metadataObjToMetadatum(42)
// Convert bigint
const bigintMetadata = MetadataUtils.metadataObjToMetadatum(9007199254740991n)
// Convert bytes
const bytesMetadata = MetadataUtils.metadataObjToMetadatum(
new Uint8Array([1, 2, 3, 4])
)
// Convert array
const arrayMetadata = MetadataUtils.metadataObjToMetadatum([
'item1',
42,
new Uint8Array([5, 6])
])
// Convert object to map
const objectMetadata = MetadataUtils.metadataObjToMetadatum({
name: 'NFT Name',
image: 'ipfs://...',
attributes: ['trait1', 'trait2']
})
// Convert Map
const mapMetadata = MetadataUtils.metadataObjToMetadatum(
new Map([
['key1', 'value1'],
['key2', 42]
])
)
Returns: TransactionMetadatum
Cardano formatted metadata
Important Notes:
- Maximum metadata
bytessize: 64 bytes - Maximum metadata
textsize: 64 characters - Arrays and Maps are processed recursively, pay attention to total metadata size
Time Utilities
TimeUtils.slotToBeginUnixTime(slot: number, slotConfig: SlotConfig) → number
Convert slot to Unix timestamp.
Parameters:
slot(number): Slot numberslotConfig(SlotConfig): Slot configuration (PREPROD, MAINNET, etc.)
Example:
import { TimeUtils, SLOT_CONFIG_NETWORK } from '@hydra-sdk/core'
const timestamp = TimeUtils.slotToBeginUnixTime(
1000,
SLOT_CONFIG_NETWORK.PREPROD
)
const date = new Date(timestamp * 1000)
console.log('Slot start time:', date.toLocaleString())
Returns: number
Unix timestamp (seconds)
TimeUtils.unixTimeToEnclosingSlot(unixTime: number, slotConfig: SlotConfig) → number
Convert Unix timestamp to slot.
Parameters:
unixTime(number): Unix timestamp (seconds)slotConfig(SlotConfig): Slot configuration
Example:
import { TimeUtils, SLOT_CONFIG_NETWORK } from '@hydra-sdk/core'
const slot = TimeUtils.unixTimeToEnclosingSlot(
Math.floor(Date.now() / 1000),
SLOT_CONFIG_NETWORK.PREPROD
)
console.log('Current slot:', slot)
Returns: number
Slot number
TimeUtils.resolveSlotNo(unixTime: number) → string
Determine slot number based on timestamp.
Parameters:
unixTime(number): Unix timestamp (seconds or milliseconds)
Example:
import { TimeUtils } from '@hydra-sdk/core'
const slotNo = TimeUtils.resolveSlotNo(Date.now())
console.log('Current slot:', slotNo)
Returns: string
Slot number as string
TimeUtils.resolveEpochNo(unixTime: number) → number
Determine epoch number based on timestamp.
Parameters:
unixTime(number): Unix timestamp (seconds or milliseconds)
Example:
import { TimeUtils } from '@hydra-sdk/core'
const epochNo = TimeUtils.resolveEpochNo(Date.now())
console.log('Current epoch:', epochNo)
Returns: number
Epoch number
TimeUtils.buildHydraSlotConfig(unixTime: number) → SlotConfig
Build Hydra slot configuration for a specific timestamp.
Parameters:
unixTime(number): Unix timestamp (seconds)
Example:
import { TimeUtils } from '@hydra-sdk/core'
const slotConfig = TimeUtils.buildHydraSlotConfig(Date.now())
console.log('Hydra Slot Config:', {
zeroTime: slotConfig.zeroTime,
zeroSlot: slotConfig.zeroSlot,
slotLength: slotConfig.slotLength
})
Returns: SlotConfig
Slot configuration
Provider Utilities
BlockfrostProvider.constructor(options: BlockfrostOptions) → BlockfrostProvider
Create a Blockfrost provider to query blockchain data.
Parameters:
options(BlockfrostOptions):projectId(string): Blockfrost project IDnetwork(string): 'mainnet', 'preprod', 'preview'
Example:
import { BlockfrostProvider } from '@hydra-sdk/core'
const provider = new BlockfrostProvider({
projectId: 'your-project-id',
network: 'preprod'
})
// Get UTxOs
const utxos = await provider.getUtxos(address)
// Get protocol parameters
const protocolParams = await provider.getProtocolParameters()
Returns: BlockfrostProvider
Provider instance
OgmiosProvider.constructor(options: OgmiosOptions) → OgmiosProvider
Create an Ogmios provider to connect WebSocket to Cardano node.
Parameters:
options(OgmiosOptions):url(string): WebSocket URL (e.g. 'ws://localhost:1337')
Example:
import { OgmiosProvider } from '@hydra-sdk/core'
const provider = new OgmiosProvider({
url: 'ws://localhost:1337'
})
// Get UTxOs
const utxos = await provider.getUtxos(address)
// Submit transaction
const result = await provider.submitTx(signedTx)
Returns: OgmiosProvider
Provider instance
Cardano WASM Utilities
Serializer.serializeTransaction(transaction: Transaction) → string
Serialize Cardano transaction to CBOR hex format.
Parameters:
transaction(Transaction): Transaction object
Example:
import { Serializer } from '@hydra-sdk/core'
const serializedTx = Serializer.serializeTransaction(transaction)
console.log('Serialized TX:', serializedTx)
Returns: string
CBOR hex string
Deserializer.deserializeTransaction(serializedData: string) → Transaction
Deserialize CBOR data to Cardano transaction.
Parameters:
serializedData(string): CBOR hex string
Example:
import { Deserializer } from '@hydra-sdk/core'
const transaction = Deserializer.deserializeTransaction(cborHex)
console.log('Transaction:', transaction)
Returns: Transaction
Transaction object
Resolver.resolveAddress(bech32Address: string) → Address
Resolve and parse Cardano address.
Parameters:
bech32Address(string): Cardano address (bech32)
Example:
import { Resolver } from '@hydra-sdk/core'
const address = Resolver.resolveAddress(
'addr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3jcu5d8ps7zex2k2xt3uqxgjqnnj83ws8lhrn648jjxtwq2ytjqp'
)
console.log('Address info:', address)
Returns: Address
Parsed address object
Converter.bytesToHex(bytes: Uint8Array) → string
Convert bytes to hex string.
Parameters:
bytes(Uint8Array): Bytes data
Example:
import { Converter } from '@hydra-sdk/core'
const hex = Converter.bytesToHex(new Uint8Array([1, 2, 3, 4]))
console.log(hex) // "01020304"
Returns: string
Hex string
Converter.hexToBytes(hex: string) → Uint8Array
Convert hex string to bytes.
Parameters:
hex(string): Hex string
Example:
import { Converter } from '@hydra-sdk/core'
const bytes = Converter.hexToBytes('01020304')
console.log(bytes) // Uint8Array(4) [ 1, 2, 3, 4 ]
Returns: Uint8Array
Bytes data
BuildKeys.deriveKeys(rootKey: string, derivationPath: string[]) → DerivedKeys
Derive cryptographic keys from root key.
Parameters:
rootKey(string): Root key (hex)derivationPath(string): Derivation path (e.g. "m", "44'", "1815'", "0'", "0", "0")
Example:
import { BuildKeys } from '@hydra-sdk/core'
const derivedKeys = BuildKeys.deriveKeys(rootKeyHex, [
'm',
"44'",
"1815'",
"0'",
'0',
'0'
])
console.log('Derived keys:', derivedKeys)
Returns: DerivedKeys
Derived keys
Cost Models
CostModels.buildCostModels() → Costmdls
Build cost models for Plutus scripts.
Example:
import { CostModels } from '@hydra-sdk/core'
const costModels = CostModels.buildCostModels()
console.log('Cost Models:', costModels)
Returns: Costmdls
Cost models object
Complete Examples
Basic Data Conversion
import {
ParserUtils,
DatumUtils,
PolicyUtils,
SLOT_CONFIG_NETWORK,
TimeUtils
} from '@hydra-sdk/core'
// Convert data
const hex = ParserUtils.stringToHex('Hello Cardano')
const bytes = ParserUtils.hexToBytes(hex)
console.log('Hex:', hex)
console.log('Bytes:', bytes)
// Work with time
const currentSlot = TimeUtils.unixTimeToEnclosingSlot(
Math.floor(Date.now() / 1000),
SLOT_CONFIG_NETWORK.PREPROD
)
const readableTime = new Date(
TimeUtils.slotToBeginUnixTime(currentSlot, SLOT_CONFIG_NETWORK.PREPROD) * 1000
)
console.log('Current slot:', currentSlot)
console.log('Readable time:', readableTime.toLocaleString())
// Create datum
const datum = DatumUtils.mkConstr(0, [
DatumUtils.mkInt(42),
DatumUtils.mkBytes(hex)
])
console.log('Datum hex:', datum.to_hex())
Working with Keys
import { KeysUtils } from '@hydra-sdk/core'
// Generate Cardano CLI keys
const cardanoKeys = KeysUtils.cardanoCliKeygen()
console.log({
signingKey: cardanoKeys.sk.cborHex,
verificationKey: cardanoKeys.vkey.cborHex
})
// Generate Hydra keys
const hydraKeys = KeysUtils.hydraCliKeygen()
console.log({
hydraSigningKey: hydraKeys.sk.cborHex,
hydraVkey: hydraKeys.vkey.cborHex
})
// Generate verification key from signing key
const vkey = KeysUtils.genVkey(cardanoKeys.sk)
console.log('Verification Key:', vkey.cborHex)
Creating Minting Policy
import { PolicyUtils, ParserUtils } from '@hydra-sdk/core'
// Build policy from key hash
const keyHash = '...' // Your public key hash
const policyScript = PolicyUtils.buildMintingPolicyScriptFromKeyHash(keyHash)
// Extract Policy ID
const policyId = PolicyUtils.policyIdFromNativeScript(policyScript)
console.log('Policy ID:', policyId)
// Build policy from address
const address = 'addr1qx2fxv2...'
const addressPolicy = PolicyUtils.buildMintingPolicyScriptFromAddress(address)
const addressPolicyId = PolicyUtils.policyIdFromNativeScript(addressPolicy)
console.log('Address Policy ID:', addressPolicyId)
Handling Metadata
import { MetadataUtils } from '@hydra-sdk/core'
// NFT metadata
const nftMetadata = MetadataUtils.metadataObjToMetadatum({
name: 'My NFT',
image: 'ipfs://QmXxxx...',
description: 'A beautiful NFT',
attributes: [
{ trait_type: 'Rarity', value: 'Rare' },
{ trait_type: 'Color', value: 'Blue' }
]
})
// Custom metadata with numbers and bytes
const customMetadata = MetadataUtils.metadataObjToMetadatum(
new Map([
['owner', 'Alice'],
['value', 1000000],
['hash', new Uint8Array([0x12, 0x34, 0x56, 0x78])]
])
)
console.log('NFT Metadata:', nftMetadata)
console.log('Custom Metadata:', customMetadata)
Query Blockchain with Provider
import { BlockfrostProvider, OgmiosProvider } from '@hydra-sdk/core'
// Using Blockfrost
const blockfrostProvider = new BlockfrostProvider({
projectId: 'your-blockfrost-project-id',
network: 'preprod'
})
const utxos = await blockfrostProvider.getUtxos(address)
const protocolParams = await blockfrostProvider.getProtocolParameters()
console.log('UTxOs:', utxos)
console.log('Protocol Params:', protocolParams)
// Using Ogmios
const ogmiosProvider = new OgmiosProvider({
url: 'ws://localhost:1337'
})
const ogmiosUtxos = await ogmiosProvider.getUtxos(address)
console.log('Ogmios UTxOs:', ogmiosUtxos)
Type Definitions
All utilities come with comprehensive TypeScript definitions:
import type {
SlotConfig,
Network,
PlutusData,
ConstrPlutusData,
PlutusMap,
CardanoCLiSkey,
CardanoCLiVkey,
HydraCliSkey,
HydraCliVkey,
TransactionMetadatum
} from '@hydra-sdk/core'
Related Documentation
- Core API - Wallet and authentication
- Transaction Builder API - Build transactions
- Bridge API - Hydra Layer 2 integration
