Skip to content

Commit 2e64bc5

Browse files
authored
txnbuild: Add txnbuild helper for sending a payment to a smart contract (#5642)
1 parent 18505a5 commit 2e64bc5

23 files changed

+845
-319
lines changed

Diff for: services/horizon/internal/ingest/processors/contract_data.go renamed to ingest/sac/contract_data.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package processors
1+
package sac
22

33
import (
44
"math/big"
@@ -452,7 +452,7 @@ func AssetToContractData(isNative bool, code, issuer string, contractID [32]byte
452452
//
453453
// Warning: Only for use in tests. This does not create the accompanied TTLEntry which would typically be created by core.
454454
func BalanceToContractData(assetContractId, holderID [32]byte, amt uint64) xdr.LedgerEntryData {
455-
return balanceToContractData(assetContractId, holderID, xdr.Int128Parts{
455+
return BalanceInt128ToContractData(assetContractId, holderID, xdr.Int128Parts{
456456
Lo: xdr.Uint64(amt),
457457
Hi: 0,
458458
})
@@ -488,7 +488,7 @@ func ContractBalanceLedgerKey(assetContractId, holderID [32]byte) xdr.LedgerKey
488488
}
489489
}
490490

491-
func balanceToContractData(assetContractId, holderID [32]byte, amt xdr.Int128Parts) xdr.LedgerEntryData {
491+
func BalanceInt128ToContractData(assetContractId, holderID [32]byte, amt xdr.Int128Parts) xdr.LedgerEntryData {
492492
ledgerKey := ContractBalanceLedgerKey(assetContractId, holderID)
493493

494494
amountSym := xdr.ScSymbol("amount")

Diff for: services/horizon/internal/ingest/processors/asset_stats_processor.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"math/big"
99

1010
"github.com/stellar/go/ingest"
11+
"github.com/stellar/go/ingest/sac"
1112
"github.com/stellar/go/services/horizon/internal/db2/history"
1213
"github.com/stellar/go/support/errors"
1314
"github.com/stellar/go/xdr"
@@ -74,8 +75,8 @@ func (p *AssetStatsProcessor) ProcessChange(ctx context.Context, change ingest.C
7475
if ledgerEntry == nil {
7576
ledgerEntry = change.Pre
7677
}
77-
asset := AssetFromContractData(*ledgerEntry, p.networkPassphrase)
78-
_, _, balanceFound := ContractBalanceFromContractData(*ledgerEntry, p.networkPassphrase)
78+
asset := sac.AssetFromContractData(*ledgerEntry, p.networkPassphrase)
79+
_, _, balanceFound := sac.ContractBalanceFromContractData(*ledgerEntry, p.networkPassphrase)
7980
if asset == nil && !balanceFound {
8081
return nil
8182
}

Diff for: services/horizon/internal/ingest/processors/asset_stats_processor_test.go

+25-24
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/stretchr/testify/assert"
1212

1313
"github.com/stellar/go/ingest"
14+
"github.com/stellar/go/ingest/sac"
1415
"github.com/stellar/go/services/horizon/internal/db2/history"
1516
"github.com/stellar/go/xdr"
1617

@@ -524,12 +525,12 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertContractID() {
524525
}
525526
eurID, err := trustLine.Asset.ToAsset().ContractID("")
526527
s.Assert().NoError(err)
527-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
528+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
528529
s.Assert().NoError(err)
529530

530531
usdID, err := xdr.MustNewCreditAsset("USD", trustLineIssuer.Address()).ContractID("")
531532
s.Assert().NoError(err)
532-
usdContractData, err := AssetToContractData(false, "USD", trustLineIssuer.Address(), usdID)
533+
usdContractData, err := sac.AssetToContractData(false, "USD", trustLineIssuer.Address(), usdID)
533534
s.Assert().NoError(err)
534535

535536
lastModifiedLedgerSeq := xdr.Uint32(1234)
@@ -638,7 +639,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertContractBalance() {
638639
Type: xdr.LedgerEntryTypeContractData,
639640
Post: &xdr.LedgerEntry{
640641
LastModifiedLedgerSeq: lastModifiedLedgerSeq,
641-
Data: BalanceToContractData(usdID, [32]byte{1}, 200),
642+
Data: sac.BalanceToContractData(usdID, [32]byte{1}, 200),
642643
},
643644
}))
644645

@@ -704,11 +705,11 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateContractBalance() {
704705
Type: xdr.LedgerEntryTypeContractData,
705706
Pre: &xdr.LedgerEntry{
706707
LastModifiedLedgerSeq: lastModifiedLedgerSeq,
707-
Data: BalanceToContractData(usdID, [32]byte{1}, 100),
708+
Data: sac.BalanceToContractData(usdID, [32]byte{1}, 100),
708709
},
709710
Post: &xdr.LedgerEntry{
710711
LastModifiedLedgerSeq: lastModifiedLedgerSeq,
711-
Data: BalanceToContractData(usdID, [32]byte{1}, 300),
712+
Data: sac.BalanceToContractData(usdID, [32]byte{1}, 300),
712713
},
713714
}))
714715

@@ -763,7 +764,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveContractBalance() {
763764
Type: xdr.LedgerEntryTypeContractData,
764765
Pre: &xdr.LedgerEntry{
765766
LastModifiedLedgerSeq: lastModifiedLedgerSeq,
766-
Data: BalanceToContractData(usdID, [32]byte{1}, 200),
767+
Data: sac.BalanceToContractData(usdID, [32]byte{1}, 200),
767768
},
768769
}))
769770

@@ -821,12 +822,12 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertContractIDWithBalance() {
821822
}
822823
eurID, err := trustLine.Asset.ToAsset().ContractID("")
823824
s.Assert().NoError(err)
824-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
825+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
825826
s.Assert().NoError(err)
826827

827828
usdID, err := xdr.MustNewCreditAsset("USD", trustLineIssuer.Address()).ContractID("")
828829
s.Assert().NoError(err)
829-
usdContractData, err := AssetToContractData(false, "USD", trustLineIssuer.Address(), usdID)
830+
usdContractData, err := sac.AssetToContractData(false, "USD", trustLineIssuer.Address(), usdID)
830831
s.Assert().NoError(err)
831832

832833
lastModifiedLedgerSeq := xdr.Uint32(1234)
@@ -867,7 +868,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertContractIDWithBalance() {
867868
Type: xdr.LedgerEntryTypeContractData,
868869
Post: &xdr.LedgerEntry{
869870
LastModifiedLedgerSeq: lastModifiedLedgerSeq,
870-
Data: BalanceToContractData(usdID, [32]byte{1}, 150),
871+
Data: sac.BalanceToContractData(usdID, [32]byte{1}, 150),
871872
},
872873
}))
873874

