From 8f744f34625d8534af5a5d38c0fa0d76ef4c8dcb Mon Sep 17 00:00:00 2001 From: bweick Date: Thu, 27 Feb 2020 10:52:14 -0800 Subject: [PATCH 1/3] Update strategies for imports from contracts and oracles. --- package.json | 4 +- .../allocators/binaryAllocator.spec.ts | 4 +- .../allocators/socialAllocator.spec.ts | 4 +- .../managers/assetPairManager.spec.ts | 2 +- .../managers/btcDaiRebalancingManager.spec.ts | 4 +- .../managers/btcEthRebalancingManager.spec.ts | 4 +- .../managers/ethDaiRebalancingManager.spec.ts | 4 +- .../inverseMacoStrategyManager.spec.ts | 4 +- .../flexibleTimingManagerLibraryMock.spec.ts | 2 +- .../managers/lib/managerLibraryMock.spec.ts | 2 +- .../managers/macoStrategyManager.spec.ts | 4 +- .../managers/macoStrategyManagerV2.spec.ts | 4 +- .../managers/socialTradingManager.spec.ts | 4 +- .../movingAverageCrossoverTrigger.spec.ts | 4 +- .../triggers/rsiTrendingTrigger.spec.ts | 4 +- test/integrations/assetPairManager.spec.ts | 4 +- .../btc-eth/btcEthMultipleRebalance.spec.ts | 2 +- .../btc-eth/btcEthMultipleRebalanceHelper.ts | 2 +- .../btc-eth/btcEthRebalancing.spec.ts | 4 +- .../macoManagerMultipleRebalance.spec.ts | 2 +- .../macoStrategyMultipleRebalanceHelper.ts | 2 +- utils/blockchain.ts | 43 - utils/helpers/compoundHelper.ts | 210 ----- utils/helpers/oracleHelper.ts | 773 ------------------ utils/web3Helper.ts | 15 + yarn.lock | 220 ++++- 26 files changed, 267 insertions(+), 1064 deletions(-) delete mode 100644 utils/blockchain.ts delete mode 100644 utils/helpers/compoundHelper.ts delete mode 100644 utils/helpers/oracleHelper.ts diff --git a/package.json b/package.json index 1e29ce1..bcdb25a 100644 --- a/package.json +++ b/package.json @@ -102,8 +102,8 @@ "lint-staged": "^7.2.0", "module-alias": "^2.1.0", "openzeppelin-solidity": "^2.2", - "set-protocol-contracts": "^1.3.13-beta", - "set-protocol-oracles": "^1.0.1", + "set-protocol-contracts": "^1.3.34-beta", + "set-protocol-oracles": "^1.0.5", "set-protocol-utils": "^1.0.0-beta.45", "tiny-promisify": "^1.0.0", "truffle-flattener": "^1.4.2", diff --git a/test/contracts/managers/allocators/binaryAllocator.spec.ts b/test/contracts/managers/allocators/binaryAllocator.spec.ts index 4ba3ad5..db01d9b 100644 --- a/test/contracts/managers/allocators/binaryAllocator.spec.ts +++ b/test/contracts/managers/allocators/binaryAllocator.spec.ts @@ -10,7 +10,7 @@ import { BigNumber } from 'bignumber.js'; import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { Core, @@ -48,7 +48,7 @@ import { getWeb3 } from '@utils/web3Helper'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; import { ManagerHelper } from '@utils/helpers/managerHelper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; BigNumberSetup.configure(); diff --git a/test/contracts/managers/allocators/socialAllocator.spec.ts b/test/contracts/managers/allocators/socialAllocator.spec.ts index 0e9afa0..eae6d09 100644 --- a/test/contracts/managers/allocators/socialAllocator.spec.ts +++ b/test/contracts/managers/allocators/socialAllocator.spec.ts @@ -10,7 +10,7 @@ import { BigNumber } from 'bignumber.js'; import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { Core, @@ -45,7 +45,7 @@ import { getWeb3 } from '@utils/web3Helper'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; import { ManagerHelper } from '@utils/helpers/managerHelper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; BigNumberSetup.configure(); diff --git a/test/contracts/managers/assetPairManager.spec.ts b/test/contracts/managers/assetPairManager.spec.ts index 2152b4d..6d6f83e 100644 --- a/test/contracts/managers/assetPairManager.spec.ts +++ b/test/contracts/managers/assetPairManager.spec.ts @@ -10,7 +10,7 @@ import { BigNumber } from 'bignumber.js'; import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { Core, diff --git a/test/contracts/managers/btcDaiRebalancingManager.spec.ts b/test/contracts/managers/btcDaiRebalancingManager.spec.ts index 2a7c582..445e59d 100644 --- a/test/contracts/managers/btcDaiRebalancingManager.spec.ts +++ b/test/contracts/managers/btcDaiRebalancingManager.spec.ts @@ -28,7 +28,7 @@ import { import { BTCDaiRebalancingManagerContract, } from '@utils/contracts'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { DEFAULT_GAS, @@ -40,7 +40,7 @@ import { LogManagerProposal } from '@utils/contract_logs/btcDaiRebalancingManage import { ProtocolHelper } from '@utils/helpers/protocolHelper'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ManagerHelper } from '@utils/helpers/managerHelper'; BigNumberSetup.configure(); diff --git a/test/contracts/managers/btcEthRebalancingManager.spec.ts b/test/contracts/managers/btcEthRebalancingManager.spec.ts index c9e47f0..1e57754 100644 --- a/test/contracts/managers/btcEthRebalancingManager.spec.ts +++ b/test/contracts/managers/btcEthRebalancingManager.spec.ts @@ -29,7 +29,7 @@ import { BTCETHRebalancingManagerContract, } from '@utils/contracts'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { DEFAULT_GAS, @@ -42,7 +42,7 @@ import { LogManagerProposal } from '@utils/contract_logs/btcEthRebalancingManage import { ProtocolHelper } from '@utils/helpers/protocolHelper'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ManagerHelper } from '@utils/helpers/managerHelper'; BigNumberSetup.configure(); diff --git a/test/contracts/managers/ethDaiRebalancingManager.spec.ts b/test/contracts/managers/ethDaiRebalancingManager.spec.ts index 6c318f9..d3e3fa0 100644 --- a/test/contracts/managers/ethDaiRebalancingManager.spec.ts +++ b/test/contracts/managers/ethDaiRebalancingManager.spec.ts @@ -28,7 +28,7 @@ import { } from 'set-protocol-oracles'; import { ETHDaiRebalancingManagerContract } from '@utils/contracts'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { DEFAULT_GAS, @@ -40,7 +40,7 @@ import { LogManagerProposal } from '@utils/contract_logs/ethDaiRebalancingManage import { ProtocolHelper } from '@utils/helpers/protocolHelper'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ManagerHelper } from '@utils/helpers/managerHelper'; BigNumberSetup.configure(); diff --git a/test/contracts/managers/inverseMacoStrategyManager.spec.ts b/test/contracts/managers/inverseMacoStrategyManager.spec.ts index f969b66..faaaff7 100644 --- a/test/contracts/managers/inverseMacoStrategyManager.spec.ts +++ b/test/contracts/managers/inverseMacoStrategyManager.spec.ts @@ -10,7 +10,7 @@ import { BigNumber } from 'bignumber.js'; import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { Core, @@ -52,7 +52,7 @@ import { LogManagerProposal } from '@utils/contract_logs/macoStrategyManager'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; import { ManagerHelper } from '@utils/helpers/managerHelper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; BigNumberSetup.configure(); diff --git a/test/contracts/managers/lib/flexibleTimingManagerLibraryMock.spec.ts b/test/contracts/managers/lib/flexibleTimingManagerLibraryMock.spec.ts index e526758..487944e 100644 --- a/test/contracts/managers/lib/flexibleTimingManagerLibraryMock.spec.ts +++ b/test/contracts/managers/lib/flexibleTimingManagerLibraryMock.spec.ts @@ -9,7 +9,7 @@ import { BigNumberSetup } from '@utils/bigNumberSetup'; import { FlexibleTimingManagerLibraryMockContract } from '@utils/contracts'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { expectRevertError } from '@utils/tokenAssertions'; import { getWeb3 } from '@utils/web3Helper'; diff --git a/test/contracts/managers/lib/managerLibraryMock.spec.ts b/test/contracts/managers/lib/managerLibraryMock.spec.ts index 9a2a786..a4d8b4e 100644 --- a/test/contracts/managers/lib/managerLibraryMock.spec.ts +++ b/test/contracts/managers/lib/managerLibraryMock.spec.ts @@ -9,7 +9,7 @@ import { BigNumberSetup } from '@utils/bigNumberSetup'; import { ManagerLibraryMockContract } from '@utils/contracts'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { getWeb3 } from '@utils/web3Helper'; import { DEFAULT_AUCTION_PRICE_DIVISOR } from '@utils/constants'; diff --git a/test/contracts/managers/macoStrategyManager.spec.ts b/test/contracts/managers/macoStrategyManager.spec.ts index 0362a6b..7e9066b 100644 --- a/test/contracts/managers/macoStrategyManager.spec.ts +++ b/test/contracts/managers/macoStrategyManager.spec.ts @@ -10,7 +10,7 @@ import { BigNumber } from 'bignumber.js'; import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { Core, @@ -49,7 +49,7 @@ import { LogManagerProposal } from '@utils/contract_logs/macoStrategyManager'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; import { ManagerHelper } from '@utils/helpers/managerHelper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; BigNumberSetup.configure(); diff --git a/test/contracts/managers/macoStrategyManagerV2.spec.ts b/test/contracts/managers/macoStrategyManagerV2.spec.ts index 5297ec0..8a8d737 100644 --- a/test/contracts/managers/macoStrategyManagerV2.spec.ts +++ b/test/contracts/managers/macoStrategyManagerV2.spec.ts @@ -10,7 +10,7 @@ import { BigNumber } from 'bignumber.js'; import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { Core, @@ -52,7 +52,7 @@ import { LogManagerProposal } from '@utils/contract_logs/macoStrategyManager'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; import { ManagerHelper } from '@utils/helpers/managerHelper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; BigNumberSetup.configure(); diff --git a/test/contracts/managers/socialTradingManager.spec.ts b/test/contracts/managers/socialTradingManager.spec.ts index d9393aa..659b33a 100644 --- a/test/contracts/managers/socialTradingManager.spec.ts +++ b/test/contracts/managers/socialTradingManager.spec.ts @@ -10,7 +10,7 @@ import { BigNumber } from 'bignumber.js'; import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { Core, @@ -55,7 +55,7 @@ import { getWeb3 } from '@utils/web3Helper'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; import { ManagerHelper } from '@utils/helpers/managerHelper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; BigNumberSetup.configure(); diff --git a/test/contracts/managers/triggers/movingAverageCrossoverTrigger.spec.ts b/test/contracts/managers/triggers/movingAverageCrossoverTrigger.spec.ts index 67177c0..8290819 100644 --- a/test/contracts/managers/triggers/movingAverageCrossoverTrigger.spec.ts +++ b/test/contracts/managers/triggers/movingAverageCrossoverTrigger.spec.ts @@ -10,7 +10,7 @@ import { BigNumber } from 'bignumber.js'; import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { @@ -33,7 +33,7 @@ import { import { getWeb3 } from '@utils/web3Helper'; import { ManagerHelper } from '@utils/helpers/managerHelper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; BigNumberSetup.configure(); diff --git a/test/contracts/managers/triggers/rsiTrendingTrigger.spec.ts b/test/contracts/managers/triggers/rsiTrendingTrigger.spec.ts index 1f2f2bc..1c71e4c 100644 --- a/test/contracts/managers/triggers/rsiTrendingTrigger.spec.ts +++ b/test/contracts/managers/triggers/rsiTrendingTrigger.spec.ts @@ -10,7 +10,7 @@ import { BigNumber } from 'bignumber.js'; import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { @@ -35,7 +35,7 @@ import { expectRevertError } from '@utils/tokenAssertions'; import { getWeb3 } from '@utils/web3Helper'; import { ManagerHelper } from '@utils/helpers/managerHelper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; BigNumberSetup.configure(); diff --git a/test/integrations/assetPairManager.spec.ts b/test/integrations/assetPairManager.spec.ts index 2e086d2..6514f2d 100644 --- a/test/integrations/assetPairManager.spec.ts +++ b/test/integrations/assetPairManager.spec.ts @@ -10,7 +10,7 @@ import { BigNumber } from 'bignumber.js'; import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { ether } from '@utils/units'; import { Core, @@ -57,7 +57,7 @@ import { getWeb3 } from '@utils/web3Helper'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; import { ManagerHelper } from '@utils/helpers/managerHelper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; BigNumberSetup.configure(); diff --git a/test/scenarios/btc-eth/btcEthMultipleRebalance.spec.ts b/test/scenarios/btc-eth/btcEthMultipleRebalance.spec.ts index 1c83ddf..6549d68 100644 --- a/test/scenarios/btc-eth/btcEthMultipleRebalance.spec.ts +++ b/test/scenarios/btc-eth/btcEthMultipleRebalance.spec.ts @@ -12,7 +12,7 @@ import { import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { getWeb3 } from '@utils/web3Helper'; import { getScenarioData } from './scenarioData'; diff --git a/test/scenarios/btc-eth/btcEthMultipleRebalanceHelper.ts b/test/scenarios/btc-eth/btcEthMultipleRebalanceHelper.ts index ee8adbd..3a3531e 100644 --- a/test/scenarios/btc-eth/btcEthMultipleRebalanceHelper.ts +++ b/test/scenarios/btc-eth/btcEthMultipleRebalanceHelper.ts @@ -45,7 +45,7 @@ import { import { ProtocolHelper } from '@utils/helpers/protocolHelper'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ManagerHelper } from '@utils/helpers/managerHelper'; BigNumberSetup.configure(); diff --git a/test/scenarios/btc-eth/btcEthRebalancing.spec.ts b/test/scenarios/btc-eth/btcEthRebalancing.spec.ts index 2dd82d1..f2c5a47 100644 --- a/test/scenarios/btc-eth/btcEthRebalancing.spec.ts +++ b/test/scenarios/btc-eth/btcEthRebalancing.spec.ts @@ -33,12 +33,12 @@ import { DEFAULT_GAS, UNLIMITED_ALLOWANCE_IN_BASE_UNITS, } from '@utils/constants'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { getWeb3 } from '@utils/web3Helper'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ManagerHelper } from '@utils/helpers/managerHelper'; BigNumberSetup.configure(); diff --git a/test/scenarios/maco-strategy/macoManagerMultipleRebalance.spec.ts b/test/scenarios/maco-strategy/macoManagerMultipleRebalance.spec.ts index 0cb772b..7d76b50 100644 --- a/test/scenarios/maco-strategy/macoManagerMultipleRebalance.spec.ts +++ b/test/scenarios/maco-strategy/macoManagerMultipleRebalance.spec.ts @@ -12,7 +12,7 @@ import { import ChaiSetup from '@utils/chaiSetup'; import { BigNumberSetup } from '@utils/bigNumberSetup'; -import { Blockchain } from '@utils/blockchain'; +import { Blockchain } from 'set-protocol-contracts'; import { getWeb3 } from '@utils/web3Helper'; import { getScenarioData } from './scenarioData'; diff --git a/test/scenarios/maco-strategy/macoStrategyMultipleRebalanceHelper.ts b/test/scenarios/maco-strategy/macoStrategyMultipleRebalanceHelper.ts index 7d01c29..df78222 100644 --- a/test/scenarios/maco-strategy/macoStrategyMultipleRebalanceHelper.ts +++ b/test/scenarios/maco-strategy/macoStrategyMultipleRebalanceHelper.ts @@ -51,7 +51,7 @@ import { import { ProtocolHelper } from '@utils/helpers/protocolHelper'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; -import { OracleHelper } from '@utils/helpers/oracleHelper'; +import { OracleHelper } from 'set-protocol-oracles'; import { ManagerHelper } from '@utils/helpers/managerHelper'; BigNumberSetup.configure(); diff --git a/utils/blockchain.ts b/utils/blockchain.ts deleted file mode 100644 index 6f73aaf..0000000 --- a/utils/blockchain.ts +++ /dev/null @@ -1,43 +0,0 @@ -import promisify from 'tiny-promisify'; -import Web3 from 'web3'; - -import { BigNumber } from 'bignumber.js'; - - -export class Blockchain { - private _web3: Web3; - private _snapshotId: number; - - constructor(web3: Web3) { - this._web3 = web3; - } - - public async saveSnapshotAsync(): Promise { - const response = await this.sendJSONRpcRequestAsync('evm_snapshot', []); - this._snapshotId = parseInt(response.result, 16); - } - - public async revertAsync(): Promise { - await this.sendJSONRpcRequestAsync('evm_revert', [this._snapshotId]); - } - - public async increaseTimeAsync( - duration: BigNumber, - ): Promise { - await this.sendJSONRpcRequestAsync('evm_increaseTime', [duration.toNumber()]); - } - - private async sendJSONRpcRequestAsync( - method: string, - params: any[], - ): Promise { - return promisify(this._web3.currentProvider.send, { - context: this._web3.currentProvider, - })({ - jsonrpc: '2.0', - method, - params, - id: new Date().getTime(), - }); - } -} diff --git a/utils/helpers/compoundHelper.ts b/utils/helpers/compoundHelper.ts deleted file mode 100644 index eb1ad79..0000000 --- a/utils/helpers/compoundHelper.ts +++ /dev/null @@ -1,210 +0,0 @@ -import * as _ from 'lodash'; -import { Address } from 'set-protocol-utils'; -import { BigNumber } from 'bignumber.js'; - - -import { getWeb3 } from '../web3Helper'; -import { ether } from '../units'; - -import { DEFAULT_GAS } from '../constants'; - -import { ComptrollerABI } from '../external/abis/compound/ComptrollerABI'; -import { CErc20ABI } from '../external/abis/compound/CErc20ABI'; -import { InterestRateModelABI } from '../external/abis/compound/InterestRateModelABI'; - -import { CONTRACTS, PERMISSIONED_ACCOUNTS, BYTECODE } from '../compoundSnapshotAddresses'; - -const web3 = getWeb3(); - -export class CompoundHelper { - private _senderAccountAddress: Address; - - public priceOracle: Address = CONTRACTS.PriceOracle; - public interestRateModel: Address = CONTRACTS.InterestRateModel; - public comptroller: Address = CONTRACTS.Comptroller; - public admin: Address = PERMISSIONED_ACCOUNTS.admin; - - constructor(senderAccountAddress: Address) { - this._senderAccountAddress = senderAccountAddress; - } - - /** - * Example Usage: USDC - * - * const usdc: StandardTokenMockContract = await this._erc20Helper.deployTokenAsync( - * this._senderAccountAddress, - * 6, - * ); - * - * const cUSDC = await this.deployMockCUSDC(usdc.address, this.admin); - * await this.enableCToken(cUSDC); - * - * Set the Borrow Rate - * await this.setBorrowRate(cUSDC, new BigNumber('1000000000000')); - * - * await this._erc20Helper.approveTransferAsync( - * usdc, - * cUSDC, - * this._senderAccountAddress - * ); - * - * await this.accrueInterest(cUSDC); - * - * const ONE_USDC = new BigNumber(10 ** 6); - * await this.mintCToken(cUSDC, ONE_USDC); - */ - - /* ============ Compound Methods ============ */ - - public async deployMockCUSDC( - underlying: Address, - admin: Address, - ): Promise { - const config = { - 'name': 'Compound USD Coin', - 'symbol': 'cUSDC', - 'decimals': new BigNumber(8), - 'underlying': underlying, - 'contract': 'CErc20', - 'initial_exchange_rate_mantissa': new BigNumber('200000000000000'), - }; - - return await this.deployCToken( - config.underlying, - this.comptroller, - this.interestRateModel, - config.initial_exchange_rate_mantissa, - config.symbol, - config.name, - config.decimals, - this.admin, - ); - } - - // cToken must be enabled before minting or accruing interest is allowed - public async enableCToken(cToken: Address): Promise { - const ComptrollerContract = new web3.eth.Contract(ComptrollerABI, this.comptroller); - - const supportMarketData = ComptrollerContract.methods._supportMarket( - cToken - ).encodeABI(); - await web3.eth.sendTransaction({ - from: this._senderAccountAddress, - to: this.comptroller, - data: supportMarketData, - gas: DEFAULT_GAS, - }); - } - - // Sets borrow rate on the interestRateModel - public async setBorrowRate(cToken: Address, borrowRate: BigNumber): Promise { - const InterestRateModelContract = new web3.eth.Contract(InterestRateModelABI, this.interestRateModel); - const setBorrowData = InterestRateModelContract.methods.setBorrowRate( - borrowRate.toString() - ).encodeABI(); - await web3.eth.sendTransaction({ - from: this._senderAccountAddress, - to: this.interestRateModel, - data: setBorrowData, - gas: DEFAULT_GAS, - }); - } - - public async deployCToken( - underlying: Address, - comptroller: Address, - interestRateModel: Address, - initialExchangeRate: BigNumber, - symbol: string, - name: string, - decimals: BigNumber, - admin: Address, - ): Promise { - const instance = await new web3.eth.Contract(CErc20ABI).deploy({ - data: BYTECODE.CErc20, - arguments: [ - underlying, - comptroller, - interestRateModel, - initialExchangeRate.toString(), - name, - symbol, - decimals.toString(), - admin, - ], - }).send({ from: admin, gas: DEFAULT_GAS }); - - return instance.options.address; - } - - // Underlying to cToken scaled by 10 ** 18 - public async getExchangeRate( - cToken: Address, - ): Promise { - const exchangeRate: number = await this.cTokenInstance(cToken).methods.exchangeRateStored().call(); - return new BigNumber(exchangeRate); - } - - public async mintCToken( - cToken: Address, - underlyingQuantity: BigNumber, - from: Address = this._senderAccountAddress, - ): Promise { - const txnData = this.cTokenInstance(cToken).methods.mint( - underlyingQuantity.toString() - ).encodeABI(); - - return await web3.eth.sendTransaction({ from, to: cToken, data: txnData, gas: DEFAULT_GAS }); - } - - // The redeem function transfers the underlying asset from the money market to - // the user in exchange for previously minted cTokens. The amount of underlying - // redeemed is the number of cTokens multiplied by the current Exchange Rate. - public async cTokenToUnderlying( - cToken: Address, - cTokenQuantity: BigNumber - ): Promise { - const exchangeRate: number = await this.cTokenInstance(cToken).methods.exchangeRateStored().call(); - return cTokenQuantity.mul(exchangeRate).div(ether(1)); - } - - // Retrieve # of cTokens expected from Underlying Quantity - public async underlyingToCToken( - cToken: Address, - underlyingQuantity: BigNumber - ): Promise { - const exchangeRate: number = await this.cTokenInstance(cToken).methods.exchangeRateStored().call(); - return underlyingQuantity.div(exchangeRate).mul(ether(1)); - } - - public async balanceOf( - cToken: Address, - account: Address - ): Promise { - const balance = await this.cTokenInstance(cToken).methods.balanceOf(account).call(); - return new BigNumber(balance); - } - - // Retrieves balance of underlying owned - public async balanceOfUnderlying( - cToken: Address, - account: Address - ): Promise { - const balance = await this.cTokenInstance(cToken).methods.balanceOfUnderlying(account).call(); - return new BigNumber(balance); - } - - public async accrueInterest( - cToken: Address, - from: Address = this._senderAccountAddress, - ): Promise { - const txnData = this.cTokenInstance(cToken).methods.accrueInterest().encodeABI(); - return await web3.eth.sendTransaction({ from, to: cToken, data: txnData, gas: DEFAULT_GAS }); - } - - public cTokenInstance( - cToken: Address, - ): any { - return new web3.eth.Contract(CErc20ABI, cToken); - } -} diff --git a/utils/helpers/oracleHelper.ts b/utils/helpers/oracleHelper.ts deleted file mode 100644 index cef1818..0000000 --- a/utils/helpers/oracleHelper.ts +++ /dev/null @@ -1,773 +0,0 @@ -import * as _ from 'lodash'; -import * as setProtocolUtils from 'set-protocol-utils'; -import { Address } from 'set-protocol-utils'; -import { BigNumber } from 'bignumber.js'; - -import { Blockchain } from '@utils/blockchain'; -import { ether } from '@utils/units'; - -import { - ConstantPriceOracleContract, - CTokenOracleContract, - DydxConstantPriceOracleMockContract, - DydxOracleAdapterContract, - EMAOracleContract, - FeedFactoryContract, - HistoricalPriceFeedContract, - TwoAssetRatioOracleContract, - LegacyMakerOracleAdapterContract, - LinearizedEMATimeSeriesFeedContract, - LinearizedPriceDataSourceContract, - MedianContract, - MovingAverageOracleContract, - MovingAverageOracleV1ProxyContract, - MovingAverageOracleV2Contract, - OracleProxyContract, - PriceFeedContract, - RSIOracleContract, - TimeSeriesFeedContract, - TimeSeriesFeedV2Contract, - TwoAssetLinearizedTimeSeriesFeedContract -} from 'set-protocol-oracles'; - -import { - DEFAULT_GAS, - ONE_DAY_IN_SECONDS, - ONE_HOUR_IN_SECONDS, -} from '@utils/constants'; -import { getWeb3, getContractInstance, importFromOracles, txnFrom } from '../web3Helper'; -import { FeedCreatedArgs } from '../contract_logs/oracle'; - -const web3 = getWeb3(); - -const ConstantPriceOracle = importFromOracles('ConstantPriceOracle'); -const CTokenOracle = importFromOracles('CTokenOracle'); -const DydxConstantPriceOracleMock = importFromOracles('DydxConstantPriceOracleMock'); -const DydxOracleAdapter = importFromOracles('DydxOracleAdapter'); -const EMAOracle = importFromOracles('EMAOracle'); -const FeedFactory = importFromOracles('FeedFactory'); -const HistoricalPriceFeed = importFromOracles('HistoricalPriceFeed'); -const TwoAssetRatioOracle = importFromOracles('TwoAssetRatioOracle'); -const LegacyMakerOracleAdapter = importFromOracles('LegacyMakerOracleAdapter'); -const LinearizedEMATimeSeriesFeed = importFromOracles('LinearizedEMATimeSeriesFeed'); -const LinearizedPriceDataSource = importFromOracles('LinearizedPriceDataSource'); -const Median = importFromOracles('Median'); -const MovingAverageOracle = importFromOracles('MovingAverageOracle'); -const MovingAverageOracleV1Proxy = importFromOracles('MovingAverageOracleV1Proxy'); -const MovingAverageOracleV2 = importFromOracles('MovingAverageOracleV2'); -const OracleProxy = importFromOracles('OracleProxy'); -const RSIOracle = importFromOracles('RSIOracle'); -const TimeSeriesFeed = importFromOracles('TimeSeriesFeed'); -const TwoAssetLinearizedTimeSeriesFeed = importFromOracles('TwoAssetLinearizedTimeSeriesFeed'); - -const { SetProtocolTestUtils: SetTestUtils, SetProtocolUtils: SetUtils } = setProtocolUtils; -const setTestUtils = new SetTestUtils(web3); -const setUtils = new SetUtils(web3); - - -export class OracleHelper { - private _contractOwnerAddress: Address; - private _blockchain: Blockchain; - - constructor(contractOwnerAddress: Address) { - this._contractOwnerAddress = contractOwnerAddress; - this._blockchain = new Blockchain(web3); - } - - /* ============ Deployment ============ */ - - public async deployFeedFactoryAsync( - from: Address = this._contractOwnerAddress - ): Promise { - const feedFactory = await FeedFactory.new(txnFrom(from)); - - return new FeedFactoryContract( - getContractInstance(feedFactory), - txnFrom(from), - ); - } - - public async deployPriceFeedAsync( - feedFactory: FeedFactoryContract, - from: Address = this._contractOwnerAddress - ): Promise { - const txHash = await feedFactory.create.sendTransactionAsync( - txnFrom(from), - ); - - const logs = await setTestUtils.getLogsFromTxHash(txHash); - const createLog = logs[logs.length - 1]; - const args: FeedCreatedArgs = createLog.args; - - return await PriceFeedContract.at( - args.feed, - web3, - txnFrom(from) - ); - } - - public async deployMedianizerAsync( - from: Address = this._contractOwnerAddress - ): Promise { - const medianizer = await Median.new(txnFrom(from)); - - return new MedianContract( - getContractInstance(medianizer), - txnFrom(from), - ); - } - - public async deployTimeSeriesFeedAsync( - dataSourceAddress: Address, - seededValues: BigNumber[], - updateInterval: BigNumber = ONE_DAY_IN_SECONDS, - maxDataPoints: BigNumber = new BigNumber(200), - dataDescription: string = '200DailyETHPrice', - from: Address = this._contractOwnerAddress - ): Promise { - const historicalPriceFeed = await TimeSeriesFeed.new( - updateInterval, - maxDataPoints, - dataSourceAddress, - dataDescription, - seededValues, - txnFrom(from), - ); - - return new TimeSeriesFeedContract( - getContractInstance(historicalPriceFeed), - txnFrom(from), - ); - } - - public async deployLinearizedPriceDataSourceAsync( - medianizerInstance: Address, - updateTolerance: BigNumber = ONE_DAY_IN_SECONDS, - dataDescription: string = '200DailyETHPrice', - from: Address = this._contractOwnerAddress - ): Promise { - const linearizedPriceDataSource = await LinearizedPriceDataSource.new( - updateTolerance, - medianizerInstance, - dataDescription, - txnFrom(from), - ); - - return new LinearizedPriceDataSourceContract( - getContractInstance(linearizedPriceDataSource), - txnFrom(from), - ); - } - - public async deployLinearizedEMATimeSeriesFeedAsync( - medianizerInstance: Address, - emaTimePeriod: BigNumber, - seededValues: BigNumber[], - interpolationThreshold: BigNumber = ONE_HOUR_IN_SECONDS.mul(3), - updateInterval: BigNumber = ONE_DAY_IN_SECONDS, - maxDataPoints: BigNumber = new BigNumber(200), - dataDescription: string = '200DailyETHPrice', - nextEarliestUpdate: BigNumber = SetTestUtils.generateTimestamp(updateInterval.toNumber() / 60), - from: Address = this._contractOwnerAddress - ): Promise { - const linearizedEMATimeSeriesFeed = await LinearizedEMATimeSeriesFeed.new( - updateInterval, - nextEarliestUpdate, - maxDataPoints, - seededValues, - emaTimePeriod, - interpolationThreshold, - medianizerInstance, - dataDescription, - txnFrom(from), - ); - - return new LinearizedEMATimeSeriesFeedContract( - getContractInstance(linearizedEMATimeSeriesFeed), - txnFrom(from), - ); - } - - public async deployHistoricalPriceFeedAsync( - updateFrequency: BigNumber, - medianizerAddress: Address, - dataDescription: string, - seededValues: BigNumber[], - from: Address = this._contractOwnerAddress - ): Promise { - const historicalPriceFeed = await HistoricalPriceFeed.new( - updateFrequency, - medianizerAddress, - dataDescription, - seededValues, - txnFrom(from), - ); - - return new HistoricalPriceFeedContract( - getContractInstance(historicalPriceFeed), - txnFrom(from), - ); - } - - public async deployTwoAssetLinearizedTimeSeriesFeedAsync( - baseMedianizerInstance: Address, - quoteMedianizerInstance: Address, - seededValues: BigNumber[], - interpolationThreshold: BigNumber = ONE_HOUR_IN_SECONDS.mul(3), - updateInterval: BigNumber = ONE_DAY_IN_SECONDS, - maxDataPoints: BigNumber = new BigNumber(200), - dataDescription: string = '200DailyETHBTCPrice', - nextEarliestUpdate: BigNumber = SetTestUtils.generateTimestamp(updateInterval.toNumber() / 60), - from: Address = this._contractOwnerAddress - ): Promise { - const twoAssetLinearizedTimeSeriesFeed = await TwoAssetLinearizedTimeSeriesFeed.new( - updateInterval, - nextEarliestUpdate, - maxDataPoints, - seededValues, - interpolationThreshold, - baseMedianizerInstance, - quoteMedianizerInstance, - dataDescription, - txnFrom(from), - ); - - return new TwoAssetLinearizedTimeSeriesFeedContract( - getContractInstance(twoAssetLinearizedTimeSeriesFeed), - txnFrom(from), - ); - } - - public async deployTwoAssetRatioOracleAsync( - baseMedianizerInstance: Address, - quoteMedianizerInstance: Address, - dataDescription: string, - from: Address = this._contractOwnerAddress - ): Promise { - const twoAssetRatioOracle = await TwoAssetRatioOracle.new( - baseMedianizerInstance, - quoteMedianizerInstance, - dataDescription, - txnFrom(from), - ); - - return new TwoAssetRatioOracleContract( - getContractInstance(twoAssetRatioOracle), - txnFrom(from), - ); - } - - public async deployMovingAverageOracleAsync( - priceFeedAddress: Address, - dataDescription: string, - from: Address = this._contractOwnerAddress - ): Promise { - const movingAverageOracle = await MovingAverageOracle.new( - priceFeedAddress, - dataDescription, - txnFrom(from), - ); - - return new MovingAverageOracleContract( - getContractInstance(movingAverageOracle), - txnFrom(from), - ); - } - - public async deployMovingAverageOracleV1ProxyAsync( - metaOracle: Address, - from: Address = this._contractOwnerAddress - ): Promise { - const movingAverageOracleProxy = await MovingAverageOracleV1Proxy.new( - metaOracle, - txnFrom(from), - ); - - return new MovingAverageOracleV1ProxyContract( - getContractInstance(movingAverageOracleProxy), - txnFrom(from), - ); - } - - public async deployMovingAverageOracleV2Async( - timeSeriesFeedAddress: Address, - dataDescription: string, - from: Address = this._contractOwnerAddress - ): Promise { - const movingAverageOracle = await MovingAverageOracleV2.new( - timeSeriesFeedAddress, - dataDescription, - txnFrom(from), - ); - - return new MovingAverageOracleV2Contract( - getContractInstance(movingAverageOracle), - txnFrom(from), - ); - } - - public async deployEMAOracleAsync( - timeSeriesFeedAddresses: Address[], - timeSeriesFeedDays: BigNumber[], - dataDescription: string = 'ETH Daily EMA', - from: Address = this._contractOwnerAddress - ): Promise { - const emaOracle = await EMAOracle.new( - timeSeriesFeedAddresses, - timeSeriesFeedDays, - dataDescription, - txnFrom(from), - ); - - return new EMAOracleContract( - getContractInstance(emaOracle), - txnFrom(from), - ); - } - - public async deployLegacyMakerOracleAdapterAsync( - medianizerAddress: Address, - from: Address = this._contractOwnerAddress - ): Promise { - const legacyMakerOracleAdapter = await LegacyMakerOracleAdapter.new( - medianizerAddress, - txnFrom(from), - ); - - return new LegacyMakerOracleAdapterContract( - getContractInstance(legacyMakerOracleAdapter), - txnFrom(from), - ); - } - - public async deployOracleProxyAsync( - oracleAddress: Address, - from: Address = this._contractOwnerAddress - ): Promise { - const oracleProxy = await OracleProxy.new( - oracleAddress, - txnFrom(from), - ); - - return new OracleProxyContract( - getContractInstance(oracleProxy), - txnFrom(from), - ); - } - - public async deployConstantPriceOracleAsync( - constantPrice: BigNumber, - from: Address = this._contractOwnerAddress - ): Promise { - const oracle = await ConstantPriceOracle.new( - constantPrice, - txnFrom(from), - ); - - return new ConstantPriceOracleContract( - getContractInstance(oracle), - txnFrom(from), - ); - } - - public async deployRSIOracleAsync( - timeSeriesFeedAddress: Address, - dataDescription: string, - from: Address = this._contractOwnerAddress - ): Promise { - const rsiOracle = await RSIOracle.new( - timeSeriesFeedAddress, - dataDescription, - txnFrom(from), - ); - - return new RSIOracleContract( - getContractInstance(rsiOracle), - txnFrom(from), - ); - } - - public async deployCTokenOracleAsync( - cToken: Address, - underlyingOracle: Address, - cTokenFullUnit: BigNumber, - underlyingFullUnit: BigNumber, - dataDescription: string = 'CToken', - from: Address = this._contractOwnerAddress - ): Promise { - const cTokenOracle = await CTokenOracle.new( - cToken, - underlyingOracle, - cTokenFullUnit, - underlyingFullUnit, - dataDescription, - txnFrom(from), - ); - - return new CTokenOracleContract( - getContractInstance(cTokenOracle), - txnFrom(from), - ); - } - - public async deployDydxOracleAdapterAsync( - dydxPriceOracleAddress: Address, - erc20TokenAddress: Address, - from: Address = this._contractOwnerAddress - ): Promise { - const dydxOracleAdapter = await DydxOracleAdapter.new( - dydxPriceOracleAddress, - erc20TokenAddress, - txnFrom(from), - ); - - return new DydxOracleAdapterContract( - getContractInstance(dydxOracleAdapter), - txnFrom(from), - ); - } - - public async deployDydxConstantPriceOracleMockAsync( - oracleValue: BigNumber, - from: Address = this._contractOwnerAddress - ): Promise { - const dydxConstantPriceOracleMock = await DydxConstantPriceOracleMock.new( - oracleValue, - txnFrom(from), - ); - - return new DydxConstantPriceOracleMockContract( - getContractInstance(dydxConstantPriceOracleMock), - txnFrom(from), - ); - } - - /* ============ Transactions ============ */ - - public async addPriceFeedOwnerToMedianizer( - medianizer: MedianContract, - priceFeedSigner: Address, - from: Address = this._contractOwnerAddress - ): Promise { - return await medianizer.lift.sendTransactionAsync( - priceFeedSigner, - txnFrom(from), - ); - } - - public async addAuthorizedAddressesToOracleProxy( - oracleProxy: OracleProxyContract, - authorizedAddresses: Address[], - from: Address = this._contractOwnerAddress - ): Promise { - let i: number; - for (i = 0; i < authorizedAddresses.length; i++) { - await oracleProxy.addAuthorizedAddress.sendTransactionAsync( - authorizedAddresses[i], - txnFrom(from), - ); - } - } - - public async setMedianizerMinimumQuorumAsync( - medianizer: MedianContract, - minimum: number, - from: Address = this._contractOwnerAddress - ): Promise { - return await medianizer.setMin.sendTransactionAsync( - new BigNumber(minimum), - txnFrom(from), - ); - } - - public async updatePriceFeedAsync( - priceFeed: PriceFeedContract, - price: BigNumber, - timeStamp: BigNumber, - from: Address = this._contractOwnerAddress - ): Promise { - return await priceFeed.poke.sendTransactionAsync( - price, - timeStamp, - txnFrom(from), - ); - } - - /* - This is disconnected from the v1 system where price feeds are updated first and then - the medianizer reads from each price feed to determine the median. In the new system, - The oracles are off chain, sign their price updates, and then send them all to the medianizer - which now expects N (new prices, timestamps, signatures) - - Makes a number of assumptions: - 1. Price update is signed by ownerAccount - 2. Only one price is used to update the price - 3. Only one timestmap is used to update the timestamp - 4. Quorum on price feed is 1 - 4. OwnerAccount is added as approved oracle on medianizer - */ - public async updateMedianizerPriceAsync( - medianizer: MedianContract, - price: BigNumber, - timestamp: BigNumber, - from: Address = this._contractOwnerAddress - ): Promise { - const standardSignature = SetUtils.hashPriceFeedHex(price, timestamp); - const ecSignature = await setUtils.signMessage(standardSignature, from); - - return await medianizer.poke.sendTransactionAsync( - [price], - [timestamp], - [new BigNumber(ecSignature.v)], - [ecSignature.r], - [ecSignature.s], - txnFrom(from) - ); - } - - public async updateTimeSeriesFeedAsync( - timeSeriesFeed: TimeSeriesFeedContract | TimeSeriesFeedV2Contract, - medianizer: MedianContract, - price: BigNumber, - timestamp: number = ONE_DAY_IN_SECONDS.mul(2).toNumber(), - from: Address = this._contractOwnerAddress - ): Promise { - await this._blockchain.increaseTimeAsync(ONE_DAY_IN_SECONDS); - await this.updateMedianizerPriceAsync( - medianizer, - price, - SetTestUtils.generateTimestamp(timestamp), - ); - - await timeSeriesFeed.poke.sendTransactionAsync( - { gas: DEFAULT_GAS}, - ); - } - - public async batchUpdateTimeSeriesFeedAsync( - timeSeriesFeed: TimeSeriesFeedContract | TimeSeriesFeedV2Contract, - medianizer: MedianContract, - daysOfData: number, - priceArray: BigNumber[] = undefined, - from: Address = this._contractOwnerAddress - ): Promise { - - if (!priceArray) { - priceArray = Array.from({length: daysOfData}, () => ether(Math.floor(Math.random() * 100) + 100)); - } - - let i: number; - for (i = 0; i < priceArray.length; i++) { - await this.updateTimeSeriesFeedAsync( - timeSeriesFeed, - medianizer, - priceArray[i], - ONE_DAY_IN_SECONDS.mul(2 * i + 2).toNumber() - ); - } - - return priceArray; - } - - public async updateTwoAssetTimeSeriesFeedAsync( - timeSeriesFeed: TimeSeriesFeedContract | TimeSeriesFeedV2Contract, - baseMedianizer: MedianContract, - quoteMedianizer: MedianContract, - basePrice: BigNumber, - quotePrice: BigNumber, - timestamp: number = ONE_DAY_IN_SECONDS.mul(2).toNumber(), - from: Address = this._contractOwnerAddress - ): Promise { - await this._blockchain.increaseTimeAsync(ONE_DAY_IN_SECONDS); - await this.updateMedianizerPriceAsync( - baseMedianizer, - basePrice, - SetTestUtils.generateTimestamp(timestamp), - ); - await this.updateMedianizerPriceAsync( - quoteMedianizer, - quotePrice, - SetTestUtils.generateTimestamp(timestamp), - ); - - await timeSeriesFeed.poke.sendTransactionAsync( - { gas: DEFAULT_GAS}, - ); - } - - public async batchUpdateTwoAssetTimeSeriesFeedAsync( - timeSeriesFeed: TimeSeriesFeedContract | TimeSeriesFeedV2Contract, - baseMedianizer: MedianContract, - quoteMedianizer: MedianContract, - daysOfData: number, - basePriceArray: BigNumber[] = undefined, - quotePriceArray: BigNumber[] = undefined, - from: Address = this._contractOwnerAddress - ): Promise { - - if (!basePriceArray) { - basePriceArray = Array.from({length: daysOfData}, () => ether(Math.floor(Math.random() * 100) + 100)); - } - if (!quotePriceArray) { - quotePriceArray = Array.from({length: daysOfData}, () => ether(Math.floor(Math.random() * 1000) + 8000)); - } - - let i: number; - const baseQuotePriceArray = []; - for (i = 0; i < daysOfData; i++) { - // Create ratio array - baseQuotePriceArray.push( - basePriceArray[i] - .mul(10 ** 18) - .div(quotePriceArray[i]) - .round(0, BigNumber.ROUND_DOWN) - ); - - await this.updateTwoAssetTimeSeriesFeedAsync( - timeSeriesFeed, - baseMedianizer, - quoteMedianizer, - basePriceArray[i], - quotePriceArray[i], - ONE_DAY_IN_SECONDS.mul(2 * i + 2).toNumber() - ); - } - return baseQuotePriceArray; - } - - public async updateHistoricalPriceFeedAsync( - dailyPriceFeed: HistoricalPriceFeedContract, - medianizer: MedianContract, - price: BigNumber, - from: Address = this._contractOwnerAddress - ): Promise { - await this._blockchain.increaseTimeAsync(ONE_DAY_IN_SECONDS); - - const lastBlock = await web3.eth.getBlock('latest'); - await this.updateMedianizerPriceAsync( - medianizer, - price, - lastBlock.timestamp + 1, - ); - - await dailyPriceFeed.poke.sendTransactionAsync( - { gas: DEFAULT_GAS}, - ); - } - - public async batchUpdateHistoricalPriceFeedAsync( - dailyPriceFeed: HistoricalPriceFeedContract, - medianizer: MedianContract, - daysOfData: number, - priceArray: BigNumber[] = undefined, - from: Address = this._contractOwnerAddress - ): Promise { - - if (!priceArray) { - priceArray = Array.from({length: daysOfData}, () => ether(Math.floor(Math.random() * 100) + 100)); - } - - let i: number; - for (i = 0; i < priceArray.length; i++) { - await this.updateHistoricalPriceFeedAsync( - dailyPriceFeed, - medianizer, - priceArray[i], - ); - } - - return priceArray; - } - - public batchCalculateEMA( - startEMAValue: BigNumber, - timePeriod: BigNumber, - assetPriceArray: BigNumber[] - ): BigNumber[] { - const emaValues: BigNumber[] = []; - let lastEMAValue: BigNumber = startEMAValue; - - for (let i = 0; i < assetPriceArray.length; i++) { - emaValues.push( - this.calculateEMA( - lastEMAValue, - timePeriod, - assetPriceArray[i] - ) - ); - lastEMAValue = emaValues[i]; - } - - return emaValues; - } - - /* - * The EMA formula is the following: - * - * Weighted Multiplier = 2 / (timePeriod + 1) - * - * EMA = Price(Today) x Weighted Multiplier + - * EMA(Yesterday) - - * EMA(Yesterday) x Weighted Multiplier - * - * Our implementation is simplified to the following for efficiency: - * - * EMA = (Price(Today) * 2 + EMA(Yesterday) * (timePeriod - 1)) / (timePeriod + 1) - * - */ - public calculateEMA( - previousEMAValue: BigNumber, - timePeriod: BigNumber, - currentAssetPrice: BigNumber - ): BigNumber { - const a = currentAssetPrice.mul(2); - const b = previousEMAValue.mul(timePeriod.minus(1)); - const c = timePeriod.plus(1); - - return a.plus(b).div(c).round(0, 3); - } - - /* - * Calculates the new relative strength index value using - * an array of prices. - * - * RSI = 100 − 100 / - * (1 + (Gain / Loss)) - * - * Price Difference = Price(N) - Price(N-1) where N is number of days - * Gain = Sum(Positive Price Difference) - * Loss = -1 * Sum(Negative Price Difference) - * - * - * Our implementation is simplified to the following for efficiency - * RSI = (100 * SUM(Gain)) / (SUM(Loss) + SUM(Gain) - */ - - public calculateRSI( - rsiDataArray: BigNumber[], - ): BigNumber { - let positiveDataSum = new BigNumber(0); - let negativeDataSum = new BigNumber(0); - - for (let i = 1; i < rsiDataArray.length; i++) { - if (rsiDataArray[i - 1].gte(rsiDataArray[i])) { - positiveDataSum = positiveDataSum.add(rsiDataArray[i - 1]).sub(rsiDataArray[i]); - } - else { - negativeDataSum = negativeDataSum.add(rsiDataArray[i]).sub(rsiDataArray[i - 1]); - } - } - - if (negativeDataSum.eq(0) && positiveDataSum.eq(0)) { - negativeDataSum = new BigNumber(1); - } - - const bigHundred = new BigNumber(100); - - const a = bigHundred.mul(positiveDataSum); - const b = positiveDataSum.add(negativeDataSum); - const c = a.div(b).round(0, BigNumber.ROUND_DOWN); - - return c; - } -} diff --git a/utils/web3Helper.ts b/utils/web3Helper.ts index 5935f4b..f5f67da 100644 --- a/utils/web3Helper.ts +++ b/utils/web3Helper.ts @@ -1,5 +1,7 @@ const Web3 = require('web3'); // import web3 v1.0 constructor const BigNumber = require('bignumber.js'); + +import { Address } from 'set-protocol-utils'; import { DEFAULT_GAS, NULL_ADDRESS } from './constants'; const contract = require('@truffle/contract'); @@ -39,6 +41,19 @@ export const blankTxn = async (from: string) => { }); }; +export const linkLibrariesToDeploy = async (contract: any, libraries: any[], from: Address) => { + contract.setNetwork(50); + + await Promise.all(libraries.map(async library => { + console.log(library.contractName); + const truffleLibrary = await library.new( + { from }, + ); + + await contract.link(library.contractName, truffleLibrary.address); + })); +}; + export const importFromOracles = (contractName: string) => { return importFromRepo('set-protocol-oracles', contractName); }; diff --git a/yarn.lock b/yarn.lock index 14df725..a19f06c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -293,12 +293,17 @@ dependencies: defer-to-connect "^1.0.1" +"@truffle/blockchain-utils@^0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.0.11.tgz#9886f4cb7a9f20deded4451ac78f8567ae5c0d75" + integrity sha512-9MyQ/20M96clhIcC7fVFIckGSB8qMsmcdU6iYt98HXJ9GOLNKsCaJFz1OVsJncVreYwTUhoEXTrVBc8zrmPDJQ== + "@truffle/blockchain-utils@^0.0.17": version "0.0.17" resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.0.17.tgz#a1ab0ec9a9c3cbc6ada769f606d6b07f8e515120" integrity sha512-SqvkHCn65QbRFlNpA3M91tqcV8dVMSEfOu3lfXrPozKJyTTtFg/A8WMvMMs79/Q8SJlUuJARjsXwQmo5V3V78A== -"@truffle/contract-schema@^3.0.23": +"@truffle/contract-schema@^3.0.14", "@truffle/contract-schema@^3.0.23": version "3.0.23" resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.0.23.tgz#5d869d9b10be23034c07c7dbf3c48542eabe63ef" integrity sha512-N4CaTMcZhOC44Vl6k2r/eua+ojUswl6mNlkVTVYMvWjfKa8GHKKClsZfkGO72aBrBzoTFsM6D75LvQIIRBy3fg== @@ -324,6 +329,11 @@ web3-eth-abi "1.2.1" web3-utils "1.2.1" +"@truffle/error@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.6.tgz#75d499845b4b3a40537889e7d04c663afcaee85d" + integrity sha512-QUM9ZWiwlXGixFGpV18g5I6vua6/r+ZV9W/5DQA5go9A3eZUNPHPaTKMIQPJLYn6+ZV5jg5H28zCHq56LHF3yA== + "@truffle/error@^0.0.8": version "0.0.8" resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.8.tgz#dc94ca36393403449d4b7461bf9452c241e53ec1" @@ -1263,7 +1273,7 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -cbor@^4.1.5: +cbor@^4.1.1, cbor@^4.1.5: version "4.3.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-4.3.0.tgz#0217c1cadd067d9112f44336dca07e72020bb804" integrity sha512-CvzaxQlaJVa88sdtTWvLJ++MbdtPHtZOBBNjm7h3YKUHILMs9nQyD4AC6hvFZy7GBVB3I6bRibJcxeHydyT2IQ== @@ -1273,6 +1283,14 @@ cbor@^4.1.5: json-text-sequence "^0.1" nofilter "^1.0.3" +cbor@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.0.1.tgz#243eea46b19c6e54ffb18fb07fa52c1c627a6f05" + integrity sha512-l4ghwqioCyuAaD3LvY4ONwv8NMuERz62xjbMHGdWBqERJPygVmoFER1b4+VS6iW0rXwoVGuKZPPPTofwWOg3YQ== + dependencies: + bignumber.js "^9.0.0" + nofilter "^1.0.3" + chai-as-promised@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" @@ -1305,6 +1323,29 @@ chai@^4.2.0: pathval "^1.1.0" type-detect "^4.0.5" +chainlink@^0.7.10: + version "0.7.10" + resolved "https://registry.yarnpkg.com/chainlink/-/chainlink-0.7.10.tgz#43d1d68ed8bedc1b5df5e2e92bf955bb1f696a53" + integrity sha512-uLuDqaDU6BrOImIzGiNSkFh011nOF+gkUPCpSt7q3UiNQJwiOErP7Xr16wJ0uW3YGz1u0YDlQK5TobCbzBUn+w== + dependencies: + cbor "^5.0.1" + chainlinkv0.5 "0.0.2" + ethers "^4.0.37" + link_token "^1.0.6" + openzeppelin-solidity "^1.12.0" + +chainlinkv0.5@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/chainlinkv0.5/-/chainlinkv0.5-0.0.2.tgz#b9263c71e927d96ea242bd7805917684daf8993c" + integrity sha512-K8v4YJoThpjsfFY+bxB5eHm3oBKEHb5kQTau8cLh+vJCU6SIAFGT9oifcLaQx1SLtQvlv62NKJcQqE19pj8k9Q== + dependencies: + bn.js "^4.11.0" + cbor "^4.1.1" + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.1.0" + truffle-contract "^4.0.31" + typescript "^3.7.0-beta" + chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -2386,6 +2427,14 @@ ethereumjs-abi@0.6.5, ethereumjs-abi@^0.6.4: bn.js "^4.10.0" ethereumjs-util "^4.3.0" +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd" @@ -2443,7 +2492,7 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2: safe-buffer "^5.1.1" secp256k1 "^3.0.1" -ethereumjs-util@^6.0.0: +ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0: version "6.2.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz#23ec79b2488a7d041242f01e25f24e5ad0357960" integrity sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ== @@ -2563,6 +2612,21 @@ ethers@^4.0.27: uuid "2.0.1" xmlhttprequest "1.8.0" +ethers@^4.0.37: + version "4.0.45" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.45.tgz#8d4cd764d7c7690836b583d4849203c225eb56e2" + integrity sha512-N/Wmc6Mw4pQO+Sss1HnKDCSS6KSCx0luoBMiPNq+1GbOaO3YaZOyplBEhj+NEoYsizZYODtkITg2oecPeNnidQ== + dependencies: + aes-js "3.0.0" + bn.js "^4.4.0" + elliptic "6.5.2" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.4" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" + ethjs-abi@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ethjs-abi/-/ethjs-abi-0.2.1.tgz#e0a7a93a7e81163a94477bad56ede524ab6de533" @@ -4378,6 +4442,11 @@ libnpmconfig@^1.2.1: find-up "^3.0.0" ini "^1.3.5" +link_token@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/link_token/-/link_token-1.0.6.tgz#98c5a1f53d4e22d7b0d5f80c5051702e7dc3b436" + integrity sha512-WI6n2Ri9kWQFsFYPTnLvU+Y3DT87he55uqLLX/sAwCVkGTXI/wionGEHAoWU33y8RepWlh46y+RD+DAz5Wmejg== + lint-staged@^7.2.0: version "7.2.2" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-7.2.2.tgz#0983d55d497f19f36d11ff2c8242b2f56cc2dd05" @@ -5360,6 +5429,11 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +openzeppelin-solidity@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/openzeppelin-solidity/-/openzeppelin-solidity-1.12.0.tgz#7b9c55975e73370d4541e3442b30cb3d91ac973a" + integrity sha512-WlorzMXIIurugiSdw121RVD5qA3EfSI7GybTn+/Du0mPNgairjt29NpVTAaH8eLjAeAwlw46y7uQKy0NYem/gA== + openzeppelin-solidity@^2.2: version "2.2.0" resolved "https://registry.yarnpkg.com/openzeppelin-solidity/-/openzeppelin-solidity-2.2.0.tgz#1f0e857f53bda29b77a8e72f9a629db81015fd34" @@ -6525,6 +6599,62 @@ set-protocol-contracts@^1.3.13-beta: web3-utils "1.0.0-beta.36" zos-lib "^2.4.2" +set-protocol-contracts@^1.3.32-beta: + version "1.3.32-beta" + resolved "https://registry.yarnpkg.com/set-protocol-contracts/-/set-protocol-contracts-1.3.32-beta.tgz#005bd41363c3be65397ebeaa3ac7faae247379ff" + integrity sha512-+d+nW+c1XuBB8pXKc3PpxTFQEic22pPcBcderJQynaw304KASqj3Vlg+nUU5Q6786mr5Cplfe9TaQGBcykiMPg== + dependencies: + bn-chai "^1.0.1" + canonical-weth "^1.3.1" + dotenv "^6.2.0" + eth-gas-reporter "^0.1.10" + ethlint "^1.2.3" + expect "^24.1.0" + fs-extra "^5.0.0" + husky "^0.14.3" + lint-staged "^7.2.0" + module-alias "^2.1.0" + openzeppelin-solidity "^2.2" + set-protocol-oracles "^1.0.1" + set-protocol-strategies "^1.1.24" + set-protocol-utils "^1.0.0-beta.44" + tiny-promisify "^1.0.0" + truffle-flattener "^1.4.0" + ts-mocha "^6.0.0" + ts-node "^8.0.2" + tslint-eslint-rules "^5.3.1" + web3 "1.0.0-beta.36" + web3-utils "1.0.0-beta.36" + zos-lib "^2.4.2" + +set-protocol-contracts@^1.3.34-beta: + version "1.3.34-beta" + resolved "https://registry.yarnpkg.com/set-protocol-contracts/-/set-protocol-contracts-1.3.34-beta.tgz#654a330d6734b5fb1992279b0cfbc52ca0b1d445" + integrity sha512-xKHBgIJDtUw5WUCmdl666hCgBQpumNBdVJPLFunvdXIATi8jI69IQTN5vDiSO8wO6tizcm08rzR4WCHU5hF2MA== + dependencies: + bn-chai "^1.0.1" + canonical-weth "^1.3.1" + dotenv "^6.2.0" + eth-gas-reporter "^0.1.10" + ethlint "^1.2.3" + expect "^24.1.0" + fs-extra "^5.0.0" + husky "^0.14.3" + lint-staged "^7.2.0" + module-alias "^2.1.0" + openzeppelin-solidity "^2.2" + set-protocol-oracles "^1.0.5" + set-protocol-strategies "^1.1.24" + set-protocol-utils "^1.0.0-beta.44" + tiny-promisify "^1.0.0" + truffle-flattener "^1.4.0" + ts-mocha "^6.0.0" + ts-node "^8.0.2" + tslint-eslint-rules "^5.3.1" + web3 "1.0.0-beta.36" + web3-utils "1.0.0-beta.36" + zos-lib "^2.4.2" + set-protocol-contracts@^1.3.8-beta: version "1.3.8-beta" resolved "https://registry.yarnpkg.com/set-protocol-contracts/-/set-protocol-contracts-1.3.8-beta.tgz#a632c07fbb8ed9ee74e9627805dc9abcec7f2f4f" @@ -6578,6 +6708,33 @@ set-protocol-oracles@^1.0.1: web3 "1.0.0-beta.36" web3-utils "1.0.0-beta.36" +set-protocol-oracles@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/set-protocol-oracles/-/set-protocol-oracles-1.0.5.tgz#611e648c8a538b360b25e3450a062d61fd0a3fa4" + integrity sha512-t+Axb07DH7JBzHvtR52LuJlSYxu4rVM+CZwZApIXu69D+fJg8Y0PfGaRI0MiXZ2Fr+X18Q/Jcq1P0kuHeuvC3g== + dependencies: + bn-chai "^1.0.1" + canonical-weth "^1.3.1" + chainlink "^0.7.10" + dotenv "^6.2.0" + eth-gas-reporter "^0.1.10" + ethlint "^1.2.3" + expect "^24.1.0" + fs-extra "^5.0.0" + husky "^0.14.3" + lint-staged "^7.2.0" + module-alias "^2.1.0" + openzeppelin-solidity "^2.2" + set-protocol-contracts "^1.3.32-beta" + set-protocol-utils "^1.0.0-beta.45" + tiny-promisify "^1.0.0" + truffle-flattener "^1.4.2" + ts-mocha "^6.0.0" + ts-node "^8.0.2" + tslint-eslint-rules "^5.3.1" + web3 "1.0.0-beta.36" + web3-utils "1.0.0-beta.36" + set-protocol-strategies@^1.1.22: version "1.1.23" resolved "https://registry.yarnpkg.com/set-protocol-strategies/-/set-protocol-strategies-1.1.23.tgz#5180326c3f7ead937d55f3c9293b92d2bc402842" @@ -6604,6 +6761,32 @@ set-protocol-strategies@^1.1.22: web3 "1.0.0-beta.36" web3-utils "1.0.0-beta.36" +set-protocol-strategies@^1.1.24: + version "1.1.26" + resolved "https://registry.yarnpkg.com/set-protocol-strategies/-/set-protocol-strategies-1.1.26.tgz#82f3758dec6bf8ce3ed99ba72674ac94910669b8" + integrity sha512-J/qnincwg6uxviq0WNNf2TdchAyYDlLzIep41+328rROXTy6GuMEs8WORAQKlkGQGaaOJ5Xp4r/8bz6FF1cVOQ== + dependencies: + bn-chai "^1.0.1" + canonical-weth "^1.3.1" + dotenv "^6.2.0" + eth-gas-reporter "^0.1.10" + ethlint "^1.2.3" + expect "^24.1.0" + fs-extra "^5.0.0" + husky "^0.14.3" + lint-staged "^7.2.0" + module-alias "^2.1.0" + openzeppelin-solidity "^2.2" + set-protocol-contracts "^1.3.13-beta" + set-protocol-utils "^1.0.0-beta.45" + tiny-promisify "^1.0.0" + truffle-flattener "^1.4.2" + ts-mocha "^6.0.0" + ts-node "^8.0.2" + tslint-eslint-rules "^5.3.1" + web3 "1.0.0-beta.36" + web3-utils "1.0.0-beta.36" + set-protocol-strategies@^1.1.7: version "1.1.16" resolved "https://registry.yarnpkg.com/set-protocol-strategies/-/set-protocol-strategies-1.1.16.tgz#1c071c86951debc881d4af9059830285538ea2f7" @@ -7465,6 +7648,22 @@ trim@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" +truffle-contract@^4.0.31: + version "4.0.31" + resolved "https://registry.yarnpkg.com/truffle-contract/-/truffle-contract-4.0.31.tgz#e43b7f648e2db352c857d1202d710029b107b68d" + integrity sha512-u3q+p1wiX5C2GpnluGx/d2iaJk7bcWshk2/TohiJyA2iQiTfkS7M4n9D9tY3JqpXR8PmD/TrA69RylO0RhITFA== + dependencies: + "@truffle/blockchain-utils" "^0.0.11" + "@truffle/contract-schema" "^3.0.14" + "@truffle/error" "^0.0.6" + bignumber.js "^7.2.1" + ethers "^4.0.0-beta.1" + truffle-interface-adapter "^0.2.5" + web3 "1.2.1" + web3-core-promievent "1.2.1" + web3-eth-abi "1.2.1" + web3-utils "1.2.1" + truffle-flattener@^1.4.0, truffle-flattener@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/truffle-flattener/-/truffle-flattener-1.4.2.tgz#7460d0eec88ac67b150e8de3476f55d4420a4ba0" @@ -7476,6 +7675,16 @@ truffle-flattener@^1.4.0, truffle-flattener@^1.4.2: solidity-parser-antlr "^0.4.11" tsort "0.0.1" +truffle-interface-adapter@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/truffle-interface-adapter/-/truffle-interface-adapter-0.2.5.tgz#aa0bee635517b4a8e06adcdc99eacb993e68c243" + integrity sha512-EL39OpP8FcZ99ne1Rno3jImfb92Nectd4iVsZzoEUCBfbwHe7sr0k+i45guoruSoP8nMUE81Mov2s8I5pi6d9Q== + dependencies: + bn.js "^4.11.8" + ethers "^4.0.32" + lodash "^4.17.13" + web3 "1.2.1" + truffle@^5.0.37: version "5.1.13" resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.1.13.tgz#f0a071342616f23a52bceaedae4feaec0bc4d549" @@ -7652,6 +7861,11 @@ typescript@^3.3.1: version "3.3.3333" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3333.tgz#171b2c5af66c59e9431199117a3bcadc66fdcfd6" +typescript@^3.7.0-beta: + version "3.8.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.2.tgz#91d6868aaead7da74f493c553aeff76c0c0b1d5a" + integrity sha512-EgOVgL/4xfVrCMbhYKUQTdF37SQn4Iw73H5BgCrF1Abdun7Kwy/QZsE/ssAy0y4LxBbvua3PIbFsbRczWWnDdQ== + uglify-js@^3.1.4: version "3.6.7" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.7.tgz#15f49211df6b8a01ee91322bbe46fa33223175dc" From fb8c782b60ccc69696dc67b61c2f4146af627f39 Mon Sep 17 00:00:00 2001 From: bweick Date: Wed, 4 Mar 2020 07:22:01 -0800 Subject: [PATCH 2/3] Bump to new contracts version. --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index bcdb25a..4ca9b3f 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "lint-staged": "^7.2.0", "module-alias": "^2.1.0", "openzeppelin-solidity": "^2.2", - "set-protocol-contracts": "^1.3.34-beta", + "set-protocol-contracts": "^1.3.35-beta", "set-protocol-oracles": "^1.0.5", "set-protocol-utils": "^1.0.0-beta.45", "tiny-promisify": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index a19f06c..7659b08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6627,10 +6627,10 @@ set-protocol-contracts@^1.3.32-beta: web3-utils "1.0.0-beta.36" zos-lib "^2.4.2" -set-protocol-contracts@^1.3.34-beta: - version "1.3.34-beta" - resolved "https://registry.yarnpkg.com/set-protocol-contracts/-/set-protocol-contracts-1.3.34-beta.tgz#654a330d6734b5fb1992279b0cfbc52ca0b1d445" - integrity sha512-xKHBgIJDtUw5WUCmdl666hCgBQpumNBdVJPLFunvdXIATi8jI69IQTN5vDiSO8wO6tizcm08rzR4WCHU5hF2MA== +set-protocol-contracts@^1.3.35-beta: + version "1.3.35-beta" + resolved "https://registry.yarnpkg.com/set-protocol-contracts/-/set-protocol-contracts-1.3.35-beta.tgz#add84c5a5b8c2e4cf188ff3be0fc389ccb21c080" + integrity sha512-+lznquqxAXQ9hvWMrSdbel26/zH4MblPwaUeKeiHlcmOWJKvvCZ8MCz87HPYnz+l7MqhuVcjELtoXRRr1vW02w== dependencies: bn-chai "^1.0.1" canonical-weth "^1.3.1" From 800d12e4f16c85cd0bf17d2c82dda667d213435b Mon Sep 17 00:00:00 2001 From: bweick Date: Wed, 4 Mar 2020 11:57:31 -0800 Subject: [PATCH 3/3] Use helpers from contracts for deploys. --- .../allocators/socialAllocator.spec.ts | 6 +- .../managers/socialTradingManager.spec.ts | 36 ++++-- utils/helpers/protocolHelper.ts | 117 +----------------- 3 files changed, 34 insertions(+), 125 deletions(-) diff --git a/test/contracts/managers/allocators/socialAllocator.spec.ts b/test/contracts/managers/allocators/socialAllocator.spec.ts index eae6d09..29e7e34 100644 --- a/test/contracts/managers/allocators/socialAllocator.spec.ts +++ b/test/contracts/managers/allocators/socialAllocator.spec.ts @@ -43,9 +43,10 @@ import { expectRevertError } from '@utils/tokenAssertions'; import { extractNewSetTokenAddressFromLogs } from '@utils/contract_logs/core'; import { getWeb3 } from '@utils/web3Helper'; +import { CoreHelper } from 'set-protocol-contracts'; +import { OracleHelper } from 'set-protocol-oracles'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; import { ManagerHelper } from '@utils/helpers/managerHelper'; -import { OracleHelper } from 'set-protocol-oracles'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; BigNumberSetup.configure(); @@ -90,6 +91,7 @@ contract('SocialAllocator', accounts => { const erc20Helper = new ERC20Helper(deployerAccount); const managerHelper = new ManagerHelper(deployerAccount); const oracleHelper = new OracleHelper(deployerAccount); + const coreHelper = new CoreHelper(deployerAccount, deployerAccount); before(async () => { ABIDecoder.addABI(Core.abi); @@ -158,7 +160,7 @@ contract('SocialAllocator', accounts => { btcLegacyMakerOracleAdapter.address, ); - oracleWhiteList = await protocolHelper.deployOracleWhiteListAsync( + oracleWhiteList = await coreHelper.deployOracleWhiteListAsync( [wrappedETH.address, wrappedBTC.address, usdcMock.address], [ethOracleProxy.address, btcOracleProxy.address, usdcOracle.address], ); diff --git a/test/contracts/managers/socialTradingManager.spec.ts b/test/contracts/managers/socialTradingManager.spec.ts index 659b33a..8d90f19 100644 --- a/test/contracts/managers/socialTradingManager.spec.ts +++ b/test/contracts/managers/socialTradingManager.spec.ts @@ -41,7 +41,8 @@ import { ONE_DAY_IN_SECONDS, UNLIMITED_ALLOWANCE_IN_BASE_UNITS, WBTC_DECIMALS, - ZERO + ZERO, + ONE_HOUR_IN_SECONDS } from '@utils/constants'; import { expectRevertError } from '@utils/tokenAssertions'; @@ -53,9 +54,16 @@ import { } from '@utils/contract_logs/socialTradingManager'; import { getWeb3 } from '@utils/web3Helper'; +import { + CoreHelper, + FeeCalculatorHelper, + LiquidatorHelper, + ValuationHelper +} from 'set-protocol-contracts'; +import { ERC20Helper as ERC20Contracts } from 'set-protocol-contracts'; +import { OracleHelper } from 'set-protocol-oracles'; import { ERC20Helper } from '@utils/helpers/erc20Helper'; import { ManagerHelper } from '@utils/helpers/managerHelper'; -import { OracleHelper } from 'set-protocol-oracles'; import { ProtocolHelper } from '@utils/helpers/protocolHelper'; BigNumberSetup.configure(); @@ -113,6 +121,12 @@ contract('SocialTradingManager', accounts => { const managerHelper = new ManagerHelper(deployerAccount); const oracleHelper = new OracleHelper(deployerAccount); + const coreHelper = new CoreHelper(deployerAccount, deployerAccount); + const feeCalculatorHelper = new FeeCalculatorHelper(deployerAccount); + const ercContracts = new ERC20Contracts(deployerAccount); + const valuationHelper = new ValuationHelper(deployerAccount, coreHelper, ercContracts, oracleHelper); + const liquidatorHelper = new LiquidatorHelper(deployerAccount, ercContracts, valuationHelper); + before(async () => { ABIDecoder.addABI(Core.abi); ABIDecoder.addABI(SocialTradingManager.abi); @@ -174,21 +188,25 @@ contract('SocialTradingManager', accounts => { btcLegacyMakerOracleAdapter.address, ); - oracleWhiteList = await protocolHelper.deployOracleWhiteListAsync( + oracleWhiteList = await coreHelper.deployOracleWhiteListAsync( [wrappedETH.address, wrappedBTC.address], [ethOracleProxy.address, btcOracleProxy.address], ); - liquidator = await protocolHelper.deployLinearLiquidatorAsync( + liquidator = await liquidatorHelper.deployLinearAuctionLiquidatorAsync( core.address, - oracleWhiteList.address + oracleWhiteList.address, + ONE_HOUR_IN_SECONDS.mul(4), + new BigNumber(3), + new BigNumber(21), + 'LinearAuctionLiquidator' ); - liquidatorWhiteList = await protocolHelper.deployWhiteListAsync([liquidator.address, newLiquidator]); + liquidatorWhiteList = await coreHelper.deployWhiteListAsync([liquidator.address, newLiquidator]); - feeCalculator = await protocolHelper.deployFixedFeeCalculatorAsync(); - feeCalculatorWhiteList = await protocolHelper.deployWhiteListAsync([feeCalculator.address]); + feeCalculator = await feeCalculatorHelper.deployFixedFeeCalculatorAsync(); + feeCalculatorWhiteList = await coreHelper.deployWhiteListAsync([feeCalculator.address]); - rebalancingFactory = await protocolHelper.deployRebalancingSetTokenV2FactoryAsync( + rebalancingFactory = await coreHelper.deployRebalancingSetTokenV2FactoryAsync( core.address, rebalancingComponentWhiteList.address, liquidatorWhiteList.address, diff --git a/utils/helpers/protocolHelper.ts b/utils/helpers/protocolHelper.ts index 791a421..8bab2f1 100644 --- a/utils/helpers/protocolHelper.ts +++ b/utils/helpers/protocolHelper.ts @@ -5,11 +5,8 @@ import { Address } from 'set-protocol-utils'; import { Core, CoreContract, - FixedFeeCalculatorContract, - LinearAuctionLiquidatorContract, LinearAuctionPriceCurve, LinearAuctionPriceCurveContract, - OracleWhiteListContract, RebalanceAuctionModule, RebalanceAuctionModuleContract, RebalancingSetTokenContract, @@ -17,7 +14,6 @@ import { RebalancingSetTokenV2Contract, RebalancingSetTokenFactory, RebalancingSetTokenFactoryContract, - RebalancingSetTokenV2FactoryContract, SetToken, SetTokenContract, SetTokenFactory, @@ -38,13 +34,11 @@ import { BigNumber } from 'bignumber.js'; import { DEFAULT_GAS, DEFAULT_UNIT_SHARES, - DEFAULT_REBALANCING_MAXIMUM_NATURAL_UNIT, - DEFAULT_REBALANCING_MINIMUM_NATURAL_UNIT, DEFAULT_REBALANCING_NATURAL_UNIT, ONE_DAY_IN_SECONDS, } from '../constants'; import { extractNewSetTokenAddressFromLogs } from '../contract_logs/core'; -import { getWeb3, getContractInstance, importFromContracts, txnFrom } from '../web3Helper'; +import { getWeb3, importFromContracts } from '../web3Helper'; import { getDeployedAddress } from '../snapshotUtils'; const web3 = getWeb3(); @@ -52,10 +46,6 @@ const web3 = getWeb3(); const { SetProtocolTestUtils: SetTestUtils, SetProtocolUtils: SetUtils } = setProtocolUtils; const setTestUtils = new SetTestUtils(web3); -const FixedFeeCalculator = importFromContracts('FixedFeeCalculator'); -const LinearAuctionLiquidator = importFromContracts('LinearAuctionLiquidator'); -const OracleWhiteList = importFromContracts('OracleWhiteList'); -const RebalancingSetTokenV2Factory = importFromContracts('RebalancingSetTokenV2Factory'); const WhiteList = importFromContracts('WhiteList'); export class ProtocolHelper { @@ -70,13 +60,13 @@ export class ProtocolHelper { public async getDeployedTransferProxyAsync(): Promise { const address = await getDeployedAddress(TransferProxy.contractName); - return await TransferProxyContract.at(address, web3, {}); + return await TransferProxyContract.at(address, web3, {}); } public async getDeployedVaultAsync(): Promise { const address = await getDeployedAddress(Vault.contractName); - return await VaultContract.at(address, web3, {}); + return await VaultContract.at(address, web3, {}); } public async getDeployedSetTokenFactoryAsync(): Promise { @@ -151,109 +141,8 @@ export class ProtocolHelper { return await StandardTokenMockContract.at(address, web3, {}); } - public async deployWhiteListAsync( - initialAddresses: Address[] = [], - from: Address = this._tokenOwnerAddress - ): Promise { - const whiteList = await WhiteList.new( - initialAddresses, - txnFrom(from), - ); - - return new WhiteListContract( - getContractInstance(whiteList), - txnFrom(from), - ); - } - - public async deployOracleWhiteListAsync( - initialTokenAddresses: Address[] = [], - initialOracleAddresses: Address[] = [], - from: Address = this._tokenOwnerAddress - ): Promise { - const oracleWhiteList = await OracleWhiteList.new( - initialTokenAddresses, - initialOracleAddresses, - txnFrom(from), - ); - - return new OracleWhiteListContract( - getContractInstance(oracleWhiteList), - txnFrom(from), - ); - } - - public async deployLinearLiquidatorAsync( - core: Address, - oracleWhiteList: Address, - auctionPeriod: BigNumber = ONE_DAY_IN_SECONDS.div(6), - rangeStart: BigNumber = new BigNumber(10), - rangeEnd: BigNumber = new BigNumber(10), - name: string = 'Liquidator', - from: Address = this._tokenOwnerAddress - ): Promise { - const linearLiquidator = await LinearAuctionLiquidator.new( - core, - oracleWhiteList, - auctionPeriod.toString(), - rangeStart.toString(), - rangeEnd.toString(), - name, - txnFrom(from), - ); - - return new LinearAuctionLiquidatorContract( - getContractInstance(linearLiquidator), - txnFrom(from), - ); - } - - public async deployFixedFeeCalculatorAsync( - from: Address = this._tokenOwnerAddress - ): Promise { - const feeCalculator = await FixedFeeCalculator.new( - txnFrom(from), - ); - - return new FixedFeeCalculatorContract( - getContractInstance(feeCalculator), - txnFrom(from), - ); - } - /* ============ CoreFactory Extension ============ */ - public async deployRebalancingSetTokenV2FactoryAsync( - coreAddress: Address, - componentWhitelistAddress: Address, - liquidatorWhitelistAddress: Address, - rebalanceFeeWhiteListAddress: Address, - minimumRebalanceInterval: BigNumber = ONE_DAY_IN_SECONDS, - minimumFailRebalancePeriod: BigNumber = ONE_DAY_IN_SECONDS, - maximumFailRebalancePeriod: BigNumber = ONE_DAY_IN_SECONDS.mul(30), - minimumNaturalUnit: BigNumber = DEFAULT_REBALANCING_MINIMUM_NATURAL_UNIT, - maximumNaturalUnit: BigNumber = DEFAULT_REBALANCING_MAXIMUM_NATURAL_UNIT, - from: Address = this._tokenOwnerAddress - ): Promise { - const factory = await RebalancingSetTokenV2Factory.new( - coreAddress, - componentWhitelistAddress, - liquidatorWhitelistAddress, - rebalanceFeeWhiteListAddress, - minimumRebalanceInterval.toString(), - minimumFailRebalancePeriod.toString(), - maximumFailRebalancePeriod.toString(), - minimumNaturalUnit.toString(), - maximumNaturalUnit.toString(), - txnFrom(from), - ); - - return new RebalancingSetTokenV2FactoryContract( - getContractInstance(factory), - txnFrom(from), - ); - } - public async createSetTokenAsync( core: CoreContract, factory: Address,