decred.org/dcrdex@v1.0.5/dex/networks/eth/txdata_test.go (about)

     1  package eth
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/hex"
     6  	"math/big"
     7  	"testing"
     8  	"time"
     9  
    10  	swapv0 "decred.org/dcrdex/dex/networks/eth/contracts/v0"
    11  	"github.com/ethereum/go-ethereum/common"
    12  )
    13  
    14  func packInitiateDataV0(initiations []*Initiation) ([]byte, error) {
    15  	abiInitiations := make([]swapv0.ETHSwapInitiation, 0, len(initiations))
    16  	for _, init := range initiations {
    17  		abiInitiations = append(abiInitiations, swapv0.ETHSwapInitiation{
    18  			RefundTimestamp: big.NewInt(init.LockTime.Unix()),
    19  			SecretHash:      init.SecretHash,
    20  			Participant:     init.Participant,
    21  			Value:           init.Value,
    22  		})
    23  	}
    24  	return (*ABIs[0]).Pack("initiate", abiInitiations)
    25  }
    26  
    27  func packRedeemDataV0(redemptions []*Redemption) ([]byte, error) {
    28  	abiRedemptions := make([]swapv0.ETHSwapRedemption, 0, len(redemptions))
    29  	for _, redeem := range redemptions {
    30  		abiRedemptions = append(abiRedemptions, swapv0.ETHSwapRedemption{
    31  			Secret:     redeem.Secret,
    32  			SecretHash: redeem.SecretHash,
    33  		})
    34  	}
    35  	return (*ABIs[0]).Pack("redeem", abiRedemptions)
    36  }
    37  
    38  func packRefundDataV0(secretHash [32]byte) ([]byte, error) {
    39  	return (*ABIs[0]).Pack("refund", secretHash)
    40  }
    41  
    42  func mustParseHex(s string) []byte {
    43  	b, err := hex.DecodeString(s)
    44  	if err != nil {
    45  		panic(err)
    46  	}
    47  	return b
    48  }
    49  
    50  func initiationsAreEqual(a, b *Initiation) bool {
    51  	return a.LockTime == b.LockTime &&
    52  		a.SecretHash == b.SecretHash &&
    53  		a.Participant == b.Participant &&
    54  		a.Value.Cmp(b.Value) == 0
    55  }
    56  
    57  func TestParseInitiateDataV0(t *testing.T) {
    58  	participantAddr := common.HexToAddress("345853e21b1d475582E71cC269124eD5e2dD3422")
    59  	var secretHashA [32]byte
    60  	var secretHashB [32]byte
    61  	copy(secretHashA[:], mustParseHex("99d971975c09331eb00f5e0dc1eaeca9bf4ee2d086d3fe1de489f920007d6546"))
    62  	copy(secretHashB[:], mustParseHex("2c0a304c9321402dc11cbb5898b9f2af3029ce1c76ec6702c4cd5bb965fd3e73"))
    63  
    64  	locktime := int64(1632112916)
    65  
    66  	initiations := []*Initiation{
    67  		{
    68  			LockTime:    time.Unix(locktime, 0),
    69  			SecretHash:  secretHashA,
    70  			Participant: participantAddr,
    71  			Value:       GweiToWei(1),
    72  		},
    73  		{
    74  			LockTime:    time.Unix(locktime, 0),
    75  			SecretHash:  secretHashB,
    76  			Participant: participantAddr,
    77  			Value:       GweiToWei(1),
    78  		},
    79  	}
    80  	calldata, err := packInitiateDataV0(initiations)
    81  	if err != nil {
    82  		t.Fatalf("failed to pack abi: %v", err)
    83  	}
    84  	initiateCalldata := mustParseHex("a8793f940000000000000000000000" +
    85  		"00000000000000000000000000000000000000002000000000000000000" +
    86  		"00000000000000000000000000000000000000000000002000000000000" +
    87  		"000000000000000000000000000000000000000000006148111499d9719" +
    88  		"75c09331eb00f5e0dc1eaeca9bf4ee2d086d3fe1de489f920007d654600" +
    89  		"0000000000000000000000345853e21b1d475582e71cc269124ed5e2dd3" +
    90  		"42200000000000000000000000000000000000000000000000000000000" +
    91  		"3b9aca00000000000000000000000000000000000000000000000000000" +
    92  		"00000614811142c0a304c9321402dc11cbb5898b9f2af3029ce1c76ec67" +
    93  		"02c4cd5bb965fd3e73000000000000000000000000345853e21b1d47558" +
    94  		"2e71cc269124ed5e2dd3422000000000000000000000000000000000000" +
    95  		"000000000000000000003b9aca00")
    96  
    97  	if !bytes.Equal(calldata, initiateCalldata) {
    98  		t.Fatalf("packed calldata is different than expected")
    99  	}
   100  
   101  	redeemCalldata := mustParseHex("f4fd17f9000000000000000000000000000000000" +
   102  		"000000000000000000000000000002000000000000000000000000000000000000" +
   103  		"0000000000000000000000000000287eac09638c0c38b4e735b79f053cb869167e" +
   104  		"e770640ac5df5c4ab030813122aebdc4c31b88d0c8f4d644591a8e00e92b607f92" +
   105  		"0ad8050deb7c7469767d9c5612c0a304c9321402dc11cbb5898b9f2af3029ce1c7" +
   106  		"6ec6702c4cd5bb965fd3e7399d971975c09331eb00f5e0dc1eaeca9bf4ee2d086d" +
   107  		"3fe1de489f920007d6546")
   108  
   109  	tests := []struct {
   110  		name     string
   111  		calldata []byte
   112  		wantErr  bool
   113  	}{{
   114  		name:     "ok",
   115  		calldata: calldata,
   116  	}, {
   117  		name:     "unable to parse call data",
   118  		calldata: calldata[1:],
   119  		wantErr:  true,
   120  	}, {
   121  		name:     "wrong function name",
   122  		calldata: redeemCalldata,
   123  		wantErr:  true,
   124  	}}
   125  
   126  	for _, test := range tests {
   127  		parsedInitiations, err := ParseInitiateData(test.calldata, 0)
   128  		if test.wantErr {
   129  			if err == nil {
   130  				t.Fatalf("expected error for test %q", test.name)
   131  			}
   132  			continue
   133  		}
   134  		if err != nil {
   135  			t.Fatalf("unexpected error for test %q: %v", test.name, err)
   136  		}
   137  
   138  		if len(parsedInitiations) != len(initiations) {
   139  			t.Fatalf("expected %d initiations but got %d", len(initiations), len(parsedInitiations))
   140  		}
   141  
   142  		for _, init := range initiations {
   143  			if !initiationsAreEqual(parsedInitiations[init.SecretHash], init) {
   144  				t.Fatalf("expected initiations to be equal. original: %v, parsed: %v",
   145  					init, parsedInitiations[init.SecretHash])
   146  			}
   147  		}
   148  	}
   149  }
   150  
   151  func redemptionsAreEqual(a, b *Redemption) bool {
   152  	return a.SecretHash == b.SecretHash &&
   153  		a.Secret == b.Secret
   154  }
   155  
   156  func TestParseRedeemDataV0(t *testing.T) {
   157  	secretHashA, secretA, secretHashB, secretB := [32]byte{}, [32]byte{}, [32]byte{}, [32]byte{}
   158  	copy(secretHashA[:], mustParseHex("ebdc4c31b88d0c8f4d644591a8e00e92b607f920ad8050deb7c7469767d9c561"))
   159  	copy(secretA[:], mustParseHex("87eac09638c0c38b4e735b79f053cb869167ee770640ac5df5c4ab030813122a"))
   160  	copy(secretHashB[:], mustParseHex("99d971975c09331eb00f5e0dc1eaeca9bf4ee2d086d3fe1de489f920007d6546"))
   161  	copy(secretB[:], mustParseHex("2c0a304c9321402dc11cbb5898b9f2af3029ce1c76ec6702c4cd5bb965fd3e73"))
   162  
   163  	redemptions := []*Redemption{
   164  		{
   165  			Secret:     secretA,
   166  			SecretHash: secretHashA,
   167  		},
   168  		{
   169  			Secret:     secretB,
   170  			SecretHash: secretHashB,
   171  		},
   172  	}
   173  	calldata, err := packRedeemDataV0(redemptions)
   174  	if err != nil {
   175  		t.Fatalf("failed to pack abi: %v", err)
   176  	}
   177  	redeemCallData := mustParseHex("f4fd17f9000000000000000000000000000000000" +
   178  		"000000000000000000000000000002000000000000000000000000000000000000" +
   179  		"0000000000000000000000000000287eac09638c0c38b4e735b79f053cb869167e" +
   180  		"e770640ac5df5c4ab030813122aebdc4c31b88d0c8f4d644591a8e00e92b607f92" +
   181  		"0ad8050deb7c7469767d9c5612c0a304c9321402dc11cbb5898b9f2af3029ce1c7" +
   182  		"6ec6702c4cd5bb965fd3e7399d971975c09331eb00f5e0dc1eaeca9bf4ee2d086d" +
   183  		"3fe1de489f920007d6546")
   184  
   185  	if !bytes.Equal(calldata, redeemCallData) {
   186  		t.Fatalf("packed calldata is different than expected")
   187  	}
   188  
   189  	initiateCalldata := mustParseHex("a8793f94000000000000000000000" +
   190  		"0000000000000000000000000000000000000000020000000000000000" +
   191  		"0000000000000000000000000000000000000000000000002000000000" +
   192  		"000000000000000000000000000000000000000000000006148111499d" +
   193  		"971975c09331eb00f5e0dc1eaeca9bf4ee2d086d3fe1de489f920007d6" +
   194  		"546000000000000000000000000345853e21b1d475582e71cc269124ed" +
   195  		"5e2dd34220000000000000000000000000000000000000000000000000" +
   196  		"0000000000000010000000000000000000000000000000000000000000" +
   197  		"0000000000000614811142c0a304c9321402dc11cbb5898b9f2af3029c" +
   198  		"e1c76ec6702c4cd5bb965fd3e73000000000000000000000000345853e" +
   199  		"21b1d475582e71cc269124ed5e2dd34220000000000000000000000000" +
   200  		"000000000000000000000000000000000000001")
   201  
   202  	tests := []struct {
   203  		name     string
   204  		calldata []byte
   205  		wantErr  bool
   206  	}{{
   207  		name:     "ok",
   208  		calldata: calldata,
   209  	}, {
   210  		name:     "unable to parse call data",
   211  		calldata: calldata[1:],
   212  		wantErr:  true,
   213  	}, {
   214  		name:     "wrong function name",
   215  		calldata: initiateCalldata,
   216  		wantErr:  true,
   217  	}}
   218  
   219  	for _, test := range tests {
   220  		parsedRedemptions, err := ParseRedeemData(test.calldata, 0)
   221  		if test.wantErr {
   222  			if err == nil {
   223  				t.Fatalf("expected error for test %q", test.name)
   224  			}
   225  			continue
   226  		}
   227  		if err != nil {
   228  			t.Fatalf("unexpected error for test %q: %v", test.name, err)
   229  		}
   230  
   231  		if len(redemptions) != len(parsedRedemptions) {
   232  			t.Fatalf("expected %d redemptions but got %d", len(redemptions), len(parsedRedemptions))
   233  		}
   234  
   235  		for _, redemption := range redemptions {
   236  			if !redemptionsAreEqual(redemption, parsedRedemptions[redemption.SecretHash]) {
   237  				t.Fatalf("expected redemptions to be equal. original: %v, parsed: %v",
   238  					redemption, parsedRedemptions[redemption.SecretHash])
   239  			}
   240  		}
   241  	}
   242  }
   243  
   244  func TestParseRefundDataV0(t *testing.T) {
   245  	var secretHash [32]byte
   246  	copy(secretHash[:], mustParseHex("ebdc4c31b88d0c8f4d644591a8e00e92b607f920ad8050deb7c7469767d9c561"))
   247  
   248  	calldata, err := packRefundDataV0(secretHash)
   249  	if err != nil {
   250  		t.Fatalf("failed to pack abi: %v", err)
   251  	}
   252  
   253  	refundCallData := mustParseHex("7249fbb6ebdc4c31b88d0c8f4d644591a8e00e92b607f920ad8050deb7c7469767d9c561")
   254  
   255  	if !bytes.Equal(calldata, refundCallData) {
   256  		t.Fatalf("packed calldata is different than expected")
   257  	}
   258  
   259  	redeemCallData := mustParseHex("f4fd17f9000000000000000000000000000000000" +
   260  		"000000000000000000000000000002000000000000000000000000000000000000" +
   261  		"0000000000000000000000000000287eac09638c0c38b4e735b79f053cb869167e" +
   262  		"e770640ac5df5c4ab030813122aebdc4c31b88d0c8f4d644591a8e00e92b607f92" +
   263  		"0ad8050deb7c7469767d9c5612c0a304c9321402dc11cbb5898b9f2af3029ce1c7" +
   264  		"6ec6702c4cd5bb965fd3e7399d971975c09331eb00f5e0dc1eaeca9bf4ee2d086d" +
   265  		"3fe1de489f920007d6546")
   266  
   267  	tests := []struct {
   268  		name     string
   269  		calldata []byte
   270  		wantErr  bool
   271  	}{{
   272  		name:     "ok",
   273  		calldata: calldata,
   274  	}, {
   275  		name:     "unable to parse call data",
   276  		calldata: calldata[1:],
   277  		wantErr:  true,
   278  	}, {
   279  		name:     "wrong function name",
   280  		calldata: redeemCallData,
   281  		wantErr:  true,
   282  	}}
   283  
   284  	for _, test := range tests {
   285  		parsedSecretHash, err := ParseRefundData(test.calldata, 0)
   286  		if test.wantErr {
   287  			if err == nil {
   288  				t.Fatalf("expected error for test %q", test.name)
   289  			}
   290  			continue
   291  		}
   292  		if err != nil {
   293  			t.Fatalf("unexpected error for test %q: %v", test.name, err)
   294  		}
   295  
   296  		if secretHash != parsedSecretHash {
   297  			t.Fatalf("expected secretHash %x to equal parsed secret hash %x",
   298  				secretHash, parsedSecretHash)
   299  		}
   300  	}
   301  }