Skip to content

Commit b402434

Browse files
committed
itest: burn by group key
1 parent c5f7aa4 commit b402434

File tree

2 files changed

+72
-63
lines changed

2 files changed

+72
-63
lines changed

itest/burn_test.go

Lines changed: 70 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -120,27 +120,23 @@ 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: simpleAssetID[:],
125125
},
126126
AmountToBurn: burnAmt,
127127
Note: burnNote,
128128
ConfirmationText: taprootassets.AssetBurnConfirmationText,
129129
})
130130
require.NoError(t.t, err)
131131

132-
burnRespJSON, err := formatProtoJSON(burnResp)
133-
require.NoError(t.t, err)
134-
t.Logf("Got response from burning %d units: %v", burnAmt, burnRespJSON)
135-
136132
AssertAssetOutboundTransferWithOutputs(
137133
t.t, minerClient, t.tapd, burnResp.BurnTransfer,
138134
[][]byte{simpleAssetGen.AssetId},
139135
[]uint64{outputAmounts[3] - burnAmt, burnAmt}, 1, 2, 2, true,
140136
)
141137

142138
// We'll now assert that the burned asset has the correct state.
143-
burnedAsset := burnResp.BurnProof.Asset
139+
burnedAsset := burnResp.BurnProofs[0].Asset
144140
allAssets, err := t.tapd.ListAssets(ctxt, &taprpc.ListAssetRequest{
145141
IncludeSpent: true,
146142
ScriptKeyType: allScriptKeysQuery,
@@ -196,18 +192,14 @@ func testBurnAssets(t *harnessTest) {
196192
// collectible from the original mint TX), while there are other,
197193
// passive assets in the anchor output.
198194
burnResp, err = t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
199-
Asset: &taprpc.BurnAssetRequest_AssetId{
200-
AssetId: simpleCollectibleGen.AssetId,
195+
AssetSpecifier: &taprpc.AssetSpecifier{
196+
Id: simpleCollectibleGen.AssetId,
201197
},
202198
AmountToBurn: simpleCollectible.Amount,
203199
ConfirmationText: taprootassets.AssetBurnConfirmationText,
204200
})
205201
require.NoError(t.t, err)
206202

207-
burnRespJSON, err = formatProtoJSON(burnResp)
208-
require.NoError(t.t, err)
209-
t.Logf("Got response from burning all units: %v", burnRespJSON)
210-
211203
AssertAssetOutboundTransferWithOutputs(
212204
t.t, minerClient, t.tapd, burnResp.BurnTransfer,
213205
[][]byte{simpleCollectibleGen.AssetId}, []uint64{1}, 3, 4, 1,
@@ -227,19 +219,14 @@ func testBurnAssets(t *harnessTest) {
227219
const changeAmt = 300
228220
multiBurnAmt := outputAmounts[2] + secondSendAmt - changeAmt
229221
burnResp, err = t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
230-
Asset: &taprpc.BurnAssetRequest_AssetId{
231-
AssetId: simpleAssetGen.AssetId,
222+
AssetSpecifier: &taprpc.AssetSpecifier{
223+
Id: simpleAssetGen.AssetId,
232224
},
233225
AmountToBurn: multiBurnAmt,
234226
ConfirmationText: taprootassets.AssetBurnConfirmationText,
235227
})
236228
require.NoError(t.t, err)
237229

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-
243230
AssertAssetOutboundTransferWithOutputs(
244231
t.t, minerClient, t.tapd, burnResp.BurnTransfer,
245232
[][]byte{simpleAssetGen.AssetId},
@@ -259,33 +246,25 @@ func testBurnAssets(t *harnessTest) {
259246
WithScriptKeyType(asset.ScriptKeyBurn),
260247
)
261248

262-
resp, err := t.tapd.ListAssets(ctxt, &taprpc.ListAssetRequest{
249+
_, err = t.tapd.ListAssets(ctxt, &taprpc.ListAssetRequest{
263250
IncludeSpent: true,
264251
})
265252
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)
269253

270254
// Test case 4: Burn some units of a grouped asset. We start by making
271255
// sure we still have the full balance before burning.
272256
AssertBalanceByID(
273257
t.t, t.tapd, simpleGroupGen.AssetId, simpleGroup.Amount,
274258
)
275259
burnResp, err = t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
276-
Asset: &taprpc.BurnAssetRequest_AssetId{
277-
AssetId: simpleGroupGen.AssetId,
260+
AssetSpecifier: &taprpc.AssetSpecifier{
261+
Id: simpleGroupGen.AssetId,
278262
},
279263
AmountToBurn: burnAmt,
280264
ConfirmationText: taprootassets.AssetBurnConfirmationText,
281265
})
282266
require.NoError(t.t, err)
283267

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-
289268
AssertAssetOutboundTransferWithOutputs(
290269
t.t, minerClient, t.tapd, burnResp.BurnTransfer,
291270
[][]byte{simpleGroupGen.AssetId},
@@ -295,10 +274,12 @@ func testBurnAssets(t *harnessTest) {
295274
t.t, t.tapd, simpleGroupGen.AssetId, simpleGroup.Amount-burnAmt,
296275
)
297276

277+
// Depending on passive re-anchoring behavior, earlier burn outputs
278+
// might become spent when inputs are consolidated. We assert only
279+
// currently unspent burn outputs here.
298280
AssertBalances(
299281
t.t, t.tapd,
300-
burnAmt+simpleCollectible.Amount+multiBurnAmt+burnAmt,
301-
WithNumUtxos(4), WithNumAnchorUtxos(4),
282+
burnAmt+multiBurnAmt+burnAmt,
302283
WithScriptKeyType(asset.ScriptKeyBurn),
303284
)
304285

@@ -335,19 +316,14 @@ func testBurnAssets(t *harnessTest) {
335316
simpleGroupCollect.Amount,
336317
)
337318
burnResp, err = t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
338-
Asset: &taprpc.BurnAssetRequest_AssetId{
339-
AssetId: simpleGroupCollectGen.AssetId,
319+
AssetSpecifier: &taprpc.AssetSpecifier{
320+
Id: simpleGroupCollectGen.AssetId,
340321
},
341322
AmountToBurn: 1,
342323
ConfirmationText: taprootassets.AssetBurnConfirmationText,
343324
})
344325
require.NoError(t.t, err)
345326

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-
351327
AssertAssetOutboundTransferWithOutputs(
352328
t.t, minerClient, t.tapd, burnResp.BurnTransfer,
353329
[][]byte{simpleGroupCollectGen.AssetId}, []uint64{1}, 6, 7, 1,
@@ -357,8 +333,7 @@ func testBurnAssets(t *harnessTest) {
357333

358334
AssertBalances(
359335
t.t, t.tapd,
360-
burnAmt+simpleCollectible.Amount+multiBurnAmt+burnAmt+1,
361-
WithNumUtxos(5), WithNumAnchorUtxos(5),
336+
burnAmt+multiBurnAmt+burnAmt+1,
362337
WithScriptKeyType(asset.ScriptKeyBurn),
363338
)
364339

@@ -406,6 +381,7 @@ func testBurnGroupedAssets(t *harnessTest) {
406381

407382
var (
408383
firstMintResp = firstMintResponses[0]
384+
burnAssetID1 = firstMintResp.AssetGenesis.AssetId
409385
assetGroupKey = firstMintResp.AssetGroup.TweakedGroupKey
410386
)
411387

@@ -440,38 +416,37 @@ func testBurnGroupedAssets(t *harnessTest) {
440416
assetGroup := assetGroups.Groups[encodedGroupKey]
441417
require.Len(t.t, assetGroup.Assets, 2)
442418

443-
// Burn some amount of the second asset.
419+
totalAmt := firstMintResp.Amount + secondMintResp.Amount
420+
AssertBalanceByGroup(t.t, t.tapd, encodedGroupKey, totalAmt)
421+
422+
// Test case 1: Burn by asset id.
444423
var (
445-
burnAssetID = secondMintResp.AssetGenesis.AssetId
424+
burnAssetID2 = secondMintResp.AssetGenesis.AssetId
446425

447426
preBurnAmt = secondMintResp.Amount
448427
burnAmt = uint64(10)
449428
postBurnAmt = preBurnAmt - burnAmt
450429
)
451430

452431
burnResp, err := t.tapd.BurnAsset(ctxb, &taprpc.BurnAssetRequest{
453-
Asset: &taprpc.BurnAssetRequest_AssetId{
454-
AssetId: burnAssetID,
432+
AssetSpecifier: &taprpc.AssetSpecifier{
433+
Id: burnAssetID2,
455434
},
456435
AmountToBurn: burnAmt,
457436
Note: burnNote,
458437
ConfirmationText: taprootassets.AssetBurnConfirmationText,
459438
})
460439
require.NoError(t.t, err)
461440

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

473448
// Ensure that the burnt asset has the correct state.
474-
burnedAsset := burnResp.BurnProof.Asset
449+
burnedAsset := burnResp.BurnProofs[0].Asset
475450
allAssets, err := t.tapd.ListAssets(ctxb, &taprpc.ListAssetRequest{
476451
IncludeSpent: true,
477452
ScriptKeyType: allScriptKeysQuery,
@@ -486,7 +461,7 @@ func testBurnGroupedAssets(t *harnessTest) {
486461
)
487462

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

491466
// Confirm that the minted asset group still contains two assets.
492467
assetGroups, err = t.tapd.ListGroups(ctxb, &taprpc.ListGroupsRequest{})
@@ -507,6 +482,40 @@ func testBurnGroupedAssets(t *harnessTest) {
507482
require.Equal(t.t, burnAmt, burn.Amount)
508483
require.Equal(t.t, burnNote, burn.Note)
509484
require.Equal(t.t, assetGroupKey, burn.TweakedGroupKey)
485+
486+
// Test case 2: Burn by group key to we select multiple inputs.
487+
// We burn the full amount.
488+
burnResp, err = t.tapd.BurnAsset(ctxb, &taprpc.BurnAssetRequest{
489+
AssetSpecifier: &taprpc.AssetSpecifier{
490+
GroupKey: assetGroupKey,
491+
},
492+
AmountToBurn: totalAmt - burnAmt,
493+
ConfirmationText: taprootassets.AssetBurnConfirmationText,
494+
})
495+
require.NoError(t.t, err)
496+
497+
// When burning by group key with multiple inputs,
498+
// the coin selection can vary. We verify that:
499+
// - There are 2 outputs total
500+
// - We burn all remaining balance.
501+
amounts := make([]uint64, len(burnResp.BurnTransfer.Outputs))
502+
for i, out := range burnResp.BurnTransfer.Outputs {
503+
amounts[i] = out.Amount
504+
}
505+
require.Len(t.t, amounts, 2)
506+
507+
actualSum := uint64(0)
508+
for _, amt := range amounts {
509+
actualSum += amt
510+
}
511+
require.Equal(t.t, totalAmt-burnAmt, actualSum)
512+
513+
AssertAssetOutboundTransferWithOutputs(
514+
t.t, miner, t.tapd, burnResp.BurnTransfer,
515+
[][]byte{burnAssetID1, burnAssetID2},
516+
amounts, 1, 2, 2, true,
517+
)
518+
AssertBalanceByGroup(t.t, t.tapd, encodedGroupKey, 0)
510519
}
511520

512521
// testFullBurnUTXO tests that we can burn the full amount of an asset UTXO.
@@ -534,8 +543,8 @@ func testFullBurnUTXO(t *harnessTest) {
534543
// Perform a full burn of the asset.
535544
fullBurnAmt := simpleAsset.Amount
536545
burnResp, err := t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
537-
Asset: &taprpc.BurnAssetRequest_AssetId{
538-
AssetId: simpleAssetID[:],
546+
AssetSpecifier: &taprpc.AssetSpecifier{
547+
Id: simpleAssetID[:],
539548
},
540549
AmountToBurn: fullBurnAmt,
541550
ConfirmationText: taprootassets.AssetBurnConfirmationText,
@@ -558,8 +567,8 @@ func testFullBurnUTXO(t *harnessTest) {
558567

559568
proofResp := ExportProofFile(
560569
t.t, t.tapd,
561-
burnResp.BurnProof.Asset.AssetGenesis.AssetId,
562-
burnResp.BurnProof.Asset.ScriptKey,
570+
burnResp.BurnProofs[0].Asset.AssetGenesis.AssetId,
571+
burnResp.BurnProofs[0].Asset.ScriptKey,
563572
outpoint,
564573
)
565574
verifyResp, err := t.tapd.VerifyProof(ctxt, &taprpc.ProofFile{
@@ -586,8 +595,8 @@ func testFullBurnUTXO(t *harnessTest) {
586595

587596
fullBurnAmt = collectibleAsset.Amount
588597
burnResp, err = t.tapd.BurnAsset(ctxt, &taprpc.BurnAssetRequest{
589-
Asset: &taprpc.BurnAssetRequest_AssetId{
590-
AssetId: collectibleAssetID[:],
598+
AssetSpecifier: &taprpc.AssetSpecifier{
599+
Id: collectibleAssetID[:],
591600
},
592601
AmountToBurn: fullBurnAmt,
593602
ConfirmationText: taprootassets.AssetBurnConfirmationText,
@@ -610,8 +619,8 @@ func testFullBurnUTXO(t *harnessTest) {
610619

611620
proofResp = ExportProofFile(
612621
t.t, t.tapd,
613-
burnResp.BurnProof.Asset.AssetGenesis.AssetId,
614-
burnResp.BurnProof.Asset.ScriptKey,
622+
burnResp.BurnProofs[0].Asset.AssetGenesis.AssetId,
623+
burnResp.BurnProofs[0].Asset.ScriptKey,
615624
outpoint,
616625
)
617626
verifyResp, err = t.tapd.VerifyProof(ctxt, &taprpc.ProofFile{

itest/supply_commit_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -900,8 +900,8 @@ 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: rpcFirstAsset.AssetGenesis.AssetId,
905905
},
906906
AmountToBurn: burnAmt,
907907
Note: burnNote,

0 commit comments

Comments
 (0)