feat: watch erc20 balances

This commit is contained in:
Richard Ramos 2019-08-29 16:26:00 -04:00
parent 908492fe94
commit 2c7bee47cf
2 changed files with 83 additions and 2 deletions

View File

@ -6,7 +6,7 @@ const equal = require('fast-deep-equal');
const Database = require('./database.js'); const Database = require('./database.js');
const Events = require('events'); const Events = require('events');
const Web3Eth = require('web3-eth'); const Web3Eth = require('web3-eth');
const toBN = require('number-to-bn');
class EventSyncer { class EventSyncer {
constructor(provider, options = {}) { constructor(provider, options = {}) {
@ -143,6 +143,8 @@ class EventSyncer {
trackBalance(address, erc20Address) { trackBalance(address, erc20Address) {
const sub = new ReplaySubject(); const sub = new ReplaySubject();
// TODO: validate address?
let callFn; let callFn;
if(!erc20Address){ if(!erc20Address){
callFn = () => { callFn = () => {
@ -156,7 +158,19 @@ class EventSyncer {
}]); }]);
}; };
} else { } else {
// TODO: track erc20 callFn = () => {
const fn = this.web3.call;
// balanceOf
const data = "0x70a08231" + "000000000000000000000000" + erc20Address.substring(2);
console.log(data);
fn.apply(fn, [{to: erc20Address, data}, (err, result) => {
if(err) {
sub.error(err);
return;
}
sub.next(toBN(result).toNumber());
}]);
};
} }
callFn(); callFn();

67
test/test5.js Normal file
View File

@ -0,0 +1,67 @@
const Web3Eth = require('web3-eth');
let eth = new Web3Eth("ws://localhost:8545");
async function deployContract() {
let accounts = await eth.getAccounts();
// pragma solidity ^0.5.0;
// contract ERC20Token {
// function balanceOf(address _owner)
// external
// view
// returns (uint256 balance)
// {
// return block.number;
// }
// }
let abi = [
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "balance",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
];
var contract = new eth.Contract(abi)
let instance = await contract.deploy({
data: '0x608060405234801561001057600080fd5b5060d58061001f6000396000f3fe6080604052600436106039576000357c01000000000000000000000000000000000000000000000000000000009004806370a0823114603e575b600080fd5b348015604957600080fd5b50608960048036036020811015605e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050609f565b6040518082815260200191505060405180910390f35b600043905091905056fea165627a7a72305820267fb09927dce2942fe73ac7487c4f1565dae60b08aa5434a22cb1f71366bd090029',
arguments: []
}).send({
from: accounts[0],
gas: '4700000'
})
return instance
}
async function run() {
let accounts = await eth.getAccounts();
var DummyERC20Token = await deployContract()
console.dir(DummyERC20Token.options.address)
const EventSyncer = require('../src/eventSyncer.js')
const eventSyncer = new EventSyncer(eth.currentProvider);
await eventSyncer.init();
eventSyncer.trackBalance(accounts[0], DummyERC20Token.options.address).pipe().subscribe((balance) => {
console.log("balance is ", balance)
});
}
run()