Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

fix guardian-api get last heartbeats - postgres migration #1828

Draft
wants to merge 4 commits into
base: feature/wormholescan_db_migration
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
77 changes: 36 additions & 41 deletions api/handlers/governor/postgres_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -836,26 +836,23 @@ func (r *PostgresRepository) GetEnqueueVassByChainID(ctx context.Context, q *Enq
}

func (r *PostgresRepository) GetEnqueuedVaas(ctx context.Context) ([]*EnqueuedVaaItem, error) {
query := `
WITH gov_status_msgs AS (SELECT gov_status_msg.value as status_msg,
(gov_status_msg ->> 'chainid')::smallint as chain_id
FROM wormholescan.wh_governor_status,
jsonb_array_elements(wormholescan.wh_governor_status.message) AS gov_status_msg),
gov_status_enqueuedvaas AS (SELECT chain_id,
emitters -> 'enqueuedvaas' as enqueuedVaas,
emitters ->> 'emitteraddress' as emitter_address
FROM gov_status_msgs,
jsonb_array_elements(gov_status_msgs.status_msg -> 'emitters') as emitters
WHERE emitters ->> 'enqueuedvaas' IS NOT NULL)
SELECT chain_id as chainid,
emitter_address as emitteraddress,
(vaas ->> 'sequence')::bigint as sequence,
(vaas ->> 'releasetime')::bigint as releasetime,
(vaas ->> 'notionalvalue')::numeric as notionalvalue,
vaas ->> 'txhash' as txhash
FROM gov_status_enqueuedvaas,
jsonb_array_elements(gov_status_enqueuedvaas.enqueuedVaas) as vaas
ORDER BY chainid, emitteraddress, sequence, releasetime DESC;`
query := `WITH flattened AS (SELECT
(chain ->> 'chainId')::int AS chain_id,
jsonb_array_elements(chain -> 'emitters') AS emitter
FROM wormholescan.wh_governor_status, jsonb_array_elements(message -> 'chains') AS chain
WHERE jsonb_typeof(message -> 'chains') = 'array' AND jsonb_typeof(chain -> 'emitters') = 'array'),
deconstructedChains as (
SELECT chain_id, emitter ->> 'emitterAddress' AS emitter_address,
jsonb_array_elements(flattened.emitter -> 'enqueuedVaas') AS vaa
FROM flattened
WHERE jsonb_typeof(emitter -> 'enqueuedVaas') = 'array')
SELECT chain_id AS chainid,
emitter_address As emitteraddress,
(vaa ->> 'sequence') AS sequence,
(vaa ->> 'releaseTime')::bigint AS releasetime,
(vaa ->> 'notionalValue')::numeric AS notionalvalue,
vaa ->> 'txHash' AS txhash
FROM deconstructedChains`

var result []*EnqueuedVaaItem

Expand All @@ -872,27 +869,25 @@ func (r *PostgresRepository) GetEnqueuedVaas(ctx context.Context) ([]*EnqueuedVa

func (r *PostgresRepository) IsVaaEnqueued(ctx context.Context, chainID sdk.ChainID, emitterAddr *types.Address, seq string) (bool, error) {
query := `
WITH gov_status_msgs AS (SELECT gov_status_msg.value as status_msg,
(gov_status_msg ->> 'chainid')::smallint as chain_id
FROM wormholescan.wh_governor_status,
jsonb_array_elements(wormholescan.wh_governor_status.message) AS gov_status_msg
WHERE gov_status_msg ->> 'chainid' = $1),
gov_status_enqueuedvaas AS (SELECT chain_id,
emitters -> 'enqueuedvaas' as enqueuedVaas,
emitters ->> 'emitteraddress' as emitter_address
FROM gov_status_msgs,
jsonb_array_elements(gov_status_msgs.status_msg -> 'emitters') as emitters
WHERE emitters ->> 'enqueuedvaas' IS NOT NULL AND emitters ->> 'emitteraddress' = $2)
SELECT chain_id as chainid,
emitter_address as emitteraddress,
(vaas ->> 'sequence')::bigint as sequence,
(vaas ->> 'releasetime')::bigint as releasetime,
(vaas ->> 'notionalvalue')::numeric as notionalvalue,
vaas ->> 'txhash' as txhash
FROM gov_status_enqueuedvaas,
jsonb_array_elements(gov_status_enqueuedvaas.enqueuedVaas) as vaas
WHERE (vaas ->> 'sequence')::bigint = $3;`

WITH flattened AS (SELECT (chain ->> 'chainId')::int AS chain_id,
jsonb_array_elements(chain -> 'emitters') AS emitter
FROM wormholescan.wh_governor_status, jsonb_array_elements(message -> 'chains') AS chain
WHERE (chain ->> 'chainId') = $1 AND jsonb_typeof(message -> 'chains') = 'array' AND jsonb_typeof(chain -> 'emitters') = 'array'),
deconstructedChains as (
SELECT chain_id,
emitter ->> 'emitterAddress' AS emitter_address,
jsonb_array_elements(flattened.emitter -> 'enqueuedVaas') AS vaa
FROM flattened
WHERE jsonb_typeof(emitter -> 'enqueuedVaas') = 'array')
SELECT chain_id AS chainid,
emitter_address As emitteraddress,
(vaa ->> 'sequence') AS sequence,
(vaa ->> 'releaseTime')::bigint AS releasetime,
(vaa ->> 'notionalValue')::numeric AS notionalvalue,
vaa ->> 'txHash' AS txhash
FROM deconstructedChains
WHERE emitter_address = $2 and (vaa ->> 'sequence') = $3;
`
var result []*EnqueuedVaaItem
chainIDStr := strconv.Itoa(int(chainID))
addr := utils.DenormalizeHex(emitterAddr.Hex())
Expand Down
1 change: 0 additions & 1 deletion api/handlers/governor/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,6 @@ func (s *Service) GetTokenList(ctx context.Context, postgres bool) ([]*TokenList
return s.mongoRepo.GetTokenList(ctx)
}
})

}

// GetEnqueuedVaas get enqueued vaas.
Expand Down
11 changes: 10 additions & 1 deletion api/handlers/heartbeats/postresql_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package heartbeats
import (
"context"
"fmt"

"github.com/wormhole-foundation/wormhole-explorer/common/db"
"github.com/wormhole-foundation/wormhole-explorer/common/utils"
"go.uber.org/zap"
)

Expand All @@ -26,13 +28,20 @@ func (r *PostresqlRepository) FindByIDs(ctx context.Context, ids []string) ([]*H
return nil, fmt.Errorf("ids list is empty")
}

// normalize the ids (guardian addresses)
var addresses []string
for _, id := range ids {
address := utils.NormalizeHex(id)
addresses = append(addresses, address)
}

// Prepare the query with placeholder for array parameter
query := `SELECT id, guardian_name, boot_timestamp, timestamp, version, networks, feature, created_at, updated_at
FROM wormholescan.wh_heartbeats
WHERE id = ANY($1);`

var response []*heartbeatSQL
err := r.db.Select(ctx, &response, query, ids)
err := r.db.Select(ctx, &response, query, addresses)
if err != nil {
r.logger.Error("failed to select heartbeats", zap.Error(err))
return nil, err
Expand Down
Loading