From 0efd01e058307344d57eb8f06bfdeb1407316fb2 Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Tue, 13 May 2025 18:57:28 +0300 Subject: [PATCH] feat: add TransferFrom event --- cmd/service/router.go | 1 + go.mod | 2 +- internal/api/api.go | 1 - internal/handler/token_transfer.go | 49 ++++++++++++++++++++++++++++-- 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/cmd/service/router.go b/cmd/service/router.go index a864a49..ab7f40f 100644 --- a/cmd/service/router.go +++ b/cmd/service/router.go @@ -26,6 +26,7 @@ func bootstrapEventRouter(cacheProvider cache.Cache, pubCB router.Callback) *rou router.RegisterLogRoute(w3.H("0x894e56e1dac400b4475c83d8af0f0aa44de17c62764bd82f6e768a504e242461"), handler.HandleCustodialRegistrationLog()) router.RegisterLogRoute(w3.H("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"), handler.HandleTokenTransferLog(handlerContainer)) router.RegisterLogRoute(w3.H("0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925"), handler.HandleTokenApproveLog(handlerContainer)) + router.RegisterLogRoute(w3.H("0x2a41fa80e3e54181fc83d8e79d9cbbe49b1884bf79a3bf54f9d605d88eacb67e"), handler.HandleTokenTransferFromLog(handlerContainer)) router.RegisterInputDataRoute("63e4bff4", handler.HandleFaucetGiveInputData()) router.RegisterInputDataRoute("de82efb4", handler.HandleFaucetGiveInputData()) diff --git a/go.mod b/go.mod index a0d7db6..61d3708 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/grassrootseconomics/eth-tracker -go 1.23.3 +go 1.23 replace github.com/ethereum/go-ethereum => github.com/celo-org/op-geth v1.101411.1-0.20250213120352-dba6e464fdda diff --git a/internal/api/api.go b/internal/api/api.go index ea47162..5a34902 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -11,7 +11,6 @@ func New() *bunrouter.Router { router := bunrouter.New() router.GET("/metrics", metricsHandler()) - return router } diff --git a/internal/handler/token_transfer.go b/internal/handler/token_transfer.go index 5cbd917..3e41820 100644 --- a/internal/handler/token_transfer.go +++ b/internal/handler/token_transfer.go @@ -13,9 +13,10 @@ import ( const transferEventName = "TOKEN_TRANSFER" var ( - tokenTransferEvent = w3.MustNewEvent("Transfer(address indexed _from, address indexed _to, uint256 _value)") - tokenTransferSig = w3.MustNewFunc("transfer(address, uint256)", "bool") - tokenTransferFromSig = w3.MustNewFunc("transferFrom(address, address, uint256)", "bool") + tokenTransferEvent = w3.MustNewEvent("Transfer(address indexed _from, address indexed _to, uint256 _value)") + tokenTransferSig = w3.MustNewFunc("transfer(address, uint256)", "bool") + tokenTransferFromSig = w3.MustNewFunc("transferFrom(address, address, uint256)", "bool") + tokenTransferFromEvent = w3.MustNewEvent("TransferFrom(address indexed _from, address indexed _to, address indexed _spender, uint256 _value)") ) func HandleTokenTransferLog(hc *HandlerContainer) router.LogHandlerFunc { @@ -125,3 +126,45 @@ func HandleTokenTransferInputData(hc *HandlerContainer) router.InputDataHandlerF return nil } } + +func HandleTokenTransferFromLog(hc *HandlerContainer) router.LogHandlerFunc { + return func(ctx context.Context, lp router.LogPayload, c router.Callback) error { + var ( + from common.Address + to common.Address + spender common.Address + value big.Int + ) + + if err := tokenTransferFromEvent.DecodeArgs(lp.Log, &from, &to, &spender, &value); err != nil { + return err + } + + // TODO: Check correct params + proceed, err := hc.checkWithinNetwork(ctx, lp.Log.Address.Hex(), from.Hex(), to.Hex()) + if err != nil { + return err + } + if !proceed { + return nil + } + + tokenTransferFromEvent := 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: "TOKEN_TRANSFER_FROM", + Payload: map[string]any{ + "from": from.Hex(), + "to": to.Hex(), + "spender": spender.Hex(), + "value": value.String(), + }, + } + + return c(ctx, tokenTransferFromEvent) + } +}