From 9741ecee07a0fb73f340b031be9c7e026d4b0c00 Mon Sep 17 00:00:00 2001 From: microHoffman Date: Fri, 9 May 2025 16:27:32 +0200 Subject: [PATCH 1/2] feat: add claiming of vesting and staking positions --- components/TableOwnedPositions.vue | 70 ++++++++++++++++++++++-------- constants/abis.ts | 1 + utils/useTransactions.ts | 5 ++- 3 files changed, 58 insertions(+), 18 deletions(-) diff --git a/components/TableOwnedPositions.vue b/components/TableOwnedPositions.vue index e9f850f..46d7086 100644 --- a/components/TableOwnedPositions.vue +++ b/components/TableOwnedPositions.vue @@ -73,19 +73,24 @@ - - - - - Increase Duration - +
+ + + + + Increase Duration + + +
@@ -100,10 +105,9 @@ import { SECONDS_IN_EPOCH, MIN_STAKE_DURATION_IN_EPOCH } from '~/constants/contr import { formatSeconds } from '@/utils/date'; import { TooltipBorderColor } from './BaseTooltip.vue'; import { useChainIdTypesafe } from '~/constants/chain'; -import {useUserVestedTokens, useCurrentEpoch, useAllBeneficiaries} from '~/utils/hooks'; -import { wagmiAdapter } from '~/wagmi'; -import { PWN_VESTING_MANAGER } from '~/constants/addresses'; -import { PWN_VESTING_MANAGER_ABI } from '~/constants/abis'; +import {useUserVestedTokens, useAllBeneficiaries} from '~/utils/hooks'; +import { PWN_VESTING_MANAGER, VE_PWN_TOKEN } from '~/constants/addresses'; +import { PWN_VESTING_MANAGER_ABI, VE_PWN_TOKEN_ABI } from '~/constants/abis'; import type {Address} from "abitype"; import {shortenAddress} from "../utils/web3"; import {getFormattedVotingPower} from "~/utils/parsing"; @@ -387,6 +391,32 @@ const upgradeToStakeTooltipText = computed(() => { For a longer stake lock-up period, please contact us on Discord for assistance. ` }) + +const isClaiming = ref(false) +const claim = async (stake: TableRowData) => { + try { + isClaiming.value = true + if (stake.isVesting) { + return await sendTransaction({ + abi: PWN_VESTING_MANAGER_ABI, + address: PWN_VESTING_MANAGER[1], + functionName: 'claimVesting', + chainId: 1, + args: [BigInt(stake.unlockEpoch)] + }) + } else { + return await sendTransaction({ + abi: VE_PWN_TOKEN_ABI, + address: VE_PWN_TOKEN[chainId.value], + functionName: 'withdrawStake', + chainId: chainId.value, + args: [BigInt(stake.id), stake.votingDelegate || address.value!] + }) + } + } finally { + isClaiming.value = false + } +} diff --git a/constants/abis.ts b/constants/abis.ts index 4bdde6e..83171b7 100644 --- a/constants/abis.ts +++ b/constants/abis.ts @@ -164,6 +164,7 @@ export const VE_PWN_TOKEN_ABI = [ "stateMutability": "nonpayable", "type": "function" }, + { "inputs": [{ "internalType": "uint256", "name": "stakeId", "type": "uint256" }, { "internalType": "address", "name": "stakeBeneficiary", "type": "address" }], "name": "withdrawStake", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ] as const export const EPOCH_CLOCK_ABI = [ diff --git a/utils/useTransactions.ts b/utils/useTransactions.ts index f3c4bad..4347976 100644 --- a/utils/useTransactions.ts +++ b/utils/useTransactions.ts @@ -1,6 +1,6 @@ import to from '@/utils/await-to-js' import type { Abi, Address, ContractFunctionArgs, ContractFunctionName, TransactionReceipt } from 'viem' -import { getAccount, getBlockNumber, getPublicClient, getTransaction, getTransactionReceipt, switchChain, waitForTransactionReceipt, watchContractEvent, writeContract } from '@wagmi/vue/actions' +import { getAccount, getBlockNumber, getPublicClient, getTransaction, getTransactionReceipt, simulateContract, switchChain, waitForTransactionReceipt, watchContractEvent, writeContract } from '@wagmi/vue/actions' import type { WriteContractVariables } from '@wagmi/vue/query' import type { AnyFunction, IntervalId } from '@/types/customTypes' // import type { ToastStep } from '@/modules/common/notifications/useToastsStore' @@ -66,6 +66,9 @@ export async function sendTransaction< const { address: userAddress } = getAccount(wagmiAdapter.wagmiConfig) + // @ts-expect-error probably some type mismatch between writeContract and simulateContract + await simulateContract(wagmiAdapter.wagmiConfig, transaction) + // txHash: // 1) EOA: real transaction hash From 25302b2bae682204cc8b7b03e4168de948894d40 Mon Sep 17 00:00:00 2001 From: microHoffman Date: Fri, 9 May 2025 16:32:48 +0200 Subject: [PATCH 2/2] fix: use sendTransaction fn that also handles multisigs --- components/TableOwnedPositions.vue | 23 ++++++++++++++--------- constants/abis.ts | 3 ++- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/components/TableOwnedPositions.vue b/components/TableOwnedPositions.vue index 46d7086..ce382bf 100644 --- a/components/TableOwnedPositions.vue +++ b/components/TableOwnedPositions.vue @@ -99,7 +99,7 @@