diff --git a/sdk/armada-protocol-common/src/common/interfaces/IArmadaManagerGovernance.ts b/sdk/armada-protocol-common/src/common/interfaces/IArmadaManagerGovernance.ts index 4c054f2b84..47de45c914 100644 --- a/sdk/armada-protocol-common/src/common/interfaces/IArmadaManagerGovernance.ts +++ b/sdk/armada-protocol-common/src/common/interfaces/IArmadaManagerGovernance.ts @@ -104,4 +104,14 @@ export interface IArmadaManagerGovernance { * @returns The transaction information */ getUnstakeTx: (params: { amount: bigint }) => Promise<[UnstakeTransactionInfo]> + + /** + * @method getDelegationChainLength + * @description Returns the length of the delegation chain + * + * @param user The user + * + * @returns The length of the delegation chain + */ + getDelegationChainLength: (params: { user: IUser }) => Promise } diff --git a/sdk/armada-protocol-service/src/common/implementation/ArmadaManagerGovernance.ts b/sdk/armada-protocol-service/src/common/implementation/ArmadaManagerGovernance.ts index 075fc51cb0..c72ba75a22 100644 --- a/sdk/armada-protocol-service/src/common/implementation/ArmadaManagerGovernance.ts +++ b/sdk/armada-protocol-service/src/common/implementation/ArmadaManagerGovernance.ts @@ -237,4 +237,24 @@ export class ArmadaManagerGovernance implements IArmadaManagerGovernance { }, ] } + + async getDelegationChainLength( + params: Parameters[0], + ): ReturnType { + const client = this._blockchainClientProvider.getBlockchainClient({ + chainInfo: this._hubChainInfo, + }) + + const length = await client.readContract({ + abi: SummerTokenAbi, + address: this._hubChainSummerTokenAddress.value, + functionName: 'getDelegationChainLength', + args: [params.user.wallet.address.value], + }) + const num = Number(length.toString()) + if (!Number.isSafeInteger(num)) { + throw new Error('Delegation chain length exceeds safe integer limits') + } + return num + } } diff --git a/sdk/sdk-client/src/implementation/ArmadaManager/ArmadaManagerUsersClient.ts b/sdk/sdk-client/src/implementation/ArmadaManager/ArmadaManagerUsersClient.ts index 7f61ed6383..55d1bbef63 100644 --- a/sdk/sdk-client/src/implementation/ArmadaManager/ArmadaManagerUsersClient.ts +++ b/sdk/sdk-client/src/implementation/ArmadaManager/ArmadaManagerUsersClient.ts @@ -183,4 +183,10 @@ export class ArmadaManagerUsersClient extends IRPCClient implements IArmadaManag ): ReturnType { return this.rpcClient.armada.users.getUnstakeTX.query(params) } + + async getDelegationChainLength( + params: Parameters[0], + ): ReturnType { + return this.rpcClient.armada.users.getDelegationChainLength.query(params) + } } diff --git a/sdk/sdk-client/src/interfaces/ArmadaManager/IArmadaManagerUsersClient.ts b/sdk/sdk-client/src/interfaces/ArmadaManager/IArmadaManagerUsersClient.ts index 8f6ccc6814..1163eb20c7 100644 --- a/sdk/sdk-client/src/interfaces/ArmadaManager/IArmadaManagerUsersClient.ts +++ b/sdk/sdk-client/src/interfaces/ArmadaManager/IArmadaManagerUsersClient.ts @@ -332,4 +332,14 @@ export interface IArmadaManagerUsersClient { * @returns The transaction information */ getUnstakeTx(params: { amount: bigint }): Promise<[UnstakeTransactionInfo]> + + /** + * @method getDelegationChainLength + * @description Returns the length of the delegation chain + * + * @param user The user + * + * @returns The length of the delegation + */ + getDelegationChainLength: (params: { user: IUser }) => Promise } diff --git a/sdk/sdk-server/src/SDKAppRouter.ts b/sdk/sdk-server/src/SDKAppRouter.ts index c1083e1e7c..6f895f93b0 100644 --- a/sdk/sdk-server/src/SDKAppRouter.ts +++ b/sdk/sdk-server/src/SDKAppRouter.ts @@ -53,6 +53,7 @@ import { getUnstakeTx } from './armada-protocol-handlers/users/getUnstakeTx' import { getUserEarnedRewards } from './armada-protocol-handlers/users/getUserEarnedRewards' import { getUserBalance } from './armada-protocol-handlers/users/getUserBalance' import { getSummerToken } from './armada-protocol-handlers/users/getSummerToken' +import { getDelegationChainLength } from './armada-protocol-handlers/users/getDelegationChainLength' import { pong } from './handlers/debugPong' /** @@ -112,6 +113,7 @@ export const sdkAppRouter = router({ getUnstakeTX: getUnstakeTx, getUserBalance: getUserBalance, getSummerToken: getSummerToken, + getDelegationChainLength: getDelegationChainLength, }, keepers: { rebalance: rebalance, diff --git a/sdk/sdk-server/src/armada-protocol-handlers/users/getDelegationChainLength.ts b/sdk/sdk-server/src/armada-protocol-handlers/users/getDelegationChainLength.ts new file mode 100644 index 0000000000..cd0b7f40bc --- /dev/null +++ b/sdk/sdk-server/src/armada-protocol-handlers/users/getDelegationChainLength.ts @@ -0,0 +1,18 @@ +import { z } from 'zod' +import { publicProcedure } from '../../SDKTRPC' +import { isUser, type IUser } from '@summerfi/sdk-common' + +export const getDelegationChainLength = publicProcedure + .input( + z.object({ + user: z.custom(isUser), + }), + ) + .query(async (opts) => { + try { + return await opts.ctx.armadaManager.governance.getDelegationChainLength(opts.input) + } catch (error: unknown) { + console.error(`Failed to get delegation chain length for user ${opts.input.user}: ${error}`) + throw error instanceof Error ? error : new Error(String(error)) + } + })