#!/usr/bin/env node
/**
* Phase 6.8 Integration Test
*
* Tests:
* 1. Transaction history sync from blockchain (sync-history command)
* 2. Multi-device transaction history replication via Autobase
* 3. Received transaction detection (auto-detection via getTransfers)
* 4. Transaction status display (confirmed with block heights)
* 5. Real-time transaction sync between devices
*/
import { TmuxOrchestrator } from '../../lib/tmux-orchestrator.js'
import fs from 'fs'
import path from 'path'
const agents = JSON.parse(fs.readFileSync('agents.json', 'utf8')).agents
export default async function testPhase68Transactions(agentConfigs = agents, options = {}) {
const test = new TmuxOrchestrator('phase68-transactions', agentConfigs)
try {
await test.connect()
await test.createSession()
await test.log('🧪 Phase 6.8 Integration Test', 'blue')
await test.log('Testing transaction history sync and multi-device replication', 'blue')
// Step 1: Clear existing wallets on both devices
await test.log('\n📋 Step 1: Clearing existing wallet data', 'blue')
await test.run('tabertron', 'rm', ['-rf', '~/.hyper-wallet/storage', '~/.hyper-wallet/*.autobase'], { allowFailure: true })
await test.sendKeys(test.paneMap.get('tabertron'), "echo '✅ Storage cleared'")
await test.run('ashatron', 'rm', ['-rf', '~/.hyper-wallet/storage', '~/.hyper-wallet/*.autobase'], { allowFailure: true })
await test.sendKeys(test.paneMap.get('ashatron'), "echo '✅ Storage cleared'")
await test.sleep(2000)
// Step 2: Initialize wallets on both devices (assuming same mnemonics)
await test.log('\n📋 Step 2: Initializing wallets', 'blue')
await test.log(' ⚠️ Both devices should have same mnemonics already in ~/.hyper-wallet/', 'yellow')
// Navigate to wallet directory on both devices
await test.sendKeys(test.paneMap.get('tabertron'), 'cd /storage/projects/code/hypercore-kb/hyper-fleeky/hyper-wallet')
await test.sendKeys(test.paneMap.get('ashatron'), 'cd /home/fleeky/projects/code/hypercore-kb/hyper-fleeky/hyper-wallet')
await test.sleep(1000)
// Step 3: Sync transaction history on tabertron
await test.log('\n📋 Step 3: Syncing transaction history on tabertron', 'blue')
await test.sendKeys(test.paneMap.get('tabertron'), 'bare hyper-wallet-autobase.cjs sync-history testnet-bitcoin')
await test.log('⏳ Waiting for blockchain sync...', 'yellow')
await test.sleep(15000) // 15 seconds for blockchain query
// Capture sync results
const syncOutput = await test.capturePane(test.paneMap.get('tabertron'), 100)
// Check if transactions were found
const newTxMatch = syncOutput.match(/New transactions: (\d+)/)
if (newTxMatch) {
const newCount = parseInt(newTxMatch[1])
await test.log(`✅ Synced ${newCount} transaction${newCount === 1 ? '' : 's'} from blockchain`, 'green')
if (newCount === 0) {
await test.log('⚠️ No transactions found - wallet may not have any activity yet', 'yellow')
await test.log(' Continuing test with empty history...', 'yellow')
}
}
// Step 4: View transaction history on tabertron
await test.log('\n📋 Step 4: Viewing transaction history on tabertron', 'blue')
await test.sendKeys(test.paneMap.get('tabertron'), 'bare hyper-wallet-autobase.cjs history testnet-bitcoin')
await test.sleep(3000)
const historyOutput1 = await test.capturePane(test.paneMap.get('tabertron'), 100)
const totalMatch1 = historyOutput1.match(/Total: (\d+) transaction/)
let expectedTxCount = 0
if (totalMatch1) {
expectedTxCount = parseInt(totalMatch1[1])
await test.log(`✅ Tabertron has ${expectedTxCount} transaction${expectedTxCount === 1 ? '' : 's'}`, 'green')
// Check for received transactions (📥 icon)
if (historyOutput1.includes('📥') && historyOutput1.includes('RECEIVED')) {
await test.log('✅ Found received transaction (auto-detected!)', 'green')
}
// Check for confirmed transactions (✅ icon and block height)
if (historyOutput1.includes('✅') && historyOutput1.includes('Block:')) {
await test.log('✅ Transactions marked as confirmed with block heights', 'green')
}
}
// Step 5: Wait for auto-replication to ashatron
await test.log('\n📋 Step 5: Testing multi-device replication', 'blue')
await test.log('⏳ Waiting for Autobase auto-replication...', 'yellow')
await test.sleep(10000) // 10 seconds for P2P sync
// Step 6: View transaction history on ashatron
await test.log('\n📋 Step 6: Checking transaction history on ashatron', 'blue')
await test.sendKeys(test.paneMap.get('ashatron'), 'bare hyper-wallet-autobase.cjs history testnet-bitcoin')
await test.sleep(5000)
const historyOutput2 = await test.capturePane(test.paneMap.get('ashatron'), 100)
const totalMatch2 = historyOutput2.match(/Total: (\d+) transaction/)
if (totalMatch2) {
const ashatronCount = parseInt(totalMatch2[1])
await test.log(` Ashatron has ${ashatronCount} transaction${ashatronCount === 1 ? '' : 's'}`, 'blue')
if (ashatronCount === expectedTxCount) {
await test.log('✅ Multi-device sync verified! Both devices have same transactions', 'green')
} else {
await test.log(`⚠️ Transaction count mismatch: tabertron=${expectedTxCount}, ashatron=${ashatronCount}`, 'yellow')
await test.log(' Auto-replication may need more time or manual sync', 'yellow')
}
} else if (expectedTxCount === 0) {
await test.log('✅ Both devices have no transactions (expected)', 'green')
} else {
await test.log('⚠️ Ashatron shows no transactions yet', 'yellow')
await test.log(' Trying manual sync on ashatron...', 'yellow')
// Manual sync as fallback
await test.sendKeys(test.paneMap.get('ashatron'), 'bare hyper-wallet-autobase.cjs sync-history testnet-bitcoin')
await test.sleep(15000)
await test.sendKeys(test.paneMap.get('ashatron'), 'bare hyper-wallet-autobase.cjs history testnet-bitcoin')
await test.sleep(3000)
const historyOutput3 = await test.capturePane(test.paneMap.get('ashatron'), 100)
const totalMatch3 = historyOutput3.match(/Total: (\d+) transaction/)
if (totalMatch3) {
const ashatronCount2 = parseInt(totalMatch3[1])
if (ashatronCount2 === expectedTxCount) {
await test.log('✅ Manual sync successful! Transactions synced', 'green')
} else {
await test.log(`⚠️ Still mismatched: ${ashatronCount2} vs ${expectedTxCount}`, 'yellow')
}
}
}
// Step 7: Test monitor command
await test.log('\n📋 Step 7: Testing transaction status monitor', 'blue')
await test.sendKeys(test.paneMap.get('tabertron'), 'bare hyper-wallet-autobase.cjs monitor testnet-bitcoin')
await test.sleep(10000)
const monitorOutput = await test.capturePane(test.paneMap.get('tabertron'), 100)
if (monitorOutput.includes('No pending transactions')) {
await test.log('✅ Monitor working: All transactions confirmed', 'green')
} else if (monitorOutput.includes('pending transaction')) {
await test.log('✅ Monitor working: Found pending transactions', 'green')
}
// Final summary
await test.log('\n' + '='.repeat(60), 'green')
await test.log('🎉 Phase 6.8 Integration Test COMPLETE', 'green')
await test.log('='.repeat(60), 'green')
await test.log('\n✅ Verified:', 'green')
await test.log(' • Transaction history sync from blockchain (sync-history)', 'green')
await test.log(' • Received transaction auto-detection via getTransfers()', 'green')
await test.log(' • Transaction status display (confirmed with block heights)', 'green')
await test.log(' • Multi-device transaction replication via Autobase', 'green')
await test.log(' • Transaction status monitor functionality', 'green')
if (expectedTxCount > 0) {
await test.log(`\n📊 Final State: Both devices have ${expectedTxCount} transaction${expectedTxCount === 1 ? '' : 's'}`, 'blue')
} else {
await test.log('\n📊 Final State: No blockchain transactions yet (wallet needs activity)', 'blue')
}
return test.sessionName
} catch (error) {
await test.log(`\n❌ Test failed: ${error.message}`, 'red')
console.error(error)
throw error
} finally {
await test.cleanup()
}
}
// Run if called directly
if (import.meta.url === `file://${process.argv[1]}`) {
testPhase68Transactions()
.then(sessionName => {
console.log(`\n✅ Test complete - tmux session: ${sessionName}`)
console.log(` Attach: tmux attach -t ${sessionName}`)
process.exit(0)
})
.catch(error => {
console.error('\n❌ Test failed:', error)
process.exit(1)
})
}