diff --git a/common.js b/common.js
index 41480a6..30e9a68 100644
--- a/common.js
+++ b/common.js
@@ -11,6 +11,7 @@ export var externalChainIDs;
export var Chains;
export var zetaclientIPs;
export var bitcoinChainID;
+export var groupAdminAddresses;
var zetaIP;
var auxIP = "46.4.15.110";
var zetaChainID;
@@ -64,6 +65,9 @@ if (network == "mockmain") {
};
esploraAPIURL = "https://blockstream.info/api";
externalChainIDs = [1,56,8332];
+ groupAdminAddresses = {
+ "Network Admin": "zeta1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsxn0x73",
+ };
Chains = {
1: {
@@ -121,6 +125,12 @@ if (network == "mockmain") {
};
esploraAPIURL = "https://blockstream.info/api";
externalChainIDs = [1,56,8332];
+ groupAdminAddresses = {
+ "Network Operations": "zeta1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsxn0x73",
+ "Network Admin": "zeta1dlszg2sst9r69my4f84l3mj66zxcf3umcgujys30t84srg95dgvs5wguxq",
+ "Validator Admin": "zeta1c799jddmlz7segvg6jrw6w2k6svwafganjdznard3tc74n7td7rqzgjegn",
+ "Validator Operations": "zeta17pmq7hp4upvmmveqexzuhzu64v36re3w3447n7dt46uwp594wtps03v8vg",
+ };
Chains = {
1: {
@@ -193,6 +203,11 @@ if (network == "mockmain") {
};
esploraAPIURL = "https://blockstream.info/testnet/api";
externalChainIDs = [5, 97, 80001, 18332];
+ groupAdminAddresses = {
+ "Network Admin": "zeta1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsxn0x73",
+ "Network Operations": "zeta1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsxn0x73",
+ "Validator Admin": "zeta1dlszg2sst9r69my4f84l3mj66zxcf3umcgujys30t84srg95dgvs5wguxq",
+ };
Chains = {
5: {
@@ -611,6 +626,7 @@ export function renderHeader() {
Wallet
Audit
Staking
+ Admin Proposals
`
document.body.insertAdjacentHTML('afterbegin', headerHTML);
diff --git a/group-proposals.html b/group-proposals.html
new file mode 100644
index 0000000..f298c82
--- /dev/null
+++ b/group-proposals.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ Groups
+
+
+
+
+
Open Group Proposals
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/group-proposals.js b/group-proposals.js
new file mode 100644
index 0000000..4272340
--- /dev/null
+++ b/group-proposals.js
@@ -0,0 +1,69 @@
+import {
+ AddressExplorerByChainID,
+ bitcoinChainID,
+ esploraAPIURL,
+ evmURL,
+ nodeURL,
+ groupAdminAddresses,
+ RPCByChainID,
+ externalChainIDs,
+ makeTableElement2, makeTableElement, renderHeader
+} from './common.js';
+import './web3.min.js';
+import {convertbits, decode, encode} from "./bech32.js";
+
+await renderHeader();
+
+async function fetchProposalsByGroupAdminAddresses() {
+ const allProposals = [];
+
+ for (const [adminName, groupPolicyAddress] of Object.entries(groupAdminAddresses)) {
+ try {
+ const response = await fetch(`${nodeURL}/cosmos/group/v1/proposals_by_group_policy/${groupPolicyAddress}`);
+ const data = await response.json();
+ console.log(`Proposals for ${adminName}:`, data.proposals);
+
+ // Attach group name and address to each proposal
+ for (const proposal of data.proposals) {
+ proposal.groupName = adminName;
+ proposal.groupAddress = groupPolicyAddress;
+
+ // Fetch proposal details
+ const detailsResponse = await fetch(`${nodeURL}/cosmos/group/v1/proposal/${proposal.id}`);
+ const detailsData = await detailsResponse.json();
+ proposal.details = detailsData.proposal;
+ }
+
+ allProposals.push(...data.proposals);
+ } catch (error) {
+ console.error(`Error fetching proposals for ${adminName}:`, error);
+ }
+ }
+
+ displayProposals(allProposals);
+}
+
+function displayProposals(proposals) {
+ const proposalsList = document.getElementById('proposals-list');
+ if (proposals.length === 0) {
+ proposalsList.innerText = 'No open proposals found.';
+ return;
+ }
+ proposals.forEach(proposal => {
+ const proposalItem = document.createElement('div');
+ proposalItem.innerHTML = `
+ Group Name: ${proposal.groupName}
+ Group Address: ${proposal.groupAddress}
+ Proposal ID: ${proposal.id}
+ Status: ${proposal.status}
+ Title: ${proposal.details.title}
+ Summary: ${proposal.details.summary}
+ Final Tally Result: Yes: ${proposal.details.final_tally_result.yes_count}, No: ${proposal.details.final_tally_result.no_count}, Abstain: ${proposal.details.final_tally_result.abstain_count}, No with Veto: ${proposal.details.final_tally_result.no_with_veto_count}
+ Messages: ${proposal.details.messages.map(msg => JSON.stringify(msg)).join(', ')}
+
+ `;
+ proposalsList.appendChild(proposalItem);
+ });
+}
+
+fetchProposalsByGroupAdminAddresses();
\ No newline at end of file