Skip to content

Commit 42b3044

Browse files
authored
Merge pull request #538 from JoinColony/maint/support-v11-colony-client
Add support for Colony V12 (for the v4.x.x branch)
2 parents a849fe7 + b3a3506 commit 42b3044

Some content is hidden

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

59 files changed

+79223
-6123
lines changed

package-lock.json

+1-1
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.1",
3+
"version": "v4.2.2-rc.3",
44
"main": "lib/index.js",
55
"module": "lib-esm/index.js",
66
"files": [

src/clients/Colony/ColonyClientV11.ts

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

src/clients/Colony/ColonyClientV12.ts

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

src/clients/Colony/extensions/commonExtensions.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import { IColony as IColonyV7 } from '../../../contracts/colony/7/IColony';
2222
import { IColony as IColonyV8 } from '../../../contracts/colony/8/IColony';
2323
import { IColony as IColonyV9 } from '../../../contracts/colony/9/IColony';
2424
import { IColony as IColonyV10 } from '../../../contracts/colony/10/IColony';
25+
import { IColony as IColonyV11 } from '../../../contracts/colony/11/IColony';
26+
import { IColony as IColonyV12 } from '../../../contracts/colony/12/IColony';
2527
import { TransactionOverrides } from '../../../contracts/6';
2628
import { IColonyFactory } from '../../../contracts/4/IColonyFactory';
2729

@@ -49,7 +51,9 @@ type AnyIColony =
4951
| IColonyV7
5052
| IColonyV8
5153
| IColonyV9
52-
| IColonyV10;
54+
| IColonyV10
55+
| IColonyV11
56+
| IColonyV12;
5357

5458
// This is exposed to type the awkward recovery event client which is basically
5559
// just an IColonyV4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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 PreviousIColony } from '../../../contracts/colony/10/IColony';
6+
import { IColony as IColonyV11 } from '../../../contracts/colony/11/IColony';
7+
import { ColonyNetworkClient } from '../../ColonyNetworkClient';
8+
import { ExtendedIColony } from './commonExtensions';
9+
import { ColonyExtensionsV3 } from './extensionsV3';
10+
import { ColonyExtensionsV4 } from './extensionsV4';
11+
import { ColonyExtensionsV5 } from './extensionsV5';
12+
import { ColonyExtensionsV6 } from './extensionsV6';
13+
import { ColonyExtensionsV7 } from './extensionsV7';
14+
import { ColonyExtensionsV8 } from './extensionsV8';
15+
import { ColonyExtensionsV9 } from './extensionsV9';
16+
import {
17+
addExtensions as addExtensionsV10,
18+
ColonyExtensionsV10,
19+
ExtendedEstimateV10,
20+
} from './extensionsV10';
21+
22+
type ValidColony = IColonyV11;
23+
24+
type PreviousVersionsExtensions = ExtendedIColony<ValidColony> &
25+
ColonyExtensionsV3<IColonyV6> &
26+
ColonyExtensionsV4<IColonyV6> &
27+
ColonyExtensionsV5<IColonyV6> &
28+
ColonyExtensionsV6<IColonyV6> &
29+
ColonyExtensionsV7<IColonyV7> &
30+
ColonyExtensionsV8<IColonyV8> &
31+
ColonyExtensionsV9<IColonyV9> &
32+
ColonyExtensionsV10<PreviousIColony>;
33+
34+
/*
35+
* Estimates
36+
*/
37+
export type ExtendedEstimateV11 = ExtendedEstimateV10;
38+
39+
/*
40+
* Extension Methods
41+
*/
42+
export type ColonyExtensionsV11<
43+
T extends ValidColony
44+
> = {} & PreviousVersionsExtensions;
45+
46+
/*
47+
* Bindings
48+
*/
49+
export const addExtensions = (
50+
instance: ExtendedIColony<ValidColony>,
51+
networkClient: ColonyNetworkClient,
52+
): ColonyExtensionsV11<ValidColony> => {
53+
// Add all extensions from v7, because these are also still valid
54+
const extendedInstance = addExtensionsV10(
55+
instance as PreviousVersionsExtensions,
56+
networkClient,
57+
) as ColonyExtensionsV11<ValidColony>;
58+
return extendedInstance;
59+
};

0 commit comments

Comments
 (0)