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  }