Skip to content

Commit

Permalink
Merge branch 'feat/spica' into handle-contracts
Browse files Browse the repository at this point in the history
  • Loading branch information
andreibancioiu committed Aug 16, 2024
2 parents adbab56 + 728b59c commit f6d6b69
Show file tree
Hide file tree
Showing 11 changed files with 506 additions and 106 deletions.
13 changes: 11 additions & 2 deletions cmd/rosetta/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,31 @@ package main

import (
"encoding/json"
"fmt"
"os"

"github.com/multiversx/mx-chain-rosetta/server/resources"
)

func decideCustomCurrencies(configFileCustomCurrencies string) ([]resources.Currency, error) {
if len(configFileCustomCurrencies) == 0 {
return make([]resources.Currency, 0), nil
}

return loadConfigOfCustomCurrencies(configFileCustomCurrencies)
}

func loadConfigOfCustomCurrencies(configFile string) ([]resources.Currency, error) {
fileContent, err := os.ReadFile(configFile)
if err != nil {
return nil, err
return nil, fmt.Errorf("error when reading custom currencies config file: %w", err)
}

var customCurrencies []resources.Currency

err = json.Unmarshal(fileContent, &customCurrencies)
if err != nil {
return nil, err
return nil, fmt.Errorf("error when loading custom currencies from file: %w", err)
}

return customCurrencies, nil
Expand Down
18 changes: 16 additions & 2 deletions cmd/rosetta/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,20 @@ import (
"github.com/stretchr/testify/require"
)

func TestDecideCustomCurrencies(t *testing.T) {
t.Run("with success (file provided)", func(t *testing.T) {
customCurrencies, err := decideCustomCurrencies("testdata/custom-currencies.json")
require.NoError(t, err)
require.Len(t, customCurrencies, 2)
})

t.Run("with success (file not provided)", func(t *testing.T) {
customCurrencies, err := decideCustomCurrencies("")
require.NoError(t, err)
require.Empty(t, customCurrencies)
})
}

func TestLoadConfigOfCustomCurrencies(t *testing.T) {
t.Run("with success", func(t *testing.T) {
customCurrencies, err := loadConfigOfCustomCurrencies("testdata/custom-currencies.json")
Expand All @@ -26,11 +40,11 @@ func TestLoadConfigOfCustomCurrencies(t *testing.T) {

t.Run("with error (missing file)", func(t *testing.T) {
_, err := loadConfigOfCustomCurrencies("testdata/missing-file.json")
require.Error(t, err)
require.ErrorContains(t, err, "error when reading custom currencies config file")
})

t.Run("with error (invalid file)", func(t *testing.T) {
_, err := loadConfigOfCustomCurrencies("testdata/custom-currencies-bad.json")
require.Error(t, err)
require.ErrorContains(t, err, "error when loading custom currencies from file")
})
}
2 changes: 1 addition & 1 deletion cmd/rosetta/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func startRosetta(ctx *cli.Context) error {
return err
}

customCurrencies, err := loadConfigOfCustomCurrencies(cliFlags.configFileCustomCurrencies)
customCurrencies, err := decideCustomCurrencies(cliFlags.configFileCustomCurrencies)
if err != nil {
return err
}
Expand Down
11 changes: 11 additions & 0 deletions server/services/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,14 @@ var (
transactionEventTopicInvalidMetaTransaction = "meta transaction is invalid"
transactionEventTopicInvalidMetaTransactionNotEnoughGas = "meta transaction is invalid: not enough gas"
)

var (
numTopicsOfEventESDTTransfer = 4
numTopicsPerTransferOfEventMultiESDTNFTTransfer = 3
numTopicsOfEventESDTLocalBurn = 3
numTopicsOfEventESDTLocalMint = 3
numTopicsOfEventESDTWipe = 4
numTopicsOfEventESDTNFTCreate = 4
numTopicsOfEventESDTNFTBurn = 3
numTopicsOfEventESDTNFTAddQuantity = 3
)
54 changes: 54 additions & 0 deletions server/services/testdata/blocks_with_nft_add_quantity.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
[
{
"comment": "block with NFT add quantity",
"miniBlocks": [
{
"transactions": [
{
"type": "normal",
"hash": "01fd564ee984e601fba3e683ea8d7fc4b58089a28931059da7f7f2210f798263",
"value": "0",
"receiver": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"sender": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"logs": {
"address": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"events": [
{
"address": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"identifier": "ESDTNFTAddQuantity",
"topics": [
"RlJBTkstYWQzNTI5",
"AQ==",
"Aw=="
],
"data": null,
"additionalData": null
},
{
"address": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"identifier": "writeLog",
"topics": [
"HoqLa0neW3vhCqoVilpqSrtLVswI9SS7XmzV8hGtPhM=",
"QHRvbyBtdWNoIGdhcyBwcm92aWRlZCBmb3IgcHJvY2Vzc2luZzogZ2FzIHByb3ZpZGVkID0gMTAwMDAwMCwgZ2FzIHVzZWQgPSA1MDAwMA=="
],
"data": "QDZmNmI=",
"additionalData": ["QDZmNmI="]
},
{
"address": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"identifier": "completedTxEvent",
"topics": [
"Af1WTumE5gH7o+aD6o1/xLWAiaKJMQWdp/fyIQ95gmM="
],
"data": null,
"additionalData": null
}
]
},
"initiallyPaidFee": "133500000000000"
}
]
}
]
}
]
54 changes: 54 additions & 0 deletions server/services/testdata/blocks_with_nft_burn.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
[
{
"comment": "block with NFT burn",
"miniBlocks": [
{
"transactions": [
{
"type": "normal",
"hash": "06f38e2608aed1b811111e535b9f9d8ebc875d6e8330e9dddacb90cd7ab61853",
"value": "0",
"receiver": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"sender": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"logs": {
"address": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"events": [
{
"address": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"identifier": "ESDTNFTBurn",
"topics": [
"RlJBTkstYWQzNTI5",
"Ag==",
"Ag=="
],
"data": null,
"additionalData": null
},
{
"address": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"identifier": "writeLog",
"topics": [
"HoqLa0neW3vhCqoVilpqSrtLVswI9SS7XmzV8hGtPhM=",
"QHRvbyBtdWNoIGdhcyBwcm92aWRlZCBmb3IgcHJvY2Vzc2luZzogZ2FzIHByb3ZpZGVkID0gMTAwMDAwMCwgZ2FzIHVzZWQgPSA1MDAwMA=="
],
"data": "QDZmNmI=",
"additionalData": ["QDZmNmI="]
},
{
"address": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"identifier": "completedTxEvent",
"topics": [
"BvOOJgiu0bgRER5TW5+djryHXW6DMOnd2suQzXq2GFM="
],
"data": null,
"additionalData": null
}
]
},
"initiallyPaidFee": "123000000000000"
}
]
}
]
}
]
57 changes: 57 additions & 0 deletions server/services/testdata/blocks_with_nft_create.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
[
{
"comment": "block with NFT create",
"miniBlocks": [
{
"transactions": [
{
"type": "normal",
"hash": "8f404c670dc857e0158b86ba02c50426fff0eefa708b9e161455ece0e604030c",
"value": "0",
"receiver": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"sender": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"logs": {
"address": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"events": [
{
"address": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"identifier": "ESDTNFTCreate",
"topics": [
"RlJBTkstNzM1MjNk",
"Aw==",
"Hg==",
"CAQSAgAeIkEIAxIGdGVzdC0zGiAeiotrSd5be+EKqhWKWmpKu0tWzAj1JLtebNXyEa0+EyDoByoEYWJiYTIBYTIBYjoEdGVzdA=="
],
"data": null,
"additionalData": null
},
{
"address": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"identifier": "completedTxEvent",
"topics": [
"j0BMZw3IV+AVi4a6AsUEJv/w7vpwi54WFFXs4OYEAww="
],
"data": null,
"additionalData": null
}
]
},
"initiallyPaidFee": "212500000000000"
}
]
},
{
"transactions": [
{
"type": "unsigned",
"hash": "d2eca235c07837b05838ebeb18cc71d6eb99ce5292e8db889f3b6b41e81ef8ae",
"value": "33400000000000",
"receiver": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"sender": "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede",
"isRefund": true
}
]
}
]
}
]
22 changes: 22 additions & 0 deletions server/services/transactionEvents.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package services

import (
"fmt"
"math/big"
)

type eventTransferValueOnly struct {
Expand All @@ -19,6 +20,27 @@ type eventESDT struct {
value string
}

// newEventESDTFromBasicTopics creates an eventESDT from the given topics. The following topics are expected:
// - topic 0: the identifier of the token
// - topic 1: the nonce of the token
// - topic 2: the value of the token
func newEventESDTFromBasicTopics(topics [][]byte) (*eventESDT, error) {
if len(topics) < 3 {
return nil, fmt.Errorf("newEventESDTFromBasicTopics: bad number of topics: %d", len(topics))
}

identifier := topics[0]
nonceAsBytes := topics[1]
valueBytes := topics[2]
value := big.NewInt(0).SetBytes(valueBytes)

return &eventESDT{
identifier: string(identifier),
nonceAsBytes: nonceAsBytes,
value: value.String(),
}, nil
}

// getBaseIdentifier returns the token identifier for fungible tokens, and the collection identifier for SFTs, NFTs and MetaESDTs
func (event *eventESDT) getBaseIdentifier() string {
return event.identifier
Expand Down
Loading

0 comments on commit f6d6b69

Please sign in to comment.