UNPKG

@0xsplits/splits-sdk

Version:

SDK for the 0xSplits protocol

108 lines (99 loc) 3.18 kB
import { gql } from '@urql/core' import { ACCOUNT_FIELDS_FRAGMENT, SPLIT_FIELDS_FRAGMENT } from './split' import { formatGqlContractEarnings, formatInternalTokenBalances, formatTokenBalances, } from './token' import { GqlHolder, GqlLiquidSplit } from './types' import { IHolder, ILiquidSplit } from './types' import { getAddress } from 'viem' import { SupportedChainId } from './constants' import { LiquidSplit } from '../types' import { fromBigIntToPercent } from '../utils' const LIQUID_SPLIT_HOLDERS_FRAGMENT = gql` fragment LiquidSplitHoldersFragment on Holder { id ownership } ` export const LIQUID_SPLIT_FIELDS_FRAGMENT = gql` fragment LiquidSplitFieldsFragment on LiquidSplit { holders { ...LiquidSplitHoldersFragment } distributorFee split { ...AccountFieldsFragment ...SplitFieldsFragment } isFactoryGenerated } ${LIQUID_SPLIT_HOLDERS_FRAGMENT} ${ACCOUNT_FIELDS_FRAGMENT} ${SPLIT_FIELDS_FRAGMENT} ` const formatGqlHolder: (arg0: GqlHolder) => IHolder = (gqlHolder) => { const holderId = gqlHolder.id const accountId = holderId.split('-')[1] return { address: getAddress(accountId), ownership: BigInt(gqlHolder.ownership), } } export const formatGqlLiquidSplit: (arg0: GqlLiquidSplit) => ILiquidSplit = ( gqlLiquidSplit, ) => { return { type: 'liquidSplit', address: getAddress(gqlLiquidSplit.id), chainId: parseInt(gqlLiquidSplit.chainId) as SupportedChainId, distributions: formatTokenBalances(gqlLiquidSplit.distributions), balances: {}, distributed: gqlLiquidSplit.split.distributions ? formatTokenBalances(gqlLiquidSplit.split.distributions) : {}, splitmainBalances: formatInternalTokenBalances( gqlLiquidSplit.internalBalances, ), warehouseBalances: formatInternalTokenBalances( gqlLiquidSplit.warehouseBalances, ), distributorFee: parseInt(gqlLiquidSplit.distributorFee), splitId: getAddress(gqlLiquidSplit.split.id), holders: gqlLiquidSplit.holders.map((gqlHolder) => formatGqlHolder(gqlHolder), ), latestBlock: gqlLiquidSplit.latestBlock, latestActivity: parseInt(gqlLiquidSplit.latestActivity), isFactoryGenerated: gqlLiquidSplit.isFactoryGenerated, contractEarnings: formatGqlContractEarnings( gqlLiquidSplit.contractEarnings, ), } } export const formatRecipient = (gqlRecipient: IHolder) => { return { recipient: { address: gqlRecipient.address, }, percentAllocation: fromBigIntToPercent(gqlRecipient.ownership), } } // Should only be called by formatLiquidSplit on LiquidSplitClient export const protectedFormatLiquidSplit = ( gqlLiquidSplit: ILiquidSplit, ): LiquidSplit => { return { type: 'LiquidSplit', address: gqlLiquidSplit.address, distributorFeePercent: fromBigIntToPercent(gqlLiquidSplit.distributorFee), payoutSplitAddress: gqlLiquidSplit.splitId, isFactoryGenerated: gqlLiquidSplit.isFactoryGenerated, holders: gqlLiquidSplit.holders .map((gqlHolder) => formatRecipient(gqlHolder)) .sort((a, b) => { return b.percentAllocation - a.percentAllocation }), } }