Skip to content

Commit

Permalink
Merge pull request saltyfacu#100 from TBouder/master
Browse files Browse the repository at this point in the history
Feature/ApeApi
  • Loading branch information
fameal committed Sep 5, 2021
2 parents aa061e2 + 4c107ba commit c607ceb
Show file tree
Hide file tree
Showing 5 changed files with 271 additions and 3 deletions.
2 changes: 2 additions & 0 deletions package.json
Expand Up @@ -26,8 +26,10 @@
"autoprefixer": "^10.3.2",
"axios": "^0.21.1",
"dotenv-webpack": "^7.0.3",
"ethcall": "4.0.0",
"ethers": "^5.4.5",
"grapheme-splitter": "^1.0.4",
"memoizee": "^0.4.15",
"next": "11.1.0",
"next-seo": "^4.26.0",
"postcss": "^8.3.6",
Expand Down
104 changes: 104 additions & 0 deletions pages/api/vaults.js
@@ -0,0 +1,104 @@
/******************************************************************************
** @Author: The Ape Community
** @Twitter: @ape_tax
** @Date: Sunday September 5th 2021
** @Filename: vaults.js
******************************************************************************/

import {ethers} from 'ethers';
import {Provider, Contract} from 'ethcall';
import {fn} from 'utils/fn';
import vaults from 'utils/vaults.json';
import yVaultABI from 'utils/yVault.abi.json';

const chunk = (arr, size) => arr.reduce((acc, e, i) => (i % size ? acc[acc.length - 1].push(e) : acc.push([e]), acc), []);

async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}

function getProvider(chain = 1) {
if (chain === 1) {
if (process.env.ALCHEMY_KEY) {
return new ethers.providers.AlchemyProvider('homestead', process.env.ALCHEMY_KEY);
} else {
return new ethers.providers.InfuraProvider('homestead', '9aa3d95b3bc440fa88ea12eaa4456161');
}
} else if (chain === 137) {
return new ethers.providers.JsonRpcProvider('https://rpc-mainnet.matic.network');
} else if (chain === 250) {
return new ethers.providers.JsonRpcProvider('https://rpcapi.fantom.network');
} else if (chain === 56) {
return new ethers.providers.JsonRpcProvider('https://bsc-dataseed.binance.org');
} else if (chain === 1337) {
return new ethers.providers.JsonRpcProvider('http://localhost:8545');
}
return (new ethers.providers.AlchemyProvider('homestead', process.env.ALCHEMY_KEY));
}

async function newEthCallProvider(provider) {
const ethcallProvider = new Provider();
await ethcallProvider.init(provider);
return ethcallProvider;
}

export default fn(async ({network = 1}) => {
network = Number(network);
const ethcallProvider = await newEthCallProvider(getProvider(network));
const _vaults = [];
const _calls = [];

Object.values(vaults).forEach((v) => {
if (v.CHAIN_ID !== network || v.VAULT_TYPE === 'weird') {
return;
}
const vaultContract = new Contract(v.VAULT_ADDR, yVaultABI);
_calls.push(...[
vaultContract.apiVersion(),
vaultContract.depositLimit(),
vaultContract.totalAssets(),
vaultContract.availableDepositLimit(),
vaultContract.pricePerShare(),
vaultContract.decimals(),
]);
});
const callResult = await ethcallProvider.all(_calls);
const chunkedCallResult = chunk(callResult, 6);
let index = 0;

await asyncForEach(Object.entries(vaults), async ([k, v]) => {
if (v.CHAIN_ID !== network || v.VAULT_TYPE === 'weird') {
return;
}
const [apiVersion, depositLimit, totalAssets, availableDepositLimit, pricePerShare, decimals] = chunkedCallResult[index];
const dec = Number(decimals);
index++;

_vaults.push({
title: v.TITLE,
logo: v.LOGO,
displayName: `${v.LOGO} ${v.TITLE}`,
src: `https://ape.tax/${k}`,
status: v.VAULT_STATUS,
type: v.VAULT_TYPE,
address: v.VAULT_ADDR,
network: v.CHAIN_ID,
data: {
apiVersion: apiVersion,
depositLimit: ethers.utils.formatUnits(depositLimit, dec),
totalAssets: ethers.utils.formatUnits(totalAssets, dec),
availableDepositLimit: ethers.utils.formatUnits(availableDepositLimit, dec),
pricePerShare: ethers.utils.formatUnits(pricePerShare, dec),
decimals: dec,
},
want: {
address: v.WANT_ADDR,
symbol: v.WANT_SYMBOL,
cgID: v.COINGECKO_SYMBOL,
}
});
});
return _vaults;
}, {maxAge: 10 * 60}); //10 mn
48 changes: 48 additions & 0 deletions utils/fn.js
@@ -0,0 +1,48 @@
/******************************************************************************
** @Author: The Ape Community
** @Twitter: @ape_tax
** @Date: Sunday September 5th 2021
** @Filename: fn.js
******************************************************************************/

