moac-lightwallets
Version:
A lightweight moac javascript wallet.
107 lines (82 loc) • 3.33 kB
JavaScript
var Transaction = require('ethereumjs-tx');
var coder = require('chain3/lib/solidity/coder');
var rlp = require('rlp');
var CryptoJS = require('crypto-js');
function add0x (input) {
if (typeof(input) !== 'string') {
return input;
}
else if (input.length < 2 || input.slice(0,2) !== '0x') {
return '0x' + input;
}
else {
return input;
}
}
function _encodeFunctionTxData (functionName, types, args) {
var fullName = functionName + '(' + types.join() + ')';
var signature = CryptoJS.SHA3(fullName, { outputLength: 256 }).toString(CryptoJS.enc.Hex).slice(0, 8);
var dataHex = signature + coder.encodeParams(types, args);
return dataHex;
}
function _getTypesFromAbi (abi, functionName) {
function matchesFunctionName(json) {
return (json.name === functionName && json.type === 'function');
}
function getTypes(json) {
return json.type;
}
var funcJson = abi.filter(matchesFunctionName)[0];
return (funcJson.inputs).map(getTypes);
}
function functionTx (abi, functionName, args, txObject) {
// txObject contains gasPrice, gasLimit, nonce, to, value
var types = _getTypesFromAbi(abi, functionName);
var txData = _encodeFunctionTxData(functionName, types, args);
var txObjectCopy = {};
txObjectCopy.to = add0x(txObject.to);
txObjectCopy.gasPrice = add0x(txObject.gasPrice);
txObjectCopy.gasLimit = add0x(txObject.gasLimit);
txObjectCopy.nonce = add0x(txObject.nonce);
txObjectCopy.data = add0x(txData);
txObjectCopy.value = add0x(txObject.value);
return (new Transaction(txObjectCopy)).serialize().toString('hex');
}
function createdContractAddress (fromAddress, nonce) {
var rlpEncodedHex = rlp.encode([new Buffer(fromAddress, 'hex'), nonce]).toString('hex');
var rlpEncodedWordArray = CryptoJS.enc.Hex.parse(rlpEncodedHex);
var hash = CryptoJS.SHA3(rlpEncodedWordArray, {outputLength: 256}).toString(CryptoJS.enc.Hex);
return hash.slice(24);
}
function createContractTx (fromAddress, txObject) {
// txObject contains gasPrice, gasLimit, value, data, nonce
var txObjectCopy = {};
txObjectCopy.to = add0x(txObject.to);
txObjectCopy.gasPrice = add0x(txObject.gasPrice);
txObjectCopy.gasLimit = add0x(txObject.gasLimit);
txObjectCopy.nonce = add0x(txObject.nonce);
txObjectCopy.data = add0x(txObject.data);
txObjectCopy.value = add0x(txObject.value);
var contractAddress = createdContractAddress(fromAddress, txObject.nonce);
var tx = new Transaction(txObjectCopy);
return {tx: tx.serialize().toString('hex'), addr: contractAddress};
}
function valueTx (txObject) {
// txObject contains gasPrice, gasLimit, value, nonce
var txObjectCopy = {};
txObjectCopy.to = add0x(txObject.to);
txObjectCopy.gasPrice = add0x(txObject.gasPrice);
txObjectCopy.gasLimit = add0x(txObject.gasLimit);
txObjectCopy.nonce = add0x(txObject.nonce);
txObjectCopy.value = add0x(txObject.value);
var tx = new Transaction(txObjectCopy);
return tx.serialize().toString('hex');
}
module.exports = {
_encodeFunctionTxData: _encodeFunctionTxData,
_getTypesFromAbi: _getTypesFromAbi,
functionTx: functionTx,
createdContractAddress: createdContractAddress,
createContractTx: createContractTx,
valueTx: valueTx
};