Skip to content

Commit

Permalink
Merge pull request #221 from yieldprotocol/feat/newLadle
Browse files Browse the repository at this point in the history
Integrating new ladle
  • Loading branch information
brucedonovan authored Aug 25, 2021
2 parents caa5edd + 5e3733d commit d7bd0ed
Show file tree
Hide file tree
Showing 52 changed files with 6,292 additions and 21,951 deletions.
20,260 changes: 0 additions & 20,260 deletions package-lock.json

This file was deleted.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "app-v2",
"version": "0.8.4",
"version": "0.9.0",
"private": true,
"dependencies": {
"@multiavatar/multiavatar": "^1.0.6",
Expand Down
4 changes: 0 additions & 4 deletions src/components/ActiveTransaction.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,6 @@ const ActiveTransaction = ({
const [sig, setSig] = useState<any>();
const [iconSize, setIconSize] = useState<string>('1em');

useEffect(() => {
console.log('HERE', tx);
}, [tx]);

useEffect(() => {
tx.txCode && setSig(signatures.get(tx.txCode));
}, [tx, signatures]);
Expand Down
2 changes: 1 addition & 1 deletion src/components/YieldApr.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import React, { useContext, useEffect, useState } from 'react';
import Loader from 'react-spinners/GridLoader';
import styled from 'styled-components';
import { UserContext } from '../contexts/UserContext';
import { useApr } from '../hooks/aprHook';
import { useApr } from '../hooks/useApr';
import { ActionType, ISeries, IUserContext } from '../types';
import { cleanValue } from '../utils/appUtils';
import { buyBase, calculateAPR, secondsToFrom, sellBase } from '../utils/yieldMath';
Expand Down
2 changes: 1 addition & 1 deletion src/components/YieldFooter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Text, Box, Button, ResponsiveContext, Footer, Collapsible, Select, Laye
import { toast } from 'react-toastify';
import { ChainContext } from '../contexts/ChainContext';

import { useTimeTravel } from '../hooks/timeTravel';
import { useTimeTravel } from '../hooks/useTimeTravel';
import { UserContext } from '../contexts/UserContext';
import { ApprovalType, IAsset } from '../types';

Expand Down
2 changes: 1 addition & 1 deletion src/components/selectors/AssetSelector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ function AssetSelector({ selectCollateral }: IAssetSelectorProps) {
}
onChange={({ option }: any) => handleSelect(option)}
disabled={
(selectCollateral && options.filter((o, i) => (o.balance.eq(ethers.constants.Zero) ? i : null))) ||
(selectCollateral && options.filter((o, i) => (o.balance?.eq(ethers.constants.Zero) ? i : null))) ||
(selectCollateral ? selectedSeries?.mature || !selectedSeries : null)

// ( options.map((x:any, i:number) => {
Expand Down
2 changes: 1 addition & 1 deletion src/components/selectors/SeriesSelector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { FiClock } from 'react-icons/fi';
import { ActionType, ISeries } from '../../types';
import { UserContext } from '../../contexts/UserContext';
import { calculateAPR } from '../../utils/yieldMath';
import { useApr } from '../../hooks/aprHook';
import { useApr } from '../../hooks/useApr';
import YieldMark from '../logos/YieldMark';
import { nFormatter } from '../../utils/appUtils';

Expand Down
129 changes: 82 additions & 47 deletions src/contexts/ChainContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { useCachedState } from '../hooks/generalHooks';

import * as yieldEnv from './yieldEnv.json';
import * as contracts from '../contracts';
import { IAssetRoot, ISeriesRoot } from '../types';
import { IAssetRoot, ISeriesRoot, IStrategyRoot } from '../types';

import { ETH_BASED_ASSETS } from '../utils/constants';
import { nameFromMaturity, getSeason, SeasonType } from '../utils/appUtils';
Expand All @@ -23,7 +23,6 @@ import USDCMark from '../components/logos/USDCMark';
import WBTCMark from '../components/logos/WBTCMark';
import USDTMark from '../components/logos/USDTMark';
import YieldMark from '../components/logos/YieldMark';
import { ERC20Permit } from '../contracts';

const markMap = new Map([
['DAI', <DaiMark key="dai" />],
Expand Down Expand Up @@ -117,6 +116,7 @@ const initState = {
contractMap: new Map<string, ContractFactory>(),
assetRootMap: new Map<string, IAssetRoot>(),
seriesRootMap: new Map<string, ISeriesRoot>(),
strategyRootMap: new Map<string, IStrategyRoot>(),
};

function chainReducer(state: any, action: any) {
Expand Down Expand Up @@ -158,6 +158,11 @@ function chainReducer(state: any, action: any) {
...state,
assetRootMap: state.assetRootMap.set(action.payload.id, action.payload),
};
case 'addStrategy':
return {
...state,
strategyRootMap: state.strategyRootMap.set(action.payload.address, action.payload),
};
/* special internal case for multi-updates - might remove from this context if not needed */
case '_any':
return { ...state, ...action.payload };
Expand All @@ -171,9 +176,6 @@ const ChainProvider = ({ children }: any) => {

const [lastChainId, setLastChainId] = useCachedState('lastChainId', 42);

const [cachedAssetAdded, setCachedAssetAdded] = useCachedState('AssetAdded', []);
const [cachedJoinAdded, setCachedJoinAdded] = useCachedState('JoinAdded', []);

const [cachedAssets, setCachedAssets] = useCachedState('assets', []);
const [cachedSeries, setCachedSeries] = useCachedState('series', []);

Expand All @@ -190,8 +192,8 @@ const ChainProvider = ({ children }: any) => {
library: fallbackLibrary,
chainId: fallbackChainId,
activate: fallbackActivate,
active: fallbackActive,
error: fallbackError,
// active: fallbackActive,
// error: fallbackError,
} = fallbackConnection;

/**
Expand All @@ -209,14 +211,16 @@ const ChainProvider = ({ children }: any) => {
const addrs = (yieldEnv.addresses as any)[fallbackChainId];
const Cauldron = contracts.Cauldron__factory.connect(addrs.Cauldron, fallbackLibrary);
const Ladle = contracts.Ladle__factory.connect(addrs.Ladle, fallbackLibrary);
const PoolRouter = contracts.PoolRouter__factory.connect(addrs.PoolRouter, fallbackLibrary);
const CompoundOracle = contracts.CompoundMultiOracle__factory.connect(addrs.CompoundOracle, fallbackLibrary);
const ChainlinkOracle = contracts.ChainlinkMultiOracle__factory.connect(addrs.ChainlinkOracle, fallbackLibrary);
const CompositeMultiOracle = contracts.CompositeMultiOracle__factory.connect(
addrs.CompositeMultiOracle,
fallbackLibrary
);

/* get the strategies */
const strategies = (yieldEnv.strategies as any)[fallbackChainId];

updateState({ type: 'appVersion', payload: process.env.REACT_APP_VERSION });

console.log('VERSION: ', process.env.REACT_APP_VERSION);
Expand All @@ -227,17 +231,17 @@ const ChainProvider = ({ children }: any) => {
const newContractMap = chainState.contractMap;
newContractMap.set('Cauldron', Cauldron);
newContractMap.set('Ladle', Ladle);
newContractMap.set('PoolRouter', PoolRouter);
newContractMap.set('CompoundOracle', CompoundOracle);
newContractMap.set('ChainlinkOracle', ChainlinkOracle);
newContractMap.set('CompositeMultiOracle', CompositeMultiOracle);
// newContractMap.set('Strategy_DAI3M', Strategy_DAI3M);

updateState({ type: 'contractMap', payload: newContractMap });

let test: any;
(async () => {
test = await fallbackLibrary.getBalance('0x885Bc35dC9B10EA39f2d7B3C94a7452a9ea442A7');
})();
// let test: any;
// (async () => {
// test = await fallbackLibrary.getBalance('0x885Bc35dC9B10EA39f2d7B3C94a7452a9ea442A7');
// })();

/* add on extra/calculated ASSET info */
const _chargeAsset = (asset: { id: string; address: string; symbol: string }) => {
Expand Down Expand Up @@ -308,24 +312,27 @@ const ChainProvider = ({ children }: any) => {
console.log('Yield Protocol Asset data updated.');
};

/* add on extra/calculated SERIES info */
/* add on extra/calculated ASYNC series info */
const _chargeSeries = (series: {
maturity: number;
baseId: string;
poolAddress: string;
fyTokenAddress: string;
}) => {

const poolContract = contracts.Pool__factory.connect(series.poolAddress, fallbackLibrary);
const fyTokenContract = contracts.FYToken__factory.connect(series.fyTokenAddress, fallbackLibrary);

const season = getSeason(series.maturity) as SeasonType;
const oppSeason = (_season: SeasonType) => getSeason(series.maturity + 23670000) as SeasonType;
const [startColor, endColor, textColor]: string[] = yieldEnv.seasonColors[season];
const [oppStartColor, oppEndColor, oppTextColor]: string[] = yieldEnv.seasonColors[oppSeason(season)];

return {
...series,

poolContract,
fyTokenContract,

fullDate: format(new Date(series.maturity * 1000), 'dd MMMM yyyy'),
displayName: format(new Date(series.maturity * 1000), 'dd MMM yyyy'),
displayNameMobile: `${nameFromMaturity(series.maturity, 'MMM yyyy')}`,
Expand All @@ -340,6 +347,7 @@ const ChainProvider = ({ children }: any) => {
oppEndColor,
oppTextColor,
seriesMark: <YieldMark startColor={startColor} endColor={endColor} />,

// built-in helper functions:
getTimeTillMaturity: () => series.maturity - Math.round(new Date().getTime() / 1000),
isMature: async () => series.maturity < (await fallbackLibrary.getBlock('latest')).timestamp,
Expand All @@ -361,42 +369,69 @@ const ChainProvider = ({ children }: any) => {

const newSeriesList: any[] = [];
/* Add in any extra static series */
await Promise.all([
...seriesAddedEvents.map(async (x: any): Promise<void> => {
const { seriesId: id, baseId, fyToken } = Cauldron.interface.parseLog(x).args;
const { maturity } = await Cauldron.series(id);
const poolAddress: string = poolMap.get(id) as string;
const poolContract = contracts.Pool__factory.connect(poolAddress, fallbackLibrary);
const fyTokenContract = contracts.FYToken__factory.connect(fyToken, fallbackLibrary);
const [name, symbol, version, poolName, poolVersion] = await Promise.all([
fyTokenContract.name(),
fyTokenContract.symbol(),
fyTokenContract.version(),
poolContract.name(),
poolContract.version(),
]);
const newSeries = {
id,
baseId,
maturity,
name,
symbol,
version,
address: fyToken,
fyTokenAddress: fyToken,
poolAddress,
poolVersion,
poolName,
};
updateState({ type: 'addSeries', payload: _chargeSeries(newSeries) });
newSeriesList.push(newSeries);
}),
]);
try {
await Promise.all([
...seriesAddedEvents.map(async (x: any): Promise<void> => {
const { seriesId: id, baseId, fyToken } = Cauldron.interface.parseLog(x).args;
const { maturity } = await Cauldron.series(id);

if (poolMap.has(id)) { // only add series if it has a pool
const poolAddress: string = poolMap.get(id) as string;
const poolContract = contracts.Pool__factory.connect(poolAddress, fallbackLibrary);
const fyTokenContract = contracts.FYToken__factory.connect(fyToken, fallbackLibrary);
const [name, symbol, version, poolName, poolVersion] = await Promise.all([
fyTokenContract.name(),
fyTokenContract.symbol(),
fyTokenContract.version(),
poolContract.name(),
poolContract.version(),
]);
const newSeries = {
id,
baseId,
maturity,
name,
symbol,
version,
address: fyToken,
fyTokenAddress: fyToken,
poolAddress,
poolVersion,
poolName
};
updateState({ type: 'addSeries', payload: _chargeSeries(newSeries) });
newSeriesList.push(newSeries);
}
}),
]);
} catch (e) {
console.log('Error fetching series data: ', e);
}
setLastSeriesUpdate(await fallbackLibrary?.getBlockNumber());
setCachedSeries([...cachedSeries, ...newSeriesList]);
console.log('Yield Protocol series data updated.');
};

/* Iterate through the strategies list and update accordingly */
const _getStrategies = async () => {
// const strategyMap = new Map([]);
await Promise.all(
strategies.map(async (stratAddr: string) => {
const Strategy = contracts.Strategy__factory.connect(stratAddr, fallbackLibrary);
const [name, symbol] = await Promise.all([
Strategy.name(),
Strategy.symbol(),
// ETH_BASED_ASSETS.includes(id) ? '1' : await ERC20.version()
]);
console.log(name, symbol);
updateState({
type: 'addStrategy',
payload: { address: stratAddr, symbol, name, strategyContract: Strategy },
});
})
);
};

/* LOAD the Series and Assets */
if (cachedAssets.length === 0) {
console.log('FIRST LOAD: Loading Asset and Series data ');
Expand All @@ -415,7 +450,7 @@ const ChainProvider = ({ children }: any) => {
updateState({ type: 'chainLoading', payload: false });
console.log('Checking for new Assets and Series...');
// then async check for any updates (they should automatically populate the map):
(async () => Promise.all([_getAssets(), _getSeries()]))();
(async () => Promise.all([_getAssets(), _getSeries(), _getStrategies()]))();
}
}
}, [
Expand Down
4 changes: 1 addition & 3 deletions src/contexts/UserContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -213,10 +213,9 @@ const UserProvider = ({ children }: any) => {
try {
_accountData = await Promise.all(
_publicData.map(async (asset: IAssetRoot): Promise<IAsset> => {
const [balance, ladleAllowance, poolAllowance, joinAllowance] = await Promise.all([
const [balance, ladleAllowance, joinAllowance] = await Promise.all([
asset.getBalance(account),
asset.getAllowance(account, contractMap.get('Ladle').address),
asset.getAllowance(account, contractMap.get('PoolRouter').address),
asset.getAllowance(account, asset.joinAddress),
]);

Expand All @@ -226,7 +225,6 @@ const UserProvider = ({ children }: any) => {
...asset,
isYieldBase,
hasLadleAuth: ladleAllowance.gt(ethers.constants.Zero),
hasPoolRouterAuth: poolAllowance.gt(ethers.constants.Zero),
hasJoinAuth: joinAllowance.gt(ethers.constants.Zero),
balance: balance || ethers.constants.Zero,
balance_: balance
Expand Down
13 changes: 7 additions & 6 deletions src/contexts/yieldEnv.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,20 @@
"1": {
"Cauldron": "0x324ee27d5f5A7Da8C926A5954CB86357b8e07F81",
"Ladle": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512",
"Witch": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0",
"PoolRouter": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853",
"CompoundOracle": "0x17B6fC5c9b3C422255eB2e2E6d152bc5B9f261b9",
"ChainlinkOracle": "0x2C5f88E7BD899CE57242ecA7650F21a4a9c28D3f",
"CompositeMultiOracle": "0x77528b9E8300D4eF6075c18C7148420C86997106"
},
"42": {
"Cauldron": "0x324ee27d5f5A7Da8C926A5954CB86357b8e07F81",
"Ladle": "0xB4f7AaF28829DC86d8d988827e3cc6D90DFF8575",
"PoolRouter": "0x73c098458416f1a6100627b1D56b070926aefc35",
"Ladle": "0xb3768d474dc5464c50AFF228682a5D63c06335E8",
"CompoundOracle": "0x7A59d2e3b2eB34d51c77c5dA88873191F50539Cc",
"ChainlinkOracle": "0x05e24C295dBdAa1F4bf27377a1a3f1bd30606bA5",
"CompositeMultiOracle": "0x77528b9E8300D4eF6075c18C7148420C86997106"
},
"31337": {
"Cauldron": "0x7Dd21c63a12042759ce9D5207301F0f19b10c634",
"Ladle": "0x668fF464D0de4295a109c3Fa7B6C7bF8c0c61549",
"PoolRouter": "0xBa8E00E9797D6b98FA29306c0181010c8cECcd39",
"Ladle": "0xb3768d474dc5464c50AFF228682a5D63c06335E8",
"CompoundOracle": "0xfc569FF2C8fB3212cFA47cFaa881CE16eB3e80bb",
"ChainlinkOracle": "0x06E5903f2Aa1935EE6f4B9f825F8A140C681C0F1",
"CompositeMultiOracle": "0x77528b9E8300D4eF6075c18C7148420C86997106"
Expand All @@ -39,5 +35,10 @@
"SPRING": ["#6AD99E", "#FF6BE4", "#333333"],
"SUMMER": ["#FFDE75", "#409C4D", "#333333"],
"FALL": ["#7255BD", "#D95948", "#ffffff"]
},
"strategies": {
"1" : [],
"42" : ["0xdc70afc194261A7290fAc51E17992A4bF2D4b39b" ],
"31337": [ ]
}
}
Loading

0 comments on commit d7bd0ed

Please sign in to comment.