Skip to content

Commit dc3af8e

Browse files
authored
Merge pull request #1325 from lightninglabs/unit-commitment-mint-output
Add pre-commitment output to mint anchor TX
2 parents c09bc46 + cef2567 commit dc3af8e

25 files changed

+2079
-428
lines changed

cmd/commands/assets.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ var (
5959
groupByGroupName = "by_group"
6060
assetIDName = "asset_id"
6161
shortResponseName = "short"
62+
universeCommitmentsName = "universe_commitments"
6263
feeRateName = "sat_per_vbyte"
6364
assetAmountName = "amount"
6465
burnOverrideConfirmationName = "override_confirmation_destroy_assets"
@@ -154,6 +155,15 @@ var mintAssetCommand = cli.Command{
154155
Usage: "the master fingerprint of the key the xpub " +
155156
"was derived from",
156157
},
158+
cli.BoolFlag{
159+
Name: universeCommitmentsName,
160+
Usage: "if set, the asset group will be minted with " +
161+
"universe commitments enabled " +
162+
"(minter-controlled, on-chain attestations " +
163+
"that anchor and verify the state of an " +
164+
"asset group); this option restricts the " +
165+
"minting batch to a single asset group",
166+
},
157167
},
158168
Action: mintAsset,
159169
Subcommands: []cli.Command{
@@ -382,7 +392,8 @@ func mintAsset(ctx *cli.Context) error {
382392
AssetVersion: taprpc.AssetVersion(
383393
ctx.Uint64(assetVersionName),
384394
),
385-
ExternalGroupKey: externalKey,
395+
ExternalGroupKey: externalKey,
396+
UniverseCommitments: ctx.Bool(universeCommitmentsName),
386397
},
387398
ShortResponse: ctx.Bool(shortResponseName),
388399
})

proof/meta.go

+15-6
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,6 @@ type MetaReveal struct {
174174
UnknownOddTypes tlv.TypeMap
175175
}
176176

