From eae49e2e9c09b9f1f611b752e685caab022de751 Mon Sep 17 00:00:00 2001 From: agodnic Date: Fri, 23 Jun 2023 22:21:34 -0300 Subject: [PATCH] Add support for Oasis and Algorand in the `tx-tracker` service (#455) ### Description This pull request adds support for Oasis and Algorand in the `tx-tracker` service. With this change, the sender addresses for those chains will become available in the UI. --- .../tx-tracker-backfiller/env/production.env | 6 +++ deploy/tx-tracker-backfiller/env/staging.env | 6 +++ deploy/tx-tracker-backfiller/env/test.env | 6 +++ .../tx-tracker-backfiller-job.yaml | 8 ++++ deploy/tx-tracker/env/production.env | 6 +++ deploy/tx-tracker/env/staging.env | 6 +++ deploy/tx-tracker/env/test.env | 6 +++ deploy/tx-tracker/tx-tracker-service.yaml | 8 ++++ tx-tracker/chains/algorand.go | 47 +++++++++++++++++++ tx-tracker/chains/tx.go | 12 +++++ tx-tracker/config/structs.go | 4 ++ 11 files changed, 115 insertions(+) create mode 100644 tx-tracker/chains/algorand.go diff --git a/deploy/tx-tracker-backfiller/env/production.env b/deploy/tx-tracker-backfiller/env/production.env index 038f0309..da6bd6ca 100644 --- a/deploy/tx-tracker-backfiller/env/production.env +++ b/deploy/tx-tracker-backfiller/env/production.env @@ -7,6 +7,9 @@ RESOURCES_LIMITS_CPU=500m RESOURCES_REQUESTS_MEMORY=128Mi RESOURCES_REQUESTS_CPU=250m +ALGORAND_BASE_URL= +ALGORAND_REQUESTS_PER_MINUTE=2 + APTOS_BASE_URL= APTOS_REQUESTS_PER_MINUTE=2 @@ -34,6 +37,9 @@ KLAYTN_REQUESTS_PER_MINUTE=2 MOONBEAM_BASE_URL= MOONBEAM_REQUESTS_PER_MINUTE=2 +OASIS_BASE_URL= +OASIS_REQUESTS_PER_MINUTE=2 + OPTIMISM_BASE_URL= OPTIMISM_REQUESTS_PER_MINUTE=2 diff --git a/deploy/tx-tracker-backfiller/env/staging.env b/deploy/tx-tracker-backfiller/env/staging.env index 8a17af9d..930b9970 100644 --- a/deploy/tx-tracker-backfiller/env/staging.env +++ b/deploy/tx-tracker-backfiller/env/staging.env @@ -11,6 +11,9 @@ STRATEGY_NAME=time_range STRATEGY_TIMESTAMP_AFTER=2023-01-01T00:00:00.000Z STRATEGY_TIMESTAMP_BEFORE=2023-04-01T00:00:00.000Z +ALGORAND_BASE_URL= +ALGORAND_REQUESTS_PER_MINUTE=1 + APTOS_BASE_URL= APTOS_REQUESTS_PER_MINUTE=1 @@ -38,6 +41,9 @@ KLAYTN_REQUESTS_PER_MINUTE=1 MOONBEAM_BASE_URL= MOONBEAM_REQUESTS_PER_MINUTE=1 +OASIS_BASE_URL= +OASIS_REQUESTS_PER_MINUTE=1 + OPTIMISM_BASE_URL= OPTIMISM_REQUESTS_PER_MINUTE=1 diff --git a/deploy/tx-tracker-backfiller/env/test.env b/deploy/tx-tracker-backfiller/env/test.env index 0cdab705..3a7620f2 100644 --- a/deploy/tx-tracker-backfiller/env/test.env +++ b/deploy/tx-tracker-backfiller/env/test.env @@ -7,6 +7,9 @@ RESOURCES_LIMITS_CPU=200m RESOURCES_REQUESTS_MEMORY=64Mi RESOURCES_REQUESTS_CPU=100m +ALGORAND_BASE_URL= +ALGORAND_REQUESTS_PER_MINUTE=1 + APTOS_BASE_URL= APTOS_REQUESTS_PER_MINUTE=1 @@ -34,6 +37,9 @@ KLAYTN_REQUESTS_PER_MINUTE=1 MOONBEAM_BASE_URL= MOONBEAM_REQUESTS_PER_MINUTE=1 +OASIS_BASE_URL= +OASIS_REQUESTS_PER_MINUTE=1 + OPTIMISM_BASE_URL= OPTIMISM_REQUESTS_PER_MINUTE=1 diff --git a/deploy/tx-tracker-backfiller/tx-tracker-backfiller-job.yaml b/deploy/tx-tracker-backfiller/tx-tracker-backfiller-job.yaml index 58974a5d..231e5248 100644 --- a/deploy/tx-tracker-backfiller/tx-tracker-backfiller-job.yaml +++ b/deploy/tx-tracker-backfiller/tx-tracker-backfiller-job.yaml @@ -31,6 +31,10 @@ spec: configMapKeyRef: name: config key: mongo-database + - name: ALGORAND_BASE_URL + value: {{ .ALGORAND_BASE_URL }} + - name: ALGORAND_REQUESTS_PER_MINUTE + value: "{{ .ALGORAND_REQUESTS_PER_MINUTE }}" - name: APTOS_BASE_URL value: {{ .APTOS_BASE_URL }} - name: APTOS_REQUESTS_PER_MINUTE @@ -67,6 +71,10 @@ spec: value: {{ .MOONBEAM_BASE_URL }} - name: MOONBEAM_REQUESTS_PER_MINUTE value: "{{ .MOONBEAM_REQUESTS_PER_MINUTE }}" + - name: OASIS_BASE_URL + value: {{ .OASIS_BASE_URL }} + - name: OASIS_REQUESTS_PER_MINUTE + value: "{{ .OASIS_REQUESTS_PER_MINUTE }}" - name: OPTIMISM_BASE_URL value: {{ .OPTIMISM_BASE_URL }} - name: OPTIMISM_REQUESTS_PER_MINUTE diff --git a/deploy/tx-tracker/env/production.env b/deploy/tx-tracker/env/production.env index 473149c5..ef0ecc78 100644 --- a/deploy/tx-tracker/env/production.env +++ b/deploy/tx-tracker/env/production.env @@ -11,6 +11,9 @@ SQS_URL= SQS_AWS_REGION= AWS_IAM_ROLE= +ALGORAND_BASE_URL= +ALGORAND_REQUESTS_PER_MINUTE=8 + APTOS_BASE_URL= APTOS_REQUESTS_PER_MINUTE=8 @@ -38,6 +41,9 @@ KLAYTN_REQUESTS_PER_MINUTE=8 MOONBEAM_BASE_URL= MOONBEAM_REQUESTS_PER_MINUTE=8 +OASIS_BASE_URL= +OASIS_REQUESTS_PER_MINUTE=4 + OPTIMISM_BASE_URL= OPTIMISM_REQUESTS_PER_MINUTE=8 diff --git a/deploy/tx-tracker/env/staging.env b/deploy/tx-tracker/env/staging.env index ddfddf56..e750a4eb 100644 --- a/deploy/tx-tracker/env/staging.env +++ b/deploy/tx-tracker/env/staging.env @@ -11,6 +11,9 @@ SQS_URL= SQS_AWS_REGION= AWS_IAM_ROLE= +ALGORAND_BASE_URL= +ALGORAND_REQUESTS_PER_MINUTE=2 + APTOS_BASE_URL= APTOS_REQUESTS_PER_MINUTE=2 @@ -38,6 +41,9 @@ KLAYTN_REQUESTS_PER_MINUTE=2 MOONBEAM_BASE_URL= MOONBEAM_REQUESTS_PER_MINUTE=2 +OASIS_BASE_URL= +OASIS_REQUESTS_PER_MINUTE=2 + OPTIMISM_BASE_URL= OPTIMISM_REQUESTS_PER_MINUTE=2 diff --git a/deploy/tx-tracker/env/test.env b/deploy/tx-tracker/env/test.env index 700ffb6f..d8b1002e 100644 --- a/deploy/tx-tracker/env/test.env +++ b/deploy/tx-tracker/env/test.env @@ -11,6 +11,9 @@ SQS_URL= SQS_AWS_REGION= AWS_IAM_ROLE= +ALGORAND_BASE_URL= +ALGORAND_REQUESTS_PER_MINUTE=2 + APTOS_BASE_URL= APTOS_REQUESTS_PER_MINUTE=2 @@ -38,6 +41,9 @@ KLAYTN_REQUESTS_PER_MINUTE=2 MOONBEAM_BASE_URL= MOONBEAM_REQUESTS_PER_MINUTE=2 +OASIS_BASE_URL= +OASIS_REQUESTS_PER_MINUTE=2 + OPTIMISM_BASE_URL= OPTIMISM_REQUESTS_PER_MINUTE=2 diff --git a/deploy/tx-tracker/tx-tracker-service.yaml b/deploy/tx-tracker/tx-tracker-service.yaml index b0cfd12d..2720a8d4 100644 --- a/deploy/tx-tracker/tx-tracker-service.yaml +++ b/deploy/tx-tracker/tx-tracker-service.yaml @@ -57,6 +57,10 @@ spec: value: {{ .SQS_URL }} - name: AWS_REGION value: {{ .SQS_AWS_REGION }} + - name: ALGORAND_BASE_URL + value: {{ .ALGORAND_BASE_URL }} + - name: ALGORAND_REQUESTS_PER_MINUTE + value: "{{ .ALGORAND_REQUESTS_PER_MINUTE }}" - name: APTOS_BASE_URL value: {{ .APTOS_BASE_URL }} - name: APTOS_REQUESTS_PER_MINUTE @@ -93,6 +97,10 @@ spec: value: {{ .MOONBEAM_BASE_URL }} - name: MOONBEAM_REQUESTS_PER_MINUTE value: "{{ .MOONBEAM_REQUESTS_PER_MINUTE }}" + - name: OASIS_BASE_URL + value: {{ .OASIS_BASE_URL }} + - name: OASIS_REQUESTS_PER_MINUTE + value: "{{ .OASIS_REQUESTS_PER_MINUTE }}" - name: OPTIMISM_BASE_URL value: {{ .OPTIMISM_BASE_URL }} - name: OPTIMISM_REQUESTS_PER_MINUTE diff --git a/tx-tracker/chains/algorand.go b/tx-tracker/chains/algorand.go new file mode 100644 index 00000000..e8943ce5 --- /dev/null +++ b/tx-tracker/chains/algorand.go @@ -0,0 +1,47 @@ +package chains + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/wormhole-foundation/wormhole-explorer/txtracker/config" +) + +type algorandTransactionResponse struct { + Transaction struct { + ID string `json:"id"` + Sender string `json:"sender"` + RoundTime int `json:"round-time"` + } `json:"transaction"` +} + +func fetchAlgorandTx( + ctx context.Context, + cfg *config.RpcProviderSettings, + txHash string, +) (*TxDetail, error) { + + // Fetch tx data from the Algorand Indexer API + url := fmt.Sprintf("%s/v2/transactions/%s", cfg.AlgorandBaseUrl, txHash) + fmt.Println(url) + body, err := httpGet(ctx, url) + if err != nil { + return nil, fmt.Errorf("HTTP request to Algorand transactions endpoint failed: %w", err) + } + + // Decode the response + var response algorandTransactionResponse + if err := json.Unmarshal(body, &response); err != nil { + return nil, fmt.Errorf("failed to decode Algorand transactions response as JSON: %w", err) + } + + // Populate the result struct and return + txDetail := TxDetail{ + NativeTxHash: response.Transaction.ID, + From: response.Transaction.Sender, + Timestamp: time.Unix(int64(response.Transaction.RoundTime), 0), + } + return &txDetail, nil +} diff --git a/tx-tracker/chains/tx.go b/tx-tracker/chains/tx.go index e813d766..f0c0ff1a 100644 --- a/tx-tracker/chains/tx.go +++ b/tx-tracker/chains/tx.go @@ -32,6 +32,7 @@ type TxDetail struct { } var tickers = struct { + algorand *time.Ticker aptos *time.Ticker arbitrum *time.Ticker avalanche *time.Ticker @@ -41,6 +42,7 @@ var tickers = struct { fantom *time.Ticker klaytn *time.Ticker moonbeam *time.Ticker + oasis *time.Ticker optimism *time.Ticker polygon *time.Ticker solana *time.Ticker @@ -61,6 +63,7 @@ func Initialize(cfg *config.RpcProviderSettings) { } // these adapters send 1 request per txHash + tickers.algorand = time.NewTicker(f(cfg.AlgorandRequestsPerMinute)) tickers.sui = time.NewTicker(f(cfg.SuiRequestsPerMinute)) tickers.terra2 = time.NewTicker(f(cfg.Terra2RequestsPerMinute)) tickers.xpla = time.NewTicker(f(cfg.XplaRequestsPerMinute)) @@ -75,6 +78,7 @@ func Initialize(cfg *config.RpcProviderSettings) { tickers.fantom = time.NewTicker(f(cfg.FantomRequestsPerMinute / 2)) tickers.klaytn = time.NewTicker(f(cfg.KlaytnRequestsPerMinute / 2)) tickers.moonbeam = time.NewTicker(f(cfg.MoonbeamRequestsPerMinute / 2)) + tickers.oasis = time.NewTicker(f(cfg.OasisRequestsPerMinute / 2)) tickers.optimism = time.NewTicker(f(cfg.OptimismRequestsPerMinute / 2)) tickers.polygon = time.NewTicker(f(cfg.PolygonRequestsPerMinute / 2)) tickers.solana = time.NewTicker(f(cfg.SolanaRequestsPerMinute / 2)) @@ -95,6 +99,9 @@ func FetchTx( case vaa.ChainIDSolana: fetchFunc = fetchSolanaTx rateLimiter = *tickers.solana + case vaa.ChainIDAlgorand: + fetchFunc = fetchAlgorandTx + rateLimiter = *tickers.algorand case vaa.ChainIDCelo: fetchFunc = func(ctx context.Context, cfg *config.RpcProviderSettings, txHash string) (*TxDetail, error) { return fetchEthTx(ctx, txHash, cfg.CeloBaseUrl) @@ -130,6 +137,11 @@ func FetchTx( return fetchEthTx(ctx, txHash, cfg.ArbitrumBaseUrl) } rateLimiter = *tickers.arbitrum + case vaa.ChainIDOasis: + fetchFunc = func(ctx context.Context, cfg *config.RpcProviderSettings, txHash string) (*TxDetail, error) { + return fetchEthTx(ctx, txHash, cfg.OasisBaseUrl) + } + rateLimiter = *tickers.oasis case vaa.ChainIDOptimism: fetchFunc = func(ctx context.Context, cfg *config.RpcProviderSettings, txHash string) (*TxDetail, error) { return fetchEthTx(ctx, txHash, cfg.OptimismBaseUrl) diff --git a/tx-tracker/config/structs.go b/tx-tracker/config/structs.go index 22fc044a..bf63541b 100644 --- a/tx-tracker/config/structs.go +++ b/tx-tracker/config/structs.go @@ -59,6 +59,8 @@ type MongodbSettings struct { } type RpcProviderSettings struct { + AlgorandBaseUrl string `split_words:"true" required:"true"` + AlgorandRequestsPerMinute uint16 `split_words:"true" required:"true"` AptosBaseUrl string `split_words:"true" required:"true"` AptosRequestsPerMinute uint16 `split_words:"true" required:"true"` ArbitrumBaseUrl string `split_words:"true" required:"true"` @@ -77,6 +79,8 @@ type RpcProviderSettings struct { KlaytnRequestsPerMinute uint16 `split_words:"true" required:"true"` MoonbeamBaseUrl string `split_words:"true" required:"true"` MoonbeamRequestsPerMinute uint16 `split_words:"true" required:"true"` + OasisBaseUrl string `split_words:"true" required:"true"` + OasisRequestsPerMinute uint16 `split_words:"true" required:"true"` OptimismBaseUrl string `split_words:"true" required:"true"` OptimismRequestsPerMinute uint16 `split_words:"true" required:"true"` PolygonBaseUrl string `split_words:"true" required:"true"`