UNPKG

@yoroi/swap

Version:
320 lines (319 loc) 9.92 kB
"use strict"; import { Portfolio, Swap } from '@yoroi/types'; import { Dex } from './types'; export const transformersMaker = ({ primaryTokenInfo, address, partner }) => { return { tokens: { response: res => res.map(({ ticker, name, policyId, hexName, decimals, verified }) => { const id = `${policyId}.${hexName}`; const isPrimary = id === primaryTokenInfo.id; if (isPrimary) return primaryTokenInfo; if (decimals === null) return null; return { status: verified ? Portfolio.Token.Status.Valid : Portfolio.Token.Status.Invalid, id, ticker, name, type: Portfolio.Token.Type.FT, nature: Portfolio.Token.Nature.Secondary, application: Portfolio.Token.Application.General, fingerprint: '', decimals, description: '', originalImage: '', symbol: '', reference: '', tag: '', website: '' }; }).filter(v => !!v) }, ordersHistory: { response: ({ orders }) => orders.map(({ dex, outputIdx, fromToken, toToken, placedAt, finalizedAt, receivedAmount, toAmount, fromAmount, txHash, finalizedTxHash, status }) => ({ status, txHash, aggregator: Swap.Aggregator.Muesliswap, outputIndex: outputIdx, tokenIn: fromToken, tokenOut: toToken, updateTxHash: finalizedTxHash ?? txHash, placedAt: placedAt ? placedAt * 1000 : undefined, lastUpdate: finalizedAt ? finalizedAt * 1000 : undefined, amountIn: Number(fromAmount), actualAmountOut: Number(receivedAmount), expectedAmountOut: Number(toAmount), protocol: toSwapProtocol(dex) })) }, cancel: { request: ({ order }) => ({ order_ids: [`${order.txHash}#${order.outputIndex ?? 0}`] }), response: ({ tx_cbor }) => ({ cbor: tx_cbor }) }, limitQuote: { request: ({ amountIn = 0, wantedPrice = 0, protocol, tokenIn, tokenOut }) => ({ numbers_have_decimals: true, sell_token: tokenIn, buy_token: tokenOut, sell_amount: String(amountIn), buy_amount: String(amountIn * wantedPrice), order_contract: protocol ? fromSwapProtocol(protocol) : undefined }) }, quote: { request: ({ protocol, blockedProtocols, tokenIn, tokenOut, amountIn, amountOut, slippage }) => ({ numbers_have_decimals: true, sell_token: tokenIn, buy_token: tokenOut, ...(amountOut !== undefined && { buy_amount: String(amountOut) }), ...(amountIn !== undefined && { sell_amount: String(amountIn) }), ...(partner !== undefined && { partner }), // muesli expects slippage as a percentage slippage: slippage / 100, excluded_sources: protocol ? Object.values(Dex).filter(dex => dex !== Dex.Unsupported && dex !== fromSwapProtocol(protocol)) : blockedProtocols?.map(fromSwapProtocol) ?? [] }), response: ({ buy_token_decimals, sell_token_decimals, net_price, net_price_impact, splits, total_batcher_fee, total_deposit, total_input, service_fee, total_output, total_output_without_slippage }) => ({ aggregatorFee: 0, frontendFee: 0, netPrice: net_price * 10 ** (sell_token_decimals - buy_token_decimals), priceImpact: net_price_impact, batcherFee: Number(total_batcher_fee), deposits: Number(total_deposit), totalFee: Number((Number(total_batcher_fee) + Number(service_fee)).toFixed(primaryTokenInfo.decimals)), totalInput: Number(total_input), totalOutput: Number(total_output), totalOutputWithoutSlippage: total_output_without_slippage === undefined ? undefined : Number(total_output_without_slippage), splits: splits.map(toSwapSplit) }) }, create: { request: ({ slippage = 0, protocol, blockedProtocols, tokenIn, tokenOut, amountIn, inputs }) => ({ numbers_have_decimals: true, sell_token: tokenIn, buy_token: tokenOut, sell_amount: String(amountIn), user_address: address, ...(partner !== undefined && { partner }), slippage: slippage / 100, excluded_sources: protocol ? Object.values(Dex).filter(dex => dex !== Dex.Unsupported && dex !== fromSwapProtocol(protocol)) : blockedProtocols?.map(fromSwapProtocol) ?? [], utxos: inputs }), response: ({ quote: { buy_token_decimals, sell_token_decimals, net_price, net_price_impact, splits, service_fee, total_batcher_fee, total_deposit, total_input, total_output, total_output_without_slippage }, tx_cbor }) => ({ aggregator: Swap.Aggregator.Muesliswap, aggregatorFee: 0, frontendFee: Number(service_fee), cbor: tx_cbor, netPrice: net_price * 10 ** (sell_token_decimals - buy_token_decimals), priceImpact: net_price_impact, batcherFee: Number(total_batcher_fee), deposits: Number(total_deposit), totalFee: Number((Number(total_batcher_fee) + Number(service_fee)).toFixed(primaryTokenInfo.decimals)), totalInput: Number(total_input), totalOutput: Number(total_output), totalOutputWithoutSlippage: Number(total_output_without_slippage), splits: splits.map(toSwapSplit) }) }, createLimit: { request: ({ protocol = Swap.Protocol.Unsupported, wantedPrice = 0, tokenIn, tokenOut, amountIn, inputs }) => ({ order_contract: fromSwapProtocol(protocol), buy_amount: String(amountIn * wantedPrice), numbers_have_decimals: true, sell_token: tokenIn, buy_token: tokenOut, sell_amount: String(amountIn), user_address: address, utxos: inputs }), response: ({ quote: { buy_token_decimals, sell_token_decimals, net_price, net_price_impact, splits, service_fee, total_batcher_fee, total_deposit, total_input, total_output, total_output_without_slippage }, tx_cbor }) => ({ cbor: tx_cbor, aggregator: Swap.Aggregator.Muesliswap, aggregatorFee: 0, frontendFee: Number(service_fee), netPrice: net_price * 10 ** (sell_token_decimals - buy_token_decimals), priceImpact: net_price_impact, batcherFee: Number(total_batcher_fee), deposits: Number(total_deposit), totalFee: Number((Number(total_batcher_fee) + Number(service_fee)).toFixed(primaryTokenInfo.decimals)), totalInput: Number(total_input), totalOutput: Number(total_output), totalOutputWithoutSlippage: Number(total_output_without_slippage), splits: splits.map(toSwapSplit) }) } }; }; const toSwapSplit = ({ amount_in, batcher_fee, deposit, dex, expected_output, expected_output_without_slippage, final_price, initial_price, pool_fee, price_impact, price_distortion, source_id }) => ({ fee: pool_fee, finalPrice: final_price, initialPrice: initial_price, poolFee: pool_fee, poolId: source_id, priceDistortion: price_distortion, priceImpact: price_impact, amountIn: Number(amount_in), batcherFee: Number(batcher_fee), deposits: Number(deposit), expectedOutput: Number(expected_output), expectedOutputWithoutSlippage: Number(expected_output_without_slippage ?? expected_output), protocol: toSwapProtocol(dex) }); export const toSwapProtocol = dex => ({ [Dex.Minswap_v1]: Swap.Protocol.Minswap_v1, [Dex.Minswap_v2]: Swap.Protocol.Minswap_v2, [Dex.Minswap_stable]: Swap.Protocol.Minswap_stable, [Dex.Wingriders_v1]: Swap.Protocol.Wingriders_v1, [Dex.Wingriders_v2]: Swap.Protocol.Wingriders_v2, [Dex.Vyfi_v1]: Swap.Protocol.Vyfi_v1, [Dex.Sundaeswap_v1]: Swap.Protocol.Sundaeswap_v1, [Dex.Sundaeswap_v3]: Swap.Protocol.Sundaeswap_v3, [Dex.Muesliswap_v2]: Swap.Protocol.Muesliswap_v2, [Dex.Muesliswap_clp]: Swap.Protocol.Muesliswap_clp, [Dex.Spectrum_v1]: Swap.Protocol.Spectrum_v1, [Dex.Teddy_v1]: Swap.Protocol.Teddy_v1, [Dex.Unsupported]: Swap.Protocol.Unsupported })[dex] ?? Swap.Protocol.Unsupported; export const fromSwapProtocol = dex => ({ [Swap.Protocol.Cswap]: Dex.Unsupported, [Swap.Protocol.Minswap_v1]: Dex.Minswap_v1, [Swap.Protocol.Minswap_v2]: Dex.Minswap_v2, [Swap.Protocol.Minswap_stable]: Dex.Minswap_stable, [Swap.Protocol.Wingriders_v1]: Dex.Wingriders_v1, [Swap.Protocol.Wingriders_v2]: Dex.Wingriders_v2, [Swap.Protocol.Vyfi_v1]: Dex.Vyfi_v1, [Swap.Protocol.Sundaeswap_v1]: Dex.Sundaeswap_v1, [Swap.Protocol.Sundaeswap_v3]: Dex.Sundaeswap_v3, [Swap.Protocol.Splash_v1]: Dex.Unsupported, [Swap.Protocol.Teddy_v1]: Dex.Teddy_v1, [Swap.Protocol.Muesliswap_v2]: Dex.Muesliswap_v2, [Swap.Protocol.Muesliswap_clp]: Dex.Muesliswap_clp, [Swap.Protocol.Spectrum_v1]: Dex.Spectrum_v1, [Swap.Protocol.Unsupported]: Dex.Unsupported })[dex] ?? Dex.Unsupported; export const MuesliswapProtocols = Object.values(Dex).filter(p => p !== Dex.Unsupported).map(toSwapProtocol); //# sourceMappingURL=transformers.js.map