Skip to content

Overpay squidrouter transaction value. #652

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
May 20, 2025
8 changes: 4 additions & 4 deletions api/src/api/controllers/brla.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,9 +190,9 @@ export const triggerBrlaOfframp = async (
}
};

export const getOfframpStatus = async (
req: Request<unknown, unknown, unknown, BrlaEndpoints.GetOfframpStatusRequest>,
res: Response<BrlaEndpoints.GetOfframpStatusResponse | BrlaEndpoints.BrlaErrorResponse>,
export const getRampStatus = async (
req: Request<unknown, unknown, unknown, BrlaEndpoints.GetRampStatusRequest>,
res: Response<BrlaEndpoints.GetRampStatusResponse | BrlaEndpoints.BrlaErrorResponse>,
): Promise<void> => {
try {
const { taxId } = req.query;
Expand Down Expand Up @@ -230,7 +230,7 @@ export const getOfframpStatus = async (
status: lastEventCached.data.status,
});
} catch (error) {
handleApiError(error, res, 'getOfframpStatus');
handleApiError(error, res, 'getRampStatus');
}
};

Expand Down
2 changes: 1 addition & 1 deletion api/src/api/routes/v1/brla.route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ router.route('/getUser').get(brlaController.getBrlaUser);

router.route('/getUserRemainingLimit').get(brlaController.getBrlaUserRemainingLimit);

router.route('/getOfframpStatus').get(brlaController.getOfframpStatus);
router.route('/getRampStatus').get(brlaController.getRampStatus);

router.route('/getKycStatus').get(brlaController.fetchSubaccountKycStatus);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import logger from '../../../../config/logger';
import { ApiManager } from '../../pendulum/apiManager';
import { submitExtrinsic } from '@pendulum-chain/api-solang';

