function vanity2address(vanity){ var address = ""; for (i = 0; i < 38; i+=2) address += String.fromCharCode(parseInt(vanity.substr(i,2),16)); return address; } function address2vanity(address){ var vanity = ""; for (i = 0; i < 19; i++) vanity += address.charCodeAt(i).toString(16); return vanity; } function blockSigner(blockNumber){ return eth.getBlock(blockNumber).extraData.substr(2,38); } function getSigners(){ var signers = clique.getSigners(); var dict = {}; for (var i = 0; i < signers.length; i++){ dict[address2vanity(signers[i].substr(2,19))] = true; } return dict; } function lastSeen(){ var signers = getSigners(); var last = eth.blockNumber; for(var i = 0; i < 720; i++){ if (Object.keys(signers).length == 0) break; var block = last - i; var signer = blockSigner(block); if (signer in signers){ console.log(vanity2address(signer)+": "+block); delete signers[signer]; } } for (signer in signers) console.log(vanity2address(signer)+": -1"); } lastSeen();