@velora-dex/sdk
Version:
548 lines (516 loc) • 15.6 kB
text/typescript
import type {
ConstructProviderFetchInput,
RequestParameters,
TxSendOverrides,
} from '../../types';
import { constructGetDeltaContract } from './getDeltaContract';
import { sanitizeDeltaOrderData, sanitizeTWAPOrderData } from './helpers/misc';
import { SignableDeltaOrderData } from './helpers/buildDeltaOrderData';
import { produceDeltaOrderHash } from './preSignDeltaOrder';
import type { ExtractAbiMethodNames } from '../../helpers/misc';
import type {
DeltaAuctionOrder,
TWAPDeltaOrder,
TWAPBuyDeltaOrder,
} from './helpers/types';
export type CancelAndWithdrawDeltaOrderParams = {
order: DeltaAuctionOrder;
/** @description A boolean indicating whether the order is a fillable order. False by default */
isFillable?: boolean;
};
export type CancelAndWithdrawDeltaOrder<T> = (
params: CancelAndWithdrawDeltaOrderParams,
overrides?: TxSendOverrides,
requestParams?: RequestParameters
) => Promise<T>;
export type WithdrawDeltaNative<T> = (
amount: string,
overrides?: TxSendOverrides,
requestParams?: RequestParameters
) => Promise<T>;
export type DepositNativeAndPreSignParams = {
orderHash: string;
depositAmount: string;
};
export type DepositNativeAndPreSign<T> = (
params: DepositNativeAndPreSignParams,
overrides?: Omit<TxSendOverrides, 'value'>, // value is set internally based on depositAmount
requestParams?: RequestParameters
) => Promise<T>;
export type CancelTWAPAndWithdrawDeltaOrder<T> = (
order: TWAPDeltaOrder,
overrides?: TxSendOverrides,
requestParams?: RequestParameters
) => Promise<T>;
export type CancelTWAPBuyAndWithdrawDeltaOrder<T> = (
order: TWAPBuyDeltaOrder,
overrides?: TxSendOverrides,
requestParams?: RequestParameters
) => Promise<T>;
export type DepositNativeAndPreSignDeltaOrderParams = Pick<
DepositNativeAndPreSignParams,
'depositAmount'
> & {
signableOrderData: SignableDeltaOrderData;
};
export type DepositNativeAndPreSignDeltaOrder<T> = (
params: DepositNativeAndPreSignDeltaOrderParams,
overrides?: Omit<TxSendOverrides, 'value'>, // value is set internally based on depositAmount
requestParams?: RequestParameters
) => Promise<T>;
export type DeltaTokenModuleFunctions<T> = {
/** @description Cancel an order on-chain and withdraw native ETH back to the owner */
cancelAndWithdrawDeltaOrder: CancelAndWithdrawDeltaOrder<T>;
/** @description Withdraw Delta Wrapped Native tokens as native ETH */
withdrawDeltaNative: WithdrawDeltaNative<T>;
/** @description Deposit native ETH and pre-sign a Delta order */
depositNativeAndPreSign: DepositNativeAndPreSign<T>;
/** @description Deposit native ETH and pre-sign a Delta order from signable order data */
depositNativeAndPreSignDeltaOrder: DepositNativeAndPreSignDeltaOrder<T>;
/** @description Cancel a TWAP sell order on-chain and withdraw native ETH back to the owner */
cancelTWAPAndWithdrawDeltaOrder: CancelTWAPAndWithdrawDeltaOrder<T>;
/** @description Cancel a TWAP buy order on-chain and withdraw native ETH back to the owner */
cancelTWAPBuyAndWithdrawDeltaOrder: CancelTWAPBuyAndWithdrawDeltaOrder<T>;
};
const DeltaTokenModuleAbi = [
{
type: 'function',
name: 'cancelAndWithdraw',
inputs: [
{
name: 'order',
type: 'tuple',
internalType: 'struct Order',
components: [
{
name: 'owner',
type: 'address',
internalType: 'address',
},
{
name: 'beneficiary',
type: 'address',
internalType: 'address',
},
{
name: 'srcToken',
type: 'address',
internalType: 'address',
},
{
name: 'destToken',
type: 'address',
internalType: 'address',
},
{
name: 'srcAmount',
type: 'uint256',
internalType: 'uint256',
},
{
name: 'destAmount',
type: 'uint256',
internalType: 'uint256',
},
{
name: 'expectedAmount',
type: 'uint256',
internalType: 'uint256',
},
{
name: 'deadline',
type: 'uint256',
internalType: 'uint256',
},
{
name: 'kind',
type: 'uint8',
internalType: 'enum OrderKind',
},
{
name: 'nonce',
type: 'uint256',
internalType: 'uint256',
},
{
name: 'partnerAndFee',
type: 'uint256',
internalType: 'uint256',
},
{
name: 'permit',
type: 'bytes',
internalType: 'bytes',
},
{
name: 'metadata',
type: 'bytes',
internalType: 'bytes',
},
{
name: 'bridge',
type: 'tuple',
internalType: 'struct Bridge',
components: [
{
name: 'protocolSelector',
type: 'bytes4',
internalType: 'bytes4',
},
{
name: 'destinationChainId',
type: 'uint256',
internalType: 'uint256',
},
{
name: 'outputToken',
type: 'address',
internalType: 'address',
},
{
name: 'scalingFactor',
type: 'int8',
internalType: 'int8',
},
{
name: 'protocolData',
type: 'bytes',
internalType: 'bytes',
},
],
},
],
},
{
name: 'isFillable',
type: 'bool',
internalType: 'bool',
},
],
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
name: 'cancelTWAPAndWithdraw',
inputs: [
{
name: 'order',
type: 'tuple',
internalType: 'struct TWAPOrder',
components: [
{ name: 'owner', type: 'address', internalType: 'address' },
{
name: 'beneficiary',
type: 'address',
internalType: 'address',
},
{
name: 'srcToken',
type: 'address',
internalType: 'address',
},
{
name: 'destToken',
type: 'address',
internalType: 'address',
},
{ name: 'nonce', type: 'uint256', internalType: 'uint256' },
{
name: 'partnerAndFee',
type: 'uint256',
internalType: 'uint256',
},
{ name: 'deadline', type: 'uint64', internalType: 'uint64' },
{ name: 'interval', type: 'uint64', internalType: 'uint64' },
{ name: 'numSlices', type: 'uint32', internalType: 'uint32' },
{
name: 'destAmountPerSlice',
type: 'uint256',
internalType: 'uint256',
},
{
name: 'totalSrcAmount',
type: 'uint256',
internalType: 'uint256',
},
{ name: 'permit', type: 'bytes', internalType: 'bytes' },
{ name: 'metadata', type: 'bytes', internalType: 'bytes' },
{
name: 'bridge',
type: 'tuple',
internalType: 'struct Bridge',
components: [
{
name: 'protocolSelector',
type: 'bytes4',
internalType: 'bytes4',
},
{
name: 'destinationChainId',
type: 'uint256',
internalType: 'uint256',
},
{
name: 'outputToken',
type: 'address',
internalType: 'address',
},
{
name: 'scalingFactor',
type: 'int8',
internalType: 'int8',
},
{
name: 'protocolData',
type: 'bytes',
internalType: 'bytes',
},
],
},
],
},
],
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
name: 'cancelTWAPBuyAndWithdraw',
inputs: [
{
name: 'order',
type: 'tuple',
internalType: 'struct TWAPBuyOrder',
components: [
{ name: 'owner', type: 'address', internalType: 'address' },
{
name: 'beneficiary',
type: 'address',
internalType: 'address',
},
{
name: 'srcToken',
type: 'address',
internalType: 'address',
},
{
name: 'destToken',
type: 'address',
internalType: 'address',
},
{ name: 'nonce', type: 'uint256', internalType: 'uint256' },
{
name: 'partnerAndFee',
type: 'uint256',
internalType: 'uint256',
},
{ name: 'deadline', type: 'uint64', internalType: 'uint64' },
{ name: 'interval', type: 'uint64', internalType: 'uint64' },
{ name: 'numSlices', type: 'uint32', internalType: 'uint32' },
{
name: 'totalDestAmount',
type: 'uint256',
internalType: 'uint256',
},
{
name: 'maxSrcAmount',
type: 'uint256',
internalType: 'uint256',
},
{ name: 'permit', type: 'bytes', internalType: 'bytes' },
{ name: 'metadata', type: 'bytes', internalType: 'bytes' },
{
name: 'bridge',
type: 'tuple',
internalType: 'struct Bridge',
components: [
{
name: 'protocolSelector',
type: 'bytes4',
internalType: 'bytes4',
},
{
name: 'destinationChainId',
type: 'uint256',
internalType: 'uint256',
},
{
name: 'outputToken',
type: 'address',
internalType: 'address',
},
{
name: 'scalingFactor',
type: 'int8',
internalType: 'int8',
},
{
name: 'protocolData',
type: 'bytes',
internalType: 'bytes',
},
],
},
],
},
],
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
name: 'withdrawNative',
inputs: [
{
name: 'amount',
type: 'uint256',
internalType: 'uint256',
},
],
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
name: 'depositNativeAndPreSign',
inputs: [
{
name: 'orderHash',
type: 'bytes32',
internalType: 'bytes32',
},
],
outputs: [],
stateMutability: 'payable',
},
] as const;
type AvailableMethods = ExtractAbiMethodNames<typeof DeltaTokenModuleAbi>;
// returns whatever `contractCaller` returns
// to allow for better versatility
export const constructDeltaTokenModule = <T>(
options: Pick<
ConstructProviderFetchInput<T, 'transactCall'>,
'contractCaller' | 'fetcher' | 'apiURL' | 'chainId'
>
): DeltaTokenModuleFunctions<T> => {
// cached internally
const { getDeltaContract } = constructGetDeltaContract(options);
const cancelAndWithdrawDeltaOrder: CancelAndWithdrawDeltaOrder<T> = async (
{ order, isFillable = false },
overrides = {},
requestParams
) => {
const ParaswapDelta = await getDeltaContract(requestParams);
if (!ParaswapDelta) {
throw new Error(`Delta is not available on chain ${options.chainId}`);
}
const res = await options.contractCaller.transactCall<AvailableMethods>({
address: ParaswapDelta,
abi: DeltaTokenModuleAbi,
contractMethod: 'cancelAndWithdraw',
args: [sanitizeDeltaOrderData(order), isFillable],
overrides,
});
return res;
};
const withdrawDeltaNative: WithdrawDeltaNative<T> = async (
amount,
overrides = {},
requestParams
) => {
const ParaswapDelta = await getDeltaContract(requestParams);
if (!ParaswapDelta) {
throw new Error(`Delta is not available on chain ${options.chainId}`);
}
const res = await options.contractCaller.transactCall<AvailableMethods>({
address: ParaswapDelta,
abi: DeltaTokenModuleAbi,
contractMethod: 'withdrawNative',
args: [amount],
overrides,
});
return res;
};
const depositNativeAndPreSign: DepositNativeAndPreSign<T> = async (
{ orderHash, depositAmount },
overrides = {},
requestParams
) => {
const ParaswapDelta = await getDeltaContract(requestParams);
if (!ParaswapDelta) {
throw new Error(`Delta is not available on chain ${options.chainId}`);
}
const res = await options.contractCaller.transactCall<AvailableMethods>({
address: ParaswapDelta,
abi: DeltaTokenModuleAbi,
contractMethod: 'depositNativeAndPreSign',
args: [orderHash],
overrides: {
...overrides,
value: depositAmount,
},
});
return res;
};
const depositNativeAndPreSignDeltaOrder: DepositNativeAndPreSignDeltaOrder<
T
> = async (
{ signableOrderData, depositAmount },
overrides = {},
requestParams
) => {
// types allow to pass OrderData & extra_stuff, but tx will break like that
const typedDataOnly: SignableDeltaOrderData = {
...signableOrderData,
data: sanitizeDeltaOrderData(signableOrderData.data),
};
const orderHash = produceDeltaOrderHash(typedDataOnly);
const res = await depositNativeAndPreSign(
{ orderHash, depositAmount },
overrides,
requestParams
);
return res;
};
const cancelTWAPAndWithdrawDeltaOrder: CancelTWAPAndWithdrawDeltaOrder<
T
> = async (order, overrides = {}, requestParams) => {
const ParaswapDelta = await getDeltaContract(requestParams);
if (!ParaswapDelta) {
throw new Error(`Delta is not available on chain ${options.chainId}`);
}
const res = await options.contractCaller.transactCall<AvailableMethods>({
address: ParaswapDelta,
abi: DeltaTokenModuleAbi,
contractMethod: 'cancelTWAPAndWithdraw',
args: [sanitizeTWAPOrderData(order)],
overrides,
});
return res;
};
const cancelTWAPBuyAndWithdrawDeltaOrder: CancelTWAPBuyAndWithdrawDeltaOrder<
T
> = async (order, overrides = {}, requestParams) => {
const ParaswapDelta = await getDeltaContract(requestParams);
if (!ParaswapDelta) {
throw new Error(`Delta is not available on chain ${options.chainId}`);
}
const res = await options.contractCaller.transactCall<AvailableMethods>({
address: ParaswapDelta,
abi: DeltaTokenModuleAbi,
contractMethod: 'cancelTWAPBuyAndWithdraw',
args: [sanitizeTWAPOrderData(order)],
overrides,
});
return res;
};
return {
cancelAndWithdrawDeltaOrder,
withdrawDeltaNative,
depositNativeAndPreSign,
depositNativeAndPreSignDeltaOrder,
cancelTWAPAndWithdrawDeltaOrder,
cancelTWAPBuyAndWithdrawDeltaOrder,
};
};