UNPKG

@robertprp/intents-sdk

Version:

Shogun Network Intent-based cross-chain swaps SDK

177 lines (160 loc) 5.02 kB
import type { Address, Hex, TypedDataDomain } from 'viem'; import type { SupportedEvmChain } from '../../chains.js'; import { PERMIT2_ADDRESS } from '../../constants.js'; export type TokenPermissions = { token: Address; amount: bigint; }; export type TransferData = { token: Address; receiver: Address; amount: bigint; }; export type CrossChainOrderInfo = { user: Address; tokenIn: Address; srcChainId: number; deadline: number; amountIn: bigint; minStablecoinsAmount: bigint; executionDetailsHash: Hex; nonce: bigint; }; export type SingleChainLimitOrder = { user: Address; tokenIn: Address; amountIn: bigint; requestedOutput: TransferData; extraTransfers: TransferData[]; encodedExternalCallData: Hex; deadline: number; nonce: bigint; }; export type DcaOrderInfo = { user: Address; tokenIn: Address; srcChainId: number; startTime: number; deadline: number; totalIntervals: number; intervalDuration: number; amountInPerInterval: bigint; minStablecoinsAmountPerInterval: bigint; executionDetailsHash: Hex; nonce: bigint; }; export type CrossChainPermitTransferFrom = { permitted: TokenPermissions; spender: Address; nonce: bigint; deadline: bigint; witness: CrossChainOrderInfo; }; export type SingleChainPermitTransferFrom = { permitted: TokenPermissions; spender: Address; nonce: bigint; deadline: bigint; witness: SingleChainLimitOrder; }; export type PermitTransferFrom = CrossChainPermitTransferFrom | SingleChainPermitTransferFrom; const TOKEN_PERMISSIONS_TYPE = [ { name: 'token', type: 'address' }, { name: 'amount', type: 'uint256' }, ] as const; const TRANSFER_DATA_TYPE = [ { name: 'token', type: 'address' }, { name: 'receiver', type: 'address' }, { name: 'amount', type: 'uint256' }, ] as const; // Cross-chain order types export const CROSS_CHAIN_PERMIT2_TYPES = { TokenPermissions: TOKEN_PERMISSIONS_TYPE, OrderInfo: [ { name: 'user', type: 'address' }, { name: 'tokenIn', type: 'address' }, { name: 'srcChainId', type: 'uint32' }, { name: 'deadline', type: 'uint32' }, { name: 'amountIn', type: 'uint128' }, { name: 'minStablecoinsAmount', type: 'uint128' }, { name: 'executionDetailsHash', type: 'bytes32' }, { name: 'nonce', type: 'uint256' }, ], PermitWitnessTransferFrom: [ { name: 'permitted', type: 'TokenPermissions' }, { name: 'spender', type: 'address' }, { name: 'nonce', type: 'uint256' }, { name: 'deadline', type: 'uint256' }, { name: 'witness', type: 'OrderInfo' }, ], } as const; export const SINGLE_CHAIN_LIMIT_PERMIT2_TYPES = { TokenPermissions: TOKEN_PERMISSIONS_TYPE, TransferData: TRANSFER_DATA_TYPE, SingleChainLimitOrder: [ { name: 'user', type: 'address' }, { name: 'tokenIn', type: 'address' }, { name: 'amountIn', type: 'uint256' }, { name: 'requestedOutput', type: 'TransferData' }, { name: 'extraTransfers', type: 'TransferData[]' }, { name: 'encodedExternalCallData', type: 'bytes' }, { name: 'deadline', type: 'uint32' }, { name: 'nonce', type: 'uint256' }, ], PermitWitnessTransferFrom: [ { name: 'permitted', type: 'TokenPermissions' }, { name: 'spender', type: 'address' }, { name: 'nonce', type: 'uint256' }, { name: 'deadline', type: 'uint256' }, { name: 'witness', type: 'SingleChainLimitOrder' }, ], } as const; export const PERMIT2_DOMAIN = (chainId: SupportedEvmChain): TypedDataDomain => ({ name: 'Permit2', chainId, verifyingContract: PERMIT2_ADDRESS[chainId], }); type DcaSingleChainOrderWitness = { user: Address; tokenIn: Address; startTime: number; amountInPerInterval: bigint; totalIntervals: number; intervalDuration: number; requestedOutput: TransferData; extraTransfers: TransferData[]; encodedExternalCallData: Hex; deadline: number; nonce: bigint; }; export type DcaSingleChainPermitTransferFrom = { permitted: TokenPermissions; spender: Address; nonce: bigint; deadline: bigint; witness: DcaSingleChainOrderWitness; }; export const DCA_SINGLE_CHAIN_PERMIT2_TYPES = { TokenPermissions: TOKEN_PERMISSIONS_TYPE, TransferData: TRANSFER_DATA_TYPE, SingleChainDcaOrder: [ { type: 'address', name: 'user' }, { type: 'address', name: 'tokenIn' }, { type: 'uint32', name: 'startTime' }, { type: 'uint256', name: 'amountInPerInterval' }, { type: 'uint24', name: 'totalIntervals' }, { type: 'uint32', name: 'intervalDuration' }, { type: 'TransferData', name: 'requestedOutput' }, { type: 'TransferData[]', name: 'extraTransfers' }, { type: 'bytes', name: 'encodedExternalCallData' }, { type: 'uint32', name: 'deadline' }, { type: 'uint256', name: 'nonce' }, ], PermitWitnessTransferFrom: [ { name: 'permitted', type: 'TokenPermissions' }, { name: 'spender', type: 'address' }, { name: 'nonce', type: 'uint256' }, { name: 'deadline', type: 'uint256' }, { name: 'witness', type: 'SingleChainDcaOrder' }, ], } as const;