From 1515b7d05e78f77160ed9cc69e2c1553a44c00ce Mon Sep 17 00:00:00 2001 From: Marcus Pasell <3690498+rickyrombo@users.noreply.github.com> Date: Wed, 18 Dec 2024 15:46:20 -0600 Subject: [PATCH] Migrate useCoinflowWithdrawalAdapter to SDK --- .../common/src/hooks/useCoinflowAdapter.ts | 51 +++++++------------ .../src/services/audius-backend/solana.ts | 39 ++++++-------- 2 files changed, 34 insertions(+), 56 deletions(-) diff --git a/packages/common/src/hooks/useCoinflowAdapter.ts b/packages/common/src/hooks/useCoinflowAdapter.ts index b5ca926c950..cd0bce5f9cf 100644 --- a/packages/common/src/hooks/useCoinflowAdapter.ts +++ b/packages/common/src/hooks/useCoinflowAdapter.ts @@ -11,10 +11,7 @@ import { useSelector, useDispatch } from 'react-redux' import { useAudiusQueryContext } from '~/audius-query' import { useAppContext } from '~/context' import { Name } from '~/models/Analytics' -import { - decorateCoinflowWithdrawalTransaction, - relayTransaction -} from '~/services/audius-backend' +import { decorateCoinflowWithdrawalTransaction } from '~/services/audius-backend' import { BuyUSDCError, PurchaseContentError, @@ -68,9 +65,6 @@ export const useCoinflowWithdrawalAdapter = () => { sendTransaction: async ( transaction: Transaction | VersionedTransaction ) => { - if (!feePayerOverride) { - throw new Error('Missing fee payer override') - } if (transaction instanceof VersionedTransaction) { throw new Error( 'VersionedTransaction not supported in withdrawal adapter' @@ -79,49 +73,40 @@ export const useCoinflowWithdrawalAdapter = () => { if (!currentUser) { throw new Error('Missing current user') } - const feePayer = new PublicKey(feePayerOverride) const finalTransaction = await decorateCoinflowWithdrawalTransaction(sdk, audiusBackend, { ethAddress: currentUser, transaction, - feePayer, wallet }) - finalTransaction.partialSign(wallet) - const { res, error, errorCode } = await relayTransaction( - audiusBackend, - { - transaction: finalTransaction, - skipPreflight: true - } - ) - if (!res) { + finalTransaction.sign([wallet]) + try { + const res = + await sdk.services.claimableTokensClient.sendTransaction( + finalTransaction, + { skipPreflight: true } + ) + track( + make({ + eventName: Name.WITHDRAW_USDC_COINFLOW_SEND_TRANSACTION, + signature: res + }) + ) + return res + } catch (error) { console.error('Relaying Coinflow transaction failed.', { error, - errorCode, finalTransaction }) track( make({ eventName: Name.WITHDRAW_USDC_COINFLOW_SEND_TRANSACTION_FAILED, - error: error ?? undefined, - errorCode: errorCode ?? undefined + error: (error as Error).message ?? undefined }) ) - throw new Error( - `Relaying Coinflow transaction failed: ${ - error ?? 'Unknown error' - }` - ) + throw error } - track( - make({ - eventName: Name.WITHDRAW_USDC_COINFLOW_SEND_TRANSACTION, - signature: res - }) - ) - return res } } }) diff --git a/packages/common/src/services/audius-backend/solana.ts b/packages/common/src/services/audius-backend/solana.ts index d1fa17519da..1cd8d5a88d7 100644 --- a/packages/common/src/services/audius-backend/solana.ts +++ b/packages/common/src/services/audius-backend/solana.ts @@ -311,19 +311,14 @@ export const decorateCoinflowWithdrawalTransaction = async ( audiusBackendInstance: AudiusBackend, { transaction, - feePayer, ethAddress, wallet }: { transaction: Transaction - feePayer: PublicKey ethAddress: string wallet: Keypair } ) => { - const libs = await audiusBackendInstance.getAudiusLibsTyped() - const solanaWeb3Manager = libs.solanaWeb3Manager! - const userBank = await deriveUserBankPubkey(sdk, { ethAddress, mint: 'USDC' @@ -369,15 +364,20 @@ export const decorateCoinflowWithdrawalTransaction = async ( data.decimals ) - const transferFromUserBankInstructions = - await solanaWeb3Manager.createTransferInstructionsFromCurrentUser({ - amount: new BN(data.amount.toString()), - mint: 'usdc', - senderSolanaAddress: userBank, - recipientSolanaAddress: keys.destination.pubkey.toBase58(), - instructionIndex: transferInstructionIndex + 1, - feePayerKey: feePayer + const transferFromUserBankInstructions = [ + await sdk.services.claimableTokensClient.createTransferSecpInstruction({ + mint: 'USDC', + ethWallet: ethAddress, + destination: keys.destination.pubkey, + amount: data.amount, + instructionIndex: transferInstructionIndex + 1 + }), + await sdk.services.claimableTokensClient.createTransferInstruction({ + mint: 'USDC', + ethWallet: ethAddress, + destination: keys.destination.pubkey }) + ] const withdrawalMemoInstruction = new TransactionInstruction({ keys: [ @@ -400,17 +400,10 @@ export const decorateCoinflowWithdrawalTransaction = async ( withdrawalMemoInstruction ) - const { blockhash, lastValidBlockHeight } = await solanaWeb3Manager - .getConnection() - .getLatestBlockhash() - const modifiedTransaction = new Transaction({ - blockhash, - feePayer, - lastValidBlockHeight + const tx = await sdk.services.solanaClient.buildTransaction({ + instructions }) - modifiedTransaction.add(...instructions) - - return modifiedTransaction + return tx } export const createTransferToUserBankTransaction = async (