From cf263c7d15a757178dff8afb5fa575f9ec1f5bf3 Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Wed, 20 Nov 2024 09:53:54 +0300 Subject: [PATCH] feat: change transfer event lookup to enforce both token AND address existence before emitting event * Add ExistsNetwork cache lookup * Exists now only accepts a single param --- internal/cache/cache.go | 3 ++- internal/cache/redis.go | 22 ++++++++++++++++++-- internal/cache/xmap.go | 19 ++++++++++++++++-- internal/handler/token_transfer.go | 32 ++++++------------------------ 4 files changed, 45 insertions(+), 31 deletions(-) diff --git a/internal/cache/cache.go b/internal/cache/cache.go index 2ec7fc4..17416b3 100644 --- a/internal/cache/cache.go +++ b/internal/cache/cache.go @@ -11,7 +11,8 @@ type ( Cache interface { Add(context.Context, string) error Remove(context.Context, string) error - Exists(context.Context, ...string) (bool, error) + Exists(context.Context, string) (bool, error) + ExistsNetwork(context.Context, string, ...string) (bool, error) Size(context.Context) (int64, error) } diff --git a/internal/cache/redis.go b/internal/cache/redis.go index 5424162..134bf12 100644 --- a/internal/cache/redis.go +++ b/internal/cache/redis.go @@ -40,8 +40,26 @@ func (c *redisCache) Remove(ctx context.Context, key string) error { return c.client.Do(ctx, cmd).Error() } -func (c *redisCache) Exists(ctx context.Context, keys ...string) (bool, error) { - cmd := c.client.B().Exists().Key(keys...).Build() +func (c *redisCache) Exists(ctx context.Context, key string) (bool, error) { + cmd := c.client.B().Exists().Key(key).Build() + res, err := c.client.Do(ctx, cmd).AsBool() + if err != nil { + return false, err + } + + return res, nil +} + +func (c *redisCache) ExistsNetwork(ctx context.Context, token string, addresses ...string) (bool, error) { + tokenCmd := c.client.B().Exists().Key(token).Build() + tokenRes, err := c.client.Do(ctx, tokenCmd).AsBool() + if err != nil { + return false, err + } else if !tokenRes { + return false, nil + } + + cmd := c.client.B().Exists().Key(addresses...).Build() res, err := c.client.Do(ctx, cmd).AsBool() if err != nil { return false, err diff --git a/internal/cache/xmap.go b/internal/cache/xmap.go index cc82584..b9bedb5 100644 --- a/internal/cache/xmap.go +++ b/internal/cache/xmap.go @@ -26,8 +26,23 @@ func (c *mapCache) Remove(_ context.Context, key string) error { return nil } -func (c *mapCache) Exists(_ context.Context, key ...string) (bool, error) { - for _, v := range key { +func (c *mapCache) Exists(_ context.Context, key string) (bool, error) { + _, ok := c.xmap.Load(key) + if ok { + return true, nil + + } + + return false, nil +} + +func (c *mapCache) ExistsNetwork(_ context.Context, token string, addresses ...string) (bool, error) { + _, ok := c.xmap.Load(token) + if !ok { + return false, nil + } + + for _, v := range addresses { _, ok := c.xmap.Load(v) if ok { return true, nil diff --git a/internal/handler/token_transfer.go b/internal/handler/token_transfer.go index 7ae360a..aeac378 100644 --- a/internal/handler/token_transfer.go +++ b/internal/handler/token_transfer.go @@ -10,27 +10,12 @@ import ( "github.com/lmittmann/w3" ) -const ( - transferEventName = "TOKEN_TRANSFER" - - CUSDContractMainnet = "0x765DE816845861e75A25fCA122bb6898B8B1282a" - CKESContractMainnet = "0x456a3D042C0DbD3db53D5489e98dFb038553B0d0" - CEURContractmainnet = "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73" - USDCContractMainnet = "0xcebA9300f2b948710d2653dD7B07f33A8B32118C" - USDTContractMainnet = "0x617f3112bf5397D0467D315cC709EF968D9ba546" -) +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") - - stables = map[string]bool{ - CUSDContractMainnet: true, - CKESContractMainnet: true, - USDTContractMainnet: true, - USDCContractMainnet: true, - } ) func HandleTokenTransferLog(hc *HandlerContainer) router.LogHandlerFunc { @@ -45,7 +30,7 @@ func HandleTokenTransferLog(hc *HandlerContainer) router.LogHandlerFunc { return err } - proceed, err := hc.checkStables(ctx, from.Hex(), to.Hex(), lp.Log.Address.Hex()) + proceed, err := hc.checkTransferWithinNetwork(ctx, lp.Log.Address.Hex(), from.Hex(), to.Hex()) if err != nil { return err } @@ -94,7 +79,7 @@ func HandleTokenTransferInputData(hc *HandlerContainer) router.InputDataHandlerF return err } - proceed, err := hc.checkStables(ctx, idp.From, to.Hex(), idp.ContractAddress) + proceed, err := hc.checkTransferWithinNetwork(ctx, idp.ContractAddress, idp.From, to.Hex()) if err != nil { return err } @@ -120,7 +105,7 @@ func HandleTokenTransferInputData(hc *HandlerContainer) router.InputDataHandlerF return err } - proceed, err := hc.checkStables(ctx, from.Hex(), to.Hex(), idp.ContractAddress) + proceed, err := hc.checkTransferWithinNetwork(ctx, idp.ContractAddress, from.Hex(), to.Hex()) if err != nil { return err } @@ -141,13 +126,8 @@ func HandleTokenTransferInputData(hc *HandlerContainer) router.InputDataHandlerF } } -func (hc *HandlerContainer) checkStables(ctx context.Context, from string, to string, contractAddress string) (bool, error) { - _, ok := stables[contractAddress] - if !ok { - return true, nil - } - - exists, err := hc.cache.Exists(ctx, from, to) +func (hc *HandlerContainer) checkTransferWithinNetwork(ctx context.Context, contractAddress string, from string, to string) (bool, error) { + exists, err := hc.cache.ExistsNetwork(ctx, contractAddress, from, to) if err != nil { return false, err }