Skip to content

Commit 20dd6e8

Browse files
committed
Added surcharge to swap contract
1 parent 82574bf commit 20dd6e8

File tree

5 files changed

+149
-74
lines changed

5 files changed

+149
-74
lines changed

packages/contracts/nft-swap/Swap.data.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ export type SwapData = {
3030
supervisorAddress: Address
3131
commissionAddress: Address
3232
leftCommission: BN
33-
leftCommissionGot: BN
33+
leftAmount: BN
34+
leftCoinsGot: BN
3435
rightCommission: BN
35-
rightCommissionGot: BN
36+
rightAmount: BN
37+
rightCoinsGot: BN
3638
}
3739

3840
export function buildSwapDataCell(data: SwapData) {
@@ -42,7 +44,8 @@ export function buildSwapDataCell(data: SwapData) {
4244
dataCell.bits.writeAddress(data.rightAddress)
4345

4446
dataCell.bits.writeCoins(data.leftCommission)
45-
dataCell.bits.writeCoins(data.leftCommissionGot)
47+
dataCell.bits.writeCoins(data.leftAmount)
48+
dataCell.bits.writeCoins(data.leftCoinsGot)
4649
dataCell.bits.writeBit(data.leftNft.length > 0)
4750

4851
if (data.leftNft.length > 0) {
@@ -57,7 +60,8 @@ export function buildSwapDataCell(data: SwapData) {
5760
}
5861

5962
dataCell.bits.writeCoins(data.rightCommission)
60-
dataCell.bits.writeCoins(data.rightCommissionGot)
63+
dataCell.bits.writeCoins(data.rightAmount)
64+
dataCell.bits.writeCoins(data.rightCoinsGot)
6165
dataCell.bits.writeBit(data.rightNft.length > 0)
6266

6367
if (data.rightNft.length > 0) {

packages/contracts/nft-swap/Swap.spec.ts

+97-33
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ const defaultConfig: SwapData = {
3636
supervisorAddress: SUPERVISOR,
3737
commissionAddress: COMMISSION,
3838
leftCommission: toNano("0.1"),
39-
leftCommissionGot: toNano("0"),
39+
leftAmount: toNano("0"),
40+
leftCoinsGot: toNano("0"),
4041
rightCommission: toNano("0.05"),
41-
rightCommissionGot: toNano("0"),
42+
rightAmount: toNano("0"),
43+
rightCoinsGot: toNano("0"),
4244
}
4345

4446
describe('swap smc', () => {
@@ -140,6 +142,66 @@ describe('swap smc', () => {
140142
expect(data.state).toEqual(SwapState.Active)
141143
})
142144

145+
it('should accept nft + partial amount + full commission', async () => {
146+
let cfg = Object.create(defaultConfig);
147+
cfg.leftNft = [{addr:NFT1, sent: false}]
148+
cfg.leftCommission = toNano("0.5")
149+
cfg.leftAmount = toNano("1.0")
150+
cfg.rightNft = [{addr:NFT2, sent: false}]
151+
152+
let c = await SwapLocal.createFromConfig(cfg)
153+
154+
let res = await c.contract.sendInternalMessage(new InternalMessage({
155+
to: c.address,
156+
from: NFT1,
157+
value: toNano("1.5999"),
158+
bounce: false,
159+
body: new CommonMessageInfo({
160+
body: new CellMessage(Queries.nftOwnerAssigned({
161+
prevOwner: LEFT,
162+
}))
163+
})
164+
}))
165+
166+
expect(res.exit_code).toEqual(0)
167+
168+
let data = await c.getTradeState()
169+
expect(data.leftGot.toNumber()).toEqual(toNano("1.4999").toNumber())
170+
expect(data.left_ok).toEqual(false)
171+
expect(data.right_ok).toEqual(false)
172+
expect(data.state).toEqual(SwapState.Active)
173+
})
174+
175+
it('should accept nft + full amount + full commission', async () => {
176+
let cfg = Object.create(defaultConfig);
177+
cfg.leftNft = [{addr:NFT1, sent: false}]
178+
cfg.leftCommission = toNano("0.5")
179+
cfg.leftAmount = toNano("1.0")
180+
cfg.rightNft = [{addr:NFT2, sent: false}]
181+
182+
let c = await SwapLocal.createFromConfig(cfg)
183+
184+
let res = await c.contract.sendInternalMessage(new InternalMessage({
185+
to: c.address,
186+
from: NFT1,
187+
value: toNano("1.6"),
188+
bounce: false,
189+
body: new CommonMessageInfo({
190+
body: new CellMessage(Queries.nftOwnerAssigned({
191+
prevOwner: LEFT,
192+
}))
193+
})
194+
}))
195+
196+
expect(res.exit_code).toEqual(0)
197+
198+
let data = await c.getTradeState()
199+
expect(data.leftGot.toNumber()).toEqual(toNano("1.5").toNumber())
200+
expect(data.left_ok).toEqual(true)
201+
expect(data.right_ok).toEqual(false)
202+
expect(data.state).toEqual(SwapState.Active)
203+
})
204+
143205
it('should return unexpected nft', async () => {
144206
let cfg = Object.create(defaultConfig);
145207
cfg.leftNft = [{addr:NFT1, sent: false}]
@@ -243,9 +305,9 @@ describe('swap smc', () => {
243305
let cfg = Object.create(defaultConfig);
244306
cfg.leftNft = [{addr:NFT1, sent: true}]
245307
cfg.leftCommission = toNano("1.0")
246-
cfg.leftCommissionGot = toNano("0.8")
308+
cfg.leftCoinsGot = toNano("0.8")
247309
cfg.rightNft = [{addr:NFT2, sent: true}]
248-
cfg.rightCommissionGot = cfg.rightCommission
310+
cfg.rightCoinsGot = cfg.rightCommission
249311

250312
let c = await SwapLocal.createFromConfig(cfg)
251313
c.contract.setBalance(toNano("10"))
@@ -275,21 +337,23 @@ describe('swap smc', () => {
275337
expect(data.state).toEqual(SwapState.Active)
276338
})
277339

278-
it('should complete after nft+commission', async () => {
340+
it('should complete after nft+commission+amount', async () => {
279341
let cfg = Object.create(defaultConfig);
280342
cfg.leftNft = [{addr:NFT1, sent: false},{addr:NFT3, sent: true}]
281343
cfg.leftCommission = toNano("1.0")
344+
cfg.leftAmount = toNano("0.7")
282345
cfg.rightNft = [{addr:NFT2, sent: true}]
283346
cfg.rightCommission = toNano("1.0")
284-
cfg.rightCommissionGot = cfg.rightCommission
347+
cfg.rightAmount = toNano("0.1")
348+
cfg.rightCoinsGot = toNano("1.1")
285349

286350
let c = await SwapLocal.createFromConfig(cfg)
287351
c.contract.setBalance(toNano("0.05"))
288352

289353
let res = await c.contract.sendInternalMessage(new InternalMessage({
290354
to: c.address,
291355
from: NFT1,
292-
value: toNano("1.15"),
356+
value: toNano("1.85"),
293357
bounce: false,
294358
body: new CommonMessageInfo({
295359
body: new CellMessage(Queries.nftOwnerAssigned({
@@ -302,14 +366,14 @@ describe('swap smc', () => {
302366

303367
checkActions(res.actionList,[{
304368
to: LEFT,
305-
amount: toNano("0.05"),
369+
amount: toNano("0.15"),
306370
body: Queries.transferComplete({}),
307-
mode: 3,
371+
mode: 1,
308372
},{
309373
to: RIGHT,
310-
amount: toNano("0"),
374+
amount: toNano("0.7"),
311375
body: Queries.transferComplete({}),
312-
mode: 3,
376+
mode: 1,
313377
},{
314378
to: NFT1,
315379
amount: toNano("0.05"),
@@ -345,10 +409,10 @@ describe('swap smc', () => {
345409
let cfg = Object.create(defaultConfig);
346410
cfg.leftNft = [{addr:NFT1, sent: true},{addr:NFT3, sent: true}]
347411
cfg.leftCommission = toNano("1.0")
348-
cfg.leftCommissionGot = toNano("0.9")
412+
cfg.leftCoinsGot = toNano("0.9")
349413
cfg.rightNft = [{addr:NFT2, sent: true}]
350414
cfg.rightCommission = toNano("1.0")
351-
cfg.rightCommissionGot = cfg.rightCommission
415+
cfg.rightCoinsGot = cfg.rightCommission
352416

353417
let c = await SwapLocal.createFromConfig(cfg)
354418

@@ -370,12 +434,12 @@ describe('swap smc', () => {
370434
to: LEFT,
371435
amount: toNano("0"),
372436
body: Queries.transferComplete({}),
373-
mode: 3,
437+
mode: 1,
374438
},{
375439
to: RIGHT,
376440
amount: toNano("0"),
377441
body: Queries.transferComplete({}),
378-
mode: 3,
442+
mode: 1,
379443
},{
380444
to: NFT1,
381445
amount: toNano("0.05"),
@@ -411,10 +475,10 @@ describe('swap smc', () => {
411475
let cfg = Object.create(defaultConfig);
412476
cfg.leftNft = [{addr:NFT1, sent: true},{addr:NFT3, sent: true}]
413477
cfg.leftCommission = toNano("1.0")
414-
cfg.leftCommissionGot = toNano("0.9")
478+
cfg.leftCoinsGot = toNano("0.9")
415479
cfg.rightNft = [{addr:NFT2, sent: true}]
416480
cfg.rightCommission = toNano("1.0")
417-
cfg.rightCommissionGot = cfg.rightCommission
481+
cfg.rightCoinsGot = cfg.rightCommission
418482

419483
let c = await SwapLocal.createFromConfig(cfg)
420484

@@ -437,10 +501,10 @@ describe('swap smc', () => {
437501
let cfg = Object.create(defaultConfig);
438502
cfg.leftNft = [{addr:NFT1, sent: true},{addr:NFT3, sent: true}]
439503
cfg.leftCommission = toNano("1.0")
440-
cfg.leftCommissionGot = toNano("0.9")
504+
cfg.leftCoinsGot = toNano("0.9")
441505
cfg.rightNft = [{addr:NFT2, sent: true}]
442506
cfg.rightCommission = toNano("1.0")
443-
cfg.rightCommissionGot = cfg.rightCommission
507+
cfg.rightCoinsGot = cfg.rightCommission
444508

445509
let c = await SwapLocal.createFromConfig(cfg)
446510

@@ -464,10 +528,10 @@ describe('swap smc', () => {
464528
cfg.state = SwapState.Completed
465529
cfg.leftNft = [{addr:NFT1, sent: true},{addr:NFT3, sent: true}]
466530
cfg.leftCommission = toNano("1.0")
467-
cfg.leftCommissionGot = toNano("0.9")
531+
cfg.leftCoinsGot = toNano("0.9")
468532
cfg.rightNft = [{addr:NFT2, sent: true}]
469533
cfg.rightCommission = toNano("1.0")
470-
cfg.rightCommissionGot = cfg.rightCommission
534+
cfg.rightCoinsGot = cfg.rightCommission
471535

472536
let c = await SwapLocal.createFromConfig(cfg)
473537

@@ -491,10 +555,10 @@ describe('swap smc', () => {
491555
cfg.state = SwapState.Completed
492556
cfg.leftNft = [{addr:NFT1, sent: true},{addr:NFT3, sent: true}]
493557
cfg.leftCommission = toNano("1.0")
494-
cfg.leftCommissionGot = cfg.leftCommission
558+
cfg.leftCoinsGot = cfg.leftCommission
495559
cfg.rightNft = [{addr:NFT2, sent: true}]
496560
cfg.rightCommission = toNano("1.0")
497-
cfg.rightCommissionGot = cfg.rightCommission
561+
cfg.rightCoinsGot = cfg.rightCommission
498562

499563
let c = await SwapLocal.createFromConfig(cfg)
500564

@@ -516,10 +580,10 @@ describe('swap smc', () => {
516580
cfg.state = SwapState.Active
517581
cfg.leftNft = [{addr:NFT1, sent: false},{addr:NFT3, sent: true}]
518582
cfg.leftCommission = toNano("1.0")
519-
cfg.leftCommissionGot = cfg.leftCommission
583+
cfg.leftCoinsGot = cfg.leftCommission
520584
cfg.rightNft = [{addr:NFT2, sent: true}]
521585
cfg.rightCommission = toNano("1.0")
522-
cfg.rightCommissionGot = cfg.rightCommission
586+
cfg.rightCoinsGot = cfg.rightCommission
523587

524588
let c = await SwapLocal.createFromConfig(cfg)
525589

@@ -541,10 +605,10 @@ describe('swap smc', () => {
541605
cfg.state = SwapState.Active
542606
cfg.leftNft = [{addr:NFT1, sent: false},{addr:NFT3, sent: true}]
543607
cfg.leftCommission = toNano("1.0")
544-
cfg.leftCommissionGot = toNano("0.9")
608+
cfg.leftCoinsGot = toNano("0.9")
545609
cfg.rightNft = [{addr:NFT2, sent: true}]
546610
cfg.rightCommission = toNano("1.0")
547-
cfg.rightCommissionGot = cfg.rightCommission
611+
cfg.rightCoinsGot = cfg.rightCommission
548612

549613
let c = await SwapLocal.createFromConfig(cfg)
550614

@@ -601,10 +665,10 @@ describe('swap smc', () => {
601665
cfg.state = SwapState.Completed
602666
cfg.leftNft = [{addr:NFT1, sent: false},{addr:NFT3, sent: true}]
603667
cfg.leftCommission = toNano("1.0")
604-
cfg.leftCommissionGot = toNano("0.9")
668+
cfg.leftCoinsGot = toNano("0.9")
605669
cfg.rightNft = [{addr:NFT2, sent: true}]
606670
cfg.rightCommission = toNano("1.0")
607-
cfg.rightCommissionGot = cfg.rightCommission
671+
cfg.rightCoinsGot = cfg.rightCommission
608672

609673
let c = await SwapLocal.createFromConfig(cfg)
610674

@@ -641,10 +705,10 @@ describe('swap smc', () => {
641705
cfg.state = SwapState.Completed
642706
cfg.leftNft = [{addr:NFT1, sent: false},{addr:NFT3, sent: true}]
643707
cfg.leftCommission = toNano("1.0")
644-
cfg.leftCommissionGot = toNano("0.9")
708+
cfg.leftCoinsGot = toNano("0.9")
645709
cfg.rightNft = [{addr:NFT2, sent: true}]
646710
cfg.rightCommission = toNano("1.0")
647-
cfg.rightCommissionGot = cfg.rightCommission
711+
cfg.rightCoinsGot = cfg.rightCommission
648712

649713
let c = await SwapLocal.createFromConfig(cfg)
650714

@@ -669,10 +733,10 @@ describe('swap smc', () => {
669733
cfg.state = SwapState.Active
670734
cfg.leftNft = [{addr:NFT1, sent: false},{addr:NFT3, sent: true}]
671735
cfg.leftCommission = toNano("1.0")
672-
cfg.leftCommissionGot = toNano("0.9")
736+
cfg.leftCoinsGot = toNano("0.9")
673737
cfg.rightNft = [{addr:NFT2, sent: true}]
674738
cfg.rightCommission = toNano("1.0")
675-
cfg.rightCommissionGot = cfg.rightCommission
739+
cfg.rightCoinsGot = cfg.rightCommission
676740

677741
let c = await SwapLocal.createFromConfig(cfg)
678742

packages/contracts/nft-swap/SwapLocal.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {compileFunc} from "../../utils/compileFunc";
1616

1717
type StateResponse = { state: number, left_ok: boolean, right_ok: boolean,
1818
leftAddr: Address, rightAddr: Address, leftNft: Map<string,boolean> | null, rightNft: Map<string,boolean> | null,
19-
leftComm: BN, leftCommGot: BN, rightComm: BN, rightCommGot: BN}
19+
leftComm: BN, leftAmount: BN, leftGot: BN, rightComm: BN, rightAmount: BN, rightGot: BN}
2020

2121
export class SwapLocal {
2222
private constructor(
@@ -39,7 +39,7 @@ export class SwapLocal {
3939
}
4040

4141
let [state, left_ok, right_ok, leftAddr, rightAddr, leftNft, rightNft,
42-
leftComm, leftCommGot, rightComm, rightCommGot] = res.result as [BN, BN, BN, Slice, Slice, Cell, Cell, BN, BN, BN, BN]
42+
leftComm, leftAmount, leftGot, rightComm, rightAmount, rightGot] = res.result as [BN, BN, BN, Slice, Slice, Cell, Cell, BN, BN, BN, BN, BN, BN]
4343

4444

4545
let leftMap = leftNft ? parseDict<boolean>(leftNft.beginParse(),256, function (s: Slice) {
@@ -58,9 +58,11 @@ export class SwapLocal {
5858
leftNft: leftMap,
5959
rightNft: rightMap,
6060
leftComm: leftComm,
61-
leftCommGot: leftCommGot,
61+
leftAmount: leftAmount,
62+
leftGot: leftGot,
6263
rightComm: rightComm,
63-
rightCommGot: rightCommGot,
64+
rightAmount: rightAmount,
65+
rightGot: rightGot,
6466
}
6567
}
6668

0 commit comments

Comments
 (0)