Skip to content

Commit 61c322a

Browse files
committed
Encode destinations in public distribution intent record
1 parent ba4ba43 commit 61c322a

File tree

9 files changed

+516
-63
lines changed

9 files changed

+516
-63
lines changed

pkg/code/data/intent/intent.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,17 @@ type ReceivePaymentsPubliclyMetadata struct {
100100

101101
type PublicDistributionMetadata struct {
102102
Source string
103+
Distributions []*Distribution
103104
Quantity uint64
104105
UsdMarketValue float64
105106
}
106107

108+
type Distribution struct {
109+
DestinationOwnerAccount string
110+
DestinationTokenAccount string
111+
Quantity uint64
112+
}
113+
107114
func (r *Record) IsCompleted() bool {
108115
return r.State == StateConfirmed
109116
}
@@ -416,15 +423,29 @@ func (m *ReceivePaymentsPubliclyMetadata) Validate() error {
416423
}
417424

418425
func (m *PublicDistributionMetadata) Clone() PublicDistributionMetadata {
426+
clonedDistributions := make([]*Distribution, len(m.Distributions))
427+
for i, distribution := range m.Distributions {
428+
cloned := distribution.Clone()
429+
clonedDistributions[i] = &cloned
430+
}
431+
419432
return PublicDistributionMetadata{
420433
Source: m.Source,
434+
Distributions: clonedDistributions,
421435
Quantity: m.Quantity,
422436
UsdMarketValue: m.UsdMarketValue,
423437
}
424438
}
425439

426440
func (m *PublicDistributionMetadata) CopyTo(dst *PublicDistributionMetadata) {
441+
clonedDistributions := make([]*Distribution, len(m.Distributions))
442+
for i, distribution := range m.Distributions {
443+
cloned := distribution.Clone()
444+
clonedDistributions[i] = &cloned
445+
}
446+
427447
dst.Source = m.Source
448+
dst.Distributions = clonedDistributions
428449
dst.Quantity = m.Quantity
429450
dst.UsdMarketValue = m.UsdMarketValue
430451
}
@@ -434,6 +455,45 @@ func (m *PublicDistributionMetadata) Validate() error {
434455
return errors.New("source is required")
435456
}
436457

458+
if len(m.Distributions) == 0 {
459+
return errors.New("distributions are required")
460+
}
461+
for _, distribution := range m.Distributions {
462+
if err := distribution.Validate(); err != nil {
463+
return err
464+
}
465+
}
466+
467+
if m.Quantity == 0 {
468+
return errors.New("quantity is required")
469+
}
470+
471+
return nil
472+
}
473+
474+
func (m *Distribution) Clone() Distribution {
475+
return Distribution{
476+
DestinationOwnerAccount: m.DestinationOwnerAccount,
477+
DestinationTokenAccount: m.DestinationTokenAccount,
478+
Quantity: m.Quantity,
479+
}
480+
}
481+
482+
func (m *Distribution) CopyTo(dst *Distribution) {
483+
dst.DestinationOwnerAccount = m.DestinationOwnerAccount
484+
dst.DestinationTokenAccount = m.DestinationTokenAccount
485+
dst.Quantity = m.Quantity
486+
}
487+
488+
func (m *Distribution) Validate() error {
489+
if len(m.DestinationOwnerAccount) == 0 {
490+
return errors.New("destination owner account is required")
491+
}
492+
493+
if len(m.DestinationTokenAccount) == 0 {
494+
return errors.New("destination token account is required")
495+
}
496+
437497
if m.Quantity == 0 {
438498
return errors.New("quantity is required")
439499
}

pkg/code/data/intent/memory/store.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,21 @@ func (s *store) findByOwner(owner string) []*intent.Record {
7373

7474
if item.SendPublicPaymentMetadata != nil && item.SendPublicPaymentMetadata.DestinationOwnerAccount == owner {
7575
res = append(res, item)
76-
continue
76+
}
77+
78+
if item.PublicDistributionMetadata != nil {
79+
for _, distribution := range item.PublicDistributionMetadata.Distributions {
80+
if distribution.DestinationOwnerAccount == owner {
81+
res = append(res, item)
82+
}
83+
}
7784
}
7885
}
7986

8087
return res
8188
}
8289

90+
// todo: doesn't support PublicDistribution, but it's not required
8391
func (s *store) findByDestination(destination string) []*intent.Record {
8492
res := make([]*intent.Record, 0)
8593
for _, item := range s.records {
@@ -97,6 +105,7 @@ func (s *store) findByDestination(destination string) []*intent.Record {
97105
return res
98106
}
99107

108+
// todo: doesn't support PublicDistribution, but it's not required
100109
func (s *store) findBySource(source string) []*intent.Record {
101110
res := make([]*intent.Record, 0)
102111
for _, item := range s.records {
@@ -110,7 +119,8 @@ func (s *store) findBySource(source string) []*intent.Record {
110119
return res
111120
}
112121

113-
func (s *store) findByOwnerSinceTimestamp(owner string, since time.Time) []*intent.Record {
122+
// todo: doesn't support PublicDistribution, but it's not required
123+
func (s *store) findByInitiatorOwnerSinceTimestamp(owner string, since time.Time) []*intent.Record {
114124
res := make([]*intent.Record, 0)
115125
for _, item := range s.records {
116126
if item.CreatedAt.Before(since) {
@@ -348,7 +358,7 @@ func (s *store) GetTransactedAmountForAntiMoneyLaundering(ctx context.Context, o
348358
s.mu.Lock()
349359
defer s.mu.Unlock()
350360

351-
items := s.findByOwnerSinceTimestamp(owner, since)
361+
items := s.findByInitiatorOwnerSinceTimestamp(owner, since)
352362
items = s.filterByType(items, intent.SendPublicPayment)
353363
items = s.filterByState(items, false, intent.StateRevoked)
354364
items = s.filterByWithdrawalFlag(items, false)

0 commit comments

Comments
 (0)