@tribecahq/registry
Version:
Registry of Tribeca DAOs.
179 lines • 8.17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseGovernorConfig = void 0;
const tslib_1 = require("tslib");
const token_utils_1 = require("@saberhq/token-utils");
const web3_js_1 = require("@solana/web3.js");
const lodash_1 = require("lodash");
const tiny_invariant_1 = tslib_1.__importDefault(require("tiny-invariant"));
const types_1 = require("../config/types");
const getTokenInfo_1 = require("../utils/getTokenInfo");
const validate_1 = require("./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 ? (0, token_utils_1.chainIdToNetwork)(chainId) : null);
(0, tiny_invariant_1.default)(network && network !== "localnet", "network");
const govTokenAddress = token === null || token === void 0 ? void 0 : token.address;
(0, tiny_invariant_1.default)(govTokenAddress);
const prepopulatedTokenInfo = await (0, getTokenInfo_1.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;
(0, tiny_invariant_1.default)(validatedIconURL);
const tokenInfo = {
...prepopulatedTokenInfo,
...token,
chainId: (0, token_utils_1.networkToChainId)(network),
address: govTokenAddress,
logoURI: validatedIconURL,
};
const validatedToken = (0, validate_1.validateTokenInfo)(tokenInfo);
return {
slug,
name,
description,
address: new web3_js_1.PublicKey(address),
network,
iconURL: validatedIconURL,
token: validatedToken,
parameters: parameters
? {
governor: parameters.governor
? {
quorumVotes: new types_1.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 types_1.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 web3_js_1.PublicKey(rewarder) : undefined,
mintWrapper: mintWrapper ? new web3_js_1.PublicKey(mintWrapper) : undefined,
redeemer: redeemer ? new web3_js_1.PublicKey(redeemer) : undefined,
features: features !== null && features !== void 0 ? features : [],
additionalRewarders: (_a = additionalRewarders === null || additionalRewarders === void 0 ? void 0 : additionalRewarders.map((rew) => new web3_js_1.PublicKey(rew))) !== null && _a !== void 0 ? _a : [],
gauge: gauge
? {
...gauge,
gaugemeister: new web3_js_1.PublicKey(gauge.gaugemeister),
}
: undefined,
operator: operator
? {
...operator,
address: new web3_js_1.PublicKey(operator.address),
features: (_b = operator.features) !== null && _b !== void 0 ? _b : [],
}
: operator,
...common,
};
};
const parseSAVE = ({ mint, duration }) => ({
mint: new web3_js_1.PublicKey(mint),
duration,
});
const parseMndeNftLocker = ({ address, creators, docs, app, }) => ({
address: new web3_js_1.PublicKey(address),
creators: creators.map((c) => new web3_js_1.PublicKey(c)),
docs,
app,
});
const parseNftLockerGauges = ({ label, address, stateAccount, docs, }) => ({
label,
address: new web3_js_1.PublicKey(address),
stateAccount: stateAccount ? new web3_js_1.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
*/
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 web3_js_1.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
? (0, lodash_1.mapValues)(raw.links, (link, key) => {
if (typeof link === "string") {
return {
label: (0, lodash_1.startCase)(key),
url: link,
};
}
return link;
})
: undefined,
addresses: raw.addresses
? (0, lodash_1.mapValues)(raw.addresses, (address, key) => {
if (typeof address === "string") {
return {
label: (0, lodash_1.startCase)(key),
address: new web3_js_1.PublicKey(address),
};
}
const { ["description-link"]: descriptionLink, type, ...addressProps } = address;
if (type && !types_1.ADDRESS_TYPES.includes(type)) {
throw new Error(`invalid type ${type} for address ${address.address}`);
}
return {
...addressProps,
type: type,
descriptionLink,
address: new web3_js_1.PublicKey(address.address),
};
})
: undefined,
};
};
exports.parseGovernorConfig = parseGovernorConfig;
//# sourceMappingURL=parse.js.map