UNPKG

@tribecahq/registry

Version:

Registry of Tribeca DAOs.

174 lines 7.63 kB
import { chainIdToNetwork, networkToChainId } from "@saberhq/token-utils"; import { PublicKey } from "@solana/web3.js"; import { mapValues, startCase } from "lodash"; import invariant from "tiny-invariant"; import { ADDRESS_TYPES, TokenQuantity } from "../config/types"; import { getTokenInfo } from "../utils/getTokenInfo"; import { validateTokenInfo } from "./validate"; const parseGovernance = async ({ slug, name, description, address, network: theNetwork, "icon-url": iconURL, token, parameters, }) => { var _a, _b, _c, _d, _e, _f; const chainId = token === null || token === void 0 ? void 0 : token.chainId; const network = theNetwork !== null && theNetwork !== void 0 ? theNetwork : (chainId ? chainIdToNetwork(chainId) : null); invariant(network && network !== "localnet", "network"); const govTokenAddress = token === null || token === void 0 ? void 0 : token.address; invariant(govTokenAddress); const prepopulatedTokenInfo = await getTokenInfo(govTokenAddress, network); const validatedIconURL = (_a = iconURL !== null && iconURL !== void 0 ? iconURL : token === null || token === void 0 ? void 0 : token.logoURI) !== null && _a !== void 0 ? _a : prepopulatedTokenInfo === null || prepopulatedTokenInfo === void 0 ? void 0 : prepopulatedTokenInfo.logoURI; invariant(validatedIconURL); const tokenInfo = { ...prepopulatedTokenInfo, ...token, chainId: networkToChainId(network), address: govTokenAddress, logoURI: validatedIconURL, }; const validatedToken = validateTokenInfo(tokenInfo); return { slug, name, description, address: new PublicKey(address), network, iconURL: validatedIconURL, token: validatedToken, parameters: parameters ? { governor: parameters.governor ? { quorumVotes: new TokenQuantity(parameters.governor["quorum-votes"].toString()), votingDelay: parameters.governor["voting-delay"], votingPeriod: parameters.governor["voting-period"], timelockDelay: parameters.governor["timelock-delay"], } : undefined, locker: parameters.locker ? { maxStakeVoteMultiplier: (_b = parameters.locker) === null || _b === void 0 ? void 0 : _b["max-stake-vote-multiplier"], minStakeDuration: (_c = parameters.locker) === null || _c === void 0 ? void 0 : _c["min-stake-duration"], maxStakeDuration: (_d = parameters.locker) === null || _d === void 0 ? void 0 : _d["max-stake-duration"], proposalActivationMinVotes: new TokenQuantity(parameters.locker["proposal-activation-min-votes"].toString()), whitelistEnabled: (_f = (_e = parameters.locker) === null || _e === void 0 ? void 0 : _e["whitelist-enabled"]) !== null && _f !== void 0 ? _f : false, } : undefined, } : undefined, }; }; const parseQuarry = ({ rewarder, "additional-rewarders": additionalRewarders, redeemer, "mint-wrapper": mintWrapper, operator, gauge, features, ...common }) => { var _a, _b; return { rewarder: rewarder ? new PublicKey(rewarder) : undefined, mintWrapper: mintWrapper ? new PublicKey(mintWrapper) : undefined, redeemer: redeemer ? new PublicKey(redeemer) : undefined, features: features !== null && features !== void 0 ? features : [], additionalRewarders: (_a = additionalRewarders === null || additionalRewarders === void 0 ? void 0 : additionalRewarders.map((rew) => new PublicKey(rew))) !== null && _a !== void 0 ? _a : [], gauge: gauge ? { ...gauge, gaugemeister: new PublicKey(gauge.gaugemeister), } : undefined, operator: operator ? { ...operator, address: new PublicKey(operator.address), features: (_b = operator.features) !== null && _b !== void 0 ? _b : [], } : operator, ...common, }; }; const parseSAVE = ({ mint, duration }) => ({ mint: new PublicKey(mint), duration, }); const parseMndeNftLocker = ({ address, creators, docs, app, }) => ({ address: new PublicKey(address), creators: creators.map((c) => new PublicKey(c)), docs, app, }); const parseNftLockerGauges = ({ label, address, stateAccount, docs, }) => ({ label, address: new PublicKey(address), stateAccount: stateAccount ? new PublicKey(stateAccount) : undefined, docs, }); /** * Parses the raw configuration of a Governor into something more useful. * * @param raw Raw data. * @param cluster Cluster that the Governor is on. * @returns */ export const parseGovernorConfig = async (raw, cluster) => { const governance = await parseGovernance({ ...raw.governance, network: cluster, }); const quarry = raw.quarry ? parseQuarry(raw.quarry) : undefined; const mndeNftLocker = raw["mnde-nft-locker"] ? parseMndeNftLocker(raw["mnde-nft-locker"]) : undefined; const nftLockerGauges = raw["nft-locker-gauges"] ? raw["nft-locker-gauges"].map((rawGaugeType) => parseNftLockerGauges(rawGaugeType)) : undefined; return { slug: governance.slug, name: governance.name, description: governance.description, address: new PublicKey(governance.address), govToken: governance.token, iconURL: governance.iconURL, governance, proposals: raw.proposals, quarry, saves: raw.saves ? raw.saves.map(parseSAVE) : undefined, minter: quarry ? { mintWrapper: quarry === null || quarry === void 0 ? void 0 : quarry.mintWrapper, redeemer: quarry === null || quarry === void 0 ? void 0 : quarry.redeemer, } : undefined, gauge: (quarry === null || quarry === void 0 ? void 0 : quarry.gauge) ? { gaugemeister: quarry.gauge.gaugemeister, hidden: quarry.gauge.hidden, } : undefined, mndeNftLocker, nftLockerGauges, links: raw.links ? mapValues(raw.links, (link, key) => { if (typeof link === "string") { return { label: startCase(key), url: link, }; } return link; }) : undefined, addresses: raw.addresses ? mapValues(raw.addresses, (address, key) => { if (typeof address === "string") { return { label: startCase(key), address: new PublicKey(address), }; } const { ["description-link"]: descriptionLink, type, ...addressProps } = address; if (type && !ADDRESS_TYPES.includes(type)) { throw new Error(`invalid type ${type} for address ${address.address}`); } return { ...addressProps, type: type, descriptionLink, address: new PublicKey(address.address), }; }) : undefined, }; }; //# sourceMappingURL=parse.js.map