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