Hydra Integration Examples

Examples based on real integration patterns used in the Hydra SDK ecosystem.

Basic Hydra Transaction Building

typescript
import { TxBuilder } from '@hydra-sdk/transaction'

// Hydra transactions có fees khác với Cardano mainnet
const txBuilder = new TxBuilder({ 
  isHydra: true, 
  params: { 
    minFeeA: 0, // Hydra có fee structure khác
    minFeeB: 0 
  } 
})

// Build transaction như bình thường
const tx = await txBuilder
  .setInputs(utxos)
  .addOutput({
    address: recipientAddress,
    amount: [{ unit: 'lovelace', quantity: '1000000' }]
  })
  .setChangeAddress(changeAddress)
  .complete()

console.log('Hydra Transaction:', tx.to_hex())

Hydra Bridge Connection (From Real Usage Patterns)

typescript
import { HydraBridge, HexcoreConnector } from '@hydra-sdk/bridge'

// Socket.IO connection với authentication
const bridge = new HydraBridge({
  connector: new HexcoreConnector(
    'wss://alpha-v1-api.hexcore.io.vn', 
    { 
      socketIoOptions: { 
        auth: { token: 'your-jwt-token-here' } 
      } 
    }
  )
})

// Event handlers theo patterns thực tế
bridge.events.on('onConnected', () => {
  console.log('✅ Connected to Hydra Head')
})

bridge.events.on('onDisconnected', () => {
  console.log('❌ Disconnected from Hydra Head')
})

bridge.events.on('onHeadIsOpen', (data) => {
  console.log('🚀 Hydra Head is open:', data)
})

bridge.events.on('onHeadIsClosed', (data) => {
  console.log('🔒 Hydra Head is closed:', data)
})

bridge.events.on('onTxValid', (txHash) => {
  console.log('✅ Transaction valid:', txHash)
})

bridge.events.on('onTxInvalid', (txHash, reason) => {
  console.log('❌ Transaction invalid:', txHash, reason)
})

// Connect và cleanup
await bridge.connect()

// Cleanup trong Vue/React lifecycle
// onBeforeUnmount(() => bridge?.disconnect())

Custom API Integration với Hydra

typescript
// Pattern từ nodejs-playground cho Hydra API calls
import { convertUTxOObjectToUTxO, UTxO } from '@hydra-sdk/core'
import axios from 'axios'

