@0xsplits/splits-sdk
Version:
SDK for the 0xSplits protocol
128 lines (119 loc) • 3.89 kB
text/typescript
import { gql } from '@urql/core'
import {
formatGqlContractEarnings,
formatInternalTokenBalances,
formatTokenBalances,
} from './token'
import { GqlVestingModule, GqlVestingStream } from './types'
import { IVestingModule, IVestingStream } from './types'
import { getAddress } from 'viem'
import { SupportedChainId } from './constants'
import { VestingModule, VestingStream } from '../types'
import { fromBigIntToTokenValue } from '../utils'
const VESTING_STREAM_FIELDS_FRAGMENT = gql`
fragment VestingStreamFieldsFragment on VestingStream {
token {
id
}
streamId
startTime
totalAmount
claimedAmount
}
`
export const VESTING_MODULE_FIELDS_FRAGMENT = gql`
fragment VestingModuleFieldsFragment on VestingModule {
beneficiary {
id
}
vestingPeriod
streams {
...VestingStreamFieldsFragment
}
}
${VESTING_STREAM_FIELDS_FRAGMENT}
`
const formatGqlVestingStream: (arg0: GqlVestingStream) => IVestingStream = (
gqlVestingStream,
) => {
return {
streamId: parseInt(gqlVestingStream.streamId),
startTime: parseInt(gqlVestingStream.startTime),
totalAmount: BigInt(gqlVestingStream.totalAmount),
claimedAmount: BigInt(gqlVestingStream.claimedAmount),
token: getAddress(gqlVestingStream.token.id),
}
}
export const formatGqlVestingModule: (
arg0: GqlVestingModule,
) => IVestingModule = (gqlVestingModule) => {
return {
type: 'vesting',
address: getAddress(gqlVestingModule.id),
chainId: parseInt(gqlVestingModule.chainId) as SupportedChainId,
distributions: formatTokenBalances(gqlVestingModule.distributions),
balances: {},
splitmainBalances: formatInternalTokenBalances(
gqlVestingModule.internalBalances,
),
warehouseBalances: formatInternalTokenBalances(
gqlVestingModule.warehouseBalances,
),
beneficiary: getAddress(gqlVestingModule.beneficiary.id),
vestingPeriod: parseInt(gqlVestingModule.vestingPeriod),
latestBlock: gqlVestingModule.latestBlock,
latestActivity: parseInt(gqlVestingModule.latestActivity),
...(gqlVestingModule.streams && {
streams: gqlVestingModule.streams.map((gqlVestingStream) =>
formatGqlVestingStream(gqlVestingStream),
),
}),
contractEarnings: formatGqlContractEarnings(
gqlVestingModule.contractEarnings,
),
}
}
// Should only be called by formatVestingModule on VestingClient
export const protectedFormatVestingModule = (
gqlVestingModule: IVestingModule,
tokenData: { [token: string]: { symbol: string; decimals: number } },
): VestingModule => {
return {
type: 'VestingModule',
address: getAddress(gqlVestingModule.address),
beneficiary: {
address: getAddress(gqlVestingModule.beneficiary),
},
vestingPeriod: gqlVestingModule.vestingPeriod,
...(gqlVestingModule.streams && {
streams: gqlVestingModule.streams.map((gqlVestingStream) =>
formatVestingModuleStream(gqlVestingStream, tokenData),
),
}),
}
}
const formatVestingModuleStream = (
gqlVestingStream: IVestingStream,
tokenData: { [token: string]: { symbol: string; decimals: number } },
): VestingStream => {
const tokenDecimals = tokenData[gqlVestingStream.token].decimals
return {
streamId: gqlVestingStream.streamId,
startTime: gqlVestingStream.startTime,
totalAmount: parseFloat(
fromBigIntToTokenValue(gqlVestingStream.totalAmount, tokenDecimals),
),
releasedAmount: parseFloat(
fromBigIntToTokenValue(gqlVestingStream.claimedAmount, tokenDecimals),
),
token: {
address: getAddress(gqlVestingStream.token),
symbol: tokenData[gqlVestingStream.token].symbol,
decimals: tokenData[gqlVestingStream.token].decimals,
},
// Deprecated
claimedAmount: parseFloat(
fromBigIntToTokenValue(gqlVestingStream.claimedAmount, tokenDecimals),
),
}
}