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 }