Skip to content

Commit 260d214

Browse files
committedMay 21, 2022
fixes
1 parent 1a14330 commit 260d214

12 files changed

+619
-276
lines changed
 

‎.github/workflows/test.yml

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
name: Unit tests + coverage
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
- release-*
8+
pull_request: { }
9+
workflow_dispatch: { }
10+
11+
jobs:
12+
13+
coverage:
14+
runs-on: ubuntu-latest
15+
steps:
16+
- uses: actions/checkout@v2
17+
with:
18+
fetch-depth: 2
19+
- uses: actions/setup-node@v2
20+
with:
21+
node-version: 14.x
22+
- uses: actions/cache@v2
23+
id: cache
24+
with:
25+
path: '**/node_modules'
26+
key: npm-v2-${{ hashFiles('**/package-lock.json') }}
27+
restore-keys: npm-v2-
28+
- run: npm ci
29+
if: steps.cache.outputs.cache-hit != 'true'
30+
- run: npm run coverage
31+
env:
32+
NODE_OPTIONS: --max_old_space_size=4096
33+
TETU_ETH_RPC_URL: ${{secrets.TETU_ETH_RPC_URL}}
34+
TETU_HARDHAT_CHAIN_ID: ${{secrets.TETU_HARDHAT_CHAIN_ID}}
35+
- uses: codecov/codecov-action@v2

‎README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# <img src="tetu_contracts.svg" alt="Tetu.io">
22

