atomicswap_test.gno
16.47 Kb ยท 467 lines
1package atomicswap
2
3import (
4 "crypto/sha256"
5 "encoding/hex"
6 "std"
7 "testing"
8 "time"
9
10 "gno.land/p/demo/avl"
11 "gno.land/p/demo/testutils"
12 "gno.land/p/demo/uassert"
13 "gno.land/r/demo/tests/test20"
14)
15
16var testRun bool
17
18func crossThrough(rlm std.Realm, cr func()) {
19 testing.SetRealm(rlm)
20 cr()
21}
22
23func TestNewCustomCoinSwap_Claim(cur realm, t *testing.T) {
24 defer resetTestState()
25
26 // Setup
27 pkgAddr := std.DerivePkgAddr("gno.land/r/demo/atomicswap")
28 sender := testutils.TestAddress("sender1")
29 recipient := testutils.TestAddress("recipient1")
30 amount := std.Coins{{Denom: "ugnot", Amount: 1}}
31 hashlock := sha256.Sum256([]byte("secret"))
32 hashlockHex := hex.EncodeToString(hashlock[:])
33 timelock := time.Now().Add(1 * time.Hour)
34 testing.IssueCoins(pkgAddr, std.Coins{{"ugnot", 100000000}})
35
36 // Create a new swap
37 testing.SetRealm(std.NewUserRealm(sender))
38 testing.SetOriginSend(amount)
39 id, swap := NewCustomCoinSwap(cross, recipient, hashlockHex, timelock)
40 uassert.Equal(t, 1, id)
41
42 expected := `- status: active
43- sender: g1wdjkuer9wgc47h6lta047h6lta047h6l56jtjc
44- recipient: g1wfjkx6tsd9jkuap3ta047h6lta047h6lkk20gv
45- amount: 1ugnot
46- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
47- timelock: 2009-02-14T00:31:30Z
48- remaining: 1h0m0s`
49 uassert.Equal(t, expected, swap.String())
50 uassert.Equal(t, expected, Render("1"))
51
52 // Test initial state
53 uassert.Equal(t, sender, swap.sender, "expected sender to match")
54 uassert.Equal(t, recipient, swap.recipient, "expected recipient to match")
55 uassert.Equal(t, swap.amountStr, amount.String(), "expected amount to match")
56 uassert.Equal(t, hashlockHex, swap.hashlock, "expected hashlock to match")
57 uassert.True(t, swap.timelock.Equal(timelock), "expected timelock to match")
58 uassert.False(t, swap.claimed, "expected claimed to be false")
59 uassert.False(t, swap.refunded, "expected refunded to be false")
60
61 // Test claim
62 testing.SetRealm(std.NewUserRealm(recipient))
63 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
64 uassert.PanicsWithMessage(t, "invalid preimage", func() { swap.Claim("invalid") })
65 })
66
67 testing.SetRealm(std.NewUserRealm(recipient))
68 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
69 swap.Claim("secret")
70 uassert.True(t, swap.claimed, "expected claimed to be true")
71 })
72
73 // Test refund (should fail because already claimed)
74 uassert.PanicsWithMessage(t, "already claimed", swap.Refund)
75 uassert.PanicsWithMessage(t, "already claimed", func() { swap.Claim("secret") })
76
77 expected = `- status: claimed
78- sender: g1wdjkuer9wgc47h6lta047h6lta047h6l56jtjc
79- recipient: g1wfjkx6tsd9jkuap3ta047h6lta047h6lkk20gv
80- amount: 1ugnot
81- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
82- timelock: 2009-02-14T00:31:30Z
83- remaining: 1h0m0s`
84 uassert.Equal(t, expected, swap.String())
85 uassert.Equal(t, expected, Render("1"))
86}
87
88func TestNewCustomCoinSwap_Refund(cur realm, t *testing.T) {
89 defer resetTestState()
90
91 // Setup
92 pkgAddr := std.DerivePkgAddr("gno.land/r/demo/atomicswap")
93 sender := testutils.TestAddress("sender2")
94 recipient := testutils.TestAddress("recipient2")
95 amount := std.Coins{{Denom: "ugnot", Amount: 1}}
96 hashlock := sha256.Sum256([]byte("secret"))
97 hashlockHex := hex.EncodeToString(hashlock[:])
98 timelock := time.Now().Add(1 * time.Hour)
99
100 // Create a new swap
101 testing.SetRealm(std.NewUserRealm(sender))
102 testing.SetOriginSend(amount)
103 id, swap := NewCustomCoinSwap(cross, recipient, hashlockHex, timelock) // Create a new swap
104 uassert.Equal(t, 1, id)
105
106 expected := `- status: active
107- sender: g1wdjkuer9wge97h6lta047h6lta047h6ltfacad
108- recipient: g1wfjkx6tsd9jkuapjta047h6lta047h6lducc3v
109- amount: 1ugnot
110- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
111- timelock: 2009-02-14T00:31:30Z
112- remaining: 1h0m0s`
113 uassert.Equal(t, expected, swap.String())
114 uassert.Equal(t, expected, Render("1"))
115
116 // Test Refund
117 //testing.SetRealm(std.NewUserRealm(recipient))
118 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
119 testing.IssueCoins(pkgAddr, std.Coins{{"ugnot", 100000000}})
120 uassert.PanicsWithMessage(t, "timelock not expired", swap.Refund)
121 })
122 swap.timelock = time.Now().Add(-1 * time.Hour) // override timelock
123 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
124 swap.Refund()
125 uassert.True(t, swap.refunded, "expected refunded to be true")
126 })
127 expected = `- status: refunded
128- sender: g1wdjkuer9wge97h6lta047h6lta047h6ltfacad
129- recipient: g1wfjkx6tsd9jkuapjta047h6lta047h6lducc3v
130- amount: 1ugnot
131- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
132- timelock: 2009-02-13T22:31:30Z
133- remaining: 0s`
134 uassert.Equal(t, expected, swap.String())
135 uassert.Equal(t, expected, Render("1"))
136}
137
138func TestNewCustomGRC20Swap_Claim(t *testing.T) {
139 defer resetTestState()
140
141 // Setup
142 sender := testutils.TestAddress("sender3")
143 recipient := testutils.TestAddress("recipient3")
144 rlm := std.DerivePkgAddr("gno.land/r/demo/atomicswap")
145 hashlock := sha256.Sum256([]byte("secret"))
146 hashlockHex := hex.EncodeToString(hashlock[:])
147 timelock := time.Now().Add(1 * time.Hour)
148
149 test20.PrivateLedger.Mint(sender, 100_000)
150 test20.PrivateLedger.Approve(sender, rlm, 70_000)
151
152 // Create a new swap
153 testing.SetRealm(std.NewUserRealm(sender))
154 id, swap := NewCustomGRC20Swap(cross, recipient, hashlockHex, timelock, test20.Token)
155 uassert.Equal(t, 1, id)
156
157 expected := `- status: active
158- sender: g1wdjkuer9wge47h6lta047h6lta047h6l5rk38l
159- recipient: g1wfjkx6tsd9jkuapnta047h6lta047h6ly6k4pv
160- amount: 70000TST
161- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
162- timelock: 2009-02-14T00:31:30Z
163- remaining: 1h0m0s`
164
165 uassert.Equal(t, expected, swap.String())
166 uassert.Equal(t, expected, Render("1"))
167
168 // Test initial state
169 uassert.Equal(t, sender, swap.sender, "expected sender to match")
170 uassert.Equal(t, recipient, swap.recipient, "expected recipient to match")
171 bal := test20.Token.BalanceOf(sender)
172 uassert.Equal(t, bal, int64(30_000))
173 bal = test20.Token.BalanceOf(rlm)
174 uassert.Equal(t, bal, int64(70_000))
175 bal = test20.Token.BalanceOf(recipient)
176 uassert.Equal(t, bal, int64(0))
177
178 // uassert.Equal(t, swap.amountStr, amount.String(), "expected amount to match")
179 uassert.Equal(t, hashlockHex, swap.hashlock, "expected hashlock to match")
180 uassert.True(t, swap.timelock.Equal(timelock), "expected timelock to match")
181 uassert.False(t, swap.claimed, "expected claimed to be false")
182 uassert.False(t, swap.refunded, "expected refunded to be false")
183
184 // Test claim
185 testing.SetRealm(std.NewUserRealm(recipient))
186 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
187 uassert.PanicsWithMessage(t, "invalid preimage", func() { swap.Claim("invalid") })
188 })
189
190 testing.SetRealm(std.NewUserRealm(recipient))
191 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
192 swap.Claim("secret")
193 uassert.True(t, swap.claimed, "expected claimed to be true")
194 })
195
196 bal = test20.Token.BalanceOf(sender)
197 uassert.Equal(t, bal, int64(30_000))
198 bal = test20.Token.BalanceOf(rlm)
199 uassert.Equal(t, bal, int64(0))
200 bal = test20.Token.BalanceOf(recipient)
201 uassert.Equal(t, bal, int64(70_000))
202
203 // Test refund (should fail because already claimed)
204 uassert.PanicsWithMessage(t, "already claimed", swap.Refund)
205 uassert.PanicsWithMessage(t, "already claimed", func() { swap.Claim("secret") })
206
207 expected = `- status: claimed
208- sender: g1wdjkuer9wge47h6lta047h6lta047h6l5rk38l
209- recipient: g1wfjkx6tsd9jkuapnta047h6lta047h6ly6k4pv
210- amount: 70000TST
211- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
212- timelock: 2009-02-14T00:31:30Z
213- remaining: 1h0m0s`
214 uassert.Equal(t, expected, swap.String())
215 uassert.Equal(t, expected, Render("1"))
216}
217
218func TestNewCustomGRC20Swap_Refund(t *testing.T) {
219 defer resetTestState()
220
221 // Setup
222 pkgAddr := std.DerivePkgAddr("gno.land/r/demo/atomicswap")
223 sender := testutils.TestAddress("sender5")
224 recipient := testutils.TestAddress("recipient5")
225 rlm := std.DerivePkgAddr("gno.land/r/demo/atomicswap")
226 hashlock := sha256.Sum256([]byte("secret"))
227 hashlockHex := hex.EncodeToString(hashlock[:])
228 timelock := time.Now().Add(1 * time.Hour)
229
230 test20.PrivateLedger.Mint(sender, 100_000)
231 test20.PrivateLedger.Approve(sender, rlm, 70_000)
232
233 // Create a new swap
234 testing.SetRealm(std.NewUserRealm(sender))
235 id, swap := NewCustomGRC20Swap(cross, recipient, hashlockHex, timelock, test20.Token)
236 uassert.Equal(t, 1, id)
237
238 expected := `- status: active
239- sender: g1wdjkuer9wg647h6lta047h6lta047h6l5p6k3k
240- recipient: g1wfjkx6tsd9jkuap4ta047h6lta047h6lmwmj6v
241- amount: 70000TST
242- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
243- timelock: 2009-02-14T00:31:30Z
244- remaining: 1h0m0s`
245 uassert.Equal(t, expected, swap.String())
246 uassert.Equal(t, expected, Render("1"))
247
248 // Test initial state
249 uassert.Equal(t, sender, swap.sender, "expected sender to match")
250 uassert.Equal(t, recipient, swap.recipient, "expected recipient to match")
251 bal := test20.Token.BalanceOf(sender)
252 uassert.Equal(t, bal, int64(30_000))
253 bal = test20.Token.BalanceOf(rlm)
254 uassert.Equal(t, bal, int64(70_000))
255 bal = test20.Token.BalanceOf(recipient)
256 uassert.Equal(t, bal, int64(0))
257
258 // Test Refund
259 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
260 testing.IssueCoins(pkgAddr, std.Coins{{"ugnot", 100000000}})
261 uassert.PanicsWithMessage(t, "timelock not expired", swap.Refund)
262 })
263
264 swap.timelock = time.Now().Add(-1 * time.Hour) // override timelock
265 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
266 swap.Refund()
267 uassert.True(t, swap.refunded, "expected refunded to be true")
268 })
269
270 bal = test20.Token.BalanceOf(sender)
271 uassert.Equal(t, bal, int64(100_000))
272 bal = test20.Token.BalanceOf(rlm)
273 uassert.Equal(t, bal, int64(0))
274 bal = test20.Token.BalanceOf(recipient)
275 uassert.Equal(t, bal, int64(0))
276
277 expected = `- status: refunded
278- sender: g1wdjkuer9wg647h6lta047h6lta047h6l5p6k3k
279- recipient: g1wfjkx6tsd9jkuap4ta047h6lta047h6lmwmj6v
280- amount: 70000TST
281- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
282- timelock: 2009-02-13T22:31:30Z
283- remaining: 0s`
284 uassert.Equal(t, expected, swap.String())
285 uassert.Equal(t, expected, Render("1"))
286}
287
288func TestNewGRC20Swap_Claim(t *testing.T) {
289 defer resetTestState()
290
291 // Setup
292 sender := testutils.TestAddress("sender4")
293 recipient := testutils.TestAddress("recipient4")
294 rlm := std.DerivePkgAddr("gno.land/r/demo/atomicswap")
295 hashlock := sha256.Sum256([]byte("secret"))
296 hashlockHex := hex.EncodeToString(hashlock[:])
297 timelock := time.Now().Add(defaultTimelockDuration)
298
299 test20.PrivateLedger.Mint(sender, 100_000)
300 test20.PrivateLedger.Approve(sender, rlm, 70_000)
301
302 // Create a new swap
303 testing.SetRealm(std.NewUserRealm(sender))
304 id, swap := NewGRC20Swap(cross, recipient, hashlockHex, "gno.land/r/demo/tests/test20")
305 uassert.Equal(t, 1, id)
306
307 expected := `- status: active
308- sender: g1wdjkuer9wg697h6lta047h6lta047h6ltt3lty
309- recipient: g1wfjkx6tsd9jkuap5ta047h6lta047h6ljg4l2v
310- amount: 70000TST
311- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
312- timelock: 2009-02-20T23:31:30Z
313- remaining: 168h0m0s`
314 uassert.Equal(t, expected, swap.String())
315 uassert.Equal(t, expected, Render("1"))
316
317 // Test initial state
318 uassert.Equal(t, sender, swap.sender, "expected sender to match")
319 uassert.Equal(t, recipient, swap.recipient, "expected recipient to match")
320 bal := test20.Token.BalanceOf(sender)
321 uassert.Equal(t, bal, int64(30_000))
322 bal = test20.Token.BalanceOf(rlm)
323 uassert.Equal(t, bal, int64(70_000))
324 bal = test20.Token.BalanceOf(recipient)
325 uassert.Equal(t, bal, int64(0))
326
327 // uassert.Equal(t, swap.amountStr, amount.String(), "expected amount to match")
328 uassert.Equal(t, hashlockHex, swap.hashlock, "expected hashlock to match")
329 uassert.True(t, swap.timelock.Equal(timelock), "expected timelock to match")
330 uassert.False(t, swap.claimed, "expected claimed to be false")
331 uassert.False(t, swap.refunded, "expected refunded to be false")
332
333 // Test claim
334 testing.SetRealm(std.NewUserRealm(recipient))
335 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
336 uassert.PanicsWithMessage(t, "invalid preimage", func() { swap.Claim("invalid") })
337 swap.Claim("secret")
338 uassert.True(t, swap.claimed, "expected claimed to be true")
339 })
340
341 bal = test20.Token.BalanceOf(sender)
342 uassert.Equal(t, int64(30_000), bal)
343 bal = test20.Token.BalanceOf(rlm)
344 uassert.Equal(t, int64(0), bal)
345 bal = test20.Token.BalanceOf(recipient)
346 uassert.Equal(t, int64(70_000), bal)
347
348 // Test refund (should fail because already claimed)
349 uassert.PanicsWithMessage(t, "already claimed", swap.Refund)
350 uassert.PanicsWithMessage(t, "already claimed", func() { swap.Claim("secret") })
351
352 expected = `- status: claimed
353- sender: g1wdjkuer9wg697h6lta047h6lta047h6ltt3lty
354- recipient: g1wfjkx6tsd9jkuap5ta047h6lta047h6ljg4l2v
355- amount: 70000TST
356- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
357- timelock: 2009-02-20T23:31:30Z
358- remaining: 168h0m0s`
359 uassert.Equal(t, expected, swap.String())
360 uassert.Equal(t, expected, Render("1"))
361}
362
363func TestNewGRC20Swap_Refund(t *testing.T) {
364 defer resetTestState()
365
366 // Setup
367 pkgAddr := std.DerivePkgAddr("gno.land/r/demo/atomicswap")
368 sender := testutils.TestAddress("sender6")
369 recipient := testutils.TestAddress("recipient6")
370 rlm := std.DerivePkgAddr("gno.land/r/demo/atomicswap")
371 hashlock := sha256.Sum256([]byte("secret"))
372 hashlockHex := hex.EncodeToString(hashlock[:])
373
374 test20.PrivateLedger.Mint(sender, 100_000)
375 test20.PrivateLedger.Approve(sender, rlm, 70_000)
376
377 // Create a new swap
378 testing.SetRealm(std.NewUserRealm(sender))
379 id, swap := NewGRC20Swap(cross, recipient, hashlockHex, "gno.land/r/demo/tests/test20")
380 uassert.Equal(t, 1, id)
381
382 expected := `- status: active
383- sender: g1wdjkuer9wgm97h6lta047h6lta047h6ltj497r
384- recipient: g1wfjkx6tsd9jkuapkta047h6lta047h6lqyf9rv
385- amount: 70000TST
386- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
387- timelock: 2009-02-20T23:31:30Z
388- remaining: 168h0m0s`
389 uassert.Equal(t, expected, swap.String())
390 uassert.Equal(t, expected, Render("1"))
391
392 // Test initial state
393 uassert.Equal(t, sender, swap.sender, "expected sender to match")
394 uassert.Equal(t, recipient, swap.recipient, "expected recipient to match")
395 bal := test20.Token.BalanceOf(sender)
396 uassert.Equal(t, bal, int64(30_000))
397 bal = test20.Token.BalanceOf(rlm)
398 uassert.Equal(t, bal, int64(70_000))
399 bal = test20.Token.BalanceOf(recipient)
400 uassert.Equal(t, bal, int64(0))
401
402 // Test Refund
403 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
404 testing.IssueCoins(pkgAddr, std.Coins{{"ugnot", 100000000}})
405 uassert.PanicsWithMessage(t, "timelock not expired", swap.Refund)
406 })
407
408 swap.timelock = time.Now().Add(-1 * time.Hour) // override timelock
409 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
410 swap.Refund()
411 uassert.True(t, swap.refunded, "expected refunded to be true")
412 })
413
414 bal = test20.Token.BalanceOf(sender)
415 uassert.Equal(t, bal, int64(100_000))
416 bal = test20.Token.BalanceOf(rlm)
417 uassert.Equal(t, bal, int64(0))
418 bal = test20.Token.BalanceOf(recipient)
419 uassert.Equal(t, bal, int64(0))
420
421 expected = `- status: refunded
422- sender: g1wdjkuer9wgm97h6lta047h6lta047h6ltj497r
423- recipient: g1wfjkx6tsd9jkuapkta047h6lta047h6lqyf9rv
424- amount: 70000TST
425- hashlock: 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b
426- timelock: 2009-02-13T22:31:30Z
427- remaining: 0s`
428 uassert.Equal(t, expected, swap.String())
429 uassert.Equal(t, expected, Render("1"))
430}
431
432func TestRender(t *testing.T) {
433 defer resetTestState()
434
435 // Setup
436 alice := testutils.TestAddress("alice")
437 bob := testutils.TestAddress("bob")
438 charly := testutils.TestAddress("charly")
439 rlm := std.DerivePkgAddr("gno.land/r/demo/atomicswap")
440 hashlock := sha256.Sum256([]byte("secret"))
441 hashlockHex := hex.EncodeToString(hashlock[:])
442 timelock := time.Now().Add(1 * time.Hour)
443
444 test20.PrivateLedger.Mint(alice, 100_000)
445 testing.SetRealm(std.NewUserRealm(alice))
446
447 userTeller := test20.Token.RealmTeller()
448 userTeller.Approve(rlm, 10_000)
449 _, bobSwap := NewCustomGRC20Swap(cross, bob, hashlockHex, timelock, test20.Token)
450
451 userTeller.Approve(rlm, 20_000)
452 _, _ = NewCustomGRC20Swap(cross, charly, hashlockHex, timelock, test20.Token)
453
454 testing.SetRealm(std.NewUserRealm(bob))
455 crossThrough(std.NewCodeRealm("gno.land/r/atomicswap/test"), func() {
456 bobSwap.Claim("secret")
457 expected := `- 2: g1v9kxjcm9ta047h6lta047h6lta047h6lzd40gh -(20000TST)> g1vd5xzunv09047h6lta047h6lta047h6lhsyveh - active
458- 1: g1v9kxjcm9ta047h6lta047h6lta047h6lzd40gh -(10000TST)> g1vfhkyh6lta047h6lta047h6lta047h6l03vdhu - claimed
459`
460 uassert.Equal(t, expected, Render(""))
461 })
462}
463
464func resetTestState() {
465 swaps = avl.Tree{}
466 counter = 0
467}