idle_moloch/lib/Baal/test/utils/tribute.ts
2024-11-01 11:55:27 +01:00

90 lines
2.6 KiB
TypeScript

import { DAOSettings, defaultDAOSettings } from './baal';
import { moveForwardPeriods } from './evm';
import { Baal, TributeMinion } from '../../src/types';
import { BigNumber } from 'ethers';
const yes = true;
export type TributeProposalParams = {
tributeMinion: TributeMinion,
baal: Baal,
applicantAddress: string,
tributeToken: string,
tribute: number,
requestedShares: number,
requestedLoot: number,
sponsor?: boolean;
proposalId?: number;
proposalOffering?: number;
proposalExpiration?: number;
proposalBaalGas?: number;
daoSettings?: DAOSettings;
extraSeconds?: number;
};
export type TributeProposalStatus = {
spentInGas: BigNumber;
state: number;
propStatus: [boolean, boolean, boolean, boolean];
};
export const submitAndProcessTributeProposal = async ({
tributeMinion,
baal,
applicantAddress,
tributeToken,
tribute,
requestedShares,
requestedLoot,
sponsor = true,
proposalId = 1,
proposalOffering = 0,
proposalExpiration = 0,
proposalBaalGas = 0,
daoSettings = defaultDAOSettings,
extraSeconds = 2,
}: TributeProposalParams): Promise<TributeProposalStatus> => {
const tx_1 = await tributeMinion.submitTributeProposal(
baal.address,
tributeToken,
tribute,
requestedShares,
requestedLoot,
proposalExpiration,
proposalBaalGas,
"tribute",
{ value: proposalOffering },
);
const tx_1_r = await tx_1.wait();
const tx_2 = sponsor ? await baal.sponsorProposal(proposalId) : undefined;
const tx_2_r = tx_2 ? await tx_2.wait() : undefined;
const tx_3 = await baal.submitVote(proposalId, yes);
const tx_3_r = await tx_3.wait();
await moveForwardPeriods(daoSettings.VOTING_PERIOD_IN_SECONDS, extraSeconds);
const encodedProposal = await tributeMinion.encodeTributeProposal(
baal.address,
requestedShares,
requestedLoot,
applicantAddress,
proposalId,
tributeMinion.address,
);
const tx_4 = await baal.processProposal(proposalId, encodedProposal);
const tx_4_r = await tx_4.wait();
const state = await baal.state(proposalId);
const propStatus = await baal.getProposalStatus(proposalId);
return {
spentInGas: tx_1_r.gasUsed.mul(tx_1_r.effectiveGasPrice)
.add(tx_2_r ? tx_2_r.gasUsed.mul(tx_2_r.effectiveGasPrice) : BigNumber.from(0))
.add(tx_3_r.gasUsed.mul(tx_3_r.effectiveGasPrice))
.add(tx_4_r.gasUsed.mul(tx_4_r.effectiveGasPrice)),
state,
propStatus,
};
};