From ac7905b8efac08c28daacbf651ee1fc00f531d21 Mon Sep 17 00:00:00 2001 From: Sumbat Date: Thu, 2 Jan 2025 14:07:33 +0200 Subject: [PATCH] fix: smart register operator fn --- src/__tests__/contract-interaction.test.ts | 23 ++++++++++++++------- src/libs/operator/index.ts | 4 ++-- src/libs/operator/methods.ts | 24 +++++++++++++++++++++- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/__tests__/contract-interaction.test.ts b/src/__tests__/contract-interaction.test.ts index af1b652..c3a85ca 100644 --- a/src/__tests__/contract-interaction.test.ts +++ b/src/__tests__/contract-interaction.test.ts @@ -1,7 +1,10 @@ +import { globals } from '@/config' +import { mockFetchedOperators } from '@/mock' import { createMockConfig } from '@/mock/config' import { SSVSDK } from '@/sdk' +import { decodeOperatorPublicKey, roundOperatorFee } from '@/utils' import hre from 'hardhat' -import { CONFIG, initializeContract } from 'hardhat/contract-helpers' +import { initializeContract } from 'hardhat/contract-helpers' import { getAddress, parseEther } from 'viem' import { describe, expect, it } from 'vitest' @@ -24,15 +27,19 @@ describe('SSV Keys', async () => { ) it('can write to the SSVNetwork contract', async () => { + const yearlyFee = parseEther('1') + const blockFee = roundOperatorFee(yearlyFee / globals.BLOCKS_PER_YEAR) + const receipt = await sdk.operators .registerOperator({ args: { - publicKey: '0x10', - fee: CONFIG.minimalOperatorFee, - setPrivate: true, + publicKey: mockFetchedOperators[0].publicKey, // LS0tLS1CRUdJTiBSU0EgUFVCTElDIE.... + yearlyFee, // 1 ssv + isPrivate: true, }, }) .then((tx) => tx.wait()) + expect(receipt).toBeDefined() const operatorAddedEvent = receipt.events.find( @@ -44,9 +51,11 @@ describe('SSV Keys', async () => { } => event.eventName === 'OperatorAdded', ) expect(operatorAddedEvent).toBeDefined() - expect(operatorAddedEvent?.args.operatorId).toBe(1n) - expect(operatorAddedEvent?.args.publicKey).toBe('0x10') - expect(operatorAddedEvent?.args.fee).toBe(CONFIG.minimalOperatorFee) + expect(operatorAddedEvent!.args.operatorId).toBe(1n) + expect(decodeOperatorPublicKey(operatorAddedEvent!.args.publicKey)).toBe( + mockFetchedOperators[0].publicKey, + ) + expect(operatorAddedEvent?.args.fee).toBe(blockFee) expect(operatorAddedEvent?.args.owner).toBe( getAddress(sdk.config.walletClient.account!.address), ) diff --git a/src/libs/operator/index.ts b/src/libs/operator/index.ts index a0b2ef5..6ae399c 100644 --- a/src/libs/operator/index.ts +++ b/src/libs/operator/index.ts @@ -1,9 +1,9 @@ import type { ConfigReturnType } from '@/config/create' -import { setOperatorWhitelists, withdraw } from '@/libs/operator/methods' +import { registerOperator, setOperatorWhitelists, withdraw } from '@/libs/operator/methods' import type { RemoveConfigArg } from '@/types/methods' export const createOperatorManager = (config: ConfigReturnType) => ({ - registerOperator: config.contract.ssv.write.registerOperator, + registerOperator: registerOperator.bind(null, config) as RemoveConfigArg, removeOperator: config.contract.ssv.write.removeOperator, withdraw: withdraw.bind(null, config) as RemoveConfigArg, setOperatorWhitelists: config.contract.ssv.write.setOperatorsWhitelists, diff --git a/src/libs/operator/methods.ts b/src/libs/operator/methods.ts index adaa071..33b6e91 100644 --- a/src/libs/operator/methods.ts +++ b/src/libs/operator/methods.ts @@ -1,8 +1,10 @@ import type { getOperator } from '@/api/subgraph' +import { globals } from '@/config' import type { ConfigReturnType } from '@/config/create' import type { SmartFnWriteOptions } from '@/contract-interactions/types' +import { roundOperatorFee } from '@/utils' import type { Address } from 'abitype' -import { isAddressEqual, zeroAddress } from 'viem' +import { encodeAbiParameters, isAddressEqual, parseAbiParameters, zeroAddress } from 'viem' type WithdrawArgs = SmartFnWriteOptions<{ operatorId: string @@ -36,6 +38,26 @@ export const withdraw = async ( }) } +type RegisterOperatorArgs = SmartFnWriteOptions<{ + isPrivate: boolean + yearlyFee: bigint + publicKey: string +}> + +export const registerOperator = async ( + config: ConfigReturnType, + { args: { isPrivate, yearlyFee, publicKey }, ...writeOptions }: RegisterOperatorArgs, +) => { + return config.contract.ssv.write.registerOperator({ + args: { + publicKey: encodeAbiParameters(parseAbiParameters('string'), [publicKey]), + fee: roundOperatorFee(yearlyFee / globals.BLOCKS_PER_YEAR), + setPrivate: isPrivate, + }, + ...writeOptions, + }) +} + type SetOperatorWhitelistsArgs = SmartFnWriteOptions<{ operatorIds: string[] contractAddress: Address