Skip to content

Commit f8ff0df

Browse files
authored
Merge pull request #602 from JoinColony/maint/support-v13-colony
Maint/support v13 colony
2 parents 42b3044 + 27dd999 commit f8ff0df

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+51127
-11
lines changed

package-lock.json

+9,878-8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@colony/colony-js",
3-
"version": "v4.2.2-rc.3",
3+
"version": "v4.2.2-rc.4",
44
"main": "lib/index.js",
55
"module": "lib-esm/index.js",
66
"files": [

src/clients/Colony/ColonyClientV13.ts

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

src/clients/Colony/extensions/commonExtensions.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { IColony as IColonyV9 } from '../../../contracts/colony/9/IColony';
2424
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';
27+
import { IColony as IColonyV13 } from '../../../contracts/colony/13/IColony';
2728
import { TransactionOverrides } from '../../../contracts/6';
2829
import { IColonyFactory } from '../../../contracts/4/IColonyFactory';
2930

@@ -53,7 +54,8 @@ type AnyIColony =
5354
| IColonyV9
5455
| IColonyV10
5556
| IColonyV11
56-
| IColonyV12;
57+
| IColonyV12
58+
| IColonyV13;
5759

5860
// This is exposed to type the awkward recovery event client which is basically
5961
// just an IColonyV4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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 PreviousIColony } from '../../../contracts/colony/12/IColony';
8+
import { IColony as IColonyV13 } from '../../../contracts/colony/13/IColony';
9+
import { ColonyNetworkClient } from '../../ColonyNetworkClient';
10+
import { ExtendedIColony } from './commonExtensions';
11+
import { ColonyExtensionsV3 } from './extensionsV3';
12+
import { ColonyExtensionsV4 } from './extensionsV4';
13+
import { ColonyExtensionsV5 } from './extensionsV5';
14+
import { ColonyExtensionsV6 } from './extensionsV6';
15+
import { ColonyExtensionsV7 } from './extensionsV7';
16+
import { ColonyExtensionsV8 } from './extensionsV8';
17+
import { ColonyExtensionsV9 } from './extensionsV9';
18+
import { ColonyExtensionsV10 } from './extensionsV10';
19+
import { ColonyExtensionsV11 } from './extensionsV11';
20+
import {
21+
addExtensions as addExtensionsV12,
22+
ColonyExtensionsV12,
23+
ExtendedEstimateV12,
24+
} from './extensionsV12';
25+
26+
type ValidColony = IColonyV13;
27+
28+
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
29+
// @ts-ignore
30+
type PreviousVersionsExtensions = ExtendedIColony<ValidColony> &
31+
ColonyExtensionsV3<IColonyV6> &
32+
ColonyExtensionsV4<IColonyV6> &
33+
ColonyExtensionsV5<IColonyV6> &
34+
ColonyExtensionsV6<IColonyV6> &
35+
ColonyExtensionsV7<IColonyV7> &
36+
ColonyExtensionsV8<IColonyV8> &
37+
ColonyExtensionsV9<IColonyV9> &
38+
ColonyExtensionsV10<IColonyV10> &
39+
ColonyExtensionsV11<IColonyV11> &
40+
ColonyExtensionsV12<PreviousIColony>;
41+
42+
/*
43+
* Estimates
44+
*/
45+
export type ExtendedEstimateV13 = ExtendedEstimateV12;
46+
47+
/*
48+
* Extension Methods
49+
*/
50+
export type ColonyExtensionsV13<
51+
T extends ValidColony
52+
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
53+
// @ts-ignore
54+
> = {} & PreviousVersionsExtensions;
55+
56+
/*
57+
* Bindings
58+
*/
59+
export const addExtensions = (
60+
instance: ExtendedIColony<ValidColony>,
61+
networkClient: ColonyNetworkClient,
62+
): ColonyExtensionsV12<ValidColony> => {
63+
// Add all extensions from v7, because these are also still valid
64+
const extendedInstance = addExtensionsV12(
65+
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
66+
// @ts-ignore
67+
instance as PreviousVersionsExtensions,
68+
networkClient,
69+
) as ColonyExtensionsV13<ValidColony>;
70+
return extendedInstance;
71+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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 { addEncodeInterfaces as addEncodeInterfacesV10 } from './encodeInterfacesV10';
7+
import { addEncodeInterfaces as addEncodeInterfacesV11 } from './encodeInterfacesV11';
8+
import {
9+
Interfaces as InterfacesV12,
10+
addEncodeInterfaces as addEncodeInterfacesV12,
11+
} from './encodeInterfacesV12';
12+
13+
type PreviousVersionsInterfaces = InterfacesV12;
14+
type ValidColony = IColonyV13;
15+
16+
export type Interfaces = {} & PreviousVersionsInterfaces;
17+
18+
export interface ColonyWithInterfacesV13 extends ValidColony {
19+
interface: Interface & {
20+
events: IColonyV13['interface']['events'];
21+
functions: IColonyV13['interface']['functions'] & Interfaces;
22+
};
23+
}
24+
25+
/*
26+
* Bindings
27+
*/
28+
export const addEncodeInterfaces = (
29+
colonyClient: ValidColony,
30+
): ColonyWithInterfacesV13 => {
31+
const {
32+
interface: { functions: v10functions },
33+
} = addEncodeInterfacesV10(colonyClient as IColonyV10);
34+
const {
35+
interface: { functions: v11functions },
36+
} = addEncodeInterfacesV11(colonyClient as IColonyV11);
37+
const {
38+
interface: { functions: v12functions },
39+
} = addEncodeInterfacesV12(colonyClient as IColonyV12);
40+
41+
/*
42+
* We're overwriting the original object in an effort to reduce
43+
* nesting
44+
*
45+
* Note: that this does not work the same for v9, but will function
46+
* this way going onward from version 10
47+
*/
48+
// eslint-disable-next-line no-param-reassign
49+
colonyClient.interface.functions = {
50+
...colonyClient.interface.functions,
51+
...v12functions,
52+
...v11functions,
53+
...v10functions,
54+
};
55+
56+
return colonyClient as ColonyWithInterfacesV13;
57+
};

src/clients/ColonyNetworkClient.ts

+9
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import getColonyClientV9 from './Colony/ColonyClientV9';
3232
import getColonyClientV10 from './Colony/ColonyClientV10';
3333
import getColonyClientV11 from './Colony/ColonyClientV11';
3434
import getColonyClientV12 from './Colony/ColonyClientV12';
35+
import getColonyClientV13 from './Colony/ColonyClientV13';
3536
import getTokenClient from './TokenClient';
3637
import getTokenLockingClient, {
3738
TokenLockingClient,
@@ -284,6 +285,14 @@ const getColonyNetworkClient = (
284285
);
285286
break;
286287
}
288+
case ColonyVersion.GreenLightweightSpaceshipFour: {
289+
colonyClient = getColonyClientV13.call(
290+
networkClient,
291+
colonyAddress,
292+
signerOrProvider,
293+
);
294+
break;
295+
}
287296
default: {
288297
throw new Error('Colony version not supported');
289298
}

0 commit comments

Comments
 (0)