Get All Active Proposals For Wallet
Fetch all active proposals that a wallet can vote on.
// Node doesn't implement fetch so we have to import it
import fetch from "node-fetch";
const SHYFT_API_KEY = "YOUR_KEY"
async function fetchGraphQL(query, variables = {}, name = "MyQuery") {
const result = await fetch(
`https://programs.shyft.to/v0/graphql/?api_key=${SHYFT_API_KEY}`,
{
method: "POST",
body: JSON.stringify({
query: query,
variables: variables,
operationName: name
})
}
);
return await result.json();
}
//We only fetch realm field, since thats what we are interested in
async function getRealmsForWallet(wallet) {
const query = `
query MyQuery {
GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw_TokenOwnerRecordV1(
where: {governingTokenOwner: {_eq: ${JSON.stringify(wallet)}}}
) {
realm
}
GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw_TokenOwnerRecordV2(
where: {governingTokenOwner: {_eq: ${JSON.stringify(wallet)}}}
) {
realm
}
}
`;
const { errors, data } = await fetchGraphQL(query);
if (errors) {
// handle those errors like a pro
console.error(errors);
}
const realms = []
data.GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw_TokenOwnerRecordV1.forEach((dao) => {
realms.push(dao.realm)
})
data.GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw_TokenOwnerRecordV2.forEach((dao) => {
realms.push(dao.realm)
})
console.log(`Wallet is part of ${realms.length} DAOs`);
// do something great with this precious data
return realms;
}
async function getGovernanceAccountsForAllRealms(realms) {
//realms should be an array
const query = `
query MyQuery($_in: [String!] = "") {
GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw_GovernanceV1(
where: {realm: {_in: $_in}}
) {
pubkey
}
GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw_GovernanceV2(
where: {realm: {_in: $_in}}
) {
pubkey
}
}
`
const variables = {
_in: realms
}
const { errors, data } = await fetchGraphQL(query, variables);
if (errors) {
// handle those errors like a pro
console.error(errors);
}
const govAccts = []
data.GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw_GovernanceV1.forEach((dao) => {
govAccts.push(dao.pubkey)
})
data.GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw_GovernanceV2.forEach((dao) => {
govAccts.push(dao.pubkey)
})
console.log(govAccts);
return govAccts;
}
async function getActiveProposals(governanceAccounts) {
//governanceAccounts should be an array
const query = `
query MyQuery($_in: [String!] = "") {
GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw_ProposalV1(
where: {_and: {state: {_eq: 2}, governance: {_in: $_in}}}
) {
closedAt
descriptionLink
draftAt
executingAt
executionFlags
governance
governingTokenMint
instructionsCount
instructionsExecutedCount
instructionsNextIndex
lamports
maxVoteWeight
name
noVotesCount
signatoriesCount
signatoriesSignedOffCount
signingOffAt
state
tokenOwnerRecord
voteThreshold
votingAt
votingAtSlot
votingCompletedAt
yesVotesCount
}
GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw_ProposalV2(
where: {_and: {state: {_eq: 2}, governance: {_in: $_in}}}
) {
abstainVoteWeight
closedAt
denyVoteWeight
descriptionLink
draftAt
executingAt
executionFlags
governance
governingTokenMint
lamports
maxVoteWeight
maxVotingTime
name
options
reserved1
signatoriesCount
signatoriesSignedOffCount
signingOffAt
startVotingAt
state
tokenOwnerRecord
vetoVoteWeight
voteThreshold
voteType
votingAt
votingAtSlot
votingCompletedAt
}
}
`
const variables = {
_in: governanceAccounts
}
const { errors, data } = await fetchGraphQL(query, variables);
if (errors) {
// handle those errors like a pro
console.error(errors);
}
// do something great with this precious data
console.log(data);
return data;
}
//Get DAOs for a wallet
const realms = await getRealmsForWallet("JPQmr9p2RF3X5TuBXxn6AGcEfcsHp4ehcmzE5Ys7pZD")
//Get governance accounts for all realms
const governanceAccounts = await getGovernanceAccountsForAllRealms(realms);
const proposals = await getActiveProposals(governanceAccounts);
console.log(proposals)Last updated