cybercongress / cyber-markets

🍄 Toolchain for trades/orders parsing and processing
MIT License
46 stars 10 forks source link

Integration of EtherDelta smart-contract DEX on Ethereum #91

Closed cyborgshead closed 6 years ago

cyborgshead commented 7 years ago

There is simple node js app based on web3js which track events of EtherDelta contract which deployed at address 0x8d12A197cB00D4747a1fe03395095ce2A5CC6819

Web3 = require("web3")
web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545"))
console.log(web3.version.node)

var ABIString = '[{\"constant\":false,\"inputs\":[{\"name\":\"tokenGet\",\"type\":\"address\"},{\"name\":\"amountGet\",\"type\":\"uint256\"},{\"name\":\"tokenGive\",\"type\":\"address\"},{\"name\":\"amountGive\",\"type\":\"uint256\"},{\"name\":\"expires\",\"type\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\"},{\"name\":\"user\",\"type\":\"address\"},{\"name\":\"v\",\"type\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"trade\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"tokenGet\",\"type\":\"address\"},{\"name\":\"amountGet\",\"type\":\"uint256\"},{\"name\":\"tokenGive\",\"type\":\"address\"},{\"name\":\"amountGive\",\"type\":\"uint256\"},{\"name\":\"expires\",\"type\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"order\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"orderFills\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"tokenGet\",\"type\":\"address\"},{\"name\":\"amountGet\",\"type\":\"uint256\"},{\"name\":\"tokenGive\",\"type\":\"address\"},{\"name\":\"amountGive\",\"type\":\"uint256\"},{\"name\":\"expires\",\"type\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"cancelOrder\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"depositToken\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokenGet\",\"type\":\"address\"},{\"name\":\"amountGet\",\"type\":\"uint256\"},{\"name\":\"tokenGive\",\"type\":\"address\"},{\"name\":\"amountGive\",\"type\":\"uint256\"},{\"name\":\"expires\",\"type\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\"},{\"name\":\"user\",\"type\":\"address\"},{\"name\":\"v\",\"type\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"amountFilled\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokens\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"feeMake_\",\"type\":\"uint256\"}],\"name\":\"changeFeeMake\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"feeMake\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"feeRebate_\",\"type\":\"uint256\"}],\"name\":\"changeFeeRebate\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"feeAccount\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokenGet\",\"type\":\"address\"},{\"name\":\"amountGet\",\"type\":\"uint256\"},{\"name\":\"tokenGive\",\"type\":\"address\"},{\"name\":\"amountGive\",\"type\":\"uint256\"},{\"name\":\"expires\",\"type\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\"},{\"name\":\"user\",\"type\":\"address\"},{\"name\":\"v\",\"type\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"testTrade\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"feeAccount_\",\"type\":\"address\"}],\"name\":\"changeFeeAccount\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"feeRebate\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"feeTake_\",\"type\":\"uint256\"}],\"name\":\"changeFeeTake\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"admin_\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawToken\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"orders\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"feeTake\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"payable\":true,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"accountLevelsAddr_\",\"type\":\"address\"}],\"name\":\"changeAccountLevelsAddr\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"accountLevelsAddr\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"},{\"name\":\"user\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokenGet\",\"type\":\"address\"},{\"name\":\"amountGet\",\"type\":\"uint256\"},{\"name\":\"tokenGive\",\"type\":\"address\"},{\"name\":\"amountGive\",\"type\":\"uint256\"},{\"name\":\"expires\",\"type\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\"},{\"name\":\"user\",\"type\":\"address\"},{\"name\":\"v\",\"type\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"availableVolume\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"admin_\",\"type\":\"address\"},{\"name\":\"feeAccount_\",\"type\":\"address\"},{\"name\":\"accountLevelsAddr_\",\"type\":\"address\"},{\"name\":\"feeMake_\",\"type\":\"uint256\"},{\"name\":\"feeTake_\",\"type\":\"uint256\"},{\"name\":\"feeRebate_\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"constructor\"},{\"payable\":false,\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenGet\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amountGet\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tokenGive\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amountGive\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"expires\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"user\",\"type\":\"address\"}],\"name\":\"Order\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenGet\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amountGet\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tokenGive\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amountGive\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"expires\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"v\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"r\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"Cancel\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"tokenGet\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amountGet\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tokenGive\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amountGive\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"get\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"give\",\"type\":\"address\"}],\"name\":\"Trade\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"balance\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"balance\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"}]'

