From 45199280cd13e0b20fdf771682a09ae68bbc94b6 Mon Sep 17 00:00:00 2001 From: Philippe d'Argent Date: Fri, 21 Mar 2025 00:19:04 +0100 Subject: [PATCH] added onchain reputation check --- README.md | 12 ++++++++++++ src/tools/index.ts | 2 ++ src/tools/reputation/handlers.ts | 22 ++++++++++++++++++++++ src/tools/reputation/index.ts | 10 ++++++++++ src/tools/reputation/schemas.ts | 7 +++++++ 5 files changed, 53 insertions(+) create mode 100644 src/tools/reputation/handlers.ts create mode 100644 src/tools/reputation/index.ts create mode 100644 src/tools/reputation/schemas.ts diff --git a/README.md b/README.md index 1f7a3db..f96b1c4 100644 --- a/README.md +++ b/README.md @@ -329,6 +329,18 @@ Example query to Claude: > "Buy $20 worth of OpenRouter credits." +### check_onchain_reputation + +Checks the CDP onchain reputation of an Ethereum address. + +Parameters: + +- `address`: The Ethereum address to check reputation for + +Example query to Claude: + +> "Check the onchain reputation of 0x1234567890abcdef1234567890abcdef12345678." + ## Security Considerations - The configuration file contains sensitive information (API keys and seed phrases). Ensure it's properly secured and not shared. diff --git a/src/tools/index.ts b/src/tools/index.ts index b254d32..08cf4c9 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -3,6 +3,7 @@ import { erc20BalanceTool, erc20TransferTool } from './erc20/index.js'; import { getMorphoVaultsTool } from './morpho/index.js'; import { getOnrampAssetsTool, onrampTool } from './onramp/index.js'; import { buyOpenRouterCreditsTool } from './open-router/index.js'; +import { checkReputationTool } from './reputation/index.js'; import type { ToolHandler, ToolWithHandler } from './types.js'; export const baseMcpTools: ToolWithHandler[] = [ @@ -13,6 +14,7 @@ export const baseMcpTools: ToolWithHandler[] = [ erc20BalanceTool, erc20TransferTool, buyOpenRouterCreditsTool, + checkReputationTool, ]; export const toolToHandler: Record = baseMcpTools.reduce< diff --git a/src/tools/reputation/handlers.ts b/src/tools/reputation/handlers.ts new file mode 100644 index 0000000..7e19e48 --- /dev/null +++ b/src/tools/reputation/handlers.ts @@ -0,0 +1,22 @@ +import { ExternalAddress } from '@coinbase/coinbase-sdk'; +import { isAddress } from 'viem'; +import type { PublicActions, WalletClient } from 'viem'; +import type { z } from 'zod'; +import { CheckReputationSchema } from './schemas.js'; + +export async function checkReputationHandler( + wallet: WalletClient & PublicActions, + args: z.infer, +): Promise { + const { address } = args; + + // Validate the address format + if (!isAddress(address, { strict: false })) { + throw new Error(`Invalid Ethereum address: ${address}`); + } + + const externalAddress = new ExternalAddress('base-mainnet', address); + const reputation = await externalAddress.reputation(); + + return `Reputation score: ${reputation.score}, Metadata: ${JSON.stringify(reputation.metadata)}`; +} diff --git a/src/tools/reputation/index.ts b/src/tools/reputation/index.ts new file mode 100644 index 0000000..ea8d531 --- /dev/null +++ b/src/tools/reputation/index.ts @@ -0,0 +1,10 @@ +import { generateTool } from '../../utils.js'; +import { checkReputationHandler } from './handlers.js'; +import { CheckReputationSchema } from './schemas.js'; + +export const checkReputationTool = generateTool({ + name: 'check_onchain_reputation', + description: 'Check the onchain reputation of an Ethereum address', + inputSchema: CheckReputationSchema, + toolHandler: checkReputationHandler, +}); diff --git a/src/tools/reputation/schemas.ts b/src/tools/reputation/schemas.ts new file mode 100644 index 0000000..e2849ee --- /dev/null +++ b/src/tools/reputation/schemas.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +export const CheckReputationSchema = z.object({ + address: z + .string() + .describe('The Ethereum address to check CDP onchain reputation for'), +});