ercmanager
Version:
Npm package that simplifies deployment and usage of erc tokens on ethereum Blockchain
176 lines (140 loc) • 13.3 kB
JavaScript
var Web3 = require('web3');
var Tx = require('ethereumjs-tx');
class ERCManager {
constructor(config) {
this.myAddress = config.myAddress;
this.gasPriceGwei = config.configgasPriceGwei || 10;
this.gasLimit = config.gasLimit || 6000000;
this.web3 = new Web3(config.provider || "https://rinkeby.infura.io");
this.privateKey = config.privateKey;
this.abiArray = JSON.parse('[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_initialAmount","type":"uint256"},{"name":"_tokenName","type":"string"},{"name":"_decimalUnits","type":"uint8"},{"name":"_tokenSymbol","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}] ');
this.byteCode = "6060604052341561000f57600080fd5b6040516107ae3803806107ae833981016040528080519190602001805182019190602001805191906020018051600160a060020a03331660009081526001602052604081208790558690559091019050600383805161007292916020019061009f565b506004805460ff191660ff8416179055600581805161009592916020019061009f565b505050505061013a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100e057805160ff191683800117855561010d565b8280016001018555821561010d579182015b8281111561010d5782518255916020019190600101906100f2565b5061011992915061011d565b5090565b61013791905b808211156101195760008155600101610123565b90565b610665806101496000396000f3006060604052600436106100ae5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100b3578063095ea7b31461013d57806318160ddd1461017357806323b872dd1461019857806327e235e3146101c0578063313ce567146101df5780635c6581651461020857806370a082311461022d57806395d89b411461024c578063a9059cbb1461025f578063dd62ed3e14610281575b600080fd5b34156100be57600080fd5b6100c66102a6565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101025780820151838201526020016100ea565b50505050905090810190601f16801561012f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014857600080fd5b61015f600160a060020a0360043516602435610344565b604051901515815260200160405180910390f35b341561017e57600080fd5b6101866103b0565b60405190815260200160405180910390f35b34156101a357600080fd5b61015f600160a060020a03600435811690602435166044356103b6565b34156101cb57600080fd5b610186600160a060020a03600435166104bc565b34156101ea57600080fd5b6101f26104ce565b60405160ff909116815260200160405180910390f35b341561021357600080fd5b610186600160a060020a03600435811690602435166104d7565b341561023857600080fd5b610186600160a060020a03600435166104f4565b341561025757600080fd5b6100c661050f565b341561026a57600080fd5b61015f600160a060020a036004351660243561057a565b341561028c57600080fd5b610186600160a060020a036004358116906024351661060e565b60038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561033c5780601f106103115761010080835404028352916020019161033c565b820191906000526020600020905b81548152906001019060200180831161031f57829003601f168201915b505050505081565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b60005481565b600160a060020a0380841660008181526002602090815260408083203390951683529381528382205492825260019052918220548390108015906103fa5750828110155b151561040557600080fd5b600160a060020a038085166000908152600160205260408082208054870190559187168152208054849003905560001981101561046a57600160a060020a03808616600090815260026020908152604080832033909416835292905220805484900390555b83600160a060020a031685600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405190815260200160405180910390a3506001949350505050565b60016020526000908152604090205481565b60045460ff1681565b600260209081526000928352604080842090915290825290205481565b600160a060020a031660009081526001602052604090205490565b60058054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561033c5780601f106103115761010080835404028352916020019161033c565b600160a060020a033316600090815260016020526040812054829010156105a057600080fd5b600160a060020a033381166000818152600160205260408082208054879003905592861680825290839020805486019055917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350600192915050565b600160a060020a039182166000908152600260209081526040808320939094168252919091522054905600a165627a7a723058201858d2904988534522c71c2ccde4e253e549804aea589527a26c6d4f9bd0ffcf0029";
this.contractAddress = config.contractAddress;
}
async transfer(destAddress = "0x25666A25Ef50B0d87F1f41a47883D7583DCf7980", transferAmount = 1) {
// Determine the nonce
var count = await this.web3.eth.getTransactionCount(this.myAddress);
// console.log(`num transactions so far: ${count}`);
var contract = new this.web3.eth.Contract(this.abiArray, this.contractAddress, {
from: this.myAddress
});
var rawTransaction = {
"from": this.myAddress,
"nonce": "0x" + count.toString(16),
"gasPrice": this.web3.utils.toHex(this.gasPriceGwei * 1e9),
"gasLimit": this.web3.utils.toHex(this.gasLimit),
"to": this.contractAddress,
"value": "0x0",
"data": contract.methods.transfer(destAddress, transferAmount).encodeABI(),
};
// console.log(`Raw of Transaction: \n${JSON.stringify(rawTransaction, null, '\t')}\n------------------------`);
var privKey = Buffer.from(this.privateKey, 'hex');
var tx = new Tx(rawTransaction);
tx.sign(privKey);
var serializedTx = tx.serialize();
var receipt = await this.web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'));
// console.log(receipt)
return receipt
}
async approve(spender = "0x420493959C379D8375aFFA6Bb0De9E5C87f0A4c3", value = 1) {
// Determine the nonce
var count = await this.web3.eth.getTransactionCount(this.myAddress);
// console.log(`num transactions so far: ${count}`);
var contract = new this.web3.eth.Contract(this.abiArray, this.contractAddress, {
from: this.myAddress
});
var rawTransaction = {
"from": this.myAddress,
"nonce": "0x" + count.toString(16),
"gasPrice": this.web3.utils.toHex(this.gasPriceGwei * 1e9),
"gasLimit": this.web3.utils.toHex(this.gasLimit),
"to": this.contractAddress,
"value": "0x0",
"data": contract.methods.approve(spender, value).encodeABI(),
};
// console.log(`Raw of Transaction: \n${JSON.stringify(rawTransaction, null, '\t')}\n------------------------`);
var privKey = Buffer.from(this.privateKey, 'hex');
var tx = new Tx(rawTransaction);
tx.sign(privKey);
var serializedTx = tx.serialize();
var receipt = await this.web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'));
// console.log(receipt)
return receipt
}
async transferFrom(from = "0x3a44501B80dd7C2A2A7EeB00721fdB8b8c66f9E7", to = "0x420493959C379D8375aFFA6Bb0De9E5C87f0A4c3", transferAmount = 1) {
// Determine the nonce
var count = await this.web3.eth.getTransactionCount(this.myAddress);
// console.log(`num transactions so far: ${count}`);
var contract = new this.web3.eth.Contract(this.abiArray, this.contractAddress, {
from: this.myAddress
});
var rawTransaction = {
"from": this.myAddress,
"nonce": "0x" + count.toString(16),
"gasPrice": this.web3.utils.toHex(this.gasPriceGwei * 1e9),
"gasLimit": this.web3.utils.toHex(this.gasLimit),
"to": this.contractAddress,
"value": "0x0",
"data": contract.methods.transferFrom(from, to, transferAmount).encodeABI(),
};
// console.log(`Raw of Transaction: \n${JSON.stringify(rawTransaction, null, '\t')}\n------------------------`);
var privKey = Buffer.from(this.privateKey, 'hex');
var tx = new Tx(rawTransaction);
tx.sign(privKey);
var serializedTx = tx.serialize();
var receipt = await this.web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'));
// console.log(receipt)
return receipt
}
checkAllowance(spender = "0x3a44501B80dd7C2A2A7EeB00721fdB8b8c66f9E7") {
var contract = new this.web3.eth.Contract(this.abiArray, this.contractAddress, {
from: this.myAddress
});
return contract.methods.allowance(this.myAddress, spender).call();
}
balance() {
var contract = new this.web3.eth.Contract(this.abiArray, this.contractAddress, {
from: this.myAddress
});
return contract.methods.balanceOf(this.myAddress).call();
}
async create(
symbol = "BNB",
token_name = "Our Coin",
quantity = 100000,
decimals = 0,
) {
var count = await this.web3.eth.getTransactionCount(this.myAddress, "pending");
let contractData = new this.web3.eth.Contract(this.abiArray).deploy({
data: '0x' + this.byteCode,
arguments: [quantity, token_name, decimals, symbol],
});
let rawTx = {
nonce: this.web3.utils.toHex(count),
gasPrice: this.web3.utils.toHex(this.web3.utils.toWei(String(this.gasPriceGwei), "gwei")),
gasLimit: this.web3.utils.toHex(this.gasLimit),
data: contractData.encodeABI(),
from: this.myAddress,
};
var privKey = Buffer.from(this.privateKey, 'hex');
var tx = new Tx(rawTx);
tx.sign(privKey);
var serializedTx = tx.serialize();
var result = await this.web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'));
if (result.contractAddress) {
this.contractAddress = result.contractAddress;
return result.contractAddress;
}
}
watch_transfer(callback) {
var ws_web3 = new Web3("wss://rinkeby.infura.io/ws")
var contract = new ws_web3.eth.Contract(this.abiArray, this.contractAddress);
contract.events.Transfer().on("data", callback);
}
watch_approval(callback) {
var ws_web3 = new Web3("wss://rinkeby.infura.io/ws")
var contract = new ws_web3.eth.Contract(this.abiArray, this.contractAddress);
contract.events.Approval().on("data", callback);
}
}
module.exports = ERCManager