UNPKG

@0xsplits/splits-sdk

Version:

SDK for the 0xSplits protocol

763 lines (648 loc) 16.8 kB
import { Dictionary } from 'lodash' import type { AccessList, Address, Hash, Hex, PublicClient, Transport, WalletClient, } from 'viem' import { TransactionType } from './constants' // INPUTS export type TransactionOverrides = { accessList?: AccessList gas?: bigint maxFeePerGas?: bigint maxPriorityFeePerGas?: bigint nonce?: number value?: bigint } interface TransactionOverridesDict { transactionOverrides?: TransactionOverrides } // Multicall export type MulticallConfig = { calls: CallData[] } & TransactionOverridesDict export type ApiConfig = { apiKey: string serverURL?: string } // OP stack chains are not typed the same way as other chains, // so we need to use any here. Chain type will cause the caller // to throw an error if the chain is base, optimism, etc. // TODO: can we have a generic here? Problem is it needs to get // passed through in so many places, it's pretty ugly. // eslint-disable-next-line @typescript-eslint/no-explicit-any export type SplitsPublicClient = PublicClient<Transport, any> export type DataClientConfig = { publicClient?: SplitsPublicClient publicClients?: { [chainId: number]: SplitsPublicClient } apiConfig: ApiConfig includeEnsNames?: boolean // ensPublicClient can be used to fetch ens names when publicClient is not on mainnet (reverseRecords // only works on mainnet). ensPublicClient?: SplitsPublicClient } // Splits export type SplitsClientConfig = { chainId?: number publicClient?: SplitsPublicClient publicClients?: { [chainId: number]: SplitsPublicClient } walletClient?: WalletClient apiConfig?: ApiConfig includeEnsNames?: boolean // ensPublicClient can be used to fetch ens names when publicClient is not on mainnet (reverseRecords // only works on mainnet). ensPublicClient?: SplitsPublicClient } export type BaseClientConfig = SplitsClientConfig & { supportedChainIds: number[] } export type TransactionConfig = { transactionType: TransactionType } export type SplitRecipient = { address: string percentAllocation: number } export type ReadContractArgs = { chainId?: number } export type CreateSplitConfig = { recipients: SplitRecipient[] distributorFeePercent: number controller?: string chainId?: number } & TransactionOverridesDict export type UpdateSplitConfig = { splitAddress: string recipients: SplitRecipient[] distributorFeePercent: number chainId?: number } & TransactionOverridesDict export type DistributeTokenConfig = { splitAddress: string token: string distributorAddress?: string chainId?: number splitFields?: { recipients: Split['recipients'] distributorFeePercent: number } } & TransactionOverridesDict export type UpdateSplitAndDistributeTokenConfig = { splitAddress: string token: string recipients: SplitRecipient[] distributorFeePercent: number distributorAddress?: string chainId?: number } & TransactionOverridesDict export type WithdrawFundsConfig = { address: string tokens: string[] chainId?: number } & TransactionOverridesDict export type InitiateControlTransferConfig = { splitAddress: string newController: string chainId?: number } & TransactionOverridesDict export type CancelControlTransferConfig = { splitAddress: string chainId?: number } & TransactionOverridesDict export type AcceptControlTransferConfig = { splitAddress: string chainId?: number } & TransactionOverridesDict export type MakeSplitImmutableConfig = { splitAddress: string chainId?: number } & TransactionOverridesDict export type BatchDistributeAndWithdrawConfig = { splitAddress: string tokens: string[] recipientAddresses: string[] distributorAddress?: string chainId?: number } export type BatchDistributeAndWithdrawForAllConfig = { splitAddress: string tokens: string[] distributorAddress?: string chainId?: number } export type GetSplitBalanceConfig = { splitAddress: string token?: string chainId?: number } // Warehouse export type WarehouseTransferConfig = { receiverAddress: Address tokenAddress: Address amount: bigint } & TransactionOverridesDict export type WarehouseTransferFromConfig = { senderAddress: Address receiverAddress: Address tokenAddress: Address amount: bigint } & TransactionOverridesDict export type WarehouseApproveConfig = { spenderAddress: Address tokenAddress: Address amount: bigint } & TransactionOverridesDict export type WarehouseSetOperatorConfig = { operatorAddress: Address approved: boolean } & TransactionOverridesDict export type WarehouseInvalidateNonceConfig = { nonce: bigint } & TransactionOverridesDict export type WarehouseTemporaryApproveAndCallConfig = { spenderAddress: Address operator: boolean tokenAddress: Address amount: bigint targetAddress: Address data: Hex } & TransactionOverridesDict export type WarehouseTemporaryApproveAndCallBySigConfig = { ownerAddress: Address spenderAddress: Address operator: boolean tokenAddress: Address amount: bigint targetAddress: Address data: Hex nonce: bigint deadline: number signature: Hex } & TransactionOverridesDict export type WarehouseApproveBySig = { spenderAddress: Address operator: boolean tokenAddress: Address amount: bigint nonce: bigint deadline: number } export type WarehouseTemporaryApproveAndCallBySig = { spenderAddress: Address operator: boolean tokenAddress: Address amount: bigint targetAddress: Address data: Hex nonce: bigint deadline: number } export type WarehouseApproveBySigConfig = { ownerAddress: Address spenderAddress: Address operator: boolean tokenAddress: Address amount: bigint nonce: bigint deadline: number signature: Hex } & TransactionOverridesDict export type WarehouseDepositConfig = { receiverAddress: Address tokenAddress: Address amount: bigint } & TransactionOverridesDict export type WarehouseBatchDepositConfig = { receiversAddresses: Address[] tokenAddress: Address amounts: bigint[] } & TransactionOverridesDict export type WarehouseWithdrawConfig = { ownerAddress: Address tokenAddress: Address } & TransactionOverridesDict export type WarehouseBatchWithdrawConfig = { ownerAddress: Address tokensAddresses: Address[] amounts: bigint[] withdrawerAddress: Address } & TransactionOverridesDict export type WarehouseBatchTransferConfig = { receiversAddresses: Address[] tokenAddress: Address amounts: bigint[] } & TransactionOverridesDict export type WarehouseSetWithdrawConfig = { incentivePercent: number paused: boolean } & TransactionOverridesDict export enum SplitV2Type { Push = 'push', Pull = 'pull', } // Split V2 export type SplitV2 = { address: Address recipients: Address[] allocations: bigint[] distributionIncentive: number totalAllocation: bigint paused: boolean type: SplitV2Type controllerAddress: Address creatorAddress: Address } export type CreateSplitV2Config = { recipients: SplitRecipient[] distributorFeePercent: number totalAllocationPercent?: number splitType?: SplitV2Type ownerAddress?: Address creatorAddress?: Address salt?: Hex chainId?: number } & TransactionOverridesDict export type UpdateSplitV2Config = { splitAddress: Address recipients: SplitRecipient[] distributorFeePercent: number totalAllocationPercent?: number } & TransactionOverridesDict export type DistributeSplitConfig = { splitAddress: Address tokenAddress: Address distributorAddress?: Address chainId?: number splitFields?: { recipients: Split['recipients'] distributorFeePercent: number } } & TransactionOverridesDict export type TransferOwnershipConfig = { splitAddress: Address newOwner: Address } & TransactionOverridesDict export type SetPausedConfig = { splitAddress: Address paused: boolean } & TransactionOverridesDict export type SplitV2ExecCallsConfig = { splitAddress: Address calls: { to: Address value: bigint data: Hex }[] } & TransactionOverridesDict // Waterfall export type WaterfallTrancheInput = { recipient: string size?: number } export type CreateWaterfallConfig = { token: string tranches: WaterfallTrancheInput[] nonWaterfallRecipient?: string chainId?: number } & TransactionOverridesDict export type WaterfallFundsConfig = { waterfallModuleAddress: string usePull?: boolean } & TransactionOverridesDict export type RecoverNonWaterfallFundsConfig = { waterfallModuleAddress: string token: string recipient?: string chainId?: number } & TransactionOverridesDict export type WithdrawWaterfallPullFundsConfig = { waterfallModuleAddress: string address: string } & TransactionOverridesDict // Vesting export type CreateVestingConfig = { beneficiary: string vestingPeriodSeconds: number chainId?: number } & TransactionOverridesDict export type StartVestConfig = { vestingModuleAddress: string tokens: string[] } & TransactionOverridesDict export type ReleaseVestedFundsConfig = { vestingModuleAddress: string streamIds: string[] } & TransactionOverridesDict // Liquid Split export type CreateLiquidSplitConfig = { recipients: SplitRecipient[] distributorFeePercent: number owner?: string chainId?: number } & TransactionOverridesDict export type DistributeLiquidSplitTokenConfig = { liquidSplitAddress: string token: string distributorAddress?: string chainId?: number } & TransactionOverridesDict export type TransferLiquidSplitOwnershipConfig = { liquidSplitAddress: string newOwner: string } & TransactionOverridesDict export type CallData = { address: string data: Hex } export type RecoupTrancheInput = { recipient: string | CreateSplitConfig size?: number } export type CreateRecoupConfig = { token: string tranches: RecoupTrancheInput[] nonWaterfallRecipientAddress?: string nonWaterfallRecipientTrancheIndex?: number chainId?: number } & TransactionOverridesDict // Pass through wallet export type CreatePassThroughWalletConfig = { owner: string paused?: boolean passThrough: string chainId?: number } & TransactionOverridesDict export type PassThroughTokensConfig = { passThroughWalletAddress: string tokens: string[] } & TransactionOverridesDict export type SetPassThroughConfig = { passThroughWalletAddress: string passThrough: string } & TransactionOverridesDict export type PassThroughWalletPauseConfig = { passThroughWalletAddress: string paused: boolean } & TransactionOverridesDict export type PassThroughWalletExecCallsConfig = { passThroughWalletAddress: string calls: { to: string value: bigint data: string }[] } & TransactionOverridesDict // Oracle export type QuoteParams = { quotePair: { base: string quote: string } baseAmount: bigint data?: Hex } // Swapper export type ScaledOfferFactorOverride = { baseToken: string quoteToken: string scaledOfferFactorPercent: number } type SwapperParams = { beneficiary: string tokenToBeneficiary: string defaultScaledOfferFactorPercent: number scaledOfferFactorOverrides: ScaledOfferFactorOverride[] } export type ParseOracleParams = { address?: string createOracleParams?: { factory: string data: string } } export type CreateSwapperConfig = SwapperParams & { owner: string paused?: boolean oracleParams: ParseOracleParams } & TransactionOverridesDict export type UniV3FlashSwapConfig = { swapperAddress: string excessRecipient?: string // defaults to wallet client account inputAssets: { encodedPath: string token: string amountIn: bigint amountOutMin: bigint }[] transactionTimeLimit?: number chainId?: number } & TransactionOverridesDict export type SwapperExecCallsConfig = { swapperAddress: string calls: { to: string value: bigint data: string }[] } & TransactionOverridesDict export type SwapperPauseConfig = { swapperAddress: string paused: boolean } & TransactionOverridesDict export type SwapperSetBeneficiaryConfig = { swapperAddress: string beneficiary: string } & TransactionOverridesDict export type SwapperSetTokenToBeneficiaryConfig = { swapperAddress: string tokenToBeneficiary: string } & TransactionOverridesDict export type SwapperSetOracleConfig = { swapperAddress: string oracle: string } & TransactionOverridesDict export type SwapperSetDefaultScaledOfferFactorConfig = { swapperAddress: string defaultScaledOfferFactorPercent: number } & TransactionOverridesDict export type SwapperSetScaledOfferFactorOverridesConfig = { swapperAddress: string scaledOfferFactorOverrides: ScaledOfferFactorOverride[] } & TransactionOverridesDict // Diversifier export type DiversifierRecipient = { address?: string swapperParams?: SwapperParams percentAllocation: number } export type CreateDiversifierConfig = { owner: string paused?: boolean oracleParams: ParseOracleParams recipients: DiversifierRecipient[] chainId?: number } & TransactionOverridesDict // OUTPUTS export type FormattedTokenBalances = { [token: string]: { symbol: string decimals: number rawAmount: bigint formattedAmount: string } } export type FormattedEarningsByContract = { [contractAddress: string]: FormattedUserEarnings } export type FormattedContractEarnings = { distributed: FormattedTokenBalances activeBalances?: FormattedTokenBalances } export type FormattedSplitEarnings = FormattedContractEarnings export type FormattedUserEarnings = { withdrawn: FormattedTokenBalances activeBalances: FormattedTokenBalances } export type FormattedUserEarningsByContract = FormattedUserEarnings & { earningsByContract: FormattedEarningsByContract } export type Recipient = { address: Address ens?: string } export type Token = { address: Address symbol?: string decimals?: number } export type Split = { type: 'Split' | 'SplitV2' address: Address controller: Recipient | null newPotentialController: Recipient | null distributorFeePercent: number distributionsPaused: boolean distributeDirection: 'pull' | 'push' totalOwnership: bigint recipients: { percentAllocation: number ownership: bigint recipient: Recipient }[] createdBlock?: number updateBlock?: number } export type WaterfallTranche = { recipient: Recipient startAmount: number size?: number } export type WaterfallModule = { type: 'WaterfallModule' address: Address token: Token nonWaterfallRecipient: Recipient | null tranches: WaterfallTranche[] } type UniswapV3TWAPPairDetails = Dictionary<{ base: Address quote: Address pool: string fee: number period: number }> type ChainlinkPairDetails = Dictionary<{ base: Address quote: Address }> type BaseOracle = { address: Address } type UnknownOracle = BaseOracle & { type: 'unknown' } type UniswapV3TWAPOracle = BaseOracle & { type: 'uniswapV3TWAP' defaultPeriod: number pairDetails: UniswapV3TWAPPairDetails } type ChainlinkOracle = BaseOracle & { type: 'chainlink' sequencerFeed?: string chainlinkPairDetails: ChainlinkPairDetails } type Oracle = UnknownOracle | UniswapV3TWAPOracle | ChainlinkOracle export type Swapper = { type: 'Swapper' address: Address beneficiary: Recipient tokenToBeneficiary: Token oracle: Oracle owner: Recipient | null paused: boolean defaultScaledOfferFactorPercent: number scaledOfferFactorOverrides: { baseToken: { address: string } quoteToken: { address: string } scaledOfferFactorPercent: number }[] } export type VestingStream = { streamId: number startTime: number totalAmount: number releasedAmount: number token: Token // Deprecated claimedAmount: number } export type VestingModule = { type: 'VestingModule' address: Address beneficiary: Recipient vestingPeriod: number streams?: VestingStream[] } export type LiquidSplit = { type: 'LiquidSplit' address: Address distributorFeePercent: number holders: { percentAllocation: number recipient: Recipient }[] payoutSplitAddress: Address isFactoryGenerated: boolean } export type SplitsContract = Split | WaterfallModule | LiquidSplit | Swapper // INTERNAL export type TransactionFormat = Hash | bigint | CallData export type ContractRecoupTranche = [string[], bigint[], string, bigint] export type ContractScaledOfferFactorOverride = [[string, string], bigint] export type ContractDiversifierRecipient = [ string, [string, string, bigint, ContractScaledOfferFactorOverride[]], bigint, ] export type ContractOracleParams = [string, [string, string]] export type ContractQuoteParams = [[string, string], bigint, string] export type ContractSwapperExactInputParams = [ string, string, number, bigint, bigint, ]