177-
// SizableInteger is a subset of Integer that excludes int8, since we never use
178-
// it in practice.
179-
type SizableInteger interface {
180-
constraints.Unsigned | ~int | ~int16 | ~int32 | ~int64
181-
}
182-
183177
// Validate validates the meta reveal.
184178
func (m *MetaReveal) Validate() error {
185179
// A meta reveal is allowed to be nil.
@@ -234,6 +228,13 @@ func (m *MetaReveal) Validate() error {
234228
return err
235229
}
236230

231+
// The asset metadata is invalid when the universe commitments feature
232+
// is enabled but no delegation key is specified.
233+
if m.UniverseCommitments && m.DelegationKey.IsNone() {
234+
return fmt.Errorf("universe commitments enabled in asset " +
235+
"metadata but delegation key is unspecified")
236+
}
237+
237238
return fn.MapOptionZ(m.DelegationKey, func(key btcec.PublicKey) error {
238239
if key == emptyKey {
239240
return ErrDelegationKeyEmpty
@@ -247,6 +248,12 @@ func (m *MetaReveal) Validate() error {
247248
})
248249
}
249250

251+
// SizableInteger is a subset of Integer that excludes int8, since we never use
252+
// it in practice.
253+
type SizableInteger interface {
254+
constraints.Unsigned | ~int | ~int16 | ~int32 | ~int64
255+
}
256+
250257
// IsValidMetaType checks if the passed value is a valid meta type.
251258
func IsValidMetaType[T SizableInteger](num T) (MetaType, error) {
252259
switch {
@@ -288,6 +295,8 @@ func IsValidDecDisplay(decDisplay uint32) error {
288295

289296
// DecodeMetaJSON decodes bytes as a JSON object, after checking that the bytes
290297
// could be valid metadata.
298+
//
299+
// TODO(ffranr): Add unit test for `jBytes := []byte{}`.
291300
func DecodeMetaJSON(jBytes []byte) (map[string]interface{}, error) {
292301
jMeta := make(map[string]interface{})
293302

rpcserver.go

+13-19
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,10 @@ func (r *rpcServer) MintAsset(ctx context.Context,
508508
"collectibles")
509509
}
510510

511-
var seedlingMeta *proof.MetaReveal
511+
// TODO(ffranr): Move seedling MetaReveal construction into
512+
// ChainPlanter. This will allow us to simplify delegation key
513+
// management.
514+
var seedlingMeta proof.MetaReveal
512515
switch {
513516
// If we have an explicit asset meta field, we parse the content.
514517
case req.Asset.AssetMeta != nil:
@@ -520,7 +523,7 @@ func (r *rpcServer) MintAsset(ctx context.Context,
520523

521524
// If the asset meta field was specified, then the data inside
522525
// must be valid. Let's check that now.
523-
seedlingMeta = &proof.MetaReveal{
526+
seedlingMeta = proof.MetaReveal{
524527
Data: req.Asset.AssetMeta.Data,
525528
Type: metaType,
526529
}
@@ -542,15 +545,10 @@ func (r *rpcServer) MintAsset(ctx context.Context,
542545
return nil, err
543546
}
544547

545-
err = seedlingMeta.Validate()
546-
if err != nil {
547-
return nil, err
548-
}
549-
550548
// If no asset meta field was specified, we create a default meta
551549
// reveal with the decimal display set.
552550
default:
553-
seedlingMeta = &proof.MetaReveal{
551+
seedlingMeta = proof.MetaReveal{
554552
Type: proof.MetaOpaque,
555553
}
556554

@@ -560,11 +558,6 @@ func (r *rpcServer) MintAsset(ctx context.Context,
560558
if err != nil {
561559
return nil, err
562560
}
563-
564-
err = seedlingMeta.Validate()
565-
if err != nil {
566-
return nil, err
567-
}
568561
}
569562

570563
// Parse the optional script key and group internal key. The group
@@ -602,12 +595,13 @@ func (r *rpcServer) MintAsset(ctx context.Context,
602595
}
603596

604597
seedling := &tapgarden.Seedling{
605-
AssetVersion: assetVersion,
606-
AssetType: asset.Type(req.Asset.AssetType),
607-
AssetName: req.Asset.Name,
608-
Amount: req.Asset.Amount,
609-
EnableEmission: req.Asset.NewGroupedAsset,
610-
Meta: seedlingMeta,
598+
AssetVersion: assetVersion,
599+
AssetType: asset.Type(req.Asset.AssetType),
600+
AssetName: req.Asset.Name,
601+
Amount: req.Asset.Amount,
602+
EnableEmission: req.Asset.NewGroupedAsset,
603+
Meta: &seedlingMeta,
604+
UniverseCommitments: req.Asset.UniverseCommitments,
611605
}
612606

613607
rpcsLog.Infof("[MintAsset]: version=%v, type=%v, name=%v, amt=%v, "+

tapcfg/server.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -534,10 +534,8 @@ func genServerConfig(cfg *Config, cfgLogger btclog.Logger,
534534
RuntimeID: runtimeID,
535535
EnableChannelFeatures: enableChannelFeatures,
536536
Lnd: lndServices,
537-
ChainParams: address.ParamsForChain(
538-
cfg.ActiveNetParams.Name,
539-
),
540-
ReOrgWatcher: reOrgWatcher,
537+
ChainParams: tapChainParams,
538+
ReOrgWatcher: reOrgWatcher,
541539
AssetMinter: tapgarden.NewChainPlanter(tapgarden.PlanterConfig{
542540
GardenKit: tapgarden.GardenKit{
543541
Wallet: walletAnchor,
@@ -553,6 +551,7 @@ func genServerConfig(cfg *Config, cfgLogger btclog.Logger,
553551
ProofWatcher: reOrgWatcher,
554552
UniversePushBatchSize: defaultUniverseSyncBatchSize,
555553
},
554+
ChainParams: tapChainParams,
556555
ProofUpdates: proofArchive,
557556
ErrChan: mainErrChan,
558557
}),

0 commit comments

Comments
 (0)