Skip to content

Instantly share code, notes, and snippets.

@wafflemakr
Last active June 23, 2021 19:31
Show Gist options
  • Save wafflemakr/6fe2a9d810c4e7179b85038a72b9aa75 to your computer and use it in GitHub Desktop.
Save wafflemakr/6fe2a9d810c4e7179b85038a72b9aa75 to your computer and use it in GitHub Desktop.
/*!
* YieldFarming
* Boilerplate for a Static website using EJS and SASS
* https://yieldfarming.info
* @author Jongseung Lim -- https://yieldfarming.info
* Copyright 2021. MIT Licensed.
*/
$(function() {
consoleInit();
start(main);
});
const MATIC_STAKING_ABI = [{"inputs":[{"internalType":"address","name":"_rewardsDistribution","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDistribution","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"stakeWithPermit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
async function main() {
const App = await init_ethers();
_print(`Initialized ${App.YOUR_ADDRESS}\n`);
_print("Reading smart contracts...\n");
const tokens = {};
const prices = await getMaticPrices();
const pools = QuickStakingContracts.map(c => { return {
address: c.stakingRewardAddress,
abi: MATIC_STAKING_ABI,
stakeTokenFunction: "stakingToken",
rewardTokenFunction: "rewardsToken"
}})
let p = await loadMultipleMaticSynthetixPools(App, tokens, prices, pools)
_print_bold(`Total staked: $${formatMoney(p.staked_tvl)}`);
if (p.totalUserStaked > 0) {
_print(`You are staking a total of $${formatMoney(p.totalUserStaked)} at an APR of ${(p.totalAPR * 100).toFixed(2)}%\n`);
}
hideLoading();
}
const QuickStakingContracts =[
{
//tokens: [MATIC,QUICK],
stakingRewardAddress: '0x7Ca29F0DB5Db8b88B332Aa1d67a2e89DfeC85E7E',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 90
},
{
//tokens: [ETHER,MATIC],
stakingRewardAddress: '0x8FF56b5325446aAe6EfBf006a4C1D88e4935a914',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 75
},
{
//tokens: [GHST,QUICK],
stakingRewardAddress: '0xa132faD61EDe08f1f288a35ff4c10dcD1cB9E107',
ended: false,
name: 'StkGHST-QUICK',
lp: '0xA02d547512Bb90002807499F05495Fe9C4C3943f',
//baseToken: QUICK,
rate: 60
},
{
//tokens: [WBTC,ETHER],
stakingRewardAddress: '0x070D182EB7E9C3972664C959CE58C5fC6219A7ad',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 60
},
{
//tokens: [USDC,QUICK],
stakingRewardAddress: '0x8cFad56Eb742BA8CAEA813e47779E9C38f27cA6E',
ended: false,
lp: '',
name: '',
//baseToken: USDC,
rate: 50
},
{
//tokens: [GHST,USDC],
stakingRewardAddress: '0xfDC02Dc768a587514b992b03Fb713F74061764a2',
ended: false,
name: 'stkGHST-USDC',
lp: '0x04439eC4ba8b09acfae0E9b5D75A82cC63b19f09',
//baseToken: USDC,
rate: 38
},
{
//tokens: [ETHER,WISE],
stakingRewardAddress: '0xb11856d3Aea0203e50B8520479C6332daBcF3f82',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 35
},
{
//tokens: [ETHER,USDC],
stakingRewardAddress: '0x4A73218eF2e820987c59F838906A82455F42D98b',
ended: false,
lp: '',
name: '',
//baseToken: USDC,
rate: 34
},
{
//tokens: [LINK,ETHER],
stakingRewardAddress: '0x97D69E23DF7BBB01F9eA78b5651cb6ad125D6d9a',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 33
},
{
//tokens: [AGA,AGAr],
stakingRewardAddress: '0x855b8dCA0Dfe3A1AC474f5A25792d4326580E06A',
ended: false,
lp: '',
name: '',
//baseToken: AGA,
rate: 30
},
{
//tokens: [ETHER,QUICK],
stakingRewardAddress: '0xD1C762861AAe85dF2e586a668A793AAfF820932b',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 30
},
{
//tokens: [QUICK,WISE],
stakingRewardAddress: '0x3CB338519AD8AE7cbaCb4A1035052BE6DA7e0b59',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 25
},
{
//tokens: [SX,ETHER],
stakingRewardAddress: '0x225d8F0f5FB5D66cA7C0a27da85F462689c47C23',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 25
},
{
//tokens: [CEL,ETHER],
stakingRewardAddress: '0x8917692e0Bdb47AF1D36837805E141Ed79065dFC',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 23
},
{
//tokens: [MAUSDC,USDC],
stakingRewardAddress: '0x9Aac6390103C1Af774220aaB85bEB49Ae2DF11d6',
ended: false,
lp: '',
name: '',
//baseToken: USDC,
rate: 20
},
{
//tokens: [DAI,ETHER],
stakingRewardAddress: '0x785AaCd49c1Aa3ca573F2a32Bb90030A205b8147',
ended: false,
lp: '',
name: '',
//baseToken: DAI,
rate: 20
},
{
//tokens: [AAVE,ETHER],
stakingRewardAddress: '0x573bb5CCC26222d8108EdaCFcC7F7cb9e388Af10',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 20
},
{
//tokens: [FRAX,QUICK],
stakingRewardAddress: '0xa859D2C37A49bbd5992E39FCC37a7dD56aE130E7',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 16
},
{
//tokens: [FRAX,FXS],
stakingRewardAddress: '0x2f5c21A2084fE66E3CEDe1dfd048Ea00b3dcf1f4',
ended: false,
lp: '',
name: '',
//baseToken: FRAX,
rate: 16
},
{
//tokens: [ETHER,DEFI5],
stakingRewardAddress: '0xf563fAe71bDAcDD370098CeCff14dbe2c9518a6b',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 15
},
{
//tokens: [USDC,USDT],
stakingRewardAddress: '0x251d9837a13F38F3Fe629ce2304fa00710176222',
ended: false,
lp: '',
name: '',
//baseToken: USDC,
rate: 15
},
{
//tokens: [WBTC,USDC],
stakingRewardAddress: '0x8f2ac4EC8982bF1699a6EeD696e204FA2ccD5D91',
ended: false,
lp: '',
name: '',
//baseToken: USDC,
rate: 15
},
{
//tokens: [QUICK,DEFI5],
stakingRewardAddress: '0xDdB4E83F0977CAf315f5A4d71930FD72DA00d8d9',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 14
},
{
//tokens: [LINK,QUICK],
stakingRewardAddress: '0xfEc1E86786841FF699588DD1e88178AB2BB6DAbC',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 14
},
{
//tokens: [WOLF,MATIC],
stakingRewardAddress: '0x3139523e1507cF6B0700Be2EABea6D5e919C6369',
ended: false,
lp: '',
name: '',
//baseToken: MATIC,
rate: 13
},
{
//tokens: [SWAP,QUICK],
stakingRewardAddress: '0x219ab685344518c60eFb399a039EBC73cC4f1471',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 12.5
},
{
//tokens: [DG,ETHER],
stakingRewardAddress: '0x0C7395bc2b25603941a67e4DaF327362dB8f7D54',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 12
},
{
//tokens: [DG,QUICK],
stakingRewardAddress: '0x4aC2D949D9E7e2c47e0FB6c7e2316BAE58d27599',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 12
},
{
//tokens: [DEGEN,QUICK],
stakingRewardAddress: '0x65Bb31f4ad1D9958Cd808d4337eaaB6F40CFaD2e',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 12
},
{
//tokens: [GAME,QUICK],
stakingRewardAddress: '0x8FC0a8dE57d15dF22238FCd165Cd5d6658ac4788',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 11
},
{
//tokens: [ETHER,DEGEN],
stakingRewardAddress: '0x729970954a0c26cdBe765A93020efC787283dfcA',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 10
},
{
//tokens: [DAI,USDC],
stakingRewardAddress: '0xEd8413eCEC87c3d4664975743c02DB3b574012a7',
ended: false,
lp: '',
name: '',
//baseToken: USDC,
rate: 10
},
{
//tokens: [ARIA20,ETHER],
stakingRewardAddress: '0x5Afc79ce4481a4565B88074393F2DbFc19CbCDdC',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 9
},
{
//tokens: [UBT,ETHER],
stakingRewardAddress: '0x219670F92CC0e0ef1C16BDB0aE266F0472930906',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 9
},
{
//tokens: [UNITOKEN,QUICK],
stakingRewardAddress: '0x72ed24d2b2D98D3c4b5297ce244f623B9357F798',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 9
},
{
//tokens: [MAAAVE,QUICK],
stakingRewardAddress: '0x994c2f4b860B9DC412502a57a60473d7b5AB20e5',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 8
},
{
//tokens: [QUICK,CEL],
stakingRewardAddress: '0x0BA297E04008070E3075Fa08a920bB3CeC2ed45b',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 8
},
{
//tokens: [QUICK,CC10],
stakingRewardAddress: '0xab1d645fe5148322D4991fCB3bceF6848a5e8123',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 7
},
{
//tokens: [ETHER,HH],
stakingRewardAddress: '0xfc4a45f220EaB0a740635eBb3B3b391abbae4e07',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 7
},
{
//tokens: [IFARM,QUICK],
stakingRewardAddress: '0xEa2EC0713D3B48234Ad4b2f14EDb4978D1228aE5',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 7
},
{
//tokens: [CC10,ETHER],
stakingRewardAddress: '0x7cc64850E4c65e753247A1Ed2c8DF63DCF7d002d',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 6
},
{
//tokens: [IFARM,MATIC],
stakingRewardAddress: '0xD26C29d8B22105d0f4dBBf5c421B228B74722C86',
ended: false,
lp: '',
name: '',
//baseToken: MATIC,
rate: 6
},
{
//tokens: [UBT,QUICK],
stakingRewardAddress: '0x24830905906b53F737cDc8a227C9475C52795C5C',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 6
},
{
//tokens: [NFTP,QUICK],
stakingRewardAddress: '0xB771f27de915529DcbBCeFd3b73f2537B94Ab3Fa',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 5
},
{
//tokens: [SUPER,QUICK],
stakingRewardAddress: '0xe818cbeE29477e6C6915Df1e9757dd663f10106d',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 5
},
{
//tokens: [EASY,QUICK],
stakingRewardAddress: '0x12bebB96E738159CB68c2be8ED775950e2CfFb50',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 5
},
{
//tokens: [SX,QUICK],
stakingRewardAddress: '0x78A8Ef79CB397FeDD933922b3A3Ced03dAcE52d4',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 5
},
{
//tokens: [VISION,ETHER],
stakingRewardAddress: '0x34D4257C4935673Fb5059f29602B9AAe9Dea0296',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 5
},
{
//tokens: [QUICK,XMARK],
stakingRewardAddress: '0xFd20CfF4eBD6EaD961E86A1264eEa4B64F847150',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 4.5
},
{
//tokens: [SX,DAI],
stakingRewardAddress: '0xefF782c32385B5eBd196fFD860629a5c69216c25',
ended: false,
lp: '',
name: '',
//baseToken: DAI,
rate: 4.5
},
{
//tokens: [GFARM2,ETHER],
stakingRewardAddress: '0x145bB9b8ebD72Ce915D1DDF6bcf3082027A38C9a',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 4
},
{
//tokens: [MAYFI,MAUSDC],
stakingRewardAddress: '0xe13876aAFb5cd2e162ec253499Eb414083a96Af2',
ended: false,
lp: '',
name: '',
//baseToken: MAUSDC,
rate: 4
},
{
//tokens: [MAUSDC,QUICK],
stakingRewardAddress: '0x8df5AdD0eB677d12EA86C5f83DdB7e184b750116',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 4
},
{
//tokens: [WOLF,QUICK],
stakingRewardAddress: '0x8732f213E8F82c6580e2579Dc2E3310aFF90E972',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 4
},
{
//tokens: [IGG,QUICK],
stakingRewardAddress: '0x0aC274597134209b640A18Fc70FaE075D33D1d87',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 4
},
{
//tokens: [MATIC,MOCEAN],
stakingRewardAddress: '0xEEc558404E179dEb5561fB043D8fd0567227FDE7',
ended: false,
lp: '',
name: '',
//baseToken: MATIC,
rate: 4
},
{
//tokens: [SWAP,ETHER],
stakingRewardAddress: '0x897Bc9871F1D1c520F7c200480b556f87D6638e7',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 4
},
{
//tokens: [SUPER,ETHER],
stakingRewardAddress: '0x214249a7bd9a6C10AdfF8fAd70749ebf8108494a',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 4
},
{
//tokens: [ARIA20,QUICK],
stakingRewardAddress: '0xc74dAA25035577E20db7C1cDEb01bcfFfe4927Ac',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 4
},
{
//tokens: [GFARM2,QUICK],
stakingRewardAddress: '0x395c81AcB66aEfb84CAcc501Bd581f0B261e4Fc1',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 4
},
{
//tokens: [AGAr,QUICK],
stakingRewardAddress: '0xa6b85D97853248973d11B9c806492D405D1B50e5',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 4
},
{
//tokens: [MATIC,USDC],
stakingRewardAddress: '0x6C6920aD61867B86580Ff4AfB517bEc7a499A7Bb',
ended: false,
lp: '',
name: '',
//baseToken: USDC,
rate: 4
},
{
//tokens: [AGA,QUICK],
stakingRewardAddress: '0x4D637F2d946b4028705BEb436e66Bf1Ffb85C22D',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 3.5
},
{
//tokens: [MAUNI,MAUSDC],
stakingRewardAddress: '0x3e9951ba9ea39FF1ACDCA838E1A294c7C8675b23',
ended: false,
lp: '',
name: '',
//baseToken: MAUSDC,
rate: 3
},
{
//tokens: [QUICK,HH],
stakingRewardAddress: '0xDdAFf21FC862dc1ecf805ca1CEBbfEae95b16E6D',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 3
},
{
//tokens: [QUICK,MOCEAN],
stakingRewardAddress: '0xC29996f70BC8D7052287Ada2B7B7765360A69a32',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 3
},
{
//tokens: [QUICK,DMT],
stakingRewardAddress: '0xcb099768c2eB727f5380c9E7AF93153E8d0e3766',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 3
},
{
//tokens: [HEX,QUICK],
stakingRewardAddress: '0x4E5317608D854104ffcC02F9741b52d1f07225Ac',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 3
},
{
//tokens: [BTU,QUICK],
stakingRewardAddress: '0x6065BAD6E8d8760b0cA729fCE35A98641CE1060C',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 3
},
{
//tokens: [FSN,QUICK],
stakingRewardAddress: '0x631F21B329C958e6A522c7b857F22c0C5E013368',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 3
},
{
//tokens: [ANY,QUICK],
stakingRewardAddress: '0xD6E9C2576FEa298c5C9FA9F2cBC5f124c5f97625',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 3
},
{
//tokens: [PLOT,QUICK],
stakingRewardAddress: '0x74A7fdA76A008276705c39B0599916ee8513965c',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 3
},
{
//tokens: [PLOT,USDC],
stakingRewardAddress: '0xB0755c5b3594A9C8845EB383e6E05E7F49460141',
ended: false,
lp: '',
name: '',
//baseToken: USDC,
rate: 3
},
{
//tokens: [ELET,QUICK],
stakingRewardAddress: '0x0E5a923524fC0A14fA4ab108145e4a019D2f2C6a',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 2.5
},
{
//tokens: [VISION,QUICK],
stakingRewardAddress: '0x859f1E2490B4F62C5D32cf9409e2bBF43dfA3B61',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 2.5
},
{
//tokens: [GAME,ETHER],
stakingRewardAddress: '0x5554281f7e473d93779722e5aa4c2f62C11283fd',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 2.5
},
{
//tokens: [MADAI,MAUSDC],
stakingRewardAddress: '0x7131eBbC3e08E8e0D8938DFd36D3E76B874Fc75e',
ended: false,
lp: '',
name: '',
//baseToken: MAUSDC,
rate: 2
},
{
//tokens: [MAWETH,MAUSDC],
stakingRewardAddress: '0x2Ee1eaE8fB3F5F56ABB882D48E2d767DA0211D8E',
ended: false,
lp: '',
name: '',
//baseToken: MAUSDC,
rate: 2
},
{
//tokens: [CTSI,QUICK],
stakingRewardAddress: '0x4AB627237c2ce3719Ca42940c641Cd3dDbC83C0A',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 2
},
{
//tokens: [CTSI,MATIC],
stakingRewardAddress: '0x2d0D7FD1bFcbF01947fdc40B507BD73B0863f2D5',
ended: false,
lp: '',
name: '',
//baseToken: MATIC,
rate: 2
},
{
//tokens: [IGG,ETHER],
stakingRewardAddress: '0x88D6E84D7220A001F031fA5C8b44E77F957Fe1cD',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 2
},
{
//tokens: [QUICK,OM],
stakingRewardAddress: '0xe1fE89651932D84e7880651187547869CA524976',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 2
},
{
//tokens: [BTU,MATIC],
stakingRewardAddress: '0xe46E640b9E47080aE2cDe82B30500445C857d6d1',
ended: false,
lp: '',
name: '',
//baseToken: MATIC,
rate: 2
},
{
//tokens: [MATUSD,MAUSDC],
stakingRewardAddress: '0xD854f08373a97237C7a830e1e34475535CB1eaDE',
ended: false,
lp: '',
name: '',
//baseToken: MAUSDC,
rate: 1.5
},
{
//tokens: [MAAAVE,MAUSDC],
stakingRewardAddress: '0xe985c9416D05B3b3872d9e640C9590FaC37705Bd',
ended: false,
lp: '',
name: '',
//baseToken: MAUSDC,
rate: 1.5
},
{
//tokens: [MAUSDT,MAUSDC],
stakingRewardAddress: '0xA694345b2f208DA59ebF3fc6b66E97c0CA18C3E1',
ended: false,
lp: '',
name: '',
//baseToken: MAUSDC,
rate: 1.5
},
{
//tokens: [DB,ETHER],
stakingRewardAddress: '0xd437c3c9Ca21D634878BDDBf973bCFB23D280E86',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 1
},
{
//tokens: [DSLA,QUICK],
stakingRewardAddress: '0xB9Ce318ac54EC8b3aa17d18dFfb0EC3c46E88fef',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 1
},
{
//tokens: [DB,MATIC],
stakingRewardAddress: '0x35CEADEd1457aE4AaD028ff996DC5A889Ea8d7C1',
ended: false,
lp: '',
name: '',
//baseToken: MATIC,
rate: 1
},
{
//tokens: [ETHER,DMT],
stakingRewardAddress: '0x255Df2Ae958aCe49eC9E24B59d5327c6D918C81b',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 1
},
{
//tokens: [ELET,MATIC],
stakingRewardAddress: '0xDa534f1282F832BAc82Ec4502dA6fAd7a60e63A3',
ended: false,
lp: '',
name: '',
//baseToken: MATIC,
rate: 1
},
{
//tokens: [MALINK,MAUSDC],
stakingRewardAddress: '0x211B1312Bb797Ee7c7193AE87481E0B5f259c0a5',
ended: false,
lp: '',
name: '',
//baseToken: MAUSDC,
rate: 1
},
{
//tokens: [QUICK,AZUKI],
stakingRewardAddress: '0xfBCf532DeE2A6d2f45bD89419adaA07457d50CF9',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 1
},
{
//tokens: [HEX,ETHER],
stakingRewardAddress: '0x9Be3481DD287345Bb9C8B8DDC836e1D0054Edd46',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 1
},
{
//tokens: [CFI,QUICK],
stakingRewardAddress: '0x04cda3ed6750AAb11e2A50029460543E914dD81D',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 0.8
},
{
//tokens: [DSLA,ETHER],
stakingRewardAddress: '0x4A47Ea19241058b1F960331c3f1a1B4BD7D4A584',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 0.5
},
{
//tokens: [QUICK,ZUZ],
stakingRewardAddress: '0xC1B0A3f47f05A58a7D83855B9F9e8C5f4042dc8c',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 0.4
},
{
//tokens: [ETHER,OM],
stakingRewardAddress: '0xA0218a57CC1D595aF0b79Af450f37fc4207dE94C',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 0.25
},
{
//tokens: [PPDEX,QUICK],
stakingRewardAddress: '0xC6a6B2d95B99CA9c3149f8dF8f22E1e34fb75ccc',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 0.25
},
{
//tokens: [ZUT,QUICK],
stakingRewardAddress: '0x06c0b1461740a8570f755cf26e7B418862c3998B',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 0.2
},
{
//tokens: [QUICK,MDEF],
stakingRewardAddress: '0xdE1140Ff770F83a59e91c3a04c6628D86e8414f2',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 0.2
},
{
//tokens: [DRC,QUICK],
stakingRewardAddress: '0x86806771672fb51a04be7BcdC4546fC111BBbA57',
ended: false,
lp: '',
name: '',
//baseToken: QUICK,
rate: 0.2
},
{
//tokens: [ETHER,AZUKI],
stakingRewardAddress: '0x8d8fDaEcCC776c8E76B8320e8BC29dcC8BC07907',
ended: false,
lp: '',
name: '',
//baseToken: ETHER,
rate: 0.1
},
{
//tokens: [CFI,USDC],
stakingRewardAddress: '0x579eabaED8cdA62D502c219392d9C07B142e0af6',
ended: false,
lp: '',
name: '',
//baseToken: USDC,
rate: 0.1
}
]
/*!
* YieldFarming
* Boilerplate for a Static website using EJS and SASS
* https://yieldfarming.info
* @author Jongseung Lim -- https://yieldfarming.info
* Copyright 2021. MIT Licensed.
*/
async function getMaticUniPool(App, pool, poolAddress, stakingAddress) {
let q0, q1;
const reserves = await pool.getReserves();
q0 = reserves._reserve0;
q1 = reserves._reserve1;
const decimals = await pool.decimals();
const token0 = await pool.token0();
const token1 = await pool.token1();
return {
symbol : await pool.symbol(),
name : await pool.name(),
address: poolAddress,
token0,
q0,
token1,
q1,
totalSupply: await pool.totalSupply() / 10 ** decimals,
stakingAddress: stakingAddress,
staked: await pool.balanceOf(stakingAddress) / 10 ** decimals,
decimals: decimals,
unstaked: await pool.balanceOf(App.YOUR_ADDRESS) / 10 ** decimals,
contract: pool,
tokens : [token0, token1],
is1inch : false
};
}
async function getMatic20(App, token, address, stakingAddress) {
if (address == "0x0000000000000000000000000000000000000000") {
return {
address,
name : "Matic",
symbol : "MATIC",
totalSupply: 1e8,
decimals: 18,
staked: 0,
unstaked: 0,
contract: null,
tokens:[address]
}
}
const decimals = await token.decimals()
return {
address,
name : await token.name(),
symbol : await token.symbol(),
totalSupply : await token.totalSupply(),
decimals : decimals,
staked: await token.balanceOf(stakingAddress) / 10 ** decimals,
unstaked: await token.balanceOf(App.YOUR_ADDRESS) / 10 ** decimals,
contract: token,
tokens : [address]
};
}
async function getMaticStoredToken(App, tokenAddress, stakingAddress, type) {
switch (type) {
case "uniswap":
const pool = new ethers.Contract(tokenAddress, UNI_ABI, App.provider);
return await getMaticUniPool(App, pool, tokenAddress, stakingAddress);
case "matic20":
const matic20 = new ethers.Contract(tokenAddress, ERC20_ABI, App.provider);
return await getMatic20(App, matic20, tokenAddress, stakingAddress);
}
}
async function getMaticToken(App, tokenAddress, stakingAddress) {
if (tokenAddress == "0x0000000000000000000000000000000000000000") {
return getMatic20(App, null, tokenAddress, "")
}
const type = window.localStorage.getItem(tokenAddress);
if (type) return getMaticStoredToken(App, tokenAddress, stakingAddress, type);
try {
const pool = new ethers.Contract(tokenAddress, UNI_ABI, App.provider);
const _token0 = await pool.token0();
const uniPool = await getMaticUniPool(App, pool, tokenAddress, stakingAddress);
window.localStorage.setItem(tokenAddress, "uniswap");
return uniPool;
}
catch(err) {
}
try {
const matic20 = new ethers.Contract(tokenAddress, ERC20_ABI, App.provider);
const _name = await matic20.name();
const matic20tok = await getMatic20(App, matic20, tokenAddress, stakingAddress);
window.localStorage.setItem(tokenAddress, "matic20");
return matic20tok;
}
catch(err) {
console.log(err);
console.log(`Couldn't match ${tokenAddress} to any known token type.`);
}
}
async function loadMaticSynthetixPoolInfo(App, tokens, prices, stakingAbi, stakingAddress,
rewardTokenFunction, stakeTokenFunction) {
const STAKING_POOL = new ethers.Contract(stakingAddress, stakingAbi, App.provider);
if (!STAKING_POOL.callStatic[stakeTokenFunction]) {
console.log("Couldn't find stake function ", stakeTokenFunction);
}
const stakeTokenAddress = await STAKING_POOL.callStatic[stakeTokenFunction]();
const rewardTokenAddress = await STAKING_POOL.callStatic[rewardTokenFunction]();
var stakeToken = await getMaticToken(App, stakeTokenAddress, stakingAddress);
if (stakeTokenAddress.toLowerCase() === rewardTokenAddress.toLowerCase()) {
stakeToken.staked = await STAKING_POOL.totalSupply() / 10 ** stakeToken.decimals;
}
var newTokenAddresses = stakeToken.tokens.filter(x =>
!getParameterCaseInsensitive(tokens,x));
for (const address of newTokenAddresses) {
tokens[address] = await getMaticToken(App, address, stakingAddress);
}
if (!getParameterCaseInsensitive(tokens, rewardTokenAddress)) {
tokens[rewardTokenAddress] = await getMaticToken(App, rewardTokenAddress, stakingAddress);
}
const rewardToken = getParameterCaseInsensitive(tokens, rewardTokenAddress);
const rewardTokenTicker = rewardToken.symbol;
const poolPrices = getPoolPrices(tokens, prices, stakeToken, "matic");
if (!poolPrices)
{
console.log(`Couldn't calculate prices for pool ${stakeTokenAddress}`);
return null;
}
const stakeTokenTicker = poolPrices.stakeTokenTicker;
const stakeTokenPrice =
prices[stakeTokenAddress]?.usd ?? getParameterCaseInsensitive(prices, stakeTokenAddress)?.usd;
const rewardTokenPrice = getParameterCaseInsensitive(prices, rewardTokenAddress)?.usd;
const periodFinish = await STAKING_POOL.periodFinish();
const rewardRate = await STAKING_POOL.rewardRate();
const weeklyRewards = (Date.now() / 1000 > periodFinish) ? 0 : rewardRate / 1e18 * 604800;
const usdPerWeek = weeklyRewards * rewardTokenPrice;
const staked_tvl = poolPrices.staked_tvl;
const userStaked = await STAKING_POOL.balanceOf(App.YOUR_ADDRESS) / 10 ** stakeToken.decimals;
const userUnstaked = stakeToken.unstaked;
const earned = await STAKING_POOL.earned(App.YOUR_ADDRESS) / 10 ** rewardToken.decimals;
return {
stakingAddress,
poolPrices,
stakeTokenAddress,
rewardTokenAddress,
stakeTokenTicker,
rewardTokenTicker,
stakeTokenPrice,
rewardTokenPrice,
weeklyRewards,
usdPerWeek,
staked_tvl,
userStaked,
userUnstaked,
earned
}
}
async function loadMaticSynthetixPool(App, tokens, prices, abi, address, rewardTokenFunction, stakeTokenFunction) {
const info = await loadMaticSynthetixPoolInfo(App, tokens, prices, abi, address, rewardTokenFunction, stakeTokenFunction);
if (!info) return null;
return await printSynthetixPool(App, info, "matic");
}
async function loadMaticBasisFork(data) {
const App = await init_ethers();
_print(`Initialized ${App.YOUR_ADDRESS}`);
_print("Reading smart contracts...\n");
var tokens = {};
var prices = {};
var totalStaked = 0;
let p1 = await loadMaticSynthetixPool(App, tokens, prices, data.PoolABI,
data.SharePool.address, data.SharePool.rewardToken, data.SharePool.stakeToken);
totalStaked += p1.staked_tvl;
if (data.SharePool2) {
let p3 = await loadMaticSynthetixPool(App, tokens, prices, data.PoolABI,
data.SharePool2.address, data.SharePool2.rewardToken, data.SharePool2.stakeToken);
totalStaked += p3.staked_tvl;
}
let p2 = await loadMaticSynthetixPool(App, tokens, prices, data.PoolABI,
data.CashPool.address, data.CashPool.rewardToken, data.CashPool.stakeToken);
totalStaked += p2.staked_tvl;
if (data.SeedBanks) {
let p = await loadMultipleMaticSynthetixPools(App, tokens, prices, data.SeedBanks)
totalStaked += p.staked_tvl;
if (p.totalUserStaked > 0) {
_print(`You are staking a total of $${formatMoney(p.totalUserStaked)} at an APR of ${(p.totalAPR * 100).toFixed(2)}%\n`);
}
}
if (!data.SeedBanks)
{
if (data.Boardrooms) {
for (const boardroom of data.Boardrooms) {
let br = await loadBoardroom(App, prices, boardroom.address, data.Oracle, data.UniswapLP, data.Cash,
data.ShareTicker, data.CashTicker, data.ExpansionsPerDay, data.MaximumExpansion,
data.Decimals, boardroom.ratio, data.TargetMantissa);
totalStaked += br.staked_tvl;
}
}
else {
let br = await loadBoardroom(App, prices, data.Boardroom, data.Oracle, data.UniswapLP, data.Cash,
data.ShareTicker, data.CashTicker, data.ExpansionsPerDay, data.MaximumExpansion,
data.Decimals, 1, data.TargetMantissa);
totalStaked += br.staked_tvl;
}
}
_print_bold(`Total staked: $${formatMoney(totalStaked)}`)
hideLoading();
}
async function getMaticPoolInfo(app, chefContract, chefAddress, poolIndex, pendingRewardsFunction) {
const poolInfo = await chefContract.poolInfo(poolIndex);
if (poolInfo.allocPoint == 0) {
return {
address: poolInfo.lpToken,
allocPoints: poolInfo.allocPoint ?? 1,
poolToken: null,
userStaked : 0,
pendingRewardTokens : 0,
};
}
const poolToken = await getMaticToken(app, poolInfo.lpToken, chefAddress);
const userInfo = await chefContract.userInfo(poolIndex, app.YOUR_ADDRESS);
const pendingRewardTokens = await chefContract.callStatic[pendingRewardsFunction](poolIndex, app.YOUR_ADDRESS);
const staked = userInfo.amount / 10 ** poolToken.decimals;
return {
address: poolInfo.lpToken,
allocPoints: poolInfo.allocPoint ?? 1,
poolToken: poolToken,
userStaked : staked,
pendingRewardTokens : pendingRewardTokens / 10 ** 18,
};
}
async function loadMaticChefContract(App, tokens, prices, chef, chefAddress, chefAbi, rewardTokenTicker,
rewardTokenFunction, rewardsPerBlockFunction, rewardsPerWeekFixed, pendingRewardsFunction,
deathPoolIndices) {
const chefContract = chef ?? new ethers.Contract(chefAddress, chefAbi, App.provider);
const poolCount = parseInt(await chefContract.poolLength(), 10);
const totalAllocPoints = await chefContract.totalAllocPoint();
_print(`Found ${poolCount} pools.\n`)
_print(`Showing incentivized pools only.\n`);
var tokens = {};
const rewardTokenAddress = await chefContract.callStatic[rewardTokenFunction]();
const rewardToken = await getMaticToken(App, rewardTokenAddress, chefAddress);
const rewardsPerWeek = rewardsPerWeekFixed ??
await chefContract.callStatic[rewardsPerBlockFunction]()
/ 10 ** rewardToken.decimals * 604800 / 3
const poolInfos = await Promise.all([...Array(poolCount).keys()].map(async (x) =>
await getMaticPoolInfo(App, chefContract, chefAddress, x, pendingRewardsFunction)));
var tokenAddresses = [].concat.apply([], poolInfos.filter(x => x.poolToken).map(x => x.poolToken.tokens));
await Promise.all(tokenAddresses.map(async (address) => {
tokens[address] = await getMaticToken(App, address, chefAddress);
}));
if (deathPoolIndices) { //load prices for the deathpool assets
deathPoolIndices.map(i => poolInfos[i])
.map(poolInfo =>
poolInfo.poolToken ? getPoolPrices(tokens, prices, poolInfo.poolToken, "matic") : undefined);
}
const poolPrices = poolInfos.map(poolInfo => poolInfo.poolToken ? getPoolPrices(tokens, prices, poolInfo.poolToken, "matic") : undefined);
_print("Finished reading smart contracts.\n");
for (i = 0; i < poolCount; i++) {
if (poolPrices[i]) {
printChefPool(App, chefAbi, chefAddress, prices, tokens, poolInfos[i], i, poolPrices[i],
totalAllocPoints, rewardsPerWeek, rewardTokenTicker, rewardTokenAddress,
pendingRewardsFunction, "matic");
}
}
}
const maticTokens = [
{ "id": "matic","symbol": "MATIC","contract": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270" },
{ "id": "tether","symbol": "USDT", "contract": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F" },
{ "id": "bitcoin","symbol": "WBTC", "contract": "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6" },
{ "id": "ethereum", "symbol": "WETH", "contract": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619" },
{ "id": "usd-coin","symbol": "USDC", "contract": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174" },
{ "id": "dai","symbol": "DAI", "contract": "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063" },
{ "id": "quick","symbol": "QUICK", "contract": "0x831753DD7087CaC61aB5644b308642cc1c33Dc13" },
{ "id": "stake-dao", "symbol": "SDT", "contract": "0x361A5a4993493cE00f61C32d4EcCA5512b82CE90" },
]
async function getMaticPrices() {
const idPrices = await lookUpPrices(maticTokens.map(x => x.id));
const prices = {}
for (const bt of maticTokens)
if (idPrices[bt.id])
prices[bt.contract] = idPrices[bt.id];
return prices;
}
async function loadMultipleMaticSynthetixPools(App, tokens, prices, pools) {
let totalStaked = 0, totalUserStaked = 0, individualAPRs = [];
const infos = await Promise.all(pools.map(p =>
loadMaticSynthetixPoolInfo(App, tokens, prices, p.abi, p.address, p.rewardTokenFunction, p.stakeTokenFunction)));
for (const i of infos.filter(i => i?.poolPrices)) {
let p = await printSynthetixPool(App, i, "matic");
totalStaked += p.staked_tvl || 0;
totalUserStaked += p.userStaked || 0;
if (p.userStaked > 0) {
individualAPRs.push(p.userStaked * p.apr / 100);
}
}
let totalAPR = totalUserStaked == 0 ? 0 : individualAPRs.reduce((x,y)=>x+y, 0) / totalUserStaked;
return { staked_tvl : totalStaked, totalUserStaked, totalAPR };
}
async function loadMultipleMaticSynthetixPoolsSequential(App, tokens, prices, pools) {
let totalStaked = 0, totalUserStaked = 0, individualAPRs = [];
for (const p of pools) {
let res = await loadMaticSynthetixPool(App, tokens, prices, p.abi, p.address, p.rewardTokenFunction, p.stakeTokenFunction);
if (!res) continue;
totalStaked += res.staked_tvl || 0;
totalUserStaked += res.userStaked || 0;
if (res.userStaked > 0) {
individualAPRs.push(res.userStaked * res.apr / 100);
}
}
let totalAPR = totalUserStaked == 0 ? 0 : individualAPRs.reduce((x,y)=>x+y, 0) / totalUserStaked;
return { staked_tvl : totalStaked, totalUserStaked, totalAPR };
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment