@tribecahq/registry
Version:
Registry of Tribeca DAOs.
174 lines • 7.63 kB
JavaScript
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