Skip to content

Commit a3c0690

Browse files
committed
Add: colony v14 client
1 parent 097a9de commit a3c0690

File tree

5 files changed

+299
-1
lines changed

5 files changed

+299
-1
lines changed

src/clients/Colony/ColonyClientV14.ts

+143
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import { Contract, Signer } from 'ethers';
2+
import { Provider } from 'ethers/providers';
3+
4+
import { IColonyFactory as IColonyFactoryV3 } from '../../contracts/3/IColonyFactory';
5+
import { IColonyFactory as IColonyFactoryV4 } from '../../contracts/4/IColonyFactory';
6+
import { IColony__factory as IColonyFactoryV5 } from '../../contracts/5/factories/IColony__factory';
7+
import { IColony__factory as IColonyFactoryV6 } from '../../contracts/colony/6/factories/IColony__factory';
8+
import { IColony__factory as IColonyFactoryV7 } from '../../contracts/colony/7/factories/IColony__factory';
9+
import { IColony__factory as IColonyFactoryV8 } from '../../contracts/colony/8/factories/IColony__factory';
10+
import { IColony__factory as IColonyFactoryV9 } from '../../contracts/colony/9/factories/IColony__factory';
11+
import { IColony__factory as IColonyFactoryV10 } from '../../contracts/colony/10/factories/IColony__factory';
12+
import { IColony__factory as IColonyFactoryV11 } from '../../contracts/colony/11/factories/IColony__factory';
13+
import { IColony__factory as IColonyFactoryV12 } from '../../contracts/colony/12/factories/IColony__factory';
14+
import { IColony__factory as IColonyFactoryV13 } from '../../contracts/colony/13/factories/IColony__factory';
15+
import { IColony__factory as IColonyFactoryV14 } from '../../contracts/colony/13/factories/IColony__factory';
16+
17+
import { IColony as IColonyV6 } from '../../contracts/colony/6/IColony';
18+
import { IColony as IColonyV7 } from '../../contracts/colony/7/IColony';
19+
import { IColony as IColonyV8 } from '../../contracts/colony/8/IColony';
20+
import { IColony as IColonyV9 } from '../../contracts/colony/9/IColony';
21+
import { IColony as IColonyV10 } from '../../contracts/colony/10/IColony';
22+
import { IColony as IColonyV11 } from '../../contracts/colony/11/IColony';
23+
import { IColony as IColonyV12 } from '../../contracts/colony/12/IColony';
24+
import { IColony as PreviousIColony } from '../../contracts/colony/13/IColony';
25+
import { IColony } from '../../contracts/colony/14/IColony';
26+
27+
import { ColonyNetworkClient } from '../ColonyNetworkClient';
28+
import { ExtendedIColony } from './extensions/commonExtensions';
29+
import { ColonyExtensionsV3 } from './extensions/extensionsV3';
30+
import { ColonyExtensionsV4 } from './extensions/extensionsV4';
31+
import { ColonyExtensionsV5 } from './extensions/extensionsV5';
32+
import { ColonyExtensionsV6 } from './extensions/extensionsV6';
33+
import { ColonyExtensionsV7 } from './extensions/extensionsV7';
34+
import { ColonyExtensionsV8 } from './extensions/extensionsV8';
35+
import { ColonyExtensionsV9 } from './extensions/extensionsV9';
36+
import { ColonyExtensionsV10 } from './extensions/extensionsV10';
37+
import { ColonyExtensionsV11 } from './extensions/extensionsV11';
38+
import { ColonyExtensionsV12 } from './extensions/extensionsV12';
39+
import { ColonyExtensionsV13 } from './extensions/extensionsV13';
40+
41+
import {
42+
addExtensions,
43+
ColonyExtensionsV14,
44+
ExtendedEstimateV14,
45+
} from './extensions/extensionsV14';
46+
47+
import { addEncodeInterfaces } from './interfaces/encodeInterfacesV14';
48+
49+
import { getAllAbiEvents, getAbiFunctions } from '../../utils';
50+
import { ColonyVersion } from '../../versions';
51+
52+
type ColonyExtensions = Omit<
53+
ExtendedIColony<any>,
54+
'moveFundsBetweenPotsWithProofs'
55+
> &
56+
ColonyExtensionsV3<IColonyV6> &
57+
ColonyExtensionsV4<IColonyV6> &
58+
ColonyExtensionsV5<IColonyV6> &
59+
ColonyExtensionsV6<IColonyV6> &
60+
ColonyExtensionsV7<IColonyV7> &
61+
ColonyExtensionsV8<IColonyV8> &
62+
ColonyExtensionsV9<IColonyV9> &
63+
ColonyExtensionsV10<IColonyV10> &
64+
ColonyExtensionsV11<IColonyV11> &
65+
ColonyExtensionsV12<IColonyV12> &
66+
ColonyExtensionsV13<PreviousIColony> &
67+
ColonyExtensionsV14<IColony>;
68+
69+
export type ColonyClientV14 = ColonyExtensions & {
70+
clientVersion: ColonyVersion.GreenLightweightSpaceshipThree;
71+
estimate: ExtendedIColony<any>['estimate'] & ExtendedEstimateV14;
72+
};
73+
74+
export default function getColonyClient(
75+
this: ColonyNetworkClient,
76+
address: string,
77+
signerOrProvider: Signer | Provider,
78+
): ColonyClientV14 {
79+
const abiFunctions = getAbiFunctions(
80+
IColonyFactoryV14,
81+
address,
82+
signerOrProvider,
83+
);
84+
/*
85+
* Get all events, including the ones from v3, as well as the current ones
86+
*/
87+
const abiEvents = getAllAbiEvents(
88+
[
89+
IColonyFactoryV14,
90+
IColonyFactoryV13,
91+
IColonyFactoryV12,
92+
IColonyFactoryV11,
93+
IColonyFactoryV10,
94+
IColonyFactoryV9,
95+
IColonyFactoryV8,
96+
IColonyFactoryV7,
97+
IColonyFactoryV6,
98+
IColonyFactoryV5,
99+
IColonyFactoryV4,
100+
IColonyFactoryV3,
101+
],
102+
address,
103+
signerOrProvider,
104+
);
105+
106+
/*
107+
* For this to work we have to create our own instance of the contract, so
108+
* that we can pass in the merged abi events
109+
*/
110+
const customEthersContractInstace = (new Contract(
111+
address,
112+
[...abiFunctions, ...abiEvents],
113+
signerOrProvider,
114+
) as unknown) as ColonyClientV14;
115+
116+
/*
117+
* We need to clone the Ethers intance otherwise props, which we may
118+
* want appent or overwrite, won't work since Ethers marks their props
119+
* as read-only and non-configurable by default
120+
*
121+
* @TODO All of this should be extracted as an util to remove code repetition
122+
* when creating new Colony version clients
123+
*/
124+
const colonyClientV14 = {
125+
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
126+
// @ts-ignore
127+
...customEthersContractInstace,
128+
interface: {
129+
...customEthersContractInstace.interface,
130+
/*
131+
* Manually assign non-enumerable props
132+
*/
133+
parseLog: customEthersContractInstace.interface.parseLog,
134+
parseTransaction: customEthersContractInstace.interface.parseTransaction,
135+
},
136+
} as ColonyClientV14;
137+
colonyClientV14.clientVersion = ColonyVersion.HazelMediumweightSpaceship;
138+
139+
addExtensions(colonyClientV14, this);
140+
addEncodeInterfaces(colonyClientV14);
141+
142+
return colonyClientV14;
143+
}

