UNPKG

16.8 kBJavaScriptView Raw
1var Web3 = require('web3');
2var BigNumber = require('big-number');
3var web3 = new Web3();
4
5var verosContract;
6var verosInstance;
7
8var coinbaseAddress;
9var coinbasePassword;
10
11var _sandbox;
12var _startBlock;
13
14/*
15 * Connect to local Ethereum Node
16 */
17function connectToEthereumNode(ip,address,password,sandbox,completion) {
18 web3.setProvider(new web3.providers.HttpProvider(ip));
19
20 if (!sandbox) {
21 sandbox = false;
22 }
23 _sandbox = sandbox;
24 if (sandbox) {
25 _startBlock = 2651971;
26 verosContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_availableSupply","type":"uint256"}],"name":"setAvailableSupply","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"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,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"availableSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_children","type":"address"},{"name":"_parent","type":"address"}],"name":"removeChildrenAddress","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"childrens","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_children","type":"address"},{"name":"_parent","type":"address"}],"name":"addChildrenAddress","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"_genesisWalletAddress","type":"address"},{"name":"_mainWalletAddress","type":"address"},{"name":"_stakingWalletAddress","type":"address"},{"name":"_stakeholderWalletAddress","type":"address"},{"name":"_investorWalletAddress","type":"address"},{"name":"_feeWalletAddress","type":"address"}],"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"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_parent","type":"address"},{"indexed":true,"name":"_children","type":"address"}],"name":"AddChildren","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_parent","type":"address"},{"indexed":true,"name":"_children","type":"address"}],"name":"RemoveChildren","type":"event"}]);
27 verosInstance = verosContract.at("0xAB60D24FC7D51C556Da7eBfBA04a9FC8DF5EB7E3");
28 } else {
29 _startBlock = 2658018;
30 verosContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_availableSupply","type":"uint256"}],"name":"setAvailableSupply","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"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,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"availableSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_children","type":"address"},{"name":"_parent","type":"address"}],"name":"removeChildrenAddress","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"childrens","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_children","type":"address"},{"name":"_parent","type":"address"}],"name":"addChildrenAddress","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"_genesisWalletAddress","type":"address"},{"name":"_mainWalletAddress","type":"address"},{"name":"_stakingWalletAddress","type":"address"},{"name":"_stakeholderWalletAddress","type":"address"},{"name":"_investorWalletAddress","type":"address"},{"name":"_feeWalletAddress","type":"address"}],"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"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_parent","type":"address"},{"indexed":true,"name":"_children","type":"address"}],"name":"AddChildren","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_parent","type":"address"},{"indexed":true,"name":"_children","type":"address"}],"name":"RemoveChildren","type":"event"}]);
31 verosInstance = verosContract.at("0xedbaf3c5100302dcdda53269322f3730b1f0416d");
32 }
33 if (!checkAccount(address,password)) {
34 return completion("Coinbase credentials not usable");
35 }
36 coinbaseAddress = address;
37 coinbasePassword = password;
38
39 try {
40 var blockNumber = getBlockNumber();
41 completion(null,blockNumber);
42 } catch(err) {
43 completion(err,null);
44 }
45}
46
47function getBlockNumber() {
48 return web3.eth.blockNumber;
49}
50
51function createAccount(password) {
52 return web3.personal.newAccount(password);
53}
54
55function getTotalSupply() {
56 return verosInstance.totalSupply.call();
57}
58
59function getAvailableSupply() {
60 return verosInstance.availableSupply.call();
61}
62
63function getVerosInstance() {
64 return verosInstance;
65}
66
67function getWeb3() {
68 return web3;
69}
70
71function sendEther(from,password,to,amount,completion) {
72 if (!checkAccount(from,password)) {
73 return completion("Cannot unlock account " + from,null);
74 }
75 var tx = web3.eth.sendTransaction({
76 from: from,
77 to:to,
78 value:web3.toWei(amount,'ether')
79 });
80
81 completion(null,tx);
82}
83
84/*
85 * Check the credentials for the selected account
86 */
87function checkAccount(address,password) {
88 if (address.length != 42) {
89 console.log("Err: Invalid address length (" + address + ")");
90 return false;
91 }
92 try {
93 return web3.personal.unlockAccount(address.slice(2), password);
94 } catch (err) {
95 return false;
96 }
97}
98/*
99 * Return VEROS balance
100 */
101function getVerosBalance(address) {
102 return verosInstance.balanceOf.call(address);
103}
104
105function getETHBalance(address) {
106 return web3.fromWei(web3.eth.getBalance(address),'ether');
107}
108
109/*
110 * List all accounts
111 */
112function listAccounts() {
113 return web3.eth.accounts;
114}
115
116/*
117 * Send VEROS
118 */
119function transfer(fromAccount, fromAccountPassword, recipientAddress,amount,completion) {
120 if (!checkAccount(fromAccount,fromAccountPassword)) {
121 return completion("Cannot unlock sender account",null);
122 }
123 try {
124 verosInstance.transfer(
125 recipientAddress,
126 amount, {
127 from: fromAccount
128 }, function (err, tx) {
129 completion(err, tx);
130 });
131 } catch (err) {
132 completion(err,null);
133 }
134}
135
136function transferFrom(signerAccount, signerAccountPassword, fromAddress, toAddress, amount, completion) {
137 if (!checkAccount(signerAccount,signerAccountPassword)) {
138 return completion("Cannot unlock sender account",null);
139 }
140
141 try {
142 verosInstance.transferFrom(
143 fromAddress,
144 toAddress,
145 amount, {
146 from: signerAccount
147 }, function (err, tx) {
148 completion(err, tx);
149 });
150 } catch (err) {
151 completion(err,null);
152 }
153
154}
155
156function addChildrenAddress(ownerAccount,ownerAccountPassword,parentAddress,childPassword,completion) {
157 if (!checkAccount(ownerAccount,ownerAccountPassword)) {
158 return completion("Cannot unlock sender account",null,null);
159 }
160 var childrenAddress = createAccount(childPassword);
161 verosInstance.addChildrenAddress(childrenAddress,parentAddress,{
162 from: ownerAccount
163 },function(err,tx) {
164 if (err) {
165 completion(err,null,null)
166 } else {
167 completion(null,tx,childrenAddress);
168 }
169 });
170}
171
172function addPredefinedChildrenAddress(ownerAccount,ownerAccountPassword,parentAddress,childrenAddress,completion) {
173 if (!checkAccount(ownerAccount,ownerAccountPassword)) {
174 return completion("Cannot unlock sender account",null,null);
175 }
176 verosInstance.addChildrenAddress(childrenAddress,parentAddress,{
177 from: ownerAccount
178 },function(err,tx) {
179 if (err) {
180 completion(err,null,null)
181 } else {
182 completion(null,tx,childrenAddress);
183 }
184 });
185}
186
187function removeChildrenAddress(ownerAccount,ownerAccountPassword,parentAddress,childrenAddress,completion) {
188 if (!checkAccount(ownerAccount,ownerAccountPassword)) {
189 return completion("Cannot unlock sender account",null,null);
190 }
191 verosInstance.removeChildrenAddress(childrenAddress,parentAddress,{
192 from: ownerAccount
193 },function(err,tx) {
194 if (err) {
195 completion(err,null,null)
196 } else {
197 completion(null,tx,childrenAddress);
198 }
199 });
200}
201
202function getParent(childAddress,completion) {
203 completion(verosInstance.childrens.call(childAddress));
204}
205
206function getChildrens(parentAddress,completion) {
207 var addChildrenEvent = verosInstance.AddChildren({_parent:parentAddress}, {fromBlock:_startBlock, toBlock: 'latest'});
208
209 addChildrenEvent.get(function(error, childrens) {
210 completion(error,childrens);
211 });
212}
213
214function getTransfers(userAddress,completion) {
215 if (userAddress) {
216 var transferEvent = verosInstance.Transfer({_from:userAddress}, {fromBlock: _startBlock, toBlock: 'latest'});
217 var outgoingTransfers = [];
218 var incomingTransfers = [];
219 transferEvent.get(function (error, events) {
220 events.forEach(function(event,index) {
221 outgoingTransfers.push(transferEventToObject(event));
222 });
223
224 var transferEvent = verosInstance.Transfer({_to:userAddress}, {fromBlock: _startBlock, toBlock: 'latest'});
225 transferEvent.get(function (error, events) {
226 events.forEach(function (event, index) {
227 incomingTransfers.push(transferEventToObject(event));
228 });
229
230 completion(error, {
231 incoming:incomingTransfers,
232 outgoing:outgoingTransfers
233 });
234 });
235 });
236 } else {
237 var transferEvent = verosInstance.Transfer(null, {fromBlock: _startBlock, toBlock: 'latest'});
238 transferEvent.get(function (error, events) {
239 var transfers = [];
240 events.forEach(function(event,index) {
241 transfers.push(transferEventToObject(event));
242 });
243 completion(error, transfers);
244 });
245 }
246}
247
248function getTransfersFromBlockToBlock(userAddress,fromBlockNumber,toBlockNumber,completion) {
249 if (userAddress) {
250 var transferEvent = verosInstance.Transfer({_from:userAddress}, {fromBlock: fromBlockNumber, toBlock: toBlockNumber});
251 var outgoingTransfers = [];
252 var incomingTransfers = [];
253 transferEvent.get(function (error, events) {
254 events.forEach(function(event,index) {
255 outgoingTransfers.push(transferEventToDbObject(event));
256 });
257
258 var transferEvent = verosInstance.Transfer({_to:userAddress}, {fromBlock: fromBlockNumber, toBlock: toBlockNumber});
259 transferEvent.get(function (error, events) {
260 events.forEach(function (event, index) {
261 incomingTransfers.push(transferEventToDbObject(event));
262 });
263
264 completion(error, {
265 incoming:incomingTransfers,
266 outgoing:outgoingTransfers
267 });
268 });
269 });
270 } else {
271 var transferEvent = verosInstance.Transfer(null, {fromBlock: fromBlockNumber, toBlock: toBlockNumber});
272 transferEvent.get(function (error, events) {
273 var transfers = [];
274 events.forEach(function(event,index) {
275 transfers.push(transferEventToDbObject(event));
276 });
277 completion(error, transfers);
278 });
279 }
280}
281
282function transferEventToObject(transferEvent) {
283 return {
284 senderAddress:transferEvent.args["_from"],
285 receiverAddress:transferEvent.args["_to"],
286 amount:transferEvent.args["_value"],
287 transactionHash:transferEvent.transactionHash,
288 transactionTimestamp: web3.eth.getBlock(transferEvent.blockNumber).timestamp,
289 blockNumber:transferEvent.blockNumber
290 }
291}
292
293function transferEventToDbObject(transferEvent) {
294 return {
295 from_address:transferEvent.args["_from"],
296 to_address:transferEvent.args["_to"],
297 amount:transferEvent.args["_value"],
298 hash:transferEvent.transactionHash,
299 datetime: web3.eth.getBlock(transferEvent.blockNumber).timestamp,
300 block_number:transferEvent.blockNumber
301 }
302}
303
304module.exports = {
305 // Init
306 connectToEthereumNode:connectToEthereumNode,
307 getBlockNumber:getBlockNumber,
308 getWeb3:getWeb3,
309 getVerosInstance:getVerosInstance,
310 sendEther:sendEther,
311 getETHBalance:getETHBalance,
312
313 // Accounts
314 createAccount:createAccount,
315 checkAccount:checkAccount,
316 listAccounts:listAccounts,
317
318 // Veros
319 transfer:transfer,
320 transferFrom:transferFrom,
321 getParent:getParent,
322 addChildrenAddress:addChildrenAddress,
323 addPredefinedChildrenAddress:addPredefinedChildrenAddress,
324 removeChildrenAddress:removeChildrenAddress,
325 getVerosBalance:getVerosBalance,
326
327 // Events
328 getTransfers:getTransfers,
329 getTransfersFromBlockToBlock:getTransfersFromBlockToBlock,
330 getChildrens:getChildrens,
331
332 // Supply
333 getTotalSupply:getTotalSupply,
334 getAvailableSupply:getAvailableSupply
335};
\No newline at end of file