import memoize from 'memoizee';

const formatJsonSuccess = (data) => ({
success: true,
data,
});

const formatJsonError = (err) => ({
success: false,
err: err.toString ? err.toString() : err,
});

const addGeneratedTime = async (res) => ({
...await res,
generatedTimeMs: +Date.now(),
});

const fn = (cb, options = {}) => {
const {
maxAge: maxAgeSec = null, // Caching duration, in seconds
} = options;

const callback = maxAgeSec !== null ?
memoize(async (query) => addGeneratedTime(cb(query)), {
promise: true,
maxAge: maxAgeSec * 1000,
normalizer: ([query]) => JSON.stringify(query), // Separate cache entries for each route & query params,
}) :
async (query) => addGeneratedTime(cb(query));

return async (req, res) => (
Promise.resolve(callback(req.query))
.then((data) => res.status(200).json(formatJsonSuccess(data)))
.catch((err) => res.status(500).json(formatJsonError(err)))
);
};

export {
fn,
formatJsonError,
};
1 change: 1 addition & 0 deletions utils/yVault.abi.json
@@ -0,0 +1 @@
[{"name":"Transfer","inputs":[{"type":"address","name":"sender","indexed":true},{"type":"address","name":"receiver","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false,"type":"event"},{"name":"Approval","inputs":[{"type":"address","name":"owner","indexed":true},{"type":"address","name":"spender","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false,"type":"event"},{"name":"StrategyAdded","inputs":[{"type":"address","name":"strategy","indexed":true},{"type":"uint256","name":"debtLimit","indexed":false},{"type":"uint256","name":"rateLimit","indexed":false},{"type":"uint256","name":"performanceFee","indexed":false}],"anonymous":false,"type":"event"},{"name":"StrategyReported","inputs":[{"type":"address","name":"strategy","indexed":true},{"type":"uint256","name":"gain","indexed":false},{"type":"uint256","name":"loss","indexed":false},{"type":"uint256","name":"totalGain","indexed":false},{"type":"uint256","name":"totalLoss","indexed":false},{"type":"uint256","name":"totalDebt","indexed":false},{"type":"uint256","name":"debtAdded","indexed":false},{"type":"uint256","name":"debtLimit","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address","name":"_token"},{"type":"address","name":"_governance"},{"type":"address","name":"_rewards"},{"type":"string","name":"_nameOverride"},{"type":"string","name":"_symbolOverride"}],"stateMutability":"nonpayable","type":"constructor"},{"name":"apiVersion","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"pure","type":"function","gas":4489},{"name":"setName","outputs":[],"inputs":[{"type":"string","name":"_name"}],"stateMutability":"nonpayable","type":"function","gas":106987},{"name":"setSymbol","outputs":[],"inputs":[{"type":"string","name":"_symbol"}],"stateMutability":"nonpayable","type":"function","gas":71837},{"name":"setGovernance","outputs":[],"inputs":[{"type":"address","name":"_governance"}],"stateMutability":"nonpayable","type":"function","gas":36308},{"name":"acceptGovernance","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":36234},{"name":"setGuestList","outputs":[],"inputs":[{"type":"address","name":"_guestList"}],"stateMutability":"nonpayable","type":"function","gas":36368},{"name":"setRewards","outputs":[],"inputs":[{"type":"address","name":"_rewards"}],"stateMutability":"nonpayable","type":"function","gas":36398},{"name":"setDepositLimit","outputs":[],"inputs":[{"type":"uint256","name":"_limit"}],"stateMutability":"nonpayable","type":"function","gas":36328},{"name":"setPerformanceFee","outputs":[],"inputs":[{"type":"uint256","name":"_fee"}],"stateMutability":"nonpayable","type":"function","gas":36358},{"name":"setManagementFee","outputs":[],"inputs":[{"type":"uint256","name":"_fee"}],"stateMutability":"nonpayable","type":"function","gas":36388},{"name":"setGuardian","outputs":[],"inputs":[{"type":"address","name":"_guardian"}],"stateMutability":"nonpayable","type":"function","gas":37745},{"name":"setEmergencyShutdown","outputs":[],"inputs":[{"type":"bool","name":"_active"}],"stateMutability":"nonpayable","type":"function","gas":37775},{"name":"setWithdrawalQueue","outputs":[],"inputs":[{"type":"address[20]","name":"_queue"}],"stateMutability":"nonpayable","type":"function","gas":750044},{"name":"transfer","outputs":[{"type":"bool","name":""}],"inputs":[{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":76619},{"name":"transferFrom","outputs":[{"type":"bool","name":""}],"inputs":[{"type":"address","name":"_from"},{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":116382},{"name":"approve","outputs":[{"type":"bool","name":""}],"inputs":[{"type":"address","name":"_spender"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":38184},{"name":"increaseAllowance","outputs":[{"type":"bool","name":""}],"inputs":[{"type":"address","name":"_spender"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":40225},{"name":"decreaseAllowance","outputs":[{"type":"bool","name":""}],"inputs":[{"type":"address","name":"_spender"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":40249},{"name":"permit","outputs":[{"type":"bool","name":""}],"inputs":[{"type":"address","name":"owner"},{"type":"address","name":"spender"},{"type":"uint256","name":"amount"},{"type":"uint256","name":"expiry"},{"type":"bytes","name":"signature"}],"stateMutability":"nonpayable","type":"function","gas":81177},{"name":"totalAssets","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":4003},{"name":"balanceSheetOfStrategy","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_strategy"}],"stateMutability":"view","type":"function","gas":2508},{"name":"totalBalanceSheet","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address[40]","name":"_strategies"}],"stateMutability":"view","type":"function","gas":77066},{"name":"deposit","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"nonpayable","type":"function"},{"name":"deposit","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_amount"}],"stateMutability":"nonpayable","type":"function"},{"name":"deposit","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_amount"},{"type":"address","name":"_recipient"}],"stateMutability":"nonpayable","type":"function"},{"name":"maxAvailableShares","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":359791},{"name":"withdraw","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"nonpayable","type":"function"},{"name":"withdraw","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_shares"}],"stateMutability":"nonpayable","type":"function"},{"name":"withdraw","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_shares"},{"type":"address","name":"_recipient"}],"stateMutability":"nonpayable","type":"function"},{"name":"pricePerShare","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":12352},{"name":"addStrategy","outputs":[],"inputs":[{"type":"address","name":"_strategy"},{"type":"uint256","name":"_debtLimit"},{"type":"uint256","name":"_rateLimit"},{"type":"uint256","name":"_performanceFee"}],"stateMutability":"nonpayable","type":"function","gas":1445752},{"name":"updateStrategyDebtLimit","outputs":[],"inputs":[{"type":"address","name":"_strategy"},{"type":"uint256","name":"_debtLimit"}],"stateMutability":"nonpayable","type":"function","gas":111496},{"name":"updateStrategyRateLimit","outputs":[],"inputs":[{"type":"address","name":"_strategy"},{"type":"uint256","name":"_rateLimit"}],"stateMutability":"nonpayable","type":"function","gas":38548},{"name":"updateStrategyPerformanceFee","outputs":[],"inputs":[{"type":"address","name":"_strategy"},{"type":"uint256","name":"_performanceFee"}],"stateMutability":"nonpayable","type":"function","gas":38572},{"name":"migrateStrategy","outputs":[],"inputs":[{"type":"address","name":"_oldVersion"},{"type":"address","name":"_newVersion"}],"stateMutability":"nonpayable","type":"function","gas":1178418},{"name":"revokeStrategy","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function"},{"name":"revokeStrategy","outputs":[],"inputs":[{"type":"address","name":"_strategy"}],"stateMutability":"nonpayable","type":"function"},{"name":"addStrategyToQueue","outputs":[],"inputs":[{"type":"address","name":"_strategy"}],"stateMutability":"nonpayable","type":"function","gas":1194595},{"name":"removeStrategyFromQueue","outputs":[],"inputs":[{"type":"address","name":"_strategy"}],"stateMutability":"nonpayable","type":"function","gas":23068248},{"name":"debtOutstanding","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function"},{"name":"debtOutstanding","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_strategy"}],"stateMutability":"view","type":"function"},{"name":"creditAvailable","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function"},{"name":"creditAvailable","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_strategy"}],"stateMutability":"view","type":"function"},{"name":"availableDepositLimit","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":9688},{"name":"expectedReturn","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function"},{"name":"expectedReturn","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_strategy"}],"stateMutability":"view","type":"function"},{"name":"report","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_gain"},{"type":"uint256","name":"_loss"},{"type":"uint256","name":"_debtPayment"}],"stateMutability":"nonpayable","type":"function","gas":919553},{"name":"sweep","outputs":[],"inputs":[{"type":"address","name":"_token"}],"stateMutability":"nonpayable","type":"function"},{"name":"sweep","outputs":[],"inputs":[{"type":"address","name":"_token"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function"},{"name":"name","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":9053},{"name":"symbol","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":8106},{"name":"decimals","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2711},{"name":"balanceOf","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":2956},{"name":"allowance","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"arg0"},{"type":"address","name":"arg1"}],"stateMutability":"view","type":"function","gas":3201},{"name":"totalSupply","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2801},{"name":"token","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2831},{"name":"governance","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2861},{"name":"guardian","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2891},{"name":"guestList","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2921},{"name":"strategies","outputs":[{"type":"uint256","name":"performanceFee"},{"type":"uint256","name":"activation"},{"type":"uint256","name":"debtLimit"},{"type":"uint256","name":"rateLimit"},{"type":"uint256","name":"lastReport"},{"type":"uint256","name":"totalDebt"},{"type":"uint256","name":"totalGain"},{"type":"uint256","name":"totalLoss"}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":10292},{"name":"withdrawalQueue","outputs":[{"type":"address","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":3090},{"name":"emergencyShutdown","outputs":[{"type":"bool","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":3011},{"name":"depositLimit","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":3041},{"name":"debtLimit","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":3071},{"name":"totalDebt","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":3101},{"name":"lastReport","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":3131},{"name":"activation","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":3161},{"name":"rewards","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":3191},{"name":"managementFee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":3221},{"name":"performanceFee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":3251},{"name":"nonces","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":3496},{"name":"DOMAIN_SEPARATOR","outputs":[{"type":"bytes32","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":3311}]

0 comments on commit c607ceb

Please sign in to comment.