Skip to content
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

Release: v2.3.0 #611

Merged
merged 9 commits into from
Feb 7, 2025
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
2 changes: 1 addition & 1 deletion packages/extension/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@enkryptcom/extension",
"version": "2.2.0",
"version": "2.3.0",
"private": true,
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/extension/src/providers/ethereum/networks/ftm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const ftmOptions: EvmNetworkOptions = {
isTestNetwork: false,
currencyName: 'FTM',
currencyNameLong: 'Fantom',
node: 'https://rpc.ankr.com/fantom/',
node: 'wss://fantom-rpc.publicnode.com',
icon,
coingeckoID: 'fantom',
coingeckoPlatform: CoingeckoPlatform.Fantom,
Expand Down
178 changes: 98 additions & 80 deletions packages/swap/src/providers/jupiter/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -438,101 +438,119 @@ export class Jupiter extends ProviderClass {
meta: QuoteMetaOptions,
context?: { signal?: AbortSignal },
): Promise<null | ProviderQuoteResponse> {
if (options.toToken.networkInfo.name !== SupportedNetworkName.Solana) {
logger.info(
`getQuote: ignoring quote request to network ${options.toToken.networkInfo.name},` +
` cross network swaps not supported`,
);
return null;
}
try {
if (options.toToken.networkInfo.name !== SupportedNetworkName.Solana) {
logger.info(
`getQuote: ignoring quote request to network ${options.toToken.networkInfo.name},` +
` cross network swaps not supported`,
);
return null;
}

const { jupiterQuote, rentFees, computeBudget, feePercentage } =
await this.querySwapInfo(options, meta, context);
const { jupiterQuote, rentFees, computeBudget, feePercentage } =
await this.querySwapInfo(options, meta, context);

// Jupiter swaps have four different kinds of fees:
// 1. Transaction base fees: number of signatures * lamports per signature
// 2. Transaction priority fees (sometimes): set via the Compute Budget program's "SetComputeUnitPrice"
// 3. Transaction referral fees: fees paid to MEW (97.5%) and Jupiter (2.5%) as the wallet provider
// 4. Rent for ATA accounts that may need to be created; the referral fee account and mint account
// Jupiter swaps have four different kinds of fees:
// 1. Transaction base fees: number of signatures * lamports per signature
// 2. Transaction priority fees (sometimes): set via the Compute Budget program's "SetComputeUnitPrice"
// 3. Transaction referral fees: fees paid to MEW (97.5%) and Jupiter (2.5%) as the wallet provider
// 4. Rent for ATA accounts that may need to be created; the referral fee account and mint account

logger.info(
`getQuote: Quote inAmount: ${jupiterQuote.inAmount} ${options.fromToken.symbol}`,
);
logger.info(
`getQuote: Quote outAmount: ${jupiterQuote.outAmount} ${options.toToken.symbol}`,
);
logger.info(
`getQuote: Quote inAmount: ${jupiterQuote.inAmount} ${options.fromToken.symbol}`,
);
logger.info(
`getQuote: Quote outAmount: ${jupiterQuote.outAmount} ${options.toToken.symbol}`,
);

const result: ProviderQuoteResponse = {
fromTokenAmount: toBN(jupiterQuote.inAmount),
toTokenAmount: toBN(
Math.floor((1 - feePercentage) * Number(jupiterQuote.outAmount))
.toFixed(10)
.replace(/\.?0+$/, ""),
),
totalGaslimit: computeBudget,
additionalNativeFees: toBN(rentFees),
provider: this.name,
quote: {
options,
meta,
const result: ProviderQuoteResponse = {
fromTokenAmount: toBN(jupiterQuote.inAmount),
toTokenAmount: toBN(
Math.floor((1 - feePercentage) * Number(jupiterQuote.outAmount))
.toFixed(10)
.replace(/\.?0+$/, ""),
),
totalGaslimit: computeBudget,
additionalNativeFees: toBN(rentFees),
provider: this.name,
},
minMax: {
// TODO: how can I get these limits?
minimumFrom: toBN("1"),
maximumFrom: toBN(TOKEN_AMOUNT_INFINITY_AND_BEYOND),
minimumTo: toBN("1"),
maximumTo: toBN(TOKEN_AMOUNT_INFINITY_AND_BEYOND),
},
};
quote: {
options,
meta,
provider: this.name,
},
minMax: {
// TODO: how can I get these limits?
minimumFrom: toBN("1"),
maximumFrom: toBN(TOKEN_AMOUNT_INFINITY_AND_BEYOND),
minimumTo: toBN("1"),
maximumTo: toBN(TOKEN_AMOUNT_INFINITY_AND_BEYOND),
},
};

return result;
return result;
} catch (err) {
if (!context.signal.aborted) {
console.error(
`[Jupiter.getQuote] Error calling getQuote: ${String(err)}`,
);
}
return null;
}
}

async getSwap(
quote: SwapQuote,
context?: { signal?: AbortSignal },
): Promise<ProviderSwapResponse> {
const { feePercentage, jupiterQuote, base64SwapTransaction, rentFees } =
await this.querySwapInfo(quote.options, quote.meta, context);

const enkryptTransaction: SolanaTransaction = {
from: quote.options.fromAddress,
to: quote.options.toAddress,
serialized: base64SwapTransaction,
type: TransactionType.solana,
kind: "versioned",
thirdPartySignatures: [],
};
): Promise<null | ProviderSwapResponse> {
try {
const { feePercentage, jupiterQuote, base64SwapTransaction, rentFees } =
await this.querySwapInfo(quote.options, quote.meta, context);

const enkryptTransaction: SolanaTransaction = {
from: quote.options.fromAddress,
to: quote.options.toAddress,
serialized: base64SwapTransaction,
type: TransactionType.solana,
kind: "versioned",
thirdPartySignatures: [],
};

logger.info(
`getSwap: Quote inAmount: ${jupiterQuote.inAmount} ${quote.options.fromToken.symbol}`,
);
logger.info(
`getSwap: Quote outAmount: ${jupiterQuote.outAmount} ${quote.options.toToken.symbol}`,
);
logger.info(
`getSwap: Quote inAmount: ${jupiterQuote.inAmount} ${quote.options.fromToken.symbol}`,
);
logger.info(
`getSwap: Quote outAmount: ${jupiterQuote.outAmount} ${quote.options.toToken.symbol}`,
);

const result: ProviderSwapResponse = {
transactions: [enkryptTransaction],
fromTokenAmount: toBN(jupiterQuote.inAmount),
toTokenAmount: toBN(
Math.floor((1 - feePercentage) * Number(jupiterQuote.outAmount))
.toFixed(10)
.replace(/\.?0+$/, ""),
),
additionalNativeFees: toBN(rentFees),
provider: this.name,
slippage: quote.meta.slippage,
fee: feePercentage,
getStatusObject: async (
options: StatusOptions,
): Promise<StatusOptionsResponse> => ({
options,
const result: ProviderSwapResponse = {
transactions: [enkryptTransaction],
fromTokenAmount: toBN(jupiterQuote.inAmount),
toTokenAmount: toBN(
Math.floor((1 - feePercentage) * Number(jupiterQuote.outAmount))
.toFixed(10)
.replace(/\.?0+$/, ""),
),
additionalNativeFees: toBN(rentFees),
provider: this.name,
}),
};
slippage: quote.meta.slippage,
fee: feePercentage,
getStatusObject: async (
options: StatusOptions,
): Promise<StatusOptionsResponse> => ({
options,
provider: this.name,
}),
};

return result;
return result;
} catch (err) {
if (!context.signal.aborted) {
console.error(
`[Jupiter.getSwap] Error calling getSwap: ${String(err)}`,
);
}
return null;
}
}

async getStatus(options: StatusOptions): Promise<TransactionStatus> {
Expand Down
2 changes: 2 additions & 0 deletions packages/swap/tests/fixtures/mainnet/configs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const amount = toBN("100000000000000000000"); // DAI, $100, 18 decimals
const amountUSDT = toBN("100000000"); // USDT, $100, 6 decimals

const fromAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F";
const zeroxFromAddress = "0xca2a71ac745d3d3fc8783f151fd1133b49b36b18"; //random user address
const toAddress = "0x255d4D554325568A2e628A1E93120EbA1157C07e";
const nodeURL = "https://nodes.mewapi.io/rpc/eth";
const nodeURLMatic = "https://nodes.mewapi.io/rpc/matic";
Expand Down Expand Up @@ -101,4 +102,5 @@ export {
nodeURL,
nodeURLMatic,
fromTokenNative,
zeroxFromAddress,
};
5 changes: 3 additions & 2 deletions packages/swap/tests/swap.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
fromAddress,
toAddress,
nodeURL,
zeroxFromAddress,
} from "./fixtures/mainnet/configs";

describe("Swap", () => {
Expand Down Expand Up @@ -104,10 +105,10 @@ describe("Swap", () => {
await enkryptSwap.initPromise;
const quotes = await enkryptSwap.getQuotes({
amount: amountUSDT,
fromAddress,
fromAddress: zeroxFromAddress,
fromToken: fromTokenUSDT,
toToken,
toAddress: fromAddress,
toAddress: zeroxFromAddress,
});
expect(quotes?.length).to.be.gte(4);
const oneInceQuote = quotes.find(
Expand Down
4 changes: 3 additions & 1 deletion packages/swap/tests/zerox.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ import {
import { TOKEN_AMOUNT_INFINITY_AND_BEYOND } from "../src/utils/approvals";
import {
fromToken,
zeroxFromAddress,
toToken,
amount,
fromAddress,
nodeURL,
} from "./fixtures/mainnet/configs";

const fromAddress = zeroxFromAddress;

describe("Zerox Provider", () => {
// @ts-ignore
const web3eth = new Web3Eth(nodeURL);
Expand Down