github.com/trezor/blockbook@v0.4.1-0.20240328132726-e9a08582ee2c/bchain/coins/snowgem/snowgemparser_test.go (about) 1 //go:build unittest 2 3 package snowgem 4 5 import ( 6 "bytes" 7 "encoding/hex" 8 "math/big" 9 "os" 10 "reflect" 11 "testing" 12 13 "github.com/trezor/blockbook/bchain" 14 "github.com/trezor/blockbook/bchain/coins/btc" 15 16 "github.com/martinboehm/btcutil/chaincfg" 17 ) 18 19 var ( 20 testTx1, testTx2 bchain.Tx 21 22 testTxPacked1 = "0a20241803e368d7459f31286a155191ee386896d366d57c19d8e67a8f040d6ff71f12f4010400008085202f890119950c49d69b37d5f4fbb390d852387559e6a6d3fce9f390a409e4acf3f06381020000006a4730440220452aedf599e575598eb36d27ed98a6d388efda6e9be2bab96f16d0644e7df3060220669f4f3a4976ed73fa3ca9ecaad84dcf6ec35099c3bad631499985ea6a378d19012102ed9fb7fb61ec514be890ab45a925d554ff12050f099514251d5ebe904accc93ffeffffff02d3d0a146000000001976a9141a78c04d87f553545ba225b7bc7a271731f659d688ac7c54ae02000000001976a914b86f4b063545ebc2e80522a59d2dd206b707401b88aca68d0e00c58d0e00000000000000000000000018aba4b8ed0520a69b3a28b19b3a32960112208163f0f3ace409a490f3e9fcd3a6e659753852d890b3fbf4d5379bd6490c95191802226a4730440220452aedf599e575598eb36d27ed98a6d388efda6e9be2bab96f16d0644e7df3060220669f4f3a4976ed73fa3ca9ecaad84dcf6ec35099c3bad631499985ea6a378d19012102ed9fb7fb61ec514be890ab45a925d554ff12050f099514251d5ebe904accc93f28feffffff0f3a460a0446a1d0d31a1976a9141a78c04d87f553545ba225b7bc7a271731f659d688ac2223733150636953644665724a78665673397451353571446f3839695676466f7162436a7a3a480a0402ae547c10011a1976a914b86f4b063545ebc2e80522a59d2dd206b707401b88ac22237331653177736d6f7955625673794b726745374b73714c5164374c6975596168526152" 23 testTxPacked2 = "0a2071dd4d998b0a711fe5ed21f8661ed27ca8b99afc488f5bbe149ec3c6492ec50312d2010400008085202f89017308714b21338783a435c5e420542a0f6243da5be6dc8bdf19e2d526a318d6a8000000006a47304402207ce5ebcb2dc5e8027b5d672babd2e6aaa186a917caf2b44eec63f7db16277b8b02207a89214d825fae08ebc86bca1f46579e770e830bd31b8101498207a2d901fd74012103c3fe8969a7b08f1d586a68da70d6aeff61aa3b4cbe7ca2cb5aae11529ca2af12feffffff014dd45023000000001976a914cef34ec02e80351cf4f9d63843fc79a77c9ab71888acaa8d0e00c98d0e00000000000000000000000018f9a6b8ed0520aa9b3a28b59b3a3294011220a8d618a326d5e219df8bdce65bda43620f2a5420e4c535a4838733214b710873226a47304402207ce5ebcb2dc5e8027b5d672babd2e6aaa186a917caf2b44eec63f7db16277b8b02207a89214d825fae08ebc86bca1f46579e770e830bd31b8101498207a2d901fd74012103c3fe8969a7b08f1d586a68da70d6aeff61aa3b4cbe7ca2cb5aae11529ca2af1228feffffff0f3a460a042350d44d1a1976a914cef34ec02e80351cf4f9d63843fc79a77c9ab71888ac2223733167347a74585446447751326b506253385431666755334c645075666376354d764d" 24 ) 25 26 func init() { 27 testTx1 = bchain.Tx{ 28 Hex: "0400008085202f890119950c49d69b37d5f4fbb390d852387559e6a6d3fce9f390a409e4acf3f06381020000006a4730440220452aedf599e575598eb36d27ed98a6d388efda6e9be2bab96f16d0644e7df3060220669f4f3a4976ed73fa3ca9ecaad84dcf6ec35099c3bad631499985ea6a378d19012102ed9fb7fb61ec514be890ab45a925d554ff12050f099514251d5ebe904accc93ffeffffff02d3d0a146000000001976a9141a78c04d87f553545ba225b7bc7a271731f659d688ac7c54ae02000000001976a914b86f4b063545ebc2e80522a59d2dd206b707401b88aca68d0e00c58d0e000000000000000000000000", 29 Blocktime: 1571689003, 30 Time: 1571689003, 31 Txid: "241803e368d7459f31286a155191ee386896d366d57c19d8e67a8f040d6ff71f", 32 LockTime: 953766, 33 Vin: []bchain.Vin{ 34 { 35 ScriptSig: bchain.ScriptSig{ 36 Hex: "4730440220452aedf599e575598eb36d27ed98a6d388efda6e9be2bab96f16d0644e7df3060220669f4f3a4976ed73fa3ca9ecaad84dcf6ec35099c3bad631499985ea6a378d19012102ed9fb7fb61ec514be890ab45a925d554ff12050f099514251d5ebe904accc93f", 37 }, 38 Txid: "8163f0f3ace409a490f3e9fcd3a6e659753852d890b3fbf4d5379bd6490c9519", 39 Vout: 2, 40 Sequence: 4294967294, 41 }, 42 }, 43 Vout: []bchain.Vout{ 44 { 45 ValueSat: *big.NewInt(1185009875), 46 N: 0, 47 ScriptPubKey: bchain.ScriptPubKey{ 48 Hex: "76a9141a78c04d87f553545ba225b7bc7a271731f659d688ac", 49 Addresses: []string{ 50 "s1PciSdFerJxfVs9tQ55qDo89iVvFoqbCjz", 51 }, 52 }, 53 }, 54 { 55 ValueSat: *big.NewInt(44979324), 56 N: 1, 57 ScriptPubKey: bchain.ScriptPubKey{ 58 Hex: "76a914b86f4b063545ebc2e80522a59d2dd206b707401b88ac", 59 Addresses: []string{ 60 "s1e1wsmoyUbVsyKrgE7KsqLQd7LiuYahRaR", 61 }, 62 }, 63 }, 64 }, 65 } 66 67 testTx2 = bchain.Tx{ 68 Hex: "0400008085202f89017308714b21338783a435c5e420542a0f6243da5be6dc8bdf19e2d526a318d6a8000000006a47304402207ce5ebcb2dc5e8027b5d672babd2e6aaa186a917caf2b44eec63f7db16277b8b02207a89214d825fae08ebc86bca1f46579e770e830bd31b8101498207a2d901fd74012103c3fe8969a7b08f1d586a68da70d6aeff61aa3b4cbe7ca2cb5aae11529ca2af12feffffff014dd45023000000001976a914cef34ec02e80351cf4f9d63843fc79a77c9ab71888acaa8d0e00c98d0e000000000000000000000000", 69 Blocktime: 1571689337, 70 Time: 1571689337, 71 Txid: "71dd4d998b0a711fe5ed21f8661ed27ca8b99afc488f5bbe149ec3c6492ec503", 72 LockTime: 953770, 73 Vin: []bchain.Vin{ 74 { 75 ScriptSig: bchain.ScriptSig{ 76 Hex: "47304402207ce5ebcb2dc5e8027b5d672babd2e6aaa186a917caf2b44eec63f7db16277b8b02207a89214d825fae08ebc86bca1f46579e770e830bd31b8101498207a2d901fd74012103c3fe8969a7b08f1d586a68da70d6aeff61aa3b4cbe7ca2cb5aae11529ca2af12", 77 }, 78 Txid: "a8d618a326d5e219df8bdce65bda43620f2a5420e4c535a4838733214b710873", 79 Vout: 0, 80 Sequence: 4294967294, 81 }, 82 }, 83 Vout: []bchain.Vout{ 84 { 85 ValueSat: *big.NewInt(592499789), 86 N: 0, 87 ScriptPubKey: bchain.ScriptPubKey{ 88 Hex: "76a914cef34ec02e80351cf4f9d63843fc79a77c9ab71888ac", 89 Addresses: []string{ 90 "s1g4ztXTFDwQ2kPbS8T1fgU3LdPufcv5MvM", 91 }, 92 }, 93 }, 94 }, 95 } 96 } 97 98 func TestMain(m *testing.M) { 99 c := m.Run() 100 chaincfg.ResetParams() 101 os.Exit(c) 102 } 103 104 func TestGetAddrDesc(t *testing.T) { 105 type args struct { 106 tx bchain.Tx 107 parser *SnowGemParser 108 } 109 tests := []struct { 110 name string 111 args args 112 }{ 113 { 114 name: "snowgem-1", 115 args: args{ 116 tx: testTx1, 117 parser: NewSnowGemParser(GetChainParams("main"), &btc.Configuration{}), 118 }, 119 }, 120 { 121 name: "snowgem-2", 122 args: args{ 123 tx: testTx2, 124 parser: NewSnowGemParser(GetChainParams("main"), &btc.Configuration{}), 125 }, 126 }, 127 } 128 for _, tt := range tests { 129 t.Run(tt.name, func(t *testing.T) { 130 for n, vout := range tt.args.tx.Vout { 131 got1, err := tt.args.parser.GetAddrDescFromVout(&vout) 132 if err != nil { 133 t.Errorf("getAddrDescFromVout() error = %v, vout = %d", err, n) 134 return 135 } 136 got2, err := tt.args.parser.GetAddrDescFromAddress(vout.ScriptPubKey.Addresses[0]) 137 if err != nil { 138 t.Errorf("getAddrDescFromAddress() error = %v, vout = %d", err, n) 139 return 140 } 141 if !bytes.Equal(got1, got2) { 142 t.Errorf("Address descriptors mismatch: got1 = %v, got2 = %v", got1, got2) 143 } 144 } 145 }) 146 } 147 } 148 149 func TestPackTx(t *testing.T) { 150 type args struct { 151 tx bchain.Tx 152 height uint32 153 blockTime int64 154 parser *SnowGemParser 155 } 156 tests := []struct { 157 name string 158 args args 159 want string 160 wantErr bool 161 }{ 162 { 163 name: "snowgem-1", 164 args: args{ 165 tx: testTx1, 166 height: 953777, 167 blockTime: 1571689003, 168 parser: NewSnowGemParser(GetChainParams("main"), &btc.Configuration{}), 169 }, 170 want: testTxPacked1, 171 wantErr: false, 172 }, 173 { 174 name: "snowgem-2", 175 args: args{ 176 tx: testTx2, 177 height: 953781, 178 blockTime: 1571689337, 179 parser: NewSnowGemParser(GetChainParams("main"), &btc.Configuration{}), 180 }, 181 want: testTxPacked2, 182 wantErr: false, 183 }, 184 } 185 for _, tt := range tests { 186 t.Run(tt.name, func(t *testing.T) { 187 got, err := tt.args.parser.PackTx(&tt.args.tx, tt.args.height, tt.args.blockTime) 188 if (err != nil) != tt.wantErr { 189 t.Errorf("packTx() error = %v, wantErr %v", err, tt.wantErr) 190 return 191 } 192 h := hex.EncodeToString(got) 193 if !reflect.DeepEqual(h, tt.want) { 194 t.Errorf("packTx() = %v, want %v", h, tt.want) 195 } 196 }) 197 } 198 } 199 200 func TestUnpackTx(t *testing.T) { 201 type args struct { 202 packedTx string 203 parser *SnowGemParser 204 } 205 tests := []struct { 206 name string 207 args args 208 want *bchain.Tx 209 want1 uint32 210 wantErr bool 211 }{ 212 { 213 name: "snowgem-1", 214 args: args{ 215 packedTx: testTxPacked1, 216 parser: NewSnowGemParser(GetChainParams("main"), &btc.Configuration{}), 217 }, 218 want: &testTx1, 219 want1: 953777, 220 wantErr: false, 221 }, 222 { 223 name: "snowgem-2", 224 args: args{ 225 packedTx: testTxPacked2, 226 parser: NewSnowGemParser(GetChainParams("main"), &btc.Configuration{}), 227 }, 228 want: &testTx2, 229 want1: 953781, 230 wantErr: false, 231 }, 232 } 233 for _, tt := range tests { 234 t.Run(tt.name, func(t *testing.T) { 235 b, _ := hex.DecodeString(tt.args.packedTx) 236 got, got1, err := tt.args.parser.UnpackTx(b) 237 if (err != nil) != tt.wantErr { 238 t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr) 239 return 240 } 241 if !reflect.DeepEqual(got, tt.want) { 242 t.Errorf("unpackTx() got = %v, want %v", got, tt.want) 243 } 244 if got1 != tt.want1 { 245 t.Errorf("unpackTx() got1 = %v, want %v", got1, tt.want1) 246 } 247 }) 248 } 249 }