src/clients/Colony/extensions/commonExtensions.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { IColony as IColonyV10 } from '../../../contracts/colony/10/IColony';
2525
import { IColony as IColonyV11 } from '../../../contracts/colony/11/IColony';
2626
import { IColony as IColonyV12 } from '../../../contracts/colony/12/IColony';
2727
import { IColony as IColonyV13 } from '../../../contracts/colony/13/IColony';
28+
import { IColony as IColonyV14 } from '../../../contracts/colony/14/IColony';
2829
import { TransactionOverrides } from '../../../contracts/6';
2930
import { IColonyFactory } from '../../../contracts/4/IColonyFactory';
3031

@@ -55,7 +56,8 @@ type AnyIColony =
5556
| IColonyV10
5657
| IColonyV11
5758
| IColonyV12
58-
| IColonyV13;
59+
| IColonyV13
60+
| IColonyV14;
5961

6062
// This is exposed to type the awkward recovery event client which is basically
6163
// just an IColonyV4
@@ -811,6 +813,7 @@ async function estimateAddPaymentWithProofs(
811813
_domainId,
812814
ColonyRole.Administration,
813815
);
816+
// @ts-ignore
814817
return this.estimate.addPayment(
815818
permissionDomainId,
816819
childSkillIndex,
@@ -832,6 +835,7 @@ async function estimateFinalizePaymentWithProofs(
832835
domainId,
833836
ColonyRole.Administration,
834837
);
838+
// @ts-ignore
835839
return this.estimate.finalizePayment(
836840
permissionDomainId,
837841
childSkillIndex,
@@ -850,6 +854,7 @@ async function estimateSetPaymentRecipientWithProofs(
850854
domainId,
851855
ColonyRole.Administration,
852856
);
857+
// @ts-ignore
853858
return this.estimate.setPaymentRecipient(
854859
permissionDomainId,
855860
childSkillIndex,
@@ -869,6 +874,7 @@ async function estimateSetPaymentSkillWithProofs(
869874
domainId,
870875
ColonyRole.Administration,
871876
);
877+
// @ts-ignore
872878
return this.estimate.setPaymentSkill(
873879
permissionDomainId,
874880
childSkillIndex,
@@ -889,6 +895,7 @@ async function estimateSetPaymentPayoutWithProofs(
889895
domainId,
890896
ColonyRole.Administration,
891897
);
898+
// @ts-ignore
892899
return this.estimate.setPaymentPayout(
893900
permissionDomainId,
894901
childSkillIndex,
@@ -910,6 +917,7 @@ async function estimateMakeTaskWithProofs(
910917
_domainId,
911918
ColonyRole.Administration,
912919
);
920+
// @ts-ignore
913921
return this.estimate.makeTask(
914922
permissionDomainId,
915923
childSkillIndex,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { IColony as IColonyV6 } from '../../../contracts/colony/6/IColony';
2+
import { IColony as IColonyV7 } from '../../../contracts/colony/7/IColony';
3+
import { IColony as IColonyV8 } from '../../../contracts/colony/8/IColony';
4+
import { IColony as IColonyV9 } from '../../../contracts/colony/9/IColony';
5+
import { IColony as IColonyV10 } from '../../../contracts/colony/10/IColony';
6+
import { IColony as IColonyV11 } from '../../../contracts/colony/11/IColony';
7+
import { IColony as IColonyV12 } from '../../../contracts/colony/12/IColony';
8+
import { IColony as PreviousIColony } from '../../../contracts/colony/13/IColony';
9+
// current version, but not used since we're forcing the any type
10+
// import { IColony as IColonyV14 } from '../../../contracts/colony/14/IColony';
11+
import { ColonyNetworkClient } from '../../ColonyNetworkClient';
12+
import { ExtendedIColony } from './commonExtensions';
13+
import { ColonyExtensionsV3 } from './extensionsV3';
14+
import { ColonyExtensionsV4 } from './extensionsV4';
15+
import { ColonyExtensionsV5 } from './extensionsV5';
16+
import { ColonyExtensionsV6 } from './extensionsV6';
17+
import { ColonyExtensionsV7 } from './extensionsV7';
18+
import { ColonyExtensionsV8 } from './extensionsV8';
19+
import { ColonyExtensionsV9 } from './extensionsV9';
20+
import { ColonyExtensionsV10 } from './extensionsV10';
21+
import { ColonyExtensionsV11 } from './extensionsV11';
22+
import { ColonyExtensionsV12 } from './extensionsV12';
23+
import {
24+
addExtensions as addExtensionsV13,
25+
ColonyExtensionsV13,
26+
ExtendedEstimateV13,
27+
} from './extensionsV13';
28+
29+
type ValidColony = any;
30+
31+
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
32+
// @ts-ignore
33+
type PreviousVersionsExtensions = ExtendedIColony<ValidColony> &
34+
ColonyExtensionsV3<IColonyV6> &
35+
ColonyExtensionsV4<IColonyV6> &
36+
ColonyExtensionsV5<IColonyV6> &
37+
ColonyExtensionsV6<IColonyV6> &
38+
ColonyExtensionsV7<IColonyV7> &
39+
ColonyExtensionsV8<IColonyV8> &
40+
ColonyExtensionsV9<IColonyV9> &
41+
ColonyExtensionsV10<IColonyV10> &
42+
ColonyExtensionsV11<IColonyV11> &
43+
ColonyExtensionsV12<IColonyV12> &
44+
ColonyExtensionsV13<PreviousIColony>;
45+
46+
/*
47+
* Estimates
48+
*/
49+
export type ExtendedEstimateV14 = ExtendedEstimateV13;
50+
51+
/*
52+
* Extension Methods
53+
*/
54+
export type ColonyExtensionsV14<
55+
T extends ValidColony
56+
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
57+
// @ts-ignore
58+
> = {} & PreviousVersionsExtensions;
59+
60+
/*
61+
* Bindings
62+
*/
63+
export const addExtensions = (
64+
instance: ExtendedIColony<ValidColony>,
65+
networkClient: ColonyNetworkClient,
66+
): ColonyExtensionsV13<ValidColony> => {
67+
// Add all extensions from v7, because these are also still valid
68+
const extendedInstance = addExtensionsV13(
69+
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
70+
// @ts-ignore
71+
instance as PreviousVersionsExtensions,
72+
networkClient,
73+
) as ColonyExtensionsV14<ValidColony>;
74+
return extendedInstance;
75+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { Interface } from 'ethers/utils';
2+
import { IColony as IColonyV10 } from '../../../contracts/colony/10/IColony';
3+
import { IColony as IColonyV11 } from '../../../contracts/colony/11/IColony';
4+
import { IColony as IColonyV12 } from '../../../contracts/colony/12/IColony';
5+
import { IColony as IColonyV13 } from '../../../contracts/colony/13/IColony';
6+
import { IColony as IColonyV14 } from '../../../contracts/colony/14/IColony';
7+
import { addEncodeInterfaces as addEncodeInterfacesV10 } from './encodeInterfacesV10';
8+
import { addEncodeInterfaces as addEncodeInterfacesV11 } from './encodeInterfacesV11';
9+
import { addEncodeInterfaces as addEncodeInterfacesV12 } from './encodeInterfacesV12';
10+
import {
11+
Interfaces as InterfacesV13,
12+
addEncodeInterfaces as addEncodeInterfacesV13,
13+
} from './encodeInterfacesV13';
14+
15+
type PreviousVersionsInterfaces = InterfacesV13;
16+
type ValidColony = IColonyV14;
17+
18+
export type Interfaces = {} & PreviousVersionsInterfaces;
19+
20+
export interface ColonyWithInterfacesV14 extends ValidColony {
21+
interface: Interface & {
22+
events: IColonyV14['interface']['events'];
23+
functions: IColonyV14['interface']['functions'] & Interfaces;
24+
};
25+
}
26+
27+
/*
28+
* Bindings
29+
*/
30+
export const addEncodeInterfaces = (
31+
colonyClient: ValidColony,
32+
): ColonyWithInterfacesV14 => {
33+
const {
34+
interface: { functions: v10functions },
35+
} = addEncodeInterfacesV10(colonyClient as unknown as IColonyV10);
36+
const {
37+
interface: { functions: v11functions },
38+
} = addEncodeInterfacesV11(colonyClient as IColonyV11);
39+
const {
40+
interface: { functions: v12functions },
41+
} = addEncodeInterfacesV12(colonyClient as IColonyV12);
42+
const {
43+
interface: { functions: v13functions },
44+
} = addEncodeInterfacesV13(colonyClient as IColonyV13);
45+
46+
/*
47+
* We're overwriting the original object in an effort to reduce
48+
* nesting
49+
*
50+
* Note: that this does not work the same for v9, but will function
51+
* this way going onward from version 10
52+
*/
53+
// eslint-disable-next-line no-param-reassign
54+
colonyClient.interface.functions = {
55+
...colonyClient.interface.functions,
56+
...v13functions,
57+
...v12functions,
58+
...v11functions,
59+
...v10functions,
60+
};
61+
62+
return colonyClient as ColonyWithInterfacesV14;
63+
};

src/clients/ColonyNetworkClient.ts

+9
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import getColonyClientV10 from './Colony/ColonyClientV10';
3333
import getColonyClientV11 from './Colony/ColonyClientV11';
3434
import getColonyClientV12 from './Colony/ColonyClientV12';
3535
import getColonyClientV13 from './Colony/ColonyClientV13';
36+
import getColonyClientV14 from './Colony/ColonyClientV14';
3637
import getTokenClient from './TokenClient';
3738
import getTokenLockingClient, {
3839
TokenLockingClient,
@@ -293,6 +294,14 @@ const getColonyNetworkClient = (
293294
);
294295
break;
295296
}
297+
case ColonyVersion.HazelMediumweightSpaceship: {
298+
colonyClient = getColonyClientV14.call(
299+
networkClient,
300+
colonyAddress,
301+
signerOrProvider,
302+
);
303+
break;
304+
}
296305
default: {
297306
throw new Error('Colony version not supported');
298307
}

0 commit comments

Comments
 (0)