diff --git a/modules/client/CHANGELOG.md b/modules/client/CHANGELOG.md index bc5ffbc71..6e0658a6e 100644 --- a/modules/client/CHANGELOG.md +++ b/modules/client/CHANGELOG.md @@ -18,6 +18,9 @@ TEMPLATE: ## [UPCOMING] ### Added +- Block param on `getVotingSettings` and `getMembers` functions to allow for historical data +## 1.11.0-rc1 +### Added - Support for baseMainnet network ## 1.11.0-rc1 ### Added diff --git a/modules/client/src/addresslistVoting/internal/client/methods.ts b/modules/client/src/addresslistVoting/internal/client/methods.ts index 472b6b32a..25fc16e72 100644 --- a/modules/client/src/addresslistVoting/internal/client/methods.ts +++ b/modules/client/src/addresslistVoting/internal/client/methods.ts @@ -42,9 +42,9 @@ import { QueryAddresslistVotingSettings, } from "../graphql-queries"; import { + computeProposalStatusFilter, toAddresslistVotingProposal, toAddresslistVotingProposalListItem, - computeProposalStatusFilter } from "../utils"; import { AddresslistVoting__factory } from "@aragon/osx-ethers"; import { toUtf8Bytes } from "@ethersproject/strings"; @@ -498,11 +498,13 @@ export class AddresslistVotingClientMethods extends ClientCore * Returns the settings of a plugin given the address of the plugin instance * * @param {string} pluginAddress + * @param {number} blockNumber * @return {*} {(Promise)} * @memberof AddresslistVotingClientMethods */ public async getVotingSettings( pluginAddress: string, + blockNumber?: number, ): Promise { if (!isAddress(pluginAddress)) { throw new InvalidAddressError(); @@ -510,6 +512,7 @@ export class AddresslistVotingClientMethods extends ClientCore const query = QueryAddresslistVotingSettings; const params = { address: pluginAddress.toLowerCase(), + block: blockNumber ? { number: blockNumber } : null, }; const name = "AddresslistVoting settings"; type T = { addresslistVotingPlugin: SubgraphVotingSettings }; diff --git a/modules/client/src/addresslistVoting/internal/graphql-queries/settings.ts b/modules/client/src/addresslistVoting/internal/graphql-queries/settings.ts index b21269b55..1ed5675fd 100644 --- a/modules/client/src/addresslistVoting/internal/graphql-queries/settings.ts +++ b/modules/client/src/addresslistVoting/internal/graphql-queries/settings.ts @@ -1,8 +1,8 @@ import { gql } from "graphql-request"; export const QueryAddresslistVotingSettings = gql` -query AddresslistVotingSettings($address: ID!) { - addresslistVotingPlugin(id: $address){ +query AddresslistVotingSettings($address: ID!, $block: Block_height) { + addresslistVotingPlugin(id: $address, block: $block){ minDuration minProposerVotingPower minParticipation diff --git a/modules/client/src/addresslistVoting/internal/interfaces.ts b/modules/client/src/addresslistVoting/internal/interfaces.ts index 3bb75dc8a..6a1ab9f7c 100644 --- a/modules/client/src/addresslistVoting/internal/interfaces.ts +++ b/modules/client/src/addresslistVoting/internal/interfaces.ts @@ -47,7 +47,10 @@ export interface IAddresslistVotingClientMethods { getProposals: ( params: ProposalQueryParams, ) => Promise; - getVotingSettings: (pluginAddress: string) => Promise; + getVotingSettings: ( + pluginAddress: string, + blockNumber?: number, + ) => Promise; } export interface IAddresslistVotingClientEncoding { diff --git a/modules/client/src/multisig/internal/client/methods.ts b/modules/client/src/multisig/internal/client/methods.ts index 22747db3b..eacf3affe 100644 --- a/modules/client/src/multisig/internal/client/methods.ts +++ b/modules/client/src/multisig/internal/client/methods.ts @@ -48,7 +48,11 @@ import { QueryMultisigProposals, QueryMultisigVotingSettings, } from "../graphql-queries"; -import { computeProposalStatusFilter, toMultisigProposal, toMultisigProposalListItem } from "../utils"; +import { + computeProposalStatusFilter, + toMultisigProposal, + toMultisigProposalListItem, +} from "../utils"; import { toUtf8Bytes } from "@ethersproject/strings"; import { IMultisigClientMethods } from "../interfaces"; import { @@ -307,11 +311,13 @@ export class MultisigClientMethods extends ClientCore * Returns the voting settings * * @param {string} addressOrEns + * @param {number} blockNumber * @return {*} {Promise} * @memberof MultisigClientMethods */ public async getVotingSettings( pluginAddress: string, + blockNumber?: number, ): Promise { // TODO // update this with yup validation @@ -321,6 +327,7 @@ export class MultisigClientMethods extends ClientCore const query = QueryMultisigVotingSettings; const params = { address: pluginAddress.toLowerCase(), + block: blockNumber ? { number: blockNumber } : null, }; const name = "Multisig settings"; type T = { multisigPlugin: SubgraphMultisigVotingSettings }; diff --git a/modules/client/src/multisig/internal/graphql-queries/settings.ts b/modules/client/src/multisig/internal/graphql-queries/settings.ts index 444e326da..61e0b9f73 100644 --- a/modules/client/src/multisig/internal/graphql-queries/settings.ts +++ b/modules/client/src/multisig/internal/graphql-queries/settings.ts @@ -1,8 +1,8 @@ import { gql } from "graphql-request"; export const QueryMultisigVotingSettings = gql` -query MultisigVotingSettings($address: ID!) { - multisigPlugin(id: $address){ +query MultisigVotingSettings($address: ID!, $block: Block_height) { + multisigPlugin(id: $address, block: $block){ minApprovals onlyListed } diff --git a/modules/client/src/multisig/internal/interfaces.ts b/modules/client/src/multisig/internal/interfaces.ts index dad6abda5..699655324 100644 --- a/modules/client/src/multisig/internal/interfaces.ts +++ b/modules/client/src/multisig/internal/interfaces.ts @@ -45,6 +45,7 @@ export interface IMultisigClientMethods { canExecute: (proposalId: string) => Promise; getVotingSettings: ( addressOrEns: string, + blockNumber?: number, ) => Promise; getMembers: ( addressOrEns: string, diff --git a/modules/client/src/tokenVoting/internal/client/methods.ts b/modules/client/src/tokenVoting/internal/client/methods.ts index 9aaca1b23..60f0cf47a 100644 --- a/modules/client/src/tokenVoting/internal/client/methods.ts +++ b/modules/client/src/tokenVoting/internal/client/methods.ts @@ -442,16 +442,21 @@ export class TokenVotingClientMethods extends ClientCore * * @async * @param {string} pluginAddress + * @param {number} blockNumber * @return {*} {Promise} * @memberof TokenVotingClient */ - public async getMembers(pluginAddress: string): Promise { + public async getMembers( + pluginAddress: string, + blockNumber?: number, + ): Promise { if (!isAddress(pluginAddress)) { throw new InvalidAddressError(); } const query = QueryTokenVotingMembers; const params = { address: pluginAddress.toLowerCase(), + block: blockNumber ? { number: blockNumber } : null, }; const name = "TokenVoting members"; type T = { tokenVotingPlugin: { members: SubgraphTokenVotingMember[] } }; @@ -614,11 +619,13 @@ export class TokenVotingClientMethods extends ClientCore * Returns the settings of a plugin given the address of the plugin instance * * @param {string} pluginAddress + * @param {number} blockNumber * @return {*} {Promise} * @memberof TokenVotingClient */ public async getVotingSettings( pluginAddress: string, + blockNumber?: number, ): Promise { if (!isAddress(pluginAddress)) { throw new InvalidAddressError(); @@ -626,6 +633,7 @@ export class TokenVotingClientMethods extends ClientCore const query = QueryTokenVotingSettings; const params = { address: pluginAddress.toLowerCase(), + block: blockNumber ? { number: blockNumber } : null, }; const name = "TokenVoting settings"; type T = { tokenVotingPlugin: SubgraphVotingSettings }; diff --git a/modules/client/src/tokenVoting/internal/graphql-queries/members.ts b/modules/client/src/tokenVoting/internal/graphql-queries/members.ts index 6fa03e6ee..efa0bc9c4 100644 --- a/modules/client/src/tokenVoting/internal/graphql-queries/members.ts +++ b/modules/client/src/tokenVoting/internal/graphql-queries/members.ts @@ -1,8 +1,8 @@ import { gql } from "graphql-request"; export const QueryTokenVotingMembers = gql` -query TokenVotingMembers($address: ID!) { - tokenVotingPlugin(id: $address){ +query TokenVotingMembers($address: ID!, $block: Block_height) { + tokenVotingPlugin(id: $address, block: $block){ members { address balance diff --git a/modules/client/src/tokenVoting/internal/graphql-queries/settings.ts b/modules/client/src/tokenVoting/internal/graphql-queries/settings.ts index 20bc597e9..ac16e582c 100644 --- a/modules/client/src/tokenVoting/internal/graphql-queries/settings.ts +++ b/modules/client/src/tokenVoting/internal/graphql-queries/settings.ts @@ -1,8 +1,8 @@ import { gql } from "graphql-request"; export const QueryTokenVotingSettings = gql` -query TokenVotingSettings($address: ID!) { - tokenVotingPlugin(id: $address){ +query TokenVotingSettings($address: ID!,$block: Block_height) { + tokenVotingPlugin(id: $address, block: $block){ minDuration minProposerVotingPower minParticipation diff --git a/modules/client/src/tokenVoting/internal/interfaces.ts b/modules/client/src/tokenVoting/internal/interfaces.ts index 198b31dfe..4c8446629 100644 --- a/modules/client/src/tokenVoting/internal/interfaces.ts +++ b/modules/client/src/tokenVoting/internal/interfaces.ts @@ -52,12 +52,18 @@ export interface ITokenVotingClientMethods { ) => AsyncGenerator; canVote: (params: CanVoteParams) => Promise; canExecute: (proposalId: string) => Promise; - getMembers: (addressOrEns: string) => Promise; + getMembers: ( + addressOrEns: string, + blockNumber?: number, + ) => Promise; getProposal: (propoosalId: string) => Promise; getProposals: ( params: ProposalQueryParams, ) => Promise; - getVotingSettings: (pluginAddress: string) => Promise; + getVotingSettings: ( + pluginAddress: string, + blockNumber?: number, + ) => Promise; getToken: ( pluginAddress: string, ) => Promise< diff --git a/modules/client/test/integration/addresslistVoting-client/methods.test.ts b/modules/client/test/integration/addresslistVoting-client/methods.test.ts index 7952c97fe..aed6c99ee 100644 --- a/modules/client/test/integration/addresslistVoting-client/methods.test.ts +++ b/modules/client/test/integration/addresslistVoting-client/methods.test.ts @@ -48,6 +48,7 @@ import { QueryAddresslistVotingMembers, QueryAddresslistVotingProposal, QueryAddresslistVotingProposals, + QueryAddresslistVotingSettings, } from "../../../src/addresslistVoting/internal/graphql-queries"; import { SubgraphAddresslistVotingProposal, @@ -956,6 +957,13 @@ describe("Client Address List", () => { expect(settings!.minParticipation).toBe(0.3); expect(settings!.supportThreshold).toBe(0.4); expect(settings!.minProposerVotingPower).toBe(BigInt(200000)); + expect(mockedClient.request).toHaveBeenCalledWith( + QueryAddresslistVotingSettings, + { + address: ADDRESS_ONE, + block: null, + }, + ); }); }); }); diff --git a/modules/client/test/integration/multisig-client/methods.test.ts b/modules/client/test/integration/multisig-client/methods.test.ts index c9405ed46..d6942824a 100644 --- a/modules/client/test/integration/multisig-client/methods.test.ts +++ b/modules/client/test/integration/multisig-client/methods.test.ts @@ -391,6 +391,7 @@ describe("Client Multisig", () => { QueryMultisigVotingSettings, { address: ADDRESS_ONE, + block: null, }, ); }); diff --git a/modules/client/test/integration/tokenVoting-client/methods.test.ts b/modules/client/test/integration/tokenVoting-client/methods.test.ts index a441d5c14..0b10e134c 100644 --- a/modules/client/test/integration/tokenVoting-client/methods.test.ts +++ b/modules/client/test/integration/tokenVoting-client/methods.test.ts @@ -887,7 +887,7 @@ describe("Token Voting Client", () => { expect(mockedClient.request).toHaveBeenCalledWith( QueryTokenVotingMembers, - { address: ADDRESS_ONE }, + { address: ADDRESS_ONE, block: null }, ); }); it("Should fetch the given proposal", async () => { @@ -1229,7 +1229,7 @@ describe("Token Voting Client", () => { address: subgraphProposals[index].voters[0].voter.address, }); } - + expect(mockedClient.request).toHaveBeenCalledWith( QueryTokenVotingProposals, { @@ -1348,7 +1348,7 @@ describe("Token Voting Client", () => { } expect(mockedClient.request).toHaveBeenCalledWith( QueryTokenVotingSettings, - { address: pluginAddress }, + { address: pluginAddress, block: null }, ); }); it("Should get the token details of a plugin given a plugin instance address", async () => {