Skip to main content
Glama

write.account.set_asset_managers

Idempotent

Build unsigned transactions to configure asset managers for Arcadia Finance accounts, enabling automated rebalancing and yield optimization in a single operation.

Instructions

Build an unsigned setAssetManagers transaction from encoded intent args. Takes the { asset_managers, statuses, datas } arrays returned by write.asset_manager.* intent tools and builds a single unsigned tx targeting the account. To combine multiple automations in one tx, concatenate the arrays from multiple intent tool calls before passing them here. Example: to enable rebalancer + merkl_operator, call both intent tools, merge their arrays, then pass the merged arrays to this tool. Returns { transaction: { to, data, value, chainId } }.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
account_addressYesArcadia account address (V3 or V4)
asset_managersYesAsset manager addresses from intent tools
statusesYesEnable/disable flags from intent tools
datasYesEncoded callback data from intent tools (hex strings)
chain_idNoChain ID: 8453 (Base) or 130 (Unichain)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
descriptionYes
transactionYes
predicted_account_addressNo

Implementation Reference

  • The handler function that executes the logic for 'write.account.set_asset_managers', which validates inputs, encodes the setAssetManagers transaction data using the account ABI, and returns the transaction object.
        async (params) => {
          try {
            validateChainId(params.chain_id);
            const validAccount = validateAddress(params.account_address, "account_address");
    
            if (
              params.asset_managers.length !== params.statuses.length ||
              params.asset_managers.length !== params.datas.length
            ) {
              throw new Error(
                `Array lengths must match: asset_managers(${params.asset_managers.length}), statuses(${params.statuses.length}), datas(${params.datas.length})`,
              );
            }
    
            if (params.asset_managers.length === 0) {
              throw new Error("At least one asset manager must be provided");
            }
    
            const validAddresses = params.asset_managers.map((a, i) =>
              validateAddress(a, `asset_managers[${i}]`),
            );
    
            const data = appendDataSuffix(
              encodeFunctionData({
                abi: accountAbi,
                functionName: "setAssetManagers",
                args: [validAddresses, params.statuses, params.datas.map((d) => d as `0x${string}`)],
              }),
            );
    
            const result = {
              description: `Set ${params.asset_managers.length} asset manager(s) on account ${params.account_address}`,
              transaction: {
                to: validAccount,
                data,
                value: "0",
                chainId: params.chain_id,
              },
            };
    
            return {
              content: [
                {
                  type: "text" as const,
                  text: JSON.stringify(result, null, 2),
                },
              ],
              structuredContent: result,
            };
          } catch (err) {
            return {
              content: [
                {
                  type: "text" as const,
                  text: `Error: ${err instanceof Error ? err.message : String(err)}`,
                },
              ],
              isError: true,
            };
          }
        },
      );
    }
  • Registration function for the 'write.account.set_asset_managers' tool using the provided McpServer instance.
    export function registerSetAssetManagersTool(
      server: McpServer,
      _chains: Record<ChainId, ChainConfig>,
    ) {
      server.registerTool(
        "write.account.set_asset_managers",
        {
          annotations: {
            title: "Build Set Asset Managers Transaction",
            readOnlyHint: false,
            destructiveHint: false,
            idempotentHint: true,
            openWorldHint: false,
          },
          description:
            "Build an unsigned setAssetManagers transaction from encoded intent args. Takes the { asset_managers, statuses, datas } arrays returned by write.asset_manager.* intent tools and builds a single unsigned tx targeting the account. To combine multiple automations in one tx, concatenate the arrays from multiple intent tool calls before passing them here. Example: to enable rebalancer + merkl_operator, call both intent tools, merge their arrays, then pass the merged arrays to this tool. Returns { transaction: { to, data, value, chainId } }.",
          outputSchema: SimpleTransactionOutput,
          inputSchema: {
            account_address: z.string().describe("Arcadia account address (V3 or V4)"),
            asset_managers: z.array(z.string()).describe("Asset manager addresses from intent tools"),
            statuses: z.array(z.boolean()).describe("Enable/disable flags from intent tools"),
            datas: z
              .array(z.string())
              .describe("Encoded callback data from intent tools (hex strings)"),
            chain_id: z.number().default(8453).describe("Chain ID: 8453 (Base) or 130 (Unichain)"),
          },
        },
        async (params) => {
          try {
            validateChainId(params.chain_id);
            const validAccount = validateAddress(params.account_address, "account_address");
    
            if (
              params.asset_managers.length !== params.statuses.length ||
              params.asset_managers.length !== params.datas.length
            ) {
              throw new Error(
                `Array lengths must match: asset_managers(${params.asset_managers.length}), statuses(${params.statuses.length}), datas(${params.datas.length})`,
              );
            }
    
            if (params.asset_managers.length === 0) {
              throw new Error("At least one asset manager must be provided");
            }
    
            const validAddresses = params.asset_managers.map((a, i) =>
              validateAddress(a, `asset_managers[${i}]`),
            );
    
            const data = appendDataSuffix(
              encodeFunctionData({
                abi: accountAbi,
                functionName: "setAssetManagers",
                args: [validAddresses, params.statuses, params.datas.map((d) => d as `0x${string}`)],
              }),
            );
    
            const result = {
              description: `Set ${params.asset_managers.length} asset manager(s) on account ${params.account_address}`,
              transaction: {
                to: validAccount,
                data,
                value: "0",
                chainId: params.chain_id,
              },
            };
    
            return {
              content: [
                {
                  type: "text" as const,
                  text: JSON.stringify(result, null, 2),
                },
              ],
              structuredContent: result,
            };
          } catch (err) {
            return {
              content: [
                {
                  type: "text" as const,
                  text: `Error: ${err instanceof Error ? err.message : String(err)}`,
                },
              ],
              isError: true,
            };
          }
        },
      );
    }
  • Input schema definition for 'write.account.set_asset_managers', specifying the parameters like account_address, asset_managers, statuses, and datas.
    inputSchema: {
      account_address: z.string().describe("Arcadia account address (V3 or V4)"),
      asset_managers: z.array(z.string()).describe("Asset manager addresses from intent tools"),
      statuses: z.array(z.boolean()).describe("Enable/disable flags from intent tools"),
      datas: z
        .array(z.string())
        .describe("Encoded callback data from intent tools (hex strings)"),
      chain_id: z.number().default(8453).describe("Chain ID: 8453 (Base) or 130 (Unichain)"),
    },

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/arcadia-finance/arcadia-finance-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server