Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Token Transfer Processor - Derive classic events from operation and operation results #5609

Merged
merged 87 commits into from
Mar 21, 2025
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
291c0b6
Initial boiler plate commit for token transfer processor
karthikiyer56 Feb 19, 2025
b27d886
Add support for feeEvent
karthikiyer56 Feb 19, 2025
f76543a
Add support for createAccount and accountMerge
karthikiyer56 Feb 19, 2025
b97f95c
Add support for simple payment
karthikiyer56 Feb 20, 2025
571679c
Add unit tests for createAccount, mergeAccount, simple Payment
karthikiyer56 Feb 20, 2025
eb92532
refactor unit tests
karthikiyer56 Feb 21, 2025
5aebc69
Add logic for ManageBuyOffer, ManageSellOffer, CreatePassiveSellOffer…
karthikiyer56 Feb 21, 2025
00cead5
Add comments to explain sellerId in manageBuy/Sell operations
karthikiyer56 Feb 21, 2025
a858f64
Remove the incorreectly named FeeAccount receiver function from trans…
karthikiyer56 Feb 21, 2025
30472ff
Update the way we generate the fee event
karthikiyer56 Feb 21, 2025
8e7f358
rework code and add fixtures for all manageOffer operations and scena…
karthikiyer56 Feb 22, 2025
3e731c5
Make the assertion on the equality of proto expected vs actual events…
karthikiyer56 Feb 22, 2025
e52beb3
rework some test code
karthikiyer56 Feb 22, 2025
088ca7e
rework some anonymous functions in test cases
karthikiyer56 Feb 22, 2025
d6969b2
Add unit test for feeEvent
karthikiyer56 Feb 22, 2025
816e550
Unit test cleanup
karthikiyer56 Feb 23, 2025
ab52fd5
Make mintOrBurnOrTransferEvent function take an address wrapper inste…
karthikiyer56 Feb 25, 2025
0d22648
Add code for path payment and liquidity pool operations
karthikiyer56 Feb 26, 2025
bcb7c8d
Refactor some code and unit tests
karthikiyer56 Feb 26, 2025
7c35bd9
add code for createClaimableBalance
karthikiyer56 Feb 26, 2025
e4d2df9
Add support for claim claimable balance
karthikiyer56 Feb 26, 2025
c4306bd
Add support for clawback and clawback claimable balance operation
karthikiyer56 Feb 26, 2025
eb9aea1
Add unit tests for liquidity pool deposit and withdraw operations
karthikiyer56 Feb 26, 2025
091a588
Rework test fixtures
karthikiyer56 Feb 27, 2025
199fb13
Partially done path payment unit tests
karthikiyer56 Feb 27, 2025
ca558a4
Complete tests for path payment
karthikiyer56 Feb 27, 2025
205745a
fix test name
karthikiyer56 Feb 27, 2025
3f21336
return false
karthikiyer56 Feb 27, 2025
e5d6cd1
Add unit tests for clawback event. also refactor code
karthikiyer56 Feb 27, 2025
895c416
Add unit test for clawback claimable balance
karthikiyer56 Feb 27, 2025
9dbe785
Add test for claim claimable balance operation
karthikiyer56 Feb 27, 2025
ce666c4
rework code for finding liquidity pool details and claimable balance …
karthikiyer56 Feb 28, 2025
ecab46d
logic for allowTrust and setTrustlineFlags operations. These areeasil…
karthikiyer56 Mar 1, 2025
5313f59
Ignore the changes in this file for now. this is just a sample test c…
karthikiyer56 Mar 1, 2025
aa13ae9
undo changes to xdr/claimable_balance.go
karthikiyer56 Mar 1, 2025
0f87a2b
Fix bug in the way comparision was happening to find out which LP cre…
karthikiyer56 Mar 1, 2025
551eea5
More working changes to integration test. Made the setTrustline flags…
karthikiyer56 Mar 1, 2025
f3126a8
ensure that the LP delta is always positive
karthikiyer56 Mar 1, 2025
77304e9
add one more test for burn event from trustline revocation
karthikiyer56 Mar 1, 2025
6a6e9af
sample test cases for revoke trustline case and some code cleanup
karthikiyer56 Mar 3, 2025
a5a2583
working test for account
karthikiyer56 Mar 3, 2025
f80473a
pull out the integration test into its own file
karthikiyer56 Mar 3, 2025
7f5c233
Add extensive unit tests for revoke trustline case. Rework code to ad…
karthikiyer56 Mar 4, 2025
a4a9e24
Rename function to indicate that the events are derived from operatio…
karthikiyer56 Mar 4, 2025
d444f9d
correct the comments
karthikiyer56 Mar 4, 2025
d80df72
ensure that CB entries show up in the changes for claim Cb and clawba…
karthikiyer56 Mar 4, 2025
98be669
Rework integration tests
karthikiyer56 Mar 6, 2025
9a8ffd0
Make the integration test work
karthikiyer56 Mar 13, 2025
8ee667d
Completely redo the way we have been doing addresses so far
karthikiyer56 Mar 13, 2025
a70291f
Fix the way protoAsset is generated. Specifically trim the extra null…
karthikiyer56 Mar 14, 2025
d8c8243
Merge remote-tracking branch 'origin/master' into karthik/ttp-classic…
karthikiyer56 Mar 14, 2025
96b4364
Remove the CbId generation from LpId from support/converts into the t…
karthikiyer56 Mar 14, 2025
5a2cec6
Refactor the code for generation of CbIds from LP revocation to be mo…
karthikiyer56 Mar 14, 2025
c87c0ba
Remove unused code
karthikiyer56 Mar 14, 2025
756900b
Equals function for asset check
karthikiyer56 Mar 14, 2025
365c859
Check for return from feeCharged
karthikiyer56 Mar 14, 2025
19a1a09
Add comments
karthikiyer56 Mar 15, 2025
8d9bc73
Add support for verification
karthikiyer56 Mar 16, 2025
32040a5
Add sample example for using ttp
karthikiyer56 Mar 16, 2025
a16bf55
Add error check in mintOrBurnOrTransferEvent function
karthikiyer56 Mar 16, 2025
b9cf9c3
Updates to verify_events code
karthikiyer56 Mar 16, 2025
25d4a8f
go mod tidy
karthikiyer56 Mar 16, 2025
d26028c
Redo address proto again
karthikiyer56 Mar 16, 2025
154c3db
Make updates to calculate real amount
karthikiyer56 Mar 16, 2025
fb6562f
go mod tidy
karthikiyer56 Mar 16, 2025
ecbd075
fix verify
karthikiyer56 Mar 16, 2025
b565b80
fix example to print to file
karthikiyer56 Mar 16, 2025
2f12fe0
staticcheck
karthikiyer56 Mar 16, 2025
af7c27d
Add comments in address.proto
karthikiyer56 Mar 16, 2025
a978396
Refactor verify_events to make it simpler and address code review com…
karthikiyer56 Mar 16, 2025
83aa2d6
Add transaction index to event meta
karthikiyer56 Mar 16, 2025
e50dfee
Make ttp to be a structure and make em receiver functions. Also refac…
karthikiyer56 Mar 17, 2025
0e69632
remove code
karthikiyer56 Mar 17, 2025
6da06f1
Major rework of code. Made Addresses as strings and included contract…
karthikiyer56 Mar 18, 2025
b06f164
rename processor name
karthikiyer56 Mar 18, 2025
2e759c0
Address code review comments and rename functions to be more appropriate
karthikiyer56 Mar 18, 2025
5c18ce3
add code for reconciliation. Pending unit tests
karthikiyer56 Mar 18, 2025
09121e3
Fix check for protocol version
karthikiyer56 Mar 18, 2025
1b0727b
Refactor reconciliaton logic to generate only one event and re-order …
karthikiyer56 Mar 18, 2025
a4e64ca
Add unit tests for xlm reconciliation logic
karthikiyer56 Mar 20, 2025
1e39fd4
Add logic for inflation operation
karthikiyer56 Mar 21, 2025
41c999a
Remove printF
karthikiyer56 Mar 21, 2025
76055e0
Rework the verification logic to throw an error instead of a boolean …
karthikiyer56 Mar 21, 2025
e13f624
remove unsued code
karthikiyer56 Mar 21, 2025
2dbe812
Merge remote-tracking branch 'origin/master' into karthik/ttp-classic…
karthikiyer56 Mar 21, 2025
1e129dd
Move asset into each of mint/burn/transfer events
karthikiyer56 Mar 21, 2025
9207666
Fix numbering of oneOf in event proto
karthikiyer56 Mar 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions amount/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,15 @@ func String128(v xdr.Int128Parts) string {
return rat.FloatString(7)
}