class HydraHexcoreApi {
  private instance = axios.create({
    baseURL: 'https://alpha-v1-api.hexcore.io.vn',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${process.env.HEXCORE_API_TOKEN}`
    }
  })

  async queryAddressUTxO(address: string): Promise<UTxO[]> {
    try {
      const response = await this.instance.get(`hydra-main/utxo/${address}`)

      if (response.data.data) {
        return convertUTxOObjectToUTxO(response.data.data)
      } else {
        throw new Error('No UTxO data found in Hydra response')
      }
    } catch (error) {
      console.error('Error querying Hydra UTxO:', error)
      throw error
    }
  }

  async submitHydraTx(cborHex: string) {
    try {
      const response = await this.instance.post('/hydra-main/tx', {
        cborHex
      })
      return response.data.txHash
    } catch (error) {
      console.error('Error submitting to Hydra:', error)
      throw error
    }
  }
}

// Usage
const hydraApi = new HydraHexcoreApi()
const utxos = await hydraApi.queryAddressUTxO(walletAddress)

Environment-specific Configuration

typescript
// Pattern cho environment configuration
import { NETWORK_ID } from '@hydra-sdk/core'

const getNetworkConfig = (isHydra: boolean = false) => {
  if (isHydra) {
    return {
      networkId: NETWORK_ID.PREPROD, // Hydra sử dụng preprod network
      apiEndpoint: 'https://alpha-v1-api.hexcore.io.vn',
      socketEndpoint: 'wss://alpha-v1-api.hexcore.io.vn',
      isHydra: true,
      txParams: {
        minFeeA: 0,
        minFeeB: 0
      }
    }
  } else {
    return {
      networkId: NETWORK_ID.PREPROD,
      apiEndpoint: 'https://preprod.blockfrost.io/api/v0',
      socketEndpoint: null,
      isHydra: false,
      txParams: {
        minFeeA: 44,
        minFeeB: 155381
      }
    }
  }
}

// Usage trong application
const config = getNetworkConfig(process.env.USE_HYDRA === 'true')
const txBuilder = new TxBuilder({ 
  isHydra: config.isHydra, 
  params: config.txParams 
})

Complete Hydra Integration Example

typescript
import { AppWallet, NETWORK_ID } from '@hydra-sdk/core'
import { TxBuilder } from '@hydra-sdk/transaction'
import { HydraBridge, HexcoreConnector } from '@hydra-sdk/bridge'

class HydraWalletManager {
  private wallet: AppWallet
  private bridge: HydraBridge
  private hydraApi: HydraHexcoreApi

  constructor(mnemonic: string[], jwtToken: string) {
    this.wallet = new AppWallet({
      key: { type: 'mnemonic', words: mnemonic },
      networkId: NETWORK_ID.PREPROD
    })

    this.bridge = new HydraBridge({
      connector: new HexcoreConnector(
        'wss://alpha-v1-api.hexcore.io.vn',
        { socketIoOptions: { auth: { token: jwtToken } } }
      )
    })

    this.hydraApi = new HydraHexcoreApi()
    this.setupEventHandlers()
  }

  private setupEventHandlers() {
    this.bridge.events.on('onConnected', () => {
      console.log('🔗 Hydra Bridge Connected')
    })

    this.bridge.events.on('onTxValid', (txHash) => {
      console.log('✅ Hydra TX Valid:', txHash)
    })
  }

  async sendHydraTransaction(recipientAddress: string, amountLovelace: string) {
    try {
      // 1. Connect to Hydra if not connected
      if (!this.bridge.connected) {
        await this.bridge.connect()
      }

      // 2. Query UTxOs từ Hydra
      const walletAddress = this.wallet.getAccount().baseAddressBech32
      const utxos = await this.hydraApi.queryAddressUTxO(walletAddress)

      // 3. Build Hydra transaction
      const txBuilder = new TxBuilder({ 
        isHydra: true, 
        params: { minFeeA: 0, minFeeB: 0 } 
      })

      const tx = await txBuilder
        .setInputs(utxos)
        .addOutput({
          address: recipientAddress,
          amount: [{ unit: 'lovelace', quantity: amountLovelace }]
        })
        .setChangeAddress(walletAddress)
        .complete()

      // 4. Sign transaction
      const signedTx = await this.wallet.signTx(tx.to_hex())

      // 5. Submit to Hydra
      const txHash = await this.hydraApi.submitHydraTx(signedTx)
      
      console.log('🚀 Hydra Transaction Submitted:', txHash)
      return txHash

    } catch (error) {
      console.error('❌ Hydra Transaction Error:', error)
      throw error
    }
  }

  async disconnect() {
    await this.bridge.disconnect()
  }
}

// Usage
const hydraManager = new HydraWalletManager(
  'your mnemonic words here'.split(' '),
  'your-jwt-token'
)

await hydraManager.sendHydraTransaction(
  'addr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer',
  '1000000'
)

Common Hydra Pitfalls và Solutions

1. Wrong Transaction Mode

typescript
// ❌ Sai - dùng Cardano params cho Hydra
const txBuilder = new TxBuilder({}) // Default Cardano params

// ✅ Đúng - dùng Hydra params
const txBuilder = new TxBuilder({ 
  isHydra: true, 
  params: { minFeeA: 0, minFeeB: 0 } 
})

2. Socket Connection Issues

typescript
// ❌ Sai - dùng plain WebSocket
const ws = new WebSocket('wss://alpha-v1-api.hexcore.io.vn')

// ✅ Đúng - dùng Socket.IO với auth
const bridge = new HydraBridge({
  connector: new HexcoreConnector(url, {
    socketIoOptions: { 
      auth: { token: 'your-jwt-token' } 
    }
  })
})

3. Memory Leaks

typescript
// ✅ Proper cleanup
class HydraComponent {
  private bridge: HydraBridge

  async mounted() {
    this.bridge = new HydraBridge({...})
    await this.bridge.connect()
  }

  async beforeUnmount() {
    // Quan trọng: cleanup connection
    await this.bridge?.disconnect()
  }
}