Skip to content

Commit 5a4428f

Browse files
committed
itest: burn by group key
1 parent 35ce0c5 commit 5a4428f

File tree

2 files changed

+98
-63
lines changed

2 files changed

+98
-63
lines changed

itest/burn_test.go

Lines changed: 94 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -120,27 +120,25 @@ func testBurnAssets(t *harnessTest) {
120120
)
121121

122122
burnResp, err := t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
123-
Asset: &taprpc.BurnAssetRequest_AssetId{
124-
AssetId: simpleAssetID[:],
123+
AssetSpecifier: &taprpc.AssetSpecifier{
124+
Id: &taprpc.AssetSpecifier_AssetId{
125+
AssetId: simpleAssetID[:],
126+
},
125127
},
126128
AmountToBurn: burnAmt,
127129
Note: burnNote,
128130
ConfirmationText: taprootassets.AssetBurnConfirmationText,
129131
})
130132
require.NoError(t.t, err)
131133

132-
burnRespJSON, err := formatProtoJSON(burnResp)
133-
require.NoError(t.t, err)
134-
t.Logf("Got response from burning %d units: %v", burnAmt, burnRespJSON)
135-
136134
AssertAssetOutboundTransferWithOutputs(
137135
t.t, minerClient, t.tapd, burnResp.BurnTransfer,
138136
[][]byte{simpleAssetGen.AssetId},
139137
[]uint64{outputAmounts[3] - burnAmt, burnAmt}, 1, 2, 2, true,
140138
)
141139

