From 9f6614770c6e703d7ba6eec96d8bd59a21ddaf6e Mon Sep 17 00:00:00 2001 From: Gonza Montiel Date: Tue, 2 Sep 2025 15:54:47 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20=20support=20updating=20the?= =?UTF-8?q?=20AVS=20dashboard=20metadata=20(#136)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Key changes - Add CLI command to update AVS metadata URI on-chain via `updateAVSMetadataURI` function. Use: - `bun cli contracts update-metadata --chain <...> --uri <...>` - Support for multiple chains (tipicaly holesky, hoodi, or a mainnet) - Tx confirmation and gas usage reporting --------- Co-authored-by: Steve Degosserie <723552+stiiifff@users.noreply.github.com> --- contracts/deployments/datahaven-logo.jpg | Bin 0 -> 9601 bytes contracts/deployments/datahaven-logo.png | Bin 0 -> 9601 bytes contracts/deployments/metadata.json | 7 ++ test/cli/handlers/contracts/.env.example | 4 +- test/cli/handlers/contracts/index.ts | 1 + .../cli/handlers/contracts/update-metadata.ts | 75 ++++++++++++++++++ test/cli/index.ts | 33 +++++++- 7 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 contracts/deployments/datahaven-logo.jpg create mode 100644 contracts/deployments/datahaven-logo.png create mode 100644 contracts/deployments/metadata.json create mode 100644 test/cli/handlers/contracts/update-metadata.ts diff --git a/contracts/deployments/datahaven-logo.jpg b/contracts/deployments/datahaven-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1a4e7f83a7664f17b1f6f76a7e2ce7b737fcea2 GIT binary patch literal 9601 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 I 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 I { + try { + // Load environment variables + const avsOwnerPrivateKey = process.env.AVS_OWNER_PRIVATE_KEY; + if (!avsOwnerPrivateKey) { + throw new Error("AVS_OWNER_PRIVATE_KEY environment variable is required"); + } + + // Get chain configuration + const deploymentParams = getChainDeploymentParams(chain); + logger.info(`🫎 Updating AVS metadata URI on ${chain} chain`); + logger.info(`Network: ${deploymentParams.network} (Chain ID: ${deploymentParams.chainId})`); + logger.info(`RPC URL: ${deploymentParams.rpcUrl}`); + logger.info(`New URI: ${uri}`); + + // Create wallet client for the AVS owner + const account = privateKeyToAccount(avsOwnerPrivateKey as `0x${string}`); + const walletClient = createWalletClient({ + account, + transport: http(deploymentParams.rpcUrl) + }); + + // Create public client for reading transaction receipts + const publicClient = createPublicClient({ + transport: http(deploymentParams.rpcUrl) + }); + + logger.info(`Using account: ${account.address}`); + + const deployments = await parseDeploymentsFile(chain); + const serviceManagerAddress = deployments.ServiceManager; + + logger.info(`ServiceManager contract address: ${serviceManagerAddress}`); + + // Call the updateAVSMetadataURI function + logger.info("📝 Calling updateAVSMetadataURI..."); + + const hash = await walletClient.writeContract({ + address: serviceManagerAddress, + abi: dataHavenServiceManagerAbi, + functionName: "updateAVSMetadataURI", + args: [uri], + chain: null + }); + + logger.info("✅ Transaction submitted successfully!"); + logger.info(`Transaction hash: ${hash}`); + + // Wait for transaction confirmation + logger.info("⏳ Waiting for transaction confirmation..."); + const receipt = await publicClient.waitForTransactionReceipt({ hash }); + + if (receipt.status === "success") { + logger.info(`✅ Transaction confirmed in block ${receipt.blockNumber}`); + logger.info(`Gas used: ${receipt.gasUsed}`); + } else { + logger.error("❌ Transaction failed"); + } + + printDivider(); + return hash; + } catch (error) { + logger.error(`❌ Failed to update AVS metadata URI: ${error}`); + throw error; + } +}; diff --git a/test/cli/index.ts b/test/cli/index.ts index 577db57b..68f708c8 100644 --- a/test/cli/index.ts +++ b/test/cli/index.ts @@ -11,7 +11,8 @@ import { launch, launchPreActionHook, stop, - stopPreActionHook + stopPreActionHook, + updateAVSMetadataURI } from "./handlers"; // Function to parse integer @@ -187,6 +188,7 @@ const contractsCommand = program - status: Show deployment plan, configuration, and status (default) - deploy: Deploy contracts to specified chain - verify: Verify deployed contracts on block explorer + - update-metadata: Update the metadata URI of an existing AVS contract Common options: --chain: Target chain (required: hoodi, holesky, mainnet) @@ -229,6 +231,35 @@ contractsCommand .hook("preAction", contractsPreActionHook) .action(contractsVerify); +// Contracts Update Metadata +contractsCommand + .command("update-metadata") + .description("Update AVS metadata URI for the DataHaven Service Manager") + .option("--chain ", "Target chain (hoodi, holesky, mainnet)") + .option("--uri ", "New metadata URI (required)") + .option("--reset", "Use if you want to reset the metadata URI") + .option("--rpc-url ", "Chain RPC URL (optional, defaults based on chain)") + .action(async (options: any, command: any) => { + // Try to get chain from options or command + let chain = options.chain; + if (!chain && command.parent) { + chain = command.parent.getOptionValue("chain"); + } + if (!chain) { + chain = command.getOptionValue("chain"); + } + if (!options.uri && !options.reset) { + throw new Error("--uri parameter is required"); + } + if (options.reset) { + options.uri = ""; + } + if (!chain) { + throw new Error("--chain parameter is required"); + } + await updateAVSMetadataURI(chain, options.uri); + }); + // Default Contracts command (runs check) contractsCommand .description("Show deployment plan, configuration, and status")