UNPKG

@moonwell-fi/moonwell-sdk

Version:

TypeScript Interface for Moonwell

184 lines 7.56 kB
"use strict"; 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