/
multisig-wallet.js
103 lines (90 loc) · 2.76 KB
/
multisig-wallet.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
//
// Detect multisig wallet out-going transaction and save it to Airtabel - in realtime.
// That way, anyone can get notification, email or slack/rocket chat message
// by connecting airtable to zapier/IFTTT
//
var Airtable = require('airtable')
var Dagger = require('eth-dagger').default
var Web3 = require('web3')
var MultisigWalletABI = require('./abi/MultisigWallet').abi
var config = require('../config')
// dagger server
var dagger = new Dagger(config.DAGGER_URL)
var web3 = new Web3(new Web3.providers.HttpProvider(config.INFURA_URL))
// base
var base = new Airtable({
apiKey: config.AIRTABLE_API_KEY // API for airtable
}).base(config.AIRTABLE_BASE) // Base for airtable tabels
// Multisig wallet address
var WalletAddress = config.MULTISIG_WALLET_ADDRESS
// contract
var web3Contract = new web3.eth.Contract(MultisigWalletABI, WalletAddress)
// add new record
function addOutTxRecord(block, tx, walletTx) {
base(config.AIRTABLE_BASE_TABLE).create(
{
to: walletTx.destination.toLowerCase(),
amount: web3.utils.fromWei(walletTx.value, 'ether'),
timestamp: block.timestamp,
tx: tx.hash,
from: tx.from.toLowerCase(),
block: tx.blockNumber,
// "gas-used": tx.gas,
'gas-price': web3.utils.fromWei(tx.gasPrice, 'gwei')
},
{typecast: true},
function(err, record) {
if (err) {
console.error(err)
return
}
console.log('New record created: ', record.getId())
}
)
}
// process execution event
function processEvent(contract, executionEvent) {
const mt = parseInt(executionEvent.returnValues.transactionId)
console.log('Fetching executed block/transaction info...')
Promise.all([
web3.eth.getBlock(executionEvent.blockNumber), // block
web3.eth.getTransaction(executionEvent.transactionHash), // tx
contract.methods.transactions(mt).call() // wallet tx info
]).then(function(result) {
// add tx record
addOutTxRecord(result[0], result[1], result[2])
})
}
// to test with past events
function pastWalletEvent(contract, fromBlock) {
// web3 contract
console.log('Fetching recent execution event...')
contract.getPastEvents(
'Execution',
{
fromBlock: fromBlock
},
function(e, events) {
events.forEach(function(executionEvent) {
processEvent(contract, executionEvent)
})
}
)
}
// start listening
function startListening(web3Contract) {
// dagger contract
var contract = dagger.contract(web3Contract)
var filter = contract.events.Execution({
room: 'latest'
})
// watch
filter.watch(function(data, removed) {
console.log('New transaction detected...')
processEvent(web3Contract, data)
})
}
// Testing purpose
// pastWalletEvent(web3Contract, 4451374);
// To start listening
startListening(web3Contract)