Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix earnings #52

Merged
merged 5 commits into from
Jul 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions packages/splits-kit/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@0xsplits/splits-kit",
"version": "0.4.3-beta.4",
"version": "0.4.3-beta.6",
"description": "UI Components for working with 0xSplits contracts",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
Expand Down Expand Up @@ -31,8 +31,8 @@
},
"homepage": "https://docs.splits.org/sdk-info/overview",
"dependencies": {
"@0xsplits/splits-sdk": "^4.0.3",
"@0xsplits/splits-sdk-react": "^2.0.4",
"@0xsplits/splits-sdk": "^4.0.4-beta.1",
"@0xsplits/splits-sdk-react": "^2.0.5-beta.1",
"@headlessui/react": "^1.7.17",
"@heroicons/react": "^2.0.18",
"@hookform/error-message": "^2.0.1",
Expand Down
4 changes: 2 additions & 2 deletions packages/splits-sdk-react/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@0xsplits/splits-sdk-react",
"version": "2.0.4",
"version": "2.0.5-beta.1",
"description": "React wrapper for the 0xSplits SDK",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
Expand Down Expand Up @@ -29,7 +29,7 @@
},
"homepage": "https://docs.splits.org/sdk",
"dependencies": {
"@0xsplits/splits-sdk": "^4.0.3"
"@0xsplits/splits-sdk": "^4.0.4-beta.1"
},
"peerDependencies": {
"react": "17.x.x || 18.x.x",
Expand Down
2 changes: 1 addition & 1 deletion packages/splits-sdk/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@0xsplits/splits-sdk",
"version": "4.0.3",
"version": "4.0.4-beta.1",
"description": "SDK for the 0xSplits protocol",
"main": "./dist/src/index.js",
"typings": "./dist/src/index.d.ts",
Expand Down
46 changes: 31 additions & 15 deletions packages/splits-sdk/src/client/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -329,10 +329,8 @@ export class DataClient {
if (!response)
throw new AccountNotFoundError('account', accountAddress, chainId)

if (response.type !== 'split' && response.type !== 'user')
throw new AccountNotFoundError('split & user', accountAddress, chainId)

const withdrawn = formatAccountBalances(response.withdrawn)
const withdrawn =
response.type === 'user' ? formatAccountBalances(response.withdrawn) : {}
const distributed = formatAccountBalances(response.distributions)
if (!includeActiveBalances) {
return {
Expand All @@ -341,15 +339,14 @@ export class DataClient {
}
}

const internalBalances = formatAccountBalances(response.balances)
const splitmainBalances = formatAccountBalances(response.splitmainBalances)
const warehouseBalances = formatAccountBalances(response.warehouseBalances)
if (response.type === 'user') {
// Only including split main balance for users
return {
withdrawn,
distributed,
activeBalances: mergeFormattedTokenBalances([
internalBalances,
splitmainBalances,
warehouseBalances,
]),
}
Expand All @@ -374,6 +371,7 @@ export class DataClient {
) {
// If no token list passed in and we're using alchemy, fetch all balances with alchemy's custom api
balances = await fetchContractBalancesWithAlchemy(
chainId,
accountAddress,
functionPublicClient,
)
Expand All @@ -397,36 +395,54 @@ export class DataClient {
const fullTokenList = Array.from(
new Set(
[zeroAddress, ...tokenList]
.concat(Object.keys(internalBalances))
.concat(Object.keys(splitmainBalances))
.concat(Object.keys(warehouseBalances))
.concat(customTokens)
.map((token) => getAddress(token)),
),
)
balances = await fetchActiveBalances(
chainId,
accountAddress,
functionPublicClient,
fullTokenList,
)
}

const allTokens = Array.from(
new Set(Object.keys(balances).concat(Object.keys(internalBalances))),
new Set(
Object.keys(balances)
.concat(Object.keys(splitmainBalances))
.concat(Object.keys(warehouseBalances)),
),
)
const filteredBalances = allTokens.reduce((acc, token) => {
const internalBalanceAmount =
internalBalances[token]?.rawAmount ?? BigInt(0)
const splitmainBalanceAmount =
splitmainBalances[token]?.rawAmount ?? BigInt(0)
const warehouseBalanceAmount =
warehouseBalances[token]?.rawAmount ?? BigInt(0)
const contractBalanceAmount = balances[token]?.rawAmount ?? BigInt(0)

// SplitMain leaves a balance of 1 for gas efficiency in internal balances.
// Splits leave a balance of 1 (for erc20) for gas efficiency
const tokenBalance =
(internalBalanceAmount > BigInt(1)
? internalBalanceAmount
(splitmainBalanceAmount > BigInt(1)
? splitmainBalanceAmount
: BigInt(0)) +
(warehouseBalanceAmount > BigInt(1)
? warehouseBalanceAmount
: BigInt(0)) +
(contractBalanceAmount > BigInt(1) ? contractBalanceAmount : BigInt(0))
const symbol = internalBalances[token]?.symbol ?? balances[token]?.symbol

const symbol =
splitmainBalances[token]?.symbol ??
warehouseBalances[token]?.symbol ??
balances[token]?.symbol
const decimals =
internalBalances[token]?.decimals ?? balances[token]?.decimals
splitmainBalances[token]?.decimals ??
warehouseBalances[token]?.decimals ??
balances[token]?.decimals

const formattedAmount = fromBigIntToTokenValue(tokenBalance, decimals)
if (tokenBalance > BigInt(0))
acc[token] = {
Expand Down
5 changes: 4 additions & 1 deletion packages/splits-sdk/src/subgraph/liquid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,12 @@ export const formatGqlLiquidSplit: (arg0: GqlLiquidSplit) => ILiquidSplit = (
distributed: gqlLiquidSplit.split.distributions
? formatTokenBalances(gqlLiquidSplit.split.distributions)
: {},
internalBalances: formatInternalTokenBalances(
splitmainBalances: formatInternalTokenBalances(
gqlLiquidSplit.internalBalances,
),
warehouseBalances: formatInternalTokenBalances(
gqlLiquidSplit.warehouseBalances,
),
distributorFee: parseInt(gqlLiquidSplit.distributorFee),
splitId: getAddress(gqlLiquidSplit.split.id),
holders: gqlLiquidSplit.holders.map((gqlHolder) =>
Expand Down
5 changes: 4 additions & 1 deletion packages/splits-sdk/src/subgraph/pass-through-wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,12 @@ export const formatGqlPassThroughWallet: (
address: getAddress(gqlPassThroughWallet.id),
balances: {},
balanceQuoteAmounts: {},
internalBalances: formatInternalTokenBalances(
splitmainBalances: formatInternalTokenBalances(
gqlPassThroughWallet.internalBalances,
),
warehouseBalances: formatInternalTokenBalances(
gqlPassThroughWallet.warehouseBalances,
),
latestBlock: gqlPassThroughWallet.latestBlock,
latestActivity: parseInt(gqlPassThroughWallet.latestActivity),
parentEntityType: gqlPassThroughWallet.parentEntityType,
Expand Down
2 changes: 1 addition & 1 deletion packages/splits-sdk/src/subgraph/split.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ export const formatGqlSplit: (arg0: GqlSplit) => ISplit = (gqlSplit) => {
distributed: gqlSplit.distributions
? formatTokenBalances(gqlSplit.distributions)
: {},
internalBalances: formatInternalTokenBalances(gqlSplit.internalBalances),
splitmainBalances: formatInternalTokenBalances(gqlSplit.internalBalances),
warehouseBalances: formatInternalTokenBalances(gqlSplit.warehouseBalances),
...(gqlSplit.liquidSplit && {
liquidSplitId: getAddress(gqlSplit.liquidSplit.id),
Expand Down
5 changes: 4 additions & 1 deletion packages/splits-sdk/src/subgraph/swapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,10 @@ export const formatGqlSwapper: (arg0: GqlSwapper) => ISwapper = (
distributions: formatTokenBalances(gqlSwapper.distributions),
balances: {},
balanceQuoteAmounts: {},
internalBalances: formatInternalTokenBalances(gqlSwapper.internalBalances),
splitmainBalances: formatInternalTokenBalances(gqlSwapper.internalBalances),
warehouseBalances: formatInternalTokenBalances(
gqlSwapper.warehouseBalances,
),
latestBlock: gqlSwapper.latestBlock,
latestActivity: parseInt(gqlSwapper.latestActivity),
parentEntityType: gqlSwapper.parentEntityType,
Expand Down
11 changes: 2 additions & 9 deletions packages/splits-sdk/src/subgraph/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,8 @@ export type IAccount = {

type IAccountSharedFields = IAccount & {
distributions: IBalance
splitmainBalances: IBalance
warehouseBalances: IBalance
latestBlock: number
latestActivity: number
parentEntityType?: string
Expand Down Expand Up @@ -621,8 +623,6 @@ export type ISplit = IAccountSharedFields & {
controller: Address
newPotentialController: Address
hash: string
internalBalances: IBalance
warehouseBalances: IBalance
liquidSplitId?: Address
createdBlock: number
}
Expand All @@ -637,8 +637,6 @@ export type IRecipient = {
export type IUser = IAccountSharedFields & {
type: 'user'
withdrawn: IBalance
balances: IBalance
warehouseBalances: IBalance
}

export type IVestingStream = {
Expand All @@ -652,7 +650,6 @@ export type IVestingStream = {
export type IVestingModule = IAccountSharedFields & {
type: 'vesting'
balances: IBalance
internalBalances: IBalance
beneficiary: Address
vestingPeriod: number
streams?: IVestingStream[]
Expand All @@ -671,7 +668,6 @@ export type IWaterfallModule = IAccountSharedFields & {
balances: IBalance
distributed: IBalance
token: Address
internalBalances: IBalance
tranches: IWaterfallTranche[]
nonWaterfallRecipient: Address
}
Expand All @@ -685,7 +681,6 @@ export type ILiquidSplit = IAccountSharedFields & {
type: 'liquidSplit'
balances: IBalance
distributed: IBalance
internalBalances: IBalance
splitId: Address
distributorFee: number
holders: IHolder[]
Expand Down Expand Up @@ -744,7 +739,6 @@ export type ISwapper = IAccountSharedFields & {
balances: IBalance
balanceQuoteAmounts: ISwapBalance
swapBalances: ISwapBalance
internalBalances: IBalance
owner: Address
beneficiary: Address
tokenToBeneficiary: Address
Expand All @@ -770,7 +764,6 @@ export type IPassThroughWalletSwapBalance = Dictionary<{
export type IPassThroughWallet = IAccountSharedFields & {
type: 'passThroughWallet'
balances: IBalance
internalBalances: IBalance
passThroughBalances: IBalance
owner: Address
passThroughAccount: Address
Expand Down
2 changes: 1 addition & 1 deletion packages/splits-sdk/src/subgraph/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export const formatGqlUser: (arg0: GqlUser) => IUser = (gqlUser) => {
chainId: parseInt(gqlUser.chainId) as SupportedChainId,
distributions: formatTokenBalances(gqlUser.distributions),
withdrawn: formatTokenBalances(gqlUser.withdrawals),
balances: formatInternalTokenBalances(gqlUser.internalBalances),
splitmainBalances: formatInternalTokenBalances(gqlUser.internalBalances),
warehouseBalances: formatInternalTokenBalances(gqlUser.warehouseBalances),
latestBlock: gqlUser.latestBlock,
latestActivity: parseInt(gqlUser.latestActivity),
Expand Down
5 changes: 4 additions & 1 deletion packages/splits-sdk/src/subgraph/vesting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,12 @@ export const formatGqlVestingModule: (
chainId: parseInt(gqlVestingModule.chainId) as SupportedChainId,
distributions: formatTokenBalances(gqlVestingModule.distributions),
balances: {},
internalBalances: formatInternalTokenBalances(
splitmainBalances: formatInternalTokenBalances(
gqlVestingModule.internalBalances,
),
warehouseBalances: formatInternalTokenBalances(
gqlVestingModule.warehouseBalances,
),
beneficiary: getAddress(gqlVestingModule.beneficiary.id),
vestingPeriod: parseInt(gqlVestingModule.vestingPeriod),
latestBlock: gqlVestingModule.latestBlock,
Expand Down
5 changes: 4 additions & 1 deletion packages/splits-sdk/src/subgraph/waterfall.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,12 @@ export const formatGqlWaterfallModule: (
? formatTokenBalances(gqlWaterfallModule.distributions)
: {},
token: getAddress(gqlWaterfallModule.token.id),
internalBalances: formatInternalTokenBalances(
splitmainBalances: formatInternalTokenBalances(
gqlWaterfallModule.internalBalances,
),
warehouseBalances: formatInternalTokenBalances(
gqlWaterfallModule.warehouseBalances,
),
latestBlock: gqlWaterfallModule.latestBlock,
latestActivity: parseInt(gqlWaterfallModule.latestActivity),
tranches: gqlWaterfallModule.tranches.map((gqlWaterfallTranche) =>
Expand Down
43 changes: 28 additions & 15 deletions packages/splits-sdk/src/utils/balances.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,12 @@ export const fetchERC20TransferredTokens = async (
// NOTE: this should never be called for a user, we only care about a user's
// balance in split main which is stored in subgraph
export const fetchActiveBalances: (
arg0: Address,
arg1: PublicClient,
arg2: Address[],
arg0: number,
arg1: Address,
arg2: PublicClient,
arg3: Address[],
) => Promise<FormattedTokenBalances> = async (
chainId,
accountAddress,
publicClient,
fullTokenList,
Expand All @@ -69,6 +71,7 @@ export const fetchActiveBalances: (
}),
])
processBalanceMulticallResponse(
chainId,
fullTokenList,
tokenData,
multicallResponse,
Expand All @@ -81,9 +84,14 @@ export const fetchActiveBalances: (
// NOTE: this should never be called for a user, we only care about a user's
// balance in split main which is stored in subgraph
export const fetchContractBalancesWithAlchemy: (
arg0: Address,
arg1: PublicClient,
) => Promise<FormattedTokenBalances> = async (address, rpcPublicClient) => {
arg0: number,
arg1: Address,
arg2: PublicClient,
) => Promise<FormattedTokenBalances> = async (
chainId,
address,
rpcPublicClient,
) => {
if (!isAlchemyPublicClient(rpcPublicClient))
throw new Error('Cannot call this without an alchemy provider')

Expand Down Expand Up @@ -120,8 +128,7 @@ export const fetchContractBalancesWithAlchemy: (
const results = await Promise.all(promisesArray)
if (!pageKey) {
const ethBalance = results[1] as bigint
// TODO: get correct symbol/decimals
const symbol = 'ETH'
const symbol = CHAIN_INFO[chainId]?.nativeCurrency.symbol ?? 'ETH'
const decimals = 18
const formattedAmount = fromBigIntToTokenValue(ethBalance, decimals)

Expand Down Expand Up @@ -201,20 +208,26 @@ const fetchTokenData: (
}

const processBalanceMulticallResponse: (
arg0: Address[],
arg1: TokenData,
arg2: MulticallReturnType,
arg3: FormattedTokenBalances,
) => void = (fullTokenList, tokenData, multicallResponse, balances) => {
arg0: number,
arg1: Address[],
arg2: TokenData,
arg3: MulticallReturnType,
arg4: FormattedTokenBalances,
) => void = (
chainId,
fullTokenList,
tokenData,
multicallResponse,
balances,
) => {
fullTokenList.map((token, index) => {
const data = multicallResponse[index]
const balance = data.result as bigint
if (balance === undefined) return

if (token === zeroAddress) {
// TODO: fix this for other networks
const decimals = 18
const symbol = 'ETH'
const symbol = CHAIN_INFO[chainId]?.nativeCurrency.symbol ?? 'ETH'
const formattedAmount = fromBigIntToTokenValue(balance, decimals)
balances[zeroAddress] = {
rawAmount: balance,
Expand Down
Loading