A lightweight package for routing CCIP-Read requests, using itty-router.
Install with:
bun add @ensdomains/ccip-read-router itty-router viem
import { CcipReadRouter } from "@ensdomains/ccip-read-router";
// 1. Create a router instance
const router = CcipReadRouter();
// 2. Add a route
router.add({
// Function signature for the route
type: "function bar(uint256) pure returns (uint256)",
// Handler, with args based on function signature
handle: async ([x]) => {
// Return type based on function signature, or arbitrary hex (0x...)
return [x * 2n];
},
});
// 3. Consume the router...
Most customisation is inherited from itty-router.
import { CcipReadRouter } from "@ensdomains/ccip-read-router";
const router = CcipReadRouter({ base: "/ccip-read" });
From itty-router docs:
import { CcipReadRouter } from "@ensdomains/ccip-read-router";
import { cors } from "itty-router";
// get preflight and corsify pair
const { preflight, corsify } = cors();
const router = CcipReadRouter({
before: [preflight], // add preflight upstream
finally: [corsify], // and corsify downstream
});
Just export the router from your worker file.
import { CcipReadRouter } from "@ensdomains/ccip-read-router";
const router = CcipReadRouter();
router.add({
type: "function bar(uint256) pure returns (uint256)",
handle: async ([x]) => {
return [x * 2n];
},
});
export default { ...router };
Initialise the router with the port you want to use, and export.
import { CcipReadRouter } from "@ensdomains/ccip-read-router";
const router = CcipReadRouter({ port: 3001 });
router.add({
type: "function bar(uint256) pure returns (uint256)",
handle: async ([x]) => {
return [x * 2n];
},
});
export default router;
Use the @whatwg-node/server adapter.
import { CcipReadRouter } from "@ensdomains/ccip-read-router";
import { createServerAdapter } from "@whatwg-node/server";
import { createServer } from "http";
const router = CcipReadRouter();
router.add({
type: "function bar(uint256) pure returns (uint256)",
handle: async ([x]) => {
return [x * 2n];
},
});
// create a @whatwg-node/server
const ccipReadServer = createServerAdapter(router.fetch);
// then pass that to Node
const httpServer = createServer(ccipReadServer);
httpServer.listen(3001);
See the runtime guides section of the itty-router docs.