Skip to content

Commit

Permalink
Feature: Split getPluginSetings in getVotingSettings and getMembers (#…
Browse files Browse the repository at this point in the history
…147)

* add getMembers and getVotingSettings

* update changelog

* update version
  • Loading branch information
josemarinas authored Jan 25, 2023
1 parent d072b24 commit c201f8f
Show file tree
Hide file tree
Showing 11 changed files with 169 additions and 51 deletions.
23 changes: 18 additions & 5 deletions docs/multisig.md
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,8 @@ so that the plugin is configured</p>
* [.executeProposal(ExecuteProposalParams)](#MultisigClientMethods+executeProposal) ⇒ <code>\*</code>
* [.canApprove(addressOrEns)](#MultisigClientMethods+canApprove) ⇒ <code>\*</code>
* [.canExecute(addressOrEns)](#MultisigClientMethods+canExecute) ⇒ <code>\*</code>
* [.getPluginSettings(addressOrEns)](#MultisigClientMethods+getPluginSettings) ⇒ <code>\*</code>
* [.getVotingSettings(addressOrEns)](#MultisigClientMethods+getVotingSettings) ⇒ <code>\*</code>
* [.getMembers(addressOrEns)](#MultisigClientMethods+getMembers) ⇒ <code>\*</code>
* [.getProposal(proposalId)](#MultisigClientMethods+getProposal) ⇒ <code>\*</code>
* [.getProposals({)](#MultisigClientMethods+getProposals) ⇒ <code>\*</code>

Expand Down Expand Up @@ -302,13 +303,25 @@ so that the plugin is configured</p>
| --- | --- |
| addressOrEns | <code>string</code> |

<a name="MultisigClientMethods+getPluginSettings"></a>
<a name="MultisigClientMethods+getVotingSettings"></a>

### multisigClientMethods.getPluginSettings(addressOrEns) ⇒ <code>\*</code>
<p>returns the plugin settings</p>
### multisigClientMethods.getVotingSettings(addressOrEns) ⇒ <code>\*</code>
<p>returns the voting settings</p>

**Kind**: instance method of [<code>MultisigClientMethods</code>](#MultisigClientMethods)
**Returns**: <code>\*</code> - <p>{Promise<MultisigPluginSettings>}</p>
**Returns**: <code>\*</code> - <p>{Promise<MultisigVotingSettings>}</p>

| Param | Type |
| --- | --- |
| addressOrEns | <code>string</code> |

<a name="MultisigClientMethods+getMembers"></a>

### multisigClientMethods.getMembers(addressOrEns) ⇒ <code>\*</code>
<p>returns the members of the multisig</p>

**Kind**: instance method of [<code>MultisigClientMethods</code>](#MultisigClientMethods)
**Returns**: <code>\*</code> - <p>{Promise&lt;string[]&gt;}</p>

| Param | Type |
| --- | --- |
Expand Down
3 changes: 2 additions & 1 deletion modules/client/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ TEMPLATE:
-->

## [UPCOMING]

### Changed
- Splits `getPluginSettings` in `getVotingSettings` and `getMembers`
## [0.18.0-alpha]
### Added
- Add `pinMetadata` examples
Expand Down
45 changes: 35 additions & 10 deletions modules/client/examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -3080,7 +3080,7 @@ import {
Context,
ContextPlugin,
MultisigClient,
MultisigPluginSettings,
MultisigVotingSettings,
} from "@aragon/sdk-client";
import { contextParams } from "../00-client/00-context";

Expand All @@ -3093,18 +3093,11 @@ const client = new MultisigClient(contextPlugin);

const daoAddressorEns = "0x12345...";

const settings: MultisigPluginSettings = await client.methods
.getPluginSettings(daoAddressorEns);
const settings: MultisigVotingSettings = await client.methods
.getVotingSettings(daoAddressorEns);
console.log(settings);
/*
{
members: [
"0x1234567890123456789012345678901234567890",
"0x2345678901234567890123456789012345678901",
"0x3456789012345678901234567890123456789012",
"0x4567890123456789012345678901234567890123",
"0x5678901234567890123456789012345678901234",
],
votingSettings: {
minApprovals: 4,
onlyListed: true
Expand Down Expand Up @@ -3288,3 +3281,35 @@ console.log(metadataUri);
ipfs://Qm...
*/
```

### Loading the list of members (multisig plugin)

```ts
import {
Context,
ContextPlugin,
MultisigClient,
MultisigVotingSettings,
} from "@aragon/sdk-client";
import { contextParams } from "../00-client/00-context";

// Create a simple context
const context: Context = new Context(contextParams);
// Create a plugin context from the simple context
const contextPlugin: ContextPlugin = ContextPlugin.fromContext(context);
// Create an multisig client
const client = new MultisigClient(contextPlugin);

const daoAddressorEns = "0x12345...";

const settings: string[] = await client.methods
.getMembers(daoAddressorEns);
console.log(settings);
/*
[
"0x1234567890...",
"0x2345678901...",
"0x3456789012...",
]
*/
```
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
Context,
ContextPlugin,
MultisigClient,
MultisigPluginSettings,
MultisigVotingSettings,
} from "@aragon/sdk-client";
import { contextParams } from "../00-client/00-context";

Expand All @@ -18,18 +18,11 @@ const client = new MultisigClient(contextPlugin);

const daoAddressorEns = "0x12345...";

const settings: MultisigPluginSettings = await client.methods
.getPluginSettings(daoAddressorEns);
const settings: MultisigVotingSettings = await client.methods
.getVotingSettings(daoAddressorEns);
console.log(settings);
/*
{
members: [
"0x1234567890123456789012345678901234567890",
"0x2345678901234567890123456789012345678901",
"0x3456789012345678901234567890123456789012",
"0x4567890123456789012345678901234567890123",
"0x5678901234567890123456789012345678901234",
],
votingSettings: {
minApprovals: 4,
onlyListed: true
Expand Down
30 changes: 30 additions & 0 deletions modules/client/examples/06-multisig-client/12-get-members.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/* MARKDOWN
### Loading the list of members (multisig plugin)
*/
import {
Context,
ContextPlugin,
MultisigClient,
MultisigVotingSettings,
} from "@aragon/sdk-client";
import { contextParams } from "../00-client/00-context";

// Create a simple context
const context: Context = new Context(contextParams);
// Create a plugin context from the simple context
const contextPlugin: ContextPlugin = ContextPlugin.fromContext(context);
// Create an multisig client
const client = new MultisigClient(contextPlugin);

const daoAddressorEns = "0x12345...";

const settings: string[] = await client.methods
.getMembers(daoAddressorEns);
console.log(settings);
/*
[
"0x1234567890...",
"0x2345678901...",
"0x3456789012...",
]
*/
2 changes: 1 addition & 1 deletion modules/client/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@aragon/sdk-client",
"author": "Aragon Association",
"version": "0.18.0-alpha",
"version": "0.19.0-alpha",
"license": "MIT",
"main": "dist/index.js",
"module": "dist/sdk-client.esm.js",
Expand Down
16 changes: 11 additions & 5 deletions modules/client/src/multisig/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,12 @@ export interface IMultisigClientMethods extends IClientCore {
) => AsyncGenerator<ExecuteProposalStepValue>;
canApprove: (params: CanApproveParams) => Promise<boolean>;
canExecute: (params: CanExecuteParams) => Promise<boolean>;
getPluginSettings: (
getVotingSettings: (
addressOrEns: string,
) => Promise<MultisigPluginSettings>;
) => Promise<MultisigVotingSettings>;
getMembers: (
addressOrEns: string,
) => Promise<string[]>;
getProposal: (propoosalId: string) => Promise<MultisigProposal | null>;
getProposals: (
params: IProposalQueryParams,
Expand Down Expand Up @@ -162,10 +165,13 @@ export type SubgraphMultisigApproversListItem = {
approver: { id: string };
};

export type SubgraphMultisigPluginSettings = {
export type SubgraphMultisigVotingSettings = {
minApprovals: string;
onlyListed: boolean;
};

export type SubgraphMultisigMembers = {
members: {
address: string;
}[];
minApprovals: string;
onlyListed: boolean;
};
51 changes: 39 additions & 12 deletions modules/client/src/multisig/internal/client/methods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ import {
CreateMultisigProposalParams,
ExecuteProposalParams,
IMultisigClientMethods,
MultisigPluginSettings,
MultisigProposal,
MultisigProposalListItem,
SubgraphMultisigPluginSettings,
MultisigVotingSettings,
SubgraphMultisigMembers,
SubgraphMultisigProposal,
SubgraphMultisigProposalListItem,
SubgraphMultisigVotingSettings,
} from "../../interfaces";
import {
CanExecuteParams,
Expand Down Expand Up @@ -53,6 +54,7 @@ import {
} from "../graphql-queries";
import { toMultisigProposal, toMultisigProposalListItem } from "../utils";
import { toUtf8Bytes } from "@ethersproject/strings";
import { QueryMultisigMembers } from "../graphql-queries/members";

/**
* Methods module the SDK Address List Client
Expand Down Expand Up @@ -280,15 +282,15 @@ export class MultisigClientMethods extends ClientCore
return multisigContract.canExecute(params.proposalId);
}
/**
* returns the plugin settings
* returns the voting settings
*
* @param {string} addressOrEns
* @return {*} {Promise<MultisigPluginSettings>}
* @return {*} {Promise<MultisigVotingSettings>}
* @memberof MultisigClientMethods
*/
public async getPluginSettings(
public async getVotingSettings(
address: string,
): Promise<MultisigPluginSettings> {
): Promise<MultisigVotingSettings> {
// TODO
// update this with yup validation
if (!isAddress(address)) {
Expand All @@ -298,21 +300,46 @@ export class MultisigClientMethods extends ClientCore
await this.graphql.ensureOnline();
const client = this.graphql.getClient();
const { multisigPlugin }: {
multisigPlugin: SubgraphMultisigPluginSettings;
multisigPlugin: SubgraphMultisigVotingSettings;
} = await client.request(QueryMultisigVotingSettings, {
address,
});
return {
votingSettings: {
onlyListed: multisigPlugin.onlyListed,
minApprovals: parseInt(multisigPlugin.minApprovals),
},
members: [],
onlyListed: multisigPlugin.onlyListed,
minApprovals: parseInt(multisigPlugin.minApprovals),
};
} catch {
throw new GraphQLError("Multisig settings");
}
}
/**
* returns the members of the multisig
*
* @param {string} addressOrEns
* @return {*} {Promise<string[]>}
* @memberof MultisigClientMethods
*/
public async getMembers(
address: string,
): Promise<string[]> {
// TODO
// update this with yup validation
if (!isAddress(address)) {
throw new InvalidAddressOrEnsError();
}
try {
await this.graphql.ensureOnline();
const client = this.graphql.getClient();
const { multisigPlugin }: {
multisigPlugin: SubgraphMultisigMembers;
} = await client.request(QueryMultisigMembers, {
address,
});
return multisigPlugin.members.map((member) => member.address);
} catch {
throw new GraphQLError("Multisig members");
}
}
/**
* Returns the details of the given proposal
*
Expand Down
11 changes: 11 additions & 0 deletions modules/client/src/multisig/internal/graphql-queries/members.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { gql } from "graphql-request";

export const QueryMultisigMembers = gql`
query MultisigMembers($address: ID!) {
multisigPlugin(id: $address){
members {
address
}
}
}
`;
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ import { gql } from "graphql-request";
export const QueryMultisigVotingSettings = gql`
query MultisigVotingSettings($address: ID!) {
multisigPlugin(id: $address){
members {
address
}
minApprovals
onlyListed
}
Expand Down
23 changes: 19 additions & 4 deletions modules/client/test/integration/multisig-client/methods.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -217,18 +217,33 @@ describe("Client Multisig", () => {
});

describe("Data retrieval", () => {
it("Should get the settings of the plugin", async () => {
it("Should get the voting settings of the plugin", async () => {
const ctx = new Context(contextParams);
const ctxPlugin = ContextPlugin.fromContext(ctx);
const client = new MultisigClient(ctxPlugin);

const settings = await client.methods.getPluginSettings(
const settings = await client.methods.getVotingSettings(
TEST_MULTISIG_PLUGIN_ADDRESS,
);
expect(typeof settings).toBe("object");
expect(typeof settings.votingSettings.minApprovals).toBe("number");
expect(typeof settings.votingSettings.onlyListed).toBe("boolean");
expect(typeof settings.minApprovals).toBe("number");
expect(typeof settings.onlyListed).toBe("boolean");
});

it("Should get members of the multisig", async () => {
const ctx = new Context(contextParams);
const ctxPlugin = ContextPlugin.fromContext(ctx);
const client = new MultisigClient(ctxPlugin);

const wallets = await client.methods.getMembers(
TEST_MULTISIG_PLUGIN_ADDRESS,
);
expect(Array.isArray(wallets)).toBe(true);
expect(wallets.length).toBeGreaterThan(0);
expect(typeof wallets[0]).toBe("string");
expect(wallets[0]).toMatch(/^0x[A-Fa-f0-9]{40}$/i);
});

it("Should fetch the given proposal", async () => {
const ctx = new Context(contextParams);
const ctxPlugin = ContextPlugin.fromContext(ctx);
Expand Down

0 comments on commit c201f8f

Please sign in to comment.