Skip to content

Commit

Permalink
Handle transfer value only (re-added, changed). Work in progress.
Browse files Browse the repository at this point in the history
andreibancioiu committed Nov 9, 2023
1 parent 5db6aa4 commit dc116d2
Showing 5 changed files with 51 additions and 2 deletions.
1 change: 1 addition & 0 deletions server/services/constants.go
Original file line number Diff line number Diff line change
@@ -25,6 +25,7 @@ var (

var (
transactionEventSignalError = core.SignalErrorOperation
transactionEventTransferValueOnly = "transferValueOnly"
transactionEventESDTTransfer = "ESDTTransfer"
transactionEventESDTNFTTransfer = "ESDTNFTTransfer"
transactionEventMultiESDTNFTTransfer = "MultiESDTNFTTransfer"
8 changes: 6 additions & 2 deletions server/services/networkProviderExtension.go
Original file line number Diff line number Diff line change
@@ -71,11 +71,15 @@ func (extension *networkProviderExtension) isAddressObserved(address string) (bo
}

func (extension *networkProviderExtension) isUserAddress(address string) bool {
pubkey, err := extension.provider.ConvertAddressToPubKey(address)
pubKey, err := extension.provider.ConvertAddressToPubKey(address)
if err != nil {
// E.g., when address = "metachain"
return false
}

return !core.IsSmartContractAddress(pubkey)
return extension.isUserPubKey(pubKey)
}

func (extension *networkProviderExtension) isUserPubKey(pubKey []byte) bool {
return !core.IsSmartContractAddress(pubKey)
}
8 changes: 8 additions & 0 deletions server/services/transactionEvents.go
Original file line number Diff line number Diff line change
@@ -4,6 +4,14 @@ import (
"fmt"
)

type eventTransferValueOnly struct {
sender string
senderPubKey []byte
receiver string
receiverPubKey []byte
value string
}

type eventESDT struct {
senderAddress string
receiverAddress string
31 changes: 31 additions & 0 deletions server/services/transactionEventsController.go
Original file line number Diff line number Diff line change
@@ -18,6 +18,37 @@ func newTransactionEventsController(provider NetworkProvider) *transactionEvents
}
}

func (controller *transactionEventsController) extractEventTransferValueOnly(tx *transaction.ApiTransactionResult) ([]*eventTransferValueOnly, error) {
rawEvents := controller.findManyEventsByIdentifier(tx, transactionEventTransferValueOnly)

typedEvents := make([]*eventTransferValueOnly, 0)

for _, event := range rawEvents {
numTopics := len(event.Topics)
if numTopics != 3 {
return nil, fmt.Errorf("%w: bad number of topics for 'transferValueOnly' = %d", errCannotRecognizeEvent, numTopics)
}

senderPubKey := event.Topics[0]
receiverPubKey := event.Topics[1]
valueBytes := event.Topics[2]

sender := controller.provider.ConvertPubKeyToAddress(senderPubKey)
receiver := controller.provider.ConvertPubKeyToAddress(receiverPubKey)
value := big.NewInt(0).SetBytes(valueBytes)

typedEvents = append(typedEvents, &eventTransferValueOnly{
sender: sender,
senderPubKey: senderPubKey,
receiver: receiver,
receiverPubKey: receiverPubKey,
value: value.String(),
})
}

return typedEvents, nil
}

func (controller *transactionEventsController) hasAnySignalError(tx *transaction.ApiTransactionResult) bool {
if !controller.hasEvents(tx) {
return false
5 changes: 5 additions & 0 deletions server/services/transactionsTransformer.go
Original file line number Diff line number Diff line change
@@ -361,6 +361,11 @@ func (transformer *transactionsTransformer) mempoolMoveBalanceTxToRosettaTx(tx *
}

func (transformer *transactionsTransformer) addOperationsGivenTransactionEvents(tx *transaction.ApiTransactionResult, rosettaTx *types.Transaction) error {
eventsTransferValueOnly, err := transformer.eventsController.extractEventTransferValueOnly(tx)
if err != nil {
return err
}

eventsESDTTransfer, err := transformer.eventsController.extractEventsESDTOrESDTNFTTransfers(tx)
if err != nil {
return err

0 comments on commit dc116d2

Please sign in to comment.