const CLEANUP_WAITING_TIME_MINUTES = 180; // 3 hours
/**
* Post process handler for Moonbeam cleanup operations
*/
Expand Down Expand Up @@ -51,10 +52,10 @@ export class MoonbeamPostProcessHandler extends BasePostProcessHandler {
const timeDifferenceMs = Date.now() - completeTime.getTime();
const timeDifferenceMinutes = timeDifferenceMs / (1000 * 60);

if (timeDifferenceMinutes < 15) {
if (timeDifferenceMinutes < CLEANUP_WAITING_TIME_MINUTES) {
return [
false,
this.createErrorObject(`At least 15 minutes must pass after the complete phase for moonbeam cleanup`),
this.createErrorObject(`At least ${CLEANUP_WAITING_TIME_MINUTES} minutes must pass after the complete phase for moonbeam cleanup`),
];
}
} catch (e) {
Expand Down
7 changes: 4 additions & 3 deletions api/src/api/services/ramp/quote.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {
MOONBEAM_EPHEMERAL_STARTING_BALANCE_UNITS_ETHEREUM,
} from '../../../constants/constants';
import { multiplyByPowerOfTen } from '../pendulum/helpers';
import { SQUIDROUTER_FEE_OVERPAY } from '../transactions/squidrouter/config';
/**
* Trims trailing zeros from a decimal string, keeping at least two decimal places.
* @param decimalString - The decimal string to format
Expand Down Expand Up @@ -250,9 +251,9 @@ export class QuoteService extends BaseRampService {
const { route } = routeResult.data;
const { toAmountMin } = route.estimate;

const overpaidFee = (new Big(route.transactionRequest.value)).mul(1 + SQUIDROUTER_FEE_OVERPAY);
// Check against our moonbeam funding amounts.
const squidrouterSwapValue = multiplyByPowerOfTen(Big(route.transactionRequest.value), -18);

const squidrouterSwapValue = multiplyByPowerOfTen(overpaidFee, -18);
const fundingAmountUnits =
getNetworkFromDestination(to) === Networks.Ethereum
? Big(MOONBEAM_EPHEMERAL_STARTING_BALANCE_UNITS_ETHEREUM)
Expand All @@ -264,7 +265,7 @@ export class QuoteService extends BaseRampService {
if (squidrouterSwapValue.gte(fundingAmountUnits.minus(squidrouterSwapValueBuffer))) {
throw new APIError({
status: httpStatus.SERVICE_UNAVAILABLE,
message: 'Cannot service this route at the moment. Please try again later.',
message: 'Cannot service this route at the moment. Please ¡ry again later.',
});
}

Expand Down
2 changes: 2 additions & 0 deletions api/src/api/services/transactions/squidrouter/config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { AXL_USDC_MOONBEAM, getNetworkId, Networks } from 'shared';

export const SQUIDROUTER_FEE_OVERPAY = 0.25; // 25% overpayment

interface ConfigBase {
toChainId: string;
axlUSDC_MOONBEAM: string;
Expand Down
7 changes: 5 additions & 2 deletions api/src/api/services/transactions/squidrouter/offramp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import { createOfframpRouteParams, getRoute } from './route';
import erc20ABI from '../../../../contracts/ERC20';
import { createRandomString, createSquidRouterHash } from '../../../helpers/squidrouter';
import encodePayload from './payload';
import { getSquidRouterConfig } from './config';
import { getSquidRouterConfig, SQUIDROUTER_FEE_OVERPAY } from './config';
import Big from 'big.js';

export interface OfframpSquidrouterParams {
fromAddress: string;
Expand Down Expand Up @@ -64,6 +65,8 @@ export async function createOfframpSquidrouterTransactions(

const { maxFeePerGas, maxPriorityFeePerGas } = await publicClient.estimateFeesPerGas();

const overpaidFee = (new Big(transactionRequest.value)).mul(1 + SQUIDROUTER_FEE_OVERPAY).toString();

return {
approveData: {
to: params.inputTokenDetails.erc20AddressSourceChain as `0x${string}`, // TODO check if this is correct
Expand All @@ -76,7 +79,7 @@ export async function createOfframpSquidrouterTransactions(
swapData: {
to: transactionRequest.target as `0x${string}`,
data: transactionRequest.data as `0x${string}`,
value: transactionRequest.value,
value: overpaidFee,
gas: transactionRequest.gasLimit, // TODO do we still need * 2 here?
maxFeePerGas: String(maxFeePerGas),
maxPriorityFeePerGas: String(maxFeePerGas),
Expand Down
6 changes: 4 additions & 2 deletions api/src/api/services/transactions/squidrouter/onramp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { AXL_USDC_MOONBEAM, EvmTokenDetails, getNetworkId, Networks } from 'shar
import { createOnrampRouteParams, getRoute } from './route';

import erc20ABI from '../../../../contracts/ERC20';
import Big from 'big.js';
import { SQUIDROUTER_FEE_OVERPAY } from './config';

export interface OnrampSquidrouterParams {
fromAddress: string;
Expand Down Expand Up @@ -79,11 +81,11 @@ export async function createOnrampSquidrouterTransactions(
maxFeePerGas: maxFeePerGas.toString(),
maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),
};

const overpaidFee = (new Big(transactionRequest.value)).mul(1 + SQUIDROUTER_FEE_OVERPAY).toString();
const swapData = {
to: transactionRequest.target as `0x${string}`,
data: transactionRequest.data,
value: transactionRequest.value,
value: overpaidFee,
gas: transactionRequest.gasLimit,
maxFeePerGas: maxFeePerGas.toString(),
maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/services/api/brla.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ export class BrlaService {
* @param taxId The user's tax ID
* @returns The offramp status
*/
static async getOfframpStatus(taxId: string): Promise<BrlaEndpoints.GetOfframpStatusResponse> {
return apiRequest<BrlaEndpoints.GetOfframpStatusResponse>('get', `${this.BASE_PATH}/getOfframpStatus`, undefined, {
static async getRampStatus(taxId: string): Promise<BrlaEndpoints.GetRampStatusResponse> {
return apiRequest<BrlaEndpoints.GetRampStatusResponse>('get', `${this.BASE_PATH}/getRampStatus`, undefined, {
params: { taxId },
});
}
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/services/signingService.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ export const fetchSep10Signatures = async ({
};

export const fetchOfframpStatus = async (taxId: string) => {
const statusResponse = await fetch(`${SIGNING_SERVICE_URL}/v1/brla/getOfframpStatus?taxId=${taxId}`);
const statusResponse = await fetch(`${SIGNING_SERVICE_URL}/v1/brla/getRampStatus?taxId=${taxId}`);

if (statusResponse.status !== 200) {
if (statusResponse.status === 404) {
Expand Down
6 changes: 3 additions & 3 deletions shared/src/endpoints/brla.endpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ export namespace BrlaEndpoints {
kycLevel: number;
}

// GET /brla/getOfframpStatus?taxId=:taxId
export interface GetOfframpStatusRequest {
// GET /brla/getRampStatus?taxId=:taxId
export interface GetRampStatusRequest {
taxId: string;
}

export interface GetOfframpStatusResponse {
export interface GetRampStatusResponse {
type: string;
status: string;
}
Expand Down
Loading