var ABI = JSON.parse(ABIString);
var ContractAddress = '0x8d12A197cB00D4747a1fe03395095ce2A5CC6819';
var contract = web3.eth.contract(ABI).at(ContractAddress);

var myEvent = contract.Trade({}, {fromBlock: 'latest', toBlock: 'latest'});
myEvent.watch(function(error, result){
  console.log(result);
  var msg = "\n\n*********";
  msg += "Trade received!: " + result.args.data + " (block:" + result.blockNumber + ")";
  msg += "*********";
  console.log(msg);
});
cyborgshead commented 7 years ago

@mgergalov You need web3j library https://github.com/web3j/web3j/blob/master/integration-tests/src/test/java/org/web3j/generated/HumanStandardToken.java You need only two things to get trades from EtherDelta DEX - address and ABI Trades comes in format

   { tokenGet: '0x0000000000000000000000000000000000000000',
     amountGet: { [String: '357441693'] s: 1, e: 8, c: [Object] },
     tokenGive: '0xaf4dce16da2877f8c9e00544c93b62ac40631f16',
     amountGive: { [String: '0'] s: 1, e: 0, c: [Object] },
     get: '0xda896bd9e964386f7343414a646c8ef75d5ae009',
     give: '0xd8a62ad8a7efa8a3267932d2e478c026566fbe34' } }

Returned data contains decimals count of token, but there is only problem that there are addresses of tokens which traded, not symbols or name. So, need one more step for extract token symbol from token contract, which trades, and put them to dynamic dictionary

cyborgshead commented 7 years ago
Web3 = require("web3")
web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545"))
console.log(web3.version.node)

var ABIString = '[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"}]'

var ABI = JSON.parse(ABIString);
var ContractAddress = '0x5ca9a71b1d01849c0a95490cc00559717fcf0d1d';
var contract = web3.eth.contract(ABI).at(ContractAddress);

console.log("Token name: " + contract.name())
console.log("Token symbol: " + contract.symbol())
console.log("Token decimals: " + contract.decimals().c.toString())
Token name: Aeternity
Token symbol: AE
Token decimals: 18

To grab needed data from contact you can use parts of ABI, in case of for name, symbol and decimals (which exists in general format in all ERC20 and other tokens) you can use this ABI

'[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"}]'
cyborgshead commented 7 years ago

other better option to use parity token registry contract (0x5F0281910Af44bFb5fC7e86A404d0304B0e042F1) and save only trades of tokens which contracts registered at this registry contract https://www.bokconsulting.com.au/blog/a-quick-look-at-paritys-token-registry-smart-contract/

Web3 = require("web3")
web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545"))
console.log(web3.version.node)

var registryAddress = "0x5F0281910Af44bFb5fC7e86A404d0304B0e042F1";
var ABIString = '[{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"token","outputs":[{"name":"addr","type":"address"},{"name":"tla","type":"string"},{"name":"base","type":"uint256"},{"name":"name","type":"string"},{"name":"owner","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_tla","type":"string"},{"name":"_base","type":"uint256"},{"name":"_name","type":"string"}],"name":"register","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"},{"name":"_key","type":"bytes32"}],"name":"meta","outputs":[{"name":"","type":"bytes32"}],"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_tla","type":"string"},{"name":"_base","type":"uint256"},{"name":"_name","type":"string"},{"name":"_owner","type":"address"}],"name":"registerAs","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_tla","type":"string"}],"name":"fromTLA","outputs":[{"name":"id","type":"uint256"},{"name":"addr","type":"address"},{"name":"base","type":"uint256"},{"name":"name","type":"string"},{"name":"owner","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"tokenCount","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"}],"name":"unregister","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"fromAddress","outputs":[{"name":"id","type":"uint256"},{"name":"tla","type":"string"},{"name":"base","type":"uint256"},{"name":"name","type":"string"},{"name":"owner","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_key","type":"bytes32"},{"name":"_value","type":"bytes32"}],"name":"setMeta","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tla","type":"string"},{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"name","type":"string"}],"name":"Registered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tla","type":"string"},{"indexed":true,"name":"id","type":"uint256"}],"name":"Unregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":true,"name":"key","type":"bytes32"},{"indexed":false,"name":"value","type":"bytes32"}],"name":"MetaChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}]'

var ABI = JSON.parse(ABIString);
var ContractAddress = '0x5F0281910Af44bFb5fC7e86A404d0304B0e042F1';
var contract = web3.eth.contract(ABI).at(ContractAddress);

var tokenCount = contract.tokenCount();

console.log("TokenCount: " + tokenCount);

for (var i = 0; i < tokenCount; i++) {
  var token = contract.token(i);
  console.log(i + " " + JSON.stringify(token));
}

So, we can initialize dictionary from this contact, one moment - we need to filter registry data before to clean kind of 0x0000000000000000000000000000000000000000 contracts and empty names, also ETH (361 ["0x2956356cd2a2bf3202f771f50d3d14a367b48070","ETH","1000000000000000000","Ether Token","0x0053044a77c85b731ae77a93d981a72f13556630"]) and initialize genesis of dictionary with 0x0000000000000000000000000000000000000000 to ETH (decimals 18), cause EtherDelta returns this meta which linked to ETH

cyborgshead commented 7 years ago
TokenCount: 532
0 ["0x0b8d56c26d8cf16fe1bddf4967753503d974de06","GAV","1000000","GAVcoin","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
1 ["0x89205a3a3b2a69de6dbf7f01ed13b2108b2c43e7","UNI","1","Unicorn","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
2 ["0xe0b7927c4af23765cb51314a0e0521a9645f0e2a","DGD","1000000000","Digix DAO","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
3 ["0x0000000000000000000000000000000000000000","","0","","0x0000000000000000000000000000000000000000"]
4 ["0x01a7018e6d1fde8a68d12f59b6532fb523b6259d","USD","100000000","Decentralized Capital USD","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
5 ["0xdd239298e512427ba98b6602e4c8050c3e21f58b","EUR","100000000","Decentralized Capital EUR","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
6 ["0x45901fa08636c31b647c363fc01a8d4de2a551a1","GBP","100000000","Decentralized Capital GBP","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
7 ["0x0000000000000000000000000000000000000000","","0","","0x0000000000000000000000000000000000000000"]
8 ["0xaec2e87e0a235266d9c5adc9deb4b2e29b54d009","SNG","1","SingularDTV","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
9 ["0x74c1e4b8cae59269ec1d85d3d4f324396048f4ac","ALE","1","Beercoin","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
10 ["0xc66ea802717bfb9833400264dd12c2bceaa34a6d","MKR","1000000000000000000","MakerDAO","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
11 ["0x45e42d659d9f9466cd5df622506033145a9b89bc","NXC","1000","Nexium","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
12 ["0xd8912c10681d8b21fd3742244f44658dba12264e","PLU","1000000000000000000","Pluton","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
13 ["0x4df812f6064def1e5e029f1ca858777cc98d2d81","XAU","100000000","Xaurum","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
14 ["0x0000000000000000000000000000000000000000","","0","","0x0000000000000000000000000000000000000000"]
15 ["0x888666ca69e0f178ded6d75b5726cee99a87d698","ICN","1000000000000000000","Iconomi","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
16 ["0xac709fcb44a43c35f0da4e3163b117a17f3770f5","ARC","1000000000000000000","Arcade Token","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
17 ["0xadc46ff5434910bd17b24ffb429e585223287d7f","VIP","1","The Decentralised Capital VIP token","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
18 ["0x0000000000000000000000000000000000000000","","0","","0x0000000000000000000000000000000000000000"]
19 ["0xbb9bc244d798123fde783fcc1c72d3bb8c189413","DAO","10000000000000000","The DAO","0x3ff047e5e803e20f5ef55ea1029adb89618047db"]
20 ["0x61f17f02205d81bd875d2f767ed84c741e5cfb44","LON","1000000000","Loniliness","0x0079418d9dc201b95717806441698a949adb8fee"]
21 ["0xaf30d2a7e90d7dc361c8c4585e9bb7d2f6f15bc7","1ST","1000000000000000000","1ST - FirstBlood","0xdbaddbae610da85fa15a9f7e279d9a9d68b05c01"]
....
cyborgshead commented 7 years ago

@mgergalov on etherdelta all tokens trades only to ETH so we can parse all markets and meta about tokens (decimals and token symbol) directly from EtherDelta config and check updates peridiocally https://github.com/etherdelta/etherdelta.github.io/blob/master/config/main.json

mgergalov commented 6 years ago

merged to master with #100