moac-lightwallets
Version:
A lightweight moac javascript wallet.
173 lines (139 loc) • 7.49 kB
HTML
<html>
<body>
<script src="../dist/lightwallet.min.js"></script>
<script type="text/javascript" src="../node_modules/web3/dist/web3.js"></script>
<script type="text/javascript" src="../node_modules/hooked-web3-provider/build/hooked-web3-provider.js"></script>
<script type="text/javascript" src="../node_modules/async/lib/async.js"></script>
<script>
var web3 = new Web3();
var global_keystore;
function setWeb3Provider(keystore) {
var web3Provider = new HookedWeb3Provider({
host: "http://104.236.65.136:8545",
transaction_signer: keystore
});
web3.setProvider(web3Provider);
}
function newAddresses(password) {
if (password == '') {
password = prompt('Enter password to retrieve addresses', 'Password');
}
var numAddr = parseInt(document.getElementById('numAddr').value)
lightwallet.keystore.deriveKeyFromPassword(password, function(err, pwDerivedKey) {
global_keystore.generateNewAddress(pwDerivedKey, numAddr);
var addresses = global_keystore.getAddresses();
document.getElementById('sendFrom').innerHTML = ''
document.getElementById('functionCaller').innerHTML = ''
for (var i=0; i<addresses.length; ++i) {
document.getElementById('sendFrom').innerHTML += '<option value="' + addresses[i] + '">' + addresses[i] + '</option>'
document.getElementById('functionCaller').innerHTML += '<option value="' + addresses[i] + '">' + addresses[i] + '</option>'
}
getBalances();
})
}
function getBalances() {
var addresses = global_keystore.getAddresses();
document.getElementById('addr').innerHTML = 'Retrieving addresses...'
async.map(addresses, web3.eth.getBalance, function(err, balances) {
async.map(addresses, web3.eth.getTransactionCount, function(err, nonces) {
document.getElementById('addr').innerHTML = ''
for (var i=0; i<addresses.length; ++i) {
document.getElementById('addr').innerHTML += '<div>' + addresses[i] + ' (Bal: ' + (balances[i] / 1.0e18) + ' ETH, Nonce: ' + nonces[i] + ')' + '</div>'
}
})
})
}
function setSeed() {
var password = prompt('Enter Password to encrypt your seed', 'Password');
lightwallet.keystore.deriveKeyFromPassword(password, function(err, pwDerivedKey) {
global_keystore = new lightwallet.keystore(
document.getElementById('seed').value,
pwDerivedKey);
document.getElementById('seed').value = ''
newAddresses(password);
setWeb3Provider(global_keystore);
getBalances();
})
}
function newWallet() {
var extraEntropy = document.getElementById('userEntropy').value;
document.getElementById('userEntropy').value = '';
var randomSeed = lightwallet.keystore.generateRandomSeed(extraEntropy);
var infoString = 'Your new wallet seed is: "' + randomSeed +
'". Please write it down on paper or in a password manager, you will need it to access your wallet. Do not let anyone see this seed or they can take your Ether. ' +
'Please enter a password to encrypt your seed while in the browser.'
var password = prompt(infoString, 'Password');
lightwallet.keystore.deriveKeyFromPassword(password, function(err, pwDerivedKey) {
global_keystore = new lightwallet.keystore(
randomSeed,
pwDerivedKey);
newAddresses(password);
setWeb3Provider(global_keystore);
getBalances();
})
}
function showSeed() {
var password = prompt('Enter password to show your seed. Do not let anyone else see your seed.', 'Password');
lightwallet.keystore.deriveKeyFromPassword(password, function(err, pwDerivedKey) {
var seed = global_keystore.getSeed(pwDerivedKey);
alert('Your seed is: "' + seed + '". Please write it down.')
})
}
function sendEth() {
var fromAddr = document.getElementById('sendFrom').value
var toAddr = document.getElementById('sendTo').value
var valueEth = document.getElementById('sendValueAmount').value
var value = parseFloat(valueEth)*1.0e18
var gasPrice = 50000000000
var gas = 50000
web3.eth.sendTransaction({from: fromAddr, to: toAddr, value: value, gasPrice: gasPrice, gas: gas}, function (err, txhash) {
console.log('error: ' + err)
console.log('txhash: ' + txhash)
})
}
function functionCall() {
var fromAddr = document.getElementById('functionCaller').value
var contractAddr = document.getElementById('contractAddr').value
var abi = JSON.parse(document.getElementById('contractAbi').value)
var contract = web3.eth.contract(abi).at(contractAddr)
var functionName = document.getElementById('functionName').value
var args = JSON.parse('[' + document.getElementById('functionArgs').value + ']')
var valueEth = document.getElementById('sendValueAmount').value
var value = parseFloat(valueEth)*1.0e18
var gasPrice = 50000000000
var gas = 3141592
args.push({from: fromAddr, value: value, gasPrice: gasPrice, gas: gas})
var callback = function(err, txhash) {
console.log('error: ' + err)
console.log('txhash: ' + txhash)
}
args.push(callback)
contract[functionName].apply(this, args)
}
</script>
<h1>LightWallet</h1>
<h2>New Wallet</h2>
<div><input type="text" id="userEntropy" placeholder="Type random text to generate entropy" size="80"></input><button onclick="newWallet()">Create New Wallet</button></div>
<h2>Restore Wallet</h2>
<div><input type="text" id="seed" value="" size="80"></input><button onclick="setSeed()">Restore wallet from Seed</button></div>
<h2>Show Addresses</h2>
<div>Show <input type="text" id="numAddr" size="5" value="3"></input> more address(es) <button onclick="newAddresses('')">Show</button></div>
<div id="addr"></div>
<div><button onClick='getBalances()'>Refresh</button></div>
<h2>Send Ether</h2>
<div>From: <select id="sendFrom"></select></div>
<div>To: <input type="text" size="40" id="sendTo"></input></div>
<div>Ether: <input type="text" id="sendValueAmount"></div>
<div><button onclick="sendEth()">Send Ether</button></div>
<h2>Show Seed</h2>
<button onclick="showSeed()">Show Seed</button>
<h2>Function Call</h2>
<div>Caller: <select id="functionCaller"></select></div>
<div>Contract Address: <input type="text" size="40" id="contractAddr"></input></div>
<div>Contract ABI: <input type="text" size="40" id="contractAbi"></input></div>
<div>Function Name: <input type="text" size="20" id="functionName"></input></div>
<div>Function Arguments: <input type="text" size="40" id="functionArgs"></input></div>
<div>Value (Ether): <input type="text" id="sendValueAmount"></div>
<div><button onclick="functionCall()">Call Function</button></div>
</body>
</html>