Note: BitIndex is now part of MatterCloud.
[Deprecated - see below] BitIndex Javascript SDK
Replaced by MatterCloudJS
Get it at: [https://github.com/mattercloud/mattercloudjs]
View Old HTML API Documentation
Quick Preview
Easily query balances, utxos, and transactions.
https://api.bitindex.network/api/v3/main/addr/12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX/utxo https://api.bitindex.network/api/v3/main/tx/96b3dc5941ce97046d4af6e7a69f4b38c48f05ef071c2a33f88807b89ab51da6
Table of Contents
- Installation and Usage
- Prerequisites
- What's Included in this SDK
- Endpoints
- Promises vs. Callbacks
- Browser Examples
- Distribution
- Operations
Installation and Usage
Installation
npm install bitindex-sdk --save
Include
// Node
var bitindex = require('bitindex-sdk').instance();
<!-- Browser -->
<script src="dist/bundle.min.js"></script>
<script language="javascript">
// ...
var bitindex = new BitIndex();
var result = await bitindex.address.getUtxos('12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX');
console.log('result', result);
</script>
Prerequisites
- API authentication
- Get an API key at BitIndex
What's Included in this SDK
BitIndex API v3
Documentation: https://www.bitindex.network/developers/api-documentation-v3.html
Endpoints
Please note: Currently only the "main" (mainnet) endpoint is supported.
Endpoints:
- https://api.bitindex.network/api/v3/main (Mainnet)
Example get a transaction on 'Mainnet':
Promises vs. Callback
Both await
and callback styles are supported for all methods.
Example:
// Await style with promises
var result = await bitindex.address.getUtxos('12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX');
// Callback style
bitindex.address.getUtxos('12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX', function(result) {
// ...
});
Address
address.getUtxos
Get unspent outputs
var result = await bitindex.address.getUtxos('12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX');
// Or specify multiple addresses to retrieve Utxo's for all addresses...
var result = await bitindex.address.getUtxos(['17d9np3mtaz13kYdePwc2Cufd6dMoNjWib', '1XeMYaLJX6rhXcRe2XtGh6hgstgXwZ5SD']);
/*
[
{
address: '12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX',
txid: '5e3014372338f079f005eedc85359e4d96b8440e7dbeb8c35c4182e0c19a1a12',
vout: 0,
amount: 0.00015399,
satoshis: 15399,
value: 15399,
height: 576168,
confirmations: 1,
scriptPubKey: '76a91410bdcba3041b5e5517a58f2e405293c14a7c70c188ac'
},
{
address: '12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX',
txid: '96b3dc5941ce97046d4af6e7a69f4b38c48f05ef071c2a33f88807b89ab51da6',
vout: 1,
amount: 0.00014656,
satoshis: 14656,
value: 14656,
height: 576025,
confirmations: 144,
scriptPubKey: '76a91410bdcba3041b5e5517a58f2e405293c14a7c70c188ac'
}
]
*/
address.getUtxosWithOptions
Get unspent outputs with options to filter and sort.
- offset
- limit
- afterHeight
- sort ('confirmations:asc', 'confirmations:desc', 'value:desc', etc)
var result = await bitindex.address.getUtxosWithOptions({
addrs: '12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX', afterHeight: 576167, sort: 'value:desc'
});
// Or specify multiple addresses to retrieve Utxo's for all addresses...
var result = await bitindex.address.getUtxosWithOptions({
addrs: ['17d9np3mtaz13kYdePwc2Cufd6dMoNjWib', '1XeMYaLJX6rhXcRe2XtGh6hgstgXwZ5SD'], afterHeight: 576167, sort: 'value:desc'
});
/*
[
{
address: '12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX',
txid: '5e3014372338f079f005eedc85359e4d96b8440e7dbeb8c35c4182e0c19a1a12',
vout: 0,
amount: 0.00015399,
satoshis: 15399,
value: 15399,
height: 576168,
confirmations: 1,
scriptPubKey: '76a91410bdcba3041b5e5517a58f2e405293c14a7c70c188ac'
}
]
*/
address.getTransactions
Get full transactions where the addresses was the sender or receiver.
var result = await bitindex.address.getTransactions('12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX');
console.log(result);
/*
{
"totalItems": 4,
"from": 0,
"to": 50,
"items": [
{
"txid": "bdf6f49776faaa4790af3e41b8b474a7d0d47df540f8d71c3579dc0addd64c45",
"size": 225,
"version": 1,
"locktime": 0,
"vin": [
{
"txid": "e8ef92e542cceaedef6ce338498240d7db80925ff009d77fac34e3ddc134c1a4",
"vout": 1,
"scriptSig": {
"hex": "47304402201cfbc9765e83d78fff878fae68390bb00b71c8cbf8e4ad49c393f8338a190f6102200d862a894e337491cbe7dae016d5270e159d77b88b0135fd7beb6667ad136fce412103052695f3f3d151be339b0c0dd9b690e2b40bc7e9585f3848fd248280bcdfe3d7"
},
"sequence": 4294967295,
"n": 0,
"value": 0.00924603,
"addr": "17d9np3mtaz13kYdePwc2Cufd6dMoNjWib",
"valueSat": 924603
}
],
"vout": [
{
"value": 0.00015463,
"n": 0,
"scriptPubKey": {
"hex": "76a91410bdcba3041b5e5517a58f2e405293c14a7c70c188ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX"
]
},
"valueSat": 15463
},
{
"value": 0.00908911,
"n": 1,
"scriptPubKey": {
"hex": "76a9146656783b099d284e4a7871b5fc17848db11d4aef88ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"1AL7WaqTfGqU1LrKzcdsjzNJC4YrtVFrgb"
]
},
"valueSat": 908911
}
],
"blockhash": "0000000000000000078f34d9cd3f48e4948aef4c79548ec777050e1c8953a85c",
"confirmations": 143,
"time": 1554007897,
"blocktime": 1554007897,
"rawtx": "0100000001a4c134c1dde334ac7fd709f05f9280dbd740824938e36cefedeacc42e592efe8010000006a47304402201cfbc9765e83d78fff878fae68390bb00b71c8cbf8e4ad49c393f8338a190f6102200d862a894e337491cbe7dae016d5270e159d77b88b0135fd7beb6667ad136fce412103052695f3f3d151be339b0c0dd9b690e2b40bc7e9585f3848fd248280bcdfe3d7ffffffff02673c0000000000001976a91410bdcba3041b5e5517a58f2e405293c14a7c70c188ac6fde0d00000000001976a9146656783b099d284e4a7871b5fc17848db11d4aef88ac00000000",
"blockheight": 576025,
"valueOut": 0.00924374,
"valueIn": 0.00924603,
"fees": 0.00000229
}
]
}
*/
Transaction
tx.get
Get a single transaction
var result = await bitindex.tx.get('96b3dc5941ce97046d4af6e7a69f4b38c48f05ef071c2a33f88807b89ab51da6');
/*
{
"hex": "0100000001270e55963a167a2fae66307efa3565032402c1387d62e5276464295d2a6834d8010000008a4730440220132f6d484de9d34d314aec945865af5da95f35cf4c7cc271d40bc99f8d7f12e3022051fcb2ce4461d1c6e8a778f5e4dcb27c8461d18e0652f68a7a09a98e95df5cb74141044e2c1e2c055e7aefc291679882382c35894a6aa6dd95644f598e506c239f9d83b1d9671c1d9673e3c2b74f07e8032343f3adc21367bd4cffae92fe31efcd598affffffff020000000000000000456a2231394878696756345179427633744870515663554551797131707a5a56646f41757404617364660d746578742f6d61726b646f776e055554462d3807616e6f7468657240390000000000001976a91410bdcba3041b5e5517a58f2e405293c14a7c70c188ac00000000",
"txid": "96b3dc5941ce97046d4af6e7a69f4b38c48f05ef071c2a33f88807b89ab51da6",
"hash": "96b3dc5941ce97046d4af6e7a69f4b38c48f05ef071c2a33f88807b89ab51da6",
"size": 301,
"version": 1,
"locktime": 0,
"vin": [
{
"txid": "d834682a5d29646427e5627d38c10224036535fa7e3066ae2f7a163a96550e27",
"vout": 1,
"scriptSig": {
"asm": "30440220132f6d484de9d34d314aec945865af5da95f35cf4c7cc271d40bc99f8d7f12e3022051fcb2ce4461d1c6e8a778f5e4dcb27c8461d18e0652f68a7a09a98e95df5cb7[ALL|FORKID] 044e2c1e2c055e7aefc291679882382c35894a6aa6dd95644f598e506c239f9d83b1d9671c1d9673e3c2b74f07e8032343f3adc21367bd4cffae92fe31efcd598a",
"hex": "4730440220132f6d484de9d34d314aec945865af5da95f35cf4c7cc271d40bc99f8d7f12e3022051fcb2ce4461d1c6e8a778f5e4dcb27c8461d18e0652f68a7a09a98e95df5cb74141044e2c1e2c055e7aefc291679882382c35894a6aa6dd95644f598e506c239f9d83b1d9671c1d9673e3c2b74f07e8032343f3adc21367bd4cffae92fe31efcd598a"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 0,
"n": 0,
"scriptPubKey": {
"asm": "OP_RETURN 31394878696756345179427633744870515663554551797131707a5a56646f417574 1717859169 746578742f6d61726b646f776e 5554462d38 616e6f74686572",
"hex": "6a2231394878696756345179427633744870515663554551797131707a5a56646f41757404617364660d746578742f6d61726b646f776e055554462d3807616e6f74686572",
"type": "nulldata"
}
},
{
"value": 0.00014656,
"n": 1,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 10bdcba3041b5e5517a58f2e405293c14a7c70c1 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a91410bdcba3041b5e5517a58f2e405293c14a7c70c188ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"12XXBHkRNrBEb7GCvAP4G8oUs5SoDREkVX"
]
}
}
],
"blockhash": "0000000000000000078f34d9cd3f48e4948aef4c79548ec777050e1c8953a85c",
"confirmations": 3428,
"time": 1554007897,
"blocktime": 1554007897
}
*/
tx.getRaw
Get a single transaction in raw hex format
var result = await bitindex.tx.get('96b3dc5941ce97046d4af6e7a69f4b38c48f05ef071c2a33f88807b89ab51da6');
/*
{
rawtx: "0100000001270e55963a167a2fae66307efa3565032402c1387d62e5276464295d2a6834d8010000008a4730440220132f6d484de9d34d314aec945865af5da95f35cf4c7cc271d40bc99f8d7f12e3022051fcb2ce4461d1c6e8a778f5e4dcb27c8461d18e0652f68a7a09a98e95df5cb74141044e2c1e2c055e7aefc291679882382c35894a6aa6dd95644f598e506c239f9d83b1d9671c1d9673e3c2b74f07e8032343f3adc21367bd4cffae92fe31efcd598affffffff020000000000000000456a2231394878696756345179427633744870515663554551797131707a5a56646f41757404617364660d746578742f6d61726b646f776e055554462d3807616e6f7468657240390000000000001976a91410bdcba3041b5e5517a58f2e405293c14a7c70c188ac00000000"
}
*/
tx.send
Send broadcast of a raw transaction
var result = await bitindex.tx.send('0100000001c8a78a47a63cc8378ee1abb29b00fee57f54700008907b2cc212fd1077f46229010000006a47304402207ca8de8bbc656f7df9f99790b61799e7745d12d354a1f346a20fbc32cc76e045022005e5536c5c8997670566d693f725072cec9db8d24aa048caad1108e0400bfcd2412103b1fa158185120c1266ff328964446cdb5816a37b2668411e847b4d2395a6a265ffffffff02273c0000000000001976a91410bdcba3041b5e5517a58f2e405293c14a7c70c188ac43c40e00000000001976a914256b0efdfc907d12125c4fbb1754b38e7c8b1a1788ac00000000');
/*
{
txid: "96b3dc5941ce97046d4af6e7a69f4b38c48f05ef071c2a33f88807b89ab51da6"
}
*/
Chain Info
chaininfo.status
Get chain info and network status
var result = await bitindex.chaininfo.status();
/*
{
info: {
version: 100010100,
protocolversion: 70015,
// blocks: 576014,
timeoffset: 0,
// connections: 8,
proxy: '',
// difficulty: 97359826681.75484,
testnet: false,
relayfee: 0.00001,
errors: 'This is a pre-release test build - use at your own risk - do not use for mining or merchant applications',
network: 'livenet'
}
}
*/
chaininfo.bestBlockHash
Get best block hash
var result = await bitindex.chaininfo.bestBlockHash();
/*
{
"bestblockhash": "00000000000000000835e1703971ecbb6462daded264151708b1ba483bd0cfc2"
}
*/
chaininfo.lastBlockHash
Get last block hash
var result = await bitindex.chaininfo.lastBlockHash();
/*
{
"syncTipHash": "00000000000000000835e1703971ecbb6462daded264151708b1ba483bd0cfc2",
"lastblockhash": "00000000000000000835e1703971ecbb6462daded264151708b1ba483bd0cfc2"
}
*/
chaininfo.difficulty
Get difficulty
var result = await bitindex.chaininfo.difficulty();
/*
{
"difficulty": 71973293399.13077
}
*/
Block
block.getBlockHeaderByBlockHash
Get blockheader by hash. This dooes not return the txids in the block, for faster performance.
If you want the txids, then use block.getByBlockHash
var result = await bitindex.block.getBlockHeaderByBlockHash('000000000000000006c4ca331e7f74df7a371f45857bb0a49be05390e15cbc52');
/*
{
hash: '000000000000000006c4ca331e7f74df7a371f45857bb0a49be05390e15cbc52',
confirmations: 10,
height: 575870,
version: 549453824,
versionHex: '20c00000',
merkleroot: '5eff2b149295b0010548910fc158664ee36f26781fbaceb42e71d924fac725c4',
time: 1553919636,
mediantime: 1553915823,
nonce: 1390191648,
bits: '180beac2',
difficulty: 92262545584.60136,
chainwork: '000000000000000000000000000000000000000000de4ca83d16db8a005b4264',
previousblockhash: '000000000000000008db5e402d1045c27de3d11a77c2ac7c420838c1b67df725',
nextblockhash: '0000000000000000046c026c285ed7bc7ba7998f90938eb160c0f69b21dbdf2b'
}
*/
block.getByBlockHash
Get block by hash. Warning: If you do not need the txids, then use block.getBlockHeaderByBlockHash because it is much faster to load.
var result = await bitindex.block.getByBlockHash('000000000000000006c4ca331e7f74df7a371f45857bb0a49be05390e15cbc52');
/*
{
hash: '000000000000000006c4ca331e7f74df7a371f45857bb0a49be05390e15cbc52',
confirmations: 10,
size: 1397,
height: 575870,
version: 549453824,
versionHex: '20c00000',
merkleroot: '5eff2b149295b0010548910fc158664ee36f26781fbaceb42e71d924fac725c4',
tx:
[
'16d005b2b9b0c63a791da6e9d41566962fa403619d3cacce9d9a2c33cd10573c',
'a836d07957fa6f9f12cd2a4ef07c914204d2d8109b4eda2faed9235125c58000',
'e94dd09fa211490138a3141b3f1754cb2fc080e6bac52055bff8b909beb36d66',
'c45d885ed16f0f9a47023ef45d9b8c70a100ccf535982343206f0d932032c559',
'd9e67c9879e568d454ff491638f149cabe9c9853af48ccfb314585fc6cf190dd',
'99e536eb11700d5d04eafd55dbad9c43f6a93ac11aacd4f0564487664585c0ed',
'f13094f1007c276fc536163af79e97ecaf55e88b56d8d393e860ee84e546bbd6'
],
time: 1553919636,
mediantime: 1553915823,
nonce: 1390191648,
bits: '180beac2',
difficulty: 92262545584.60136,
chainwork: '000000000000000000000000000000000000000000de4ca83d16db8a005b4264',
previousblockhash: '000000000000000008db5e402d1045c27de3d11a77c2ac7c420838c1b67df725',
nextblockhash: '0000000000000000046c026c285ed7bc7ba7998f90938eb160c0f69b21dbdf2b'
}
*/
block.getByBlockHashRaw
Get raw block by hash
var result = await bitindex.block.getByBlockHashRaw('000000000000000006c4ca331e7f74df7a371f45857bb0a49be05390e15cbc52');
/*
{
"rawblock": "0000c02025f77db6c13808427cacc2771ad1e37dc245102d405edb080000000000000000c425c7fa24d9712eb4ceba1f78266fe34e6658c10f91480501b09592142bff5e94ee9e5cc2ea0b1820a4dc520701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff53037ec908040fef9e5cfabe6d6df41491ca64d04613901a883289cefe0bb98ff57c057e9b05669464ee97d0eb1480000000000000000808061ca3f50a0100142f70726f68617368696e672e636f6d442702002f00000000011281814a000000001976a9147f346e50f5d8eaf4519794668089d9d473a20dbb88ac0000000002000000013dd3087289ab1dd9c2644fec7c73985906f06d44ebf196c06ab51165e9641323000000006b483045022100c8b098c97c6613f9abd391737e8dcc1af7ee59d00f6d49ba4f01c866b7d4eb2702204b946965292283c8c998c965f85bf24b67308870bf99bac047f9b464fd24e1ca412103088dd3ad6826cff6b138ace4ebea9aedb0461f2d585859ee03e8cdebc387e315feffffff01487db11a000000001976a9142e6adaa4d680907fc698afe150cd581da61d4b8f88ac7bc9080002000000010080c5255123d9ae2fda4e9b10d8d20442917cf04e2acd129f6ffa5779d036a8000000006a47304402201f37c5068e2eda3ec4c491f51dbd447c22003a4614b9284a51cfe5f1df7d7c3d02201aa79d17d2b306538d5693538b8b1fd2ff354286b6606916241a483558e96b9c412103088dd3ad6826cff6b138ace4ebea9aedb0461f2d585859ee03e8cdebc387e315feffffff01857cb11a000000001976a9142e6adaa4d680907fc698afe150cd581da61d4b8f88ac7cc908000200000001666db3be09b9f8bf5520c5bae680c02fcb54173f1b14a338014911a29fd04de9000000006a4730440220603a05534df953ce410250e150935d6eb9349f100bd07d013082bbe3ac79bc0802205219d2eec4b5ba5f270c0d870e0e741b3a14cb6046d5d7fdc0246e10c2d98e31412103088dd3ad6826cff6b138ace4ebea9aedb0461f2d585859ee03e8cdebc387e315feffffff01c27bb11a000000001976a9142e6adaa4d680907fc698afe150cd581da61d4b8f88ac7cc90800020000000159c53220930d6f2043239835f5cc00a1708c9b5df43e02479a0f6fd15e885dc4000000006a47304402202852448f44746ad9e6fac1bc2abb66bfa6faaa2d828f056f74f298cfdec3fba202201e4b1d4196c60e137c12bd7d6f5e519f9475634986d716e3bb5b8546b8dab91a412103088dd3ad6826cff6b138ace4ebea9aedb0461f2d585859ee03e8cdebc387e315feffffff01ff7ab11a000000001976a9142e6adaa4d680907fc698afe150cd581da61d4b8f88ac7cc908000200000001dd90f16cfc854531fbcc48af53989cbeca49f1381649ff54d468e579987ce6d9000000006b483045022100b63ed1e8cbeee5a9f21abca10ac3582ab79f6fb5cde73f562b332a7cfd9268300220047c967acecb77326e069cf388a2898affec665043046c59a5e008ec2092274d412103088dd3ad6826cff6b138ace4ebea9aedb0461f2d585859ee03e8cdebc387e315feffffff013c7ab11a000000001976a9142e6adaa4d680907fc698afe150cd581da61d4b8f88ac2dc908000200000001edc0854566874456f0d4ac1ac13aa9f6439caddb55fdea045d0d7011eb36e599000000006a47304402201f1ed57604b6e4c50a1997cd9d78a78a1ca80cbeffc93dfd36a944b289eed611022028648db1adc259cd149091a9e9f7ca5e15142e162d60ed7c86c07d97e85819c6412103088dd3ad6826cff6b138ace4ebea9aedb0461f2d585859ee03e8cdebc387e315feffffff017979b11a000000001976a9142e6adaa4d680907fc698afe150cd581da61d4b8f88ac7cc90800"
}
*/
block.getBlockHashByIndex
Get raw block by hash
var result = await bitindex.block.getBlockHashByIndex('575870');
/*
{
"blockHash": "000000000000000006c4ca331e7f74df7a371f45857bb0a49be05390e15cbc52"
}
*/
block.getBlockHeaders
Get blockheaders with options
var result = bitindex.block.getBlockHeaders(
{
fromHeight: -1, // Latest is -1. Or choose a specific height
fromBlockHash: '000000003031a0e73735690c5a1ff2a4be82553b2a12b776fbd3a215dc8f778d',
order: 'asc',
limit: 20,
});
/*
[
{
"hash": "000000003031a0e73735690c5a1ff2a4be82553b2a12b776fbd3a215dc8f778d",
"confirmations": 606673,
"strippedsize": 0,
"size": 215,
"weight": 0,
"height": 6,
"version": 1,
"versionHex": "00000001",
"merkleroot": "20251a76e64e920e58291a30d4b212939aae976baca40e70818ceaa596fb9d37",
"time": 1231471789,
"nonce": 2538380312,
"bits": "1d00ffff",
"difficulty": 1,
"previousblockhash": "000000009b7262315dbf071787ad3656097b892abffd1f95a1a022f896f533fc",
"nextblockhash": "0000000071966c2b1d065fd446b1e485b2c9d9594acd2007ccbd5441cfc89444",
"txcnt": 1,
"coinbaseinfo": "BP//AB0BIw==",
"coinbasetxid": "20251a76e64e920e58291a30d4b212939aae976baca40e70818ceaa596fb9d37"
}
]
*/
Payments
payments.generatePaymentTxFromAddrs
Generate an unsigned transaction with inputs and target. Uses available utxos from addresses.
NOTE: You must provide an api_key
for all related calls.
var bitindex = require('bitindex-sdk').instance({
api_key: "your api key"
});
var result = await index.instance(options).payments.generatePaymentTxFromAddrs(
{
"feeRate": 1, // (optional) 1 bytes per sat
"utxoInputSourceAddrs": "18FnwHbZz5wwCxJ4h2sQsAMYd7qyHryJUX",
"changeAddr": "1CgECg3kJdSWEkozDMaEZh1kuHWVwSnN9Z",
"targets": [
{
"address": "1KeRD3q4aPoW4cqu3zTkfPrRmXFkoEXE51",
"value": 1009
}
]
}
);
Sample Response:
{
"tx": {
"hash": "2c923cc7e6f6b17ddc5633a9c9d0c74e5a4f08bfcc66bfe902c224568936549a",
"version": 1,
"inputs": [
{
"prevTxId": "7a4c9192176fe171beb09b644268cf14ec8e6a0d61a7da87f6342a35a57deb7f",
"outputIndex": 3,
"sequenceNumber": 4294967295,
"script": "",
"scriptString": "",
"output": {
"satoshis": 550368,
"script": "76a9144f950ca34751b3d45a021475759a719654b0e6f788ac"
},
"address": "18FnwHbZz5wwCxJ4h2sQsAMYd7qyHryJUX"
}
],
"outputs": [
{
"satoshis": 1009,
"script": "76a914cc85dcbf69eeb000f4074179df666d639289f67688ac"
},
{
"satoshis": 549190,
"script": "76a9148014a040e7fc4d1a86404197b1ea9389eb2bf8ed88ac"
}
],
"nLockTime": 0
},
"fee": 169
}
Build and Test
npm run build
npm test
Any questions or ideas?
We would love to hear from you! https://www.BitIndex.network https://twitter.com/BitIndexNetwork