Advertisement
Guest User

SNX account

a guest
Apr 9th, 2020
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const snxjs = new SynthetixJs.SynthetixJs();
  2. const { formatBytes32String } = SynthetixJs.SynthetixJs.utils;
  3. const { synths } = snxjs.contractSettings;
  4. const input = document.querySelector('input[name=address]');
  5. input.addEventListener('change', () => {
  6.   lookup();
  7. });
  8.  
  9. const summaryTable = document.querySelector('.flextables *:nth-child(1) table');
  10. const portfolioTable = document.querySelector('.flextables *:nth-child(2) table');
  11.  
  12. const chartTrendingDebtContainer = document.querySelector('.flextables *:nth-child(1) section');
  13. const chartPortfolioContainer = document.querySelector('.flextables *:nth-child(2) section');
  14.  
  15. const lookup = async () => {
  16.   const fromBlock = document.querySelector('input[name=fromBlock]').value;
  17.   const blockOptions = fromBlock ? { blockTag: Number(fromBlock) } : {};
  18.  
  19.    const account = input.value;
  20.    summaryTable.innerHTML = '<img src="https://media.giphy.com/media/TvLuZ00OIADoQ/giphy.gif" width=150 />';
  21.    portfolioTable.innerHTML = summaryTable.innerHTML;
  22.    //chartTrendingDebtContainer.innerHTML = summaryTable.innerHTML;
  23.    chartPortfolioContainer.innerHTML = summaryTable.innerHTML;
  24.   try {
  25.     const results = await Promise.all([snxjs.SynthetixState.issuanceRatio(), snxjs.ExchangeRates.contract.rateForCurrency(formatBytes32String('SNX'), blockOptions), snxjs.Synthetix.contract.transferableSynthetix(account, blockOptions), snxjs.Synthetix.contract.collateral(account, blockOptions), snxjs.Synthetix.contract.collateralisationRatio(account, blockOptions), snxjs.sUSD.contract.balanceOf(account, blockOptions), snxjs.Synthetix.contract.debtBalanceOf(account, formatBytes32String('sUSD'), blockOptions), snxjs.FeePool.contract.feesAvailable(account, blockOptions)]);
  26.     const [ issuanceRatio, usdToSnxPrice, unlockedSnx, collateral, collateralRatio,sUSDBalance, debtBalance, [currentFeesAvailable, currentRewardsAvailable] ] = results.map(input => Array.isArray(input) ? input.map(snxjs.utils.formatEther) : snxjs.utils.formatEther(input));
  27.    
  28.     const currentCRatio = (1/collateralRatio)*100;
  29.  
  30.     summaryTable.innerHTML = `
  31.       <tr><th>SNX Price</th><td>${Number(usdToSnxPrice).toFixed(5)} USD</td></tr>
  32.       <tr><th>Total Collateral</th><td>${Number(collateral * usdToSnxPrice).toFixed(2)} USD (${Number(collateral).toFixed(2)} SNX)</td></tr>
  33.       <tr><th>Unlocked SNX</th><td>${Number(unlockedSnx * usdToSnxPrice).toFixed(2)} USD (${Number(unlockedSnx).toFixed(2)} SNX) ${Math.round(unlockedSnx/collateral * 100)}</td></tr>
  34.       <tr><th>Ratio</th><td>${Number(collateralRatio).toFixed(5)}</td></tr>
  35.       <tr><th>Current sUSD Balance</th><td>${Number(sUSDBalance).toFixed(2)} sUSD</td></tr>
  36.       <tr><th>Total Debt Owed</th><td>${Number(debtBalance).toFixed(2)} sUSD</td></tr>
  37.       <tr><th>Current Collateralization Ratio</th><td>${Math.round(currentCRatio)}%</td></tr>
  38.       <tr><th>Fees Available</th><td>${numbro(currentFeesAvailable).format('0,0.00')}</td></tr>
  39.       <tr><th>Rewards Available</th><td>${numbro(currentRewardsAvailable).format('0,0.00')}</td></tr>
  40.     `;
  41.   } catch (err) {
  42.     summaryTable.innerHTML = `<span style="color:red">${err}</span>`;
  43.   }
  44.  
  45.  
  46.  
  47.   const availableSynths = synths.filter(({ asset }) => asset);
  48.  
  49.   const balances = await Promise.all(availableSynths.map(({ name }) => snxjs[name].contract.balanceOf(account, blockOptions)));
  50.  
  51.   const balancesEffective = await Promise.all(availableSynths.map(({ name }, i) => snxjs.ExchangeRates.contract.effectiveValue(formatBytes32String(name), balances[i], formatBytes32String('sUSD'), blockOptions)));
  52.  
  53.   const balancesInUSD = balancesEffective.map(snxjs.utils.formatEther);
  54.  
  55.   const totalInPortfolio = balancesInUSD.reduce((a, b) => Number(a) + Number(b), 0);
  56.  
  57.   const holdings = availableSynths.map(({ name }, i) => {
  58.     return {
  59.       synthKey: name,
  60.       balanceOf: snxjs.utils.formatEther(balances[i]),
  61.       balanceInUSD: balancesInUSD[i],
  62.       percentage: balancesInUSD[i] / totalInPortfolio
  63.     };
  64.   }).filter(({ balanceOf }) => Number(balanceOf) > 0);
  65.  
  66.   portfolioTable.innerHTML = `<tr><th>Synth</th><th>Balance</th><th>USD value</th><th>Percentage</th></tr>`;
  67.  
  68.   holdings.sort((a, b) => Number(a.balanceInUSD) > Number(b.balanceInUSD) ? -1 : 1).forEach(({ synthKey, balanceOf, balanceInUSD, percentage }) => {
  69.     portfolioTable.innerHTML += `<tr><td>${synthKey}</td><td>${Number(balanceOf).toFixed(4)}</td><td>$${Number(balanceInUSD).toFixed(2)}</td><td>${Number(percentage * 100).toFixed(2)}</td></tr>`;
  70.   });
  71.  
  72.   // summary row
  73.   portfolioTable.innerHTML += `<tr><td></td><td>Total USD</td><td>${Number(totalInPortfolio).toFixed(2)}</td><td></td></tr>`;
  74.  
  75.   const chart1 = new frappe.Chart(chartPortfolioContainer, {  
  76.     data: {
  77.       labels: holdings.map(({ synthKey }) => synthKey),
  78.       datasets: [
  79.           {
  80.               name: "Synth Portfolio",
  81.               values: holdings.map(({ balanceInUSD }) => Number((balanceInUSD / totalInPortfolio * 100).toFixed(2)))
  82.           }
  83.       ]
  84.     },
  85.     type: 'percentage'
  86.   });
  87.      
  88.  
  89.   // show debt balance over time chart
  90.   const currentBlockNumber = await snxjs.ethers.getDefaultProvider().getBlockNumber();
  91.   const blocks = [];
  92.   let debtBalances = [];
  93.  
  94.   for (let i = 0; i < 10; i++) {
  95.     blocks.push(currentBlockNumber - (i*10000)); // about a day ago
  96.   }
  97.  
  98.   debtBalances = (await Promise.all(blocks.map(blockTag => snxjs.Synthetix.contract.debtBalanceOf(account, formatBytes32String('sUSD'), { blockTag })))).map(snxjs.utils.formatEther);
  99.  
  100.  
  101.   const chart2 = new frappe.Chart(chartTrendingDebtContainer, {  
  102.     title: "Debt balance over time",
  103.     data: {
  104.       labels: blocks.reverse(),
  105.       datasets: [
  106.           {
  107.               name: "Debt Balance", type: "line",
  108.               values: debtBalances.reverse()
  109.           }
  110.       ]
  111.     },
  112.     type: 'line',
  113.     height: 250,
  114.     colors: ['#7cd6fd', '#743ee2']
  115.   });
  116.  
  117. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement