Skip to content

Check Validators Balance #8

Check Validators Balance

Check Validators Balance #8

name: Check Validators Balance
on:
workflow_dispatch:
inputs:
process_type:
description: 'Select process type'
required: true
default: 'check_balance'
type: choice
options:
- check_balance
jobs:
check-balance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '16'
- name: Install dependencies
run: npm install axios
- name: Check Validators in PRs
uses: actions/github-script@v6
with:
script: |
const axios = require('axios');
async function checkBalance(btcAddress) {
try {
console.log(`Checking balance for BTC address: ${btcAddress}`);
const response = await axios.get(`https://mempool.space/signet/api/address/${btcAddress}`);
const balanceInBTC = response.data.chain_stats.funded_txo_sum / 100000000;
console.log(`Current balance: ${balanceInBTC} BTC`);
return {
balance: balanceInBTC,
hasEnough: balanceInBTC >= 1
};
} catch (error) {
console.error(`Error checking balance: ${error.message}`);
throw error;
}
}
// Get all open PRs
console.log('Fetching open PRs...');
const { data: prs } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open'
});
console.log(`Found ${prs.length} open PRs`);
for (const pr of prs) {
console.log(`\nProcessing PR #${pr.number}: ${pr.title}`);
// Get files in this PR
const { data: files } = await github.rest.pulls.listFiles({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.number
});
// Filter for validator JSON files
const validatorFiles = files.filter(file =>
file.filename.includes('fiamma-testnet-1/bitvm2-staker-validators/') &&
file.filename.endsWith('.json')
);
if (validatorFiles.length === 0) {
console.log(`No validator JSON files found in PR #${pr.number}`);
continue;
}
console.log(`Found ${validatorFiles.length} validator files in PR #${pr.number}`);
for (const file of validatorFiles) {
console.log(`\nProcessing file: ${file.filename}`);
try {
// Get file content from PR
const { data: fileData } = await github.rest.repos.getContent({
owner: context.repo.owner,
repo: context.repo.repo,
path: file.filename,
ref: pr.head.sha // Use PR's HEAD commit
});
const content = Buffer.from(fileData.content, 'base64').toString();
console.log('File content:', content);
let validatorData;
try {
validatorData = JSON.parse(content);
} catch (error) {
console.error(`Invalid JSON in ${file.filename}:`, error.message);
continue;
}
if (!validatorData.btc_address) {
console.log(`No BTC address found in ${file.filename}`);
continue;
}
console.log(`Checking BTC address: ${validatorData.btc_address}`);
const result = await checkBalance(validatorData.btc_address);
// Add comment to PR with results
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
body: `### BTC Balance Check Results for ${file.filename}\n\n` +
`- BTC Address: \`${validatorData.btc_address}\`\n` +
`- Current Balance: ${result.balance} BTC\n` +
`- Required Balance: 1 BTC\n` +
`- Status: ${result.hasEnough ? '✅ PASSED' : '❌ FAILED'}`
});
// Add label based on balance check
const label = result.hasEnough ? 'balance-ok' : 'balance-insufficient';
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
labels: [label]
});
} catch (error) {
console.error(`Error processing ${file.filename}:`, error.message);
}
}
}