github.com/trezor/blockbook@v0.4.1-0.20240328132726-e9a08582ee2c/bchain/coins/bitzeny/bitzenyparser_test.go (about) 1 //go:build unittest 2 3 package bitzeny 4 5 import ( 6 "encoding/hex" 7 "math/big" 8 "os" 9 "reflect" 10 "testing" 11 12 "github.com/trezor/blockbook/bchain" 13 "github.com/trezor/blockbook/bchain/coins/btc" 14 15 "github.com/martinboehm/btcutil/chaincfg" 16 ) 17 18 func TestMain(m *testing.M) { 19 c := m.Run() 20 chaincfg.ResetParams() 21 os.Exit(c) 22 } 23 24 func Test_GetAddrDescFromAddress_Mainnet(t *testing.T) { 25 type args struct { 26 address string 27 } 28 tests := []struct { 29 name string 30 args args 31 want string 32 wantErr bool 33 }{ 34 { 35 name: "P2PKH1", 36 args: args{address: "Zw74N1RSU2xV3a7SBERBiCP11fMwX5yvMu"}, 37 want: "76a914d8658ca5c406149071687d370d1d22d972d2f88488ac", 38 wantErr: false, 39 }, 40 { 41 name: "P2PKH2", 42 args: args{address: "ZiSn1vTSxGu2kFcnkjjm7bYGhT5BVAVfEG"}, 43 want: "76a9144d869697281ad18370313122795e56dfdc3a331388ac", 44 wantErr: false, 45 }, 46 { 47 name: "P2SH1", 48 args: args{address: "3CZ3357bm1K81StpEDQtEH3ho3ULx19nc8"}, 49 want: "a9147726fc1144eae1b7bd301d87d0a7f846cadb591887", 50 wantErr: false, 51 }, 52 { 53 name: "P2SH2", 54 args: args{address: "3M1AjZEuBzScbd9pchiGJSVT4yNfwzSmXP"}, 55 want: "a914d3d93b5d7f57b94a4fecde93d4489f2b423fd3c287", 56 wantErr: false, 57 }, 58 { 59 name: "witness_v0_keyhash", 60 args: args{address: "bz1q7rfrdacyyfwx8gppd8ah9hka8npgqsm44prfnd"}, 61 want: "0014f0d236f704225c63a02169fb72dedd3cc2804375", 62 wantErr: false, 63 }, 64 { 65 name: "witness_v0_scripthashx", 66 args: args{address: "bz1qd2mspe6m2wpztw4q2mccyvyess6569eu59sfvf0u0vdmdwltr5lse8d7sw"}, 67 want: "00206ab700e75b538225baa056f182309984354d173ca1609625fc7b1bb6bbeb1d3f", 68 wantErr: false, 69 }, 70 } 71 parser := NewBitZenyParser(GetChainParams("main"), &btc.Configuration{}) 72 73 for _, tt := range tests { 74 t.Run(tt.name, func(t *testing.T) { 75 got, err := parser.GetAddrDescFromAddress(tt.args.address) 76 if (err != nil) != tt.wantErr { 77 t.Errorf("GetAddrDescFromAddress() error = %v, wantErr %v", err, tt.wantErr) 78 return 79 } 80 h := hex.EncodeToString(got) 81 if !reflect.DeepEqual(h, tt.want) { 82 t.Errorf("GetAddrDescFromAddress() = %v, want %v", h, tt.want) 83 } 84 }) 85 } 86 } 87 88 func Test_GetAddressesFromAddrDesc(t *testing.T) { 89 type args struct { 90 script string 91 } 92 tests := []struct { 93 name string 94 args args 95 want []string 96 want2 bool 97 wantErr bool 98 }{ 99 { 100 name: "P2PKH", 101 args: args{script: "76a914d8658ca5c406149071687d370d1d22d972d2f88488ac"}, 102 want: []string{"Zw74N1RSU2xV3a7SBERBiCP11fMwX5yvMu"}, 103 want2: true, 104 wantErr: false, 105 }, 106 { 107 name: "P2SH", 108 args: args{script: "a9147726fc1144eae1b7bd301d87d0a7f846cadb591887"}, 109 want: []string{"3CZ3357bm1K81StpEDQtEH3ho3ULx19nc8"}, 110 want2: true, 111 wantErr: false, 112 }, 113 { 114 name: "P2WPKH", 115 args: args{script: "0014f0d236f704225c63a02169fb72dedd3cc2804375"}, 116 want: []string{"bz1q7rfrdacyyfwx8gppd8ah9hka8npgqsm44prfnd"}, 117 want2: true, 118 wantErr: false, 119 }, 120 { 121 name: "P2WSH", 122 args: args{script: "00206ab700e75b538225baa056f182309984354d173ca1609625fc7b1bb6bbeb1d3f"}, 123 want: []string{"bz1qd2mspe6m2wpztw4q2mccyvyess6569eu59sfvf0u0vdmdwltr5lse8d7sw"}, 124 want2: true, 125 wantErr: false, 126 }, 127 { 128 name: "OP_RETURN ascii", 129 args: args{script: "6a0461686f6a"}, 130 want: []string{"OP_RETURN (ahoj)"}, 131 want2: false, 132 wantErr: false, 133 }, 134 { 135 name: "OP_RETURN hex", 136 args: args{script: "6a072020f1686f6a20"}, 137 want: []string{"OP_RETURN 2020f1686f6a20"}, 138 want2: false, 139 wantErr: false, 140 }, 141 } 142 143 parser := NewBitZenyParser(GetChainParams("main"), &btc.Configuration{}) 144 145 for _, tt := range tests { 146 t.Run(tt.name, func(t *testing.T) { 147 b, _ := hex.DecodeString(tt.args.script) 148 got, got2, err := parser.GetAddressesFromAddrDesc(b) 149 if (err != nil) != tt.wantErr { 150 t.Errorf("outputScriptToAddresses() error = %v, wantErr %v", err, tt.wantErr) 151 return 152 } 153 if !reflect.DeepEqual(got, tt.want) { 154 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got, tt.want) 155 } 156 if !reflect.DeepEqual(got2, tt.want2) { 157 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got2, tt.want2) 158 } 159 }) 160 } 161 } 162 163 var ( 164 testTx1 bchain.Tx 165 166 testTxPacked1 = "001c3f1a8be6859d3e0100000001aef422fb91cd91e556966fed4121ac44017a761d71385596536bb447ae05213e000000006a47304402202341ac4297925257dc72eb418a069c45e76f7070340e27501f6308cc7eff45f802204a347915adceff5f6fc9b8075d95d47887d46b344c7bbc8066d315931b189ad001210228c2520812b7f8c63e7a088c61b6348b22fa0c98812e736a1fd896bc828d3c65feffffff028041f13d000000001976a91478379ea136bb5783b675cd11e412bf0703995aeb88aca9983141000000001976a9144d869697281ad18370313122795e56dfdc3a331388ac193f1c00" 167 ) 168 169 func init() { 170 testTx1 = bchain.Tx{ 171 Hex: "0100000001aef422fb91cd91e556966fed4121ac44017a761d71385596536bb447ae05213e000000006a47304402202341ac4297925257dc72eb418a069c45e76f7070340e27501f6308cc7eff45f802204a347915adceff5f6fc9b8075d95d47887d46b344c7bbc8066d315931b189ad001210228c2520812b7f8c63e7a088c61b6348b22fa0c98812e736a1fd896bc828d3c65feffffff028041f13d000000001976a91478379ea136bb5783b675cd11e412bf0703995aeb88aca9983141000000001976a9144d869697281ad18370313122795e56dfdc3a331388ac193f1c00", 172 Blocktime: 1583392607, 173 Txid: "f81c34b300961877328c3aaa7cd5e69068457868309fbf1e92544e3a6a915bcb", 174 LockTime: 1851161, 175 Version: 1, 176 Vin: []bchain.Vin{ 177 { 178 ScriptSig: bchain.ScriptSig{ 179 Hex: "47304402202341ac4297925257dc72eb418a069c45e76f7070340e27501f6308cc7eff45f802204a347915adceff5f6fc9b8075d95d47887d46b344c7bbc8066d315931b189ad001210228c2520812b7f8c63e7a088c61b6348b22fa0c98812e736a1fd896bc828d3c65", 180 }, 181 Txid: "3e2105ae47b46b53965538711d767a0144ac2141ed6f9656e591cd91fb22f4ae", 182 Vout: 0, 183 Sequence: 4294967294, 184 }, 185 }, 186 Vout: []bchain.Vout{ 187 { 188 ValueSat: *big.NewInt(1039221120), 189 N: 0, 190 ScriptPubKey: bchain.ScriptPubKey{ 191 Hex: "76a91478379ea136bb5783b675cd11e412bf0703995aeb88ac", 192 Addresses: []string{ 193 "ZnLWULVbAzjy1TSKxGnpkomeeaEDTHk5Nj", 194 }, 195 }, 196 }, 197 { 198 ValueSat: *big.NewInt(1093769385), 199 N: 1, 200 ScriptPubKey: bchain.ScriptPubKey{ 201 Hex: "76a9144d869697281ad18370313122795e56dfdc3a331388ac", 202 Addresses: []string{ 203 "ZiSn1vTSxGu2kFcnkjjm7bYGhT5BVAVfEG", 204 }, 205 }, 206 }, 207 }, 208 } 209 } 210 211 func Test_PackTx(t *testing.T) { 212 type args struct { 213 tx bchain.Tx 214 height uint32 215 blockTime int64 216 parser *BitZenyParser 217 } 218 tests := []struct { 219 name string 220 args args 221 want string 222 wantErr bool 223 }{ 224 { 225 name: "BitZeny-1", 226 args: args{ 227 tx: testTx1, 228 height: 1851162, 229 blockTime: 1583392607, 230 parser: NewBitZenyParser(GetChainParams("main"), &btc.Configuration{}), 231 }, 232 want: testTxPacked1, 233 wantErr: false, 234 }, 235 } 236 for _, tt := range tests { 237 t.Run(tt.name, func(t *testing.T) { 238 got, err := tt.args.parser.PackTx(&tt.args.tx, tt.args.height, tt.args.blockTime) 239 if (err != nil) != tt.wantErr { 240 t.Errorf("packTx() error = %v, wantErr %v", err, tt.wantErr) 241 return 242 } 243 h := hex.EncodeToString(got) 244 if !reflect.DeepEqual(h, tt.want) { 245 t.Errorf("packTx() = %v, want %v", h, tt.want) 246 } 247 }) 248 } 249 } 250 251 func Test_UnpackTx(t *testing.T) { 252 type args struct { 253 packedTx string 254 parser *BitZenyParser 255 } 256 tests := []struct { 257 name string 258 args args 259 want *bchain.Tx 260 want1 uint32 261 wantErr bool 262 }{ 263 { 264 name: "BitZeny-1", 265 args: args{ 266 packedTx: testTxPacked1, 267 parser: NewBitZenyParser(GetChainParams("main"), &btc.Configuration{}), 268 }, 269 want: &testTx1, 270 want1: 1851162, 271 wantErr: false, 272 }, 273 } 274 for _, tt := range tests { 275 t.Run(tt.name, func(t *testing.T) { 276 b, _ := hex.DecodeString(tt.args.packedTx) 277 got, got1, err := tt.args.parser.UnpackTx(b) 278 if (err != nil) != tt.wantErr { 279 t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr) 280 return 281 } 282 if !reflect.DeepEqual(got, tt.want) { 283 t.Errorf("unpackTx() got = %v, want %v", got, tt.want) 284 } 285 if got1 != tt.want1 { 286 t.Errorf("unpackTx() got1 = %v, want %v", got1, tt.want1) 287 } 288 }) 289 } 290 }