-
Notifications
You must be signed in to change notification settings - Fork 66
140 lines (118 loc) · 5.12 KB
/
check-existing-prs.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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);
}
}