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