From bdfd62a8797eb7da68f77b9521cac2b17d58c270 Mon Sep 17 00:00:00 2001 From: kuba80-02 Date: Tue, 4 Mar 2025 12:16:47 +0100 Subject: [PATCH] Update saga handleAllFee --- src/store/sagas/positions.ts | 314 ++++++++++++++++++----------------- 1 file changed, 158 insertions(+), 156 deletions(-) diff --git a/src/store/sagas/positions.ts b/src/store/sagas/positions.ts index 3a7ecd88..471ea0ae 100644 --- a/src/store/sagas/positions.ts +++ b/src/store/sagas/positions.ts @@ -46,7 +46,7 @@ import { getConnection, handleRpcError } from './connection' import { createClaimAllPositionRewardsTx } from './farms' import { createAccount, getWallet, sleep } from './wallet' import { closeSnackbar } from 'notistack' -import { Tick } from '@invariant-labs/sdk/lib/market' +import { ClaimAllFee, Tick } from '@invariant-labs/sdk/lib/market' import { calculateClaimAmount } from '@invariant-labs/sdk/lib/utils' function* handleInitPositionAndPoolWithSOL(action: PayloadAction): Generator { @@ -1746,7 +1746,7 @@ export function* handleCalculateTotalUnclaimedFees() { feeGrowthGlobalX: position.poolData.feeGrowthGlobalX, feeGrowthGlobalY: position.poolData.feeGrowthGlobalY }) - + console.log(position.tokenX) const xValue = +printBN(bnX, position.tokenX.decimals) * (pricesData.data[position.tokenX.assetAddress.toString()].price ?? 0) @@ -1764,156 +1764,158 @@ export function* handleCalculateTotalUnclaimedFees() { } } -// export function* handleClaimAllFees() { -// const loaderClaimAllFees = createLoaderKey() -// const loaderSigningTx = createLoaderKey() - -// try { -// const connection = yield* call(getConnection) -// const networkType = yield* select(network) -// const rpc = yield* select(rpcAddress) -// const wallet = yield* call(getWallet) -// const marketProgram = yield* call(getMarketProgram, networkType, rpc, wallet as IWallet) - -// const allPositionsData = yield* select(positionsWithPoolsData) -// const tokensAccounts = yield* select(accounts) - -// if (allPositionsData.length === 0) { -// return -// } -// if (allPositionsData.length === 1) { -// const claimFeeAction = actions.claimFee(0) -// return yield* call(handleClaimFee, claimFeeAction) -// } - -// yield* put(actions.setAllClaimLoader(true)) -// yield put( -// snackbarsActions.add({ -// message: 'Claiming all fees', -// variant: 'pending', -// persist: true, -// key: loaderClaimAllFees -// }) -// ) - -// for (const position of allPositionsData) { -// const pool = allPositionsData[position.positionIndex].poolData - -// if (!tokensAccounts[pool.tokenX.toString()]) { -// yield* call(createAccount, pool.tokenX) -// } -// if (!tokensAccounts[pool.tokenY.toString()]) { -// yield* call(createAccount, pool.tokenY) -// } -// } - -// const formattedPositions = allPositionsData.map(position => ({ -// pair: new Pair(position.poolData.tokenX, position.poolData.tokenY, { -// fee: position.poolData.fee, -// tickSpacing: position.poolData.tickSpacing -// }), -// index: position.positionIndex, -// lowerTickIndex: position.lowerTickIndex, -// upperTickIndex: position.upperTickIndex -// })) - -// const txs = yield* call([marketProgram, marketProgram.claimAllFeesTxs], { -// owner: wallet.publicKey, -// positions: formattedPositions -// } as ClaimAllFee) - -// yield put(snackbarsActions.add({ ...SIGNING_SNACKBAR_CONFIG, key: loaderSigningTx })) - -// for (const { tx, additionalSigner } of txs) { -// const blockhash = yield* call([connection, connection.getLatestBlockhash]) -// tx.recentBlockhash = blockhash.blockhash -// tx.feePayer = wallet.publicKey - -// let signedTx: Transaction -// if (additionalSigner) { -// const partiallySignedTx = yield* call([wallet, wallet.signTransaction], tx) -// partiallySignedTx.partialSign(additionalSigner) -// signedTx = partiallySignedTx -// } else { -// signedTx = yield* call([wallet, wallet.signTransaction], tx) -// } - -// const txid = yield* call(sendAndConfirmRawTransaction, connection, signedTx.serialize(), { -// skipPreflight: false -// }) - -// if (!txid.length) { -// yield put( -// snackbarsActions.add({ -// message: 'Failed to claim some fees. Please try again.', -// variant: 'error', -// persist: false, -// txid -// }) -// ) -// } -// } - -// yield put( -// snackbarsActions.add({ -// message: 'All fees claimed successfully.', -// variant: 'success', -// persist: false -// }) -// ) - -// for (const position of formattedPositions) { -// yield put(actions.getSinglePosition(position.index)) -// } - -// closeSnackbar(loaderSigningTx) -// yield put(snackbarsActions.remove(loaderSigningTx)) -// closeSnackbar(loaderClaimAllFees) -// yield put(snackbarsActions.remove(loaderClaimAllFees)) - -// yield put(actions.getPositionsList()) -// yield put(actions.calculateTotalUnclaimedFees()) - -// yield* put(actions.setAllClaimLoader(false)) -// } catch (error) { -// yield* put(actions.setAllClaimLoader(false)) - -// console.log(error) - -// closeSnackbar(loaderClaimAllFees) -// yield put(snackbarsActions.remove(loaderClaimAllFees)) -// closeSnackbar(loaderSigningTx) -// yield put(snackbarsActions.remove(loaderSigningTx)) - -// if (error instanceof TransactionExpiredTimeoutError) { -// yield put( -// snackbarsActions.add({ -// message: TIMEOUT_ERROR_MESSAGE, -// variant: 'info', -// persist: true, -// txid: error.signature -// }) -// ) -// yield put(connectionActions.setTimeoutError(true)) -// } else { -// yield put( -// snackbarsActions.add({ -// message: 'Failed to claim fees. Please try again.', -// variant: 'error', -// persist: false -// }) -// ) -// } - -// try { -// if (error instanceof Error) { -// yield* call(handleRpcError, error.message) -// } -// } catch (rpcError) { -// console.error('RPC error handling failed:', rpcError) -// } -// } -// } +export function* handleClaimAllFees() { + const loaderClaimAllFees = createLoaderKey() + const loaderSigningTx = createLoaderKey() + + try { + const connection = yield* call(getConnection) + const networkType = yield* select(network) + const rpc = yield* select(rpcAddress) + const wallet = yield* call(getWallet) + const marketProgram = yield* call(getMarketProgram, networkType, rpc, wallet as IWallet) + + const allPositionsData = yield* select(positionsWithPoolsData) + const tokensAccounts = yield* select(accounts) + + if (allPositionsData.length === 0) { + return + } + if (allPositionsData.length === 1) { + const claimFeeAction = actions.claimFee(0) + return yield* call(handleClaimFee, claimFeeAction) + } + + yield* put(actions.setAllClaimLoader(true)) + yield put( + snackbarsActions.add({ + message: 'Claiming all fees', + variant: 'pending', + persist: true, + key: loaderClaimAllFees + }) + ) + + for (const position of allPositionsData) { + const pool = allPositionsData[position.positionIndex].poolData + + if (!tokensAccounts[pool.tokenX.toString()]) { + yield* call(createAccount, pool.tokenX) + } + if (!tokensAccounts[pool.tokenY.toString()]) { + yield* call(createAccount, pool.tokenY) + } + } + + const formattedPositions = allPositionsData.map(position => ({ + pair: new Pair(position.poolData.tokenX, position.poolData.tokenY, { + fee: position.poolData.fee, + tickSpacing: position.poolData.tickSpacing + }), + index: position.positionIndex, + lowerTickIndex: position.lowerTickIndex, + upperTickIndex: position.upperTickIndex + })) + + const txs = yield* call([marketProgram, marketProgram.claimAllFeesTxs], { + owner: wallet.publicKey, + positions: formattedPositions + } as ClaimAllFee) + + yield put(snackbarsActions.add({ ...SIGNING_SNACKBAR_CONFIG, key: loaderSigningTx })) + + for (const { tx, additionalSigner } of txs) { + const blockhash = yield* call([connection, connection.getLatestBlockhash]) + tx.recentBlockhash = blockhash.blockhash + tx.feePayer = wallet.publicKey + + let signedTx: Transaction + if (additionalSigner) { + const partiallySignedTx = yield* call([wallet, wallet.signTransaction], tx) + partiallySignedTx.partialSign(additionalSigner) + signedTx = partiallySignedTx + } else { + signedTx = yield* call([wallet, wallet.signTransaction], tx) + } + + const txid = yield* call(sendAndConfirmRawTransaction, connection, signedTx.serialize(), { + skipPreflight: false + }) + + if (!txid.length) { + console.log('to sie wykonuje') + yield put( + snackbarsActions.add({ + message: 'Failed to claim some fees. Please try again.', + variant: 'error', + persist: false, + txid + }) + ) + } + } + + yield put( + snackbarsActions.add({ + message: 'All fees claimed successfully.', + variant: 'success', + persist: false + }) + ) + + for (const position of formattedPositions) { + yield put(actions.getSinglePosition(position.index)) + } + + closeSnackbar(loaderSigningTx) + yield put(snackbarsActions.remove(loaderSigningTx)) + closeSnackbar(loaderClaimAllFees) + yield put(snackbarsActions.remove(loaderClaimAllFees)) + + yield put(actions.getPositionsList()) + yield put(actions.calculateTotalUnclaimedFees()) + + yield* put(actions.setAllClaimLoader(false)) + } catch (error) { + yield* put(actions.setAllClaimLoader(false)) + + console.log(error) + + closeSnackbar(loaderClaimAllFees) + yield put(snackbarsActions.remove(loaderClaimAllFees)) + closeSnackbar(loaderSigningTx) + yield put(snackbarsActions.remove(loaderSigningTx)) + + if (error instanceof TransactionExpiredTimeoutError) { + yield put( + snackbarsActions.add({ + message: TIMEOUT_ERROR_MESSAGE, + variant: 'info', + persist: true, + txid: error.signature + }) + ) + yield put(connectionActions.setTimeoutError(true)) + } else { + console.log(error) + yield put( + snackbarsActions.add({ + message: 'Failed to claim fees. Please try again.', + variant: 'error', + persist: false + }) + ) + } + + try { + if (error instanceof Error) { + yield* call(handleRpcError, error.message) + } + } catch (rpcError) { + console.error('RPC error handling failed:', rpcError) + } + } +} export function* initPositionHandler(): Generator { yield* takeEvery(actions.initPosition, handleInitPosition) @@ -1932,9 +1934,9 @@ export function* unclaimedFeesHandler(): Generator { yield* takeEvery(actions.calculateTotalUnclaimedFees, handleCalculateTotalUnclaimedFees) } -// export function* claimAllFeeHandler(): Generator { -// yield* takeEvery(actions.claimAllFee, handleClaimAllFees) -// } +export function* claimAllFeeHandler(): Generator { + yield* takeEvery(actions.claimAllFee, handleClaimAllFees) +} export function* closePositionHandler(): Generator { yield* takeEvery(actions.closePosition, handleClosePosition) @@ -1953,7 +1955,7 @@ export function* positionsSaga(): Generator { getCurrentPlotTicksHandler, getPositionsListHandler, unclaimedFeesHandler, - // claimAllFeeHandler, + claimAllFeeHandler, claimFeeHandler, closePositionHandler, getSinglePositionHandler,