From 3dcd3ac2c16daa975f38f5550ad9ce083a566979 Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Tue, 15 Jul 2025 16:09:38 +0300 Subject: [PATCH] feat: add limit set handler --- cmd/service/router.go | 2 + internal/handler/limit_set.go | 95 +++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 internal/handler/limit_set.go diff --git a/cmd/service/router.go b/cmd/service/router.go index 4baa3cf..8771226 100644 --- a/cmd/service/router.go +++ b/cmd/service/router.go @@ -27,6 +27,7 @@ func bootstrapEventRouter(cacheProvider cache.Cache, pubCB router.Callback) *rou router.RegisterLogRoute(w3.H("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"), handler.HandleTokenTransferLog(handlerContainer)) router.RegisterLogRoute(w3.H("0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925"), handler.HandleTokenApproveLog(handlerContainer)) router.RegisterLogRoute(w3.H("0x5f7542858008eeb041631f30e6109ae94b83a58e9a58261dd2c42c508850f939"), handler.HandleTokenTransferFromLog(handlerContainer)) + router.RegisterLogRoute(w3.H("0x8aa6856e3197c997992720c057a925dff13f6893a75f1a7228a2d4eafe117b84"), handler.HandleLimitSetLog(handlerContainer)) router.RegisterLogRoute(w3.H("0x06526a30af2ff868c2686df12e95844d8ae300416bbec5d5ccc2d2f4afdb17a0"), handler.HandleQuoterUpdatedLog()) router.RegisterInputDataRoute("63e4bff4", handler.HandleFaucetGiveInputData()) @@ -45,6 +46,7 @@ func bootstrapEventRouter(cacheProvider cache.Cache, pubCB router.Callback) *rou router.RegisterInputDataRoute("a9059cbb", handler.HandleTokenTransferInputData(handlerContainer)) router.RegisterInputDataRoute("23b872dd", handler.HandleTokenTransferInputData(handlerContainer)) router.RegisterInputDataRoute("095ea7b3", handler.HandleTokenApproveInputData(handlerContainer)) + router.RegisterInputDataRoute("bdd55440", handler.HandleLimitSetInputData(handlerContainer)) router.RegisterInputDataRoute("f912c64b", handler.HandleQuoterUpdatedInputData()) return router diff --git a/internal/handler/limit_set.go b/internal/handler/limit_set.go new file mode 100644 index 0000000..270dc54 --- /dev/null +++ b/internal/handler/limit_set.go @@ -0,0 +1,95 @@ +package handler + +import ( + "context" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/grassrootseconomics/eth-tracker/pkg/event" + "github.com/grassrootseconomics/eth-tracker/pkg/router" + "github.com/lmittmann/w3" +) + +const limitSetEventName = "LIMIT_SET" + +var ( + limitSetEvent = w3.MustNewEvent("LimitSet(address indexed token, address indexed holder, uint256 value)") + limitSetSig = w3.MustNewFunc("setLimitFor(address, address, uint256)", "") +) + +func HandleLimitSetLog(hc *HandlerContainer) router.LogHandlerFunc { + return func(ctx context.Context, lp router.LogPayload, c router.Callback) error { + var ( + token common.Address + holder common.Address + value big.Int + ) + + if err := limitSetEvent.DecodeArgs(lp.Log, &token, &holder, &value); err != nil { + return err + } + + proceed, err := hc.checkWithinNetwork(ctx, lp.Log.Address.Hex(), token.Hex(), holder.Hex()) + if err != nil { + return err + } + if !proceed { + return nil + } + + limitSetEvent := event.Event{ + Index: lp.Log.Index, + Block: lp.Log.BlockNumber, + ContractAddress: lp.Log.Address.Hex(), + Success: true, + Timestamp: lp.Timestamp, + TxHash: lp.Log.TxHash.Hex(), + TxType: limitSetEventName, + Payload: map[string]any{ + "token": token.Hex(), + "holder": holder.Hex(), + "value": value.String(), + }, + } + + return c(ctx, limitSetEvent) + } +} + +func HandleLimitSetInputData(hc *HandlerContainer) router.InputDataHandlerFunc { + return func(ctx context.Context, idp router.InputDataPayload, c router.Callback) error { + var ( + token common.Address + holder common.Address + value big.Int + ) + + if err := limitSetSig.DecodeArgs(w3.B(idp.InputData), &token, &holder, &value); err != nil { + return err + } + + proceed, err := hc.checkWithinNetwork(ctx, idp.ContractAddress, token.Hex(), holder.Hex()) + if err != nil { + return err + } + if !proceed { + return nil + } + + limitSetEvent := event.Event{ + Block: idp.Block, + ContractAddress: idp.ContractAddress, + Success: false, + Timestamp: idp.Timestamp, + TxHash: idp.TxHash, + TxType: limitSetEventName, + Payload: map[string]any{ + "token": token.Hex(), + "holder": holder.Hex(), + "value": value.String(), + }, + } + + return c(ctx, limitSetEvent) + } +}