diff --git a/.env.example b/.env.example index 5fea60a9374..7ec5d956b8b 100644 --- a/.env.example +++ b/.env.example @@ -130,10 +130,10 @@ STARKNET_RPC_URL= # Intiface Configuration INTIFACE_WEBSOCKET_URL=ws://localhost:12345 -# Farcaster -FARCASTER_HUB_URL= -FARCASTER_FID= -FARCASTER_PRIVATE_KEY= +# Farcaster Neynar Configuration +FARCASTER_FID= # the FID associated with the account your are sending casts from +FARCASTER_NEYNAR_API_KEY= # Neynar API key: https://neynar.com/ +FARCASTER_NEYNAR_SIGNER_UUID= # signer for the account you are sending casts from. create a signer here: https://dev.neynar.com/app # Coinbase COINBASE_COMMERCE_KEY= # from coinbase developer portal diff --git a/agent/package.json b/agent/package.json index 1a70f667f76..53eba22710f 100644 --- a/agent/package.json +++ b/agent/package.json @@ -22,6 +22,7 @@ "@ai16z/client-auto": "workspace:*", "@ai16z/client-direct": "workspace:*", "@ai16z/client-discord": "workspace:*", + "@ai16z/client-farcaster": "workspace:*", "@ai16z/client-telegram": "workspace:*", "@ai16z/client-twitter": "workspace:*", "@ai16z/eliza": "workspace:*", diff --git a/agent/src/index.ts b/agent/src/index.ts index c2174f2903f..34faceb9b78 100644 --- a/agent/src/index.ts +++ b/agent/src/index.ts @@ -5,6 +5,7 @@ import { DirectClientInterface } from "@ai16z/client-direct"; import { DiscordClientInterface } from "@ai16z/client-discord"; import { TelegramClientInterface } from "@ai16z/client-telegram"; import { TwitterClientInterface } from "@ai16z/client-twitter"; +import { FarcasterAgentClient } from "@ai16z/client-farcaster"; import { AgentRuntime, CacheManager, @@ -322,6 +323,12 @@ export async function initializeClients( clients.push(twitterClients); } + if (clientTypes.includes("farcaster")) { + const farcasterClients = new FarcasterAgentClient(runtime); + farcasterClients.start(); + clients.push(farcasterClients); + } + if (character.plugins?.length > 0) { for (const plugin of character.plugins) { if (plugin.clients) { diff --git a/packages/client-farcaster/package.json b/packages/client-farcaster/package.json index 3c80d711c95..8ad0e431708 100644 --- a/packages/client-farcaster/package.json +++ b/packages/client-farcaster/package.json @@ -6,11 +6,10 @@ "types": "dist/index.d.ts", "dependencies": { "@ai16z/eliza": "workspace:*", - "@farcaster/hub-nodejs": "0.12.7", - "viem": "2.21.53" + "@neynar/nodejs-sdk": "^2.0.3" }, "devDependencies": { - "tsup": "8.3.5" + "tsup": "^8.3.5" }, "scripts": { "build": "tsup --format esm --dts", diff --git a/packages/client-farcaster/pnpm-lock.yaml b/packages/client-farcaster/pnpm-lock.yaml new file mode 100644 index 00000000000..3ed01a948fa --- /dev/null +++ b/packages/client-farcaster/pnpm-lock.yaml @@ -0,0 +1,1478 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@farcaster/hub-nodejs': + specifier: ^0.12.7 + version: 0.12.7(zod@3.23.8) + viem: + specifier: ^2.21.47 + version: 2.21.49(zod@3.23.8) + devDependencies: + tsup: + specifier: ^8.3.5 + version: 8.3.5(postcss@8.4.49)(yaml@2.6.1) + +packages: + + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@faker-js/faker@7.6.0': + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + + '@farcaster/core@0.15.6': + resolution: {integrity: sha512-Vxq2JhqdZYEMjH4PIwPXQkalY46S4Mol2oCSHUafXenDx6WSoQJqF/4an4KyxGQbmA7Cf8+hl6zuNzkkHXEUyQ==} + + '@farcaster/hub-nodejs@0.12.7': + resolution: {integrity: sha512-05zXNqnHRBSbOkHl0KDh6l60nHK5MiKFky0JBGbdOZXdkFCk4FIiHv9AGLxjFXr/FxA3jSTHUJfvRRe5TonjRw==} + + '@grpc/grpc-js@1.11.3': + resolution: {integrity: sha512-i9UraDzFHMR+Iz/MhFLljT+fCpgxZ3O6CxwGJ8YuNYHJItIHUzKJpW2LvoFZNnGPwqc9iWy9RAucxV0JoR9aUQ==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.13': + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + engines: {node: '>=6'} + hasBin: true + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@noble/curves@1.6.0': + resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.7.0': + resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.6.0': + resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + engines: {node: ^14.21.3 || >=16} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@rollup/rollup-android-arm-eabi@4.27.4': + resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.27.4': + resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.27.4': + resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.27.4': + resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.27.4': + resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.27.4': + resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': + resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.27.4': + resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.27.4': + resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.27.4': + resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': + resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.27.4': + resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.27.4': + resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.27.4': + resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.27.4': + resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.27.4': + resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.27.4': + resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.27.4': + resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} + cpu: [x64] + os: [win32] + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/bip32@1.5.0': + resolution: {integrity: sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==} + + '@scure/bip39@1.4.0': + resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/node@22.9.3': + resolution: {integrity: sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==} + + abitype@1.0.6: + resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@4.0.0: + resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + + bundle-require@5.0.0: + resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neverthrow@6.2.2: + resolution: {integrity: sha512-POR1FACqdK9jH0S2kRPzaZEvzT11wsOxLW520PQV/+vKi9dQe+hXq19EiOvYx7lSRaF5VB9lYGsPInynrnN05w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + ox@0.1.2: + resolution: {integrity: sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + protobufjs@7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + engines: {node: '>=12.0.0'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + rollup@4.27.4: + resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsup@8.3.5: + resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + viem@2.21.49: + resolution: {integrity: sha512-NNItYfTv4+yGE5DDKc+S/g2S7KeJn047GwgEYG60FAJlK0FzwuP6lQKSeQ8k7Y4VasfuKPqiT+XiilcCtTRiDQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + webauthn-p256@0.0.10: + resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + +snapshots: + + '@adraffy/ens-normalize@1.11.0': {} + + '@esbuild/aix-ppc64@0.24.0': + optional: true + + '@esbuild/android-arm64@0.24.0': + optional: true + + '@esbuild/android-arm@0.24.0': + optional: true + + '@esbuild/android-x64@0.24.0': + optional: true + + '@esbuild/darwin-arm64@0.24.0': + optional: true + + '@esbuild/darwin-x64@0.24.0': + optional: true + + '@esbuild/freebsd-arm64@0.24.0': + optional: true + + '@esbuild/freebsd-x64@0.24.0': + optional: true + + '@esbuild/linux-arm64@0.24.0': + optional: true + + '@esbuild/linux-arm@0.24.0': + optional: true + + '@esbuild/linux-ia32@0.24.0': + optional: true + + '@esbuild/linux-loong64@0.24.0': + optional: true + + '@esbuild/linux-mips64el@0.24.0': + optional: true + + '@esbuild/linux-ppc64@0.24.0': + optional: true + + '@esbuild/linux-riscv64@0.24.0': + optional: true + + '@esbuild/linux-s390x@0.24.0': + optional: true + + '@esbuild/linux-x64@0.24.0': + optional: true + + '@esbuild/netbsd-x64@0.24.0': + optional: true + + '@esbuild/openbsd-arm64@0.24.0': + optional: true + + '@esbuild/openbsd-x64@0.24.0': + optional: true + + '@esbuild/sunos-x64@0.24.0': + optional: true + + '@esbuild/win32-arm64@0.24.0': + optional: true + + '@esbuild/win32-ia32@0.24.0': + optional: true + + '@esbuild/win32-x64@0.24.0': + optional: true + + '@faker-js/faker@7.6.0': {} + + '@farcaster/core@0.15.6(zod@3.23.8)': + dependencies: + '@faker-js/faker': 7.6.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.0 + bs58: 5.0.0 + neverthrow: 6.2.2 + viem: 2.21.49(zod@3.23.8) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@farcaster/hub-nodejs@0.12.7(zod@3.23.8)': + dependencies: + '@farcaster/core': 0.15.6(zod@3.23.8) + '@grpc/grpc-js': 1.11.3 + '@noble/hashes': 1.6.0 + neverthrow: 6.2.2 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@grpc/grpc-js@1.11.3': + dependencies: + '@grpc/proto-loader': 0.7.13 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.13': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.4.0 + yargs: 17.7.2 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@noble/curves@1.6.0': + dependencies: + '@noble/hashes': 1.5.0 + + '@noble/curves@1.7.0': + dependencies: + '@noble/hashes': 1.6.0 + + '@noble/hashes@1.5.0': {} + + '@noble/hashes@1.6.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@rollup/rollup-android-arm-eabi@4.27.4': + optional: true + + '@rollup/rollup-android-arm64@4.27.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.27.4': + optional: true + + '@rollup/rollup-darwin-x64@4.27.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.27.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.27.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.27.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.27.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.27.4': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.27.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.27.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.27.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.27.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.27.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.27.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.27.4': + optional: true + + '@scure/base@1.1.9': {} + + '@scure/bip32@1.5.0': + dependencies: + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.4.0': + dependencies: + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 + + '@types/estree@1.0.6': {} + + '@types/node@22.9.3': + dependencies: + undici-types: 6.19.8 + + abitype@1.0.6(zod@3.23.8): + optionalDependencies: + zod: 3.23.8 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + balanced-match@1.0.2: {} + + base-x@4.0.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + bs58@5.0.0: + dependencies: + base-x: 4.0.0 + + bundle-require@5.0.0(esbuild@0.24.0): + dependencies: + esbuild: 0.24.0 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + chokidar@4.0.1: + dependencies: + readdirp: 4.0.2 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@4.1.1: {} + + consola@3.2.3: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + esbuild@0.24.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 + + escalade@3.2.0: {} + + eventemitter3@5.0.1: {} + + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fsevents@2.3.3: + optional: true + + get-caller-file@2.0.5: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + is-fullwidth-code-point@3.0.0: {} + + isexe@2.0.0: {} + + isows@1.0.6(ws@8.18.0): + dependencies: + ws: 8.18.0 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + joycon@3.1.1: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + lodash.camelcase@4.3.0: {} + + lodash.sortby@4.7.0: {} + + long@5.2.3: {} + + lru-cache@10.4.3: {} + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: + optional: true + + neverthrow@6.2.2: {} + + object-assign@4.1.1: {} + + ox@0.1.2(zod@3.23.8): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@scure/bip32': 1.5.0 + '@scure/bip39': 1.4.0 + abitype: 1.0.6(zod@3.23.8) + eventemitter3: 5.0.1 + transitivePeerDependencies: + - zod + + package-json-from-dist@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + picocolors@1.1.1: {} + + picomatch@4.0.2: {} + + pirates@4.0.6: {} + + postcss-load-config@6.0.1(postcss@8.4.49)(yaml@2.6.1): + dependencies: + lilconfig: 3.1.2 + optionalDependencies: + postcss: 8.4.49 + yaml: 2.6.1 + + postcss@8.4.49: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + optional: true + + protobufjs@7.4.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.9.3 + long: 5.2.3 + + punycode@2.3.1: {} + + readdirp@4.0.2: {} + + require-directory@2.1.1: {} + + resolve-from@5.0.0: {} + + rollup@4.27.4: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.27.4 + '@rollup/rollup-android-arm64': 4.27.4 + '@rollup/rollup-darwin-arm64': 4.27.4 + '@rollup/rollup-darwin-x64': 4.27.4 + '@rollup/rollup-freebsd-arm64': 4.27.4 + '@rollup/rollup-freebsd-x64': 4.27.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.27.4 + '@rollup/rollup-linux-arm-musleabihf': 4.27.4 + '@rollup/rollup-linux-arm64-gnu': 4.27.4 + '@rollup/rollup-linux-arm64-musl': 4.27.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4 + '@rollup/rollup-linux-riscv64-gnu': 4.27.4 + '@rollup/rollup-linux-s390x-gnu': 4.27.4 + '@rollup/rollup-linux-x64-gnu': 4.27.4 + '@rollup/rollup-linux-x64-musl': 4.27.4 + '@rollup/rollup-win32-arm64-msvc': 4.27.4 + '@rollup/rollup-win32-ia32-msvc': 4.27.4 + '@rollup/rollup-win32-x64-msvc': 4.27.4 + fsevents: 2.3.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: + optional: true + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinyexec@0.3.1: {} + + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + ts-interface-checker@0.1.13: {} + + tsup@8.3.5(postcss@8.4.49)(yaml@2.6.1): + dependencies: + bundle-require: 5.0.0(esbuild@0.24.0) + cac: 6.7.14 + chokidar: 4.0.1 + consola: 3.2.3 + debug: 4.3.7 + esbuild: 0.24.0 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.4.49)(yaml@2.6.1) + resolve-from: 5.0.0 + rollup: 4.27.4 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.1 + tinyglobby: 0.2.10 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.4.49 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + undici-types@6.19.8: {} + + viem@2.21.49(zod@3.23.8): + dependencies: + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@scure/bip32': 1.5.0 + '@scure/bip39': 1.4.0 + abitype: 1.0.6(zod@3.23.8) + isows: 1.0.6(ws@8.18.0) + ox: 0.1.2(zod@3.23.8) + webauthn-p256: 0.0.10 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + webauthn-p256@0.0.10: + dependencies: + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + + webidl-conversions@4.0.2: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + ws@8.18.0: {} + + y18n@5.0.8: {} + + yaml@2.6.1: + optional: true + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + zod@3.23.8: + optional: true diff --git a/packages/client-farcaster/src/actions.ts b/packages/client-farcaster/src/actions.ts index b141d268553..9aca9d40d8f 100644 --- a/packages/client-farcaster/src/actions.ts +++ b/packages/client-farcaster/src/actions.ts @@ -1,8 +1,6 @@ -import { CastId, FarcasterNetwork, Signer } from "@farcaster/hub-nodejs"; -import { CastType, makeCastAdd } from "@farcaster/hub-nodejs"; import type { FarcasterClient } from "./client"; import type { Content, IAgentRuntime, Memory, UUID } from "@ai16z/eliza"; -import type { Cast, Profile } from "./types"; +import type { Cast, CastId, Profile } from "./types"; import { createCastMemory } from "./memory"; import { splitPostContent } from "./utils"; @@ -12,7 +10,6 @@ export async function sendCast({ content, roomId, inReplyTo, - signer, profile, }: { profile: Profile; @@ -20,7 +17,7 @@ export async function sendCast({ runtime: IAgentRuntime; content: Content; roomId: UUID; - signer: Signer; + signerUuid: string; inReplyTo?: CastId; }): Promise<{ memory: Memory; cast: Cast }[]> { const chunks = splitPostContent(content.text); @@ -28,43 +25,25 @@ export async function sendCast({ let parentCastId = inReplyTo; for (const chunk of chunks) { - const castAddMessageResult = await makeCastAdd( - { - text: chunk, - embeds: [], - embedsDeprecated: [], - mentions: [], - mentionsPositions: [], - type: CastType.CAST, // TODO: check CastType.LONG_CAST - parentCastId, - }, - { - fid: profile.fid, - network: FarcasterNetwork.MAINNET, - }, - signer - ); - - if (castAddMessageResult.isErr()) { - throw castAddMessageResult.error; + const neynarCast = await client.publishCast(chunk, parentCastId); + + if (neynarCast) { + const cast: Cast = { + hash: neynarCast.hash, + authorFid: neynarCast.authorFid, + text: neynarCast.text, + profile, + inReplyTo: parentCastId, + timestamp: new Date(), + }; + + sent.push(cast!); + + parentCastId = { + fid: neynarCast?.authorFid!, + hash: neynarCast?.hash!, + }; } - - await client.submitMessage(castAddMessageResult.value); - - const cast = await client.loadCastFromMessage( - castAddMessageResult.value - ); - - sent.push(cast); - - parentCastId = { - fid: cast.profile.fid, - hash: cast.message.hash, - }; - - // TODO: check rate limiting - // Wait a bit between tweets to avoid rate limiting issues - // await wait(1000, 2000); } return sent.map((cast) => ({ diff --git a/packages/client-farcaster/src/client.ts b/packages/client-farcaster/src/client.ts index 4c35bbf9893..9aa780dc4f1 100644 --- a/packages/client-farcaster/src/client.ts +++ b/packages/client-farcaster/src/client.ts @@ -1,116 +1,171 @@ import { IAgentRuntime } from "@ai16z/eliza"; -import { - CastAddMessage, - CastId, - FidRequest, - getInsecureHubRpcClient, - getSSLHubRpcClient, - HubRpcClient, - isCastAddMessage, - isUserDataAddMessage, - Message, - MessagesResponse, -} from "@farcaster/hub-nodejs"; -import { Cast, Profile } from "./types"; -import { toHex } from "viem"; -import { populateMentions } from "./utils"; +import { NeynarAPIClient, isApiErrorResponse } from "@neynar/nodejs-sdk"; +import { NeynarCastResponse, Cast, Profile, FidRequest, CastId } from "./types"; export class FarcasterClient { runtime: IAgentRuntime; - farcaster: HubRpcClient; - + neynar: NeynarAPIClient; + signerUuid: string; cache: Map; + lastInteractionTimestamp: Date; constructor(opts: { runtime: IAgentRuntime; url: string; ssl: boolean; + neynar: NeynarAPIClient; + signerUuid: string; cache: Map; }) { this.cache = opts.cache; this.runtime = opts.runtime; - this.farcaster = opts.ssl - ? getSSLHubRpcClient(opts.url) - : getInsecureHubRpcClient(opts.url); - } - - async submitMessage(cast: Message, retryTimes?: number): Promise { - const result = await this.farcaster.submitMessage(cast); - - if (result.isErr()) { - throw result.error; - } + this.neynar = opts.neynar; + this.signerUuid = opts.signerUuid; + this.lastInteractionTimestamp = new Date(); } - async loadCastFromMessage(message: CastAddMessage): Promise { - const profileMap = {}; - - const profile = await this.getProfile(message.data.fid); - - profileMap[message.data.fid] = profile; - - for (const mentionId of message.data.castAddBody.mentions) { - if (profileMap[mentionId]) continue; - profileMap[mentionId] = await this.getProfile(mentionId); - } - - const text = populateMentions( - message.data.castAddBody.text, - message.data.castAddBody.mentions, - message.data.castAddBody.mentionsPositions, - profileMap - ); - + async loadCastFromNeynarResponse(neynarResponse: any): Promise { + const profile = await this.getProfile(neynarResponse.author.fid); return { - id: toHex(message.hash), - message, - text, + hash: neynarResponse.hash, + authorFid: neynarResponse.author.fid, + text: neynarResponse.text, profile, + ...(neynarResponse.parent_hash + ? { + inReplyTo: { + hash: neynarResponse.parent_hash, + fid: neynarResponse.parent_author.fid, + }, + } + : {}), + timestamp: new Date(neynarResponse.timestamp), }; } - async getCast(castId: CastId): Promise { - const castHash = toHex(castId.hash); + async publishCast( + cast: string, + parentCastId: CastId | undefined, + retryTimes?: number + ): Promise { + try { + const result = await this.neynar.publishCast({ + signerUuid: this.signerUuid, + text: cast, + parent: parentCastId?.hash, + }); + if (result.success) { + return { + hash: result.cast.hash, + authorFid: result.cast.author.fid, + text: result.cast.text, + }; + } + } catch (err) { + if (isApiErrorResponse(err)) { + console.log(err.response.data); + throw err.response.data; + } else { + throw err; + console.log(err); + } + } + } + async getCast(castHash: string): Promise { if (this.cache.has(`farcaster/cast/${castHash}`)) { return this.cache.get(`farcaster/cast/${castHash}`); } - const cast = await this.farcaster.getCast(castId); - - if (cast.isErr()) { - throw cast.error; - } + const response = await this.neynar.lookupCastByHashOrWarpcastUrl({ + identifier: castHash, + type: "hash", + }); + const cast = { + hash: response.cast.hash, + //parentHash: cast.parent_hash, + authorFid: response.cast.author.fid, + text: response.cast.text, + profile: { + fid: response.cast.author.fid, + name: response.cast.author.display_name || "anon", + username: response.cast.author.username, + }, + ...(response.cast.parent_hash + ? { + inReplyTo: { + hash: response.cast.parent_hash, + fid: response.cast.parent_author.fid, + }, + } + : {}), + timestamp: new Date(response.cast.timestamp), + }; this.cache.set(`farcaster/cast/${castHash}`, cast); - return cast.value; + return cast; } - async getCastsByFid(request: FidRequest): Promise { - const cast = await this.farcaster.getCastsByFid(request); - if (cast.isErr()) { - throw cast.error; - } + async getCastsByFid(request: FidRequest): Promise { + const timeline: Cast[] = []; - cast.value.messages.map((cast) => { - this.cache.set(`farcaster/cast/${toHex(cast.hash)}`, cast); + const response = await this.neynar.fetchCastsForUser({ + fid: request.fid, + limit: request.pageSize, + }); + //console.log(response); + response.casts.map((cast) => { + this.cache.set(`farcaster/cast/${cast.hash}`, cast); + timeline.push({ + hash: cast.hash, + //parentHash: cast.parent_hash, + authorFid: cast.author.fid, + text: cast.text, + profile: { + fid: cast.author.fid, + name: cast.author.display_name || "anon", + username: cast.author.username, + }, + timestamp: new Date(cast.timestamp), + }); }); - return cast.value; + return timeline; } - async getMentions(request: FidRequest): Promise { - const cast = await this.farcaster.getCastsByMention(request); - if (cast.isErr()) { - throw cast.error; - } - - cast.value.messages.map((cast) => { - this.cache.set(`farcaster/cast/${toHex(cast.hash)}`, cast); + async getMentions(request: FidRequest): Promise { + const neynarMentionsResponse = await this.neynar.fetchAllNotifications({ + fid: request.fid, + type: ["mentions", "replies"], + }); + const mentions: Cast[] = []; + + neynarMentionsResponse.notifications.map((notification) => { + const cast = { + hash: notification.cast!.hash, + authorFid: notification.cast!.author.fid, + text: notification.cast!.text, + profile: { + fid: notification.cast!.author.fid, + name: notification.cast!.author.display_name || "anon", + username: notification.cast!.author.username, + }, + ...(notification.cast!.parent_hash + ? { + inReplyTo: { + hash: notification.cast!.parent_hash, + fid: notification.cast!.parent_author.fid, + }, + } + : {}), + timestamp: new Date(notification.cast!.timestamp), + }; + mentions.push(cast); + this.cache.set(`farcaster/cast/${cast.hash}`, cast); }); - return cast.value; + return mentions; } async getProfile(fid: number): Promise { @@ -118,19 +173,18 @@ export class FarcasterClient { return this.cache.get(`farcaster/profile/${fid}`) as Profile; } - const result = await this.farcaster.getUserDataByFid({ - fid: fid, - reverse: true, - }); + const result = await this.neynar.fetchBulkUsers({ fids: [fid] }); + if (!result.users || result.users.length < 1) { + console.log("getUserDataByFid ERROR"); - if (result.isErr()) { - throw result.error; + throw "getUserDataByFid ERROR"; } + const neynarUserProfile = result.users[0]; + const profile: Profile = { fid, name: "", - signer: "0x", username: "", }; @@ -145,21 +199,10 @@ export class FarcasterClient { // 9: "github", } as const; - for (const message of result.value.messages) { - if (isUserDataAddMessage(message)) { - if (message.data.userDataBody.type in userDataBodyType) { - const prop = - userDataBodyType[message.data.userDataBody.type]; - profile[prop] = message.data.userDataBody.value; - } - } - } - - const [lastMessage] = result.value.messages; - - if (lastMessage) { - profile.signer = toHex(lastMessage.signer); - } + profile.name = neynarUserProfile.display_name!; + profile.username = neynarUserProfile.username; + profile.bio = neynarUserProfile.profile.bio.text; + profile.pfp = neynarUserProfile.pfp_url; this.cache.set(`farcaster/profile/${fid}`, profile); @@ -174,20 +217,15 @@ export class FarcasterClient { const results = await this.getCastsByFid(request); - for (const message of results.messages) { - if (isCastAddMessage(message)) { - this.cache.set( - `farcaster/cast/${toHex(message.hash)}`, - message - ); - - timeline.push(await this.loadCastFromMessage(message)); - } + for (const cast of results) { + this.cache.set(`farcaster/cast/${cast.hash}`, cast); + timeline.push(cast); } return { timeline, - nextPageToken: results.nextPageToken, + //TODO implement paging + //nextPageToken: results.nextPageToken, }; } } diff --git a/packages/client-farcaster/src/index.ts b/packages/client-farcaster/src/index.ts index dfbe5b4e329..43d14b5ab3b 100644 --- a/packages/client-farcaster/src/index.ts +++ b/packages/client-farcaster/src/index.ts @@ -1,16 +1,15 @@ -import { Client, IAgentRuntime } from "@ai16z/eliza"; -import { Signer, NobleEd25519Signer } from "@farcaster/hub-nodejs"; -import { Hex, hexToBytes } from "viem"; +import { Client, IAgentRuntime, elizaLogger } from "@ai16z/eliza"; import { FarcasterClient } from "./client"; import { FarcasterPostManager } from "./post"; import { FarcasterInteractionManager } from "./interactions"; +import { Configuration, NeynarAPIClient } from "@neynar/nodejs-sdk"; export class FarcasterAgentClient implements Client { client: FarcasterClient; posts: FarcasterPostManager; interactions: FarcasterInteractionManager; - private signer: Signer; + private signerUuid: string; constructor( public runtime: IAgentRuntime, @@ -18,9 +17,13 @@ export class FarcasterAgentClient implements Client { ) { const cache = new Map(); - this.signer = new NobleEd25519Signer( - hexToBytes(runtime.getSetting("FARCASTER_PRIVATE_KEY")! as Hex) - ); + this.signerUuid = runtime.getSetting("FARCASTER_NEYNAR_SIGNER_UUID")!; + + const neynarConfig = new Configuration({ + apiKey: runtime.getSetting("FARCASTER_NEYNAR_API_KEY")!, + }); + + const neynarClient = new NeynarAPIClient(neynarConfig); this.client = client ?? @@ -30,20 +33,24 @@ export class FarcasterAgentClient implements Client { url: runtime.getSetting("FARCASTER_HUB_URL") ?? "hub.pinata.cloud", + neynar: neynarClient, + signerUuid: this.signerUuid, cache, }); + elizaLogger.info("Farcaster Neynar client initialized.") + this.posts = new FarcasterPostManager( this.client, this.runtime, - this.signer, + this.signerUuid, cache ); this.interactions = new FarcasterInteractionManager( this.client, this.runtime, - this.signer, + this.signerUuid, cache ); } diff --git a/packages/client-farcaster/src/interactions.ts b/packages/client-farcaster/src/interactions.ts index f48b49dbb14..65c5c308aeb 100644 --- a/packages/client-farcaster/src/interactions.ts +++ b/packages/client-farcaster/src/interactions.ts @@ -7,7 +7,6 @@ import { stringToUuid, type IAgentRuntime, } from "@ai16z/eliza"; -import { isCastAddMessage, type Signer } from "@farcaster/hub-nodejs"; import type { FarcasterClient } from "./client"; import { toHex } from "viem"; import { buildConversationThread, createCastMemory } from "./memory"; @@ -26,7 +25,7 @@ export class FarcasterInteractionManager { constructor( public client: FarcasterClient, public runtime: IAgentRuntime, - private signer: Signer, + private signerUuid: string, public cache: Map ) {} @@ -55,39 +54,46 @@ export class FarcasterInteractionManager { private async handleInteractions() { const agentFid = Number(this.runtime.getSetting("FARCASTER_FID")); - const { messages } = await this.client.getMentions({ + const mentions = await this.client.getMentions({ fid: agentFid, + pageSize: 10, }); const agent = await this.client.getProfile(agentFid); - - for (const mention of messages) { - if (!isCastAddMessage(mention)) continue; - + for (const mention of mentions) { const messageHash = toHex(mention.hash); - const messageSigner = toHex(mention.signer); const conversationId = `${messageHash}-${this.runtime.agentId}`; const roomId = stringToUuid(conversationId); - const userId = stringToUuid(messageSigner); + const userId = stringToUuid(mention.authorFid.toString()); + + const pastMemoryId = castUuid({ + agentId: this.runtime.agentId, + hash: mention.hash, + }); + + const pastMemory = + await this.runtime.messageManager.getMemoryById(pastMemoryId); - const cast = await this.client.loadCastFromMessage(mention); + if (pastMemory) { + continue; + } await this.runtime.ensureConnection( userId, roomId, - cast.profile.username, - cast.profile.name, + mention.profile.username, + mention.profile.name, "farcaster" ); - await buildConversationThread({ + const thread = await buildConversationThread({ client: this.client, runtime: this.runtime, - cast, + cast: mention, }); const memory: Memory = { - content: { text: mention.data.castAddBody.text }, + content: { text: mention.text }, agentId: this.runtime.agentId, userId, roomId, @@ -95,28 +101,33 @@ export class FarcasterInteractionManager { await this.handleCast({ agent, - cast, + cast: mention, memory, + thread }); } + + this.client.lastInteractionTimestamp = new Date(); } private async handleCast({ agent, cast, memory, + thread }: { agent: Profile; cast: Cast; memory: Memory; + thread: Cast[] }) { if (cast.profile.fid === agent.fid) { - console.log("skipping cast from bot itself", cast.id); + console.log("skipping cast from bot itself", cast.hash); return; } if (!memory.content.text) { - console.log("skipping cast with no text", cast.id); + console.log("skipping cast with no text", cast.hash); return { text: "", action: "IGNORE" }; } @@ -149,7 +160,7 @@ export class FarcasterInteractionManager { const memoryId = castUuid({ agentId: this.runtime.agentId, - hash: cast.id, + hash: cast.hash, }); const castMemory = @@ -196,16 +207,18 @@ export class FarcasterInteractionManager { if (!response.text) return; try { + console.log(`Replying to cast ${cast.hash}.`); + const results = await sendCast({ runtime: this.runtime, client: this.client, - signer: this.signer, + signerUuid: this.signerUuid, profile: cast.profile, content: response, roomId: memory.roomId, inReplyTo: { - fid: cast.message.data.fid, - hash: cast.message.hash, + fid: cast.authorFid, + hash: cast.hash, }, }); diff --git a/packages/client-farcaster/src/memory.ts b/packages/client-farcaster/src/memory.ts index c4c49081f54..b3a8c862c96 100644 --- a/packages/client-farcaster/src/memory.ts +++ b/packages/client-farcaster/src/memory.ts @@ -1,4 +1,3 @@ -import { isCastAddMessage } from "@farcaster/hub-nodejs"; import { elizaLogger, getEmbeddingZeroVector, @@ -21,16 +20,16 @@ export function createCastMemory({ runtime: IAgentRuntime; cast: Cast; }): Memory { - const inReplyTo = cast.message.data.castAddBody.parentCastId + const inReplyTo = cast.inReplyTo ? castUuid({ - hash: toHex(cast.message.data.castAddBody.parentCastId.hash), - agentId: runtime.agentId, + hash: toHex(cast.inReplyTo.hash), + agentId: runtime.agentId, }) : undefined; return { id: castUuid({ - hash: cast.id, + hash: cast.hash, agentId: runtime.agentId, }), agentId: runtime.agentId, @@ -40,11 +39,10 @@ export function createCastMemory({ source: "farcaster", url: "", inReplyTo, - hash: cast.id, + hash: cast.hash, }, roomId, embedding: getEmbeddingZeroVector(), - createdAt: cast.message.data.timestamp * 1000, }; } @@ -56,29 +54,28 @@ export async function buildConversationThread({ cast: Cast; runtime: IAgentRuntime; client: FarcasterClient; -}): Promise { +}): Promise { const thread: Cast[] = []; const visited: Set = new Set(); - async function processThread(currentCast: Cast) { - if (visited.has(cast.id)) { + if (visited.has(currentCast.hash)) { return; } - visited.add(cast.id); + visited.add(currentCast.hash); const roomId = castUuid({ - hash: currentCast.id, + hash: currentCast.hash, agentId: runtime.agentId, }); - // Check if the current tweet has already been saved + // Check if the current cast has already been saved const memory = await runtime.messageManager.getMemoryById(roomId); if (!memory) { - elizaLogger.log("Creating memory for cast", cast.id); + elizaLogger.log("Creating memory for cast", currentCast.hash); - const userId = stringToUuid(cast.profile.username); + const userId = stringToUuid(currentCast.profile.username); await runtime.ensureConnection( userId, @@ -99,17 +96,12 @@ export async function buildConversationThread({ thread.unshift(currentCast); - if (currentCast.message.data.castAddBody.parentCastId) { - const message = await client.getCast( - currentCast.message.data.castAddBody.parentCastId - ); - - if (isCastAddMessage(message)) { - const parentCast = await client.loadCastFromMessage(message); - await processThread(parentCast); - } + if (currentCast.inReplyTo) { + const parentCast = await client.getCast(currentCast.inReplyTo.hash); + await processThread(parentCast); } } await processThread(cast); + return thread; } diff --git a/packages/client-farcaster/src/post.ts b/packages/client-farcaster/src/post.ts index 26df9c96553..13b135b5291 100644 --- a/packages/client-farcaster/src/post.ts +++ b/packages/client-farcaster/src/post.ts @@ -1,10 +1,10 @@ -import { Signer } from "@farcaster/hub-nodejs"; import { composeContext, generateText, IAgentRuntime, ModelClass, stringToUuid, + elizaLogger } from "@ai16z/eliza"; import { FarcasterClient } from "./client"; import { formatTimeline, postTemplate } from "./prompts"; @@ -18,7 +18,7 @@ export class FarcasterPostManager { constructor( public client: FarcasterClient, public runtime: IAgentRuntime, - private signer: Signer, + private signerUuid: string, public cache: Map ) {} @@ -27,7 +27,7 @@ export class FarcasterPostManager { try { await this.generateNewCast(); } catch (error) { - console.error(error); + elizaLogger.error(error) return; } @@ -45,14 +45,13 @@ export class FarcasterPostManager { } private async generateNewCast() { - console.log("Generating new cast"); + elizaLogger.info("Generating new cast"); try { const fid = Number(this.runtime.getSetting("FARCASTER_FID")!); // const farcasterUserName = // this.runtime.getSetting("FARCASTER_USERNAME")!; const profile = await this.client.getProfile(fid); - await this.runtime.ensureUserExists( this.runtime.agentId, profile.username, @@ -126,7 +125,8 @@ export class FarcasterPostManager { const [{ cast }] = await sendCast({ client: this.client, runtime: this.runtime, - signer: this.signer, + //: this.signer, + signerUuid: this.signerUuid, roomId: generateRoomId, content: { text: content }, profile, @@ -134,7 +134,7 @@ export class FarcasterPostManager { const roomId = castUuid({ agentId: this.runtime.agentId, - hash: cast.id, + hash: cast.hash, }); await this.runtime.ensureRoomExists(roomId); @@ -144,6 +144,11 @@ export class FarcasterPostManager { roomId ); + console.log( + `%c [Farcaster Neynar Client] Published cast ${cast.hash}`, + "color: #8565cb;" + ); + await this.runtime.messageManager.createMemory( createCastMemory({ roomId, @@ -152,10 +157,10 @@ export class FarcasterPostManager { }) ); } catch (error) { - console.error("Error sending tweet:", error); + elizaLogger.error("Error sending cast:", error) } } catch (error) { - console.error("Error generating new tweet:", error); + elizaLogger.error("Error generating new cast:", error) } } } diff --git a/packages/client-farcaster/src/prompts.ts b/packages/client-farcaster/src/prompts.ts index 3b378b23486..b9e0326d729 100644 --- a/packages/client-farcaster/src/prompts.ts +++ b/packages/client-farcaster/src/prompts.ts @@ -6,8 +6,8 @@ import { import type { Cast } from "./types"; export const formatCast = (cast: Cast) => { - return `ID: ${cast.id} -From: ${cast.profile.name} (@${cast.profile.username})${cast.profile.username})${cast.inReplyTo ? `\nIn reply to: ${cast.inReplyTo.id}` : ""} + return `ID: ${cast.hash} + From: ${cast.profile.name} (@${cast.profile.username})${cast.profile.username})${cast.inReplyTo ? `\nIn reply to: ${cast.inReplyTo.fid}` : ""} Text: ${cast.text}`; }; @@ -24,7 +24,7 @@ export const headerTemplate = ` # Knowledge {{knowledge}} -About {{agentName}} (@{{farcasterUserName}}): +About {{agentName}} (@{{farcasterUsername}}): {{bio}} {{lore}} {{postDirections}} @@ -38,8 +38,8 @@ About {{agentName}} (@{{farcasterUserName}}): export const postTemplate = headerTemplate + ` -# Task: Generate a post in the voice and style of {{agentName}}, aka @{{farcasterUserName}} -Write a single sentence post that is {{adjective}} about {{topic}} (without mentioning {{topic}} directly), from the perspective of {{agentName}}. +# Task: Generate a post in the voice and style of {{agentName}}, aka @{{farcasterUsername}} +Write a single sentence post that is {{adjective}} about {{topic}} (without mentioning {{topic}} directly), from the perspective of {{agentName}}. Try to write something totally different than previous posts. Do not add commentary or ackwowledge this request, just write the post. Your response should not contain any questions. Brief, concise statements only. No emojis. Use \\n\\n (double spaces) between statements.`; @@ -50,6 +50,9 @@ export const messageHandlerTemplate = Recent interactions between {{agentName}} and other users: {{recentPostInteractions}} +Thread of casts You Are Replying To: +{{formattedConversation}} + # Task: Generate a post in the voice, style and perspective of {{agentName}} (@{{twitterUserName}}): {{currentPost}}` + messageCompletionFooter; diff --git a/packages/client-farcaster/src/types.ts b/packages/client-farcaster/src/types.ts index c86aef8983f..929216d138b 100644 --- a/packages/client-farcaster/src/types.ts +++ b/packages/client-farcaster/src/types.ts @@ -1,9 +1,5 @@ -import type { CastAddMessage } from "@farcaster/hub-nodejs"; -import type { Hex } from "viem"; - export type Profile = { fid: number; - signer: Hex; name: string; username: string; pfp?: string; @@ -14,13 +10,30 @@ export type Profile = { // github?: string; }; +export type NeynarCastResponse = { + hash: string; + authorFid: number; + text: string; +}; + export type Cast = { - id: Hex; - profile: Profile; + hash: string; + authorFid: number; text: string; - message: CastAddMessage; + profile: Profile; inReplyTo?: { - id: Hex; + hash: string; fid: number; }; + timestamp: Date; +}; + +export type CastId = { + hash: string; + fid: number; +}; + +export type FidRequest = { + fid: number; + pageSize: number; }; diff --git a/packages/client-farcaster/src/utils.ts b/packages/client-farcaster/src/utils.ts index 6349ca4e665..92b99d698f9 100644 --- a/packages/client-farcaster/src/utils.ts +++ b/packages/client-farcaster/src/utils.ts @@ -1,13 +1,12 @@ import { stringToUuid } from "@ai16z/eliza"; -import type { Hex } from "viem"; const MAX_CAST_LENGTH = 280; // Updated to Twitter's current character limit -export function castId({ hash, agentId }: { hash: Hex; agentId: string }) { +export function castId({ hash, agentId }: { hash: string; agentId: string }) { return `${hash}-${agentId}`; } -export function castUuid(props: { hash: Hex; agentId: string }) { +export function castUuid(props: { hash: string; agentId: string }) { return stringToUuid(castId(props)); } diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 82ef08bef73..9b33376c450 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -602,6 +602,7 @@ export enum Clients { DIRECT = "direct", TWITTER = "twitter", TELEGRAM = "telegram", + FARCASTER = "farcaster", } /** * Configuration for an agent character diff --git a/scripts/docker.sh b/scripts/docker.sh index c4baee03ac7..6fb2fb3b7ad 100755 --- a/scripts/docker.sh +++ b/scripts/docker.sh @@ -37,6 +37,7 @@ case "$1" in "client-auto" "client-direct" "client-discord" + "client-farcaster" "client-telegram" "client-twitter" "core"