From 44c3f759a9c227e30cbba514e462f3264fdacfee Mon Sep 17 00:00:00 2001
From: Joe Bowman <joe@ingenuity.build>
Date: Mon, 22 Jan 2024 19:57:57 +0000
Subject: [PATCH] add defi and logo routes

---
 conf.yaml       |  76 +++++++++--
 go.mod          |   2 +
 go.sum          |   4 +
 handlers.go     | 348 +++++++++++++++++++++++++++++++++++++++++++++++-
 placeholder.png | Bin 0 -> 42908 bytes
 service.go      |  33 ++++-
 6 files changed, 437 insertions(+), 26 deletions(-)
 create mode 100644 placeholder.png

diff --git a/conf.yaml b/conf.yaml
index 8cc81d4..27fcbcd 100644
--- a/conf.yaml
+++ b/conf.yaml
@@ -1,13 +1,65 @@
-quickhost: "https://rpc.test.quicksilver.zone:443"
-chainhost: "https://rpc.%s.test.quicksilver.zone:443"
+lcd_endpoint: "https://lcd.quicksilver.zone"
+rpc_endpoint: "https://rpc.test.quicksilver.zone:443"
+chain_rpc_endpoint: "https://rpc.%s.test.quicksilver.zone:443"
 chains:
-  - "quicksilver"
-  - "cosmoshub"
-  - "stargaze"
-  - "osmosis"
-  - "regen"
-  - "sommelier"
-aprurl: "https://chains.cosmos.directory"
-aprcachetime: 15 #minutes
-lcdendpoint: "https://lcd.quicksilver.zone"
-supplycachetime: 3 #hours
\ No newline at end of file
+  - quicksilver
+  - cosmoshub
+  - stargaze
+  - osmosis
+  - regen
+  - sommelier
+  - juno
+  - composable
+apr_url: "https://chains.cosmos.directory"
+apr_cache_minutes: 15
+supply_cache_minutes: 180
+defi_apis:
+  shade: https://na36v10ce3.execute-api.us-east-1.amazonaws.com/API-mainnet-STAGE/shadeswap/pairs
+  osmosis: https://app.osmosis.zone/api/pools?page=1&limit=500&min_liquidity=500
+  osmosis_apy: https://public-osmosis-api.numia.xyz/pools_apr
+  ux: https://testnet-client-bff-ocstrhuppq-uc.a.run.app/markets
+defi:
+  - assetPair: qATOM/ATOM
+    provider: osmosis
+    action: Add Liquidity
+    link: https://app.osmosis.zone/pool/944
+    id: 944
+  - assetPair: qSTARS/STARS
+    provider: osmosis
+    action: Add Liquidity
+    link: https://app.osmosis.zone/pool/903
+    id: 903
+  - assetPair: qREGEN/REGEN
+    provider: osmosis
+    action: Add Liquidity
+    link: https://app.osmosis.zone/pool/948
+    id: 948
+  - assetPair: qOSMO/OSMO
+    provider: osmosis
+    action: Add Liquidity
+    link: https://app.osmosis.zone/pool/956
+    id: 956
+  - assetPair: qSOMM/SOMM
+    provider: osmosis
+    action: Add Liquidity
+    link: https://app.osmosis.zone/pool/1087
+    id: 1087
+  - assetPair: qATOM
+    provider: ux
+    action: Lend
+    link: https://app.ux.xyz/markets?base_denom=ibc%2F454725EA4029BAA99C293904336DE9A4B84E2BF7D83B9C56EE6B03E8A65FB5A1
+    id: QATOM
+  - assetPair: qATOM/SILK
+    provider: shade
+    action: Add Liquidity
+    apy: 0.459
+    tvl: 100400
+    link: https://app.shadeprotocol.io/swap/pools
+    id: 17dddb72-5719-4328-a3a7-1c84b4f7a932
+  - assetPair: qATOM/ATOM
+    provider: shade
+    action: Add Liquidity
+    apy: 0.121
+    tvl: 75760
+    link: https://app.shadeprotocol.io/swap/pools
+    id: 44c1658d-8626-4bf9-835f-d13aefec4c09
diff --git a/go.mod b/go.mod
index 8381532..e2a57bc 100644
--- a/go.mod
+++ b/go.mod
@@ -39,6 +39,7 @@ require (
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
 	github.com/dgraph-io/badger/v3 v3.2103.2 // indirect
+	github.com/disintegration/imaging v1.6.2 // indirect
 	github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac // indirect
 	github.com/dvsekhvalnov/jose2go v1.5.0 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
@@ -109,6 +110,7 @@ require (
 	go.opencensus.io v0.24.0 // indirect
 	golang.org/x/crypto v0.5.0 // indirect
 	golang.org/x/exp v0.0.0-20220914170420-dc92f8653013 // indirect
+	golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 // indirect
 	golang.org/x/net v0.8.0 // indirect
 	golang.org/x/sys v0.6.0 // indirect
 	golang.org/x/term v0.6.0 // indirect
diff --git a/go.sum b/go.sum
index b3429d4..251bfa3 100644
--- a/go.sum
+++ b/go.sum
@@ -1017,6 +1017,8 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUn
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
 github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
+github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
+github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
 github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
 github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
 github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko=
@@ -2734,6 +2736,8 @@ golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91/go.mod h1:AbB0pIl
 golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U=
+golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
diff --git a/handlers.go b/handlers.go
index e5bfaa7..e38fddb 100644
--- a/handlers.go
+++ b/handlers.go
@@ -1,10 +1,14 @@
 package main
 
 import (
+	"bytes"
 	"context"
 	"encoding/json"
 	"fmt"
+	"image/png"
+	"math"
 	"net/http"
+	"strconv"
 	"time"
 
 	sdkmath "cosmossdk.io/math"
@@ -15,6 +19,8 @@ import (
 	icstypes "github.com/ingenuity-build/quicksilver/x/interchainstaking/types"
 	echov4 "github.com/labstack/echo/v4"
 	rpcclient "github.com/tendermint/tendermint/rpc/client"
+
+	"github.com/disintegration/imaging"
 )
 
 func (s *Service) ConfigureRoutes() {
@@ -90,6 +96,62 @@ func (s *Service) ConfigureRoutes() {
 		}
 		return ctx.JSONBlob(http.StatusOK, data.([]byte))
 	})
+
+	s.Echo.GET("/defi", func(ctx echov4.Context) error {
+
+		defi, err := s.doDefi(ctx)
+		if err != nil {
+			return err
+		}
+		data, err := json.Marshal(defi)
+		if err != nil {
+			return err
+		}
+		return ctx.JSONBlob(http.StatusOK, data)
+	})
+
+	s.Echo.GET("/valoper/:chainId/:address/:h/:w", func(ctx echov4.Context) error {
+		address := ctx.Param("address")
+		chainId := ctx.Param("chainId")
+		height, err := strconv.Atoi(ctx.Param("h"))
+		if err != nil {
+			return echov4.ErrBadRequest
+		}
+		width, err := strconv.Atoi(ctx.Param("w"))
+		if err != nil {
+			return echov4.ErrBadRequest
+		}
+
+		key := fmt.Sprintf("logo.%s.%s.%d.%d", chainId, address, height, width)
+		data, found := s.Cache.Get(key)
+		if !found {
+			data, err = s.getLogo(ctx, key, chainId, address, height, width)
+			if err != nil {
+				return echov4.ErrServiceUnavailable
+			}
+		}
+
+		ctx.Response().Header().Add("Cache-Control", "public, max-age=86400, ") // expiry 24h
+		return ctx.Blob(http.StatusOK, "image/png", data.([]byte))
+	})
+
+	s.Echo.GET("/valoper/:chainId/:address", func(ctx echov4.Context) error {
+		address := ctx.Param("address")
+		chainId := ctx.Param("chainId")
+
+		key := fmt.Sprintf("logo.%s.%s.%d.%d", chainId, address, 200, 200)
+		var err error
+		data, found := s.Cache.Get(key)
+		if !found {
+			data, err = s.getLogo(ctx, key, chainId, address, 200, 200)
+			if err != nil {
+				return echov4.ErrServiceUnavailable
+			}
+		}
+
+		ctx.Response().Header().Add("Cache-Control", "public, max-age=86400, ") // expiry 24h
+		return ctx.Blob(http.StatusOK, "image/png", data.([]byte))
+	})
 }
 
 func (s *Service) getValidatorList(ctx echov4.Context, key string, chainId string) error {
@@ -211,7 +273,7 @@ func (s *Service) getZones(ctx echov4.Context, key string) error {
 	s.Echo.Logger.Infof("getZones")
 
 	// establish client connection
-	client, err := NewRPCClient(s.Config.QuickHost, 30*time.Second)
+	client, err := NewRPCClient(s.Config.RpcEndpoint, 30*time.Second)
 	if err != nil {
 		s.Echo.Logger.Errorf("getZones: %v - %v", ErrRPCClientConnection, err)
 		return ErrRPCClientConnection
@@ -286,7 +348,7 @@ func (s *Service) getAPR(ctx echov4.Context, key string) error {
 func (s *Service) getTotalSupply(ctx echov4.Context, key string) error {
 	s.Echo.Logger.Infof("getTotalSupply")
 
-	totalSupply, err := getTotalSupply(s.Config.LCDEndpoint + "/cosmos/bank/v1beta1/supply")
+	totalSupply, err := getTotalSupply(s.Config.LcdEndpoint + "/cosmos/bank/v1beta1/supply")
 	if err != nil {
 		s.Echo.Logger.Errorf("getTotalSupply: %v - %v", ErrUnableToGetTotalSupply, err)
 		return ErrUnableToGetTotalSupply
@@ -297,7 +359,7 @@ func (s *Service) getTotalSupply(ctx echov4.Context, key string) error {
 		s.Echo.Logger.Errorf("getTotalSupply: %v - %v", ErrMarshalResponse, err)
 		return ErrMarshalResponse
 	}
-	s.Cache.SetWithTTL(key, respData, 1, time.Duration(s.Config.SupplyCacheTime)*time.Hour)
+	s.Cache.SetWithTTL(key, respData, 1, time.Duration(s.Config.SupplyCacheTime)*time.Minute)
 
 	return ctx.JSONBlob(http.StatusOK, respData)
 }
@@ -310,7 +372,7 @@ func (s *Service) getCirculatingSupply(ctx echov4.Context, key string) error {
 	totalLockedTokens := sdkmath.ZeroInt()
 
 	for _, address := range VESTING_ACCOUNTS {
-		lockedTokensForAddress, err := getVestingAccountLocked(s.Config.LCDEndpoint+"/cosmos/auth/v1beta1/accounts/", address)
+		lockedTokensForAddress, err := getVestingAccountLocked(s.Config.LcdEndpoint+"/cosmos/auth/v1beta1/accounts/", address)
 		if err != nil {
 			s.Echo.Logger.Errorf("getCirculatingSupply: %v - %v", ErrUnableToGetLockedTokens, err)
 			return ErrUnableToGetLockedTokens
@@ -319,14 +381,14 @@ func (s *Service) getCirculatingSupply(ctx echov4.Context, key string) error {
 		s.Echo.Logger.Info("lockedTokensFor", address, " -> ", lockedTokensForAddress)
 	}
 
-	totalSupply, err := getTotalSupply(s.Config.LCDEndpoint + "/cosmos/bank/v1beta1/supply")
+	totalSupply, err := getTotalSupply(s.Config.LcdEndpoint + "/cosmos/bank/v1beta1/supply")
 	if err != nil {
 		s.Echo.Logger.Errorf("getCirculatingSupply: %v - %v", ErrUnableToGetTotalSupply, err)
 		return ErrUnableToGetTotalSupply
 	}
 	s.Echo.Logger.Info("totalSupply", " -> ", totalSupply)
 
-	communityPoolBalance, err := getCommunityPool(s.Config.LCDEndpoint + "/cosmos/distribution/v1beta1/community_pool")
+	communityPoolBalance, err := getCommunityPool(s.Config.LcdEndpoint + "/cosmos/distribution/v1beta1/community_pool")
 	if err != nil {
 		s.Echo.Logger.Errorf("getCirculatingSupply: %v - %v", ErrUnableToGetCommunityPool, err)
 		return ErrUnableToGetCommunityPool
@@ -342,8 +404,280 @@ func (s *Service) getCirculatingSupply(ctx echov4.Context, key string) error {
 		s.Echo.Logger.Errorf("getCirculatingSupply: %v - %v", ErrMarshalResponse, err)
 		return ErrMarshalResponse
 	}
-	s.Cache.SetWithTTL(key, respData, 1, time.Duration(s.Config.SupplyCacheTime)*time.Hour)
+	s.Cache.SetWithTTL(key, respData, 1, time.Duration(s.Config.SupplyCacheTime)*time.Minute)
 
 	return ctx.JSONBlob(http.StatusOK, respData)
 
 }
+
+func (s *Service) getLogo(ctx echov4.Context, key string, chain string, address string, height int, width int) ([]byte, error) {
+	resp, err := http.Get(fmt.Sprintf("https://raw.githubusercontent.com/cosmostation/chainlist/main/chain/%s/moniker/%s.png", chain, address))
+	if err != nil {
+		return s.placeHolder(key, height, width), nil
+	}
+
+	defer resp.Body.Close()
+	img, err := imaging.Decode(resp.Body)
+
+	if err != nil {
+		return s.placeHolder(key, height, width), nil
+	}
+
+	img = imaging.Resize(img, height, width, imaging.Lanczos)
+
+	out := bytes.NewBuffer([]byte{})
+	imaging.Encode(out, img, imaging.PNG, imaging.PNGCompressionLevel(png.BestCompression))
+
+	ctx.Logger().Error(fmt.Sprintf("read %d bytes", len(out.Bytes())))
+
+	s.Cache.SetWithTTL(key, out.Bytes(), 1, 12*time.Hour)
+
+	return out.Bytes(), nil
+}
+
+func (s *Service) placeHolder(key string, height int, width int) []byte {
+	img, _ := imaging.Open("placeholder.png")
+	img = imaging.Resize(img, height, width, imaging.Lanczos)
+	result := bytes.NewBuffer([]byte{})
+	imaging.Encode(result, img, imaging.PNG, imaging.PNGCompressionLevel(png.BestCompression))
+	s.Cache.SetWithTTL(key, result.Bytes(), 1, 1*time.Hour)
+	return result.Bytes()
+}
+
+func (s *Service) doDefi(ctx echov4.Context) ([]DefiInfo, error) {
+	out := []DefiInfo{}
+	for _, d := range s.Config.DefiInfo {
+		switch d.Provider {
+		case "ux":
+			r, err := s.doDefiUx(d)
+			if err != nil {
+				ctx.Logger().Error("unable to fetch ux defi", err)
+				out = append(out, d)
+			}
+			out = append(out, r)
+		case "osmosis":
+			r, err := s.doDefiOsmosis(d)
+			if err != nil {
+				ctx.Logger().Error("unable to fetch osmosis defi", err)
+				out = append(out, d)
+			}
+			out = append(out, r)
+		case "shade":
+			r, err := s.doDefiShade(d)
+			if err != nil {
+				ctx.Logger().Error("unable to fetch shade defi", err)
+				out = append(out, d)
+			}
+			out = append(out, r)
+		default:
+			// if config doesn't exist, just use the static content
+			out = append(out, d)
+		}
+	}
+	return out, nil
+}
+
+type UxResult struct {
+	Asset string  `json:"asset"`
+	Tvl   float64 `json:"collateral_usd"`
+	Apy   float64 `json:"supply_apy"`
+}
+
+func (s *Service) doDefiUx(d DefiInfo) (DefiInfo, error) {
+	key := fmt.Sprintf("defi.%s.%s", d.Provider, d.Id)
+	cached, found := s.Cache.Get(key)
+	if found {
+		s.Logger.Info(fmt.Sprintf("hit cache for ux pool %s", d.Id))
+		return cached.(DefiInfo), nil
+	}
+	var result []UxResult
+	var err error
+	cachedResult, found := s.Cache.Get("defi.raw.ux")
+	if !found {
+		result, err = s.queryUx()
+		if err != nil {
+			return d, err
+		}
+	} else {
+		result = cachedResult.([]UxResult)
+	}
+
+	for _, r := range result {
+		if r.Asset == d.Id {
+			d.APY = r.Apy
+			d.TVL = int(r.Tvl)
+			break
+		}
+	}
+	s.Cache.SetWithTTL(key, d, 1, 3*time.Hour)
+
+	return d, nil
+}
+
+type OsmosisPoolCacheResult struct {
+	Pools    []OsmosisPoolResult    `json:"pools"`
+	PoolAprs []OsmosisPoolAprResult `json:"-"`
+}
+type OsmosisPoolResult struct {
+	Id  string  `json:"id"`
+	Tvl float64 `json:"liquidityUsd"`
+}
+
+type OsmosisPoolAprResult struct {
+	Id  string  `json:"pool_id"`
+	Apr float64 `json:"total_apr"`
+}
+
+func (s *Service) doDefiOsmosis(d DefiInfo) (DefiInfo, error) {
+	key := fmt.Sprintf("defi.%s.%s", d.Provider, d.Id)
+	cached, found := s.Cache.Get(key)
+	if found {
+		s.Logger.Info(fmt.Sprintf("hit cache for osmosis pool %s", d.Id))
+		return cached.(DefiInfo), nil
+	}
+
+	var result OsmosisPoolCacheResult
+	var err error
+	cachedResult, found := s.Cache.Get("defi.raw.osmosis")
+	if !found {
+		result, err = s.queryOsmo()
+		if err != nil {
+			return d, err
+		}
+	} else {
+		result = cachedResult.(OsmosisPoolCacheResult)
+	}
+
+	for _, pool := range result.Pools {
+		if pool.Id == d.Id {
+			d.TVL = int(pool.Tvl)
+			break
+		}
+	}
+
+	for _, pool := range result.PoolAprs {
+		if pool.Id == d.Id {
+			d.APY = pool.Apr / 100
+			break
+		}
+	}
+
+	s.Cache.SetWithTTL(key, d, 1, 3*time.Hour)
+
+	return d, nil
+}
+
+type ShadeApr struct {
+	Total float64 `json:"total"`
+}
+type ShadeResult struct {
+	Id  string   `json:"id"`
+	Apy ShadeApr `json:"apy"`
+	Tvl string   `json:"liquidity_usd"`
+}
+
+func (s *Service) doDefiShade(d DefiInfo) (DefiInfo, error) {
+	key := fmt.Sprintf("defi.%s.%s", d.Provider, d.Id)
+	cached, found := s.Cache.Get(key)
+	if found {
+		s.Logger.Info(fmt.Sprintf("hit cache for shade pool %s", d.Id))
+		return cached.(DefiInfo), nil
+	}
+
+	var result []ShadeResult
+	var err error
+	cachedResult, found := s.Cache.Get("defi.raw.shade")
+	if !found {
+		result, err = s.queryShade()
+		if err != nil {
+			return d, err
+		}
+	} else {
+		result = cachedResult.([]ShadeResult)
+	}
+
+	for _, r := range result {
+		if r.Id == d.Id {
+			d.APY = r.Apy.Total / 100
+			fl, _ := strconv.ParseFloat(r.Tvl, 64)
+			d.TVL = int(math.Floor(fl))
+			break
+		}
+	}
+	s.Cache.SetWithTTL(key, d, 1, 3*time.Hour)
+	return d, nil
+}
+
+func (s *Service) queryShade() ([]ShadeResult, error) {
+
+	s.Logger.Info("querying shade api")
+	resp, err := http.Get(s.Config.DefiApis.Shade)
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+
+	var result []ShadeResult
+	err = json.NewDecoder(resp.Body).Decode(&result)
+	if err != nil {
+		return nil, err
+	}
+	s.Cache.SetWithTTL("defi.raw.shade", result, 1, 3*time.Hour)
+	time.Sleep(time.Millisecond * 200)
+
+	return result, nil
+}
+
+func (s *Service) queryUx() ([]UxResult, error) {
+
+	s.Logger.Info("querying ux api")
+	resp, err := http.Get(s.Config.DefiApis.Ux)
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+
+	var result []UxResult
+	err = json.NewDecoder(resp.Body).Decode(&result)
+	if err != nil {
+		return nil, err
+	}
+	s.Cache.SetWithTTL("defi.raw.ux", result, 1, 3*time.Hour)
+	time.Sleep(time.Millisecond * 200)
+
+	return result, nil
+}
+
+func (s *Service) queryOsmo() (OsmosisPoolCacheResult, error) {
+
+	s.Logger.Info("querying osmosis api")
+	resp, err := http.Get(s.Config.DefiApis.Osmosis)
+	if err != nil {
+		return OsmosisPoolCacheResult{}, err
+	}
+	defer resp.Body.Close()
+
+	var poolResult OsmosisPoolCacheResult
+	err = json.NewDecoder(resp.Body).Decode(&poolResult)
+	if err != nil {
+		return OsmosisPoolCacheResult{}, err
+	}
+
+	s.Logger.Info("querying osmosis apr api")
+
+	resp, err = http.Get(s.Config.DefiApis.OsmosisApy)
+	if err != nil {
+		return OsmosisPoolCacheResult{}, err
+	}
+	defer resp.Body.Close()
+
+	err = json.NewDecoder(resp.Body).Decode(&poolResult.PoolAprs)
+	if err != nil {
+		return OsmosisPoolCacheResult{}, err
+	}
+
+	s.Cache.SetWithTTL("defi.raw.osmosis", poolResult, 1, 3*time.Hour)
+	time.Sleep(time.Millisecond * 200)
+
+	return poolResult, nil
+}
diff --git a/placeholder.png b/placeholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..e53335cbef7000132b520850f495d6530144b6ae
GIT binary patch
literal 42908
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

literal 0
HcmV?d00001

diff --git a/service.go b/service.go
index 5911e53..bede1b5 100644
--- a/service.go
+++ b/service.go
@@ -51,13 +51,32 @@ type Service struct {
 }
 
 type Config struct {
-	QuickHost       string
-	ChainHost       string
-	Chains          []string
-	APRURL          string
-	APRCacheTime    int
-	LCDEndpoint     string
-	SupplyCacheTime int
+	RpcEndpoint     string     `yaml:"rpc_endpoint" json:"rpc_endpoint"`
+	LcdEndpoint     string     `yaml:"lcd_endpoint" json:"lcd_endpoint"`
+	ChainHost       string     `yaml:"chain_rpc_endpoint" json:"chain_rpc_endpoint"`
+	Chains          []string   `yaml:"chains" json:"chains"`
+	APRURL          string     `yaml:"apr_url" json:"apr_url"`
+	APRCacheTime    int        `yaml:"apr_cache_minutes" json:"apr_cache_minutes"`
+	SupplyCacheTime int        `yaml:"supply_cache_minutes" json:"supply_cache_minutes"`
+	DefiInfo        []DefiInfo `yaml:"defi" json:"defi"`
+	DefiApis        DefiApis   `yaml:"defi_apis" json:"defi_apis"`
+}
+
+type DefiInfo struct {
+	AssetPair string  `yaml:"assetPair" json:"assetPair"`
+	Provider  string  `yaml:"provider" json:"provider"`
+	Action    string  `yaml:"action" json:"action"`
+	APY       float64 `yaml:"apy" json:"apy"`
+	TVL       int     `yaml:"tvl" json:"tvl"`
+	Link      string  `yaml:"link" json:"link"`
+	Id        string  `yaml:"id" json:"id"`
+}
+
+type DefiApis struct {
+	Ux         string `yaml:"ux" json:"ux"`
+	Osmosis    string `yaml:"osmosis" json:"osmosis"`
+	OsmosisApy string `yaml:"osmosis_apy" json:"osmosis_apy"`
+	Shade      string `yaml:"shade" json:"shade"`
 }
 
 func NewCacheService(e *echov4.Echo, cache *ristretto.Cache, cfg Config) *Service {