Skip to content

Commit

Permalink
feat: 馃幐 return only Active proposals
Browse files Browse the repository at this point in the history
  • Loading branch information
sansan committed Apr 26, 2024
1 parent 2f5671b commit 5197e84
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 6 deletions.
42 changes: 36 additions & 6 deletions src/api/entities/Account/MultiSig/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,24 @@ import BigNumber from 'bignumber.js';
import { UniqueIdentifiers } from '~/api/entities/Account';
import { MultiSigProposal } from '~/api/entities/MultiSigProposal';
import { Account, Context, Identity, modifyMultiSig, PolymeshError } from '~/internal';
import { ErrorCode, ModifyMultiSigParams, MultiSigDetails, ProcedureMethod } from '~/types';
import {
ErrorCode,
ModifyMultiSigParams,
MultiSigDetails,
ProcedureMethod,
ProposalStatus,
} from '~/types';
import {
addressToKey,
identityIdToString,
meshProposalStatusToProposalStatus,
momentToDate,
signatoryToSignerValue,
signerValueToSigner,
stringToAccountId,
u64ToBigNumber,
} from '~/utils/conversion';
import { createProcedureMethod } from '~/utils/internal';
import { createProcedureMethod, optionize } from '~/utils/internal';

/**
* Represents a MultiSig Account. A MultiSig Account is composed of one or more signing Accounts. In order to submit a transaction, a specific amount of those signing Accounts must approve it first
Expand Down Expand Up @@ -87,7 +95,7 @@ export class MultiSig extends Account {
}

/**
* Return all { @link api/entities/MultiSigProposal!MultiSigProposal } for this MultiSig Account
* Return all active { @link api/entities/MultiSigProposal!MultiSigProposal } for this MultiSig Account
*/
public async getProposals(): Promise<MultiSigProposal[]> {
const {
Expand All @@ -104,13 +112,35 @@ export class MultiSig extends Account {

const rawProposalEntries = await multiSig.proposals.entries(rawAddress);

return rawProposalEntries.map(
const proposals: MultiSigProposal[] = [];

if (!rawProposalEntries.length) {
return [];
}

const queries = rawProposalEntries.map(
([
{
args: [, rawId],
args: [rawKey, rawId],
},
]) => new MultiSigProposal({ multiSigAddress: address, id: u64ToBigNumber(rawId) }, context)
]) => {
proposals.push(
new MultiSigProposal({ multiSigAddress: address, id: u64ToBigNumber(rawId) }, context)
);

return [rawKey, rawId];
}
);

const details = await multiSig.proposalDetail.multi(queries);

const statuses = details.map(({ status: rawStatus, expiry: rawExpiry }) => {
const expiry = optionize(momentToDate)(rawExpiry.unwrapOr(null));

return meshProposalStatusToProposalStatus(rawStatus, expiry);
});

return proposals.filter((_, index) => statuses[index] === ProposalStatus.Active);
}

/**
Expand Down
42 changes: 42 additions & 0 deletions src/api/entities/Account/__tests__/MultiSig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
createMockBool,
createMockCall,
createMockIdentityId,
createMockMoment,
createMockOption,
createMockSignatory,
} from '~/testUtils/mocks/dataSources';
Expand Down Expand Up @@ -128,6 +129,13 @@ describe('MultiSig class', () => {

describe('method: getProposals', () => {
const id = new BigNumber(1);
const proposalDetails = {
approvals: new BigNumber(1),
rejections: new BigNumber(1),
status: dsMockUtils.createMockProposalStatus('ActiveOrExpired'),
autoClose: true,
};

it('should get proposals', async () => {
dsMockUtils.createQueryMock('multiSig', 'proposals', {
entries: [
Expand All @@ -137,6 +145,16 @@ describe('MultiSig class', () => {
],
],
});

dsMockUtils.createQueryMock('multiSig', 'proposalDetail', {
multi: [
dsMockUtils.createMockProposalDetails({
...proposalDetails,
expiry: createMockOption(createMockMoment(new BigNumber(new Date().getTime() + 10000))),
}),
],
});

const result = await multiSig.getProposals();

expect(result).toMatchObject([{ multiSig: expect.objectContaining({ address }), id }]);
Expand All @@ -151,6 +169,30 @@ describe('MultiSig class', () => {

expect(result).toEqual([]);
});

it('should filter out non pending proposals', async () => {
dsMockUtils.createQueryMock('multiSig', 'proposals', {
entries: [
[
[dsMockUtils.createMockAccountId(address), dsMockUtils.createMockU64(id)],
createMockOption(createMockCall()),
],
],
});

dsMockUtils.createQueryMock('multiSig', 'proposalDetail', {
multi: [
dsMockUtils.createMockProposalDetails({
...proposalDetails,
expiry: createMockOption(createMockMoment(new BigNumber(3))),
}),
],
});

const result = await multiSig.getProposals();

expect(result).toMatchObject([]);
});
});

describe('method: getCreator', () => {
Expand Down
12 changes: 12 additions & 0 deletions src/api/entities/Account/__tests__/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
createMockAccountId,
createMockCall,
createMockIdentityId,
createMockMoment,
createMockOption,
createMockPermissions,
createMockU64,
Expand Down Expand Up @@ -971,6 +972,17 @@ describe('Account class', () => {
],
],
});
dsMockUtils.createQueryMock('multiSig', 'proposalDetail', {
multi: [
dsMockUtils.createMockProposalDetails({
approvals: new BigNumber(1),
rejections: new BigNumber(1),
status: dsMockUtils.createMockProposalStatus('ActiveOrExpired'),
autoClose: true,
expiry: createMockOption(createMockMoment(new BigNumber(new Date().getTime() + 10000))),
}),
],
});

const result = await account.getPendingProposals();

Expand Down

0 comments on commit 5197e84

Please sign in to comment.