github.com/trezor/blockbook@v0.4.1-0.20240328132726-e9a08582ee2c/bchain/coins/litecoin/litecoinparser_test.go (about) 1 //go:build unittest 2 3 package litecoin 4 5 import ( 6 "encoding/hex" 7 "math/big" 8 "os" 9 "reflect" 10 "testing" 11 12 "github.com/martinboehm/btcutil/chaincfg" 13 "github.com/trezor/blockbook/bchain" 14 "github.com/trezor/blockbook/bchain/coins/btc" 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 = "0a201c50c1770374d7de2f81a87463a5225bb620d25fd467536223a5b715a47c9e3212c90102000000031e1977dc524bec5929e95d8d0946812944b7b5bda12f5b99fdf557773f2ee65e0100000000ffffffff8a398e44546dce0245452b90130e86832b21fd68f26662bc33aeb7c6c115d23c1900000000ffffffffb807ab93a7fcdff7af6d24581a4a18aa7c1db1ebecba2617a6805b009513940f0c00000000ffffffff020001a04a000000001976a9141ae882e788091732da6910595314447c9e38bd8d88ac27440f00000000001976a9146b474cbf0f6004329b630bdd4798f2c23d1751b688ac000000001890d5abd40528d3c807322a12205ee62e3f7757f5fd995b2fa1bdb5b744298146098d5de92959ec4b52dc77191e180128ffffffff0f322a12203cd215c1c6b7ae33bc6266f268fd212b83860e13902b454502ce6d54448e398a181928ffffffff0f322a12200f941395005b80a61726baecebb11d7caa184a1a58246daff7dffca793ab07b8180c28ffffffff0f3a450a044aa001001a1976a9141ae882e788091732da6910595314447c9e38bd8d88ac22224c4d67454e4e587a7a755078703776664d6a44724355343462736d72454d677176633a460a030f442710011a1976a9146b474cbf0f6004329b630bdd4798f2c23d1751b688ac22224c563142796a624a4e46544879465171777177644a584b4a7a6e59447a587a6734424002489101" 228 ) 229 230 func init() { 231 testTx1 = bchain.Tx{ 232 Hex: "02000000031e1977dc524bec5929e95d8d0946812944b7b5bda12f5b99fdf557773f2ee65e0100000000ffffffff8a398e44546dce0245452b90130e86832b21fd68f26662bc33aeb7c6c115d23c1900000000ffffffffb807ab93a7fcdff7af6d24581a4a18aa7c1db1ebecba2617a6805b009513940f0c00000000ffffffff020001a04a000000001976a9141ae882e788091732da6910595314447c9e38bd8d88ac27440f00000000001976a9146b474cbf0f6004329b630bdd4798f2c23d1751b688ac00000000", 233 Blocktime: 1519053456, 234 Time: 1519053456, 235 Txid: "1c50c1770374d7de2f81a87463a5225bb620d25fd467536223a5b715a47c9e32", 236 LockTime: 0, 237 Version: 2, 238 VSize: 145, 239 Vin: []bchain.Vin{ 240 { 241 ScriptSig: bchain.ScriptSig{ 242 Hex: "", 243 }, 244 Txid: "5ee62e3f7757f5fd995b2fa1bdb5b744298146098d5de92959ec4b52dc77191e", 245 Vout: 1, 246 Sequence: 4294967295, 247 }, 248 { 249 ScriptSig: bchain.ScriptSig{ 250 Hex: "", 251 }, 252 Txid: "3cd215c1c6b7ae33bc6266f268fd212b83860e13902b454502ce6d54448e398a", 253 Vout: 25, 254 Sequence: 4294967295, 255 }, 256 { 257 ScriptSig: bchain.ScriptSig{ 258 Hex: "", 259 }, 260 Txid: "0f941395005b80a61726baecebb11d7caa184a1a58246daff7dffca793ab07b8", 261 Vout: 12, 262 Sequence: 4294967295, 263 }, 264 }, 265 Vout: []bchain.Vout{ 266 { 267 ValueSat: *big.NewInt(1252000000), 268 N: 0, 269 ScriptPubKey: bchain.ScriptPubKey{ 270 Hex: "76a9141ae882e788091732da6910595314447c9e38bd8d88ac", 271 Addresses: []string{ 272 "LMgENNXzzuPxp7vfMjDrCU44bsmrEMgqvc", 273 }, 274 }, 275 }, 276 { 277 ValueSat: *big.NewInt(1000487), 278 N: 1, 279 ScriptPubKey: bchain.ScriptPubKey{ 280 Hex: "76a9146b474cbf0f6004329b630bdd4798f2c23d1751b688ac", 281 Addresses: []string{ 282 "LV1ByjbJNFTHyFQqwqwdJXKJznYDzXzg4B", 283 }, 284 }, 285 }, 286 }, 287 } 288 } 289 290 func Test_PackTx(t *testing.T) { 291 type args struct { 292 tx bchain.Tx 293 height uint32 294 blockTime int64 295 parser *LitecoinParser 296 } 297 tests := []struct { 298 name string 299 args args 300 want string 301 wantErr bool 302 }{ 303 { 304 name: "litecoin-1", 305 args: args{ 306 tx: testTx1, 307 height: 123987, 308 blockTime: 1519053456, 309 parser: NewLitecoinParser(GetChainParams("main"), &btc.Configuration{}), 310 }, 311 want: testTxPacked1, 312 wantErr: false, 313 }, 314 } 315 for _, tt := range tests { 316 t.Run(tt.name, func(t *testing.T) { 317 got, err := tt.args.parser.PackTx(&tt.args.tx, tt.args.height, tt.args.blockTime) 318 if (err != nil) != tt.wantErr { 319 t.Errorf("packTx() error = %v, wantErr %v", err, tt.wantErr) 320 return 321 } 322 h := hex.EncodeToString(got) 323 if !reflect.DeepEqual(h, tt.want) { 324 t.Errorf("packTx() = %v, want %v", h, tt.want) 325 } 326 }) 327 } 328 } 329 330 func Test_UnpackTx(t *testing.T) { 331 type args struct { 332 packedTx string 333 parser *LitecoinParser 334 } 335 tests := []struct { 336 name string 337 args args 338 want *bchain.Tx 339 want1 uint32 340 wantErr bool 341 }{ 342 { 343 name: "litecoin-1", 344 args: args{ 345 packedTx: testTxPacked1, 346 parser: NewLitecoinParser(GetChainParams("main"), &btc.Configuration{}), 347 }, 348 want: &testTx1, 349 want1: 123987, 350 wantErr: false, 351 }, 352 } 353 for _, tt := range tests { 354 t.Run(tt.name, func(t *testing.T) { 355 b, _ := hex.DecodeString(tt.args.packedTx) 356 got, got1, err := tt.args.parser.UnpackTx(b) 357 if (err != nil) != tt.wantErr { 358 t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr) 359 return 360 } 361 if !reflect.DeepEqual(got, tt.want) { 362 t.Errorf("unpackTx() got = %v, want %v", got, tt.want) 363 } 364 if got1 != tt.want1 { 365 t.Errorf("unpackTx() got1 = %v, want %v", got1, tt.want1) 366 } 367 }) 368 } 369 }