Skip to content

Commit 4b1be9b

Browse files
authored
Merge pull request #21 from bancorprotocol/migration_tool
2 parents 4a68f31 + 183b276 commit 4b1be9b

Some content is hidden

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

54 files changed

+1925
-618
lines changed

.github/workflows/workflow.yml

+3
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,6 @@ jobs:
3535

3636
- name: Test
3737
run: CI=1 yarn test
38+
39+
- name: Test Migration
40+
run: CI=1 yarn test-migration

packages/v2/components/Contracts.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import { ethers } from 'hardhat';
2-
import { Contract as OldContract, ContractFactory, Overrides as OldOverrides } from '@ethersproject/contracts';
31
import { Signer } from '@ethersproject/abstract-signer';
4-
2+
import { Contract as OldContract, ContractFactory, Overrides as OldOverrides } from '@ethersproject/contracts';
3+
import { ethers } from 'hardhat';
54
import {
65
BancorNetwork__factory,
76
BancorX__factory,

packages/v2/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"hardhat": "2.6.4"
4040
},
4141
"devDependencies": {
42-
"@bancor/token-governance": "bancorprotocol/token-governance",
42+
"@bancor/token-governance": "^0.1.4",
4343
"@ethersproject/hardware-wallets": "^5.4.0",
4444
"@nomiclabs/hardhat-ethers": "^2.0.2",
4545
"@nomiclabs/hardhat-etherscan": "^2.1.6",

packages/v3/.eslintrc

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@
77
},
88
"rules": {
99
"max-len": ["error", 150, 2],
10+
"camelcase": [
11+
"error",
12+
{
13+
"ignoreImports": true
14+
}
15+
],
1016
"indent": [
1117
"error",
1218
4,

packages/v3/.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,11 @@ scTopics
2323
contracts/hardhat-dependency-compiler
2424

2525
config.json
26+
27+
migration/data/hardhat
28+
migration/data/localhost
29+
migration/data/fork*
30+
31+
migration/test/migration/data/hardhat
32+
migration/test/migration/data/localhost
33+
migration/test/migration/data/fork*

packages/v3/README.md

+3-4
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@ In order to use some plugins, API keys or custom network with secret config we n
1515

1616
```json
1717
{
18-
"apiKeys": {
19-
"etherscan": ""
18+
"keys": {
19+
"etherscan": "XYZ"
2020
},
21-
2221
"networks": {
2322
"mainnet": {
24-
"url": ""
23+
"url": "https://eth-mainnet.alchemyapi.io/v2/supersecretkey"
2524
}
2625
}
2726
}
+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/* eslint-enable camelcase */
2+
import { Signer } from '@ethersproject/abstract-signer';
3+
import { ContractFactory } from '@ethersproject/contracts';
4+
import { ethers } from 'hardhat';
5+
6+
type AsyncReturnType<T extends (...args: any) => any> = T extends (...args: any) => Promise<infer U>
7+
? U
8+
: T extends (...args: any) => infer U
9+
? U
10+
: any;
11+
12+
export type Contract<F extends ContractFactory> = AsyncReturnType<F['deploy']>;
13+
14+
export interface ContractBuilder<F extends ContractFactory> {
15+
metadata: {
16+
contractName: string;
17+
abi: unknown;
18+
bytecode: string;
19+
};
20+
deploy(...args: Parameters<F['deploy']>): Promise<Contract<F>>;
21+
attach(address: string, signer?: Signer): Promise<Contract<F>>;
22+
}
23+
24+
export type FactoryConstructor<F extends ContractFactory> = {
25+
new (signer?: Signer): F;
26+
abi: unknown;
27+
bytecode: string;
28+
};
29+
30+
export const deployOrAttach = <F extends ContractFactory>(
31+
contractName: string,
32+
// @TODO: needs to replace with correctly typed params but it doesn't
33+
// work properly for some reason https://github.com/microsoft/TypeScript/issues/31278
34+
FactoryConstructor: FactoryConstructor<F>,
35+
initialSigner?: Signer
36+
): ContractBuilder<F> => {
37+
return {
38+
metadata: {
39+
contractName: contractName,
40+
abi: FactoryConstructor.abi,
41+
bytecode: FactoryConstructor.bytecode
42+
},
43+
deploy: async (...args: Parameters<F['deploy']>): Promise<Contract<F>> => {
44+
const defaultSigner = initialSigner || (await ethers.getSigners())[0];
45+
46+
return new FactoryConstructor(defaultSigner).deploy(...(args || [])) as Contract<F>;
47+
},
48+
attach: attachOnly<F>(FactoryConstructor, initialSigner).attach
49+
};
50+
};
51+
52+
export const attachOnly = <F extends ContractFactory>(
53+
FactoryConstructor: FactoryConstructor<F>,
54+
initialSigner?: Signer
55+
) => {
56+
return {
57+
attach: async (address: string, signer?: Signer): Promise<Contract<F>> => {
58+
const defaultSigner = initialSigner || (await ethers.getSigners())[0];
59+
return new FactoryConstructor(signer || defaultSigner).attach(address) as Contract<F>;
60+
}
61+
};
62+
};

packages/v3/components/Contracts.ts

+28-69
Original file line numberDiff line numberDiff line change
@@ -21,89 +21,48 @@ import {
2121
TestPoolCollection__factory,
2222
TestReserveToken__factory,
2323
TestSafeERC20Ex__factory,
24-
TestSystemToken__factory,
25-
TestTokenGovernance__factory,
2624
TestUpgradeable__factory,
2725
TokenHolder__factory,
2826
TransparentUpgradeableProxy__factory
2927
} from '../typechain';
28+
import { deployOrAttach } from './ContractBuilder';
3029

3130
/* eslint-enable camelcase */
3231
import { Signer } from '@ethersproject/abstract-signer';
33-
import { ContractFactory } from '@ethersproject/contracts';
34-
import { ethers } from 'hardhat';
35-
36-
type AsyncReturnType<T extends (...args: any) => any> = T extends (...args: any) => Promise<infer U>
37-
? U
38-
: T extends (...args: any) => infer U
39-
? U
40-
: any;
41-
42-
export type Contract<F extends ContractFactory> = AsyncReturnType<F['deploy']>;
43-
44-
export interface ContractBuilder<F extends ContractFactory> {
45-
contractName: string;
46-
deploy(...args: Parameters<F['deploy']>): Promise<Contract<F>>;
47-
attach(address: string, passedSigner?: Signer): Promise<Contract<F>>;
48-
}
49-
50-
const deployOrAttach = <F extends ContractFactory>(contractName: string, passedSigner?: Signer): ContractBuilder<F> => {
51-
return {
52-
contractName,
53-
deploy: async (...args: Parameters<F['deploy']>): Promise<Contract<F>> => {
54-
const defaultSigner = passedSigner || (await ethers.getSigners())[0];
55-
56-
return (await ethers.getContractFactory(contractName, defaultSigner)).deploy(
57-
...(args || [])
58-
) as Contract<F>;
59-
},
60-
attach: attachOnly<F>(contractName).attach
61-
};
62-
};
63-
64-
const attachOnly = <F extends ContractFactory>(contractName: string, passedSigner?: Signer) => {
65-
return {
66-
attach: async (address: string, signer?: Signer): Promise<Contract<F>> => {
67-
const defaultSigner = passedSigner || (await ethers.getSigners())[0];
68-
return ethers.getContractAt(contractName, address, signer || defaultSigner) as Contract<F>;
69-
}
70-
};
71-
};
7232

7333
const getContracts = (signer?: Signer) => ({
7434
connect: (signer: Signer) => getContracts(signer),
7535

76-
/* eslint-disable camelcase */
77-
BancorNetwork: deployOrAttach<BancorNetwork__factory>('BancorNetwork', signer),
78-
BancorVault: deployOrAttach<BancorVault__factory>('BancorVault', signer),
79-
ERC20: deployOrAttach<ERC20__factory>('ERC20', signer),
80-
PoolCollection: deployOrAttach<PoolCollection__factory>('PoolCollection', signer),
81-
NetworkSettings: deployOrAttach<NetworkSettings__factory>('NetworkSettings', signer),
82-
NetworkTokenPool: deployOrAttach<NetworkTokenPool__factory>('NetworkTokenPool', signer),
83-
PendingWithdrawals: deployOrAttach<PendingWithdrawals__factory>('PendingWithdrawals', signer),
84-
PoolToken: deployOrAttach<PoolToken__factory>('PoolToken', signer),
85-
PoolTokenFactory: deployOrAttach<PoolTokenFactory__factory>('PoolTokenFactory', signer),
86-
ProxyAdmin: deployOrAttach<ProxyAdmin__factory>('ProxyAdmin', signer),
87-
TestBancorNetwork: deployOrAttach<TestBancorNetwork__factory>('TestBancorNetwork', signer),
88-
TestERC20Token: deployOrAttach<TestERC20Token__factory>('TestERC20Token', signer),
89-
TestERC20Burnable: deployOrAttach<TestERC20Burnable__factory>('TestERC20Burnable', signer),
90-
TestPoolAverageRate: deployOrAttach<TestPoolAverageRate__factory>('TestPoolAverageRate', signer),
91-
TestPoolCollection: deployOrAttach<TestPoolCollection__factory>('TestPoolCollection', signer),
92-
TestNetworkTokenPool: deployOrAttach<TestNetworkTokenPool__factory>('TestNetworkTokenPool', signer),
93-
TestMathEx: deployOrAttach<TestMathEx__factory>('TestMathEx', signer),
94-
TestOwned: deployOrAttach<TestOwned__factory>('TestOwned', signer),
95-
TestPendingWithdrawals: deployOrAttach<TestPendingWithdrawals__factory>('TestPendingWithdrawals', signer),
96-
TestReserveToken: deployOrAttach<TestReserveToken__factory>('TestReserveToken', signer),
97-
TestSafeERC20Ex: deployOrAttach<TestSafeERC20Ex__factory>('TestSafeERC20Ex', signer),
98-
TestSystemToken: deployOrAttach<TestSystemToken__factory>('TestSystemToken', signer),
99-
TestTokenGovernance: deployOrAttach<TestTokenGovernance__factory>('TestTokenGovernance', signer),
100-
TestUpgradeable: deployOrAttach<TestUpgradeable__factory>('TestUpgradeable', signer),
101-
TokenHolder: deployOrAttach<TokenHolder__factory>('TokenHolder', signer),
102-
TransparentUpgradeableProxy: deployOrAttach<TransparentUpgradeableProxy__factory>(
36+
BancorNetwork: deployOrAttach('BancorNetwork', BancorNetwork__factory, signer),
37+
BancorVault: deployOrAttach('BancorVault', BancorVault__factory, signer),
38+
ERC20: deployOrAttach('ERC20', ERC20__factory, signer),
39+
PoolCollection: deployOrAttach('PoolCollection', PoolCollection__factory, signer),
40+
NetworkSettings: deployOrAttach('NetworkSettings', NetworkSettings__factory, signer),
41+
NetworkTokenPool: deployOrAttach('NetworkTokenPool', NetworkTokenPool__factory, signer),
42+
PendingWithdrawals: deployOrAttach('PendingWithdrawals', PendingWithdrawals__factory, signer),
43+
PoolToken: deployOrAttach('PoolToken', PoolToken__factory, signer),
44+
PoolTokenFactory: deployOrAttach('PoolTokenFactory', PoolTokenFactory__factory, signer),
45+
ProxyAdmin: deployOrAttach('ProxyAdmin', ProxyAdmin__factory, signer),
46+
TestBancorNetwork: deployOrAttach('TestBancorNetwork', TestBancorNetwork__factory, signer),
47+
TestERC20Token: deployOrAttach('TestERC20Token', TestERC20Token__factory, signer),
48+
TestERC20Burnable: deployOrAttach('TestERC20Burnable', TestERC20Burnable__factory, signer),
49+
TestPoolAverageRate: deployOrAttach('TestPoolAverageRate', TestPoolAverageRate__factory, signer),
50+
TestPoolCollection: deployOrAttach('TestPoolCollection', TestPoolCollection__factory, signer),
51+
TestNetworkTokenPool: deployOrAttach('TestNetworkTokenPool', TestNetworkTokenPool__factory, signer),
52+
TestMathEx: deployOrAttach('TestMathEx', TestMathEx__factory, signer),
53+
TestOwned: deployOrAttach('TestOwned', TestOwned__factory, signer),
54+
TestPendingWithdrawals: deployOrAttach('TestPendingWithdrawals', TestPendingWithdrawals__factory, signer),
55+
TestReserveToken: deployOrAttach('TestReserveToken', TestReserveToken__factory, signer),
56+
TestSafeERC20Ex: deployOrAttach('TestSafeERC20Ex', TestSafeERC20Ex__factory, signer),
57+
TestUpgradeable: deployOrAttach('TestUpgradeable', TestUpgradeable__factory, signer),
58+
TokenHolder: deployOrAttach('TokenHolder', TokenHolder__factory, signer),
59+
TransparentUpgradeableProxy: deployOrAttach(
10360
'TransparentUpgradeableProxy',
61+
TransparentUpgradeableProxy__factory,
10462
signer
10563
)
106-
/* eslint-enable camelcase */
10764
});
10865

66+
export type ContractsType = ReturnType<typeof getContracts>;
67+
10968
export default getContracts();
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/* eslint-disable camelcase */
2+
import { deployOrAttach } from './ContractBuilder';
3+
import {
4+
TokenGovernance__factory,
5+
SmartToken__factory as NetworkToken__factory,
6+
SmartToken as NetworkToken,
7+
DSToken__factory as GovToken__factory,
8+
DSToken as GovToken
9+
} from '@bancor/token-governance';
10+
import { Signer } from '@ethersproject/abstract-signer';
11+
12+
export { NetworkToken, GovToken };
13+
14+
/* eslint-enable camelcase */
15+
16+
const getContracts = (signer?: Signer) => ({
17+
connect: (signer: Signer) => getContracts(signer),
18+
19+
TokenGovernance: deployOrAttach('TokenGovernance', TokenGovernance__factory, signer),
20+
NetworkToken: deployOrAttach('BNTToken', NetworkToken__factory, signer),
21+
GovToken: deployOrAttach('vBNTToken', GovToken__factory, signer)
22+
});
23+
24+
export type ContractsType = ReturnType<typeof getContracts>;
25+
26+
export default getContracts();

packages/v3/contracts/helpers/TestBancorNetwork.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { EnumerableSetUpgradeable } from "@openzeppelin/contracts-upgradeable/ut
77
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
88
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
99

10-
import { ITokenGovernance } from "@bancor/token-governance/0.7.6/contracts/TokenGovernance.sol";
10+
import { ITokenGovernance } from "@bancor/token-governance/contracts/ITokenGovernance.sol";
1111

1212
import { Time } from "../utility/Time.sol";
1313

packages/v3/contracts/helpers/TestSystemToken.sol

-37
This file was deleted.

packages/v3/contracts/helpers/TestTokenGovernance.sol

-9
This file was deleted.

packages/v3/contracts/network/BancorNetwork.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { IERC20Permit } from "@openzeppelin/contracts/drafts/IERC20Permit.sol";
99
import { ReentrancyGuardUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
1010
import { EnumerableSetUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol";
1111

12-
import { ITokenGovernance } from "@bancor/token-governance/0.7.6/contracts/TokenGovernance.sol";
12+
import { ITokenGovernance } from "@bancor/token-governance/contracts/ITokenGovernance.sol";
1313

1414
import { ITokenHolder } from "../utility/interfaces/ITokenHolder.sol";
1515
import { Upgradeable } from "../utility/Upgradeable.sol";

packages/v3/contracts/network/interfaces/IBancorNetwork.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ pragma solidity 0.7.6;
33

44
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
55

6-
import { ITokenGovernance } from "@bancor/token-governance/0.7.6/contracts/TokenGovernance.sol";
6+
import { ITokenGovernance } from "@bancor/token-governance/contracts/ITokenGovernance.sol";
77

88
import { IUpgradeable } from "../../utility/interfaces/IUpgradeable.sol";
99
import { ITokenHolder } from "../../utility/interfaces/ITokenHolder.sol";

packages/v3/contracts/pools/NetworkTokenPool.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Math } from "@openzeppelin/contracts/math/Math.sol";
77
import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol";
88
import { ReentrancyGuardUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
99

10-
import { ITokenGovernance } from "@bancor/token-governance/0.7.6/contracts/TokenGovernance.sol";
10+
import { ITokenGovernance } from "@bancor/token-governance/contracts/ITokenGovernance.sol";
1111

1212
import { IReserveToken } from "../token/interfaces/IReserveToken.sol";
1313

packages/v3/contracts/pools/interfaces/INetworkTokenPool.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pragma abicoder v2;
44

55
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
66

7-
import { ITokenGovernance } from "@bancor/token-governance/0.7.6/contracts/TokenGovernance.sol";
7+
import { ITokenGovernance } from "@bancor/token-governance/contracts/ITokenGovernance.sol";
88

99
import { IPoolToken } from "./IPoolToken.sol";
1010
import { IPoolCollection } from "./IPoolCollection.sol";

packages/v3/contracts/token/interfaces/IReserveToken.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ pragma solidity 0.7.6;
55
* @dev This contract is used to represent reserve tokens, which are tokens that can either be regular ERC20 tokens or
66
* native ETH (represented by the NATIVE_TOKEN_ADDRESS address)
77
*
8-
* Please note that this interface is intentionally doesn't inherit from IERC20, so that it'd be possible to effectively
8+
* Please note that this interface intentionally doesn't inherit from IERC20, so that it'd be possible to effectively
99
* override its balanceOf() function in the ReserveToken library
1010
*/
1111
interface IReserveToken {

0 commit comments

Comments
 (0)