PageSourceSearch

https://hero-development.github.io/payment-splitter/

html hero-development.github.io collected 2026-10-03 09:17:29 UTC 5,328 bytes, 134 lines download raw bytes

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.