@enzymefinance/testutils 4.0.0-next.0 → 4.0.0-next.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/dist/declarations/src/assertions.d.ts +4 -4
- package/dist/declarations/src/deployment.d.ts +181 -82
- package/dist/declarations/src/gasRelayer.d.ts +56 -54
- package/dist/declarations/src/helpers.d.ts +16 -15
- package/dist/declarations/src/index.d.ts +6 -6
- package/dist/declarations/src/scaffolding/assets.d.ts +10 -10
- package/dist/declarations/src/scaffolding/chainlink.d.ts +3 -3
- package/dist/declarations/src/scaffolding/common.d.ts +7 -7
- package/dist/declarations/src/scaffolding/core.d.ts +17 -16
- package/dist/declarations/src/scaffolding/extensions/common.d.ts +11 -11
- package/dist/declarations/src/scaffolding/extensions/external-positions/actions.d.ts +35 -0
- package/dist/declarations/src/scaffolding/extensions/external-positions/compound.d.ts +56 -59
- package/dist/declarations/src/scaffolding/extensions/external-positions/index.d.ts +4 -2
- package/dist/declarations/src/scaffolding/extensions/external-positions/mocks.d.ts +53 -20
- package/dist/declarations/src/scaffolding/extensions/external-positions/uniswap-v3-liquidity.d.ts +99 -0
- package/dist/declarations/src/scaffolding/extensions/fees.d.ts +12 -12
- package/dist/declarations/src/scaffolding/extensions/index.d.ts +5 -5
- package/dist/declarations/src/scaffolding/extensions/integrations/aave.d.ts +20 -19
- package/dist/declarations/src/scaffolding/extensions/integrations/compound.d.ts +28 -28
- package/dist/declarations/src/scaffolding/extensions/integrations/curve.d.ts +272 -271
- package/dist/declarations/src/scaffolding/extensions/integrations/idle.d.ts +28 -28
- package/dist/declarations/src/scaffolding/extensions/integrations/index.d.ts +14 -12
- package/dist/declarations/src/scaffolding/extensions/integrations/mock.d.ts +32 -32
- package/dist/declarations/src/scaffolding/extensions/integrations/paraSwapV4.d.ts +23 -22
- package/dist/declarations/src/scaffolding/extensions/integrations/paraSwapV5.d.ts +23 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/poolTogetherV4.d.ts +29 -0
- package/dist/declarations/src/scaffolding/extensions/integrations/synthetix.d.ts +33 -25
- package/dist/declarations/src/scaffolding/extensions/integrations/trackedAssets.d.ts +15 -15
- package/dist/declarations/src/scaffolding/extensions/integrations/uniswapV2.d.ts +46 -46
- package/dist/declarations/src/scaffolding/extensions/integrations/uniswapV3.d.ts +15 -15
- package/dist/declarations/src/scaffolding/extensions/integrations/yearn.d.ts +22 -22
- package/dist/declarations/src/scaffolding/extensions/integrations/zeroExV2.d.ts +12 -12
- package/dist/declarations/src/scaffolding/extensions/policies.d.ts +17 -17
- package/dist/declarations/src/scaffolding/index.d.ts +8 -8
- package/dist/declarations/src/scaffolding/setup.d.ts +77 -75
- package/dist/declarations/src/scaffolding/shares.d.ts +35 -35
- package/dist/declarations/src/scaffolding/vaultCalls.d.ts +32 -17
- package/dist/declarations/src/whales.d.ts +42 -44
- package/dist/enzymefinance-testutils.browser.cjs.js +1470 -697
- package/dist/enzymefinance-testutils.browser.esm.js +1257 -508
- package/dist/enzymefinance-testutils.cjs.dev.js +1470 -697
- package/dist/enzymefinance-testutils.cjs.prod.js +1470 -697
- package/dist/enzymefinance-testutils.esm.js +1257 -508
- package/package.json +6 -6
- package/src/assertions.ts +5 -2
- package/src/deployment.ts +202 -99
- package/src/gasRelayer.ts +17 -18
- package/src/helpers.ts +6 -4
- package/src/scaffolding/assets.ts +6 -5
- package/src/scaffolding/chainlink.ts +2 -2
- package/src/scaffolding/common.ts +1 -1
- package/src/scaffolding/core.ts +28 -12
- package/src/scaffolding/extensions/common.ts +4 -4
- package/src/scaffolding/extensions/external-positions/actions.ts +103 -0
- package/src/scaffolding/extensions/external-positions/compound.ts +69 -114
- package/src/scaffolding/extensions/external-positions/index.ts +2 -0
- package/src/scaffolding/extensions/external-positions/mocks.ts +132 -10
- package/src/scaffolding/extensions/external-positions/uniswap-v3-liquidity.ts +290 -0
- package/src/scaffolding/extensions/fees.ts +1 -1
- package/src/scaffolding/extensions/integrations/aave.ts +6 -8
- package/src/scaffolding/extensions/integrations/compound.ts +10 -11
- package/src/scaffolding/extensions/integrations/curve.ts +72 -68
- package/src/scaffolding/extensions/integrations/idle.ts +9 -11
- package/src/scaffolding/extensions/integrations/index.ts +2 -0
- package/src/scaffolding/extensions/integrations/mock.ts +11 -13
- package/src/scaffolding/extensions/integrations/paraSwapV4.ts +16 -11
- package/src/scaffolding/extensions/integrations/paraSwapV5.ts +73 -0
- package/src/scaffolding/extensions/integrations/poolTogetherV4.ts +117 -0
- package/src/scaffolding/extensions/integrations/synthetix.ts +45 -12
- package/src/scaffolding/extensions/integrations/trackedAssets.ts +3 -4
- package/src/scaffolding/extensions/integrations/uniswapV2.ts +31 -27
- package/src/scaffolding/extensions/integrations/uniswapV3.ts +9 -10
- package/src/scaffolding/extensions/integrations/yearn.ts +9 -11
- package/src/scaffolding/extensions/integrations/zeroExV2.ts +9 -7
- package/src/scaffolding/extensions/policies.ts +2 -1
- package/src/scaffolding/setup.ts +27 -19
- package/src/scaffolding/shares.ts +5 -4
- package/src/scaffolding/vaultCalls.ts +50 -3
- package/src/whales.ts +26 -17
- package/tsconfig.json +2 -1
package/src/scaffolding/setup.ts
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
import { AddressLike
|
|
2
|
-
import {
|
|
1
|
+
import type { AddressLike } from '@enzymefinance/ethers';
|
|
2
|
+
import { randomAddress } from '@enzymefinance/ethers';
|
|
3
|
+
import type { SignerWithAddress } from '@enzymefinance/hardhat';
|
|
4
|
+
import type { FundDeployer, StandardToken } from '@enzymefinance/protocol';
|
|
3
5
|
import {
|
|
4
6
|
ComptrollerLib,
|
|
5
7
|
ComptrollerProxy,
|
|
6
8
|
encodeFunctionData,
|
|
7
|
-
FundDeployer,
|
|
8
9
|
GasRelayPaymasterLib,
|
|
9
|
-
StandardToken,
|
|
10
10
|
VaultLib,
|
|
11
11
|
VaultProxy,
|
|
12
12
|
} from '@enzymefinance/protocol';
|
|
13
|
-
import {
|
|
13
|
+
import type { BigNumberish, BytesLike } from 'ethers';
|
|
14
|
+
import { BigNumber, utils } from 'ethers';
|
|
15
|
+
|
|
14
16
|
import { assertEvent } from '../assertions';
|
|
15
|
-
import {
|
|
17
|
+
import type { BuySharesParams } from './shares';
|
|
18
|
+
import { buyShares } from './shares';
|
|
16
19
|
|
|
17
20
|
export type InitialInvestmentParams = Omit<BuySharesParams, 'comptrollerProxy' | 'denominationAsset'>;
|
|
18
21
|
|
|
@@ -34,6 +37,7 @@ export interface CreateNewFundParams {
|
|
|
34
37
|
sharesActionTimelock?: BigNumberish;
|
|
35
38
|
fundOwner?: AddressLike;
|
|
36
39
|
fundName?: string;
|
|
40
|
+
fundSymbol?: string;
|
|
37
41
|
feeManagerConfig?: BytesLike;
|
|
38
42
|
policyManagerConfig?: BytesLike;
|
|
39
43
|
investment?: InitialInvestmentParams;
|
|
@@ -66,6 +70,7 @@ export async function createComptrollerProxy({
|
|
|
66
70
|
|
|
67
71
|
return {
|
|
68
72
|
comptrollerProxy: new ComptrollerLib(comptrollerProxyContract, signer),
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
69
74
|
receipt: comptrollerProxyContract.deployment!,
|
|
70
75
|
};
|
|
71
76
|
}
|
|
@@ -92,17 +97,15 @@ export async function createMigrationRequest({
|
|
|
92
97
|
);
|
|
93
98
|
|
|
94
99
|
const comptrollerDeployedArgs = assertEvent(receipt, 'ComptrollerProxyDeployed', {
|
|
95
|
-
creator: signer,
|
|
96
100
|
comptrollerProxy: expect.any(String) as string,
|
|
101
|
+
creator: signer,
|
|
97
102
|
denominationAsset,
|
|
98
103
|
sharesActionTimelock: BigNumber.from(sharesActionTimelock),
|
|
99
|
-
feeManagerConfigData: utils.hexlify(feeManagerConfigData),
|
|
100
|
-
policyManagerConfigData: utils.hexlify(policyManagerConfigData),
|
|
101
104
|
});
|
|
102
105
|
|
|
103
106
|
return {
|
|
104
|
-
receipt,
|
|
105
107
|
comptrollerProxy: new ComptrollerLib(comptrollerDeployedArgs.comptrollerProxy, signer),
|
|
108
|
+
receipt,
|
|
106
109
|
};
|
|
107
110
|
}
|
|
108
111
|
|
|
@@ -114,29 +117,36 @@ export async function createNewFund({
|
|
|
114
117
|
sharesActionTimelock = 0,
|
|
115
118
|
fundOwner = randomAddress(),
|
|
116
119
|
fundName = 'My Fund',
|
|
120
|
+
fundSymbol = '',
|
|
117
121
|
feeManagerConfig = '0x',
|
|
118
122
|
policyManagerConfig = '0x',
|
|
119
123
|
investment,
|
|
120
124
|
}: CreateNewFundParams) {
|
|
121
125
|
const receipt = await fundDeployer
|
|
122
126
|
.connect(signer)
|
|
123
|
-
.createNewFund(
|
|
127
|
+
.createNewFund(
|
|
128
|
+
fundOwner,
|
|
129
|
+
fundName,
|
|
130
|
+
fundSymbol,
|
|
131
|
+
denominationAsset,
|
|
132
|
+
sharesActionTimelock,
|
|
133
|
+
feeManagerConfig,
|
|
134
|
+
policyManagerConfig,
|
|
135
|
+
);
|
|
124
136
|
|
|
125
137
|
const comptrollerDeployedArgs = assertEvent(receipt, 'ComptrollerProxyDeployed', {
|
|
126
|
-
creator: signer,
|
|
127
138
|
comptrollerProxy: expect.any(String) as string,
|
|
139
|
+
creator: signer,
|
|
128
140
|
denominationAsset,
|
|
129
141
|
sharesActionTimelock: BigNumber.from(sharesActionTimelock),
|
|
130
|
-
feeManagerConfigData: utils.hexlify(feeManagerConfig),
|
|
131
|
-
policyManagerConfigData: utils.hexlify(policyManagerConfig),
|
|
132
142
|
});
|
|
133
143
|
|
|
134
144
|
const comptrollerProxy = new ComptrollerLib(comptrollerDeployedArgs.comptrollerProxy, signer);
|
|
135
145
|
|
|
136
146
|
const newFundDeployedArgs = assertEvent(receipt, 'NewFundCreated', {
|
|
147
|
+
comptrollerProxy,
|
|
137
148
|
creator: signer,
|
|
138
149
|
vaultProxy: expect.any(String) as string,
|
|
139
|
-
comptrollerProxy,
|
|
140
150
|
});
|
|
141
151
|
|
|
142
152
|
const vaultProxy = new VaultLib(newFundDeployedArgs.vaultProxy, signer);
|
|
@@ -176,17 +186,15 @@ export async function createReconfigurationRequest({
|
|
|
176
186
|
);
|
|
177
187
|
|
|
178
188
|
const comptrollerDeployedArgs = assertEvent(receipt, 'ComptrollerProxyDeployed', {
|
|
179
|
-
creator: signer,
|
|
180
189
|
comptrollerProxy: expect.any(String) as string,
|
|
190
|
+
creator: signer,
|
|
181
191
|
denominationAsset,
|
|
182
192
|
sharesActionTimelock: BigNumber.from(sharesActionTimelock),
|
|
183
|
-
feeManagerConfigData: utils.hexlify(feeManagerConfigData),
|
|
184
|
-
policyManagerConfigData: utils.hexlify(policyManagerConfigData),
|
|
185
193
|
});
|
|
186
194
|
|
|
187
195
|
return {
|
|
188
|
-
receipt,
|
|
189
196
|
comptrollerProxy: new ComptrollerLib(comptrollerDeployedArgs.comptrollerProxy, signer),
|
|
197
|
+
receipt,
|
|
190
198
|
};
|
|
191
199
|
}
|
|
192
200
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { AddressLike } from '@enzymefinance/ethers';
|
|
2
|
-
import { SignerWithAddress } from '@enzymefinance/hardhat';
|
|
3
|
-
import { ComptrollerLib, StandardToken } from '@enzymefinance/protocol';
|
|
4
|
-
import { BigNumberish
|
|
1
|
+
import type { AddressLike } from '@enzymefinance/ethers';
|
|
2
|
+
import type { SignerWithAddress } from '@enzymefinance/hardhat';
|
|
3
|
+
import type { ComptrollerLib, StandardToken } from '@enzymefinance/protocol';
|
|
4
|
+
import type { BigNumberish } from 'ethers';
|
|
5
|
+
import { constants, utils } from 'ethers';
|
|
5
6
|
|
|
6
7
|
export interface BuySharesParams {
|
|
7
8
|
comptrollerProxy: ComptrollerLib;
|
|
@@ -1,12 +1,43 @@
|
|
|
1
|
-
import { AddressLike } from '@enzymefinance/ethers';
|
|
1
|
+
import type { AddressLike } from '@enzymefinance/ethers';
|
|
2
|
+
import type { SignerWithAddress } from '@enzymefinance/hardhat';
|
|
3
|
+
import type { AddressListRegistry, AddressListUpdateType, ComptrollerLib } from '@enzymefinance/protocol';
|
|
2
4
|
import {
|
|
3
|
-
|
|
5
|
+
addressListRegistryCreateListSelector,
|
|
4
6
|
curveMinterMintManySelector,
|
|
5
7
|
curveMinterMintSelector,
|
|
6
8
|
curveMinterToggleApproveMintSelector,
|
|
7
9
|
encodeArgs,
|
|
10
|
+
sighash,
|
|
8
11
|
} from '@enzymefinance/protocol';
|
|
9
|
-
import { constants } from 'ethers';
|
|
12
|
+
import { constants, utils } from 'ethers';
|
|
13
|
+
|
|
14
|
+
export async function vaultCallCreateNewList({
|
|
15
|
+
addressListRegistry,
|
|
16
|
+
comptrollerProxy,
|
|
17
|
+
items,
|
|
18
|
+
owner,
|
|
19
|
+
signer,
|
|
20
|
+
updateType,
|
|
21
|
+
}: {
|
|
22
|
+
addressListRegistry: AddressListRegistry;
|
|
23
|
+
comptrollerProxy: ComptrollerLib;
|
|
24
|
+
items: AddressLike[];
|
|
25
|
+
owner: AddressLike;
|
|
26
|
+
signer: SignerWithAddress;
|
|
27
|
+
updateType: AddressListUpdateType;
|
|
28
|
+
}) {
|
|
29
|
+
await comptrollerProxy
|
|
30
|
+
.connect(signer)
|
|
31
|
+
.vaultCallOnContract(
|
|
32
|
+
addressListRegistry.address,
|
|
33
|
+
addressListRegistryCreateListSelector,
|
|
34
|
+
encodeArgs(['address', 'uint8', 'address[]'], [owner, updateType, items]),
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const listCount = await addressListRegistry.getListCount();
|
|
38
|
+
|
|
39
|
+
return listCount.sub(1);
|
|
40
|
+
}
|
|
10
41
|
|
|
11
42
|
export function vaultCallCurveMinterMint({
|
|
12
43
|
comptrollerProxy,
|
|
@@ -56,3 +87,19 @@ export function vaultCallCurveMinterToggleApproveMint({
|
|
|
56
87
|
encodeArgs(['address'], [account]),
|
|
57
88
|
);
|
|
58
89
|
}
|
|
90
|
+
|
|
91
|
+
export function vaultCallStartAssetBypassTimelock({
|
|
92
|
+
comptrollerProxy,
|
|
93
|
+
contract,
|
|
94
|
+
asset,
|
|
95
|
+
}: {
|
|
96
|
+
comptrollerProxy: ComptrollerLib;
|
|
97
|
+
contract: AddressLike;
|
|
98
|
+
asset: AddressLike;
|
|
99
|
+
}) {
|
|
100
|
+
return comptrollerProxy.vaultCallOnContract(
|
|
101
|
+
contract,
|
|
102
|
+
sighash(utils.FunctionFragment.fromString('startAssetBypassTimelock(address)')),
|
|
103
|
+
encodeArgs(['address'], [asset]),
|
|
104
|
+
);
|
|
105
|
+
}
|
package/src/whales.ts
CHANGED
|
@@ -1,43 +1,49 @@
|
|
|
1
1
|
import { resolveAddress } from '@enzymefinance/ethers';
|
|
2
|
-
import { SignerWithAddress } from '@enzymefinance/hardhat';
|
|
2
|
+
import type { SignerWithAddress } from '@enzymefinance/hardhat';
|
|
3
3
|
|
|
4
|
+
/* eslint-disable sort-keys-fix/sort-keys-fix */
|
|
4
5
|
const whales = {
|
|
5
|
-
|
|
6
|
-
adai: '0x62e41b1185023bcc14a465d350e1dde341557925',
|
|
7
|
-
ausdc: '0x3DdfA8eC3052539b6C9549F12cEA2C295cfF5296',
|
|
6
|
+
// primitives
|
|
8
7
|
bat: '0x12274c71304bc0e6b38a56b94d2949b118feb838',
|
|
9
8
|
bnb: '0xbe0eb53f46cd790cd13851d5eff43d12404d33e8',
|
|
10
|
-
bnt: '
|
|
11
|
-
|
|
9
|
+
bnt: '0x7d1ed1601a12a172269436fa95fe156650603c1d',
|
|
10
|
+
busd: '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503',
|
|
11
|
+
comp: '0x0f50d31b3eaefd65236dd3736b863cffa4c63c4e',
|
|
12
12
|
crv: '0x4ce799e6eD8D64536b67dD428565d52A531B3640',
|
|
13
|
-
dai: '
|
|
14
|
-
knc: '
|
|
15
|
-
ldo: '0x3dba737ccc50a32a1764b493285dd51c8af6c278',
|
|
13
|
+
dai: '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503',
|
|
14
|
+
knc: '0x09d51654bd9efbfcb56da3491989cc1444095fff',
|
|
16
15
|
link: '0xbe6977e08d4479c0a6777539ae0e8fa27be4e9d6',
|
|
17
16
|
mana: '0xefb94ac00f1cee8a89d5c3f49faa799da6f03024',
|
|
18
17
|
mln: '0xd8f8a53945bcfbbc19da162aa405e662ef71c40d',
|
|
19
18
|
rep: '0xc6a043b07d33b6f30d8cb501026c391cfd25abe1',
|
|
20
19
|
ren: '0xbe0eb53f46cd790cd13851d5eff43d12404d33e8',
|
|
20
|
+
susd: '0xa5f7a39e55d7878bc5bd754ee5d6bd7a7662355b',
|
|
21
21
|
uni: '0x47173b170c64d16393a52e6c480b3ad8c302ba1e',
|
|
22
22
|
usdc: '0xae2d4617c862309a3d75a0ffb358c7a5009c673f',
|
|
23
23
|
usdt: '0x5041ed759dd4afc3a72b8192c143f72f4724081a',
|
|
24
24
|
weth: '0xe08A8b19e5722a201EaF20A6BC595eF655397bd5',
|
|
25
25
|
zrx: '0x206376e8940e42538781cd94ef024df3c1e0fd43',
|
|
26
|
-
|
|
26
|
+
// aTokens
|
|
27
|
+
ausdc: '0x3DdfA8eC3052539b6C9549F12cEA2C295cfF5296',
|
|
28
|
+
// cTokens
|
|
27
29
|
ccomp: '0xd74f186194ab9219fafac5c2fe4b3270169666db',
|
|
28
|
-
cdai: '
|
|
30
|
+
cdai: '0xab4ce310054a11328685ece1043211b68ba5d082',
|
|
29
31
|
ceth: '0x8aceab8167c80cb8b3de7fa6228b889bb1130ee8',
|
|
30
|
-
|
|
31
|
-
cuni: '0x8889ff5b6323e71c28c26d2c34b8bb52654f00a6',
|
|
32
|
+
cuni: '0x39d8014b4f40d2cbc441137011d32023f4f1fd87',
|
|
32
33
|
cusdc: '0xb3bd459e0598dde1fe84b1d0a1430be175b5d5be',
|
|
33
|
-
|
|
34
|
+
// ptTokens
|
|
35
|
+
ptUsdc: '0xd18236cd213f39d078177b6f6908f0e44e88e4aa',
|
|
36
|
+
// synths
|
|
34
37
|
seth: '0xc34a7c65aa08cb36744bda8eeec7b8e9891e147c',
|
|
35
|
-
seur: '
|
|
36
|
-
|
|
38
|
+
seur: '0xc3f2f91723b16b95bef0619b2504c049075d5b0b',
|
|
39
|
+
sxag: '0x40d68c490bf7262ec40048099aec23535f734be2',
|
|
40
|
+
sxau: '0x92eb453b7b5b8d41edb44e2c8b8b53eb70a482c7',
|
|
41
|
+
// misc
|
|
37
42
|
lidoSteth: '0x31f644e2dd5d74f5c8d6d9de89dd517474d51800',
|
|
43
|
+
ldo: '0x3dba737ccc50a32a1764b493285dd51c8af6c278',
|
|
38
44
|
eurs: '0x98ed26de6451db36246672df78ae7c50f2c76f6d',
|
|
39
|
-
idle: '0x34aaa3d5a73d6f9594326d0422ce69748f09b14f',
|
|
40
45
|
} as const;
|
|
46
|
+
/* eslint-enable sort-keys-fix/sort-keys-fix */
|
|
41
47
|
|
|
42
48
|
export type Whale = keyof typeof whales;
|
|
43
49
|
export type WhaleSigners<T extends Partial<Whale> = Whale> = Record<T, SignerWithAddress>;
|
|
@@ -45,12 +51,14 @@ export type WhaleSigners<T extends Partial<Whale> = Whale> = Record<T, SignerWit
|
|
|
45
51
|
export async function unlockWhale(token: Whale) {
|
|
46
52
|
const address = resolveAddress(whales[token]);
|
|
47
53
|
await provider.send('hardhat_impersonateAccount', [address]);
|
|
54
|
+
|
|
48
55
|
return provider.getSignerWithAddress(address);
|
|
49
56
|
}
|
|
50
57
|
|
|
51
58
|
export async function unlockAllWhales() {
|
|
52
59
|
const keys = Object.keys(whales) as Whale[];
|
|
53
60
|
const signers = await Promise.all(keys.map(async (token) => unlockWhale(token)));
|
|
61
|
+
|
|
54
62
|
return keys.reduce((carry, key, index) => {
|
|
55
63
|
return { ...carry, [key]: signers[index] };
|
|
56
64
|
}, {} as WhaleSigners);
|
|
@@ -58,6 +66,7 @@ export async function unlockAllWhales() {
|
|
|
58
66
|
|
|
59
67
|
export async function unlockWhales<T extends Whale>(...tokens: T[]) {
|
|
60
68
|
const signers = await Promise.all(tokens.map(async (token) => unlockWhale(token)));
|
|
69
|
+
|
|
61
70
|
return tokens.reduce((carry, key, index) => {
|
|
62
71
|
return { ...carry, [key]: signers[index] };
|
|
63
72
|
}, {} as WhaleSigners<T>);
|
package/tsconfig.json
CHANGED