3-
[![codecov](https://codecov.io/gh/tetu-io/tetu-strategies-matic/branch/master/graph/badge.svg?token=FJ38EG24U7)](https://codecov.io/gh/tetu-io/tetu-strategies-matic)
3+
[![codecov](https://codecov.io/gh/tetu-io/tetu-strategies-ethereum/branch/master/graph/badge.svg?token=WlCryAlpoR)](https://codecov.io/gh/tetu-io/tetu-strategies-ethereum)
44

55
## Links
66

‎contracts/test/PriceCalculator.sol

+474
Large diffs are not rendered by default.
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
// This program is free software: you can redistribute it and/or modify
3+
// it under the terms of the GNU General Public License as published by
4+
// the Free Software Foundation, either version 3 of the License, or
5+
// (at your option) any later version.
6+
7+
// This program is distributed in the hope that it will be useful,
8+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
9+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10+
// GNU General Public License for more details.
11+
12+
// You should have received a copy of the GNU General Public License
13+
// along with this program. If not, see <http://www.gnu.org/licenses/>.
14+
15+
pragma solidity 0.8.4;
16+
17+
import "../third_party/balancer/ISmartWalletChecker.sol";
18+
19+
contract SmartWalletCheckerStub is ISmartWalletChecker {
20+
21+
function check(address) external pure override returns (bool) {
22+
return true;
23+
}
24+
}

‎scripts/addresses/EthAddresses.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export class EthAddresses {
1313
public static DAI_TOKEN = "0x6b175474e89094c44da98b954eedeac495271d0f".toLowerCase();
1414
public static USDT_TOKEN = "0xdac17f958d2ee523a2206206994597c13d831ec7".toLowerCase();
1515
public static WBTC_TOKEN = "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599".toLowerCase();
16-
public static TETU_TOKEN = "0xa0246c9032bc3a600820415ae600c6388619a14d".toLowerCase(); // todo temporally FARM
16+
public static TETU_TOKEN = "0x4f851750a3e6f80f1E1f89C67B56960Bfc29A934".toLowerCase();
1717
public static veBAL_TOKEN = "0xC128a9954e6c874eA3d62ce62B468bA073093F25".toLowerCase();
1818

1919

‎scripts/deploy/DeployerUtilsLocal.ts

+51-5
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,17 @@ import {
2626
IRewardToken__factory,
2727
ISmartVault,
2828
ISmartVault__factory,
29-
IStrategy, IStrategy__factory,
29+
IStrategy,
3030
IStrategySplitter,
3131
IStrategySplitter__factory,
3232
IVaultController,
3333
IVaultController__factory,
34+
NoopStrategy, PriceCalculator,
3435
TetuProxyControlled,
3536
TetuProxyControlled__factory,
3637
} from "../../typechain";
3738
import {EthAddresses} from "../addresses/EthAddresses";
39+
import {expect} from "chai";
3840

3941
// tslint:disable-next-line:no-var-requires
4042
const hre = require("hardhat");
@@ -480,9 +482,23 @@ export class DeployerUtilsLocal {
480482
throw Error('No config for ' + net.chainId);
481483
}
482484

483-
const ps = ISmartVault__factory.connect(core.psVault, signer);
484-
// const str = await ps.strategy();
485-
const str = Misc.ZERO_ADDRESS; // todo
485+
let psAdr = core.psVault;
486+
487+
if (psAdr === Misc.ZERO_ADDRESS) {
488+
const [vaultLogic, psVault, strategy] = await DeployerUtilsLocal.deployDefaultNoopStrategyAndVault(
489+
signer,
490+
IController__factory.connect(core.controller, signer),
491+
IVaultController__factory.connect(core.vaultController, signer),
492+
core.rewardToken,
493+
Misc.ZERO_ADDRESS
494+
);
495+
await RunHelper.runAndWait(() => IController__factory.connect(core.controller, signer)
496+
.setPsVault(psVault.address));
497+
psAdr = psVault.address;
498+
}
499+
500+
const ps = ISmartVault__factory.connect(psAdr, signer);
501+
const str = await ps.strategy();
486502
return new CoreContractsWrapper(
487503
IController__factory.connect(core.controller, signer),
488504
'',
@@ -506,15 +522,45 @@ export class DeployerUtilsLocal {
506522

507523
}
508524

525+
public static async deployPriceCalculatorEthereum(signer: SignerWithAddress, controller: string, wait = false): Promise<[PriceCalculator, TetuProxyControlled, PriceCalculator]> {
526+
const logic = await DeployerUtilsLocal.deployContract(signer, "PriceCalculator") as PriceCalculator;
527+
const proxy = await DeployerUtilsLocal.deployContract(signer, "TetuProxyControlled", logic.address) as TetuProxyControlled;
528+
const calculator = logic.attach(proxy.address) as PriceCalculator;
529+
await calculator.initialize(controller);
530+
531+
await RunHelper.runAndWait(() => calculator.addKeyTokens([
532+
EthAddresses.USDC_TOKEN,
533+
EthAddresses.WETH_TOKEN,
534+
EthAddresses.DAI_TOKEN,
535+
EthAddresses.USDT_TOKEN,
536+
EthAddresses.WBTC_TOKEN,
537+
]), true, wait);
538+
539+
await RunHelper.runAndWait(() => calculator.setDefaultToken(EthAddresses.USDC_TOKEN), true, wait);
540+
await RunHelper.runAndWait(() => calculator.addSwapPlatform(EthAddresses.UNISWAP_FACTORY, "Uniswap V2"), true, wait);
541+
542+
expect(await calculator.keyTokensSize()).is.not.eq(0);
543+
return [calculator, proxy, logic];
544+
}
545+
509546
public static async getToolsAddressesWrapper(signer: SignerWithAddress): Promise<ToolsContractsWrapper> {
510547
const net = await ethers.provider.getNetwork();
511548
log.info('network ' + net.chainId);
512549
const tools = Addresses.TOOLS.get(net.chainId + '');
513550
if (!tools) {
514551
throw Error('No config for ' + net.chainId);
515552
}
553+
554+
let calc = tools.calculator;
555+
556+
if (calc === Misc.ZERO_ADDRESS) {
557+
const core = await Addresses.CORE.get(net.chainId + '');
558+
const calcCtr = (await DeployerUtilsLocal.deployPriceCalculatorEthereum(signer, core?.controller || ''))[0];
559+
calc = calcCtr.address;
560+
}
561+
516562
return new ToolsContractsWrapper(
517-
IPriceCalculator__factory.connect(tools.calculator, signer),
563+
IPriceCalculator__factory.connect(calc, signer),
518564
);
519565

520566
}

‎test/TokenUtils.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import {ethers} from "hardhat";
2-
import {ERC20__factory, IERC721Enumerable__factory, IWmatic, IWmatic__factory} from "../typechain";
3-
import {BigNumber, utils} from "ethers";
2+
import {
3+
ERC20__factory,
4+
IERC721Enumerable__factory,
5+
IRewardToken__factory,
6+
IWmatic__factory
7+
} from "../typechain";
8+
import {BigNumber} from "ethers";
49
import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers";
510
import chai from "chai";
611
import chaiAsPromised from "chai-as-promised";
@@ -95,13 +100,22 @@ export class TokenUtils {
95100

96101
public static async getToken(token: string, to: string, amount?: BigNumber) {
97102
const start = Date.now();
98-
console.log('transfer token from biggest holder', token, amount?.toString());
99103

100104
if (token.toLowerCase() === await DeployerUtilsLocal.getNetworkTokenAddress()) {
105+
console.log('mint weth');
101106
await IWmatic__factory.connect(token, await DeployerUtilsLocal.impersonate(to)).deposit({value: amount});
102107
return amount;
103108
}
104109

110+
if (token.toLowerCase() === EthAddresses.TETU_TOKEN) {
111+
console.log('mint tetu');
112+
const minter = await DeployerUtilsLocal.impersonate('0x765277EebeCA2e31912C9946eAe1021199B39C61');
113+
await IRewardToken__factory.connect(token, minter).mint(to, amount || parseUnits('100000000'));
114+
return amount;
115+
}
116+
117+
console.log('transfer token from biggest holder', token, amount?.toString());
118+
105119
const holder = TokenUtils.TOKEN_HOLDERS.get(token.toLowerCase()) as string;
106120
if (!holder) {
107121
throw new Error('Please add holder for ' + token);

‎test/UniswapUtils.ts

+1-71
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {TokenUtils} from "./TokenUtils";
1212
import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers";
1313
import {expect} from "chai";
1414
import {RunHelper} from "../scripts/utils/tools/RunHelper";
15-
import {MintHelperUtils} from "./MintHelperUtils";
1615
import {CoreContractsWrapper} from "./CoreContractsWrapper";
1716
import {DeployerUtilsLocal} from "../scripts/deploy/DeployerUtilsLocal";
1817
import {Misc} from "../scripts/utils/tools/Misc";
@@ -185,69 +184,6 @@ export class UniswapUtils {
185184
return [tokenStacked, oppositeToken, oppositeTokenStacked, price];
186185
}
187186

188-
public static async createPairForRewardToken(
189-
signer: SignerWithAddress,
190-
core: CoreContractsWrapper,
191-
amount: string
192-
) {
193-
const usdc = await DeployerUtilsLocal.getUSDCAddress();
194-
await TokenUtils.getToken(usdc, signer.address, utils.parseUnits(amount, 6))
195-
const rewardTokenAddress = core.rewardToken.address;
196-
197-
const usdcBal = await TokenUtils.balanceOf(usdc, signer.address);
198-
console.log('USDC bought', usdcBal.toString());
199-
expect(+utils.formatUnits(usdcBal, 6)).is.greaterThanOrEqual(+amount);
200-
201-
await MintHelperUtils.mint(core.controller, core.announcer, (+amount * 2).toString(), signer.address);
202-
203-
const tokenBal = await TokenUtils.balanceOf(rewardTokenAddress, signer.address);
204-
console.log('Token minted', tokenBal.toString());
205-
expect(+utils.formatUnits(tokenBal, 18)).is.greaterThanOrEqual(+amount);
206-
207-
const factory = await DeployerUtilsLocal.getDefaultNetworkFactory();
208-
const lp = await UniswapUtils.addLiquidity(
209-
signer,
210-
rewardTokenAddress,
211-
usdc,
212-
utils.parseUnits(amount, 18).toString(),
213-
utils.parseUnits(amount, 6).toString(),
214-
factory,
215-
await DeployerUtilsLocal.getRouterByFactory(factory)
216-
);
217-
await core.feeRewardForwarder.addLargestLps([core.rewardToken.address], [lp]);
218-
return lp;
219-
}
220-
221-
public static async createPairForRewardTokenWithBuy(
222-
signer: SignerWithAddress,
223-
core: CoreContractsWrapper,
224-
amount: string
225-
) {
226-
const usdc = await DeployerUtilsLocal.getUSDCAddress();
227-
await TokenUtils.getToken(usdc, signer.address, utils.parseUnits(amount, 6))
228-
const rewardTokenAddress = core.rewardToken.address;
229-
230-
const usdcBal = await TokenUtils.balanceOf(usdc, signer.address);
231-
console.log('USDC bought', usdcBal.toString());
232-
expect(+utils.formatUnits(usdcBal, 6)).is.greaterThanOrEqual(+amount);
233-
234-
await MintHelperUtils.mint(core.controller, core.announcer, amount, signer.address);
235-
236-
const tokenBal = await TokenUtils.balanceOf(rewardTokenAddress, signer.address);
237-
console.log('Token minted', tokenBal.toString());
238-
expect(+utils.formatUnits(tokenBal, 18)).is.greaterThanOrEqual(+amount);
239-
240-
return UniswapUtils.addLiquidity(
241-
signer,
242-
rewardTokenAddress,
243-
usdc,
244-
utils.parseUnits(amount, 18).toString(),
245-
utils.parseUnits(amount, 6).toString(),
246-
await DeployerUtilsLocal.getDefaultNetworkFactory(),
247-
await DeployerUtilsLocal.getRouterByFactory(await DeployerUtilsLocal.getDefaultNetworkFactory())
248-
);
249-
}
250-
251187
public static async createTetuUsdc(
252188
signer: SignerWithAddress,
253189
core: CoreContractsWrapper,
@@ -260,13 +196,7 @@ export class UniswapUtils {
260196
const usdcBal = await TokenUtils.balanceOf(usdc, signer.address);
261197
console.log('USDC bought', usdcBal.toString());
262198
expect(+utils.formatUnits(usdcBal, 6)).is.greaterThanOrEqual(+amount);
263-
264-
if (tetu === await DeployerUtilsLocal.getTETUAddress()) {
265-
await TokenUtils.getToken(tetu, signer.address, utils.parseUnits(amount));
266-
} else {
267-
await MintHelperUtils.mint(core.controller, core.announcer, amount, signer.address);
268-
}
269-
199+
await TokenUtils.getToken(tetu, signer.address, utils.parseUnits(amount));
270200

271201
const tokenBal = await TokenUtils.balanceOf(tetu, signer.address);
272202
console.log('Token minted', tokenBal.toString());

‎test/strategies/FoldingDoHardWork.ts

-48
This file was deleted.

‎test/strategies/FoldingProfitabilityTest.ts

-143
This file was deleted.

‎test/strategies/StrategyTestUtils.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export class StrategyTestUtils {
5050
const strategy = data[2] as IStrategy;
5151

5252
const rewardTokenLp = await UniswapUtils.createTetuUsdc(
53-
signer, core, "1000000"
53+
signer, core, "10000"
5454
);
5555
log.info("LP created");
5656

‎test/strategies/balancer/BalStakingDoHardWork.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ import {
1414
} from "../../../typechain";
1515
import {VaultUtils} from "../../VaultUtils";
1616
import {defaultAbiCoder} from "@ethersproject/abi";
17-
import {parseUnits} from "ethers/lib/utils";
17+
import {formatUnits, parseUnits} from "ethers/lib/utils";
1818
import {TimeUtils} from "../../TimeUtils";
19+
import {Misc} from "../../../scripts/utils/tools/Misc";
1920

2021
const {expect} = chai;
2122
chai.use(chaiAsPromised);
@@ -50,6 +51,9 @@ export class BalStakingDoHardWork extends DoHardWorkLoopBase {
5051
const depositorAdr = await StrategyBalStaking__factory.connect(this.strategy.address, this.signer).depositor()
5152
const depositor = BalDepositor__factory.connect(depositorAdr, this.signer);
5253

54+
const ethBalance0 = await TokenUtils.balanceOf(EthAddresses.WETH_TOKEN, this.signer.address);
55+
await TokenUtils.transfer(EthAddresses.WETH_TOKEN, this.signer, Misc.ZERO_ADDRESS, ethBalance0.toString());
56+
5357
await IBVault__factory.connect(EthAddresses.BALANCER_VAULT, this.signer).exitPool(
5458
EthAddresses.BALANCER_BAL_WETH_ID,
5559
this.signer.address,
@@ -64,13 +68,20 @@ export class BalStakingDoHardWork extends DoHardWorkLoopBase {
6468

6569
const balBalance = await TokenUtils.balanceOf(EthAddresses.BAL_TOKEN, this.signer.address);
6670
const ethBalance = await TokenUtils.balanceOf(EthAddresses.WETH_TOKEN, this.signer.address);
67-
console.log('balBalance', balBalance.toString());
68-
console.log('ethBalance', ethBalance.toString());
71+
console.log('balBalance', formatUnits(balBalance));
72+
console.log('ethBalance', formatUnits(ethBalance));
6973
await TokenUtils.transfer(EthAddresses.BAL_TOKEN, this.signer, depositorAdr, balBalance.toString());
7074
await TokenUtils.transfer(EthAddresses.WETH_TOKEN, this.signer, depositorAdr, ethBalance.toString());
7175

7276
await depositor.depositBridgedAssets('0x');
7377

78+
const balBalance1 = await TokenUtils.balanceOf(EthAddresses.BAL_TOKEN, depositor.address);
79+
const ethBalance1 = await TokenUtils.balanceOf(EthAddresses.WETH_TOKEN, depositor.address);
80+
console.log('balBalance1', formatUnits(balBalance1));
81+
console.log('ethBalance1', formatUnits(ethBalance1));
82+
expect(balBalance1).eq(0);
83+
expect(ethBalance1).eq(0);
84+
7485
const depositorBalance = await this.vault.underlyingBalanceWithInvestmentForHolder(depositor.address);
7586
expect(+utils.formatUnits(depositorBalance)).is.approximately(+utils.formatUnits(this.userDeposited.div(2)), +utils.formatUnits(this.userDeposited.div(2)) * 0.00001);
7687

0 commit comments

Comments
 (0)
Please sign in to comment.