@paraswap/sdk
Version:
111 lines (96 loc) • 4.09 kB
text/typescript
import type { ConstructFetchInput } from '../../types';
import { constructGetDeltaContract } from './getDeltaContract';
import { DeltaPrice } from './getDeltaPrice';
import {
constructGetPartnerFee,
type PartnerFeeResponse,
} from './getPartnerFee';
import {
buildDeltaSignableOrderData,
type BuildDeltaOrderDataInput,
type SignableDeltaOrderData,
} from './helpers/buildDeltaOrderData';
export type { SignableDeltaOrderData } from './helpers/buildDeltaOrderData';
export type BuildDeltaOrderDataParams = {
/** @description The address of the order owner */
owner: string;
/** @description The address of the order beneficiary */
beneficiary?: string; // beneficiary==owner if no transferTo
/** @description The address of the src token */
srcToken: string; // lowercase
/** @description The address of the dest token */
destToken: string; // lowercase
/** @description The amount of src token to swap */
srcAmount: string; // wei
/** @description The minimum amount of dest token to receive */
destAmount: string; // wei, deltaPrice.destAmount - slippage
/** @description The deadline for the order */
deadline?: number; // seconds
/** @description The nonce of the order */
nonce?: number | string; // can be random, can even be Date.now()
/** @description Optional permit signature for the src token https://developers.paraswap.network/api/paraswap-delta/build-and-sign-a-delta-order#supported-permits */
permit?: string; //can be "0x"
/** @description Partner string. */
partner?: string;
/** @description price response received from /delta/prices (getDeltaPrice method) */
deltaPrice: Pick<DeltaPrice, 'destAmount' | 'partner' | 'partnerFee'>;
} & Partial<PartnerFeeResponse>; // can override partnerFee, partnerAddress, takeSurplus, which otherwise will be fetched
type BuildDeltaOrder = (
buildOrderParams: BuildDeltaOrderDataParams,
signal?: AbortSignal
) => Promise<SignableDeltaOrderData>;
export type BuildDeltaOrderFunctions = {
/** @description Build Orders to be posted to Delta API for execution */
buildDeltaOrder: BuildDeltaOrder;
};
export const constructBuildDeltaOrder = (
options: ConstructFetchInput
): BuildDeltaOrderFunctions => {
const { chainId } = options;
// cached internally
const { getDeltaContract } = constructGetDeltaContract(options);
// cached internally for `partner`
const { getPartnerFee } = constructGetPartnerFee(options);
const buildDeltaOrder: BuildDeltaOrder = async (options, signal) => {
const ParaswapDelta = await getDeltaContract(signal);
if (!ParaswapDelta) {
throw new Error(`Delta is not available on chain ${chainId}`);
}
let partnerAddress = options.partnerAddress;
let partnerFee = options.partnerFee ?? options.deltaPrice.partnerFee;
let takeSurplus = options.takeSurplus;
if (
partnerAddress === undefined ||
partnerFee === undefined ||
takeSurplus === undefined
) {
const partner = options.partner || options.deltaPrice.partner;
const partnerFeeResponse = await getPartnerFee({ partner }, signal);
partnerAddress = partnerAddress ?? partnerFeeResponse.partnerAddress;
// deltaPrice.partnerFee and partnerFeeResponse.partnerFee should be the same, but give priority to externally provided
partnerFee = partnerFee ?? partnerFeeResponse.partnerFee;
takeSurplus = takeSurplus ?? partnerFeeResponse.takeSurplus;
}
const input: BuildDeltaOrderDataInput = {
owner: options.owner,
beneficiary: options.beneficiary,
srcToken: options.srcToken,
destToken: options.destToken,
srcAmount: options.srcAmount,
destAmount: options.destAmount,
expectedDestAmount: options.deltaPrice.destAmount,
deadline: options.deadline,
nonce: options.nonce?.toString(10),
permit: options.permit,
chainId,
paraswapDeltaAddress: ParaswapDelta,
partnerAddress,
takeSurplus,
partnerFee,
};
return buildDeltaSignableOrderData(input);
};
return {
buildDeltaOrder,
};
};