Skip to content
Open
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
32 changes: 12 additions & 20 deletions internal/data/event_registrations.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions internal/data/sql/queries/event_registrations.sql
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ INSERT INTO event_identity_registration (
event_trigger_definition,
tx_hash
) VALUES ($1, $2, $3, $4, $5, $6)
ON CONFLICT (eon, identity_prefix, sender) DO NOTHING;
ON CONFLICT (eon, identity) DO NOTHING;

-- name: GetEventIdentityRegistration :one
SELECT
Expand All @@ -22,13 +22,13 @@ SELECT
tx_hash,
created_at
FROM event_identity_registration
WHERE eon = $1 AND identity_prefix = $2 AND sender = $3;
WHERE eon = $1 AND identity = $2;

-- name: GetEventTriggerExpirationBlockNumber :one
SELECT COALESCE(expiration_block_number, 0) FROM event_identity_registration
WHERE eon = $1 AND identity_prefix = $2 AND sender = $3;
WHERE eon = $1 AND identity = $2;

-- name: UpdateEventIdentityRegistrationExpirationBlockNumber :exec
UPDATE event_identity_registration
SET expiration_block_number = $1
WHERE eon = $2 AND identity_prefix = $3 AND sender = $4;
WHERE eon = $2 AND identity = $3;
2 changes: 1 addition & 1 deletion internal/data/sql/schemas/event_registrations.sql
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ CREATE TABLE event_identity_registration (
expiration_block_number bigint,
tx_hash bytea NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
PRIMARY KEY (eon, identity_prefix, sender)
PRIMARY KEY (eon, identity)
);
8 changes: 7 additions & 1 deletion internal/data/sql/sqlc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,10 @@ sql:
out: "../"
sql_package: "pgx/v5"
output_db_file_name: "db.sqlc.gen.go"
output_models_file_name: "models.sqlc.gen.go"
output_models_file_name: "models.sqlc.gen.go"
overrides:
- column: "event_identity_registration.expiration_block_number"
go_type: "int64"
- column: "event_identity_registration.expiration_block_number"
go_type: "int64"
nullable: true
8 changes: 4 additions & 4 deletions internal/service/crypto.go
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ func (svc *CryptoService) RegisterEventIdentity(ctx *gin.Context) {
// @Tags Crypto
// @Produce json
// @Param eon query uint64 true "Eon number associated with the event identity registration."
// @Param identityPrefix query string true "Identity prefix associated with the event identity registration."
// @Param identity query string true "Identity associated with the event identity registration."
// @Success 200 {object} usecase.GetEventTriggerExpirationBlockResponse "Success."
// @Failure 400 {object} error.Http "Invalid Get event identity registration expiration block number request."
// @Failure 404 {object} error.Http "Event identity registration not found."
Expand Down Expand Up @@ -424,18 +424,18 @@ func (svc *CryptoService) GetEventTriggerExpirationBlock(ctx *gin.Context) {
return
}

identityPrefix, ok := ctx.GetQuery("identityPrefix")
identity, ok := ctx.GetQuery("identity")
if !ok {
err := sherror.NewHttpError(
"query parameter not found",
"identityPrefix query parameter is required",
"identity query parameter is required",
http.StatusBadRequest,
)
ctx.Error(err)
return
}

data, httpErr := svc.CryptoUsecase.GetEventTriggerExpirationBlock(ctx, eon, identityPrefix)
data, httpErr := svc.CryptoUsecase.GetEventTriggerExpirationBlock(ctx, eon, identity)
if httpErr != nil {
ctx.Error(httpErr)
return
Expand Down
34 changes: 16 additions & 18 deletions internal/usecase/eventtrigger.go
Original file line number Diff line number Diff line change
Expand Up @@ -374,9 +374,8 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger
identity := common.ComputeEventIdentity(identityPrefix[:], newSigner.From, eventTriggerDefinition)

_, err = uc.dbQuery.GetEventIdentityRegistration(ctx, data.GetEventIdentityRegistrationParams{
Eon: int64(eon),
IdentityPrefix: identityPrefix[:],
Sender: newSigner.From.Hex(),
Eon: int64(eon),
Identity: identity,
})
if err == nil {
log.Warn().Msg("event identity already registered")
Expand Down Expand Up @@ -435,7 +434,7 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger
// The registration is on-chain even if DB insert fails
}

go uc.updateEventIdentityExpirationBlockNumber(tx.Hash(), eon, identityPrefix[:], newSigner.From.Hex(), ttl)
go uc.updateEventIdentityExpirationBlockNumber(tx.Hash(), eon, identity, ttl)

metrics.TotalSuccessfulIdentityRegistration.Inc()
return &RegisterIdentityResponse{
Expand All @@ -447,7 +446,7 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger
}, nil
}

func (uc *CryptoUsecase) updateEventIdentityExpirationBlockNumber(txHash ecommon.Hash, eon uint64, identityPrefix []byte, sender string, ttl uint64) {
func (uc *CryptoUsecase) updateEventIdentityExpirationBlockNumber(txHash ecommon.Hash, eon uint64, identity []byte, ttl uint64) {
ctx := context.Background()
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
Expand All @@ -461,11 +460,11 @@ func (uc *CryptoUsecase) updateEventIdentityExpirationBlockNumber(txHash ecommon
}

expirationBlockNumber := receipt.BlockNumber.Uint64() + ttl

err = uc.dbQuery.UpdateEventIdentityRegistrationExpirationBlockNumber(ctx, data.UpdateEventIdentityRegistrationExpirationBlockNumberParams{
ExpirationBlockNumber: int64(expirationBlockNumber),
Eon: int64(eon),
IdentityPrefix: identityPrefix,
Sender: sender,
Identity: identity,
})
if err != nil {
log.Err(err).Str("tx_hash", txHash.Hex()).Msg("failed to update expiration block number")
Expand All @@ -477,22 +476,22 @@ func (uc *CryptoUsecase) updateEventIdentityExpirationBlockNumber(txHash ecommon
}
}

func (uc *CryptoUsecase) GetEventTriggerExpirationBlock(ctx context.Context, eon uint64, identityPrefix string) (*GetEventTriggerExpirationBlockResponse, *httpError.Http) {
identityPrefixBytes, err := hex.DecodeString(strings.TrimPrefix(identityPrefix, "0x"))
func (uc *CryptoUsecase) GetEventTriggerExpirationBlock(ctx context.Context, eon uint64, identity string) (*GetEventTriggerExpirationBlockResponse, *httpError.Http) {
identityBytes, err := hex.DecodeString(strings.TrimPrefix(identity, "0x"))
if err != nil {
log.Err(err).Msg("err encountered while decoding identity prefix")
log.Err(err).Msg("err encountered while decoding identity")
err := httpError.NewHttpError(
"error encountered while decoding identity prefix",
"error encountered while decoding identity",
"",
http.StatusBadRequest,
)
return nil, &err
}

if len(identityPrefixBytes) != 32 {
log.Err(err).Msg("identity prefix should be of length 32")
if len(identityBytes) != 32 {
log.Err(err).Msg("identity should be of length 32")
err := httpError.NewHttpError(
"identity prefix should be of length 32",
"identity should be of length 32",
"",
http.StatusBadRequest,
)
Expand All @@ -503,13 +502,12 @@ func (uc *CryptoUsecase) GetEventTriggerExpirationBlock(ctx context.Context, eon
sender := address.Hex()

expirationBlockNumber, err := uc.dbQuery.GetEventTriggerExpirationBlockNumber(ctx, data.GetEventTriggerExpirationBlockNumberParams{
Eon: int64(eon),
IdentityPrefix: identityPrefixBytes,
Sender: sender,
Eon: int64(eon),
Identity: identityBytes,
})
if err != nil {
if err == pgx.ErrNoRows {
log.Debug().Uint64("eon", eon).Str("identityPrefix", identityPrefix).Str("sender", sender).Msg("event identity registration not found")
log.Debug().Uint64("eon", eon).Str("identity", identity).Str("sender", sender).Msg("event identity registration not found")
err := httpError.NewHttpError(
"event identity registration not found",
"",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
-- +goose Up
-- +goose StatementBegin
ALTER TABLE event_identity_registration
DROP CONSTRAINT event_identity_registration_pkey;

ALTER TABLE event_identity_registration
ADD PRIMARY KEY (eon, identity);
-- +goose StatementEnd


-- +goose Down
-- +goose StatementBegin
ALTER TABLE event_identity_registration
DROP CONSTRAINT event_identity_registration_pkey;

ALTER TABLE event_identity_registration
ADD PRIMARY KEY (eon, identity_prefix, sender);
-- +goose StatementEnd
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
-- +goose Up
-- +goose StatementBegin
ALTER TABLE event_identity_registration
DROP CONSTRAINT event_identity_registration_pkey;

ALTER TABLE event_identity_registration
ADD PRIMARY KEY (eon, identity);
-- +goose StatementEnd


-- +goose Down
-- +goose StatementBegin
ALTER TABLE event_identity_registration
DROP CONSTRAINT event_identity_registration_pkey;

ALTER TABLE event_identity_registration
ADD PRIMARY KEY (eon, identity_prefix, sender);
-- +goose StatementEnd
15 changes: 6 additions & 9 deletions tests/register_event_identity_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,16 +89,14 @@ func (s *TestShutterService) TestRegisterEventIdentity() {

// Verify the registration was stored in the database
dbRegistration, dbErr := s.dbQuery.GetEventIdentityRegistration(ctx, data.GetEventIdentityRegistrationParams{
Eon: int64(eon),
IdentityPrefix: identityPrefix,
Sender: newSigner.From.Hex(),
Eon: int64(eon),
Identity: identity,
})
for i := 0; i < 50 && (dbErr != nil || dbRegistration.ExpirationBlockNumber != expectedExpirationBlockNumber); i++ {
time.Sleep(20 * time.Millisecond)
dbRegistration, dbErr = s.dbQuery.GetEventIdentityRegistration(ctx, data.GetEventIdentityRegistrationParams{
Eon: int64(eon),
IdentityPrefix: identityPrefix,
Sender: newSigner.From.Hex(),
Eon: int64(eon),
Identity: identity,
})
}
s.Require().NoError(dbErr)
Expand Down Expand Up @@ -424,9 +422,8 @@ func (s *TestShutterService) TestRegisterEventIdentity_AlreadyRegistered() {

// Verify the registration was stored in the database
dbRegistration, dbErr := s.dbQuery.GetEventIdentityRegistration(ctx, data.GetEventIdentityRegistrationParams{
Eon: int64(eon),
IdentityPrefix: identityPrefix,
Sender: newSigner.From.Hex(),
Eon: int64(eon),
Identity: identity,
})
s.Require().NoError(dbErr)
s.Require().Equal(int64(eon), dbRegistration.Eon)
Expand Down