github.com/bchainhub/blockbook@v0.3.2/bchain/coins/litecoin/litecoinparser_test.go (about) 1 // +build unittest 2 3 package litecoin 4 5 import ( 6 "blockbook/bchain" 7 "blockbook/bchain/coins/btc" 8 "encoding/hex" 9 "math/big" 10 "os" 11 "reflect" 12 "testing" 13 14 "github.com/martinboehm/btcutil/chaincfg" 15 ) 16 17 func TestMain(m *testing.M) { 18 c := m.Run() 19 chaincfg.ResetParams() 20 os.Exit(c) 21 } 22 23 func Test_GetAddrDescFromAddress_Testnet(t *testing.T) { 24 type args struct { 25 address string 26 } 27 tests := []struct { 28 name string 29 args args 30 want string 31 wantErr bool 32 }{ 33 { 34 name: "P2PKH1", 35 args: args{address: "mgPdTgEq6YqUJ4yzQgR8jH5TCX5c5yRwCP"}, 36 want: "76a91409957dfdb3eb620a94b99857e13949551584c33688ac", 37 wantErr: false, 38 }, 39 { 40 name: "P2SH1-legacy", 41 args: args{address: "2MvGVySztevmycxrSmMRjJaVj2iJin7qpap"}, 42 want: "a9142126232e3f47ae0f1246ec5f05fc400d83c86a0d87", 43 wantErr: false, 44 }, 45 { 46 name: "P2SH2-legacy", 47 args: args{address: "2N9a2TNzWz1FEKGFxUdMEh62V83URdZ5QAZ"}, 48 want: "a914b31049e7ee51501fe19e3e0cdb803dc84cf99f9e87", 49 wantErr: false, 50 }, 51 { 52 name: "P2SH1", 53 args: args{address: "QPdG6Ts8g2q4m9cVPTTkPGwAB6kYgXB7Hc"}, 54 want: "a9142126232e3f47ae0f1246ec5f05fc400d83c86a0d87", 55 wantErr: false, 56 }, 57 { 58 name: "P2SH2", 59 args: args{address: "QcvnaPrm17JKTT216jPFmnTvGRvFX2fWzN"}, 60 want: "a914b31049e7ee51501fe19e3e0cdb803dc84cf99f9e87", 61 wantErr: false, 62 }, 63 } 64 parser := NewLitecoinParser(GetChainParams("test"), &btc.Configuration{}) 65 66 for _, tt := range tests { 67 t.Run(tt.name, func(t *testing.T) { 68 got, err := parser.GetAddrDescFromAddress(tt.args.address) 69 if (err != nil) != tt.wantErr { 70 t.Errorf("GetAddrDescFromAddress() error = %v, wantErr %v", err, tt.wantErr) 71 return 72 } 73 h := hex.EncodeToString(got) 74 if !reflect.DeepEqual(h, tt.want) { 75 t.Errorf("GetAddrDescFromAddress() = %v, want %v", h, tt.want) 76 } 77 }) 78 } 79 } 80 81 func Test_GetAddrDescFromAddress_Mainnet(t *testing.T) { 82 type args struct { 83 address string 84 } 85 tests := []struct { 86 name string 87 args args 88 want string 89 wantErr bool 90 }{ 91 { 92 name: "P2PKH1", 93 args: args{address: "LgJGe7aKy1wfXESKhiKeRWj6z4KjzCfXNW"}, 94 want: "76a914e72ba56ab6afccac045d696b979e3b5077e88d1988ac", 95 wantErr: false, 96 }, 97 { 98 name: "P2PKH2", 99 args: args{address: "LiTVReQ6N8rWc2pNg2XMwCWq7A9P15teWg"}, 100 want: "76a914feda50542e61108cf53b93dbffa0959f91ccb32588ac", 101 wantErr: false, 102 }, 103 { 104 name: "P2PKH3 - bech32 prefix", 105 args: args{address: "LTC1eqUzePT9uvpvb413Ejd6P8Cx1Ei8Di"}, 106 want: "76a91457630115300a625f5deaab64100faa5506c1422f88ac", 107 wantErr: false, 108 }, 109 { 110 name: "P2PKH4 - bech32 prefix", 111 args: args{address: "LTC1f9gtb7bU6B4VjHXvPGDi8ACNZhkKPo"}, 112 want: "76a9145763023d3f02509644dacbfc45f2c9102129749788ac", 113 wantErr: false, 114 }, 115 { 116 name: "P2SH1", 117 args: args{address: "MLTQ8niHMnpJLNvK72zBeY91hQmUtoo8nX"}, 118 want: "a91489ba6cf45546f91f1bdf553e695d63fc6b8795bd87", 119 wantErr: false, 120 }, 121 { 122 name: "P2SH2", 123 args: args{address: "MAVWzxXm8KGkZTesqLtqywzrvbs96FEoKy"}, 124 want: "a9141c6fbaf46d64221e80cbae182c33ddf81b9294ac87", 125 wantErr: false, 126 }, 127 { 128 name: "witness_v0_keyhash", 129 args: args{address: "ltc1q5fgkuac9s2ry56jka5s6zqsyfcugcchrqgz2yl"}, 130 want: "0014a2516e770582864a6a56ed21a102044e388c62e3", 131 wantErr: false, 132 }, 133 { 134 name: "witness_v0_scripthashx", 135 args: args{address: "ltc1qu9dgdg330r6r84g5mw7wqshg04exv2uttmw2elfwx74h5tgntuzsk3x5nd"}, 136 want: "0020e15a86a23178f433d514dbbce042e87d72662b8b5edcacfd2e37ab7a2d135f05", 137 wantErr: false, 138 }, 139 } 140 parser := NewLitecoinParser(GetChainParams("main"), &btc.Configuration{}) 141 142 for _, tt := range tests { 143 t.Run(tt.name, func(t *testing.T) { 144 got, err := parser.GetAddrDescFromAddress(tt.args.address) 145 if (err != nil) != tt.wantErr { 146 t.Errorf("GetAddrDescFromAddress() error = %v, wantErr %v", err, tt.wantErr) 147 return 148 } 149 h := hex.EncodeToString(got) 150 if !reflect.DeepEqual(h, tt.want) { 151 t.Errorf("GetAddrDescFromAddress() = %v, want %v", h, tt.want) 152 } 153 }) 154 } 155 } 156 157 func TestGetAddressesFromAddrDesc_Mainnet(t *testing.T) { 158 type args struct { 159 script string 160 } 161 tests := []struct { 162 name string 163 args args 164 want []string 165 want2 bool 166 wantErr bool 167 }{ 168 { 169 name: "P2PKH1", 170 args: args{script: "76a914feda50542e61108cf53b93dbffa0959f91ccb32588ac"}, 171 want: []string{"LiTVReQ6N8rWc2pNg2XMwCWq7A9P15teWg"}, 172 want2: true, 173 wantErr: false, 174 }, 175 { 176 name: "P2PKH2", 177 args: args{script: "76A9145763023D3F02509644DACBFC45F2C9102129749788AC"}, 178 want: []string{"LTC1f9gtb7bU6B4VjHXvPGDi8ACNZhkKPo"}, 179 want2: true, 180 wantErr: false, 181 }, 182 { 183 name: "P2SH1", 184 args: args{script: "a9141c6fbaf46d64221e80cbae182c33ddf81b9294ac87"}, 185 want: []string{"MAVWzxXm8KGkZTesqLtqywzrvbs96FEoKy"}, 186 want2: true, 187 wantErr: false, 188 }, 189 { 190 name: "witness_v0_keyhash", 191 args: args{script: "0014a2516e770582864a6a56ed21a102044e388c62e3"}, 192 want: []string{"ltc1q5fgkuac9s2ry56jka5s6zqsyfcugcchrqgz2yl"}, 193 want2: true, 194 wantErr: false, 195 }, 196 { 197 name: "witness_v0_scripthashx", 198 args: args{script: "0020e15a86a23178f433d514dbbce042e87d72662b8b5edcacfd2e37ab7a2d135f05"}, 199 want: []string{"ltc1qu9dgdg330r6r84g5mw7wqshg04exv2uttmw2elfwx74h5tgntuzsk3x5nd"}, 200 want2: true, 201 wantErr: false, 202 }, 203 } 204 parser := NewLitecoinParser(GetChainParams("main"), &btc.Configuration{}) 205 206 for _, tt := range tests { 207 t.Run(tt.name, func(t *testing.T) { 208 b, _ := hex.DecodeString(tt.args.script) 209 got, got2, err := parser.GetAddressesFromAddrDesc(b) 210 if (err != nil) != tt.wantErr { 211 t.Errorf("GetAddressesFromAddrDesc() error = %v, wantErr %v", err, tt.wantErr) 212 return 213 } 214 if !reflect.DeepEqual(got, tt.want) { 215 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got, tt.want) 216 } 217 if !reflect.DeepEqual(got2, tt.want2) { 218 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got2, tt.want2) 219 } 220 }) 221 } 222 } 223 224 var ( 225 testTx1 bchain.Tx 226 227 testTxPacked1 = "0001e4538ba8d7aa2002000000031e1977dc524bec5929e95d8d0946812944b7b5bda12f5b99fdf557773f2ee65e0100000000ffffffff8a398e44546dce0245452b90130e86832b21fd68f26662bc33aeb7c6c115d23c1900000000ffffffffb807ab93a7fcdff7af6d24581a4a18aa7c1db1ebecba2617a6805b009513940f0c00000000ffffffff020001a04a000000001976a9141ae882e788091732da6910595314447c9e38bd8d88ac27440f00000000001976a9146b474cbf0f6004329b630bdd4798f2c23d1751b688ac00000000" 228 ) 229 230 func init() { 231 testTx1 = bchain.Tx{ 232 Hex: "02000000031e1977dc524bec5929e95d8d0946812944b7b5bda12f5b99fdf557773f2ee65e0100000000ffffffff8a398e44546dce0245452b90130e86832b21fd68f26662bc33aeb7c6c115d23c1900000000ffffffffb807ab93a7fcdff7af6d24581a4a18aa7c1db1ebecba2617a6805b009513940f0c00000000ffffffff020001a04a000000001976a9141ae882e788091732da6910595314447c9e38bd8d88ac27440f00000000001976a9146b474cbf0f6004329b630bdd4798f2c23d1751b688ac00000000", 233 Blocktime: 1519053456, 234 Txid: "1c50c1770374d7de2f81a87463a5225bb620d25fd467536223a5b715a47c9e32", 235 LockTime: 0, 236 Version: 2, 237 Vin: []bchain.Vin{ 238 { 239 ScriptSig: bchain.ScriptSig{ 240 Hex: "", 241 }, 242 Txid: "5ee62e3f7757f5fd995b2fa1bdb5b744298146098d5de92959ec4b52dc77191e", 243 Vout: 1, 244 Sequence: 4294967295, 245 }, 246 { 247 ScriptSig: bchain.ScriptSig{ 248 Hex: "", 249 }, 250 Txid: "3cd215c1c6b7ae33bc6266f268fd212b83860e13902b454502ce6d54448e398a", 251 Vout: 25, 252 Sequence: 4294967295, 253 }, 254 { 255 ScriptSig: bchain.ScriptSig{ 256 Hex: "", 257 }, 258 Txid: "0f941395005b80a61726baecebb11d7caa184a1a58246daff7dffca793ab07b8", 259 Vout: 12, 260 Sequence: 4294967295, 261 }, 262 }, 263 Vout: []bchain.Vout{ 264 { 265 ValueSat: *big.NewInt(1252000000), 266 N: 0, 267 ScriptPubKey: bchain.ScriptPubKey{ 268 Hex: "76a9141ae882e788091732da6910595314447c9e38bd8d88ac", 269 Addresses: []string{ 270 "LMgENNXzzuPxp7vfMjDrCU44bsmrEMgqvc", 271 }, 272 }, 273 }, 274 { 275 ValueSat: *big.NewInt(1000487), 276 N: 1, 277 ScriptPubKey: bchain.ScriptPubKey{ 278 Hex: "76a9146b474cbf0f6004329b630bdd4798f2c23d1751b688ac", 279 Addresses: []string{ 280 "LV1ByjbJNFTHyFQqwqwdJXKJznYDzXzg4B", 281 }, 282 }, 283 }, 284 }, 285 } 286 } 287 288 func Test_PackTx(t *testing.T) { 289 type args struct { 290 tx bchain.Tx 291 height uint32 292 blockTime int64 293 parser *LitecoinParser 294 } 295 tests := []struct { 296 name string 297 args args 298 want string 299 wantErr bool 300 }{ 301 { 302 name: "litecoin-1", 303 args: args{ 304 tx: testTx1, 305 height: 123987, 306 blockTime: 1519053456, 307 parser: NewLitecoinParser(GetChainParams("main"), &btc.Configuration{}), 308 }, 309 want: testTxPacked1, 310 wantErr: false, 311 }, 312 } 313 for _, tt := range tests { 314 t.Run(tt.name, func(t *testing.T) { 315 got, err := tt.args.parser.PackTx(&tt.args.tx, tt.args.height, tt.args.blockTime) 316 if (err != nil) != tt.wantErr { 317 t.Errorf("packTx() error = %v, wantErr %v", err, tt.wantErr) 318 return 319 } 320 h := hex.EncodeToString(got) 321 if !reflect.DeepEqual(h, tt.want) { 322 t.Errorf("packTx() = %v, want %v", h, tt.want) 323 } 324 }) 325 } 326 } 327 328 func Test_UnpackTx(t *testing.T) { 329 type args struct { 330 packedTx string 331 parser *LitecoinParser 332 } 333 tests := []struct { 334 name string 335 args args 336 want *bchain.Tx 337 want1 uint32 338 wantErr bool 339 }{ 340 { 341 name: "litecoin-1", 342 args: args{ 343 packedTx: testTxPacked1, 344 parser: NewLitecoinParser(GetChainParams("main"), &btc.Configuration{}), 345 }, 346 want: &testTx1, 347 want1: 123987, 348 wantErr: false, 349 }, 350 } 351 for _, tt := range tests { 352 t.Run(tt.name, func(t *testing.T) { 353 b, _ := hex.DecodeString(tt.args.packedTx) 354 got, got1, err := tt.args.parser.UnpackTx(b) 355 if (err != nil) != tt.wantErr { 356 t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr) 357 return 358 } 359 if !reflect.DeepEqual(got, tt.want) { 360 t.Errorf("unpackTx() got = %v, want %v", got, tt.want) 361 } 362 if got1 != tt.want1 { 363 t.Errorf("unpackTx() got1 = %v, want %v", got1, tt.want1) 364 } 365 }) 366 } 367 }