@@ -876,7 +877,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertContractIDWithBalance() {
876877
Type: xdr.LedgerEntryTypeContractData,
877878
Post: &xdr.LedgerEntry{
878879
LastModifiedLedgerSeq: lastModifiedLedgerSeq,
879-
Data: BalanceToContractData(btcID, [32]byte{1}, 20),
880+
Data: sac.BalanceToContractData(btcID, [32]byte{1}, 20),
880881
},
881882
}))
882883

@@ -1096,7 +1097,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateContractID() {
10961097

10971098
eurID, err := xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()).ContractID("")
10981099
s.Assert().NoError(err)
1099-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
1100+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
11001101
s.Assert().NoError(err)
11011102

11021103
err = s.processor.ProcessChange(s.ctx, ingest.Change{
@@ -1231,7 +1232,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateContractIDWithBalance() {
12311232

12321233
eurID, err := xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()).ContractID("")
12331234
s.Assert().NoError(err)
1234-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
1235+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
12351236
s.Assert().NoError(err)
12361237

12371238
err = s.processor.ProcessChange(s.ctx, ingest.Change{
@@ -1247,7 +1248,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateContractIDWithBalance() {
12471248
Type: xdr.LedgerEntryTypeContractData,
12481249
Post: &xdr.LedgerEntry{
12491250
LastModifiedLedgerSeq: lastModifiedLedgerSeq,
1250-
Data: BalanceToContractData(eurID, [32]byte{1}, 150),
1251+
Data: sac.BalanceToContractData(eurID, [32]byte{1}, 150),
12511252
},
12521253
}))
12531254
keyHash := getKeyHashForBalance(s.T(), eurID, [32]byte{1})
@@ -1350,7 +1351,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateContractIDError() {
13501351
s.Assert().NoError(err)
13511352
eurID, err := xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()).ContractID("")
13521353
s.Assert().NoError(err)
1353-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
1354+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
13541355
s.Assert().NoError(err)
13551356

13561357
err = s.processor.ProcessChange(s.ctx, ingest.Change{
@@ -1395,7 +1396,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustlineAndContractIDErr
13951396
s.Assert().NoError(err)
13961397
eurID, err := xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()).ContractID("")
13971398
s.Assert().NoError(err)
1398-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
1399+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
13991400
s.Assert().NoError(err)
14001401

14011402
err = s.processor.ProcessChange(s.ctx, ingest.Change{
@@ -1470,7 +1471,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveContractIDError() {
14701471

14711472
eurID, err := xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()).ContractID("")
14721473
s.Assert().NoError(err)
1473-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
1474+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
14741475
s.Assert().NoError(err)
14751476

14761477
err = s.processor.ProcessChange(s.ctx, ingest.Change{
@@ -1496,7 +1497,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustlineAndRemoveContrac
14961497

14971498
eurID, err := xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()).ContractID("")
14981499
s.Assert().NoError(err)
1499-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
1500+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
15001501
s.Assert().NoError(err)
15011502

15021503
err = s.processor.ProcessChange(s.ctx, ingest.Change{
@@ -2085,7 +2086,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveContractID() {
20852086

20862087
eurID, err := xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()).ContractID("")
20872088
s.Assert().NoError(err)
2088-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
2089+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
20892090
s.Assert().NoError(err)
20902091

20912092
err = s.processor.ProcessChange(s.ctx, ingest.Change{
@@ -2138,7 +2139,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustlineAndRemoveContrac
21382139

21392140
eurID, err := xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()).ContractID("")
21402141
s.Assert().NoError(err)
2141-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
2142+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
21422143
s.Assert().NoError(err)
21432144

21442145
err = s.processor.ProcessChange(s.ctx, ingest.Change{
@@ -2238,7 +2239,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveContractIDFromZeroRow() {
22382239

22392240
eurID, err := xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()).ContractID("")
22402241
s.Assert().NoError(err)
2241-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
2242+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
22422243
s.Assert().NoError(err)
22432244

22442245
err = s.processor.ProcessChange(s.ctx, ingest.Change{
@@ -2292,7 +2293,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveContractIDAndBalanceZeroR
22922293

22932294
eurID, err := xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()).ContractID("")
22942295
s.Assert().NoError(err)
2295-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
2296+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
22962297
s.Assert().NoError(err)
22972298

22982299
err = s.processor.ProcessChange(s.ctx, ingest.Change{
@@ -2308,7 +2309,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveContractIDAndBalanceZeroR
23082309
Type: xdr.LedgerEntryTypeContractData,
23092310
Pre: &xdr.LedgerEntry{
23102311
LastModifiedLedgerSeq: lastModifiedLedgerSeq,
2311-
Data: BalanceToContractData(eurID, [32]byte{1}, 9),
2312+
Data: sac.BalanceToContractData(eurID, [32]byte{1}, 9),
23122313
},
23132314
}))
23142315
keyHash := getKeyHashForBalance(s.T(), eurID, [32]byte{1})
@@ -2330,7 +2331,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveContractIDAndBalanceZeroR
23302331
Type: xdr.LedgerEntryTypeContractData,
23312332
Pre: &xdr.LedgerEntry{
23322333
LastModifiedLedgerSeq: lastModifiedLedgerSeq,
2333-
Data: BalanceToContractData(eurID, [32]byte{2}, 1),
2334+
Data: sac.BalanceToContractData(eurID, [32]byte{2}, 1),
23342335
},
23352336
}))
23362337
otherKeyHash := getKeyHashForBalance(s.T(), eurID, [32]byte{2})
@@ -2406,7 +2407,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveContractIDAndRow() {
24062407

24072408
eurID, err := xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()).ContractID("")
24082409
s.Assert().NoError(err)
2409-
eurContractData, err := AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
2410+
eurContractData, err := sac.AssetToContractData(false, "EUR", trustLineIssuer.Address(), eurID)
24102411
s.Assert().NoError(err)
24112412

24122413
err = s.processor.ProcessChange(s.ctx, ingest.Change{

Diff for: services/horizon/internal/ingest/processors/contract_asset_stats.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"math/big"
88

99
"github.com/stellar/go/ingest"
10+
"github.com/stellar/go/ingest/sac"
1011
"github.com/stellar/go/services/horizon/internal/db2/history"
1112
"github.com/stellar/go/support/errors"
1213
"github.com/stellar/go/xdr"
@@ -107,7 +108,7 @@ func (s *ContractAssetStatSet) GetAssetToContractMap() map[xdr.Hash]*xdr.Asset {
107108

108109
func (s *ContractAssetStatSet) ingestAssetContractMetadata(change ingest.Change) (bool, error) {
109110
if change.Pre != nil {
110-
asset := AssetFromContractData(*change.Pre, s.networkPassphrase)
111+
asset := sac.AssetFromContractData(*change.Pre, s.networkPassphrase)
111112
if asset == nil {
112113
return false, nil
113114
}
@@ -123,13 +124,13 @@ func (s *ContractAssetStatSet) ingestAssetContractMetadata(change ingest.Change)
123124
// The contract id for any soroban contract should never change and
124125
// therefore we return a fatal ingestion error if we encounter
125126
// a stellar asset changing contract ids.
126-
postAsset := AssetFromContractData(*change.Post, s.networkPassphrase)
127+
postAsset := sac.AssetFromContractData(*change.Post, s.networkPassphrase)
127128
if postAsset == nil || !(*postAsset).Equals(*asset) {
128129
return false, ingest.NewStateError(fmt.Errorf("asset contract changed asset"))
129130
}
130131
return true, nil
131132
} else if change.Post != nil {
132-
asset := AssetFromContractData(*change.Post, s.networkPassphrase)
133+
asset := sac.AssetFromContractData(*change.Post, s.networkPassphrase)
133134
if asset == nil {
134135
return false, nil
135136
}
@@ -161,7 +162,7 @@ func (s *ContractAssetStatSet) ingestContractAssetBalance(ctx context.Context, c
161162
return nil
162163
}
163164

164-
_, postAmt, postOk := ContractBalanceFromContractData(*change.Post, s.networkPassphrase)
165+
_, postAmt, postOk := sac.ContractBalanceFromContractData(*change.Post, s.networkPassphrase)
165166
// we only ingest created ledger entries if we determine that they resemble the shape of
166167
// a Stellar Asset Contract balance ledger entry
167168
if !postOk {
@@ -211,7 +212,7 @@ func (s *ContractAssetStatSet) ingestContractAssetBalance(ctx context.Context, c
211212
// entry from our db when the entry is removed from the ledger.
212213
s.removedBalances = append(s.removedBalances, keyHash)
213214

214-
_, preAmt, ok := ContractBalanceFromContractData(*change.Pre, s.networkPassphrase)
215+
_, preAmt, ok := sac.ContractBalanceFromContractData(*change.Pre, s.networkPassphrase)
215216
if !ok {
216217
return nil
217218
}
@@ -236,14 +237,14 @@ func (s *ContractAssetStatSet) ingestContractAssetBalance(ctx context.Context, c
236237
return nil
237238
}
238239

239-
holder, amt, ok := ContractBalanceFromContractData(*change.Pre, s.networkPassphrase)
240+
holder, amt, ok := sac.ContractBalanceFromContractData(*change.Pre, s.networkPassphrase)
240241
if !ok {
241242
return nil
242243
}
243244

244245
// if the updated ledger entry is not in the expected format then this
245246
// cannot be emitted by the stellar asset contract, so ignore it
246-
postHolder, postAmt, postOk := ContractBalanceFromContractData(*change.Post, s.networkPassphrase)
247+
postHolder, postAmt, postOk := sac.ContractBalanceFromContractData(*change.Post, s.networkPassphrase)
247248
if !postOk || postHolder != holder {
248249
return nil
249250
}

0 commit comments

Comments
 (0)