From 6a48b3ebceb0778a82da0ffffd121e0081cad587 Mon Sep 17 00:00:00 2001
From: nick134 <76399455+nick134-bit@users.noreply.github.com>
Date: Tue, 3 Sep 2024 16:55:49 +0200
Subject: [PATCH] fix: claim rewards in ampluna (#586)

* fix: claim rewards in ampluna
---
 .../Pages/Trade/Liquidity/hooks/useClaim.ts   | 61 ++++++++++++-------
 .../hooks/useLiquidityAlliancePositions.ts    | 21 +++++--
 .../Pages/Trade/Liquidity/hooks/useRewards.ts |  8 +--
 .../Trade/Liquidity/hooks/useStakePosition.ts |  2 -
 constants/tokens.ts                           |  6 +-
 5 files changed, 63 insertions(+), 35 deletions(-)

diff --git a/components/Pages/Trade/Liquidity/hooks/useClaim.ts b/components/Pages/Trade/Liquidity/hooks/useClaim.ts
index c3675570..7932eb5e 100644
--- a/components/Pages/Trade/Liquidity/hooks/useClaim.ts
+++ b/components/Pages/Trade/Liquidity/hooks/useClaim.ts
@@ -12,10 +12,10 @@ import { createGasFee } from 'services/treasuryService'
 import { chainState } from 'state/chainState'
 import { createExecuteMessage } from 'util/messages/index'
 
-import { useFetchLiquidityAlliances } from './useLiquidityAlliancePositions'
+import { useAllianceRewards, useFetchLiquidityAlliances } from './useLiquidityAlliancePositions'
 
 export const useClaim = (pool: PoolEntityType) => {
-  console.log('Pool: ', pool)
+  const { data: allianceRewards } = useAllianceRewards()
   const { walletChainName } = useRecoilValue(chainState)
   const { address } = useChain(walletChainName)
   const { signingClient, injectiveSigningClient } = useClients(walletChainName)
@@ -29,46 +29,65 @@ export const useClaim = (pool: PoolEntityType) => {
     if (isLoading || !position?.length) {
       return null
     }
-    return position[0]?.bribeMarket
+    const reward_asset = position[0]?.config.reward_info.native
+    return {
+      reward_asset,
+      reward_address: reward_asset?.split('/')[1],
+      config: position[0]?.config,
+      bribeMarket: position[0]?.bribeMarket
+    }
   }, [position, isLoading])
 
-  let msg = null
+  let msg = []
   if (!bribeMarket) {
-    msg =
-    createExecuteMessage({
-      message: {
-        claim: {},
-      },
-      senderAddress: address,
-      contractAddress: pool.staking_address,
-      funds: [],
-    })
+    msg.push(
+      createExecuteMessage({
+        message: {
+          claim: {},
+        },
+        senderAddress: address,
+        contractAddress: pool.staking_address,
+        funds: [],
+      }))
   } else {
-    msg = createExecuteMessage({
+    msg.push(createExecuteMessage({
       message: {
         claim_reward: {
           native: pool.lp_token,
         },
       },
       senderAddress: address,
-      contractAddress: bribeMarket,
+      contractAddress: bribeMarket.bribeMarket,
       funds: [],
-    })
+    }))
   }
 
   const { mutate: submit, ...state } = useMutation({
     mutationFn: async () => {
+      if (bribeMarket) {
+        const reward = allianceRewards?.find((reward) => reward.staked_asset_share.info.native === pool.lp_token)
+        const balance = await signingClient.getBalance(address, bribeMarket.reward_asset)
+        const amount = { amount: String(Number(balance.amount) + Number(reward?.reward_asset.amount)), denom: balance.denom}
+        msg.push(createExecuteMessage({
+          message: {
+            withdraw: {},
+          },
+          senderAddress: address,
+          contractAddress: bribeMarket.reward_address,
+          funds: [amount],
+        }))
+      }
       if (injectiveSigningClient && await signingClient.getChainId() === ChainId.injective) {
         const injectiveTxData = await injectiveSigningClient.sign(
-          address, [msg], await createGasFee(
-            injectiveSigningClient, address, [msg],
+          address, msg, await createGasFee(
+            injectiveSigningClient, address, msg,
           ), ADV_MEMO,
         )
         return await signingClient.broadcastTx(TxRaw.encode(injectiveTxData).finish())
       }
       return await signingClient.signAndBroadcast(
-        address, [msg], await createGasFee(
-          signingClient, address, [msg],
+        address, msg, await createGasFee(
+          signingClient, address, msg,
         ), ADV_MEMO,
       )
     },
@@ -81,5 +100,5 @@ export const useClaim = (pool: PoolEntityType) => {
     ...state,
     ...tx,
   }),
-  [tx, state, submit])
+    [tx, state, submit])
 }
diff --git a/components/Pages/Trade/Liquidity/hooks/useLiquidityAlliancePositions.ts b/components/Pages/Trade/Liquidity/hooks/useLiquidityAlliancePositions.ts
index 227d1fc2..f42e4d93 100644
--- a/components/Pages/Trade/Liquidity/hooks/useLiquidityAlliancePositions.ts
+++ b/components/Pages/Trade/Liquidity/hooks/useLiquidityAlliancePositions.ts
@@ -89,9 +89,15 @@ const fetchWhitelistedAllianceTokens = async (
     const assets = await cosmWasmClient?.queryContractSmart(bribeMarket, {
       whitelisted_assets: {},
     })
+    const config = await cosmWasmClient?.queryContractSmart(bribeMarket, {
+      config: {},
+    })
     return assets.map((asset) => ({
+      reward_asset: config.reward_info.native,
+      reward_contract: config.reward_info.native.split('/')[1],
       token: asset?.cw20 || asset?.native,
       bribeMarket,
+      config,
     }))
   }))
 
