Skip to content

Check Validators Balance #10

Check Validators Balance

Check Validators Balance #10

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
permissions:
contents: read
pull-requests: write
issues: write
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:
github-token: ${{ secrets.GITHUB_TOKEN }}
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;
}
}
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}`);
try {
// 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('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 raw content directly from the PR
const response = await axios.get(file.raw_url);
const content = response.data;
let validatorData;
try {
validatorData = typeof content === 'string' ? JSON.parse(content) : 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);
}
}
} catch (error) {
console.error(`Error processing PR #${pr.number}:`, error);
}
}