func String128Raw(v xdr.Int128Parts) string {
// the upper half of the i128 always indicates its sign regardless of its
// value, just like a native signed type
val := big.NewInt(int64(v.Hi))
val.Lsh(val, 64).Add(val, new(big.Int).SetUint64(uint64(v.Lo)))

return val.String()
}

// StringFromInt64 returns an "amount string" from the provided raw int64 value `v`.
func StringFromInt64(v int64) string {
r := big.NewRat(v, 1)
Expand Down
29 changes: 4 additions & 25 deletions ingest/ledger_transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ func (t *LedgerTransaction) txInternalError() bool {
return t.Result.Result.Result.Code == xdr.TransactionResultCodeTxInternalError
}

func (t *LedgerTransaction) FeeAccount() xdr.MuxedAccount {
return t.Envelope.FeeAccount()
}

// GetFeeChanges returns a developer friendly representation of LedgerEntryChanges
// connected to fees.
func (t *LedgerTransaction) GetFeeChanges() []Change {
Expand Down Expand Up @@ -592,31 +596,6 @@ func (t *LedgerTransaction) AccountMuxed() (string, bool) {

}

func (t *LedgerTransaction) FeeAccount() (string, bool) {
if !t.Envelope.IsFeeBump() {
return "", false
}

feeBumpAccount := t.Envelope.FeeBumpAccount()
feeAccount := feeBumpAccount.ToAccountId()

return feeAccount.Address(), true

}

func (t *LedgerTransaction) FeeAccountMuxed() (string, bool) {
if !t.Envelope.IsFeeBump() {
return "", false
}

feeBumpAccount := t.Envelope.FeeBumpAccount()
if feeBumpAccount.Type != xdr.CryptoKeyTypeKeyTypeMuxedEd25519 {
return "", false
}

return feeBumpAccount.Address(), true
}

func (t *LedgerTransaction) InnerTransactionHash() (string, bool) {
if !t.Envelope.IsFeeBump() {
return "", false
Expand Down
10 changes: 0 additions & 10 deletions ingest/ledger_transaction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -928,16 +928,6 @@ func TestTransactionHelperFunctions(t *testing.T) {
assert.Equal(t, true, ok)
assert.Equal(t, "MAISEMYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPMJ2I", accountMuxed)

var feeAccount string
feeAccount, ok = transaction.FeeAccount()
assert.Equal(t, false, ok)
assert.Equal(t, "", feeAccount)

var feeAccountMuxed string
feeAccountMuxed, ok = transaction.FeeAccountMuxed()
assert.Equal(t, false, ok)
assert.Equal(t, "", feeAccountMuxed)

var innerTransactionHash string
innerTransactionHash, ok = transaction.InnerTransactionHash()
assert.Equal(t, false, ok)
Expand Down
25 changes: 18 additions & 7 deletions ingest/processors/token_transfer/token_transfer_event.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package token_transfer

import (
"github.com/stellar/go/ingest/address"
"github.com/stellar/go/ingest/asset"
"github.com/stellar/go/ingest"
addressProto "github.com/stellar/go/ingest/address"
assetProto "github.com/stellar/go/ingest/asset"
"time"

"google.golang.org/protobuf/types/known/timestamppb"
)

func NewTransferEvent(meta *EventMeta, from, to *address.Address, amount string, token *asset.Asset) *TokenTransferEvent {
func NewTransferEvent(meta *EventMeta, from, to *addressProto.Address, amount string, token *assetProto.Asset) *TokenTransferEvent {
return &TokenTransferEvent{
Meta: meta,
Asset: token,
Expand All @@ -22,7 +23,7 @@ func NewTransferEvent(meta *EventMeta, from, to *address.Address, amount string,
}
}

func NewMintEvent(meta *EventMeta, to *address.Address, amount string, token *asset.Asset) *TokenTransferEvent {
func NewMintEvent(meta *EventMeta, to *addressProto.Address, amount string, token *assetProto.Asset) *TokenTransferEvent {
return &TokenTransferEvent{
Meta: meta,
Asset: token,
Expand All @@ -35,7 +36,7 @@ func NewMintEvent(meta *EventMeta, to *address.Address, amount string, token *as
}
}

func NewBurnEvent(meta *EventMeta, from *address.Address, amount string, token *asset.Asset) *TokenTransferEvent {
func NewBurnEvent(meta *EventMeta, from *addressProto.Address, amount string, token *assetProto.Asset) *TokenTransferEvent {
return &TokenTransferEvent{
Meta: meta,
Asset: token,
Expand All @@ -48,7 +49,7 @@ func NewBurnEvent(meta *EventMeta, from *address.Address, amount string, token *
}
}

func NewClawbackEvent(meta *EventMeta, from *address.Address, amount string, token *asset.Asset) *TokenTransferEvent {
func NewClawbackEvent(meta *EventMeta, from *addressProto.Address, amount string, token *assetProto.Asset) *TokenTransferEvent {
return &TokenTransferEvent{
Meta: meta,
Asset: token,
Expand All @@ -61,7 +62,7 @@ func NewClawbackEvent(meta *EventMeta, from *address.Address, amount string, tok
}
}

func NewFeeEvent(ledgerSequence uint32, closedAt time.Time, txHash string, from *address.Address, amount string, token *asset.Asset) *TokenTransferEvent {
func NewFeeEvent(ledgerSequence uint32, closedAt time.Time, txHash string, from *addressProto.Address, amount string, token *assetProto.Asset) *TokenTransferEvent {
return &TokenTransferEvent{
Meta: &EventMeta{
LedgerSequence: ledgerSequence,
Expand All @@ -77,3 +78,13 @@ func NewFeeEvent(ledgerSequence uint32, closedAt time.Time, txHash string, from
},
}
}

func NewEventMeta(tx ingest.LedgerTransaction, operationIndex *uint32, contractAddress *addressProto.Address) *EventMeta {
return &EventMeta{
LedgerSequence: tx.Ledger.LedgerSequence(),
ClosedAt: timestamppb.New(tx.Ledger.ClosedAt()),
TxHash: tx.Hash.HexString(),
OperationIndex: operationIndex,
ContractAddress: contractAddress,
}
}
30 changes: 15 additions & 15 deletions ingest/processors/token_transfer/token_transfer_event_test.go
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
package token_transfer

import (
"github.com/stellar/go/ingest/address"
"github.com/stellar/go/ingest/asset"
addressProto "github.com/stellar/go/ingest/address"
assetProto "github.com/stellar/go/ingest/asset"
"github.com/stretchr/testify/assert"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/timestamppb"
"testing"
"time"
)

func newTestAddress() *address.Address {
return &address.Address{
AddressType: address.AddressType_ADDRESS_TYPE_ACCOUNT,
func newTestAddress() *addressProto.Address {
return &addressProto.Address{
AddressType: addressProto.AddressType_ADDRESS_TYPE_ACCOUNT,
StrKey: "GBRX5D3FLJ72FHYFVFF2BOICRVDF7FESIAT6GQ4K3ST2MXXJJZC24H2F",
}
}

func newTestAsset() *asset.Asset {
return &asset.Asset{
AssetType: &asset.Asset_IssuedAsset{
IssuedAsset: &asset.IssuedAsset{
func newTestAsset() *assetProto.Asset {
return &assetProto.Asset{
AssetType: &assetProto.Asset_IssuedAsset{
IssuedAsset: &assetProto.IssuedAsset{
AssetCode: "USDC",
Issuer: "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN",
},
Expand All @@ -41,13 +41,13 @@ func TestEventSerialization(t *testing.T) {
// test fixtureName
fixtureName string
// Setup the test fixture
fixtureSetupFn func() (*TokenTransferEvent, *EventMeta, *asset.Asset, *address.Address, string)
fixtureSetupFn func() (*TokenTransferEvent, *EventMeta, *assetProto.Asset, *addressProto.Address, string)
// Function to assert to see if data matches
assertFn func(event *TokenTransferEvent) proto.Message
}{
{
fixtureName: "Transfer",
fixtureSetupFn: func() (*TokenTransferEvent, *EventMeta, *asset.Asset, *address.Address, string) {
fixtureSetupFn: func() (*TokenTransferEvent, *EventMeta, *assetProto.Asset, *addressProto.Address, string) {
from := newTestAddress()
to := newTestAddress()
amount := "1000"
Expand All @@ -62,7 +62,7 @@ func TestEventSerialization(t *testing.T) {
},
{
fixtureName: "Mint",
fixtureSetupFn: func() (*TokenTransferEvent, *EventMeta, *asset.Asset, *address.Address, string) {
fixtureSetupFn: func() (*TokenTransferEvent, *EventMeta, *assetProto.Asset, *addressProto.Address, string) {
to := newTestAddress()
amount := "500"
meta := newTestEventMeta()
Expand All @@ -76,7 +76,7 @@ func TestEventSerialization(t *testing.T) {
},
{
fixtureName: "Burn",
fixtureSetupFn: func() (*TokenTransferEvent, *EventMeta, *asset.Asset, *address.Address, string) {
fixtureSetupFn: func() (*TokenTransferEvent, *EventMeta, *assetProto.Asset, *addressProto.Address, string) {
from := newTestAddress()
amount := "200"
meta := newTestEventMeta()
Expand All @@ -90,7 +90,7 @@ func TestEventSerialization(t *testing.T) {
},
{
fixtureName: "Clawback",
fixtureSetupFn: func() (*TokenTransferEvent, *EventMeta, *asset.Asset, *address.Address, string) {
fixtureSetupFn: func() (*TokenTransferEvent, *EventMeta, *assetProto.Asset, *addressProto.Address, string) {
from := newTestAddress()
amount := "300"
meta := newTestEventMeta()
Expand All @@ -104,7 +104,7 @@ func TestEventSerialization(t *testing.T) {
},
{
fixtureName: "Fee",
fixtureSetupFn: func() (*TokenTransferEvent, *EventMeta, *asset.Asset, *address.Address, string) {
fixtureSetupFn: func() (*TokenTransferEvent, *EventMeta, *assetProto.Asset, *addressProto.Address, string) {
from := newTestAddress()
amount := "50"
token := newTestAsset()
Expand Down
Loading
Loading