@@ -110,8 +116,10 @@ export const useFetchLiquidityAlliances = (searchForToken?: string) => {
       cosmWasmClient, chainId, searchForToken,
     ),
     {
-      refetchInterval: 9000,
+      refetchInterval: 1 * 60 * 1000,
       enabled: chainId === 'phoenix-1',
+      cacheTime: 12 * 60 * 60 * 1000,
+      staleTime: 6 * 60 * 1000,
     },
   )
 }
@@ -128,10 +136,13 @@ export const fetchAllAllianceRewards = async (
       all_pending_rewards: { address },
     })
     for (const asset of assets) {
-      if (asset.reward_asset.info.native == 'factory/terra16l43xt2uq09yvz4axg73n8rtm0qte9lremdwm6ph0e35r2jnm43qnl8h53/zluna') {
-        asset.reward_asset.info.denom = 'uluna'
-      }
       asset.reward_asset.bribe_market = bribeMarket
+      if (asset.reward_asset.info.native.endsWith('zluna')) {
+        const claimAddress = asset.reward_asset.info.native.split('/')[1]
+        //ampLuna
+        asset.reward_asset.info.contract_addr = 'terra1ecgazyd0waaj3g7l9cmy5gulhxkps2gmxu9ghducvuypjq68mq2s5lvsct'
+        asset.reward_asset.info.claim_addr = claimAddress
+      }
     }
     return assets
   }))
@@ -149,7 +160,7 @@ export const useAllianceRewards = () => {
       cosmWasmClient, address, chainId,
     ),
     {
-      refetchInterval: 9000,
+      refetchInterval: 10000,
       enabled: chainId === 'phoenix-1' && Boolean(address),
     },
   )
diff --git a/components/Pages/Trade/Liquidity/hooks/useRewards.ts b/components/Pages/Trade/Liquidity/hooks/useRewards.ts
index 80a485aa..18018516 100644
--- a/components/Pages/Trade/Liquidity/hooks/useRewards.ts
+++ b/components/Pages/Trade/Liquidity/hooks/useRewards.ts
@@ -111,7 +111,6 @@ const useRewards = (pool: PoolEntityType): RewardsResult => {
   return useMemo(() => {
     const rewardsWithToken: RewardData[] = []
     aggregatedRewards?.forEach((reward) => {
-      console.log('Reward: ', reward)
       // Cw20 token
       if (reward.info?.token) {
         const t = tokenList?.tokens.find((token) => token.denom === reward.info.token.contract_addr)
@@ -142,12 +141,12 @@ const useRewards = (pool: PoolEntityType): RewardsResult => {
           dollarValue,
         })
       }
-      if (reward.info?.native && reward.bribe_market) {
-        const t = tokenList?.tokens.find((token) => token.denom === reward.info.denom)
+      if (reward.info?.contract_addr && reward.bribe_market) {
+        const t = tokenList?.tokens.find((token) => token.denom === reward.info.contract_addr)
         const amount = fromChainAmount(reward.amount, t?.decimals)
         const dollarValue = num(amount).
           times(prices?.[t?.symbol] || 0).
-          dp(4).
+          dp(2).
           toNumber()
         rewardsWithToken.push({
           ...t,
@@ -157,7 +156,6 @@ const useRewards = (pool: PoolEntityType): RewardsResult => {
         })
       }
     })
-    console.log('Rewards with token: ', rewardsWithToken)
     return {
       rewards: rewardsWithToken,
       totalValue: rewardsWithToken?.
diff --git a/components/Pages/Trade/Liquidity/hooks/useStakePosition.ts b/components/Pages/Trade/Liquidity/hooks/useStakePosition.ts
index b86bfd71..9b0c7478 100644
--- a/components/Pages/Trade/Liquidity/hooks/useStakePosition.ts
+++ b/components/Pages/Trade/Liquidity/hooks/useStakePosition.ts
@@ -62,8 +62,6 @@ const useStake = ({ amount, contract }: StakeProps) => {
   return useStakeTransaction({
     enabled: Boolean(msgs.length && bribeMarket),
     msgs,
-    encodedMsgs: [],
-    amount,
     senderAddress: address,
     signingClient,
   })
diff --git a/constants/tokens.ts b/constants/tokens.ts
index 7ed88b8a..f99425e0 100644
--- a/constants/tokens.ts
+++ b/constants/tokens.ts
@@ -2,7 +2,9 @@ export const B_WHALE_TOKEN_SYMBOL = 'bWHALE'
 export const AMP_WHALE_TOKEN_SYMBOL = 'ampWHALE'
 export const WHALE_TOKEN_SYMBOL = 'WHALE'
 
-export const TERRA2_BRIBE_MARKETS = { project: 'terra1awq6t7jfakg9wfjn40fk3wzwmd57mvrqtt3a39z9rmet7wdjj3ysgw3lpa',
+export const TERRA2_BRIBE_MARKETS = {
+  project: 'terra1awq6t7jfakg9wfjn40fk3wzwmd57mvrqtt3a39z9rmet7wdjj3ysgw3lpa',
   bluechip: 'terra14mmvqn0kthw6sre75vku263lafn5655mkjdejqjedjga4cw0qx2qlf4arv',
-  stable: 'terra1v399cx9drllm70wxfsgvfe694tdsd9x96p9ha36w7muffe4znlusqswspq' }
+  stable: 'terra1v399cx9drllm70wxfsgvfe694tdsd9x96p9ha36w7muffe4znlusqswspq'
+}
 export const POOL_TOKENS_DECIMALS = 6