Check Validators Balance #8
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |