Skip to content

Commit

Permalink
tapdb+tapsend+tapfreighter:add prevIds to constraints we can filter on
Browse files Browse the repository at this point in the history
  • Loading branch information
habibitcoin committed Nov 8, 2024
1 parent baed202 commit 483eb84
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 1 deletion.
43 changes: 42 additions & 1 deletion tapdb/assets_store.go
Original file line number Diff line number Diff line change
Expand Up @@ -1991,7 +1991,48 @@ func (a *AssetStore) ListEligibleCoins(ctx context.Context,
// have a block height of 0, so we set the minimum block height to 1.
assetFilter.MinAnchorHeight = sqlInt32(1)

return a.queryCommitments(ctx, assetFilter)
selectedCommitments, err := a.queryCommitments(ctx, assetFilter)
if err != nil {
return nil, fmt.Errorf("unable to query commitments: %w", err)
}

// If we want to restrict on specific inputs, we do the filtering now.
if len(constraints.PrevIDs) > 0 {
selectedCommitments = filterCommitmentsByPrevIDs(
selectedCommitments, constraints.PrevIDs,
)

// If this results in an empty list, we return the same error we
// would if there were no coins found without the filter.
if len(selectedCommitments) == 0 {
return nil, tapfreighter.ErrMatchingAssetsNotFound
}
}

return selectedCommitments, nil
}

// filterCommitmentsByPrevIDs filters the given commitments by the previous IDs
// given.
func filterCommitmentsByPrevIDs(commitments []*tapfreighter.AnchoredCommitment,
prevIDs []asset.PrevID) []*tapfreighter.AnchoredCommitment {

prevIDMatches := func(p asset.PrevID,
c *tapfreighter.AnchoredCommitment) bool {

return p.OutPoint == c.AnchorPoint && p.ID == c.Asset.ID() &&
p.ScriptKey == asset.ToSerialized(
c.Asset.ScriptKey.PubKey,
)
}

commitmentInList := func(c *tapfreighter.AnchoredCommitment) bool {
return fn.Any(prevIDs, func(p asset.PrevID) bool {
return prevIDMatches(p, c)
})
}

return fn.Filter(commitments, commitmentInList)
}

// LeaseCoins leases/locks/reserves coins for the given lease owner until the
Expand Down
1 change: 1 addition & 0 deletions tapfreighter/coin_select.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
3 changes: 3 additions & 0 deletions tapfreighter/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
6 changes: 6 additions & 0 deletions tapfreighter/wallet.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions tapsend/send.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down

0 comments on commit 483eb84

Please sign in to comment.