diff --git a/tapdb/assets_store.go b/tapdb/assets_store.go index e408508d6..93f7f748f 100644 --- a/tapdb/assets_store.go +++ b/tapdb/assets_store.go @@ -883,6 +883,18 @@ func (a *AssetStore) constraintsToDbFilter( assetFilter.AssetIDFilter = assetIDBytes assetFilter.KeyGroupFilter = groupKeyBytes + // Check if there's exactly one PrevID and set the filters accordingly. + if len(query.PrevIDs) == 1 { + prevID := query.PrevIDs[0] + encodedOutpoint, err := encodeOutpoint(prevID.OutPoint) + if err == nil { + assetFilter.AnchorPoint = encodedOutpoint + assetFilter.TweakedScriptKey = prevID.ScriptKey.CopyBytes() + } + // If there's an error, we simply skip setting the fields + // TODO, maybe log error or return it? + } + // TODO(roasbeef): only want to allow asset ID or other and not // both? diff --git a/tapfreighter/coin_select.go b/tapfreighter/coin_select.go index 2e5408ba5..2dcca14c8 100644 --- a/tapfreighter/coin_select.go +++ b/tapfreighter/coin_select.go @@ -55,6 +55,7 @@ func (s *CoinSelect) SelectCoins(ctx context.Context, AssetSpecifier: constraints.AssetSpecifier, MinAmt: 1, CoinSelectType: constraints.CoinSelectType, + PrevIDs: constraints.PrevIDs, } eligibleCommitments, err := s.coinLister.ListEligibleCoins( ctx, listConstraints, diff --git a/tapfreighter/interface.go b/tapfreighter/interface.go index 59fb6016a..7865410a4 100644 --- a/tapfreighter/interface.go +++ b/tapfreighter/interface.go @@ -35,6 +35,9 @@ type CommitmentConstraints struct { // to satisfy the constraints. MinAmt uint64 + // PrevIDs are the set of inputs allowed to be used + PrevIDs []*asset.PrevID + // CoinSelectType is the type of coins that should be selected. CoinSelectType tapsend.CoinSelectType } diff --git a/tapfreighter/wallet.go b/tapfreighter/wallet.go index d9bc1e0a0..4898a8d82 100644 --- a/tapfreighter/wallet.go +++ b/tapfreighter/wallet.go @@ -255,6 +255,11 @@ func (f *AssetWallet) FundAddressSend(ctx context.Context, return nil, fmt.Errorf("unable to describe recipients: %w", err) } + // We need to constrain the prevIDs if they are provided. + if len(prevIds) > 0 { + fundDesc.PrevIDs = prevIds + } + fundDesc.CoinSelectType = coinSelectType fundedVPkt, err := f.FundPacket(ctx, fundDesc, vPkt) if err != nil { @@ -373,6 +378,7 @@ func (f *AssetWallet) FundPacket(ctx context.Context, AssetSpecifier: fundDesc.AssetSpecifier, MinAmt: fundDesc.Amount, CoinSelectType: fundDesc.CoinSelectType, + PrevIDs: fundDesc.PrevIDs, } anchorVersion, err := tappsbt.CommitmentVersion(vPkt.Version) diff --git a/tapsend/send.go b/tapsend/send.go index 87bb67a11..ccfe0493d 100644 --- a/tapsend/send.go +++ b/tapsend/send.go @@ -193,6 +193,9 @@ type FundingDescriptor struct { // Amount is the amount of the asset to transfer. Amount uint64 + // PrevIDs is the set of inputs that can be used to fund the transfer. + PrevIDs []*asset.PrevID + // CoinSelectType specifies the type of coins that should be selected. CoinSelectType CoinSelectType }