Skip to content

Commit c792a51

Browse files
authored
Merge pull request #681 from lightninglabs/enable_emission_flag_split
split `enableEmission` into `newGroupedAsset` and `groupedAsset`
2 parents d09b3bf + 4fd858f commit c792a51

15 files changed

+641
-304
lines changed

cmd/tapcli/assets.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ var (
4040
assetMetaBytesName = "meta_bytes"
4141
assetMetaFilePathName = "meta_file_path"
4242
assetMetaTypeName = "meta_type"
43-
assetEmissionName = "enable_emission"
43+
assetNewGroupedAssetName = "new_grouped_asset"
44+
assetGroupedAssetName = "grouped_asset"
4445
assetShowWitnessName = "show_witness"
4546
assetShowSpentName = "show_spent"
4647
assetGroupKeyName = "group_key"
@@ -91,10 +92,15 @@ var mintAssetCommand = cli.Command{
9192
Usage: "the type of the meta data for the asset",
9293
},
9394
cli.BoolFlag{
94-
Name: assetEmissionName,
95+
Name: assetNewGroupedAssetName,
9596
Usage: "if true, then the asset supports on going " +
9697
"emission",
9798
},
99+
cli.BoolFlag{
100+
Name: assetGroupedAssetName,
101+
Usage: "if true, then the asset is minted into a " +
102+
"specific group",
103+
},
98104
cli.StringFlag{
99105
Name: assetGroupKeyName,
100106
Usage: "the specific group key to use to mint the " +
@@ -218,18 +224,19 @@ func mintAsset(ctx *cli.Context) error {
218224

219225
resp, err := client.MintAsset(ctxc, &mintrpc.MintAssetRequest{
220226
Asset: &mintrpc.MintAsset{
221-
AssetType: assetType,
222-
Name: ctx.String(assetTagName),
223-
AssetMeta: assetMeta,
224-
Amount: amount,
225-
GroupKey: groupKey,
226-
GroupAnchor: ctx.String(assetGroupAnchorName),
227+
AssetType: assetType,
228+
Name: ctx.String(assetTagName),
229+
AssetMeta: assetMeta,
230+
Amount: amount,
231+
NewGroupedAsset: ctx.Bool(assetNewGroupedAssetName),
232+
GroupedAsset: ctx.Bool(assetGroupedAssetName),
233+
GroupKey: groupKey,
234+
GroupAnchor: ctx.String(assetGroupAnchorName),
227235
AssetVersion: taprpc.AssetVersion(
228236
ctx.Uint64(assetVersionName),
229237
),
230238
},
231-
EnableEmission: ctx.Bool(assetEmissionName),
232-
ShortResponse: ctx.Bool(shortResponseName),
239+
ShortResponse: ctx.Bool(shortResponseName),
233240
})
234241
if err != nil {
235242
return fmt.Errorf("unable to mint asset: %w", err)

itest/addrs_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,9 +410,10 @@ func testAddressAssetSyncer(t *harnessTest) {
410410
// If Alice now mints a reissuance for the second asset group, Bob
411411
// should successfully sync that new asset.
412412
secondGroupMember := CopyRequest(issuableAssets[1])
413-
secondGroupMember.EnableEmission = false
413+
secondGroupMember.Asset.NewGroupedAsset = false
414414
secondGroupMember.Asset.Name += "-2"
415415
secondGroupMember.Asset.GroupKey = secondGroup.TweakedGroupKey
416+
secondGroupMember.Asset.GroupedAsset = true
416417

417418
reissuedAsset := MintAssetsConfirmBatch(
418419
t.t, miner, t.tapd, fn.MakeSlice(secondGroupMember),

itest/assets_test.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ var (
5050
AssetMeta: &taprpc.AssetMeta{
5151
Data: []byte("some metadata"),
5252
},
53-
Amount: 5000,
54-
AssetVersion: taprpc.AssetVersion_ASSET_VERSION_V1,
53+
Amount: 5000,
54+
AssetVersion: taprpc.AssetVersion_ASSET_VERSION_V1,
55+
NewGroupedAsset: true,
5556
},
56-
EnableEmission: true,
5757
},
5858
{
5959
Asset: &mintrpc.MintAsset{
@@ -62,10 +62,10 @@ var (
6262
AssetMeta: &taprpc.AssetMeta{
6363
Data: []byte("some metadata"),
6464
},
65-
Amount: 1,
66-
AssetVersion: taprpc.AssetVersion_ASSET_VERSION_V0,
65+
Amount: 1,
66+
AssetVersion: taprpc.AssetVersion_ASSET_VERSION_V0,
67+
NewGroupedAsset: true,
6768
},
68-
EnableEmission: true,
6969
},
7070
}
7171

@@ -242,14 +242,24 @@ func testMintAssetNameCollisionError(t *harnessTest) {
242242
ctxt, cancel := context.WithTimeout(ctxb, defaultWaitTimeout)
243243
defer cancel()
244244

245-
equalityCheck := func(a, b *mintrpc.MintAsset) {
245+
equalityCheck := func(a *mintrpc.MintAsset, b *mintrpc.PendingAsset) {
246246
require.Equal(t.t, a.AssetType, b.AssetType)
247247
require.Equal(t.t, a.Name, b.Name)
248248
require.Equal(t.t, a.AssetMeta.Data, b.AssetMeta.Data)
249249
require.Equal(t.t, a.Amount, b.Amount)
250250
require.Equal(t.t, a.GroupKey, b.GroupKey)
251+
require.Equal(t.t, a.GroupAnchor, b.GroupAnchor)
251252
}
252253

254+
equalityCheckSeedlings := func(a, b *mintrpc.PendingAsset) {
255+
require.Equal(t.t, a.AssetType, b.AssetType)
256+
require.Equal(t.t, a.Name, b.Name)
257+
require.Equal(t.t, a.AssetMeta.Data, b.AssetMeta.Data)
258+
require.Equal(t.t, a.Amount, b.Amount)
259+
require.Equal(t.t, a.NewGroupedAsset, b.NewGroupedAsset)
260+
require.Equal(t.t, a.GroupKey, b.GroupKey)
261+
require.Equal(t.t, a.GroupAnchor, b.GroupAnchor)
262+
}
253263
// If we attempt to add both assets to the same batch, the second mint
254264
// call should fail.
255265
collideResp, err := t.tapd.MintAsset(ctxt, &assetCollide)
@@ -305,7 +315,9 @@ func testMintAssetNameCollisionError(t *harnessTest) {
305315
require.Len(t.t, cancelBatch.Batches, 1)
306316
cancelBatchCollide := cancelBatch.Batches[0]
307317
require.Len(t.t, cancelBatchCollide.Assets, 1)
308-
equalityCheck(batchCollide.Assets[0], cancelBatchCollide.Assets[0])
318+
equalityCheckSeedlings(
319+
batchCollide.Assets[0], cancelBatchCollide.Assets[0],
320+
)
309321
cancelBatchState := cancelBatchCollide.State
310322
require.Equal(
311323
t.t, cancelBatchState,

itest/collectible_split_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,9 @@ func testCollectibleGroupSend(t *harnessTest) {
230230
Data: []byte("foo"),
231231
Type: 0,
232232
},
233-
Amount: 1,
233+
Amount: 1,
234+
NewGroupedAsset: false,
234235
},
235-
EnableEmission: false,
236236
}
237237

238238
// Update the asset name and metadata to match an index.
@@ -245,7 +245,7 @@ func testCollectibleGroupSend(t *harnessTest) {
245245
// Use the first asset of the batch as the asset group anchor.
246246
collectibleAnchorReq := CopyRequest(&collectibleRequestTemplate)
247247
incrementMintAsset(collectibleAnchorReq.Asset, 0)
248-
collectibleAnchorReq.EnableEmission = true
248+
collectibleAnchorReq.Asset.NewGroupedAsset = true
249249
batchReqs[0] = collectibleAnchorReq
250250

251251
// Generate the rest of the batch, with each asset referencing the group
@@ -254,6 +254,8 @@ func testCollectibleGroupSend(t *harnessTest) {
254254
groupedAsset := CopyRequest(&collectibleRequestTemplate)
255255
incrementMintAsset(groupedAsset.Asset, i)
256256
groupedAsset.Asset.GroupAnchor = collectibleAnchorReq.Asset.Name
257+
groupedAsset.Asset.NewGroupedAsset = false
258+
groupedAsset.Asset.GroupedAsset = true
257259
batchReqs[i] = groupedAsset
258260
}
259261

itest/loadtest/mint_batch_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ func mintTest(t *testing.T, ctx context.Context, cfg *Config) {
6060
Data: imageMetadataBytes,
6161
Type: 0,
6262
},
63-
Amount: 1,
63+
Amount: 1,
64+
NewGroupedAsset: false,
6465
},
65-
EnableEmission: false,
6666
}
6767

6868
// Update the asset name and metadata to match an index.
@@ -75,7 +75,7 @@ func mintTest(t *testing.T, ctx context.Context, cfg *Config) {
7575
// Use the first asset of the batch as the asset group anchor.
7676
collectibleAnchorReq := itest.CopyRequest(&collectibleRequestTemplate)
7777
incrementMintAsset(collectibleAnchorReq.Asset, 0)
78-
collectibleAnchorReq.EnableEmission = true
78+
collectibleAnchorReq.Asset.NewGroupedAsset = true
7979
batchReqs[0] = collectibleAnchorReq
8080

8181
// Generate the rest of the batch, with each asset referencing the group
@@ -84,6 +84,8 @@ func mintTest(t *testing.T, ctx context.Context, cfg *Config) {
8484
groupedAsset := itest.CopyRequest(&collectibleRequestTemplate)
8585
incrementMintAsset(groupedAsset.Asset, i)
8686
groupedAsset.Asset.GroupAnchor = collectibleAnchorReq.Asset.Name
87+
groupedAsset.Asset.GroupedAsset = true
88+
groupedAsset.Asset.NewGroupedAsset = false
8789
batchReqs[i] = groupedAsset
8890
}
8991

itest/mint_batch_stress_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@ func mintBatchStressTest(
114114
Data: imageMetadataBytes,
115115
Type: 0,
116116
},
117-
Amount: 1,
117+
Amount: 1,
118+
NewGroupedAsset: false,
118119
},
119-
EnableEmission: false,
120120
}
121121

122122
// Update the asset name and metadata to match an index.
@@ -129,7 +129,8 @@ func mintBatchStressTest(
129129
// Use the first asset of the batch as the asset group anchor.
130130
collectibleAnchorReq := CopyRequest(&collectibleRequestTemplate)
131131
incrementMintAsset(collectibleAnchorReq.Asset, 0)
132-
collectibleAnchorReq.EnableEmission = true
132+
collectibleAnchorReq.Asset.NewGroupedAsset = false
133+
collectibleAnchorReq.Asset.GroupedAsset = true
133134
batchReqs[0] = collectibleAnchorReq
134135

135136
// Generate the rest of the batch, with each asset referencing the group

itest/multi_asset_group_test.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func testMintMultiAssetGroups(t *harnessTest) {
2222
// and one new group of 3 assets.
2323
complexBatch := []*mintrpc.MintAssetRequest{simpleAssets[0]}
2424
issuableAsset := CopyRequest(simpleAssets[1])
25-
issuableAsset.EnableEmission = true
25+
issuableAsset.Asset.NewGroupedAsset = true
2626
complexBatch = append(complexBatch, issuableAsset)
2727

2828
normalGroupMembers := 2
@@ -195,7 +195,8 @@ func createMultiAssetGroup(anchor *mintrpc.MintAssetRequest,
195195
groupSum := uint64(0)
196196
for i := uint64(1); i <= numAssets; i++ {
197197
assetReq := CopyRequest(anchor)
198-
assetReq.EnableEmission = false
198+
assetReq.Asset.NewGroupedAsset = false
199+
assetReq.Asset.GroupedAsset = true
199200
assetReq.Asset.GroupAnchor = anchorName
200201
assetReq.Asset.Name = fmt.Sprintf(
201202
"%s-tranche-%d", anchorName, i,
@@ -227,6 +228,7 @@ func testMintMultiAssetGroupErrors(t *harnessTest) {
227228
// group anchor is invalid if there is no pending batch.
228229
groupedAsset := CopyRequest(simpleAssets[0])
229230
groupedAsset.Asset.GroupAnchor = groupedAsset.Asset.Name
231+
groupedAsset.Asset.GroupedAsset = true
230232

231233
_, err := t.tapd.MintAsset(ctxb, groupedAsset)
232234
require.ErrorContains(t.t, err, "batch empty, group anchor")
@@ -236,6 +238,7 @@ func testMintMultiAssetGroupErrors(t *harnessTest) {
236238
simpleAsset := CopyRequest(simpleAssets[1])
237239
_, err = t.tapd.MintAsset(ctxb, simpleAsset)
238240
require.NoError(t.t, err)
241+
239242
_, err = t.tapd.MintAsset(ctxb, groupedAsset)
240243
require.ErrorContains(t.t, err, "not present in batch")
241244

@@ -252,7 +255,7 @@ func testMintMultiAssetGroupErrors(t *harnessTest) {
252255
require.ErrorContains(t.t, err, "has emission disabled")
253256

254257
// Finally, we'll modify the assets to make the multi-asset group valid.
255-
validAnchor.EnableEmission = true
258+
validAnchor.Asset.NewGroupedAsset = true
256259
validAnchor.Asset.AssetMeta = &taprpc.AssetMeta{
257260
Data: []byte("metadata for itest group anchors"),
258261
}
@@ -284,7 +287,7 @@ func testMultiAssetGroupSend(t *harnessTest) {
284287

285288
// First, we'll build a batch to mint.
286289
issuableAsset := CopyRequest(simpleAssets[1])
287-
issuableAsset.EnableEmission = true
290+
issuableAsset.Asset.NewGroupedAsset = true
288291

289292
collectibleGroupMembers := 50
290293
collectibleGroup, collectibleGroupSum := createMultiAssetGroup(

itest/re-issuance_test.go

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,9 @@ func testReIssuance(t *harnessTest) {
118118

119119
reissuedAssets[0].Asset.Amount = normalGroupMintHalf
120120
reissuedAssets[0].Asset.GroupKey = normalGroupKey
121+
reissuedAssets[0].Asset.GroupedAsset = true
121122
reissuedAssets[1].Asset.GroupKey = collectGroupKey
123+
reissuedAssets[1].Asset.GroupedAsset = true
122124

123125
normalReissueGen := MintAssetsConfirmBatch(
124126
t.t, miner, t.tapd,
@@ -241,7 +243,7 @@ func testReIssuanceAmountOverflow(t *harnessTest) {
241243
assetIssueReqs := CopyRequests(issuableAssets)
242244
assetIssueReq := assetIssueReqs[0]
243245

244-
assetIssueReq.EnableEmission = true
246+
assetIssueReq.Asset.NewGroupedAsset = true
245247
assetIssueReq.Asset.Amount = math.MaxUint64
246248

247249
assets := MintAssetsConfirmBatch(
@@ -262,7 +264,7 @@ func testReIssuanceAmountOverflow(t *harnessTest) {
262264
// Reissue an amount which is minimally sufficient to lead to an
263265
// overflow error.
264266
assetIssueReq.Asset.Amount = 1
265-
assetIssueReq.EnableEmission = false
267+
assetIssueReq.Asset.GroupedAsset = true
266268
assetIssueReq.Asset.GroupKey = groupKey
267269

268270
ctxb := context.Background()
@@ -292,16 +294,45 @@ func testMintWithGroupKeyErrors(t *harnessTest) {
292294
// Now, create a minting request to try and reissue into the group
293295
// created during minting.
294296
reissueRequest := CopyRequest(simpleAssets[0])
297+
298+
// An asset cannot be both a new grouped asset and grouped asset.
299+
reissueRequest.Asset.NewGroupedAsset = true
300+
reissueRequest.Asset.GroupedAsset = true
301+
_, err := t.tapd.MintAsset(ctxb, reissueRequest)
302+
require.ErrorContains(t.t, err, "cannot set both new grouped asset")
303+
304+
// A grouped asset must specify a specific group.
305+
reissueRequest.Asset.NewGroupedAsset = false
306+
reissueRequest.Asset.GroupedAsset = true
307+
_, err = t.tapd.MintAsset(ctxb, reissueRequest)
308+
require.ErrorContains(t.t, err, "must specify a group key or")
309+
310+
// An asset cannot specify a group without being a grouped asset.
311+
reissueRequest.Asset.NewGroupedAsset = false
312+
reissueRequest.Asset.GroupedAsset = false
295313
reissueRequest.Asset.GroupKey = collectGroupKey
314+
_, err = t.tapd.MintAsset(ctxb, reissueRequest)
315+
require.ErrorContains(t.t, err, "must set grouped asset to mint")
296316

297-
// A request must not have the emission flag set if a group key is given.
298-
reissueRequest.EnableEmission = true
317+
// A grouped asset cannot specify both a group key and group anchor.
318+
reissueRequest.Asset.NewGroupedAsset = false
319+
reissueRequest.Asset.GroupedAsset = true
320+
reissueRequest.Asset.GroupKey = collectGroupKey
321+
reissueRequest.Asset.GroupAnchor = collectGenInfo.Name
322+
_, err = t.tapd.MintAsset(ctxb, reissueRequest)
323+
require.ErrorContains(t.t, err, "cannot specify both a group key")
299324

300-
_, err := t.tapd.MintAsset(ctxb, reissueRequest)
301-
require.ErrorContains(t.t, err, "must disable emission")
325+
// An asset cannot be a new grouped asset and reference a specific
326+
// group.
327+
reissueRequest.Asset.NewGroupedAsset = true
328+
reissueRequest.Asset.GroupedAsset = false
329+
_, err = t.tapd.MintAsset(ctxb, reissueRequest)
330+
require.ErrorContains(t.t, err, "must disable emission to specify")
302331

303-
// Restore the emission flag.
304-
reissueRequest.EnableEmission = false
332+
// Restore the correct flags for a new grouped asset.
333+
reissueRequest.Asset.NewGroupedAsset = false
334+
reissueRequest.Asset.GroupedAsset = true
335+
reissueRequest.Asset.GroupAnchor = ""
305336

306337
// A given group key must be parseable, so a group key with an invalid
307338
// parity byte should be rejected.

itest/universe_pagination_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ func mintBatchAssetsTest(
8181
Data: imageMetadataBytes,
8282
Type: 0,
8383
},
84-
Amount: 1,
84+
Amount: 1,
85+
NewGroupedAsset: false,
8586
},
86-
EnableEmission: false,
8787
}
8888

8989
// Update the asset name and metadata to match an index.
@@ -96,7 +96,7 @@ func mintBatchAssetsTest(
9696
// Use the first asset of the batch as the asset group anchor.
9797
collectibleAnchorReq := CopyRequest(&collectibleRequestTemplate)
9898
incrementMintAsset(collectibleAnchorReq.Asset, 0)
99-
collectibleAnchorReq.EnableEmission = true
99+
collectibleAnchorReq.Asset.NewGroupedAsset = true
100100
batchReqs = append(batchReqs, collectibleAnchorReq)
101101

102102
groupSize := testGroupSize
@@ -116,10 +116,12 @@ func mintBatchAssetsTest(
116116

117117
incrementMintAsset(groupedAsset.Asset, i)
118118
collectibleAnchorReq = CopyRequest(groupedAsset)
119-
groupedAsset.EnableEmission = true
119+
groupedAsset.Asset.NewGroupedAsset = true
120120
} else {
121121
groupedAsset.Asset.GroupAnchor =
122122
collectibleAnchorReq.Asset.Name
123+
groupedAsset.Asset.GroupedAsset = true
124+
groupedAsset.Asset.NewGroupedAsset = false
123125

124126
incrementMintAsset(groupedAsset.Asset, i)
125127
}

0 commit comments

Comments
 (0)