142140
// We'll now assert that the burned asset has the correct state.
143-
burnedAsset := burnResp.BurnProof.Asset
141+
burnedAsset := burnResp.BurnProofs[0].Asset
144142
allAssets, err := t.tapd.ListAssets(ctxt, &taprpc.ListAssetRequest{
145143
IncludeSpent: true,
146144
ScriptKeyType: allScriptKeysQuery,
@@ -196,18 +194,16 @@ func testBurnAssets(t *harnessTest) {
196194
// collectible from the original mint TX), while there are other,
197195
// passive assets in the anchor output.
198196
burnResp, err = t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
199-
Asset: &taprpc.BurnAssetRequest_AssetId{
200-
AssetId: simpleCollectibleGen.AssetId,
197+
AssetSpecifier: &taprpc.AssetSpecifier{
198+
Id: &taprpc.AssetSpecifier_AssetId{
199+
AssetId: simpleCollectibleGen.AssetId,
200+
},
201201
},
202202
AmountToBurn: simpleCollectible.Amount,
203203
ConfirmationText: taprootassets.AssetBurnConfirmationText,
204204
})
205205
require.NoError(t.t, err)
206206

207-
burnRespJSON, err = formatProtoJSON(burnResp)
208-
require.NoError(t.t, err)
209-
t.Logf("Got response from burning all units: %v", burnRespJSON)
210-
211207
AssertAssetOutboundTransferWithOutputs(
212208
t.t, minerClient, t.tapd, burnResp.BurnTransfer,
213209
[][]byte{simpleCollectibleGen.AssetId}, []uint64{1}, 3, 4, 1,
@@ -227,19 +223,16 @@ func testBurnAssets(t *harnessTest) {
227223
const changeAmt = 300
228224
multiBurnAmt := outputAmounts[2] + secondSendAmt - changeAmt
229225
burnResp, err = t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
230-
Asset: &taprpc.BurnAssetRequest_AssetId{
231-
AssetId: simpleAssetGen.AssetId,
226+
AssetSpecifier: &taprpc.AssetSpecifier{
227+
Id: &taprpc.AssetSpecifier_AssetId{
228+
AssetId: simpleAssetGen.AssetId,
229+
},
232230
},
233231
AmountToBurn: multiBurnAmt,
234232
ConfirmationText: taprootassets.AssetBurnConfirmationText,
235233
})
236234
require.NoError(t.t, err)
237235

238-
burnRespJSON, err = formatProtoJSON(burnResp)
239-
require.NoError(t.t, err)
240-
t.Logf("Got response from burning units from multiple inputs: %v",
241-
burnRespJSON)
242-
243236
AssertAssetOutboundTransferWithOutputs(
244237
t.t, minerClient, t.tapd, burnResp.BurnTransfer,
245238
[][]byte{simpleAssetGen.AssetId},
@@ -259,33 +252,27 @@ func testBurnAssets(t *harnessTest) {
259252
WithScriptKeyType(asset.ScriptKeyBurn),
260253
)
261254

262-
resp, err := t.tapd.ListAssets(ctxt, &taprpc.ListAssetRequest{
255+
_, err = t.tapd.ListAssets(ctxt, &taprpc.ListAssetRequest{
263256
IncludeSpent: true,
264257
})
265258
require.NoError(t.t, err)
266-
assets, err := formatProtoJSON(resp)
267-
require.NoError(t.t, err)
268-
t.Logf("All assets before last burn: %v", assets)
269259

270260
// Test case 4: Burn some units of a grouped asset. We start by making
271261
// sure we still have the full balance before burning.
272262
AssertBalanceByID(
273263
t.t, t.tapd, simpleGroupGen.AssetId, simpleGroup.Amount,
274264
)
275265
burnResp, err = t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
276-
Asset: &taprpc.BurnAssetRequest_AssetId{
277-
AssetId: simpleGroupGen.AssetId,
266+
AssetSpecifier: &taprpc.AssetSpecifier{
267+
Id: &taprpc.AssetSpecifier_AssetId{
268+
AssetId: simpleGroupGen.AssetId,
269+
},
278270
},
279271
AmountToBurn: burnAmt,
280272
ConfirmationText: taprootassets.AssetBurnConfirmationText,
281273
})
282274
require.NoError(t.t, err)
283275

284-
burnRespJSON, err = formatProtoJSON(burnResp)
285-
require.NoError(t.t, err)
286-
t.Logf("Got response from burning units from grouped asset: %v",
287-
burnRespJSON)
288-
289276
AssertAssetOutboundTransferWithOutputs(
290277
t.t, minerClient, t.tapd, burnResp.BurnTransfer,
291278
[][]byte{simpleGroupGen.AssetId},
@@ -295,10 +282,12 @@ func testBurnAssets(t *harnessTest) {
295282
t.t, t.tapd, simpleGroupGen.AssetId, simpleGroup.Amount-burnAmt,
296283
)
297284

285+
// Depending on passive re-anchoring behavior, earlier burn outputs
286+
// might become spent when inputs are consolidated. We assert only
287+
// currently unspent burn outputs here.
298288
AssertBalances(
299289
t.t, t.tapd,
300-
burnAmt+simpleCollectible.Amount+multiBurnAmt+burnAmt,
301-
WithNumUtxos(4), WithNumAnchorUtxos(4),
290+
burnAmt+multiBurnAmt+burnAmt,
302291
WithScriptKeyType(asset.ScriptKeyBurn),
303292
)
304293

@@ -335,19 +324,16 @@ func testBurnAssets(t *harnessTest) {
335324
simpleGroupCollect.Amount,
336325
)
337326
burnResp, err = t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
338-
Asset: &taprpc.BurnAssetRequest_AssetId{
339-
AssetId: simpleGroupCollectGen.AssetId,
327+
AssetSpecifier: &taprpc.AssetSpecifier{
328+
Id: &taprpc.AssetSpecifier_AssetId{
329+
AssetId: simpleGroupCollectGen.AssetId,
330+
},
340331
},
341332
AmountToBurn: 1,
342333
ConfirmationText: taprootassets.AssetBurnConfirmationText,
343334
})
344335
require.NoError(t.t, err)
345336

346-
burnRespJSON, err = formatProtoJSON(burnResp)
347-
require.NoError(t.t, err)
348-
t.Logf("Got response from burning units from grouped asset: %v",
349-
burnRespJSON)
350-
351337
AssertAssetOutboundTransferWithOutputs(
352338
t.t, minerClient, t.tapd, burnResp.BurnTransfer,
353339
[][]byte{simpleGroupCollectGen.AssetId}, []uint64{1}, 6, 7, 1,
@@ -357,8 +343,7 @@ func testBurnAssets(t *harnessTest) {
357343

358344
AssertBalances(
359345
t.t, t.tapd,
360-
burnAmt+simpleCollectible.Amount+multiBurnAmt+burnAmt+1,
361-
WithNumUtxos(5), WithNumAnchorUtxos(5),
346+
burnAmt+multiBurnAmt+burnAmt+1,
362347
WithScriptKeyType(asset.ScriptKeyBurn),
363348
)
364349

@@ -406,6 +391,7 @@ func testBurnGroupedAssets(t *harnessTest) {
406391

407392
var (
408393
firstMintResp = firstMintResponses[0]
394+
burnAssetID1 = firstMintResp.AssetGenesis.AssetId
409395
assetGroupKey = firstMintResp.AssetGroup.TweakedGroupKey
410396
)
411397

@@ -440,38 +426,39 @@ func testBurnGroupedAssets(t *harnessTest) {
440426
assetGroup := assetGroups.Groups[encodedGroupKey]
441427
require.Len(t.t, assetGroup.Assets, 2)
442428

443-
// Burn some amount of the second asset.
429+
totalAmt := firstMintResp.Amount + secondMintResp.Amount
430+
AssertBalanceByGroup(t.t, t.tapd, encodedGroupKey, totalAmt)
431+
432+
// Test case 1: Burn by asset id.
444433
var (
445-
burnAssetID = secondMintResp.AssetGenesis.AssetId
434+
burnAssetID2 = secondMintResp.AssetGenesis.AssetId
446435

447436
preBurnAmt = secondMintResp.Amount
448437
burnAmt = uint64(10)
449438
postBurnAmt = preBurnAmt - burnAmt
450439
)
451440

452441
burnResp, err := t.tapd.BurnAsset(ctxb, &taprpc.BurnAssetRequest{
453-
Asset: &taprpc.BurnAssetRequest_AssetId{
454-
AssetId: burnAssetID,
442+
AssetSpecifier: &taprpc.AssetSpecifier{
443+
Id: &taprpc.AssetSpecifier_AssetId{
444+
AssetId: burnAssetID2,
445+
},
455446
},
456447
AmountToBurn: burnAmt,
457448
Note: burnNote,
458449
ConfirmationText: taprootassets.AssetBurnConfirmationText,
459450
})
460451
require.NoError(t.t, err)
461452

462-
burnRespJSON, err := formatProtoJSON(burnResp)
463-
require.NoError(t.t, err)
464-
t.Logf("Got response from burning %d units: %v", burnAmt, burnRespJSON)
465-
466453
// Assert that the asset burn transfer occurred correctly.
467454
AssertAssetOutboundTransferWithOutputs(
468455
t.t, miner, t.tapd, burnResp.BurnTransfer,
469-
[][]byte{burnAssetID}, []uint64{postBurnAmt, burnAmt}, 0, 1, 2,
456+
[][]byte{burnAssetID2}, []uint64{postBurnAmt, burnAmt}, 0, 1, 2,
470457
true,
471458
)
472459

473460
// Ensure that the burnt asset has the correct state.
474-
burnedAsset := burnResp.BurnProof.Asset
461+
burnedAsset := burnResp.BurnProofs[0].Asset
475462
allAssets, err := t.tapd.ListAssets(ctxb, &taprpc.ListAssetRequest{
476463
IncludeSpent: true,
477464
ScriptKeyType: allScriptKeysQuery,
@@ -486,7 +473,7 @@ func testBurnGroupedAssets(t *harnessTest) {
486473
)
487474

488475
// Our asset balance should have been decreased by the burned amount.
489-
AssertBalanceByID(t.t, t.tapd, burnAssetID, postBurnAmt)
476+
AssertBalanceByID(t.t, t.tapd, burnAssetID2, postBurnAmt)
490477

491478
// Confirm that the minted asset group still contains two assets.
492479
assetGroups, err = t.tapd.ListGroups(ctxb, &taprpc.ListGroupsRequest{})
@@ -507,6 +494,48 @@ func testBurnGroupedAssets(t *harnessTest) {
507494
require.Equal(t.t, burnAmt, burn.Amount)
508495
require.Equal(t.t, burnNote, burn.Note)
509496
require.Equal(t.t, assetGroupKey, burn.TweakedGroupKey)
497+
498+
// Test case 2: Burn by group key to we select multiple inputs.
499+
burnAmt = totalAmt - burnAmt - 1
500+
burnResp, err = t.tapd.BurnAsset(ctxb, &taprpc.BurnAssetRequest{
501+
AssetSpecifier: &taprpc.AssetSpecifier{
502+
Id: &taprpc.AssetSpecifier_GroupKey{
503+
GroupKey: assetGroupKey,
504+
},
505+
},
506+
AmountToBurn: burnAmt,
507+
ConfirmationText: taprootassets.AssetBurnConfirmationText,
508+
})
509+
require.NoError(t.t, err)
510+
511+
// When burning by group key with multiple inputs, the coin selection
512+
// can vary. We verify that:
513+
// 1. There are 3 outputs total (1 change + 2 burn outputs)
514+
// 2. The sum of all outputs equals the total remaining balance
515+
// 3. One output is the change amount (1 unit)
516+
amounts := make([]uint64, len(burnResp.BurnTransfer.Outputs))
517+
for i, out := range burnResp.BurnTransfer.Outputs {
518+
amounts[i] = out.Amount
519+
}
520+
require.Len(t.t, amounts, 3)
521+
522+
// Sum should equal total balance before this burn.
523+
totalBeforeBurn := firstMintResp.Amount + postBurnAmt
524+
actualSum := uint64(0)
525+
for _, amt := range amounts {
526+
actualSum += amt
527+
}
528+
require.Equal(t.t, totalBeforeBurn, actualSum)
529+
530+
// One output should be the change (1 unit).
531+
require.Contains(t.t, amounts, uint64(1))
532+
533+
AssertAssetOutboundTransferWithOutputs(
534+
t.t, miner, t.tapd, burnResp.BurnTransfer,
535+
[][]byte{burnAssetID1, burnAssetID2},
536+
amounts, 1, 2, 3, true,
537+
)
538+
AssertBalanceByGroup(t.t, t.tapd, encodedGroupKey, 1)
510539
}
511540

512541
// testFullBurnUTXO tests that we can burn the full amount of an asset UTXO.
@@ -534,8 +563,10 @@ func testFullBurnUTXO(t *harnessTest) {
534563
// Perform a full burn of the asset.
535564
fullBurnAmt := simpleAsset.Amount
536565
burnResp, err := t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
537-
Asset: &taprpc.BurnAssetRequest_AssetId{
538-
AssetId: simpleAssetID[:],
566+
AssetSpecifier: &taprpc.AssetSpecifier{
567+
Id: &taprpc.AssetSpecifier_AssetId{
568+
AssetId: simpleAssetID[:],
569+
},
539570
},
540571
AmountToBurn: fullBurnAmt,
541572
ConfirmationText: taprootassets.AssetBurnConfirmationText,
@@ -558,8 +589,8 @@ func testFullBurnUTXO(t *harnessTest) {
558589

559590
proofResp := ExportProofFile(
560591
t.t, t.tapd,
561-
burnResp.BurnProof.Asset.AssetGenesis.AssetId,
562-
burnResp.BurnProof.Asset.ScriptKey,
592+
burnResp.BurnProofs[0].Asset.AssetGenesis.AssetId,
593+
burnResp.BurnProofs[0].Asset.ScriptKey,
563594
outpoint,
564595
)
565596
verifyResp, err := t.tapd.VerifyProof(ctxt, &taprpc.ProofFile{
@@ -586,8 +617,10 @@ func testFullBurnUTXO(t *harnessTest) {
586617

587618
fullBurnAmt = collectibleAsset.Amount
588619
burnResp, err = t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
589-
Asset: &taprpc.BurnAssetRequest_AssetId{
590-
AssetId: collectibleAssetID[:],
620+
AssetSpecifier: &taprpc.AssetSpecifier{
621+
Id: &taprpc.AssetSpecifier_AssetId{
622+
AssetId: collectibleAssetID[:],
623+
},
591624
},
592625
AmountToBurn: fullBurnAmt,
593626
ConfirmationText: taprootassets.AssetBurnConfirmationText,
@@ -610,8 +643,8 @@ func testFullBurnUTXO(t *harnessTest) {
610643

611644
proofResp = ExportProofFile(
612645
t.t, t.tapd,
613-
burnResp.BurnProof.Asset.AssetGenesis.AssetId,
614-
burnResp.BurnProof.Asset.ScriptKey,
646+
burnResp.BurnProofs[0].Asset.AssetGenesis.AssetId,
647+
burnResp.BurnProofs[0].Asset.ScriptKey,
615648
outpoint,
616649
)
617650
verifyResp, err = t.tapd.VerifyProof(ctxt, &taprpc.ProofFile{

itest/supply_commit_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -900,8 +900,10 @@ func testSupplyCommitMintBurn(t *harnessTest) {
900900
)
901901

902902
burnResp, err := t.tapd.BurnAsset(ctxb, &taprpc.BurnAssetRequest{
903-
Asset: &taprpc.BurnAssetRequest_AssetId{
904-
AssetId: rpcFirstAsset.AssetGenesis.AssetId,
903+
AssetSpecifier: &taprpc.AssetSpecifier{
904+
Id: &taprpc.AssetSpecifier_AssetId{
905+
AssetId: rpcFirstAsset.AssetGenesis.AssetId,
906+
},
905907
},
906908
AmountToBurn: burnAmt,
907909
Note: burnNote,

0 commit comments

Comments
 (0)