1<html> 2<head> 3 <meta charset="UTF-8"/> 4 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6
6<script src="https://cdnjs.cloudflare.com/ajax/libs/web3/1.6.1/web3.min.js" integrity="sha512-5erpERW8MxcHDF7Xea9eBQPiRtxbse70pFcaHJuOhdEBQeAxGQjUwgJbuBDWve+xP/u5IoJbKjyJk50qCnMD7A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
6 7
7<script src="eth-session.js"></script>
7 8</head> 9<body> 10<label>Contract:</label> <input type="text" id="contract-address" /> <button id="load-button">Load</button> 11<div id="output"></div> 12<div id="logs" style="white-space: pre-wrap;"></div>
13<script> 14let session; 15async function loadContract(){ 16 const contractAddress = document.getElementById( 'contract-address' ).value; 17 session = new EthereumSession({ 18 'chain': EthereumSession.COMMON_CHAINS[1], 19 'contractAddress': contractAddress, 20 'contractABI': [{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}] 21 }); 22 23 await session.connectWeb3(); 24 if( !session.isConnected() ) 25 await session.connectWeb3( true ); 26 27 const balanceWei = await session.web3client.eth.getBalance( contractAddress ); 28 const balanceWeiBN = balanceWei instanceof Web3.utils.BN ? 29 balanceWei : new Web3.utils.BN( balanceWei ); 30 31 const totalShares = Number(await session.contract.methods.totalShares().call()); 32 const totalSharesBN = new Web3.utils.BN( totalShares ); 33 34 const totalReleasedWei = await session.contract.methods.totalReleased().call(); 35 const totalReleasedWeiBN = totalReleasedWei instanceof Web3.utils.BN ? 36 totalReleasedWei : new Web3.utils.BN( totalReleasedWei ); 37 38 39 //uint256 totalReceived = address(this).balance + _totalReleased; 40 const totalWeiBN = balanceWeiBN.add( totalReleasedWeiBN ); 41 42 43 let i = 0; 44 let html = ''; 45 let foundShares = 0; 46 const accounts = {}; 47 while( foundShares < totalShares ){ 48 try{ 49 const account = await session.contract.methods.payee( i++ ).call(); 50 const shares = Number(await session.contract.methods.shares( account ).call()); 51 const sharesBN = new Web3.utils.BN( shares ); 52 53 const releasedWei = await session.contract.methods.released( account ).call(); 54 const releasedWeiBN = releasedWei instanceof Web3.utils.BN ? 55 releasedWei : new Web3.utils.BN( releasedWei ); 56 57 if( account in accounts ){ 58 session.error( `Account '${account}' has conflicting shares '${accounts[ account ].shares}' (active) and '${shares}' (ignored)` ); 59 break; 60 } 61 62 //uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account]; 63 const paymentBN = totalWeiBN.mul( sharesBN ).div( totalSharesBN ).sub( releasedWeiBN ); 64 65 foundShares += shares; 66 accounts[ account ] = { 67 'percent': shares / totalShares, 68 'shares': shares, 69 'releasedWei': releasedWeiBN, 70 'paymentWei': paymentBN 71 } 72 73 html += '<tr>'+ 74 '<td>'+ account +'</td>'+ 75 76 '<td></td>'+ 77 //'<td></td>'+ 78 79 '<td align="right">'+ Web3.utils.fromWei( releasedWeiBN.toString() ) +'</td>'+ 80 //'<td align="right">'+ releasedWeiBN.toString() +'</td>'+ 81 82 '<td align="right">'+ Web3.utils.fromWei( paymentBN.toString() ) +'</td>'+ 83 //'<td align="right">'+ paymentBN.toString() +'</td>'+ 84 85 '</tr>'; 86 } 87 catch( err ){ 88 session.warn( err ); 89 break; 90 } 91 } 92 93 document.getElementById( 'output' ).innerHTML = '<table border="1" cellpadding="2" cellspacing="0" width="100%">'+ 94 '<thead>'+ 95 '<tr>'+ 96 '<th></th>'+ 97 '<th align="center">Total (ETH)</th>'+ 98 //'<th align="center">Total (WEI)</th>'+ 99 '<th align="center">Released (ETH)</th>'+ 100 //'<th align="center">Released (WEI)</th>'+ 101 '<th align="center">Balance (ETH)</th>'+ 102 //'<th align="center">Balance (WEI)</th>'+ 103 '</tr>'+ 104 '</thead>'+ 105 '<tbody>'+ 106 '<tr>'+ 107 '<td></td>'+ 108 109 '<td align="right">'+ Web3.utils.fromWei( totalWeiBN.toString() ) +'</td>'+ 110 //'<td align="right">'+ totalWeiBN.toString() +'</td>'+ 111 112 '<td align="right">'+ Web3.utils.fromWei( totalReleasedWeiBN.toString() ) +'</td>'+ 113 //'<td align="right">'+ totalReleasedWeiBN.toString() +'</td>'+ 114 115 '<td align="right">'+ Web3.utils.fromWei( balanceWeiBN.toString() ) +'</td>'+ 116 //'<td align="right">'+ balanceWeiBN.toString() +'</td>'+ 117 118 '</tr>'+ 119 html+ 120 '</tbody>'+ 121 '</table>'; 122} 123 124window.addEventListener( 'DOMContentLoaded', () => { 125 document.getElementById( 'load-button' ).addEventListener( 'click', evt => { 126 if( evt && evt.cancelable ) 127 evt.preventDefault(); 128 129 loadContract(); 130 }); 131}); 132</script>
132 133</body> 134</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.