diff --git a/bchain/coins/bch/bcashrpc_test.go b/bchain/coins/bch/bcashrpc_test.go new file mode 100644 index 00000000..6cd0f4e6 --- /dev/null +++ b/bchain/coins/bch/bcashrpc_test.go @@ -0,0 +1,334 @@ +package bch + +import ( + "blockbook/bchain" + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "reflect" + "testing" +) + +var rpcURL = flag.String("rpcURL", "http://blockbook-dev.corp:18031", "RPC URL of backend server") +var rpcUser = flag.String("rpcUser", "rpc", "RPC user of backend server") +var rpcPass = flag.String("rpcPass", "rpc", "RPC password of backend server") +var rpcClient *BCashRPC + +func getRPCConfig() string { + config := `{ + "coin_name": "Bcash", + "rpcURL": "%s", + "rpcUser": "%s", + "rpcPass": "%s", + "rpcTimeout": 25, + "parse": true + }` + + return fmt.Sprintf(config, *rpcURL, *rpcUser, *rpcPass) +} + +func getRPCClient() (*BCashRPC, error) { + if rpcClient == nil { + cfg := json.RawMessage(getRPCConfig()) + c, err := NewBCashRPC(cfg, nil) + if err != nil { + return nil, err + } + cli := c.(*BCashRPC) + cli.Parser, err = NewBCashParser(GetChainParams("main"), cli.ChainConfig) + if err != nil { + return nil, err + } + rpcClient = cli + } + return rpcClient, nil +} + +const blockHeight = 1239639 +const blockHash = "0000000075dd9708c23f5830de27c5d644983bb877c575c52926f19be7d80fe2" +const blockHex = "00000020fb79eebaff373687fdd612fd8ffb1717b866f7a7748cef7d6994198000000000bbaec06df359e98bd122726c9f178f4fdaa0fb59b3b86d18e465d53acc33bfda06941f5bffff001d7a6681650f01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0a0357ea12055374617368ffffffff0157966009000000001976a914014dc11b35cafe7605b4c1798a5b86efd788cff488ac0000000002000000014071f84a20eaeac1ba417ba63257087999a1c6401b94cdcf898079036aa00949000000006a4730440220600c88cf5f283d4b607253c1345e9d20bc4d67dc523070ad2f27f4ec337da44a02200f80a2dc8a0b501fb9c7fcb85851e05e83acbaf24b7a0cec5c1026c9cf004383412102e5e90f37c8a8f9ba15c3cce80f2f823bcc222063b7bc46e88ed7cd7d335d110afeffffff0200e1f5050000000017a914ac90ed8510c9a7445b104fd1602341dc2f890d1587795e27ea160000001976a91488f18e19e4a62fce9ab0db1cfb29cc22a058562588ac22ea12000200000001b2c673aede02a4054a8c23e456e581d684f47dadb54083317d6152949d55d94e010000006b483045022100f31a23984a44f485a570a102899e3a25cdf6d1234259e602dbe61f2c3e77e490022069a6a7b013452bd66ed3c11aba22a64559134cd1af3d283730a9b7fb33631cca412103cb05918b81d36c387c791d2accfaefead287a4a30427387fb1095fc0c363ef8efeffffff0200c2eb0b0000000017a914ac90ed8510c9a7445b104fd1602341dc2f890d15878906e1e1160000001976a9147f7ed17e71afc40beac9b8d0b0fb53731161339c88ac56ea1200020000000103365f2950d5d427beac98e2e5658cab90ce9b48350c62c5747dcb14d70f7602010000006b4830450221009acfe9bce502d2ad19d10c9278887f041e07a4f8277d1837733841ff6ea201cc022065a757b167b1b842211531b0b6ee891da19025e692dcb138add4738e8ad9524d412102a69b92783a38bc29c7f669818d922cf8566f41dbc8dd4992e72b69480a8766adfeffffff02b4b157fe160000001976a91414fba45042c5d32455a02e97f5e3c12874df267088ac00e1f505000000001976a9148c5d5ba49d1661f3c07261fe25ce6d849cd40d3c88ac56ea12000200000001768dcdaa8e733e9de87bd4762567e16e362746ff6752a393f5b62f9e1760209b000000006b483045022100df684fea9661ff797aa9e977d6b223e3cff4b661b1f49b61ae4590e48c0f1ebc0220635ebec87bd291b8263f0500797e2de573f94d7ee69dad63ce19add5abf273d5412103639049ceb22afb8c9070fe00562833a4e367c45c5c632daf75e81ea101cc6f2bfeffffff0298f7d3d1160000001976a914bbcd80aacaa6d8fe22bded7fec4746eb605dbf2388ac00e1f505000000001976a9146010d148212eabdec987af9568ed3c16bc8565c388ac56ea12000200000001e06d5b80b1dc384515b51accb247cfe74da3652c204758aeb48b9447e061d624000000006a47304402200252a79712e87e0212802e064dae51b0b93cc27642f6a521f84f522f9713f90702207234f37a4db14b0678d3301c67b7eaadde293394128c346c619aa2baeccfdf4b412103e8ec57f9d6f63d46ff1a83df3463048c5a1f77de7648da8d11d98347e79d260dfeffffff0230932c7f160000001976a91471707ab51d344b3996c4056a9f86659c8452592d88ac20bcbe00000000001976a914cd14f744df519aa04553b65c20a2fd0f7d653cc688ac56ea12000200000001d4d209bc5fb71b8d15a2a97846cec3cca73dc1d86ea66072a5478e59317017cc000000006a47304402207f6dbce56aa6548859bac719fb410859f366f190f63787b2a22339b1a1b338cf02204fee90094758a40e34726018a43b23e9789f1dcfc2da2515684d409c057818f741210372c26fba05c5bd542c1f8ff5bb2d2bebc26565bccd0731a4b6b7cd304eb50ca0feffffff028ecc1a4f160000001976a914e71a68a6fdf8badab6f8639dde10bdc436c4a40988ac00c2eb0b000000001976a914a28bc738fc7af8e0545edc40407cfb05077c60b888ac36ea120002000000013a047d9af4ecc4e7f8fdfded63af66f4e6a6e952f6ac95d905ea234b0a5152d3010000006a473044022028cd96dbaba2c72d36c3bdb5ec2ceff9520142ab045ddbd76732dd0a81147c1c0220394ab87587374ad48153def50abff43e410462456f04147a8b7af141274fa55c412102c01655518abdf62b4f6898d1ab9b90496cf97ee2ed9a4f949e695472fd45d1e0feffffff02ffad805f150000001976a9148c0c65371147f8f7e63e3ff1319be62a554dca9988ac00c2eb0b000000001976a9148c5d5ba49d1661f3c07261fe25ce6d849cd40d3c88ac56ea12000200000001ba548aa7f7d4342e4ba8ba4d0657b06778fb77d1258240be8f42f9f0415da359010000006b483045022100a42c83bf0bb95adc29f63b4c4d4831c0cbf8bb44f2a836db227be6f0208b2a550220746f3a9da3cec8308ff8f1907cdbd7b3d1c7462db5a54abfe68d207ffa159d53412103653ece38ad97d96f6782d5f8ea83a0bb861f69f4bad444c6bfbcac449666e7b4feffffff0240787d01000000001976a914cd14f744df519aa04553b65c20a2fd0f7d653cc688ac9a107ef2120000001976a914b3e12112e6c3614ecd980b76e519ce9c3deaa0f488ac56ea12000200000001b4ac666e5203231dd64a46b34cfd011a5936db53255660eaaae556db6289bb4601000000fdfd00004730440220632ccac4e480f6b911e298ed5e609db9d72c6eda9efa387cb26b5e9ef700163a02203edc214365c311dd7d19569360df806794eb9c2274469105b2bf338f7143a58141483045022100ca577f10fbfd29bca371c557bad428b01ae77f7914db285b61c0b499c5ff4b3d022001767845813496ded9b80a21b60b622219e0a08f3a92df0805047a8f3f12ca3b414c69522103472fe9fd7e726102894e84437e837b95f21913fd84804052228de77eae2a07bb2103203cab654b45e67c748e5adc91070fb5a166ff51378949d256808476c8e96bb021029fd0b61c762122b1a7e7c2f1fce53e6be52a0d486ec000635e757696a75120ca53aeffffffff01d6b02d00000000001976a91409fed3e08e624b23dbbacc77f7b2a39998351a6888ac000000000100000001074065abfdb5251f7fbb04c8a2700c1d1a497d07af8f0fff048535483418cd34010000006b483045022100eef073308d9a2e3031f2ae18511ffbe4ea84174036c7716b540c57b55268ee1d0220433acc4c47adeb89f3fd64163b22e61e3379f99fb75aa053c01ac020504fb864412103579c40a982ea207d7c8e99a4ad401ab17db47d8a24f2c63cc82a328a5d23d63bffffffff029c040200000000001976a914fad6c38dca5b36b443c2cc49389c3e1c7556354488acfdc40200000000001976a914b7e34815d2d9fc710cb603873f8c21b66033917588ac000000000100000001a37a930deb7dc18970d56be44165b8f58ffdad9c02519f261a8f5d8e311235de010000006a47304402203acfa68bfb3125cac57cb1b8e6483ef9ac901889cfc3da04893549ed8c1ddee102203b1d702161d9266707e4f9a026c84afd144d5fe28dfe5f2026ab2abc317b717a4121031872714bba791e1f80a604ec0fb170c6bb0110c509cbd35c7e92568f47a922b3ffffffff0280969800000000001976a914a8a6a3ed17b4a75bf8045fa9921771cb51bc948b88ac007e5603000000001976a9143769137f82fb4d8d1f8cb3c799f26139760d09ff88ac0000000001000000013ad31893160296f0a24fbbddb2f1f1bc5a6cec247158d1fe37c95289b22c480b000000006a4730440220364e2f5cdbd70453df3218532039acd2b6954b40db565f4657c8b4a4062e08f00220240022d4e2129e8847c835b1d61047a527b9c8d477020bbe9c5cfdc661e8b21d412102b3691c3d09206dd5a3fd9b97fc87904b859ad3c63d67c1751d45135e5f4ae434ffffffff01561d0f00000000001976a91498a7c0c7781de807e59185c540032744eb4b7f2d88ac000000000200000001f7e703143b521d0bf653e07a1a28f5b0cb84a7dd797e5b66183e50e5aebc5bb4010000006a473044022024ececc22b6a47bac0c5cfca8008b9ba5de49c6424f3ebfa236696f38e6d6bf9022069cb594fa8be28fa35128c2c05c96408da27165d7dcc0ef776cc838b858fed45412102b46e6d35aeae03348578220d21cb182e36599fa393a3150886c37ec16a10c58cfeffffff0240420f00000000001976a914f43c36964b237d6bc8e3165c551980059bdd75e888ac40f82200000000001976a914384b7137cc464a632961c74bd077e0ec5fb44a1888ac56ea12000200000008349c1ef994e931d4da1f545d2e578f898ddf457392c5485dc75378de8f36bef4010000006a4730440220351f1566e3ef02e900942103c60cba5a768cd710d3d1afbc75406099ad2d9e4702206e0f639a9991c7afb2136fb2e437629103ad0989898d1c90078ded5f08f5cb3341210303ae341929bdb242226a9a8c15cdbed5b89fa286842714d8be7e3f16c63abe11feffffff4ae685c8efc7f090e75b80f1b705d7bf5fa6dbbcf88c5f5cf2dc0678a9646fb4000000006b483045022100b8dae1825b0d0ccbe212e8da6767ea049bad9acfc737e5c5ef3dc5eeef6d313c02207e4c669956f871a4a5f71903bf38a8c587b81940943682364b11fb1cd9c078d7412103c9bd0064d2759628c1f6e5ad9d6345a5bce64dc4f4bb0675162f77acd557e4e2feffffff1ac21ded05387165cb7d0d95e2036a82f79a314575f065407e0c32a6b24b2f1d010000006b483045022100ef4a9469a5b3dbc0f03e8d8c5f254ad86f2c1e92e75a5ee737c3b3186b5edd95022076abcdfa976c3c78d2b196fb79699057248fad6d3d5e782524b85d84704394cc412103882df93f092501520bb36206703dadb65b25a3fbd0323c690dc8e72f5ee4a770feffffffea6905abb313a2aa3f6c8a056294abe06774dbf75688b03b96b8a2132aaf0cbf010000006b483045022100e4ab9dd0a75bc76c6c2cf549fb37c5577bad7f58953a7103abe4a77a95b873c10220545aa0c2b2869d444fb99d237549d6ac270c711d60788a6463ef4fee63ebd8fc4121031adea1da6e87b0771ea8c2a4723127d8cc9328b0594d159570ebe97b1e021c9efeffffff8c9a7a668dad3766f953d9779861f9c007b0a06f6ea2afbf8ab30137f34300fa000000006a47304402207253f724d891f5e1e66ec0c8084ade910a52257a1257933c23bd1b4da862e33a0220363df96e31dffa0a599b56c5049519a4d8ed34e96dc1fefecfd2bc31fc6d79d9412103186a4fc8445b3b437587c71f00fc9da7a267c0a38915fcf567528e310a73c0bdfeffffff82445d5b10b84b5256ef028615465e2d139c45584884c06e68bc38930d826e72010000006a47304402204846adc41599336307a087d4fa779a059ffe12c69456c82fa4b03942c901284002203e5f0c5e72b9ded7f48b4d22cbdb39390bea33003d46d8b4652c8ede1f13b3e54121031adea1da6e87b0771ea8c2a4723127d8cc9328b0594d159570ebe97b1e021c9efeffffffb8816c2c3b95aa8126f6d2d04798632b3167e6e2144d5f4e84cfb29e9d6f442d010000006a473044022078b1aff9a4ed3452f782db38341d846edd295f9a907c7373519408fb33eeb3240220578da5e91ec0c82604982b09cbd1f44e28260fcd640bcc55f086ce296ef32ef7412103c9bd0064d2759628c1f6e5ad9d6345a5bce64dc4f4bb0675162f77acd557e4e2feffffff70628ac9b2814f99fe4cd5f67a76047af533774ae90331fa8cb68e4dcbff1cb0010000006b483045022100cd88592589ab3bbd6e23920770a067a37ffbff3a31238167731377f11903676202202cb1c019365870dad3113abb3b0bc68ab9e65d9d60592f3315ffa444dfd88be741210393bd44ad6ed9295bf408e01bcdbdf6e4e8fd4a573ad20f37e54ff6e9b1596028feffffff027f766c02000000001976a9149f96c6e6c3aabf438eef5c589c47fa4b4f96592a88ac1c3d0f00000000001976a914e2ffd7cf2fe9468512878196d1b48fee9e9d003288ac56ea1200" + +var blockTxs = []string{ + "f12d490ad439ff37c91e9ec5ecd5440c2d4a96653f2668402c5ebacc6d07dcf8", + "0e78e3276bd59dd403306334ab05b2d58167b4cf04dbb94ae76dc189db5bf3df", + "9eeba85181725993afc6a89e2e98c07e12bbd9c732b851af448eb6055d8d8ba7", + "045f898538c5b9a99a4bf21c8e06aa7279caacdf7616994b7d4f0ed39637dff7", + "8614ae1addce0983f8b1bb2e6139fca4e7aa2d4f57f28ce1145bd1103c75a307", + "1d10b63e6d336b19ce7f7a867639b52b42be7e63ea53a86e5c7b101eb8f5bf59", + "1cbb193374d455ad09f1ae4486418dbbd65435ac14b1b8733897976bd776478b", + "722d99abace73265477b42849c86f9a8460a07aef7497187db24cffb4b27c856", + "a856b35655852ec5d698561633f997b945ee03d57a7b60e3c86eaabdd3a90054", + "e82cdbb67f6c23c72d0273bdd976697d5bfc4b2373e637f4eeb5211134b84bd6", + "efd3295c37cd3988f16efc09d083dbbc27f5c0074b9ea0dffd4f8540b36dd02c", + "b955bc3e800aa6d72c1a9eb9ce4a513f409ec923c31e30075f58336c830040a8", + "9730ec3e10e5a3bf358e533a497e75f44aceaf28da8248534326e5d7dac0d048", + "a90df75c045e638a0c00902d35c9c72592d0e76ac0fa34fba6aad749c5aded21", + "0e21dd654596cac9f579e21a549a533d1be7319470fcf8f920a35d64cf020d1f", +} + +var txDetails map[string]*bchain.Tx + +func init() { + var ( + addr1, addr2, addr3, addr4 bchain.Address + err error + ) + addr1, err = newBCashAddress("bchtest:pzkfpmv9zry6w3zmzp8azcprg8wzlzgdz5rta4dd0e", CashAddr) + if err == nil { + addr2, err = newBCashAddress("bchtest:qplha5t7wxhugzl2exudpv8m2de3zcfnnsaswsdmkt", CashAddr) + } + if err == nil { + addr3, err = newBCashAddress("bchtest:qz0ed3hxcw4t7suwaaw938z8lf95l9je9gg4grt7yx", CashAddr) + } + if err == nil { + addr4, err = newBCashAddress("bchtest:qr30l4709l55dpgjs7qed5d53lhfa8gqxgds6vr54u", CashAddr) + } + if err != nil { + panic(err) + } + + txDetails = map[string]*bchain.Tx{ + "9eeba85181725993afc6a89e2e98c07e12bbd9c732b851af448eb6055d8d8ba7": &bchain.Tx{ + Hex: "0200000001b2c673aede02a4054a8c23e456e581d684f47dadb54083317d6152949d55d94e010000006b483045022100f31a23984a44f485a570a102899e3a25cdf6d1234259e602dbe61f2c3e77e490022069a6a7b013452bd66ed3c11aba22a64559134cd1af3d283730a9b7fb33631cca412103cb05918b81d36c387c791d2accfaefead287a4a30427387fb1095fc0c363ef8efeffffff0200c2eb0b0000000017a914ac90ed8510c9a7445b104fd1602341dc2f890d15878906e1e1160000001976a9147f7ed17e71afc40beac9b8d0b0fb53731161339c88ac56ea1200", + Blocktime: 1528796166, + Time: 1528796166, + Txid: "9eeba85181725993afc6a89e2e98c07e12bbd9c732b851af448eb6055d8d8ba7", + LockTime: 1239638, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "483045022100f31a23984a44f485a570a102899e3a25cdf6d1234259e602dbe61f2c3e77e490022069a6a7b013452bd66ed3c11aba22a64559134cd1af3d283730a9b7fb33631cca412103cb05918b81d36c387c791d2accfaefead287a4a30427387fb1095fc0c363ef8e", + }, + Txid: "4ed9559d9452617d318340b5ad7df484d681e556e4238c4a05a402deae73c6b2", + Vout: 1, + Sequence: 4294967294, + }, + }, + Vout: []bchain.Vout{ + { + Value: 2.0, + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "a914ac90ed8510c9a7445b104fd1602341dc2f890d1587", + Addresses: []string{ + "bchtest:pzkfpmv9zry6w3zmzp8azcprg8wzlzgdz5rta4dd0e", + }, + }, + Address: addr1, + }, + { + Value: 982.78901385, + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a9147f7ed17e71afc40beac9b8d0b0fb53731161339c88ac", + Addresses: []string{ + "bchtest:qplha5t7wxhugzl2exudpv8m2de3zcfnnsaswsdmkt", + }, + }, + Address: addr2, + }, + }, + }, + "0e21dd654596cac9f579e21a549a533d1be7319470fcf8f920a35d64cf020d1f": &bchain.Tx{ + Hex: "0200000008349c1ef994e931d4da1f545d2e578f898ddf457392c5485dc75378de8f36bef4010000006a4730440220351f1566e3ef02e900942103c60cba5a768cd710d3d1afbc75406099ad2d9e4702206e0f639a9991c7afb2136fb2e437629103ad0989898d1c90078ded5f08f5cb3341210303ae341929bdb242226a9a8c15cdbed5b89fa286842714d8be7e3f16c63abe11feffffff4ae685c8efc7f090e75b80f1b705d7bf5fa6dbbcf88c5f5cf2dc0678a9646fb4000000006b483045022100b8dae1825b0d0ccbe212e8da6767ea049bad9acfc737e5c5ef3dc5eeef6d313c02207e4c669956f871a4a5f71903bf38a8c587b81940943682364b11fb1cd9c078d7412103c9bd0064d2759628c1f6e5ad9d6345a5bce64dc4f4bb0675162f77acd557e4e2feffffff1ac21ded05387165cb7d0d95e2036a82f79a314575f065407e0c32a6b24b2f1d010000006b483045022100ef4a9469a5b3dbc0f03e8d8c5f254ad86f2c1e92e75a5ee737c3b3186b5edd95022076abcdfa976c3c78d2b196fb79699057248fad6d3d5e782524b85d84704394cc412103882df93f092501520bb36206703dadb65b25a3fbd0323c690dc8e72f5ee4a770feffffffea6905abb313a2aa3f6c8a056294abe06774dbf75688b03b96b8a2132aaf0cbf010000006b483045022100e4ab9dd0a75bc76c6c2cf549fb37c5577bad7f58953a7103abe4a77a95b873c10220545aa0c2b2869d444fb99d237549d6ac270c711d60788a6463ef4fee63ebd8fc4121031adea1da6e87b0771ea8c2a4723127d8cc9328b0594d159570ebe97b1e021c9efeffffff8c9a7a668dad3766f953d9779861f9c007b0a06f6ea2afbf8ab30137f34300fa000000006a47304402207253f724d891f5e1e66ec0c8084ade910a52257a1257933c23bd1b4da862e33a0220363df96e31dffa0a599b56c5049519a4d8ed34e96dc1fefecfd2bc31fc6d79d9412103186a4fc8445b3b437587c71f00fc9da7a267c0a38915fcf567528e310a73c0bdfeffffff82445d5b10b84b5256ef028615465e2d139c45584884c06e68bc38930d826e72010000006a47304402204846adc41599336307a087d4fa779a059ffe12c69456c82fa4b03942c901284002203e5f0c5e72b9ded7f48b4d22cbdb39390bea33003d46d8b4652c8ede1f13b3e54121031adea1da6e87b0771ea8c2a4723127d8cc9328b0594d159570ebe97b1e021c9efeffffffb8816c2c3b95aa8126f6d2d04798632b3167e6e2144d5f4e84cfb29e9d6f442d010000006a473044022078b1aff9a4ed3452f782db38341d846edd295f9a907c7373519408fb33eeb3240220578da5e91ec0c82604982b09cbd1f44e28260fcd640bcc55f086ce296ef32ef7412103c9bd0064d2759628c1f6e5ad9d6345a5bce64dc4f4bb0675162f77acd557e4e2feffffff70628ac9b2814f99fe4cd5f67a76047af533774ae90331fa8cb68e4dcbff1cb0010000006b483045022100cd88592589ab3bbd6e23920770a067a37ffbff3a31238167731377f11903676202202cb1c019365870dad3113abb3b0bc68ab9e65d9d60592f3315ffa444dfd88be741210393bd44ad6ed9295bf408e01bcdbdf6e4e8fd4a573ad20f37e54ff6e9b1596028feffffff027f766c02000000001976a9149f96c6e6c3aabf438eef5c589c47fa4b4f96592a88ac1c3d0f00000000001976a914e2ffd7cf2fe9468512878196d1b48fee9e9d003288ac56ea1200", + Blocktime: 1528796166, + Time: 1528796166, + Txid: "0e21dd654596cac9f579e21a549a533d1be7319470fcf8f920a35d64cf020d1f", + LockTime: 1239638, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "4730440220351f1566e3ef02e900942103c60cba5a768cd710d3d1afbc75406099ad2d9e4702206e0f639a9991c7afb2136fb2e437629103ad0989898d1c90078ded5f08f5cb3341210303ae341929bdb242226a9a8c15cdbed5b89fa286842714d8be7e3f16c63abe11", + }, + Txid: "f4be368fde7853c75d48c5927345df8d898f572e5d541fdad431e994f91e9c34", + Vout: 1, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "483045022100b8dae1825b0d0ccbe212e8da6767ea049bad9acfc737e5c5ef3dc5eeef6d313c02207e4c669956f871a4a5f71903bf38a8c587b81940943682364b11fb1cd9c078d7412103c9bd0064d2759628c1f6e5ad9d6345a5bce64dc4f4bb0675162f77acd557e4e2", + }, + Txid: "b46f64a97806dcf25c5f8cf8bcdba65fbfd705b7f1805be790f0c7efc885e64a", + Vout: 0, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "483045022100ef4a9469a5b3dbc0f03e8d8c5f254ad86f2c1e92e75a5ee737c3b3186b5edd95022076abcdfa976c3c78d2b196fb79699057248fad6d3d5e782524b85d84704394cc412103882df93f092501520bb36206703dadb65b25a3fbd0323c690dc8e72f5ee4a770", + }, + Txid: "1d2f4bb2a6320c7e4065f07545319af7826a03e2950d7dcb65713805ed1dc21a", + Vout: 1, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "483045022100e4ab9dd0a75bc76c6c2cf549fb37c5577bad7f58953a7103abe4a77a95b873c10220545aa0c2b2869d444fb99d237549d6ac270c711d60788a6463ef4fee63ebd8fc4121031adea1da6e87b0771ea8c2a4723127d8cc9328b0594d159570ebe97b1e021c9e", + }, + Txid: "bf0caf2a13a2b8963bb08856f7db7467e0ab9462058a6c3faaa213b3ab0569ea", + Vout: 1, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "47304402207253f724d891f5e1e66ec0c8084ade910a52257a1257933c23bd1b4da862e33a0220363df96e31dffa0a599b56c5049519a4d8ed34e96dc1fefecfd2bc31fc6d79d9412103186a4fc8445b3b437587c71f00fc9da7a267c0a38915fcf567528e310a73c0bd", + }, + Txid: "fa0043f33701b38abfafa26e6fa0b007c0f9619877d953f96637ad8d667a9a8c", + Vout: 0, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "47304402204846adc41599336307a087d4fa779a059ffe12c69456c82fa4b03942c901284002203e5f0c5e72b9ded7f48b4d22cbdb39390bea33003d46d8b4652c8ede1f13b3e54121031adea1da6e87b0771ea8c2a4723127d8cc9328b0594d159570ebe97b1e021c9e", + }, + Txid: "726e820d9338bc686ec0844858459c132d5e46158602ef56524bb8105b5d4482", + Vout: 1, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "473044022078b1aff9a4ed3452f782db38341d846edd295f9a907c7373519408fb33eeb3240220578da5e91ec0c82604982b09cbd1f44e28260fcd640bcc55f086ce296ef32ef7412103c9bd0064d2759628c1f6e5ad9d6345a5bce64dc4f4bb0675162f77acd557e4e2", + }, + Txid: "2d446f9d9eb2cf844e5f4d14e2e667312b639847d0d2f62681aa953b2c6c81b8", + Vout: 1, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "483045022100cd88592589ab3bbd6e23920770a067a37ffbff3a31238167731377f11903676202202cb1c019365870dad3113abb3b0bc68ab9e65d9d60592f3315ffa444dfd88be741210393bd44ad6ed9295bf408e01bcdbdf6e4e8fd4a573ad20f37e54ff6e9b1596028", + }, + Txid: "b01cffcb4d8eb68cfa3103e94a7733f57a04767af6d54cfe994f81b2c98a6270", + Vout: 1, + Sequence: 4294967294, + }, + }, + Vout: []bchain.Vout{ + { + Value: 0.40662655, + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a9149f96c6e6c3aabf438eef5c589c47fa4b4f96592a88ac", + Addresses: []string{ + "bchtest:qz0ed3hxcw4t7suwaaw938z8lf95l9je9gg4grt7yx", + }, + }, + Address: addr3, + }, + { + Value: 0.00998684, + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914e2ffd7cf2fe9468512878196d1b48fee9e9d003288ac", + Addresses: []string{ + "bchtest:qr30l4709l55dpgjs7qed5d53lhfa8gqxgds6vr54u", + }, + }, + Address: addr4, + }, + }, + }, + } +} + +func TestRPC_GetBlockHash(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + hash, err := cli.GetBlockHash(blockHeight) + if err != nil { + t.Error(err) + return + } + + if hash != blockHash { + t.Errorf("GetBlockHash() got %q, want %q", hash, blockHash) + } +} + +func TestRPC_GetBlockRaw(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + d, err := cli.GetBlockRaw(blockHash) + if err != nil { + t.Error(err) + return + } + + blk := hex.EncodeToString(d) + + if blk != blockHex { + t.Errorf("GetBlockRaw() got %q, want %q", blk, blockHex) + } +} + +func TestRPC_GetBlock(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + blk, err := cli.GetBlock(blockHash, 0) + if err != nil { + t.Error(err) + return + } + + if len(blk.Txs) != len(blockTxs) { + t.Errorf("GetBlock() number of transactions: got %d, want %d", len(blk.Txs), len(blockTxs)) + } + + for ti, tx := range blk.Txs { + if tx.Txid != blockTxs[ti] { + t.Errorf("GetBlock() transaction %d: got %s, want %s", ti, tx.Txid, blockTxs[ti]) + } + } + +} + +func TestRPC_GetTransaction(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + for txid, want := range txDetails { + got, err := cli.GetTransaction(txid) + if err != nil { + t.Error(err) + return + } + + // Confirmations is variable field, we just check if is set and reset it + if got.Confirmations > 0 { + got.Confirmations = 0 + } else { + t.Errorf("GetTransaction() has empty Confirmations field") + continue + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("GetTransaction() got %v, want %v", got, want) + } + } +} diff --git a/bchain/coins/btc/bitcoinrpc_test.go b/bchain/coins/btc/bitcoinrpc_test.go new file mode 100644 index 00000000..6b703944 --- /dev/null +++ b/bchain/coins/btc/bitcoinrpc_test.go @@ -0,0 +1,312 @@ +package btc + +import ( + "blockbook/bchain" + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "reflect" + "testing" +) + +var rpcURL = flag.String("rpcURL", "http://blockbook-dev.corp:18030", "RPC URL of backend server") +var rpcUser = flag.String("rpcUser", "rpc", "RPC user of backend server") +var rpcPass = flag.String("rpcPass", "rpc", "RPC password of backend server") +var rpcClient *BitcoinRPC + +func getRPCConfig() string { + config := `{ + "coin_name": "Bitcoin", + "rpcURL": "%s", + "rpcUser": "%s", + "rpcPass": "%s", + "rpcTimeout": 25, + "parse": true + }` + + return fmt.Sprintf(config, *rpcURL, *rpcUser, *rpcPass) +} + +func getRPCClient() (*BitcoinRPC, error) { + if rpcClient == nil { + cfg := json.RawMessage(getRPCConfig()) + c, err := NewBitcoinRPC(cfg, nil) + if err != nil { + return nil, err + } + cli := c.(*BitcoinRPC) + cli.Parser = NewBitcoinParser(GetChainParams("main"), cli.ChainConfig) + if err != nil { + return nil, err + } + rpcClient = cli + } + return rpcClient, nil +} + +const blockHeight = 1325168 +const blockHash = "000000000000004ed0834f3de922e66d024ec4da9fcc2da17be61369cb6dc041" +const blockHex = "00000020624870e3ea6036a9a6e52a8eeaf8e0ff03e4eaee2b72469932000000000000008c585ae9e2acab0020e2440caaf9f73e7c8060d3bd689c646b5a919208d99058aa751f5b00ec5a19231e565d21010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff200370381404aa751f5b084000000df7684a000d2f6e6f64655374726174756d2f00000000020000000000000000266a24aa21a9edcd297ed00be6d425c1b41e459bcfd25fd75a9c2ad8925e35f78dcda0ef4d5e01e10ebe04000000001976a9143d27951af09911d3f49f0211f78c894b66866d2788ac0120000000000000000000000000000000000000000000000000000000000000000000000000010000000001019d30178fe7557de700fb002bfd1cfb10b325be057ff46aeefe710f3b19292cf00100000017160014ff9e86fefd867d091ca4d5750998040bbf33107effffffff02c03b47030000000017a9148ebfcc7875903512f703362726cf55472e21dad687f4ea880a0100000017a9149da77b5b6e81f202a07e3ea00582e3046b26c8488702473044022055ebeb662dd15d3205c334b95d9d577a966b5ba2cc52f25cf3c61929193412950220279d2a50ac872803d4741c3bbcbd204fce2458cfed5841368bafbf22966d5e8e012103cd75ac2da3c97389a4422d7480cfe637fd1c5ce19a5f4df7b2931bafeb573d100000000001000000000101fe098f0844bba5202ce15a804123aa8fc52589080cd22a5a0ac4169ed92df75c01000000171600147b8404baf3b3d1416e71d5ecda84cf0c7e79ad30ffffffff02c03b47030000000017a9140853f99f8cbfead897e5d3834e036495386acd3d87b96c04fd0000000017a914647507f0caedaed6df36757ad28d170f29b95fe58702483045022100bde094da370bb2aeb191fa397570fbb2b26dde09d36e757a0a1df877c67fbeb4022007dc1e0b43448a89cbb919c90e7d036ab8e4e11d3b8affb53c88358cb8bf081c012103d24b1ddc91d69d08c2089e97b0202d134a799ab4aae3251d81e420f776f547b00000000001000000000101a687153d9a4519971077f6bb7088325b197c58d9f95c742512b5a7b8559609530100000017160014c62bbe3e5d4def22263450229f43d9a61339115cffffffff02391a0000000000001976a91441d8f7a941dca4c34e00d50ca6be574d642a3ad488acd017aa0e0100000017a914e36b5a4e4df8b8f9a10cce386447b5e671ead6e38702473044022016b0eff1ae82ed2c5a32fb1335f22fd51d60b0392bdb063a3d506a88de5292bf022024bc55ffa619bd0c5a36b6c69913dab4d1b34f2e5aa8fa548e0d564619770e0c0121039fddd73578117cd57f0b99bddf39dc94f265219dee040372942ebe964aa36ef30000000001000000000101b1922f0cab9698947e436d20bbecb8a15fdbdba7b8e2ad6a25be5ab78b9b1b7301000000171600148365fcacd3199e0cd70d98dc1e9ad7c0b5d279eeffffffff0280a4bf07000000001976a914bc7d3a15afb9a04b13efdf024b83442e7e07f3f488ac7afcd6030100000017a914743c3e586bb3b631464d20e01860f297c085f7348702483045022100d4a4088ea1096da3f95305616245fdd64b6ad3400d21480501b5fc444245cabe02205ce8abe30c4b45c0f25a1ac9975ae6eaef98b6c45c2450a3cf8858389993faf2012102a8cae4050b0b8301599ef4b6948ee813f07f758a3a0965a6af1f862e81a6df540000000001000000000101ce4fabd36456f17417e2068419183f2650379839618458aa2322e047286ffc580100000017160014eb101fb798eca9333ccc0b6984d1054abdd60002ffffffff0240d2df03000000001976a914abba3808b854c70b63ff038fcddfbafcb707713988ac8fb855090100000017a914c79fb05db54493d0e3ede7e1b6d710b042b3459f8702483045022100d55b3174cf031a409fad139ada8486005bdbce2ae425a67aec3a41a8a18f8d26022012b116f82985e382a1e8f5a766b38d531a4d8682202ae5c055aae4cc4a94b4a00121038f4d77101c53039712b4450117624d2d9310d1843185f647bc8628ec2fa64b9000000000010000000001012e6d38e1cf684d537dad988362159f03de685d6c3dd7479d468ab9066f6395d601000000171600140afef30070c9befac220f898be117e33c44d3789ffffffff0224fd3d00000000001976a914abba3808b854c70b63ff038fcddfbafcb707713988ac20b905140100000017a914a698131430776e0bd219832919fc85e2df6dd9d987024830450221009fb50e10f85ad349e4648fe71973815b9183f1a6b808ab3873d0307a2bd71b6c02206f80e7c431e6b3dc35848f7fe366a8a2f5dda1a9846e28fd5a88241b67ffd8800121032282b3b5a8077b73c3e2ee159810f021505c0ff3ba218b91047086fa873da99200000000010000000001015e8bd40d2153a20725dc5eb12cfde24e282e0e1bfbec66106eb255c064a13d02010000001716001433a8c4e5e52900b2fc57ebcd03ea34c3e28d6814ffffffff0220e9ef01000000001976a914abba3808b854c70b63ff038fcddfbafcb707713988ac6e7f200e0100000017a9143618c14d1aa2bb46bee0a59c377bc552d027cb3e870247304402203da945cc37c79ce5eec1d75adc0567473a12c2686663f8e832314100ad997492022017a7458b5b2c06dda4a5cece75e861aece1ecc55080e6f8043b606d9e592a94c012102584027b3b9ff3e64cd57baf50da0957c34336def87b98f61665dfe6d45705e420000000001000000000101fe304cca760fe189d79a8e5e311830d017bc8812161b9d24283c297a1ebbdbbe0100000017160014bce31ed63169644d9a227edd85d3405455001a99ffffffff0248fa7b00000000001976a914abba3808b854c70b63ff038fcddfbafcb707713988ac91af6f020100000017a914808b2cc1237ea31e19c60dba6e46c5d2bb6fa3bb8702473044022034732925a5c01e22cee03a544bd5fbe8d05a7be08e829a457872d1855377c186022012c7145f93af3553a524a30356b7d5a900a1c0c0ad6d14519f82a9febf8c1b24012102b53ad54b9b9e192bed46c24da6a8906cb176c5ad3679e12ce351317e55e81a40000000000100000000010123c6bdad841a097b93ccfa302330b4c70309c2a122847d62d3b4bfe3772601bc01000000171600149b71a55c68f56bf1bbe05910350808a9227d3411ffffffff0290f4f700000000001976a914e0365f8cf2319332778ec3cce6dc492a00b1856e88ac92449cff0000000017a914bce9a8c401614a26e8a85bd669239e076530712a870247304402201cfc6353c6f19d6df56c98f2068c9a948efa13b63958649a56313744c70de5a402206521a961ca5416df75422a48776be0eb38d6d1046897457a75d16047de1c4c38012103dab9885a7269b971886e819021f27dd2a4dcbcd0187d62bbbe38476cb444eb35000000000200000001ce48fcdbfc566ea622aa2da336657acceccf54f1d9ca7c79028b86cdd7caa283000000006a47304402204291e9e39a4867a430a65493a011ceb5cf2d26bc46a046e2ffb87cd0a386a88502201483f622a50b6ff4c72ace2ad0d2e22cd31ab0dde78e2eeb2f6190e42484f8c901210321bac8d9a7e4864cce64ddbef48f288e4211fca13831e7a12602c0539e98ea3afeffffff028a8b72030000000017a914c6953688a93ef58e65730492188115627ae0137287abc6e556260000001976a914e4fce41cd713b9ef2c5bedf1bb9927a22860b26088ac6f3814000200000001b4b685356ab5552f5cf2e7e92cc2c16a4618ed12d1f0887e4e4af6d428edf0ab000000006b483045022100c76cf3081c04eecbfd569c1859ad6dd0a5fec8b8ff6019be1c95a2aafcba000a02203649c3aaa7a478b9d530bb101d6a62322e6a18857e7e295d24b612c41fc2b8560121032aaec129afa2e84e9c7b4bebbc01ac95685c5d3c8e01a4e29df765476369115cfeffffff021c1dfb070000000017a914c695362d23fe7b1185504314afca7eae585e134a8794acda68000000001976a914a1bb4528486172f1cbdc67b234c81eb73232a4f888ac6f38140001000000000102ede32062d23747785d356984dc67c14c8ff75bb04d90ae47dd7bb5d5b8f9417d00000000171600147edbcdda98080eeb6e8a63c63da135498295c3cdffffffffb1c1e45760312e8a3852db2040d55ddcfca8574e399f91b788302c426ed24b97010000001716001464acbc88e62af1e51e3c31ad94433947f34b9cbeffffffff0280a4bf07000000001976a914abba3808b854c70b63ff038fcddfbafcb707713988aca4717efc0000000017a914fbda2c7bb5843b6e65b3ad246938df982891700987024830450221009019de71babe335456ed9336dddd0ec16dd0bd5f5c90a868a640e99f5d3ca98902202c60f4e83348ed8c19dfd4a92eeab2589e47945e3dca047890d40309ee3bb059012102b45e239d96f8504ae45a32af7c80f6164f7b9658166e318521ee822192fee3ef024730440220210c71905180fde5f9ae88a31326db690f96b2c5daf8fff5570ac298dee0a689022041f5f18dc6f364eb6f16c1fd5ed281094f06c36047f1290ef87df969394ebe2e01210289ffee9a06624297a176daf8198868ae5de59fdf5196f905bd4312b0b87ec3250000000001000000000102a4b8c14f271cfa77d5ecaed9c3026472a55ea6bca119e2ff7b04975326f5974001000000171600147edbcdda98080eeb6e8a63c63da135498295c3cdffffffffabcdf96b8ba187c24d70f98a2edfbf100821506212637f28b30a08efa970a4eb0100000017160014df7d60680e984aae4052e24bce8f17e4bfdcc532ffffffff0292fe1e00000000001976a914abba3808b854c70b63ff038fcddfbafcb707713988ac13e796110100000017a914c9e67d2b78a38857c786ea9a2fc3e64cb6e775648702483045022100a6910d3a3b64545a44e097a3739b1206095602fa796afc51f81b249d1293ad0a02206cdae51853b59ca52003f4e54ea8ae418b6b4d036cbe1fdd78677efe8eddb318012102b45e239d96f8504ae45a32af7c80f6164f7b9658166e318521ee822192fee3ef0247304402202684a6f59ee255f3f5e9a9209a735bf2aaa818d47add7c3f7a5590623bd2211c0220452bf2fb8d0dc0380862988f0f098c21e861004e02da7bd1fc6bea4e7f33d2dc012103f308867fda821467f77d372791644225174ae16daba86e55754c150a8d5aa40d0000000001000000000102c997f74e9ad52a44446302381e0fa6de080dadadf55842588bde1be8a47b438000000000171600147edbcdda98080eeb6e8a63c63da135498295c3cdffffffff563c9674a40bf1aa1063f767a50d2288146116fe869012ad3dad03d71e74a8800100000017160014af97d082fd5de049bce2991d9dcaa5d3035a1b04ffffffff0290f4f700000000001976a914abba3808b854c70b63ff038fcddfbafcb707713988ac74b77b030100000017a914fb1e0f36e2d8e91a43c7faba7dae18a610070c4a87024730440220538fcd8fbbf39b813372a7ff6251f1d22c9e940f54272ab525e1d1dc5f03049b022066cc5a1c445573e7e069fdaf3aa33d6665ef5f7936cb155cfd9093e888ca9461012102b45e239d96f8504ae45a32af7c80f6164f7b9658166e318521ee822192fee3ef0248304502210089e579ce52f765c8de6033e1cee93c94aa9a5ef3a194fec12885ed163dc60688022050aadd6aa170c6cfb58f406497949b0140327b4889ca7e082bdcfa8cc03d487f012103fb1a838f38d587dea0532f4a15a39b96e411cdb37c5160ba576a4cb0072db019000000000100000001945db9278cf52925f081c248718e8cfda14e6e6fa3927f995c931fcd46c34e31010000006b483045022100be6f7c570fbea321589921a68f36d15083037d485391e9747fc5a8575b39a686022058424c9bc0953f6e5025dfb2e1e871ec4251b8c23edaa74209084a80fa672876012102d8e60ae936d05571a895e87153d4e9e6cd1edda25027082827c48be1732eea0cffffffff0240420f00000000001976a914d98c258af45dac58c9dfae48467a42a6abae80b588ac5087e605000000001976a9145cd00e25286f599b113955a4df4ea4652c9c1f7888ac000000000100000001efc34b31c654016863b41387a427ef3244c327baee28328aa774ab98778b3ae9010000006a47304402202688e2cf2405141ba26daae44c38dd01eb843174ecc8eeced9e1eebb625e5a4f02206f73df2befc0488aae2332c8b9218e2b68eb7d16c9866e5356454cf69b3e8ba20121035bfe51970a53fc082496bee793e0867ccfd3300ed1daa31c72b2b6758a808054ffffffff02404b4c00000000001976a91416d70844e7edc66c6310b43e2542794936554fb688ac4ba24a05000000001976a914e5db6283f20c0f46cc7bcb513c585db342fb5a2988ac000000000100000001515b21ee49f5ccf9ac47f3ac48f0583d85047cc9d61d94a9dd5302b523fed5a2010000006a47304402200bf35a5c489d82099d5e88f76b39c741909512a5f364962e21c1212e547a9e8a022069d7a437c4f1ad7cfe0a0222e8bda2f0e4c3e96af9d8686fbcc3778ebc4d1663012102be0e658dfe2fc44dfb002ded5b940b7652c337fae5d0bb6e9d03eef015122d74ffffffff02404b4c00000000001976a91462c53f3d55fa12c2c29b19abeb0628bbdfdada2788acb951fe04000000001976a9144de5927116991ba650517b269113143a4f28a70c88ac0000000001000000010c019de34ce1a570afcf91f868f67d5b096d7f1c7c87db21058566c8ce2c7c01010000006a473044022037b5f8a4c6093776ef9620ce4e507c127e8f7ea02a957d53a6651e65db29d5d302200505154be5f75d58c0b3ef281377c505efdcf93486709e9bf0e7dfd1c1a0295701210338635752203772f6e9439b6c3a938ac2fb0d4b3899f362d404eed74e6411671effffffff02404b4c00000000001976a914590cac3835df1b828525c5ef8d68c764132211d488ac2701b204000000001976a9149bf15f5d0b330b7d0e8e95876f4c57d00752c9e788ac0000000001000000018a252a4cb4c3eaee96207be472c8b8015dffd019dd7bc8dfc41c837a46d301d1010000006a4730440220111bd379c5f3159c782a8929d0d926a4032ed370fafb166f382c78a9462521a6022046f300312aec1dde470a9738535ff9030ba10d1900c1af48f16e14543ba03e2c0121021026601cca75ae27974c43b99bbcd63e0a00d6c5bf66c2fc7831636eb1280f6dffffffff02404b4c00000000001976a914cdc8204f4f50e94f735bd80fa8b1a33271acd2ab88ac95b06504000000001976a91466aa2c28ca122d84205eba70cf9fa320974aec6f88ac0000000001000000016918f2e5ce992d39e517a6188a77ecce5a00b012d08a8a49f0d062ab0b188438010000006a47304402204258d87bfa00cd1d770a4dbd8a175764f035d5097359b24e426928de9d017b92022079ee80d17f99d68e53b623fc9a07415371f8676428cf36325ba82fd9e7da7764012102ec26bcc4b6e199d1dfbeeabf95825ea9350ace8101a00835c08907564a2e5784ffffffff02404b4c00000000001976a914860a65e5c4999b75141c287cec136faa0859878c88ac03601904000000001976a9144816ed809550c2b1d0d1dd068fef8942e4fc964b88ac000000000100000001f2ade65ef33bd72a49bfd815eed2ed00e29b0b2a57a716575e9edd39bb7bc8b8010000006a4730440220122dcb5648cbb7c436d39eac58a62c5d0d5a3c6f11f99244e7b039e1f973006902207da8fc6025a03fdf5db1731aea6cc582d0c1afb0d2844c5e4e937f632d24475701210358af44865cdfbf2745110f2bdd28c0880e33c7ebe7fe7963a0edfcbc2f5660e3ffffffff0180edfa02000000001976a914517feda2b1dfd61ee9f249e2da87d4681e1b5e1088ac0000000001000000000101253811808c41ee6c23ed34eb4664c6c9bf1791fb9efc92f56a0f3d5d66fd40f00000000023220020aa6d49a975b86eab9198687218bd78b5ad426d0b8e5e0e5c94ffa7f1267cc719ffffffff02201d9a000000000017a9148a0170de7d432cf459f7e4bdced2578ab6e4cf788746b152010000000017a9143e60cf49cf2529d22db15c7809879b4071860f8f870400473044022020be7d3c62ff4ac3f14c36962c16cb2e9ea9d2b746176ff715073f942e4014f9022013dd805d9b76066e3787298c384441117c952af6fc0c9501405e61459486e22801483045022100b178e9d2808fa9db15aca9bcbc29c513512fa0145cbdde4174090d1cf1e58c2a02200c2a4f2a7bb5c9fb6c7bcfa30f13704e2df5c930695598874ba14b04938bf5a20169522103ad3fd310fef767d07d98f646a75357a42d687f8b3d26dc74426b7a35e001d2f521027485713dd3e8c0eebf1904c860f2e44876d9076ba1ba28df310e7e653d48d4da2103c2ea101de6f0fbfadce02bf94bb5b52ccceb576c2f4c1a36086b5e34a817db1d53ae7038140001000000025b0551bd0fffcf55881e285e15b364ab9a831d2494d2eb7a163a4bbd6f551151000000006b483045022100dff500e8c060a9c8810483d4ada8f91c0b844e92778cc762300040870109c0be02207029fa781ec37ddeb0ffbfa7160e625afdd126f30ec11fb9bc25f4d2164933bb0121023c6017ab9f471a69157180c5e30b9aef2ff73ea2a1a774c53a975e2557536314ffffffffd49a58913818610b0aa065d4f32995863d216c44040a49d454f6b7eeb65c9adc010000006b483045022100dce24b819b70f920d0bb60fa1241fa14f2500412a60aceeaae2610e1593b5e3c022041fdc5a02dc26af043bea27713f1245340b98bd47aa283e23b96ecc4aae157a4012102d18a88bcf5f65d937de7d9bc24d2f492a55216087262bf4683d0055dd0521a56feffffff02da869800000000001976a914b4f1349ec3e7c751c6720e2c0783e3449e21e36888ac80fe210a000000001976a914b4f1349ec3e7c751c6720e2c0783e3449e21e36888ac000000000100000001dcdc6e02bf826f5c783176abc6842f130cc309e5a5be994bc83d86711b0a23e900000000fd670100483045022100cdaf94a9a3aed27f5ecd9f2517525ace8483d45010ebc2f61c6b854e07a0164f02203c746ae190011b987aa56e483d2baff1181a60480a714dacea36981df9b39011014730440220127b08db48809a3cee3d9bb6fae327f25196a94535dbe2dbf9f58c3078bc67260220091c1afb5a782e19b390c544216ec2c0379efc314a9d3a44e36d1a4a770358370147304402203f71b8d47b12eb29b9d5da23c1361fe0577ecef7ccadbbe61d004513f89e084202206b6bbf7a29b6f7f346a11123c090ee60b96428585dd5e31339a853d6883a6547014c8b5321022666ff58d872f45d5f38022af3e8ad21f7a109d70d718171111b035542332f202102378f6c2051e46ac2f8db79929bf24440e45c9fb985bfd5e8a71026440623f5e92103ced1ba9b2f46b49168b38f3f950a5a3cdf15d5d13e8e5a2ebf6a28d1beb6b2562103528901b8cd76a4b9fb270d020706619543d9a75dc2a9c717d397d3838b69e98654aeffffffff02309e08010000000017a914a3d3eea26a00225d76b089a690ae5f48471e5733870000000000000000326a3045584f4e554d01007445140000000000c5a6986d65b7ae36ef88ed04321f5f97eb542c41aed81287300ab679121e04eb000000000100000004d02217d980e9d05b7b4ee19c1f7a62865253af470b829d73915be5e30c70e6f9010000006a473044022027c8099b947fab212c6c545c34e91f7711e005f7868a1f7b3b503fd3cc3a6f7102207961d6d1e57506fbbce9bb6eb896b10742e7ff6c2929150a313ee7c0cd019754012102de34ad2750f245b6062d9855a81bb8efc59623a1a24a5c75493e6e7af9f821d3ffffffffd058ace6bd41eaf20cf492250415256d77838fdb0ad6a11a526cc3a8b91cd8c1010000006b483045022100b0ae22e62379380d0c1c27a5198fb1d5fe07da04263d7a90e873ea842001c8b402200b5aa6672ed3e61a231147939c1cd0fc9ba0ae8e0b720cf43fd9ccdffa842bb0012102de34ad2750f245b6062d9855a81bb8efc59623a1a24a5c75493e6e7af9f821d3ffffffffa727c367ed7a856c7c8cf2c0feeb0e77ce74608039fd43708479abd3103bede7000000006b483045022100bb39f9953d2c619d1535196ff6aacf0ba9698dba0e08961a30c66c931b4091c6022062f4a0a74250fb492d57a58599da1ff78e75d88bb5afa0bafd4e939f7b167ee5012102de34ad2750f245b6062d9855a81bb8efc59623a1a24a5c75493e6e7af9f821d3ffffffff6927ed42617e5822ee33d01de069e51f4c99cfb411259b27b9d9ff48db685093000000006a4730440220553a42bbaf6c69e7020465c7806497fe635d105ae9009d583dcd72474a19d727022013e4a1fc7880f7b69bfb9ef1ec02156b838278da9078f7d9d134933997842af4012102de34ad2750f245b6062d9855a81bb8efc59623a1a24a5c75493e6e7af9f821d3ffffffff02f0b9f505000000001976a9149b578a521259a9c5c95b5aa61d80f3568728324688acb51f0000000000001976a914cd47750be480bf39d8424b5c72b1275d64c7b86688ac0000000001000000014a64e0a420f2cebcf06c246bb53740ca72a821e4774d8d08d1a8fb7982b60582010000006a47304402201611a4a8df48f5742d21dcef2681c15c34d8a5a14fe716fb0fe672067c38270802206c57a79e2ebc0d437d978065a2236588f7c6196cf218af5d02eaa33a605a0d130121028960fbedf80dd4e6550b97238e401f91365f11f0bfe38a7084935ec520ea2441feffffff0210270000000000001976a914b0f47436699555443eb64b8df066fa9eb19a586188ac40cd8003000000001976a914a32a9f5699e088fb908bdcea3468c3615724298d88ac6f3814000100000001da4031ba4a0571cfd6d437359563ec594560ee91bb85632e8d03256448321699000000006a47304402201a0c705f42f916933c27a9aa7f6c9dcace7b44fafa55e09c38b4ffacb33d8a970220137df5bc65341d0cb37620ed94c7c164ac1d7410a320309853dccea7fbd4c728012102db7f8f083a60f48ff7e499a5458d5ed8188d5f7c8299c51077bc6dd0f6221857ffffffff01a2a3bf070000000017a914a9974100aeee974a20cda9a2f545704a0ab54fdc87000000000100000001a89f1120aa1d2c8eaddcacaa498d9b31089a127475325ff8ba30abd8beaf1ac0010000006a473044022057e2bdfb92b58ec20e5a753cee265c36a7bfce4a8ec2062954a0d6e3659bb21f02203a47b1de095a7fbd3e24f4759d44c64a2155c1a385e364e60ae5af8995621b5d012102b0932b4625f1995e23b1a30d287343aa52051d19ab49584aecca6dffa3bf02fdffffffff02822d4904000000001976a9147b7cb7f07e14d218b3358a0a710d5d5b254e82be88acb8500100000000001976a9146d8c28e1ebaac2f0520a9b3a1a3424fb2b22996e88ac000000000100000001a855dfc4a656a9e2e95b489cc72b98d65238d96a2573f592f9123cf089463b40010000006b483045022100e242b0fcfdda1527683793c16c2e6898e2b750c10bc3c458fd904f202c2d25780220017993d6ab2ae289574b9d4e2e9d85491a6ba7d0bc9a636a5826eef770299967012103d5ec209d89bfaa92eb510af8aaec1b85dfc62f812516a49de598bc8d7babbc64ffffffff0237ec4a06000000001976a9144211fd785fb0ee468000a2345246daca6bf3a4c888ac30284300000000001976a914a8005a43e2e02d2330867ca4aab2d242d8cde25a88ac0000000002000000000101134db4ebf51f62c2334ceac117698ceb16b10323d2bd7c6c10bb6ac7af4559bb0100000017160014ba4121faf7d7b542931120e62b423bc374507860feffffff029ce00000000000001976a9142745c02c63537727c5d4cbd5eebb47d494fbd68c88acea7279020000000017a914ab074e8ce89023c0b8f70e486561ed2ae3704ec6870247304402205d8ba08ce38df9cceafbbe3dd0e10173527e7f5b5ca28273635536707b539be702203e71f885c2e3572b537f1c2a0694b06849ce74eaf0f77c7bdff6f45b996cab0c012103aac4ccd91b48bbd7220bc008f5d3d1328f21d4e8908f64d6c5b0bfa5da1c7b0d6f38140002000000000101408b540a6de3509ecf520da4659d84e4a170c87f16f0966cce1dc7e27c64f1700000000017160014362c24189a5ff392fbe1293ad8ab988352bebd14fdffffff0262dc01010000000017a91483b0e44e3ccbf3a3c1f8ea1ecb2c8d06e206163687809698000000000017a914d5d4a8105ddf4cf5b02f17285c52203a761cadb58702483045022100a6e4b296db064e2da8f9fc43b704c26f0fb8429c4fc4e98baf31b6fd4d1ea91a0220290f45e2d1d1fc23b000a9e468aebfdcb78cbb18c69d73c90d8a4ce58209b9b2012103b76d2bc1d902389a4784bf39dc092f4656b2ef17efa6f2a15dcd71f88682550f6f38140002000000000101df3cdc246ee4735be54fe15ab2eedcc49bba0a34072581d8c0e98b2b0903952801000000171600147a423b2f4a4c0ca5f44e851c9717f481579fae44feffffff0220bb5600000000001976a9142745c02c63537727c5d4cbd5eebb47d494fbd68c88ace46fcf050000000017a91478f93f16c50054fce588f208a095003df18ca4858702483045022100a8f978153194a940371f59e0b6976d7e298e1135fe15eb1e0082e7f382a7095302206660f64d7436899f117bafee8939e3b4aa79c6f333e9ddc8fda4d526cff573170121034ca9661305158562edd6458860528682e669c856b2080457fa0ea1371bb67cb56f381400" + +var blockTxs = []string{ + "e1179f205aabbf48dc2ce4ebd9ed255571b0578e4de551f6574a50cb81120007", + "00a5aa2891d41af9eb1dc30c940f142a609ecab8f370eb0874ba7d32252d1b1b", + "1c519d80804dd17258cfc801bf2c875607956fc9f065a664f43e88d53f80af6f", + "b10c1e2f7c8a6b10fddf94260aff0f8a5f56e33c8d0de48c49a72eb8418c3f6e", + "ba85ca543b290deb84cde9c4ca53614dbe557a3dede5d0adb141f803f8e82f34", + "60dfc2c9cc184ae68ca9e540ab4393d9d2179d060e2ac290f29560c6a1360f51", + "3a40bca678653ae8f7f6d2771b571d5ace1a258056b99e3fd361a10f1016bc53", + "4d4e495f3329801d92c7e3dc9874a372576bf3548decf884ede388143980ecab", + "74ba4bee8d559e4d8b4859c086b0ea5f2c36bcabc95d8578e775f065f70943b8", + "32bcc281f081e172dcb40ad137564724bd9486095813b78990d1d986173ac3c6", + "b6e77c59f4a988731d9b8520e0f4971223e622946eb12e28cc2bab72f1e9c2f8", + "0bc8f39da5d5300a2728b45edb18c8219e94a8b27a2e8074f6c5c10a00d99788", + "8329b31d2a490d57980afcf5c7df4574ce57f952aef6f5aecb3b7786f5c9f255", + "e559c2fd0f4e8aebe28fcb6dbb099fc6ee92d726d74fda28522f52bc1490a470", + "3005378ee85fc905a1812bdfae4b2e0e9bb09f5867a53fd73237bb319a1774aa", + "ebea245b9e4d96fab65c938547a9b3ffd03659b92b8ae4fcdfe4ac9bc325c0a2", + "a2d5fe23b50253dda9941dd6c97c04853d58f048acf347acf9ccf549ee215b51", + "017c2ccec866850521db877c1c7f6d095b7df668f891cfaf70a5e14ce39d010c", + "d101d3467a831cc4dfc87bdd19d0ff5d01b8c872e47b2096eeeac3b44c2a258a", + "3884180bab62d0f0498a8ad012b0005aceec778a18a617e5392d99cee5f21869", + "a00200e57bed4fbd193c4cad49549d311282fee9a82956083353a2874f9bfd9f", + "d32ce7a9413111fb2e3578472d520eb1437db701f20256e3afd37b7c0a6d67e6", + "fed1df6d23a40e1a1f26820bbe35febb668aa2240902f1fd17b31a84dde6eb39", + "5bef621ad6d0970939ae36270a3228d3c315f8008fb04eebffab5f7a3589d114", + "411e7f3f4cae4125c8933403809771ebfcaa088f6ef773e5a412ead8639fb515", + "d53858bbbbde4518ea92abda93ac5d01e5122d420a468e6d076244edd99bcea1", + "b5fc4d963805b439d11f06b5d5d89ce3aac225e7145d1673d20d3d37a12c61dd", + "c8d7332377d4bf43c232bc7afc3d7e3aacf13523d1c8488f68f530e58e6cfd88", + "3c21a6b7e3810ca10efac45446cd2b7ef0c9848ac589be7375b61ea5aabbbea4", + "5a25c2b70e2194e05a6208c99343ebe0fad970dd19f3f9cca88aaf77ab9e4658", + "031e3c08ebdcafccf6dc5d7ff1161cd5314424d0a943d2c22a5a2109286e332d", + "4992d16008aa3050b3e2e4aab67e488eb338850ff1c348367ae3d089d8d67a52", + "beb3e71b8da7da7917228f5ce8a88afdc45836c421b053dde24d367865326bd7", +} + +var txDetails map[string]*bchain.Tx + +func init() { + var ( + addr1, addr2, addr3, addr4 bchain.Address + err error + ) + addr1, err = bchain.NewBaseAddress("mwAxva7xAiQ3VXFsCG6svsKQ2Teva7PBjJ") + if err == nil { + addr2, err = bchain.NewBaseAddress("2NBemvVdincDv9GLYRxXy1gXquZfx7SH4ZS") + } + if err == nil { + addr3, err = bchain.NewBaseAddress("mx1gsqbp2TBHkXaApMTncTamoWagYcDft8") + } + if err == nil { + addr4, err = bchain.NewBaseAddress("mx1gsqbp2TBHkXaApMTncTamoWagYcDft8") + } + if err != nil { + panic(err) + } + + txDetails = map[string]*bchain.Tx{ + "e559c2fd0f4e8aebe28fcb6dbb099fc6ee92d726d74fda28522f52bc1490a470": &bchain.Tx{ + Hex: "01000000000102a4b8c14f271cfa77d5ecaed9c3026472a55ea6bca119e2ff7b04975326f5974001000000171600147edbcdda98080eeb6e8a63c63da135498295c3cdffffffffabcdf96b8ba187c24d70f98a2edfbf100821506212637f28b30a08efa970a4eb0100000017160014df7d60680e984aae4052e24bce8f17e4bfdcc532ffffffff0292fe1e00000000001976a914abba3808b854c70b63ff038fcddfbafcb707713988ac13e796110100000017a914c9e67d2b78a38857c786ea9a2fc3e64cb6e775648702483045022100a6910d3a3b64545a44e097a3739b1206095602fa796afc51f81b249d1293ad0a02206cdae51853b59ca52003f4e54ea8ae418b6b4d036cbe1fdd78677efe8eddb318012102b45e239d96f8504ae45a32af7c80f6164f7b9658166e318521ee822192fee3ef0247304402202684a6f59ee255f3f5e9a9209a735bf2aaa818d47add7c3f7a5590623bd2211c0220452bf2fb8d0dc0380862988f0f098c21e861004e02da7bd1fc6bea4e7f33d2dc012103f308867fda821467f77d372791644225174ae16daba86e55754c150a8d5aa40d00000000", + Blocktime: 1528788394, + Time: 1528788394, + Txid: "e559c2fd0f4e8aebe28fcb6dbb099fc6ee92d726d74fda28522f52bc1490a470", + LockTime: 0, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "1600147edbcdda98080eeb6e8a63c63da135498295c3cd", + }, + Txid: "4097f5265397047bffe219a1bca65ea5726402c3d9aeecd577fa1c274fc1b8a4", + Vout: 1, + Sequence: 4294967295, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "160014df7d60680e984aae4052e24bce8f17e4bfdcc532", + }, + Txid: "eba470a9ef080ab3287f63126250210810bfdf2e8af9704dc287a18b6bf9cdab", + Vout: 1, + Sequence: 4294967295, + }, + }, + Vout: []bchain.Vout{ + { + Value: 0.02031250, + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914abba3808b854c70b63ff038fcddfbafcb707713988ac", + Addresses: []string{ + "mwAxva7xAiQ3VXFsCG6svsKQ2Teva7PBjJ", + }, + }, + Address: addr1, + }, + { + Value: 45.90069523, + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "a914c9e67d2b78a38857c786ea9a2fc3e64cb6e7756487", + Addresses: []string{ + "2NBemvVdincDv9GLYRxXy1gXquZfx7SH4ZS", + }, + }, + Address: addr2, + }, + }, + }, + "5bef621ad6d0970939ae36270a3228d3c315f8008fb04eebffab5f7a3589d114": &bchain.Tx{ + Hex: "01000000025b0551bd0fffcf55881e285e15b364ab9a831d2494d2eb7a163a4bbd6f551151000000006b483045022100dff500e8c060a9c8810483d4ada8f91c0b844e92778cc762300040870109c0be02207029fa781ec37ddeb0ffbfa7160e625afdd126f30ec11fb9bc25f4d2164933bb0121023c6017ab9f471a69157180c5e30b9aef2ff73ea2a1a774c53a975e2557536314ffffffffd49a58913818610b0aa065d4f32995863d216c44040a49d454f6b7eeb65c9adc010000006b483045022100dce24b819b70f920d0bb60fa1241fa14f2500412a60aceeaae2610e1593b5e3c022041fdc5a02dc26af043bea27713f1245340b98bd47aa283e23b96ecc4aae157a4012102d18a88bcf5f65d937de7d9bc24d2f492a55216087262bf4683d0055dd0521a56feffffff02da869800000000001976a914b4f1349ec3e7c751c6720e2c0783e3449e21e36888ac80fe210a000000001976a914b4f1349ec3e7c751c6720e2c0783e3449e21e36888ac00000000", + Blocktime: 1528788394, + Time: 1528788394, + Txid: "5bef621ad6d0970939ae36270a3228d3c315f8008fb04eebffab5f7a3589d114", + LockTime: 0, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "483045022100dff500e8c060a9c8810483d4ada8f91c0b844e92778cc762300040870109c0be02207029fa781ec37ddeb0ffbfa7160e625afdd126f30ec11fb9bc25f4d2164933bb0121023c6017ab9f471a69157180c5e30b9aef2ff73ea2a1a774c53a975e2557536314", + }, + Txid: "5111556fbd4b3a167aebd294241d839aab64b3155e281e8855cfff0fbd51055b", + Vout: 0, + Sequence: 4294967295, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "483045022100dce24b819b70f920d0bb60fa1241fa14f2500412a60aceeaae2610e1593b5e3c022041fdc5a02dc26af043bea27713f1245340b98bd47aa283e23b96ecc4aae157a4012102d18a88bcf5f65d937de7d9bc24d2f492a55216087262bf4683d0055dd0521a56", + }, + Txid: "dc9a5cb6eeb7f654d4490a04446c213d869529f3d465a00a0b61183891589ad4", + Vout: 1, + Sequence: 4294967294, + }, + }, + Vout: []bchain.Vout{ + { + Value: 0.09995994, + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914b4f1349ec3e7c751c6720e2c0783e3449e21e36888ac", + Addresses: []string{ + "mx1gsqbp2TBHkXaApMTncTamoWagYcDft8", + }, + }, + Address: addr3, + }, + { + Value: 1.7, + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914b4f1349ec3e7c751c6720e2c0783e3449e21e36888ac", + Addresses: []string{ + "mx1gsqbp2TBHkXaApMTncTamoWagYcDft8", + }, + }, + Address: addr4, + }, + }, + }, + } +} + +func TestRPC_GetBlockHash(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + hash, err := cli.GetBlockHash(blockHeight) + if err != nil { + t.Error(err) + return + } + + if hash != blockHash { + t.Errorf("GetBlockHash() got %q, want %q", hash, blockHash) + } +} + +func TestRPC_GetBlockRaw(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + d, err := cli.GetBlockRaw(blockHash) + if err != nil { + t.Error(err) + return + } + + blk := hex.EncodeToString(d) + + if blk != blockHex { + t.Errorf("GetBlockRaw() got %q, want %q", blk, blockHex) + } +} + +func TestRPC_GetBlock(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + blk, err := cli.GetBlock(blockHash, 0) + if err != nil { + t.Error(err) + return + } + + if len(blk.Txs) != len(blockTxs) { + t.Errorf("GetBlock() number of transactions: got %d, want %d", len(blk.Txs), len(blockTxs)) + } + + for ti, tx := range blk.Txs { + if tx.Txid != blockTxs[ti] { + t.Errorf("GetBlock() transaction %d: got %s, want %s", ti, tx.Txid, blockTxs[ti]) + } + } + +} + +func TestRPC_GetTransaction(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + for txid, want := range txDetails { + got, err := cli.GetTransaction(txid) + if err != nil { + t.Error(err) + return + } + + // Confirmations is variable field, we just check if is set and reset it + if got.Confirmations > 0 { + got.Confirmations = 0 + } else { + t.Errorf("GetTransaction() has empty Confirmations field") + continue + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("GetTransaction() got %#v, want %#v", got, want) + } + } +} diff --git a/bchain/coins/dash/dashrpc_test.go b/bchain/coins/dash/dashrpc_test.go new file mode 100644 index 00000000..d96d08fa --- /dev/null +++ b/bchain/coins/dash/dashrpc_test.go @@ -0,0 +1,297 @@ +package dash + +import ( + "blockbook/bchain" + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "reflect" + "testing" +) + +var rpcURL = flag.String("rpcURL", "http://blockbook-dev.corp:18033", "RPC URL of backend server") +var rpcUser = flag.String("rpcUser", "rpc", "RPC user of backend server") +var rpcPass = flag.String("rpcPass", "rpc", "RPC password of backend server") +var rpcClient *DashRPC + +func getRPCConfig() string { + config := `{ + "coin_name": "Dash", + "rpcURL": "%s", + "rpcUser": "%s", + "rpcPass": "%s", + "rpcTimeout": 25, + "parse": true + }` + + return fmt.Sprintf(config, *rpcURL, *rpcUser, *rpcPass) +} + +func getRPCClient() (*DashRPC, error) { + if rpcClient == nil { + cfg := json.RawMessage(getRPCConfig()) + c, err := NewDashRPC(cfg, nil) + if err != nil { + return nil, err + } + cli := c.(*DashRPC) + cli.Parser = NewDashParser(GetChainParams("main"), cli.ChainConfig) + rpcClient = cli + } + return rpcClient, nil +} + +const blockHeight = 139521 +const blockHash = "000000000296ea05e13b5479f6c041de575eec90759f58f57d311a8918b0af17" +const blockHex = "00000020ef45a540a35144679286a8af8aa7944b698dde61ea5e1f06cf937505000000003aa6e325f4d456f125b68a5fc19a68397b0fc9f33f324f3b69067e95dd844da422521e5be7d3061c0cb7bad71501000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4c030121020422521e5b08fabe6d6d3130343838393564323065633562323330336330376538666136636166326362010000000000000057ffffff010300000d2f6e6f64655374726174756d2f00000000052c8bc310000000001976a914c982406f087057a97456e48d335546ae8d93a03c88aca32c0e43000000001976a91434c32f942cf3e7b81d6ab8b6917235817fa9813888ac2b8bc310000000001976a914c2c29ebc787954ef99d01c5f79115abf7012fb8e88ac2b8bc310000000001976a914d7b47d4b40a23c389f5a17754d7f60f511c7d0ec88ac2b8bc310000000001976a914dc3e0793134b081145ec0c67a9c72a7b297df27c88ac00000000020000000109d37a59b7da8902b8822547c927e35554b16667ffd698daae985c58c71616a4010000006b483045022100f3ef92ae1c8442eff171bd2dbc69373db384c86617032917b3bb2c5cd892bb2702207485cf5f8e6aa9fe245f5708a5c6ec37580c1c35e54429c6b43b322678f54cad012102ba7dbd059cc4f03e9fa4b6007b407279a154a8fc2103241511df155a52b7ea58feffffff02a055e18e170000001976a914e2114cb0a8b5d6f1c3c720f314cbf79e14bb9cdd88ac8cb65df0440000001976a9141ed486862342afd134f96a6cee5ca105801375df88ac0021020002000000017d50060376941a898edaeac3861473de5b2657b28baa470ddaf636b0ff3190fb010000006a473044022003b663185d43a0f347a8359b91497159a94e1e8281a803d286706e5ea5fc512c02203e11e27d203175fc4c22c04f49b2dbfcf90cb0c0ef0d10e54798adc1f33ccf96012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff025e7c7982000000001976a914130c4d66b9ae50d3863a297c7281bd9bc11bb49a88acc06692d1010000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac00210200020000000110d8c1402eb9ffdca121dee4fad5436674975e7f40a96d66fe727ede3d3ee632010000006a473044022027ba38cbf5e0f6e0a94a1e9a2a78efd2f3b5e80b85f54bbbd38beb0e65ec991502207369cf2de044b089e1fc756853bfd048d7378e7b682fcfbaac0d2075a0b6939b012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff029ee29e24010000001976a914ac0d571dbffbeebb3c26ce9b118e0a28aba81c2f88ac80006d2f010000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac002102000200000001ff06583ae94458b579a49aeba5ab57ac27a4663a60753476799634cd5d64ad4d010000006a47304402202f383e81456b59206b6faead6b83b6ed229e3761d208b0f2a5e6631046e0b7ff022031f89dadb2d7faae8e61dc93d513ac6e28573fe0210de46c2ae18b3c3c887cf8012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff027019cbe6000000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888acaec9406d010000001976a914b60b7763d5b321b7fa061494d998eaa0cfd3f0f288ac00210200020000000179fa3df11708289d6a78a8b76eb884adb98931301b7bf5fefc604728e3b3eb6e010000006a473044022074adcf3df1804b8437f1d2b321cdbbd15c76aec0a44aa664420bf247f8706be002200ea08d5acf4bd81589862a3d475e4ea33a7aa15b8871a099d4562e4afcc44784012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff02d03e5555000000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac4ea4b6fe010000001976a91447d2c0b1e21f2c36d130c3e975cadd3bf6c6ce8288ac00210200020000000169c8effd31ba59a10ad75a6e374d3290f991ecdbbb10d28698a4871def12deb0010000006b483045022100b0e0273c39d81dcdd0bd2492311faca54da084c037656fefc93fd1249f63d3f802201ddbd4bf92e51e40ee7cc59646f38f8dd526f7e25b043dfcbcad3d585933c7b1012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff02809f8108010000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac9e438a4b010000001976a914c70c6486ed98f72e7c523c296f3991d86e2a7bb588ac002102000200000001a1213c0f47d00a7c93c1b3dd34c886917c59a6318d00676a2b146751155c1577000000006946304302202b04b35b2aaab34cc0dbf285dc3b7b8ad3e1d5c4ffe867b49e9382835b9fd0a3021f2bf807068c6eef2815d541c6d1a3154b0d3724818a281a2ad5d1d74f687411012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff028e7de512000000001976a914313f01738ea31d3fb0bb26ac182975945ca9ef2a88ac90652641020000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac002102000200000001e7cbfc69314e6d6b3944cb34b7ef19993a45e6a59879c18c32cdab88cc4c6a1b010000006b483045022100dc1f84af6da9ca63bd5d92d106a764aa4df4cb37a30f1dbf9d07f8b066ce2818022011f5e729a903a557d2105c3841a62770f43539748f33aa55e4b9dbd6f99f77de012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff026e5355a6000000001976a9146d4f4c6f848a139f89120a5e3e8f92f718c8229d88acb08fb6ad010000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac002102000200000001184242c203c4b091944369b9bed727284fe897e2d372ab47885cd7118cfbb3a3010000006b483045022100ddf663d3828c1c98bad65e1fc958e135da0c78b13fb42bc5a0cc6dc1d2a4888d022007e176b4e0a39bd90d3e0edbccd9aae93f6deadd86703686c566e11814154099012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff024e4b8b1f010000001976a9147acc906cdae8955574eaa7fc6366bbc42902a2e188acd0978034010000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac002102000200000001e35e955d7765c19d04a699c98e3ed0d1507b6fb86f98e0330091b9612ec9f7df010000006b483045022100d3cc944c0ce021c6a3e2c5cb9284c21fa2a27fb30903e5712c3d4f175f18d9a702203f4281911f033aa5c7b263875111d947e8356505a8720e320c690c656b4d6e0c012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff02a01fce76000000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac7ec33ddd010000001976a914f75a3de06209430583c23b71669bf5df8c1c643f88ac002102000200000001754bdc58be116c685ea2f539c049ce4c1a38f7dbb8ee458d6b98830e3a2af8e2010000006b483045022100da544fd1c3225ad4402ba16ede27c201a23b637963789f5190c6ad48d68aea8e022065489bab58de50174b1d6458ad7533805fea39122e5b213ef49e5114d8d2ea35012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff02ae51aab8000000001976a914cc2586f922dc54d5266ddacca54bf6f350c5287388ac7091619b010000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac0021020002000000018fcbd82d4adbf8499450c1fcdd9d56ce11bc2fac6af8e70c3032b5ce02d59884010000006a4730440220451d5e1062e59fd8d5bc9852ca355c37207fbd9ea32a69156ae44d69ebd31f9802204fc26e7bf199c46bda4712b599cd18a1e09ecc2962ef89cd80426e4eb5c29eae012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff021e6ca132000000001976a914b284c168d27529145da7e78c0b07c948170cdacf88ac00776a21020000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac002102000200000001c186468c4a674322f74c32b056848fddd0c9390c20bbf85a9e847f2255ce485b010000006b483045022100aafad4b02781f9a132d42d6d5a9ea3b22fdd67f16bf517c03ddf26be6a90a6a802203b06dc2977cc4b3058b0266a3a3c16ac3b6bdceb72877adb9dbcb9b3b30bd993012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff023e5db50c010000001976a9149173fc4e4834e63e3a01a14ad5ab1b3ed4dd33fe88ace0855647010000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac0021020002000000017187e2a6bb7890f5b7ecffdba3590fed709b0b1fdc5fb6d1928be295f3cb9bb2010000006a473044022005b37f92e5ea9cb2180f5ded09ebf4d2f0a8d3f04004ca0683078a5d54180659022057aa8c1024ba21cc39c08d5dd1304a602475113e0ff895dbbb5525dd3508154c012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff02d02eb8bb000000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac4eb45398010000001976a9147724133db7ec4c4960cfe92b697f226db2ed7d2e88ac0021020002000000010c87c69351a06be7a2e72ac5ca76914fa3acabb0af8bf32905ac43d9703f4b8f010000006b483045022100e64b1d3d9ea80a1ba5bd932a745c8679d824be05842424dd9e64d420c186fc8102206dc3aefa2daa97bb0a432025d0849226b9d79d93b70110852f839589f9bc06a1012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff0250a2d5cd000000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888acce403686010000001976a914bda34c000d0970e44b570e3ae99e714fc4e5234988ac002102000200000001b4d10c0b88242ffccd8e4c69189475e699a6341afe754ed12da6dc842d85bd28010000006a4730440220426695c12ebf8f452c25ebd2d3515316b4d490750a864c5d02ca2d3940650cbf02203ab566745846e136ea9f14033508276a992bb4e2d8229733474c33dd4fc6b57a012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff02106b2315010000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac0e78e83e010000001976a914549d59ef4d9f68bab8231ebeabe3b1c28c741f5088ac002102000200000001b141ff2096ab524c1c5b1310c63c35fea7b3aee3ddd1cc6b4d63af388a8024a9010000006a473044022035ffb0d2ae5da0532d11f4cf8c4f48ca5e8e3be67961f7765248ab9e28f26c7b02200d3e2d4ae42e744ca6f68dd1ce381fcbf04a36f611573f730ef8a70bbf107ffd012102931ec69676be99a4b481f26b9c745197bda02bb5ac43286d5eab2581d771963dfeffffff0220b18a44000000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888acfe31810f020000001976a91484b4f613e2e5e7b54baf6dda54931d5bb90f621888acd5200200020000000327ee9a2a360c6304fda56fa029670a95db595f70ae185a6f76ff1de415e07a18000000006a473044022011e7aed7a1cf187a9b6ca294bb76e3576cadebce48b5b944ad8393a60e8aa485022000818546dc7ba47c625258223dcefd6e84dc3faa8d54c646bfc0f55c4506c8f00121023fe7680caadc7bf3f796936de04d77e1007dea53880621c01d7b34720345d4ecfeffffff1ae8beeed571f491410ed327a6821b683d8ae571aea56057634da7aa8ce1041f000000006b4830450221009277cfac065a076814e18613d89c7d85a6461cf5283f2a9cee7254ec83fce637022023cf7186be7714921fe24719450e65a204d803738a1cb9fe35f30753f0696b8b012102aff34da05a74891899aace72f2e650ec1c039bfc519c192e6c231a2b7fa05749feffffff6388454ad1e5718af92def6fe307e64e97c43324d30c322b31edf85088020dc9000000006a47304402204435602e00d22417ff489302758a246df5fbc05e9bc4d0025464556ae7f77e70022036e30d2d46937ee0fc0cdf9a63e7baf8351bd16454ec02311cac52655ac4c32801210395fbe30126fc97a2c8b1e29bc27028a5a6885e4a4116d13e2cbe32c9d71e7f03feffffff02ce177e09000000001976a91437617547a3e0ba0adeead7c8c33c03970341404088acd0f7aad1010000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac002102000200000001b792e355e878df60982c967051581118561e08e475fa9c852e2bb66e146f5856010000006a47304402203aa597338441045e0203e033fccdb13182f44a27fe7d8d1258420903172754d8022014e13789708cbf46e171725191e074bad6cb65ced12d86a53b7fbb2093063b4c012102c024dbdeb04678f3bc3799231347ee8d0d2a1c8575e9700b7f15705beb1c85cffeffffff02c086e1c2000000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac8c5265cd000000001976a914fd1bfe89ca75cea2a003d415e5d737f90cf9e8b788ac00210200020000000120c4c8eccae876a644b960c74fac98521a85bc3ee77c4d23e3af7fce03a92856000000006a47304402206140098393f8ea920d0181fa96274e97fa8ece62d0751293b7b68c0a54d0e417022061e99761aec73147b6a8e26bdc6a9ffd59679e9272e99ffac526d48da4635164012102ef126bc0394e7d67502a5349c41c8167a664ad1adbd381baa7e9faf2538a6a66feffffff029a890722000000001976a914e974612a090bc5d4caea5354d95679aa19c6ebdf88ac004afa74000000001976a914e2114cb0a8b5d6f1c3c720f314cbf79e14bb9cdd88acdc200200" + +var blockTxs = []string{ + "cfe2d2c5bd9929349a9d8f3d8f2423f4f0c9b408ed41b3002be5e7437a20aa7d", + "3f7ac6c55c0b383feb17715aef3cebf29182039fc42577d7c517b2fc04096942", + "3f296b929f6ee4f0ad3d6fce35873d6aeacbdf06aaf2abe384beb6e3f2a4dd03", + "5ef4f9b7e4c0240687c3a6e6a073e0fbc753645d231ca35435b95325778b7186", + "805b5ba055227b0f7dbbdef8e603632c4d25b93f0e87c59fc74cbe8ad8dbe806", + "392785b88f03c82492172827f30cbed4761de3098a0faaa740999b412ff15e46", + "13fafd7c8afc6fd2c860d342eaf0cfe0edd2b994bb836898c02830b2f688155e", + "26bc95fcc71380f0d66e437314c72999c0848cab81fe1f91c9c95bf15b74855c", + "7873d8d774f2aae72100620a21b38ea681b488b328802b6ec3271b1d727c6b73", + "23147585fd4ed3970118027ce9b2e190e264f26fbf5d8c9708a483cee6cada43", + "e079894b2545eca7184a2f0eaccf4b069242f18fa0721aedc8f66b73112a1e8f", + "b36284854fa1947844ecc5d62768be3e14cc44c430db87b1b90184364b30dbf4", + "1fd3ad5d0392cedf318600908270986c801cac161ef06f660591634cc2a29652", + "7a5b8944589b0cfba9c408b24b095648b0040a37fd769a9785982603bb7ca1f7", + "7da1811ec3f2c6381d89e59f40957d36c898ba1bb70b976e0b5490d3b9fa8952", + "dbcfa65bdfe758353305eaff11b300463018efb7fa8f17c6c6a98bb8dba6bcc9", + "c046821e5503770304359792c20c1ed3e71509a19a867acf1dae113bf52d2a6f", + "d3cea11e1a4937323cc94172f93a2e0edc0981a706f2d2c3315ace94b01b375a", + "6ef2a57e38dd891690c8f230b65f26247799b2421860e6cf8a1c7c8cfdedd96e", + "53834414d8a88afe4268b85f959e526a0c677ac6b7dedba9a796d1549852fd41", + "b761ebaccfb6d0eeaa5350ccafdf6a7633e59d6baadc932c6d78491cb08052a6", +} + +var txDetails map[string]*bchain.Tx + +func init() { + var ( + addr1, addr2, addr3, addr4 bchain.Address + err error + ) + addr1, err = bchain.NewBaseAddress("ygvnHYy5TZgvS2LK2L7CBcRRnR52bJCv7k") + if err == nil { + addr2, err = bchain.NewBaseAddress("yP8TiVEB5X95MCfiDCuwnpd9SVDJ6cSPpp") + } + if err == nil { + addr3, err = bchain.NewBaseAddress("yRNGmGCjSKA42KHRZsVbByua3VgbZjLKfg") + } + if err == nil { + addr4, err = bchain.NewBaseAddress("yiGAWAWmZsULK2iyhGQhMdNsCiAYRA1bCt") + } + if err != nil { + panic(err) + } + + txDetails = map[string]*bchain.Tx{ + "3f7ac6c55c0b383feb17715aef3cebf29182039fc42577d7c517b2fc04096942": &bchain.Tx{ + Hex: "020000000109d37a59b7da8902b8822547c927e35554b16667ffd698daae985c58c71616a4010000006b483045022100f3ef92ae1c8442eff171bd2dbc69373db384c86617032917b3bb2c5cd892bb2702207485cf5f8e6aa9fe245f5708a5c6ec37580c1c35e54429c6b43b322678f54cad012102ba7dbd059cc4f03e9fa4b6007b407279a154a8fc2103241511df155a52b7ea58feffffff02a055e18e170000001976a914e2114cb0a8b5d6f1c3c720f314cbf79e14bb9cdd88ac8cb65df0440000001976a9141ed486862342afd134f96a6cee5ca105801375df88ac00210200", + Blocktime: 1528713762, + Time: 1528713762, + Txid: "3f7ac6c55c0b383feb17715aef3cebf29182039fc42577d7c517b2fc04096942", + LockTime: 139520, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "483045022100f3ef92ae1c8442eff171bd2dbc69373db384c86617032917b3bb2c5cd892bb2702207485cf5f8e6aa9fe245f5708a5c6ec37580c1c35e54429c6b43b322678f54cad012102ba7dbd059cc4f03e9fa4b6007b407279a154a8fc2103241511df155a52b7ea58", + }, + Txid: "a41616c7585c98aeda98d6ff6766b15455e327c9472582b80289dab7597ad309", + Vout: 1, + Sequence: 4294967294, + }, + }, + Vout: []bchain.Vout{ + { + Value: 1011.81380000, + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914e2114cb0a8b5d6f1c3c720f314cbf79e14bb9cdd88ac", + Addresses: []string{ + "ygvnHYy5TZgvS2LK2L7CBcRRnR52bJCv7k", + }, + }, + Address: addr1, + }, + { + Value: 2960.90449548, + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a9141ed486862342afd134f96a6cee5ca105801375df88ac", + Addresses: []string{ + "yP8TiVEB5X95MCfiDCuwnpd9SVDJ6cSPpp", + }, + }, + Address: addr2, + }, + }, + }, + "6ef2a57e38dd891690c8f230b65f26247799b2421860e6cf8a1c7c8cfdedd96e": &bchain.Tx{ + Hex: "020000000327ee9a2a360c6304fda56fa029670a95db595f70ae185a6f76ff1de415e07a18000000006a473044022011e7aed7a1cf187a9b6ca294bb76e3576cadebce48b5b944ad8393a60e8aa485022000818546dc7ba47c625258223dcefd6e84dc3faa8d54c646bfc0f55c4506c8f00121023fe7680caadc7bf3f796936de04d77e1007dea53880621c01d7b34720345d4ecfeffffff1ae8beeed571f491410ed327a6821b683d8ae571aea56057634da7aa8ce1041f000000006b4830450221009277cfac065a076814e18613d89c7d85a6461cf5283f2a9cee7254ec83fce637022023cf7186be7714921fe24719450e65a204d803738a1cb9fe35f30753f0696b8b012102aff34da05a74891899aace72f2e650ec1c039bfc519c192e6c231a2b7fa05749feffffff6388454ad1e5718af92def6fe307e64e97c43324d30c322b31edf85088020dc9000000006a47304402204435602e00d22417ff489302758a246df5fbc05e9bc4d0025464556ae7f77e70022036e30d2d46937ee0fc0cdf9a63e7baf8351bd16454ec02311cac52655ac4c32801210395fbe30126fc97a2c8b1e29bc27028a5a6885e4a4116d13e2cbe32c9d71e7f03feffffff02ce177e09000000001976a91437617547a3e0ba0adeead7c8c33c03970341404088acd0f7aad1010000001976a914f0b3dff509993e0b7035ce997b52763ce501d67888ac00210200", + Blocktime: 1528713762, + Time: 1528713762, + Txid: "6ef2a57e38dd891690c8f230b65f26247799b2421860e6cf8a1c7c8cfdedd96e", + LockTime: 139520, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "473044022011e7aed7a1cf187a9b6ca294bb76e3576cadebce48b5b944ad8393a60e8aa485022000818546dc7ba47c625258223dcefd6e84dc3faa8d54c646bfc0f55c4506c8f00121023fe7680caadc7bf3f796936de04d77e1007dea53880621c01d7b34720345d4ec", + }, + Txid: "187ae015e41dff766f5a18ae705f59db950a6729a06fa5fd04630c362a9aee27", + Vout: 0, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "4830450221009277cfac065a076814e18613d89c7d85a6461cf5283f2a9cee7254ec83fce637022023cf7186be7714921fe24719450e65a204d803738a1cb9fe35f30753f0696b8b012102aff34da05a74891899aace72f2e650ec1c039bfc519c192e6c231a2b7fa05749", + }, + Txid: "1f04e18caaa74d635760a5ae71e58a3d681b82a627d30e4191f471d5eebee81a", + Vout: 0, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "47304402204435602e00d22417ff489302758a246df5fbc05e9bc4d0025464556ae7f77e70022036e30d2d46937ee0fc0cdf9a63e7baf8351bd16454ec02311cac52655ac4c32801210395fbe30126fc97a2c8b1e29bc27028a5a6885e4a4116d13e2cbe32c9d71e7f03", + }, + Txid: "c90d028850f8ed312b320cd32433c4974ee607e36fef2df98a71e5d14a458863", + Vout: 0, + Sequence: 4294967294, + }, + }, + Vout: []bchain.Vout{ + { + Value: 1.59258574, + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a91437617547a3e0ba0adeead7c8c33c03970341404088ac", + Addresses: []string{ + "yRNGmGCjSKA42KHRZsVbByua3VgbZjLKfg", + }, + }, + Address: addr3, + }, + { + Value: 78.12610000, + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914f0b3dff509993e0b7035ce997b52763ce501d67888ac", + Addresses: []string{ + "yiGAWAWmZsULK2iyhGQhMdNsCiAYRA1bCt", + }, + }, + Address: addr4, + }, + }, + }, + } +} + +func TestRPC_GetBlockHash(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + hash, err := cli.GetBlockHash(blockHeight) + if err != nil { + t.Error(err) + return + } + + if hash != blockHash { + t.Errorf("GetBlockHash() got %q, want %q", hash, blockHash) + } +} + +func TestRPC_GetBlockRaw(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + d, err := cli.GetBlockRaw(blockHash) + if err != nil { + t.Error(err) + return + } + + blk := hex.EncodeToString(d) + + if blk != blockHex { + t.Errorf("GetBlockRaw() got %q, want %q", blk, blockHex) + } +} + +func TestRPC_GetBlock(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + blk, err := cli.GetBlock(blockHash, 0) + if err != nil { + t.Error(err) + return + } + + if len(blk.Txs) != len(blockTxs) { + t.Errorf("GetBlock() number of transactions: got %d, want %d", len(blk.Txs), len(blockTxs)) + } + + for ti, tx := range blk.Txs { + if tx.Txid != blockTxs[ti] { + t.Errorf("GetBlock() transaction %d: got %s, want %s", ti, tx.Txid, blockTxs[ti]) + } + } + +} + +func TestRPC_GetTransaction(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + for txid, want := range txDetails { + got, err := cli.GetTransaction(txid) + if err != nil { + t.Error(err) + return + } + + // Confirmations is variable field, we just check if is set and reset it + if got.Confirmations > 0 { + got.Confirmations = 0 + } else { + t.Errorf("GetTransaction() has empty Confirmations field") + continue + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("GetTransaction() got %v, want %v", got, want) + } + } +} diff --git a/bchain/coins/zec/zcashrpc_test.go b/bchain/coins/zec/zcashrpc_test.go new file mode 100644 index 00000000..16c5b7d8 --- /dev/null +++ b/bchain/coins/zec/zcashrpc_test.go @@ -0,0 +1,271 @@ +package zec + +import ( + "blockbook/bchain" + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "reflect" + "testing" +) + +var rpcURL = flag.String("rpcURL", "http://blockbook-dev.corp:18032", "RPC URL of backend server") +var rpcUser = flag.String("rpcUser", "rpc", "RPC user of backend server") +var rpcPass = flag.String("rpcPass", "rpc", "RPC password of backend server") +var rpcClient *ZCashRPC + +func getRPCConfig() string { + config := `{ + "coin_name": "Zcash", + "rpcURL": "%s", + "rpcUser": "%s", + "rpcPass": "%s", + "rpcTimeout": 25, + "parse": true + }` + + return fmt.Sprintf(config, *rpcURL, *rpcUser, *rpcPass) +} + +func getRPCClient() (*ZCashRPC, error) { + if rpcClient == nil { + cfg := json.RawMessage(getRPCConfig()) + c, err := NewZCashRPC(cfg, nil) + if err != nil { + return nil, err + } + cli := c.(*ZCashRPC) + cli.Parser = NewZCashParser(cli.ChainConfig) + rpcClient = cli + } + return rpcClient, nil +} + +const blockHeight = 251102 +const blockHash = "001335906f981bbf0633e124e2fa8afef3d882e34a0306a4e0c55162e57e673d" +const blockHex = "04000000dae072724713c60408a643775f15f58a37088bea7a51165880fbed47346b0c00cce3aae2d297be2838c5d4829b682b4fbbe8a09f9a10da8222b8256b2b1f20df0000000000000000000000000000000000000000000000000000000000000000d15b1f5baf71151f040019290a7a71036c73966bf61b685bd50dd09e095ef4680224901a53050000fd4005008d152c3b0d8adeee94b01ce9d9ebeec96098779a1a9782005ec849d1198482c1eb2c9234d8100b2d560c1bae8798c6c15add6082e9b871bc751792aedbce2f086ad7aa914537318d846af7e6c9ede26856c9440874d981c8d5f48eff38e5f81ef76585ca6c3b774f0b5ffc7676054c246d5704e9bfdc0f3e29aefa913a16bb1505f3cc44aaae9d7170569fe120d4146ad98f242c52e334e40599cdaab24455d95e12abf7fb283009647baa27a04a79ac45d0dddfc70106baa8dfb34d105b1da71fbac3c3dca4718a97b976b9e4c4b56dea0c2f0f73d258e435e3156125a3a85574b0e06a5cb22ab6d77d900c0d82a73db6b147f1378286885f4b8d11e15cb9bbee80abb90ff49addd3d995e1727c6d751c15d964ca0a199b3fd1821d97685f793ebeb82e1a173f3d4b21535004e9edc511f2f8595e467cd3dd5117df2ff8cb0e928ffadbe33a2838d914d22e709ed000f267538f88287858f062edab5f7dbe079ab6f5e8252ee356155eea1d99b8b8bc9a778f3e3f4c15716408f4d6d4b0d6739fa5900622dc72fff6d0c79ae43118727bb533c81930a3bc85dea97574ee678d7546c4060d1ee526359e8ff6b0809ff4e218e54c8233411d5d1316861c698a13bc95862adf3eda6360367fe18519eea495294990bb2f0db3a7e9dd1e064ba1d3a0fc2c4489be1d52a2fbfac665adb93d84ae806d9e1ed704aae1e140156f4f113fd2aa88db1fa98c7a903e29115b1a37b5f53b57e0b5350231630603057d7f47ab05c5a9b8e78976d73f6be1f39eef207ef665bba21910b4333592cd23af144fd32cbeb29f5d8f734f5c7f062e4a0a0d5abb236588a3a604657231adc10e07910cccd6b075c73bb4d53311b076be2ac22f2a75c98719f857b2bddfbcfbb99314cdacbdb9cbb4ea3f532f5f9a1c93256f83b7b933f7857675eb56e57d395c2a009214f706c371b13d706221161161914f61927ed3435f641b851cc2c35a56f68aa0367db22e24bf7c4608317135e65422f5023391bc2893eb45cf0f3762648bec5e2c3f649a5b2ffd69555668c1525d7f1cc19104793ccb1c14360b5f3f4790bfe0f60ed882189567058e29c0fe67428db64721e5880fef24d9b696a5f10972740e5ed8eedd365876662555ace71bbebb8b9b200621e6d2ef28e5eaac935521c621bd6533b725f001ef494f6ba94cad6e8b4810937a2642fa97fddf59606e9d43762e1eff7badf6b0274354864df0f97cfb0362c324de02d694c83356b0f6e273f20cfad339fe0883da29e58715663d03b1d6c5fa0b9615cef7377507aa43c06c70d5f1cc48a6f449be2956481b33309911edb77effc8fea728fa04544c7f04a1d3f7b365a310c7ed63034528890c6bc23118dd01cad7a096c1fb15b2df445fdfb3a146a881f424254d44dc0caa20e501f5edaf3eba4881ef6380937cb1eb50488a0aef365d49d40aeaa7bd754231973ad1cc6716a5babcfed810f60db313172583b34c237057f1a3991436f6b40c3bd2374cbf1d8b0ef2af73fbdf60623a51841a256617d0829e6b338fddeca9948a0fde177d7a04def4e858ad56388e660a25a405d6397bdc0cce6287b3906a2a2167fbb08ee5828dda75cd3dd61af2a8eb971ea72a515df331ce595b15113368fd30dd36a7ca77d2ac149f049ca55e37cdf95a7316c6686eba6e5a152a6f289983d470314681d331b36b5ff5a1a93915bc309a1f2c0be8eed10a39548ee7b48cbedcb6622c13b0f134136f1bead1dc7ae29118048064119252721b5446192ca1a77eac7f2592fc34bc8eeae98633a21a17b3220ef93d58e28fc9e9b922e4f7ea3bf10f1dd5da9e327fbdfbe79765bf6cc0e37f3c9eceed203d8f80083b8b2a2c0f6a5b0d5a52c8d541e60632a666bcad5c03030000807082c403010000000000000000000000000000000000000000000000000000000000000000ffffffff0603ded4030101ffffffff0267cc9a3b000000001976a914550cef2cf048a294415d0c5893e653ac529c404388ac80b2e60e0000000017a914a71e4588c50c86f4669e0da43db37cbd7428a9f287000000000000000000030000807082c40301601ade5f535f62f3da01e0c88b16beb916877fa0fa43299a9e2398b813d0a119020000006a4730440220770472192407cfc5c01e331442ac579a68e445a7ccb0fe8a481161519555794a02207b00b4c01af416a4972c2fd2fba8d58a6467da545400469ab57e9207a0ee3ca201210201d494a45f36f545443bafd1a9050b02f448dd236bb4ce2602f83978980b98f2feffffff02ea5e2c1c000000001976a9144ef2de10b304381a9404ccbe12f83395e7860bbd88ac00a3e1110000000017a9146a8eecfe3a7949a4a8c68754accaea75ab32cd9e8794d40300f1d4030000030000807082c40302eac0139a677c07b6fcdddd205f4bf538d9cc9fb586565fe77440f93cf1b5ca9a010000006b4830450221009ad50b4f0da90a1876af6b43c029e55f1c8b8c44e94161a7f14c812adcebeaa902204b9df40096337eb43120408d4743693b17ea27fc0f660948a0a761264e67a6b00121036ec451bd1d3d39bb8d2d0264dd5a0ff817ae306ec7ce0c7c9b86be3f3dde8727feffffff6a1ed49e62634ab5a60b23ec73f9014ad1c9d3bd3bf023333c8eb311c802f298000000006b4830450221009008a10ebebf45f1a9aeb01a5b49a5de820a1a396ca1b900ea0420a1c2c49ea7022053fad044ff42792dcad16d084d67d7c4cc565458f78a14292fe5ef5e9f7a20bb012103448301b9253e6822ae05af64c61517fe8cf8b22590cc7d0b308b7f5cbce26db1feffffff0200a3e111000000001976a9149bc587e2cdd13b78e26f601f084ea0597b357f4d88ac3176a002000000001976a91414a88f1032c8ef1c6bd9177f62cdb260b5087b5488acd2d40300f1d4030000" + +var blockTxs = []string{ + "f02aa1c4c86e1d0cef6ccbbc48b2b7b38355bc3612d8f77dd58d04be1ec6ba19", + "a9f7cc34d7e272d2d9fb68cfa1c1941e338f377e6e426ae2fea1c12616d89c63", + "83f3db1d129a77bee9c6cf32cbc12d959cd0af8c8d734c2611db4bfddfe99202", +} + +var txDetails map[string]*bchain.Tx + +func init() { + var ( + addr1, addr2, addr3, addr4 bchain.Address + err error + ) + addr1, err = bchain.NewBaseAddress("tmGunyrqeeHBKX3Jm23zKLokRogrS51Qzqh") + if err == nil { + addr2, err = bchain.NewBaseAddress("t2GGEpYQUKiTsb9WYKD9AKNEriao84tVsr5") + } + if err == nil { + addr3, err = bchain.NewBaseAddress("tmPuzhaxL3vzTqkyJ6wn48Q4ZfAo6PBvHKC") + } + if err == nil { + addr4, err = bchain.NewBaseAddress("tmBbamgVqVBTAsEzPmEymbczdoaQvE5qwaR") + } + if err != nil { + panic(err) + } + + txDetails = map[string]*bchain.Tx{ + "a9f7cc34d7e272d2d9fb68cfa1c1941e338f377e6e426ae2fea1c12616d89c63": &bchain.Tx{ + Hex: "030000807082c40301601ade5f535f62f3da01e0c88b16beb916877fa0fa43299a9e2398b813d0a119020000006a4730440220770472192407cfc5c01e331442ac579a68e445a7ccb0fe8a481161519555794a02207b00b4c01af416a4972c2fd2fba8d58a6467da545400469ab57e9207a0ee3ca201210201d494a45f36f545443bafd1a9050b02f448dd236bb4ce2602f83978980b98f2feffffff02ea5e2c1c000000001976a9144ef2de10b304381a9404ccbe12f83395e7860bbd88ac00a3e1110000000017a9146a8eecfe3a7949a4a8c68754accaea75ab32cd9e8794d40300f1d4030000", + Blocktime: 1528781777, + Time: 1528781777, + Txid: "a9f7cc34d7e272d2d9fb68cfa1c1941e338f377e6e426ae2fea1c12616d89c63", + LockTime: 251028, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "4730440220770472192407cfc5c01e331442ac579a68e445a7ccb0fe8a481161519555794a02207b00b4c01af416a4972c2fd2fba8d58a6467da545400469ab57e9207a0ee3ca201210201d494a45f36f545443bafd1a9050b02f448dd236bb4ce2602f83978980b98f2", + }, + Txid: "19a1d013b898239e9a2943faa07f8716b9be168bc8e001daf3625f535fde1a60", + Vout: 2, + Sequence: 4294967294, + }, + }, + Vout: []bchain.Vout{ + { + Value: 4.72669930, + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a9144ef2de10b304381a9404ccbe12f83395e7860bbd88ac", + Addresses: []string{ + "tmGunyrqeeHBKX3Jm23zKLokRogrS51Qzqh", + }, + }, + Address: addr1, + }, + { + Value: 3.0, + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "a9146a8eecfe3a7949a4a8c68754accaea75ab32cd9e87", + Addresses: []string{ + "t2GGEpYQUKiTsb9WYKD9AKNEriao84tVsr5", + }, + }, + Address: addr2, + }, + }, + }, + "83f3db1d129a77bee9c6cf32cbc12d959cd0af8c8d734c2611db4bfddfe99202": &bchain.Tx{ + Hex: "030000807082c40302eac0139a677c07b6fcdddd205f4bf538d9cc9fb586565fe77440f93cf1b5ca9a010000006b4830450221009ad50b4f0da90a1876af6b43c029e55f1c8b8c44e94161a7f14c812adcebeaa902204b9df40096337eb43120408d4743693b17ea27fc0f660948a0a761264e67a6b00121036ec451bd1d3d39bb8d2d0264dd5a0ff817ae306ec7ce0c7c9b86be3f3dde8727feffffff6a1ed49e62634ab5a60b23ec73f9014ad1c9d3bd3bf023333c8eb311c802f298000000006b4830450221009008a10ebebf45f1a9aeb01a5b49a5de820a1a396ca1b900ea0420a1c2c49ea7022053fad044ff42792dcad16d084d67d7c4cc565458f78a14292fe5ef5e9f7a20bb012103448301b9253e6822ae05af64c61517fe8cf8b22590cc7d0b308b7f5cbce26db1feffffff0200a3e111000000001976a9149bc587e2cdd13b78e26f601f084ea0597b357f4d88ac3176a002000000001976a91414a88f1032c8ef1c6bd9177f62cdb260b5087b5488acd2d40300f1d4030000", + Blocktime: 1528781777, + Time: 1528781777, + Txid: "83f3db1d129a77bee9c6cf32cbc12d959cd0af8c8d734c2611db4bfddfe99202", + LockTime: 251090, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "4830450221009ad50b4f0da90a1876af6b43c029e55f1c8b8c44e94161a7f14c812adcebeaa902204b9df40096337eb43120408d4743693b17ea27fc0f660948a0a761264e67a6b00121036ec451bd1d3d39bb8d2d0264dd5a0ff817ae306ec7ce0c7c9b86be3f3dde8727", + }, + Txid: "9acab5f13cf94074e75f5686b59fccd938f54b5f20ddddfcb6077c679a13c0ea", + Vout: 1, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "4830450221009008a10ebebf45f1a9aeb01a5b49a5de820a1a396ca1b900ea0420a1c2c49ea7022053fad044ff42792dcad16d084d67d7c4cc565458f78a14292fe5ef5e9f7a20bb012103448301b9253e6822ae05af64c61517fe8cf8b22590cc7d0b308b7f5cbce26db1", + }, + Txid: "98f202c811b38e3c3323f03bbdd3c9d14a01f973ec230ba6b54a63629ed41e6a", + Vout: 0, + Sequence: 4294967294, + }, + }, + Vout: []bchain.Vout{ + { + Value: 3.0, + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a9149bc587e2cdd13b78e26f601f084ea0597b357f4d88ac", + Addresses: []string{ + "tmPuzhaxL3vzTqkyJ6wn48Q4ZfAo6PBvHKC", + }, + }, + Address: addr3, + }, + { + Value: 0.44070449, + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a91414a88f1032c8ef1c6bd9177f62cdb260b5087b5488ac", + Addresses: []string{ + "tmBbamgVqVBTAsEzPmEymbczdoaQvE5qwaR", + }, + }, + Address: addr4, + }, + }, + }, + } +} + +func TestRPC_GetBlockHash(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + hash, err := cli.GetBlockHash(blockHeight) + if err != nil { + t.Error(err) + return + } + + if hash != blockHash { + t.Errorf("GetBlockHash() got %q, want %q", hash, blockHash) + } +} + +func TestRPC_GetBlockRaw(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + d, err := cli.GetBlockRaw(blockHash) + if err != nil { + t.Error(err) + return + } + + blk := hex.EncodeToString(d) + + if blk != blockHex { + t.Errorf("GetBlockRaw() got %q, want %q", blk, blockHex) + } +} + +func TestRPC_GetBlock(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + blk, err := cli.GetBlock(blockHash, 0) + if err != nil { + t.Error(err) + return + } + + if len(blk.Txs) != len(blockTxs) { + t.Errorf("GetBlock() number of transactions: got %d, want %d", len(blk.Txs), len(blockTxs)) + } + + for ti, tx := range blk.Txs { + if tx.Txid != blockTxs[ti] { + t.Errorf("GetBlock() transaction %d: got %s, want %s", ti, tx.Txid, blockTxs[ti]) + } + } + +} + +func TestRPC_GetTransaction(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + cli, err := getRPCClient() + if err != nil { + t.Fatal(err) + } + + for txid, want := range txDetails { + got, err := cli.GetTransaction(txid) + if err != nil { + t.Error(err) + return + } + + // Confirmations is variable field, we just check if is set and reset it + if got.Confirmations > 0 { + got.Confirmations = 0 + } else { + t.Errorf("GetTransaction() has empty Confirmations field") + continue + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("GetTransaction() got %v, want %v", got, want) + } + } +}