@axerunners/insight-api
Version:
An AXE blockchain REST and WebSocket API Service
476 lines (435 loc) • 46.2 kB
JavaScript
;
var should = require('should');
var sinon = require('sinon');
var BlockController = require('../lib/blocks');
var axecore = require('@axerunners/axecore-lib');
var _ = require('lodash');
var blocks = require('./data/blocks.json');
var blockIndexes = {
'0000000000000afa0c3c0afd450c793a1e300ec84cbe9555166e06132f19a8f7': {
hash: '0000000000000afa0c3c0afd450c793a1e300ec84cbe9555166e06132f19a8f7',
chainWork: '0000000000000000000000000000000000000000000000054626b1839ade284a',
prevHash: '00000000000001a55f3214e9172eb34b20e0bc5bd6b8007f3f149fca2c8991a4',
nextHash: '000000000001e866a8057cde0c650796cb8a59e0e6038dc31c69d7ca6649627d',
confirmations: 119,
height: 533974
},
'000000000008fbb2e358e382a6f6948b2da24563bba183af447e6e2542e8efc7': {
hash: '000000000008fbb2e358e382a6f6948b2da24563bba183af447e6e2542e8efc7',
chainWork: '00000000000000000000000000000000000000000000000544ea52e1575ca753',
prevHash: '00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441',
confirmations: 119,
height: 533951
},
'00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441': {
hash: '00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441',
chainWork: '00000000000000000000000000000000000000000000000544ea52e0575ba752',
prevHash: '000000000001b9c41e6c4a7b81a068b50cf3f522ee4ac1e942e75ec16e090547',
height: 533950
},
'000000000000000004a118407a4e3556ae2d5e882017e7ce526659d8073f13a4': {
hash: '000000000000000004a118407a4e3556ae2d5e882017e7ce526659d8073f13a4',
prevHash: '00000000000000000a9d74a7b527f7b995fc21ceae5aa21087b443469351a362',
height: 375493
},
'0000000000108d4b9231f4ec99ab5dc970b6ec740745f44eee0754f67d598ac3': {
hash: '0000000000108d4b9231f4ec99ab5dc970b6ec740745f44eee0754f67d598ac3',
prevHash: '00000000000a9b54c020f1151ae80c811c116bd9e8a48f1a3b4606be32e8323a',
height: 99999,
difficulty: 3919.936330381069
},
'000000000008b8c4e86d070a78c978957ae7f0f127ff91aae6e4b0964c92d0b5': {
hash: '000000000008b8c4e86d070a78c978957ae7f0f127ff91aae6e4b0964c92d0b5',
prevHash: '000000000011e27b13e5c27ec41f4ab2ed404ca6b1cf5b0c98e1a7bce1ea8183',
height: 299999,
difficulty: 2375.159827856423
},
'000000000000c53bf17a98b9ee042d6d4c3faf37d7a9f5c1335cce6df896f2f4': {
hash: '000000000000c53bf17a98b9ee042d6d4c3faf37d7a9f5c1335cce6df896f2f4',
chainWork: '00000000000000000000000000000000000000000000000147108bdaa532b7cf',
prevHash: '00000000000025fbeac57a69598c7aa4c26954e33aba1e1883bb4bf168e8e6b4',
nextHash: '000000000000a0b730b5be60e65b4a730d1fdcf1d023c9e42c0e5bf4a059f709',
confirmations: 42,
height: 599999,
difficulty: 75786.58855499285
},
'0000047d24635e347be3aaaeb66c26be94901a2f962feccd4f95090191f208c1':{
hash: '0000047d24635e347be3aaaeb66c26be94901a2f962feccd4f95090191f208c1',
chainWork: '0000000000000000000000000000000000000000000000000000000000200011',
prevHash: '00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c',
nextHash: '00000c6264fab4ba2d23990396f42a76aa4822f03cbc7634b79f4dfea36fccc2',
confirmations: 40493,
height: 1,
difficulty: 0.0002441371325370145
},
1:{
hash: '0000047d24635e347be3aaaeb66c26be94901a2f962feccd4f95090191f208c1',
chainWork: '0000000000000000000000000000000000000000000000000000000000200011',
prevHash: '00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c',
nextHash: '00000c6264fab4ba2d23990396f42a76aa4822f03cbc7634b79f4dfea36fccc2',
confirmations: 40493,
height: 1,
difficulty: 0.0002441371325370145
},
533974: {
hash: '0000000000000afa0c3c0afd450c793a1e300ec84cbe9555166e06132f19a8f7',
chainWork: '0000000000000000000000000000000000000000000000054626b1839ade284a',
prevHash: '00000000000001a55f3214e9172eb34b20e0bc5bd6b8007f3f149fca2c8991a4',
height: 533974
},
599999: {
hash: '000000000000c53bf17a98b9ee042d6d4c3faf37d7a9f5c1335cce6df896f2f4',
chainWork: '00000000000000000000000000000000000000000000000147108bdaa532b7cf',
prevHash: '00000000000025fbeac57a69598c7aa4c26954e33aba1e1883bb4bf168e8e6b4',
height: 599999
}
};
describe('Blocks', function() {
describe('/blocks/:blockHash route', function() {
var insight = {
'hash': '000000000000c53bf17a98b9ee042d6d4c3faf37d7a9f5c1335cce6df896f2f4',
'confirmations': 42,
'size': 1879,
'height': 599999,
'version': 3,
'merkleroot': 'a8f28c6d5c0461f2d6c2edfa2f550788d95b9d5fdbeb4215aa1fa415bc64509f',
'tx': [
"18587d7adb7d65fef1ddfdad6e7c18743490aafd12f2ff0de8e348ee9ecaba20",
"0873850cc8f00a88b7040cb1852421f280c672f34fbdae63baf2d32dec757c5a",
"800182f2605a3c2a115394c08117314732c71e3fd7ca3eee70f0fa964fa64f53",
"5716a3d89dd47928892c9ab16cd2103a0423517a92d343f227a71916bbdbbe07",
"585cd3307d36cb0f4191e410426a19192b41aa77f120cbfd3afb6dc0d3b5a71b"
],
'time': 1483795357,
'nonce': 671103908,
'bits': '1b00dd5f',
'difficulty': 75786.58855499285,
'chainwork': '00000000000000000000000000000000000000000000000147108bdaa532b7cf',
'previousblockhash': '00000000000025fbeac57a69598c7aa4c26954e33aba1e1883bb4bf168e8e6b4',
'nextblockhash': '000000000000a0b730b5be60e65b4a730d1fdcf1d023c9e42c0e5bf4a059f709',
'reward': '3.88010204',
'isMainChain': true,
'poolInfo': {
'poolName': 'Node Stratum Pool',
'url': 'https://github.com/zone117x/node-stratum-pool'
}
};
var axecoreBlock = axecore.Block.fromBuffer(new Buffer(blocks['000000000000c53bf17a98b9ee042d6d4c3faf37d7a9f5c1335cce6df896f2f4'], 'hex'));
var node = {
log: sinon.stub(),
getBlock: sinon.stub().callsArgWith(1, null, axecoreBlock),
services: {
axed: {
getBlockHeader: sinon.stub().callsArgWith(1, null, blockIndexes['000000000000c53bf17a98b9ee042d6d4c3faf37d7a9f5c1335cce6df896f2f4']),
isMainChain: sinon.stub().returns(true),
height: 599999
}
}
};
it('block data should be correct', function(done) {
var controller = new BlockController({node: node});
var hash = '000000000000c53bf17a98b9ee042d6d4c3faf37d7a9f5c1335cce6df896f2f4';
var req = {
params: {
blockHash: hash
}
};
var res = {};
var next = function() {
should.exist(req.block);
var block = req.block;
should(block).eql(insight);
done();
};
controller.block(req, res, next);
});
it('block pool info should be correct', function(done) {
var block = axecore.Block.fromString(blocks['000000000000000004a118407a4e3556ae2d5e882017e7ce526659d8073f13a4']);
var node = {
log: sinon.stub(),
getBlock: sinon.stub().callsArgWith(1, null, block),
services: {
axed: {
getBlockHeader: sinon.stub().callsArgWith(1, null, blockIndexes['000000000000000004a118407a4e3556ae2d5e882017e7ce526659d8073f13a4']),
isMainChain: sinon.stub().returns(true),
height: 534092
}
}
};
var controller = new BlockController({node: node});
var req = {
params: {
blockHash: hash
}
};
var res = {};
var next = function() {
should.exist(req.block);
var block = req.block;
req.block.poolInfo.poolName.should.equal('Discus Fish');
req.block.poolInfo.url.should.equal('http://f2pool.com/');
done();
};
var hash = '000000000000000004a118407a4e3556ae2d5e882017e7ce526659d8073f13a4';
controller.block(req, res, next);
});
});
describe('/blocks route', function() {
var insight = {
'blocks': [
{
'height': 533951,
'size': 206,
'hash': '000000000008fbb2e358e382a6f6948b2da24563bba183af447e6e2542e8efc7',
'time': 1440978683,
'txlength': 1,
'poolInfo': {
'poolName': 'AntMiner',
'url': 'https://bitmaintech.com/'
}
},
{
'height': 533950,
'size': 206,
'hash': '00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441',
'time': 1440977479,
'txlength': 1,
'poolInfo': {
'poolName': 'AntMiner',
'url': 'https://bitmaintech.com/'
}
}
],
'length': 2,
'pagination': {
'current': '2015-08-30',
'currentTs': 1440979199,
'isToday': false,
'more': false,
'next': '2015-08-31',
'prev': '2015-08-29'
}
};
var stub = sinon.stub();
stub.onFirstCall().callsArgWith(1, null, new Buffer(blocks['000000000008fbb2e358e382a6f6948b2da24563bba183af447e6e2542e8efc7'], 'hex'));
stub.onSecondCall().callsArgWith(1, null, new Buffer(blocks['00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441'], 'hex'));
var hashes = [
'00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441',
'000000000008fbb2e358e382a6f6948b2da24563bba183af447e6e2542e8efc7'
];
var node = {
log: sinon.stub(),
services: {
axed: {
getRawBlock: stub,
getBlockHeader: function(hash, callback) {
callback(null, blockIndexes[hash]);
},
getBlockHashesByTimestamp: sinon.stub().callsArgWith(2, null, hashes)
}
}
};
it('should have correct data', function(done) {
var blocks = new BlockController({node: node});
var req = {
query: {
limit: 2,
blockDate: '2015-08-30'
}
};
var res = {
jsonp: function(data) {
should(data).eql(insight);
done();
}
};
blocks.list(req, res);
});
});
describe('/block-index/:height route', function() {
var node = {
log: sinon.stub(),
services: {
axed: {
getBlockHeader: function(height, callback) {
callback(null, blockIndexes[height]);
}
}
}
};
it('should have correct data', function(done) {
var blocks = new BlockController({node: node});
var insight = {
'blockHash': '000000000000c53bf17a98b9ee042d6d4c3faf37d7a9f5c1335cce6df896f2f4'
};
var height = 599999;
var req = {
params: {
height: height
}
};
var res = {
jsonp: function(data) {
should(data).eql(insight);
done();
}
};
blocks.blockIndex(req, res);
});
});
it('reward for block 100000 should be correct', function(done) {
var blockHex = "020000003a32e832be06463b1a8fa4e8d96b111c810ce81a15f120c0549b0a00000000009e3281ffb800307fb215d10faadee1fcc92002a54d922bb790b44f75917486b2663cbf53e8b7101b733405000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff27039f8601062f503253482f04663cbf530802997806ba0000000d2f6e6f64655374726174756d2f00000000010065cd1d000000001976a914e8a031de61cb5aa0e314d9f6d172fc68c147ea0d88ac00000000";
var axecoreBlock = axecore.Block.fromBuffer(new Buffer(blockHex, 'hex'));
var node = {
log: sinon.stub(),
getBlock: sinon.stub().callsArgWith(1, null, axecoreBlock),
services: {
axed: {
getBlockHeader: sinon.stub().callsArgWith(1, null, blockIndexes['0000000000108d4b9231f4ec99ab5dc970b6ec740745f44eee0754f67d598ac3']),
isMainChain: sinon.stub().returns(true),
height: 99999
}
}
};
var blocks = new BlockController({node: node});
var cb = function(err, res) {
should.exist(res);
var reward = res;
should(reward).eql('5.00000000');
done();
};
blocks.getBlockReward('0000000000108d4b9231f4ec99ab5dc970b6ec740745f44eee0754f67d598ac3', cb); // should return reward for block 100000
});
it('reward for block 300000 should be correct', function(done) {
var blockHex = "030000008381eae1bca7e1980c5bcfb1a64c40edb24a1fc47ec2e5137be21100000000002c3f75ecbf0fcb67cc1db6416feebe3b37689d94e44fbf1ce1db0de40ac3c67fa4c59f5582971b1be8127dc00301000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2703df9304062f503253482f0428c59f55083ffb2267400000000d2f6e6f64655374726174756d2f000000000242517011000000001976a9142cd46be3ceeacca983e0fea3b88f26b08a26c29b88ace824c70f000000001976a9141a43f6689de0f8f960b5701d25bef262ed156ff288ac000000000100000005aecc9172838a9a06f51058663241fd19ac7818c160bcc8677e67f4f449a03d0e060000006b483045022100808e7a26a05d19df10d2d2a954b3c8ddbca3189b3c9a30bd9bcb88c00d115c590220279dba16bf467950e3856180032953debf6184d28aeb019ceb1d2d6ac6d1eaf1012102268eb6bff9ab78578c7821021a1c659c35089f0c6bd0da8045fa3687d24e8bb2ffffffffaecc9172838a9a06f51058663241fd19ac7818c160bcc8677e67f4f449a03d0e0c0000006a47304402201f6678f8c6952aad9b1492b7e113a1cf8ab3fd04cf9b798ed7c09ed16092c1b90220624c35f40f96a5dd68ee82ede60e0ffadeb8a6ddfe8d0a63f577d330c9e473eb012102be102a3c89dc959c0e12285acf3fb21031cc55a14006ab2c00bd3c978db1f322ffffffffaecc9172838a9a06f51058663241fd19ac7818c160bcc8677e67f4f449a03d0e100000006a4730440220216a94a0bad8b383f08f0bac745186ae79efc049fb73af43fadd672c2ca643dc02206ba06e9c8ff35c1bde1681a595e3a04a11f1a46a4f75148e2f76a6e52e043bcb0121021a4bf485c7f4800722b3603b4883c81fca92561bca1b793d4647541ef0191f35ffffffffbe11ba2509e6fdb54516cca6f74281e477e59d6a7bdb9e89769e67ed9295893f040000006a47304402201e5d7c85c16fab24168380a5ab1a0cd6e65e035fed9f086345bcc77b05e73c5002201ca5bf0b412535ec64d55f5bfff7cba3284aa7e1fd12a5c6daffc5a0596d12f501210207e14c6db2841e22d6747b2b3db4ef81610e3df2f20e373b3c7ebb1b49ff9e2cffffffff05ddac92f6e576345fb19f65b81467aba7b3a9e5a2ac19fb58f0deb02eb6e710040000006b483045022100d0c0a2db07d269d1d3762047f36fa2ca584d25109e4f91225994a7aebe5c9edb0220517ee2fcb2ccb1cd6c2c0956122e1806299f24dae7b71884987653de3d0536a101210347532de25ee7bec167adc3b3e2f23478f6c67ec1abe86d828a42914ed929241effffffff01000c7742030000001976a9140ddbd93f176b458fbbbe751db05af1e5935487b688ac00000000010000004090de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9090000006a4730440220109c0eedb88360cab0f063918076a55f93c3d79dfed0927bfa6de55914fe4a4b022004ee426eee5b5938c15a75b8de3ab03036afcd782bdc4e1a00d39905472d54f1812103ffde1c56a015638d6f5a1c1c84ad72dcf291b966c3491e56a1105d692473c66effffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9070000006b483045022100af1f1ff7463771de2e6f88da3d63da1d87e8d99a1b27f946413b70a15c7fe60702206dc96e3ec3791ead93fd53170e114675496e53aa0559fda210501c43800fd436812103eaf9ec79bd111e49ed9a4540bc99262b3bde136a0dab130747f68e334f6266daffffffff3296f199939691182fb1b3f13768057df754cad9a5e158250d3b7c5a82e9d06a280000006a4730440220139a681eaa4c38d0eb2cf4dd92e763f34ca3f817533f6e177bdf70f03e5f183802204c3bbcb9bc31375bcbc8448d654d0c314310ccb4bdb75ebb5c981cf26a176e32812102eb81a4673bfab8ac482daa14f43e70cf3e7d1586841c8ddcc92880852549b82affffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431200000006a47304402204f8740d4846fd8d21ea4aba50c70c780696e750449d571d0edf35101fc0acf36022055ccbf8ae8a790381852e658ca57d11442bffe635830c081f2293c40a0a957ed812103e166b63f9c4053521d6432bec4f74c29e76bbfc98f47fce6cde5a08a5a1d9792ffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd070000006a4730440220705cddd094757206653d4d429c7a96f81ed94fb4ae08b83bf0556570ea2b370102202568f0e57cfa2c4422da4cc12c0f114c539c37122c4a6360438f320c8155be348121026e6a1f9fd53f471919dda78f0c9aa883bcd0b1de961b467ea3c1a6d386b6c9dfffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe90d0000006b483045022100bc84186931b1f241d35f30ba6456921cc503ef11ab416e9d099af7f2d86ae9c3022058de2d9050ce7f69f385372719dfbc7fe6664c1ce1169fbc790e526f8c84e4fb812102a0c89b927909db1be1b96124ae51553889ddca2d11a9d07fab7d6d531131a0f3ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431050000006b483045022100fed188dea82e5050726872dbbaf5fd077942271012a42d1a6ef97d2498af3126022017785895a69d6c72660bd4d3b9b0f81e9aea063343457fdf9b1b7d4eaa88a5018121034295cb75b476e67f839b30536c83cefb8b4aef96a73d5286c8a0991e0c1746e5ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431130000006a47304402202feae1abb36f185d1773099f115d063e615248ea443b103a27b1a99765bcb08c02202d8187b0ab27035b2d2515dbfd8305e263ae4baebfd31f8c3842524dc6f0eb838121029e7286f8ab39b0ee1f29dfaf89be2e779656fbecef9ddc773cc7ce230b26c8fdffffffff3296f199939691182fb1b3f13768057df754cad9a5e158250d3b7c5a82e9d06a2e0000006a473044022057cc0562a502d7ae1f4d4870b15d97b9e1b279bcee13f8239b6de55968a405600220402ae45ed8fcf63bacc2f544a7d7d9b050ca6d1ccc6a4466faa8fc123893a65b8121027359c49fb7aecf988350921c416ef0b97802ad11056e550ccee4a3e79a711274ffffffff3296f199939691182fb1b3f13768057df754cad9a5e158250d3b7c5a82e9d06a040000006b483045022100aaae4d09b2790cc753ed1d80668b6d47126ef63df5a3c5e2b2a04f559846eb96022031b9c4bb5654b8a19b06020499dc5078390529c0eb6b8aa249e3f7f07a8891fe812102f0d411c423fa6b2c96d17fe6d4e46ff315b71aadb79f3479248e0e957097e2f4ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431300000006b483045022100a675d8c0dad95bf03e63cc278a0c4d73afba4aaf3be0db65cf7974d3b573466302205cdbdfd379f0ef8a7f1ed0c165a9dce6883b1cc425b37cdd308d9e22300387a5812102835261c3049bc9f7444789aeb1f2ebabe57c3de8f25dcbb4216fe34515dd5e41ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431010000006a47304402205edffcb6b4117e05a5550422d03977852d6f659693344fa33a15fe62478295b80220407cc3b56d47b8f634344041eaebe45374ff2280d597d083e1cbd201662d25988121032fe650990eee0c25503de333960104e292b05cd8d2dc3cf4f9d2f4715034871effffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c14312f0000006a47304402205c940f4ef993f77285db167e9439b507dbf02d0da3e86cff84b3e75c2453854a0220390278e18ce0dc42d799d94fd4500874702907ed7b9543eefe4a5a73db342211812102e6e9d83db9b6ab8f7b4b0ae7f9b8e5c403d66890d076b2452180572639ab86b1ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c14310e0000006a473044022065a4ed1f556c00040fa12ea8cc9c902a205cbb742430e41e5968905da982b31e022012a4714e5c08cab48f843f356a6745310f9eaba94e3dab77a2b42e8e1d7a44cb812103aab32304804afe1138647396e06c3605fd95a1108ebe129f0322f9c401bf5631ffffffff3296f199939691182fb1b3f13768057df754cad9a5e158250d3b7c5a82e9d06a230000006b483045022100958601719b12fd1ad2fd4dc6153a79eab30e90edcd386459a5a3eaf0ed22b60d022078c571e267c205df02eb867fa9b3c56f738bb9dcedc54ac598e4b6c0b78a8c63812103ee968748f2e047fed16d4b0fd31a9f456f55482915a19195e0631e6256fd7607ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431000000006b483045022100899bac918e37589e465cc4160a8c36d79904fa356edcc9c22d09d57f670d1d89022054be922ccd2eaac80e758caa48057763abe0b4032f4e9e78a564514199b441d4812103ca78a7976605211d782624d28b6d334be228a4ae4951b1c29d24d0883f49c432ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c14312e0000006a47304402204f10b27d9114e260471c7dd73c233175973441dccbef3063e4aa03bb1230e2a10220763f356d8ea8e88402127779f2782bf3e08c14d4eac87af380fdbeea0b2e74908121034a24cb93ab16517abe31b665ab2448372bfca76d9e3ee7fcc70f8916646e879bffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd050000006a473044022036ca72d7ef7790726501ba41144acd50d1cac173b8297d4e1bbbc7a9e57b3210022007ebe415b9c39a0fbba62127d4361f64b7e809334ce75d0adea39f16dacb72df812103200090b368fdf0f14cf4c94d6b9d855b5806a48ca6a875326e82fa1f59159675ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c14312b0000006a47304402205d3fa1de5ac768bcffb40ed3f026fbb1f19d9fd851ad6576c7aff1975d2fb05f0220024043fc7ec00589a30ba89f649ce9441d9af27c48d2e3231a1c339b88f3d841812102a956c56686b6cd7636921de1fc33d9ffa0327a232eab3a5b6b72e78a9fd5d4a8ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9130000006a47304402204ce74e3ccd8c1f0819bad21409a22a0848e790857292e65d4222cff4b8a4c558022023afb5d0bfbb79e657adcd796729960c744be70b7c66bf43f785e1a9dea7a27a812103a5bb6d0811b15b264570a266bdcf843960a48e80db549cea8472d988f04cb3e7ffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd0800000069463043022032d4a44211c3288409fce27a696dbadb05e7140e4c0a51436f20bf5227175c7e021f0b06e73596ce62b3a2fb352f56be1992aebbd0e26bc423cab6f28ff73c297a8121025f02a2d74dd0f6cc3999f1309972b8e27dde923fc712e07d92ca67377ffba853ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9290000006b483045022100cbf6a82f864def3114a4141264c0c5f6893bb1f0c610549da91a58643a81f28d02201284f565a836328741b12e05e7abe256d5b535d22f04e5c46ba5e48088d88c70812103fcedd8cfbe56e069fca5868c7bf18aa39051a05818e5f8922f04a8840a4c96e0ffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd100000006a4730440220219ee93087f1d72a813ba381a487047e9e8b241a9df18599c728d21f36676207022020804e37391812bf2796f809b59959bb2fcb011758e07590b729c01b46fefd23812102803359fceb6bf09fc354b1489bd29f3a43f5a4fcaeec19b69b9e0184fdcd9bcbffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd1c0000006a473044022045f3189a88dbc5af199af43356d078dbe86363af87871b70e4222ceb3ad907d002204b828982960fecd52c52dfc27cc3f89656888c0a94d1a5e29272d32ad8ef66db81210339d9b82eccba46ace6972c6bb43a38ed261d0a8f7e8540127aa9ee682eba1f23ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9170000006b4830450221009558cc9335e48431d41c17584af34d3d0a9a4d2e23b8bf9339d1827eee0a3127022045f224c998faccb02eb2435292fc4fa664f14fc42db5184b8294d81035f32090812103c2c80a7b6d783489a467768108be77d495fff1e8c888efc5c662ceff6ea2f33effffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431060000006a473044022067d242d653717679faf8546e16ea25431feea55d6f4ac515d17d51641776cbba022042be1d753b9d0bec57d64febec35518b5f8119b6f1890e680b9b0a5d09e9eee6812103ac5a23611f0fa3b33b61547f2c0951794b5447f76667f4dd2ffbdbb72cb3495dffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd130000006a47304402203e524ac8922e6356a9717fd80a20093ef3c152832c21d908b1b36fd592da4fa502204c441cdbd71e4664e9dc7ad0b8aa0557e7ec655f2e827a26e478a93e38be912681210318413762a713aab03aae0b63a071f0afb5a659dc474762c49a9fdfbd04ed8006ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9380000006a473044022026250b9ebc5ad79824a0460ba2bd5edc63a0842196e995a45a940bd24233293e022013c98107e94bfc7e53919bcde22322b6b9600ef5fb2511dfb800da01877623f881210304a22fe23c9aa9cb35b732295ecddf1e7ea06ff1c65ef16d410c49d821a7b38dffffffff3296f199939691182fb1b3f13768057df754cad9a5e158250d3b7c5a82e9d06a390000006a473044022044727b42807eb5c47e8901bd630d0d9aeea3b366b383aca587f941c63163f4a002205530336c3fff01e40ebdb21c22b335e31ad15e2c235e7f93f580f29d8da779e6812103bffd1d85b5430874242396c5493795f1d748f2fc2ae97273a918656970b697dbffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd180000006b483045022100f2c2e98ff13c57a6ef4a12bfdc49063c7bca6b89e66a465048ee628f787d19a50220631d4e63d8bbb85349418304f1ed2e84bc8b36368468dbb089e0fa0ce2569cfc812102337b2258dfd3c848d154a01b18718791ee8d38d132ae66186b319fdf8b834388ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe91e0000006b483045022100f6fa258cf77f58d6f32a0beaa495f65f9994b2118214f9b0828bfa7c4752e5b302207eb7b9d72df545723ea8bba11f12178161f8e0858593906f0497694cbfa924c6812102c8c94486074f917a0099f965dec88ec7c53951b622977c0330f82bd4895f2e1affffffff3296f199939691182fb1b3f13768057df754cad9a5e158250d3b7c5a82e9d06a350000006b483045022100f321c9db666e2ce02acaaa9d35c5f8a1dbbf18f1914de784bed74e1ec2a9a8af022013c3fcd42879ad85822010c0f82371ca3a2379f2b278f5a46a315dd0206d020981210392d578c38c0a05ebdae07e1a249384699e156b2fad4de023a9df191822bb3679ffffffff3296f199939691182fb1b3f13768057df754cad9a5e158250d3b7c5a82e9d06a0a0000006b483045022100de13f5943aa3167a74bf32c7e83b9ff484ed9429ed873ca3ab8a7900c51fc0a6022067de1eee6ab93193227cff145469faa16186c389d4d5288f2e2749ed9d441db18121021314b19bdd47e33d91d7c1190b49e448cb4e31b913e288751959b066face0c59ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c14311f0000006b483045022100a719cfccc38a2296fb0f18889b41083b3a7bbb0b94eb26e7f1e041ecea65a6ee022072f6fef281ae9221c1e426a98b1f11cbaaede9f0104a0edf117f0cbefadadcdf812103a871bfaffaf9bd75a44525b53481c1c53a13c4b5dafab24d45a507b2cf91565affffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c14311e0000006b483045022100d7fc043c424d979b4492b847af8d28f41744148d556b75f90ab3ca511f29a68b022006a42f19a8184531c9e7853537efb247720fcc8bf099bf5a91bad0d626b119a3812102e270d63fe42daec1653b7a8bb23a25bbb12813f6ac3e7f977dee1abc3ba06e97ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9340000006a473044022029ed0639ce154fc2480d1910ebcad16e45346b43fc8ded7de43c3c202f4b3a4902201d86bf1f31587ee122e70e9a2bed41bd7783c2c8c796b78b55ed3595bc5b92d68121023eac08b4cb61e9a79480e037cf8d401f4ef87a883088db1e67225ad2a379d8feffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd150000006a473044022047bb64f8353377f455616e36a8494afd8883da5e220d191dda95da97448d068402203b54eeaaef210c098fcc56a422a651365e89d27eee12095fde69ca4c24387255812102b0dc18c827a8dc5db88829a2f409c422e929a5169956c9a08278995e562c318cffffffff3296f199939691182fb1b3f13768057df754cad9a5e158250d3b7c5a82e9d06a310000006a4730440220163df0bf08480daacbcf3038b43a8d2454ae610f724bb173ad14eaa19281885a02207be4707e31280eae3cf32387a40e3cb40025f8b0bbf61aab37171111bdd6c888812102d83cc4ffd8d29fa66d27146c2dfe4bf264d6e5d8139e88be50bb5868f7dd7de8ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe90b0000006a47304402207bf47fd8bfa72743cf9eafc6db332c8eaad1777dfc35e10705c309b161574cf602203e96cf87c49214e803bb2e07ea444c94688b6d51e6f44726e700903700f7ab40812103b14d30d2a0f6724cc362c288fbfdcc7d8cb6fc9c959d34832fd5bf6fa1aa34baffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9120000006b48304502210088d7337015623f90aa1378634d5e1ff66366aff2d1edc1f0fe76c4d68b2686600220431b3fabcda2d0d8e78556b954257b3ee581ae8c5a81419b300cf268404ec6d9812102ec61694d0125ae42dd0d7bbe665fbb1b49efca57947aeb54f6415eefd6327f97ffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd0f0000006b483045022100fada257a5b7b812c00e158751e4fae70199b007d9719814e14eeb25cf700242a022060b4498b79c5fb6c170eaed74537c7a6e720c1dc018ec3729225298f96051a95812103be50f973aa0c14e74056e5abc5402903da1958f15176d71af59b908412203a9effffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe92a0000006b483045022100f9961198d6e148fe6715509e0208545aba888855a7d4e10a2bfb59731a7fb9a902206677c115fbdb00e35295acc4d84c0e7ef2fc9080a9bf07f61a2e18b8bcded2ab812103b5acc7454c65a8d9f877b29e15185143fd3fc3bc30a27f63ae86e94ee869990cffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe91b0000006a47304402203ed8904c3950f44a171d76a9d1e75d6e0c46ed4192d31c24ab7c14026e793d81022023e71aefd736f364c904a55678c445821858bcb2e49d6827174148753f62bddf8121028754ab47a49febc6264b0c119a9cb40b6f3d96daffa92a49122e49477a81e0daffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd190000006b483045022100bd6ec79d409fc3c737a70ba7eacfd375866ae4a80de0f4915f6ab24766590add02201424a49abd56c8e65b9e314d120bb770cb8c2dbbaf84fbc3707616eefe472ea6812102780cc93b0f1cef4a0d9ef40b876174fa5f75ffc3726a616c1bc87a1b1f92c850ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431240000006a4730440220281542fce27a0e527c798de6aabf23ed90ec45f29292744f33bfb4077a6faa2c022030926f2096d758a5be0bb9d33b1ad8a8a5608ce06d07068c0a87739a37a430308121039e4d2a87f21af5ef25fd7d2fb552429f1d45788c4600c28715fcdc42b31f6078ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9160000006b483045022100cd4ad87a379512d6797063ba3f083bc21f46e394e6041091476bbe49fa83ae6702204462afaebfbe9cd11cc957b00ee18415e4d392af4173b9195f67242c8b398df6812102dac644326958f48ce419d721aa0afb2bf06c31aaab620fc4cafcbd6a4f3f58ceffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c14310c0000006b483045022100b14ec44cc5d89d74f706707cdaab149efb3b420db9695279c70c8b5f8520a9ea02205b5a4556e4384935b81fa2b3a73e31cf06a20c3106a2ec6a3e3bfa6d3b43b05b81210260b805aed62333ab68ce6bc3190c44323c88cf09f61310dca1fc6dbb99d31797ffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd160000006a47304402204e05f51d546e90a1d7580c7a6153fa38c91e5402840b0fbce5063887942e5a9702205d53d4796b24fd8c535ae5a89d646c12c7d5c41e499cb6ababcdede15770b9fe81210314630d2130aa2057d97587180235347fa879d37ce4de95653f98453d4051baf5ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9230000006a47304402203854dfc39f5ee8a0fee117647cf5a63f511c290103b3c9a116d5200f1d23fc3b0220448b61c87a39384a1fdde0f520c35a052cc11e06a50e2bb81081dfc9d1020490812102453fe584f64717fde2299fecee5ef2a3b5a67d7f0dca631fc547ab88679ffdd5ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c14311d0000006b48304502210097f6c257cff9e0af61286f078c2b1660dfab4ed181e00699f79975ee9639221e022065662548749cf8beb7a287ff2001d9878d0010d1bcb406bdc65c0bbd7697dc828121025eccc4646b7601706a2132e1dacf69e93cc633b544182cb3c52a3c73e21841fbffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe91d0000006a47304402203b1d68fa673694b1b65aee2115b84ae5d639b1ea5ad722acdd15399fba97e0df02204c4e5fc5e763619fde9d905c2a0107038526baa30387295a7cf0223fbc2de0898121030d9a39061a202f0e1aea97c8fc49e6f122626c6cfea1a448366ba23f9c1eca41ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9080000006a47304402205e62a8ce7754a85032f704a7a0148fd3bf536803a958e1cb18d90fa172e8fda802202c66255d92157e87ec506cf645f65a65f5970f9b77257189fe4397de05da27d88121036178374d9c595b1058adcd62bade25702150f5c1891b051f255206dae566d55dffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431230000006b483045022100db60bf8a562ab5ee2b5c8c4997c262569780c7f39123965ad18d3981167b7b2f022026fd28421ca9180a297ff7acc4a1d6017c3d63e5919872aaf80ec21ded096907812102be8d6eada9979d683eddd9a958a65abc58e99aea3b6b3a6ffbcb68a4802962deffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c14310f0000006a473044022077257849ea9d26b1f3b0057c8cacaeee8470dbf4d74c05d69b103bb356bb7fd9022028ed2a1db4791a0901174120464503b1d1e6ce4cec055463c57c8c047454d197812102e57b8d3a9c08815d2ab5ba875589503bcd37d4bdf086924ebf7acc88e7db44d4ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe91c0000006b483045022100fe6669949c66af1c58c1a587d33672e7389015a00a2021a59bd0c90ef915dad00220771bca8347df920d421e126f162734a29085287cdf8edf11cf7d2b7aa33b062d812102569c35a39cea8d4fe695ce4211b74c16bce2acd31178ea991563694210a3ee72ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9140000006a473044022041b114f7ef7cf4f896451b5efd9eb9834bbba10fc26f2e318c76f2c74236185202203daeea155ebdcbd0f86eb697b267b993a7f764341f9c0bb76439e917d52ca65981210348ac88b3fc3fc7ab15e032a0f9e4c1577961a643f0ca0455b2aaec05c289d9deffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9260000006a47304402206d132876718596eee88970a29051fee1a13520ac7068c70ae36849b370a4ad040220254916ccdd233aa59f31d59156fc6c304e6c101a631b11173bcfb3d36833c1c9812102397e169a430eba75322aab6f180e15dc38d195f99dafe2d411fe852a3413a038ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe92f0000006a4730440220227f6b1a6d53fad8b9c95728382b626522d1fcf785aff1a475f8011b1fd2d86b022076a673e6b078c15c58146d3c6d7e0ebf2b59b57795a70f6d7b93411b04ed10fd8121033564f3a1f03752041badeae2f8c29b1df0dfc46ed6015af60f06a0e96c7fe2e8ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9220000006b483045022100e41540eaf417c7e13017df61300a020d2f1bd6e9553dd2249a08874b91bd6b6e02200e14d7c8d75c721d613306dd1419048e4e00e986b19a4e1ac8f5cd165ae522ee81210221c82aab8336c42bad314b9fcc92217f2b74bc658f0ec6d7986d326d4b82e07cffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431140000006a47304402205579e91e8002f995eb6b7a17dd3bc2fe24fe3017f9424489ab43eade0c76caa502203713afe61f04978a5443ba23e5e46491b12c1ff7dca0eb510488dfc00e11218f812102fe7ecb2d9c709ea28c70b50a16c4909170632382a8719d53bdfa62120a6a9d15ffffffff32777d149455b68647cb5d7f6fbbd0cb102d1d7875622663bd8514a7f3ee6ffd1b0000006b483045022100d1c2e68a643fc933b00092ee2cca92739f599f27cb8dcaf52d094390ec83f94d02201706d69bca71ab64dcf37b1a07a8066cb6ec881d6bff8942f1f1f1623ef47a2181210257d69228af265326bfd310acdcaf88fa72acb48ff76665bb0fad8b301fb56ca5ffffffff90de0725f3cec2b92ba88633d8b6a84e5e9134a6b625b637dbb78595cf53cbe9030000006b483045022100fab970d463cb4a59ade3ebf660c8d762413901253446d79d50ad22a95ff5f2350220781f72c6e50fb3febb076d8dec9292f4a77ba1e4cb2b13357fbd7c853c821f5d812102613688a6189c514546b0c5ca7872867ae2eda9b1c40e33fab36e634c6618107fffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431270000006a4730440220073d4e0037f53863e0a796946e1b94381f485489f754d305d6903b37ff3c5f88022045d82eab959c80c91e3ef242e404f5c82acbd0958e496213444cbe345ca1e2a58121024f26d46e706a156b9ea394c4b22c7abd0000582a6c9ac09b704656e48da83e74ffffffff8cbf4e39f7fd52d88e2df4b352d0f8813970d752cba039cc70d519a7387c1431150000006a473044022026bf58f38cf788023c29766ef8dbb48bebd514dce9952820fe2174bd91d7f273022061b716f3780b2b4f4585ee306ed2054fc0e08db82af985a64081f2223e6e59a18121037dbb6453bfdc01e0cebfeee62c7d5437b23ee96939f4af68d03f56c641857e81ffffffff49e4969800000000001976a91405807a55a537a82513d4556cb5a6666b590e6da988ace4969800000000001976a914294b6a51a685c5f025aa6e599c5c35a63d54aaca88ace4969800000000001976a91458c825d27bffee80a7d2e786d2765de881d7cf6388ace4969800000000001976a91426f764faec2e3578e497475de719e829748b957c88ace4969800000000001976a91442f1439a9de062504502013bdb9620e91554788288ace8e4f505000000001976a914c01aa46078410e93ac2c466d363a36572e795d1788ace4969800000000001976a914dd11c82def5d540d5fb5b60ff6bfa03b181bc0c288ace4969800000000001976a9147b0db16f3809b75ad052fd4f6c544b71ab27ab7188ac10f19a3b000000001976a91403cec867cb9dca1550cef46810d725445d2cfcaf88ace4969800000000001976a9146d91508d42354e73de48bd6a19e2616898994d7688ace8e4f505000000001976a9145e23a325005dbc722b69d7e45c9f9cd8e270800f88ace8e4f505000000001976a914d804b688d558e73257eacf96e6ac67cc8756e9d088ace4969800000000001976a9149ce69d05baaed49b73c6e05472d18d6ba0551dff88ace4969800000000001976a91493a5cffb7d4720a8cc3ce925016b6b6da3c0e4b388ace4969800000000001976a9147803cbc5e20ed36003f180b97838912de85cd67988ace4969800000000001976a9141aae2d33bd5c844baeafd0f7668755c64362f58c88ace4969800000000001976a914c50a37572303e2dbf34b65f8c3ccd7c924ae484588ac10f19a3b000000001976a914f0195d604b084a668b54a88670430816fa939da188ace4969800000000001976a9143188e961ecfa8954717855386e5185affaf6556d88ace8e4f505000000001976a9141ece55c324d814a0d1d3d6133efe6cd0564733d088ace4969800000000001976a914dbce204ebb3e3b9602233c61639fc59017093c9b88ace8e4f505000000001976a9144015435c0d7863b36bdb8436c1d038c16a5053c388ac10f19a3b000000001976a9145a0ae65f8402103aa3a61ac69c5a70917bfed35388ace4969800000000001976a914c0c92c3ce6baa361557cb6b0ad428d6feae5097b88ac10f19a3b000000001976a9140f8052471e8c77dd407cedcdf0bc7577726cedfb88ace8e4f505000000001976a9147cebf9ed9213984f08b7e20aaa3f01ad92dadcde88ace4969800000000001976a914f3c75f4aa71bfd50671470255f7010c6808147f988ace4969800000000001976a914f82bb05904faf7895c44f7dc81149740d78b0dbc88ace4969800000000001976a91480aa1bb0c02756406405dfd979410ac73f0c084288ac10f19a3b000000001976a9147613e5235764074819cb843696e5695e74ebed7688ac10f19a3b000000001976a9149bcb1a29975ad15d1ebb32dc392871f82880ff3788ace8e4f505000000001976a91462cac8c1f1eb59e4fec096170e6fdff2b736a8a788ace8e4f505000000001976a914dbc9874d290def6199121ba2bdce665d24dee90b88ace4969800000000001976a9142b41ea581630c1ff5bf1af10f7d1d9caf8ee1dbd88ac10f19a3b000000001976a9140bb9089e00d7fd230497faa65e3e4706127675f188ace8e4f505000000001976a9148ba381a0e7c316f65124d2c6fadf0a1963677c5788ace8e4f505000000001976a914119209ce1fbe619adf77dd88f2b7b4889231ce3888ace4969800000000001976a914e5f743066c7eee78a48379b1ec7065d7addcbff288ace4969800000000001976a914f4265d5ae2f74de6b383c73948f7ad99ae54fd7388ace4969800000000001976a9147a1947cb5fd37458186177dab2287e76b3b536ce88ace4969800000000001976a914c2a4bdaeead51604f47ce03fb7784726405b7daa88ace4969800000000001976a9143cec49f7e1f22c923e82f36c8e7cae2ac6d355d288ace8e4f505000000001976a914bcd1e8ea7a663c6e778f1df1febf99a65db7ddb388ace4969800000000001976a914caa2f58dd0ca3a5fd2ad20501e2c45189c0371b488ace4969800000000001976a914a4da72c8f7863de0bb724db4fd0c209b946c2c9988ace4969800000000001976a91420c40584dcca1e85f236fb894840fba98b1193e688ace4969800000000001976a914ca0887bc0850525f4e74221a2ad09ca0b758524888ace4969800000000001976a914d423c2493ffd29c40a9b66ce560237a96d98452788ace8e4f505000000001976a914c075f549165ebe13c78e7dbe276eac2a1f05e7dd88ace4969800000000001976a914a1d1af92bcadce895f1720fb93d84907e9beb8ce88ace4969800000000001976a9149faea5910f60c46cfcf7def52bd7bc3361397b7e88ace4969800000000001976a914bc88e01798cc32e518228f214e40a147bafc0e7988ace4969800000000001976a914bce9d5ff8e8182503832d405ebe0e73cefddfb9f88ace4969800000000001976a914e7eec50a08d50f8642bdb1f543bd3138ba2cb40288ace4969800000000001976a9144bea95f12e1b24c45b1ea2effbfcf048e7873c5988ace8e4f505000000001976a91419b33e4b66f0255e294d00132a31372afb87769388ac10f19a3b000000001976a9140b69c4eff5187f13d19be3036bc2b8d6c91fcc9f88ace4969800000000001976a9149a47a35d3048849d2c68ca1d7949dd761d55620d88ace4969800000000001976a9144e2f8ab9184be0c9133a2d12584dd6b45286678088ace4969800000000001976a9144e0e2ee5f071a7908fb00594d062fc78cf1b4ebe88ace4969800000000001976a9147861cff7e96cd9794752e08174e380c453e3078f88ace4969800000000001976a9144f4e4d31c55bc454d49a12853849fe59f2dd194388ace8e4f505000000001976a91407576148b25f413df00591c31f156cd25150cb2388ac10f19a3b000000001976a914f932a459fa0f76014a4b611d20e0c31c4b85839788ace4969800000000001976a914a5aaf1fc7109c59c1daf5e30c8c055b43591377c88ace4969800000000001976a9142e273b3fd047b980d40bb0846dcad030e2bb157f88ace8e4f505000000001976a91433ef614de2df9c3cf25a47afbbdb8b007acda2b888ace4969800000000001976a914e69820e3a9b2ff40be2281d6ad00ef691eb591fc88ace4969800000000001976a914cd4a99e5a227553fd2b98d43d6f4e3230eb6b63488ace4969800000000001976a91430c669db3d1eb4f44703c780145767a67a0303f488ace8e4f505000000001976a914e3f76b2197a348a26e65dd5c4fd63f581613171c88ace4969800000000001976a9141d67208c91b3567a995903e2d43df3a4ef6e506688ace8e4f505000000001976a9148ed7307323fb75bf03042a2172bd52a03f9041f288ac00000000";
var axecoreBlock = axecore.Block.fromBuffer(new Buffer(blockHex, 'hex'));
var node = {
log: sinon.stub(),
getBlock: sinon.stub().callsArgWith(1, null, axecoreBlock),
services: {
axed: {
getBlockHeader: sinon.stub().callsArgWith(1, null, blockIndexes['000000000008b8c4e86d070a78c978957ae7f0f127ff91aae6e4b0964c92d0b5']),
isMainChain: sinon.stub().returns(true),
height: 299999
}
}
};
var blocks = new BlockController({node: node});
var cb = function(err, res) {
should.exist(res);
var reward = res;
should(reward).eql('6.07737750');
done();
};
blocks.getBlockReward('000000000008b8c4e86d070a78c978957ae7f0f127ff91aae6e4b0964c92d0b5', cb); // should return reward for block 300000
});
it('reward for block 600000 should be correct', function(done) {
var blockHex = "03000000b4e6e868f14bbb83181eba3ae35469c2a47a8c59697ac5eafb250000000000009f5064bc15a41faa1542ebdb5f9d5bd98807552ffaedc2d6f261045c6d8cf2a89deb70585fdd001ba43b00280501000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4c03bf2709049deb705808fabe6d6d333633346330663831373530373766356d6dbefa085870eb1b040927be034cff01000000000000004ffffff2810000000d2f6e6f64655374726174756d2f00000000023805980b000000001976a9145569df50109cb001c7a5fba1e0dbd767ae2f5a7188ac3505980b000000001976a914c2d28f46e57a684421a9ca80a435588415102a0988ac0000000001000000046d5bf4aec8c669f2860e560a32634618eda74b483a31f00bf6bac2bece726a65000000006a4730440220010bac2a9700c669398907d60456f9741bc333c20b3a7a1564f820dcd83b023202203af850dda733e9f4e5545f3c0bd33bec113d741bc7eb1c424a789d636b4316a2012103a20a03d33115ce6e1629c0e6ace4cb7dac6af2bcfff6138af6933c58ed6387c5ffffffffc185041b341944e1ebe614169ff3d5795d07ce50f53e81a3b0ac6e5ade06aa82000000006a4730440220509f47d819ccbe88ba558c0eb83ce97a5d471d6c8847c6e5cd7b25db1923af1f02207286be70688eaef1b5027c68fa99717b253ddc36a057e0626ef550b9215169f00121028b13cf1966978ddaa91cae99f3b404091b160a60aa850500a2b1e86c49df07bafffffffff4007cea51cfc72a4a1143c3c73a4c66cf5fd021f7bafdf8c34930ba7946d7e9010000006a473044022058a31a6bdce095431dbddbc55b1754ff6c77cf257965f23e44edef7bb9e0720602202ce5e517150d018e7a28819e63c106f97e0958e42dae5d13b7bda8cf7de0ea2001210349a209258d9fd11f7d16e8bbe2e29e5426e90fb7903f05c14cf011de03fa5834ffffffff1c6ab0474df1180c5bad134831a03fa238e700d197902d3bdee8e0fa2ad45729000000006b483045022100c640dac4e39e5e97a098aef8ca0f83c013b91eb3c98e34573a7d1c1b4535370b0220634dcf9e73ca7697945a53feea1361d311e0a5a8fede6214e3ab52aa5ca9a4590121028b13cf1966978ddaa91cae99f3b404091b160a60aa850500a2b1e86c49df07baffffffff025b590f00000000001976a914a165a2776f8a472fb8d332be07e41521ab97156d88ac5b60d017000000001976a9145a09f90b02870515ad0065bd8eb6e717fb8c963888ac000000000100000002818565ce56113b3466b936b9a8d4bc1097afbb8ee919a000fabd905240efad7e010000006a47304402206a04d3aa60f887319e9cf7cf1a196f6001b386a2001f0965e9e7f7f868a1f6580220038baf2655900f830bf7f24a02a51467251984f728f24abb572f5093789ce01701210208cbf31eaab51b2393b00abf0f553a9e7174708ce4d368e560f65ed1d2fc6f3cffffffff780509166c5054c43ebd1e72c4f0d3ce562506fb20f274119211bf3d66ef397e010000006a47304402205c17d8412df0878f1e34c9b0d92b15c9c75aa391b3e60749d6924449911ffd880220792ab1fd54991c9a1ec6e3c477d94f22324682240ba060a689b45255c6c642600121022445fa7659cef564f92bb206d053f70430023cbce40a6399b70b23a39286a557ffffffff02e2275f00000000001976a914d4ecf63c88a5ca90612cea491da826305acc2dd988aca65afc05000000001976a9142159f2ff038bc3b2b4819fe81e7a4c7a9a2149d788ac000000000100000001413dd865945aa7d2d1035215e9ba3967d5fbcce0d69130ca830e921e48615b4e000000006a473044022038bc98fe75ec9c595e54c8bf154ee71d95d065b96d2889121dd160d2e857cd1702204546335bb8d81daf95081a1cde2dfe3b772f2b5fb518630002449a37aab4ce428121022ca24383508ca116313bb6bb6d9d904cc430d82c750ea9eab0f1413544970e14ffffffff0140420f00000000001976a914fb132787955b3da362ccf2574a5f0afad4f0f9b888ac00000000010000000285010877636076e4ed45acfb271b0e1001b8dbba0fe5ce3a66895c84a2d20c2e090000006b483045022100d018055686bcf95fa9362e173577da498e007cbd09f6ed600d083a2ffcaae99502202349e7252e11e335bdafb8ea0784a053f0f1b3ace8168a219d3502b9cf44b9660121037785407b8ac4507ebf6dfbf27126e035151718dc4d511b0269c0d8f2eb8506d5ffffffffb12206ecd84b6356dbb212f9a559587885414c6484a85894148bf54a2416d5ec030000006a47304402204b2b50dd4d180668a220baf5bd828560c44dfeb9b4383f56a4a8881593a2cbbf0220185e091d3bece026b73582d02800bd0350461480567199bb4b46afd54556317101210394c8dd37541b4f9bac1eae41da303d2fffc150d1f0141b98e9a3f58742f161a5ffffffff0200093d00000000001976a9141b71e2815a05c2b368107188ed960918be85d59f88acbeda1000000000001976a91416e710a6a840b4bdf4f820d5861f60d7973133a488ac00000000";
var axecoreBlock = axecore.Block.fromBuffer(new Buffer(blockHex, 'hex'));
var node = {
log: sinon.stub(),
getBlock: sinon.stub().callsArgWith(1, null, axecoreBlock),
services: {
axed: {
getBlockHeader: sinon.stub().callsArgWith(1, null, blockIndexes['000000000000c53bf17a98b9ee042d6d4c3faf37d7a9f5c1335cce6df896f2f4']),
isMainChain: sinon.stub().returns(true),
height: 599999
}
}
};
var blocks = new BlockController({node: node});
var cb = function(err, res) {
should.exist(res);
var reward = res;
should(reward).eql('3.88010204');
done();
};
blocks.getBlockReward('000000000000c53bf17a98b9ee042d6d4c3faf37d7a9f5c1335cce6df896f2f4', cb); // should return difficulty of block 100000
});
});
describe('#getHeaders', function(){
describe('/block-headers/:height route', function() {
var node = {
log: sinon.stub(),
services: {
axed: {
getBlockHeaders: function(blockIdentifier, callback, nbBlock) {
var result = [];
for(var i = 0; i<nbBlock; i++){
result.push(blockIndexes[blockIdentifier])
}
callback(null, result);
}
}
}
};
it('should give an array of 25 block headers', function() {
var blocks = new BlockController({node: node});
var insight = {
hash: '0000047d24635e347be3aaaeb66c26be94901a2f962feccd4f95090191f208c1',
chainWork: '0000000000000000000000000000000000000000000000000000000000200011',
prevHash: '00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c',
nextHash: '00000c6264fab4ba2d23990396f42a76aa4822f03cbc7634b79f4dfea36fccc2',
confirmations: 40493,
height: 1,
difficulty: 0.0002441371325370145
};
var req = {
params: {
blockIdentifier: "0000047d24635e347be3aaaeb66c26be94901a2f962feccd4f95090191f208c1"
}
};
var res = {
jsonp: function(data) {
data.should.have.property('headers');
data.headers.should.have.length(25);
should(data.headers[0]).eql(insight);
}
};
blocks.blockHeaders(req, res)
});
});
describe('/block-headers/:height/:nbOfBlock route', function() {
var node = {
log: sinon.stub(),
services: {
axed: {
getBlockHeaders: function(blockIdentifier, callback, nbBlock) {
var result = [];
for(var i = 0; i<nbBlock; i++){
result.push(blockIndexes[blockIdentifier])
}
callback(null, result);
}
}
}
};
it('should give an array of 50 block headers', function() {
var blocks = new BlockController({node: node});
var insight = {
hash: '0000047d24635e347be3aaaeb66c26be94901a2f962feccd4f95090191f208c1',
chainWork: '0000000000000000000000000000000000000000000000000000000000200011',
prevHash: '00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c',
nextHash: '00000c6264fab4ba2d23990396f42a76aa4822f03cbc7634b79f4dfea36fccc2',
confirmations: 40493,
height: 1,
difficulty: 0.0002441371325370145
};
var height = 533974;
var req = {
params: {
blockIdentifier: "0000047d24635e347be3aaaeb66c26be94901a2f962feccd4f95090191f208c1",
nbOfBlock:50
}
};
var res = {
jsonp: function(data) {
data.should.have.property('headers');
data.headers.should.have.length(50);
should(data.headers[0]).eql(insight);
}
};
blocks.blockHeaders(req, res);
});
});
});