const axios = require('axios');
const FIXparser = require('fixparser'); // Run: npm install fixparser axios
const RPC_URL = 'https://mainnet.pecunovus.net';
// 1. Fetch raw data from Pecu Novus RPC
async function fetchRawTreasuryData() {
try {
const response = await axios.post(RPC_URL, {
jsonrpc: '2.0',
method: 'eth_getTreasuryAddresses',
params: [],
id: new Date().getTime()
});
return response.data.result; // Expecting an array or object from the node
} catch (error) {
console.error('RPC Connection Error:', error.message);
return null;
}
}
// 2. Transform raw RPC data into your desired JSON format
async function getStructuredTreasuryData() {
const rawData = await fetchRawTreasuryData();
if (!rawData) return null;
// Assuming rawData returns an array or object, map it to your schema:
// (Adjust property mapping depending on exact array indices or object keys returned by the node)
const structuredTreasuryData = {
treasury_id: rawData.treasuryId || rawData[0] || "UNKNOWN_ID",
registry_address: rawData.registryAddress || rawData[1] || "",
real_treasury_address: rawData.realTreasuryAddress || rawData[2] || "",
backs_token: rawData.backsToken || rawData[3] || "",
backs_token_address: rawData.backsTokenAddress || rawData[4] || "",
asset: rawData.asset || rawData[5] || "",
amount: rawData.amount || rawData[6] || "0",
lock_status: {
immutability: rawData.immutability ?? false,
withdrawal_permissions: rawData.withdrawalPermissions || "RESTRICTED",
backing_freeze_status: rawData.backingFreezeStatus ?? false,
auditability: rawData.auditability ?? true
}
};
return structuredTreasuryData;
}
// 3. Convert the Structured JSON into a FIX Message and output JSON
async function processHootDexFeed() {
const jsonPayload = await getStructuredTreasuryData();
if (!jsonPayload) return;
// Output the clean JSON format you requested
console.log("--- HootDex Treasury JSON Output ---");
console.log(JSON.stringify(jsonPayload, null, 2));
// Initialize FIX Parser to wrap this data for institutional systems
const fixParser = new FIXparser();
const fixMessage = new FIXparser.Message();
// Tag 35=W (Market Data / Custom Data Feed)
fixMessage.header.push(new FIXparser.Field(35, 'W'));
fixMessage.body.push(new FIXparser.Field(55, jsonPayload.backs_token || 'HOOTDEX-TREASURY'));
fixMessage.body.push(new FIXparser.Field(60, new Date().toISOString()));
// Map your JSON properties to custom FIX user tags (Tags 5000+)
fixMessage.body.push(new FIXparser.Field(5001, jsonPayload.treasury_id));
fixMessage.body.push(new FIXparser.Field(5002, jsonPayload.registry_address));
fixMessage.body.push(new FIXparser.Field(5003, jsonPayload.real_treasury_address));
fixMessage.body.push(new FIXparser.Field(5004, jsonPayload.amount));
fixMessage.body.push(new FIXparser.Field(5005, String(jsonPayload.lock_status.immutability)));
const encodedFixString = fixMessage.encode();
console.log("\n--- Corresponding FIX Message ---");
console.log(encodedFixString);
}
// Run the process (can be set to a cron or interval)
processHootDexFeed();
async function fetchAndDisplayTreasury() {
const container = document.getElementById('treasury-card');
try {
// Replace '/api/treasury' with your backend route that handles the RPC call
const response = await fetch('https://mainnet.pecunovus.net', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
method: 'eth_getTreasuryAddresses',
params: [],
id: 1
})
});
const jsonResponse = await response.json();
const rawData = jsonResponse.result;
if (!rawData) {
container.innerHTML = `<p style="color:red;">No treasury data returned.</p>`;
return;
}
// Map raw response to your exact desired JSON schema format
const treasuryData = {
treasury_id: rawData.treasuryId || rawData[0] || "N/A",
registry_address: rawData.registryAddress || rawData[1] || "N/A",
real_treasury_address: rawData.realTreasuryAddress || rawData[2] || "N/A",
backs_token: rawData.backsToken || rawData[3] || "N/A",
backs_token_address: rawData.backsTokenAddress || rawData[4] || "N/A",
asset: rawData.asset || rawData[5] || "N/A",
amount: rawData.amount || rawData[6] || "0",
lock_status: {
immutability: rawData.immutability ?? true,
withdrawal_permissions: rawData.withdrawalPermissions || "Locked",
backing_freeze_status: rawData.backingFreezeStatus ?? false,
auditability: rawData.auditability ?? true
}
};
// Render the structured JSON nicely into the HTML page elements
container.innerHTML = `
<div class="treasury-item"><span class="label">Treasury ID:</span> <span class="value">${treasuryData.treasury_id}</span></div>
<div class="treasury-item"><span class="label">Asset:</span> <span class="value">${treasuryData.asset}</span></div>
<div class="treasury-item"><span class="label">Amount:</span> <span class="value">${treasuryData.amount}</span></div>
<div class="treasury-item"><span class="label">Backs Token:</span> <span class="value">${treasuryData.backs_token}</span></div>
<div class="treasury-item"><span class="label">Registry Address:</span> <span class="value">${treasuryData.registry_address}</span></div>
<div class="treasury-item"><span class="label">Real Treasury:</span> <span class="value">${treasuryData.real_treasury_address}</span></div>
<div class="lock-box">
<strong>Lock Status:</strong>
<div class="treasury-item"><span class="label">Immutability:</span> <span class="value">${treasuryData.lock_status.immutability}</span></div>
<div class="treasury-item"><span class="label">Withdrawal Permissions:</span> <span class="value">${treasuryData.lock_status.withdrawal_permissions}</span></div>
<div class="treasury-item"><span class="label">Backing Freeze Status:</span> <span class="value">${treasuryData.lock_status.backing_freeze_status}</span></div>
<div class="treasury-item"><span class="label">Auditability:</span> <span class="value">${treasuryData.lock_status.auditability}</span></div>
</div>
`;
} catch (error) {
console.error('Error fetching HootDex data:', error);
container.innerHTML = `<p style="color:red;">Error loading feed from Pecu Novus network.</p>`;
}
}
// Run immediately on page load
fetchAndDisplayTreasury();
// Refresh data automatically every 15 seconds
setInterval(fetchAndDisplayTreasury, 15000);