Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/chains/ethereum/routes/poll.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,9 @@ export async function pollEthereumTransaction(
signature,
txBlock,
txStatus,
fee: null,
error: null,
txData: toEthereumTransactionResponse(txData),
fee: null, // Optional field
};
} catch (error) {
if (error.statusCode) {
Expand Down
86 changes: 21 additions & 65 deletions src/chains/solana/routes/poll.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,12 @@ import { PollRequestType, PollResponseType, PollResponseSchema } from '../../../
import { logger } from '../../../services/logger';
import { SolanaPollRequest } from '../schemas';
import { Solana } from '../solana';
import { parseSolanaError } from '../solana-error-parser';

export async function pollSolanaTransaction(
_fastify: FastifyInstance,
network: string,
signature: string,
tokens?: string[],
walletAddress?: string,
): Promise<PollResponseType> {
const solana = await Solana.getInstance(network);

Expand All @@ -24,9 +23,9 @@ export async function pollSolanaTransaction(
signature,
txBlock: null,
txStatus: 0,
txData: null,
fee: null,
error: 'Invalid transaction signature format',
error: 'INVALID_INPUT: Invalid transaction signature format',
txData: null,
};
}

Expand All @@ -38,69 +37,26 @@ export async function pollSolanaTransaction(
signature,
txBlock: null,
txStatus: 0,
txData: null,
fee: null,
error: null,
txData: null,
};
}

const txStatus = await solana.getTransactionStatusCode(txData as any);

let fee: number;
let tokenBalanceChanges: Record<string, number> | undefined;

// Calculate token balance changes if tokens array is provided and not empty, and wallet address is provided
if (tokens && tokens.length > 0 && walletAddress) {
try {
// Convert symbols to addresses
const tokenAddresses: string[] = [];
const tokenMap = new Map<string, string>(); // Map from input value to address

for (const token of tokens) {
const tokenInfo = await solana.getToken(token);
if (tokenInfo) {
tokenAddresses.push(tokenInfo.address);
tokenMap.set(token, tokenInfo.address);
} else {
logger.warn(`Could not find token info for: ${token}`);
}
}
// Extract fee from transaction
const fee = txData.meta?.fee ? txData.meta.fee / 1e9 : 0; // Convert lamports to SOL

if (tokenAddresses.length > 0) {
const result = await solana.extractBalanceChangesAndFee(signature, walletAddress, tokenAddresses);
fee = result.fee;

// Build balance changes dictionary with original input values as keys
tokenBalanceChanges = {};
let i = 0;
for (const token of tokens) {
const address = tokenMap.get(token);
if (address) {
tokenBalanceChanges[token] = result.balanceChanges[i];
i++;
}
}

logger.info(
`Transaction ${signature} - Status: ${txStatus}, Fee: ${fee} SOL, Balance Changes: ${JSON.stringify(tokenBalanceChanges)}`,
);
} else {
logger.warn('No valid tokens found');
fee = 0;
}
} catch (error) {
logger.error(`Error calculating balance changes for transaction ${signature}: ${error.message}`);
// Set fee to 0 on error
fee = 0;
}
// Check for transaction error and parse it
let error: string | null = null;
if (txData.meta?.err) {
const errorStr = JSON.stringify(txData.meta.err);
const parsed = parseSolanaError(errorStr);
error = `${parsed.type} (${parsed.errorCodeHex || 'unknown'}): ${parsed.message}`;
logger.info(`Transaction ${signature} failed: ${error}`);
} else {
// Just get the fee when no tokens specified or empty array
const feeResult = await solana.extractBalanceChangesAndFee(
signature,
walletAddress || '', // Use provided wallet address or empty string
[],
);
fee = feeResult.fee;
logger.info(`Polling for transaction ${signature}, Status: ${txStatus}, Fee: ${fee} SOL`);
logger.info(`Transaction ${signature} - Status: ${txStatus}, Fee: ${fee} SOL`);
}

return {
Expand All @@ -109,19 +65,19 @@ export async function pollSolanaTransaction(
txBlock: txData.slot,
txStatus,
fee,
tokenBalanceChanges,
error,
txData,
};
} catch (error) {
logger.error(`Error polling transaction ${signature}: ${error.message}`);
} catch (err) {
logger.error(`Error polling transaction ${signature}: ${(err as Error).message}`);
return {
currentBlock: await solana.getCurrentBlockNumber(),
signature,
txBlock: null,
txStatus: 0,
txData: null,
fee: null,
error: 'Transaction not found or invalid',
txData: null,
};
}
}
Expand All @@ -143,8 +99,8 @@ export const pollRoute: FastifyPluginAsync = async (fastify) => {
},
},
async (request) => {
const { network, signature, tokens, walletAddress } = request.body;
return await pollSolanaTransaction(fastify, network, signature, tokens, walletAddress);
const { network, signature } = request.body;
return await pollSolanaTransaction(fastify, network, signature);
},
);
};
Expand Down
2 changes: 1 addition & 1 deletion src/chains/solana/routes/unwrap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ export async function unwrapSolana(
}

// Simulate transaction with proper error handling before sending
await solana.simulateWithErrorHandling(transaction, fastify);
await solana.simulateWithErrorHandling(transaction);

// Send and confirm transaction
const { confirmed, signature, txData } = await solana.sendAndConfirmRawTransaction(transaction);
Expand Down
2 changes: 1 addition & 1 deletion src/chains/solana/routes/wrap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ export async function wrapSolana(
}

// Simulate transaction with proper error handling before sending
await solana.simulateWithErrorHandling(transaction, fastify);
await solana.simulateWithErrorHandling(transaction);

// Send and confirm transaction
const { confirmed, signature, txData } = await solana.sendAndConfirmRawTransaction(transaction);
Expand Down
12 changes: 0 additions & 12 deletions src/chains/solana/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,6 @@ export const SolanaPollRequest = Type.Object({
description: 'Transaction signature to poll',
examples: [EXAMPLE_SIGNATURE],
}),
tokens: Type.Optional(
Type.Array(Type.String(), {
description: 'Tokens to track balance changes for',
examples: [EXAMPLE_TOKENS],
}),
),
walletAddress: Type.Optional(
Type.String({
description: 'Wallet address to track balance changes for',
default: solanaChainConfig.defaultWallet,
}),
),
});

// Quote swap request schema
Expand Down
Loading
Loading