@moonwell-fi/moonwell-sdk
Version:
TypeScript Interface for Moonwell
184 lines • 7.56 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getDelegates = getDelegates;
const axios_1 = __importDefault(require("axios"));
const viem_1 = require("viem");
const index_js_1 = require("../../common/index.js");
const index_js_2 = require("../../environments/index.js");
const logger = __importStar(require("../../logger/console.js"));
async function getDelegates(client) {
let users = [];
const logId = logger.start("getDelegates", "Starting to get delegates...");
const getUsersPaginated = async (page = 0) => {
const response = await axios_1.default.get(`https://forum.moonwell.fi/directory_items.json?period=all&order=Delegate+Wallet+Address&user_field_ids=2%7C1%7C3&page=${page}`);
if (response.status !== 200 || !response.data) {
throw new index_js_1.HttpRequestError(response.statusText);
}
const results = response.data.directory_items
.filter((item) => item.user.user_fields["1"] !== undefined &&
item.user.user_fields["1"].value !== undefined &&
item.user.user_fields["1"].value[0] !== undefined &&
(0, viem_1.isAddress)(item.user.user_fields["1"].value[0]) &&
item.user.user_fields["2"] !== undefined &&
item.user.user_fields["2"].value !== undefined &&
item.user.user_fields["2"].value[0] !== undefined)
.map((item) => {
const avatar = item.user.avatar_template.replace("{size}", "160");
const result = {
avatar: avatar.startsWith("/user_avatar")
? `https://dub1.discourse-cdn.com/flex017${avatar}`
: avatar,
name: item.user.username,
wallet: item.user.user_fields["1"].value[0],
pitch: {
intro: item.user.user_fields["2"].value[0],
url: item.user.user_fields["3"]?.value[0],
},
};
return result;
});
users = users.concat(results);
const loadMore = response.data.directory_items.length > 0;
if (loadMore) {
await getUsersPaginated(page + 1);
}
};
await getUsersPaginated();
const proposals = await getDelegatesExtendedData({
users: users.map((r) => r.wallet),
});
const envs = Object.values(client.environments).filter((env) => env.contracts.views !== undefined);
const votingPowers = await Promise.all(users.map(async (user) => Promise.all(envs.map((environment) => environment.contracts.views?.read.getUserVotingPower([
user.wallet,
])))));
logger.end(logId);
users = users.map((user, index) => {
let votingPower = {};
const userVotingPowers = votingPowers[index];
if (userVotingPowers) {
votingPower = envs.reduce((prev, curr, reduceIndex) => {
const { claimsVotes, stakingVotes, tokenVotes } = userVotingPowers[reduceIndex];
const totalVotes = claimsVotes.delegatedVotingPower +
stakingVotes.delegatedVotingPower +
tokenVotes.delegatedVotingPower;
return {
...prev,
[curr.chainId]: Number(totalVotes / BigInt(10 ** 18)),
};
}, {});
}
const extended = {
...user,
proposals: proposals[user.wallet.toLowerCase()],
votingPower,
};
return extended;
});
return users;
}
const getDelegatesExtendedData = async (params) => {
const response = await axios_1.default.post(index_js_2.publicEnvironments.moonbeam.governanceIndexerUrl, {
query: `
query {
proposers(where: {id_in: [${params.users.map((r) => `"${r.toLowerCase()}"`).join(",")}]}) {
items {
id
proposals(limit: 1000) {
items {
chainId
proposalId
}
}
}
}
voters(where: {id_in: [${params.users.map((r) => `"${r.toLowerCase()}"`).join(",")}]}) {
items {
id
votes(limit: 1000) {
items {
voter
proposal {
chainId
}
}
}
}
}
}
`,
});
if (response.status === 200 && response.data?.data?.voters) {
const voters = response?.data?.data?.voters?.items.reduce((prev, curr) => {
return {
...prev,
[curr.id.toLowerCase()]: curr.votes.items.reduce((prevVotes, currVotes) => {
const previousVotes = prevVotes[currVotes.proposal.chainId] || 0;
return {
...prevVotes,
[currVotes.proposal.chainId]: previousVotes + 1,
};
}, {}),
};
}, {});
const proposers = response?.data?.data?.proposers?.items.reduce((prev, curr) => {
return {
...prev,
[curr.id.toLowerCase()]: curr.proposals.items.reduce((prevVotes, currVotes) => {
const previousProposed = prevVotes[currVotes.chainId] || 0;
return {
...prevVotes,
[currVotes.chainId]: previousProposed + 1,
};
}, {}),
};
}, {});
return params.users.reduce((prev, curr) => {
const proposalsCreated = proposers[curr.toLowerCase()];
const proposalsVoted = voters[curr.toLowerCase()];
const chains = [
...Object.keys(proposalsCreated || {}),
...Object.keys(proposalsVoted || {}),
];
return {
...prev,
[curr.toLowerCase()]: chains.reduce((prevChain, currChain) => {
return {
...prevChain,
[currChain]: {
created: proposalsCreated?.[currChain] || 0,
voted: proposalsVoted?.[currChain] || 0,
},
};
}, {}),
};
}, {});
}
return {};
};
//# sourceMappingURL=getDelegates.js.map