@dipansrimany/mlink-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # @mantle-blinks/sdk
2
+
3
+ SDK for building Mantle Blinks - shareable blockchain transaction URLs for Mantle Network.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @mantle-blinks/sdk
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ### 1. Create an Action
14
+
15
+ ```typescript
16
+ import { createAction, button, input, parseEther } from '@mantle-blinks/sdk';
17
+
18
+ export const tipAction = createAction({
19
+ title: 'Tip the Developer',
20
+ icon: 'https://example.com/icon.png',
21
+ description: 'Send a tip in MNT',
22
+
23
+ actions: [
24
+ button({ label: '1 MNT', value: '1' }),
25
+ button({ label: '5 MNT', value: '5' }),
26
+ input({ label: 'Send', placeholder: 'Custom amount' }),
27
+ ],
28
+
29
+ handler: async ({ account, action, input }) => {
30
+ const amount = input || action;
31
+
32
+ return {
33
+ transaction: {
34
+ to: '0xYourAddress',
35
+ value: parseEther(amount),
36
+ data: '0x',
37
+ chainId: 5003, // Mantle Sepolia
38
+ },
39
+ message: `Thanks for the ${amount} MNT tip!`,
40
+ };
41
+ },
42
+ });
43
+ ```
44
+
45
+ ### 2. Create an API Route (Next.js)
46
+
47
+ ```typescript
48
+ // app/api/actions/tip/route.ts
49
+ import { createNextHandler } from '@mantle-blinks/sdk/next';
50
+ import { tipAction } from './action';
51
+
52
+ export const { GET, POST, OPTIONS } = createNextHandler(tipAction);
53
+ ```
54
+
55
+ ### 3. Create an API Route (Express)
56
+
57
+ ```typescript
58
+ import express from 'express';
59
+ import { createExpressHandler } from '@mantle-blinks/sdk/express';
60
+ import { tipAction } from './action';
61
+
62
+ const app = express();
63
+ app.use('/api/actions/tip', createExpressHandler(tipAction));
64
+ ```
65
+
66
+ ## Supported Networks
67
+
68
+ | Network | Chain ID |
69
+ |---------|----------|
70
+ | Mantle Mainnet | 5000 |
71
+ | Mantle Sepolia | 5003 |
72
+
73
+ ## Publishing to npm
74
+
75
+ ```bash
76
+ # Login to npm
77
+ npm login
78
+
79
+ # Build and publish
80
+ npm run build
81
+ npm publish --access public
82
+ ```
83
+
84
+ ## License
85
+
86
+ MIT
@@ -0,0 +1,6 @@
1
+ import { Router } from 'express';
2
+ import { k as Action } from '../builders-OoJ5KB_g.mjs';
3
+
4
+ declare function createExpressHandler(action: Action, RouterClass: new () => Router): Router;
5
+
6
+ export { createExpressHandler };
@@ -0,0 +1,6 @@
1
+ import { Router } from 'express';
2
+ import { k as Action } from '../builders-OoJ5KB_g.js';
3
+
4
+ declare function createExpressHandler(action: Action, RouterClass: new () => Router): Router;
5
+
6
+ export { createExpressHandler };
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+
5
+ // src/validators.ts
6
+ var addressRegex = /^0x[a-fA-F0-9]{40}$/;
7
+ var hexRegex = /^0x[a-fA-F0-9]*$/;
8
+ var ActionButtonSchema = zod.z.object({
9
+ label: zod.z.string().min(1).max(50),
10
+ value: zod.z.string().min(1),
11
+ type: zod.z.enum(["button", "input"]),
12
+ placeholder: zod.z.string().optional(),
13
+ disabled: zod.z.boolean().optional()
14
+ });
15
+ zod.z.object({
16
+ title: zod.z.string().min(1).max(100),
17
+ icon: zod.z.string().url(),
18
+ description: zod.z.string().min(1).max(500),
19
+ actions: zod.z.array(ActionButtonSchema).min(1),
20
+ disabled: zod.z.boolean().optional(),
21
+ error: zod.z.object({ message: zod.z.string() }).optional()
22
+ });
23
+ var TransactionRequestSchema = zod.z.object({
24
+ account: zod.z.string().regex(addressRegex, "Invalid Ethereum address"),
25
+ action: zod.z.string().min(1),
26
+ input: zod.z.string().optional()
27
+ });
28
+ var EVMTransactionSchema = zod.z.object({
29
+ to: zod.z.string().regex(addressRegex, "Invalid to address"),
30
+ value: zod.z.string(),
31
+ data: zod.z.string().regex(hexRegex, "Invalid hex data"),
32
+ chainId: zod.z.number().positive()
33
+ });
34
+ zod.z.object({
35
+ transaction: EVMTransactionSchema,
36
+ message: zod.z.string().optional()
37
+ });
38
+ function validateTransactionRequest(data) {
39
+ const result = TransactionRequestSchema.safeParse(data);
40
+ if (result.success) {
41
+ return { success: true, data: result.data };
42
+ }
43
+ return { success: false, error: result.error.message };
44
+ }
45
+
46
+ // src/adapters/express.ts
47
+ function createExpressHandler(action, RouterClass) {
48
+ const router = new RouterClass();
49
+ router.use((_req, res, next) => {
50
+ res.header("Access-Control-Allow-Origin", "*");
51
+ res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
52
+ res.header("Access-Control-Allow-Headers", "Content-Type");
53
+ next();
54
+ });
55
+ router.options("/", (_req, res) => {
56
+ res.sendStatus(200);
57
+ });
58
+ router.get("/", (_req, res) => {
59
+ try {
60
+ const metadata = action.getMetadata();
61
+ res.json(metadata);
62
+ } catch (error) {
63
+ const message = error instanceof Error ? error.message : "Unknown error";
64
+ res.status(500).json({ error: { message } });
65
+ }
66
+ });
67
+ router.post("/", async (req, res) => {
68
+ try {
69
+ const validation = validateTransactionRequest(req.body);
70
+ if (!validation.success) {
71
+ return res.status(400).json({ error: { message: validation.error } });
72
+ }
73
+ const response = await action.handleRequest(validation.data);
74
+ res.json(response);
75
+ } catch (error) {
76
+ const message = error instanceof Error ? error.message : "Unknown error";
77
+ res.status(500).json({ error: { message } });
78
+ }
79
+ });
80
+ return router;
81
+ }
82
+
83
+ exports.createExpressHandler = createExpressHandler;
84
+ //# sourceMappingURL=express.js.map
85
+ //# sourceMappingURL=express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/validators.ts","../../src/adapters/express.ts"],"names":["z"],"mappings":"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","file":"express.js","sourcesContent":["import { z } from 'zod';\nimport type {\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\n ValidationResult,\n} from './types';\n\n// Ethereum address regex\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n// Hex string regex\nconst hexRegex = /^0x[a-fA-F0-9]*$/;\n\n// Zod Schemas\nexport const ActionButtonSchema = z.object({\n label: z.string().min(1).max(50),\n value: z.string().min(1),\n type: z.enum(['button', 'input']),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\nexport const ActionMetadataSchema = z.object({\n title: z.string().min(1).max(100),\n icon: z.string().url(),\n description: z.string().min(1).max(500),\n actions: z.array(ActionButtonSchema).min(1),\n disabled: z.boolean().optional(),\n error: z.object({ message: z.string() }).optional(),\n});\n\nexport const TransactionRequestSchema = z.object({\n account: z.string().regex(addressRegex, 'Invalid Ethereum address'),\n action: z.string().min(1),\n input: z.string().optional(),\n});\n\nexport const EVMTransactionSchema = z.object({\n to: z.string().regex(addressRegex, 'Invalid to address'),\n value: z.string(),\n data: z.string().regex(hexRegex, 'Invalid hex data'),\n chainId: z.number().positive(),\n});\n\nexport const TransactionResponseSchema = z.object({\n transaction: EVMTransactionSchema,\n message: z.string().optional(),\n});\n\n// Validation functions\nexport function validateActionMetadata(\n data: unknown\n): ValidationResult<ActionMetadata> {\n const result = ActionMetadataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as ActionMetadata };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionRequest(\n data: unknown\n): ValidationResult<TransactionRequest> {\n const result = TransactionRequestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionResponse(\n data: unknown\n): ValidationResult<TransactionResponse> {\n const result = TransactionResponseSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TransactionResponse };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function isValidAddress(address: string): boolean {\n return addressRegex.test(address);\n}\n\nexport function isValidHex(hex: string): boolean {\n return hexRegex.test(hex);\n}\n","import type { Router, Request, Response, NextFunction } from 'express';\nimport type { Action } from '../builders';\nimport { validateTransactionRequest } from '../validators';\n\n// Create Express router\nexport function createExpressHandler(\n action: Action,\n RouterClass: new () => Router\n): Router {\n const router = new RouterClass();\n\n // CORS middleware\n router.use((_req: Request, res: Response, next: NextFunction) => {\n res.header('Access-Control-Allow-Origin', '*');\n res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.header('Access-Control-Allow-Headers', 'Content-Type');\n next();\n });\n\n // OPTIONS handler\n router.options('/', (_req: Request, res: Response) => {\n res.sendStatus(200);\n });\n\n // GET handler\n router.get('/', (_req: Request, res: Response) => {\n try {\n const metadata = action.getMetadata();\n res.json(metadata);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ error: { message } });\n }\n });\n\n // POST handler\n router.post('/', async (req: Request, res: Response) => {\n try {\n const validation = validateTransactionRequest(req.body);\n\n if (!validation.success) {\n return res.status(400).json({ error: { message: validation.error } });\n }\n\n const response = await action.handleRequest(validation.data);\n res.json(response);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ error: { message } });\n }\n });\n\n return router;\n}\n"]}
@@ -0,0 +1,83 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/validators.ts
4
+ var addressRegex = /^0x[a-fA-F0-9]{40}$/;
5
+ var hexRegex = /^0x[a-fA-F0-9]*$/;
6
+ var ActionButtonSchema = z.object({
7
+ label: z.string().min(1).max(50),
8
+ value: z.string().min(1),
9
+ type: z.enum(["button", "input"]),
10
+ placeholder: z.string().optional(),
11
+ disabled: z.boolean().optional()
12
+ });
13
+ z.object({
14
+ title: z.string().min(1).max(100),
15
+ icon: z.string().url(),
16
+ description: z.string().min(1).max(500),
17
+ actions: z.array(ActionButtonSchema).min(1),
18
+ disabled: z.boolean().optional(),
19
+ error: z.object({ message: z.string() }).optional()
20
+ });
21
+ var TransactionRequestSchema = z.object({
22
+ account: z.string().regex(addressRegex, "Invalid Ethereum address"),
23
+ action: z.string().min(1),
24
+ input: z.string().optional()
25
+ });
26
+ var EVMTransactionSchema = z.object({
27
+ to: z.string().regex(addressRegex, "Invalid to address"),
28
+ value: z.string(),
29
+ data: z.string().regex(hexRegex, "Invalid hex data"),
30
+ chainId: z.number().positive()
31
+ });
32
+ z.object({
33
+ transaction: EVMTransactionSchema,
34
+ message: z.string().optional()
35
+ });
36
+ function validateTransactionRequest(data) {
37
+ const result = TransactionRequestSchema.safeParse(data);
38
+ if (result.success) {
39
+ return { success: true, data: result.data };
40
+ }
41
+ return { success: false, error: result.error.message };
42
+ }
43
+
44
+ // src/adapters/express.ts
45
+ function createExpressHandler(action, RouterClass) {
46
+ const router = new RouterClass();
47
+ router.use((_req, res, next) => {
48
+ res.header("Access-Control-Allow-Origin", "*");
49
+ res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
50
+ res.header("Access-Control-Allow-Headers", "Content-Type");
51
+ next();
52
+ });
53
+ router.options("/", (_req, res) => {
54
+ res.sendStatus(200);
55
+ });
56
+ router.get("/", (_req, res) => {
57
+ try {
58
+ const metadata = action.getMetadata();
59
+ res.json(metadata);
60
+ } catch (error) {
61
+ const message = error instanceof Error ? error.message : "Unknown error";
62
+ res.status(500).json({ error: { message } });
63
+ }
64
+ });
65
+ router.post("/", async (req, res) => {
66
+ try {
67
+ const validation = validateTransactionRequest(req.body);
68
+ if (!validation.success) {
69
+ return res.status(400).json({ error: { message: validation.error } });
70
+ }
71
+ const response = await action.handleRequest(validation.data);
72
+ res.json(response);
73
+ } catch (error) {
74
+ const message = error instanceof Error ? error.message : "Unknown error";
75
+ res.status(500).json({ error: { message } });
76
+ }
77
+ });
78
+ return router;
79
+ }
80
+
81
+ export { createExpressHandler };
82
+ //# sourceMappingURL=express.mjs.map
83
+ //# sourceMappingURL=express.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/validators.ts","../../src/adapters/express.ts"],"names":[],"mappings":"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","file":"express.mjs","sourcesContent":["import { z } from 'zod';\nimport type {\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\n ValidationResult,\n} from './types';\n\n// Ethereum address regex\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n// Hex string regex\nconst hexRegex = /^0x[a-fA-F0-9]*$/;\n\n// Zod Schemas\nexport const ActionButtonSchema = z.object({\n label: z.string().min(1).max(50),\n value: z.string().min(1),\n type: z.enum(['button', 'input']),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\nexport const ActionMetadataSchema = z.object({\n title: z.string().min(1).max(100),\n icon: z.string().url(),\n description: z.string().min(1).max(500),\n actions: z.array(ActionButtonSchema).min(1),\n disabled: z.boolean().optional(),\n error: z.object({ message: z.string() }).optional(),\n});\n\nexport const TransactionRequestSchema = z.object({\n account: z.string().regex(addressRegex, 'Invalid Ethereum address'),\n action: z.string().min(1),\n input: z.string().optional(),\n});\n\nexport const EVMTransactionSchema = z.object({\n to: z.string().regex(addressRegex, 'Invalid to address'),\n value: z.string(),\n data: z.string().regex(hexRegex, 'Invalid hex data'),\n chainId: z.number().positive(),\n});\n\nexport const TransactionResponseSchema = z.object({\n transaction: EVMTransactionSchema,\n message: z.string().optional(),\n});\n\n// Validation functions\nexport function validateActionMetadata(\n data: unknown\n): ValidationResult<ActionMetadata> {\n const result = ActionMetadataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as ActionMetadata };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionRequest(\n data: unknown\n): ValidationResult<TransactionRequest> {\n const result = TransactionRequestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionResponse(\n data: unknown\n): ValidationResult<TransactionResponse> {\n const result = TransactionResponseSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TransactionResponse };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function isValidAddress(address: string): boolean {\n return addressRegex.test(address);\n}\n\nexport function isValidHex(hex: string): boolean {\n return hexRegex.test(hex);\n}\n","import type { Router, Request, Response, NextFunction } from 'express';\nimport type { Action } from '../builders';\nimport { validateTransactionRequest } from '../validators';\n\n// Create Express router\nexport function createExpressHandler(\n action: Action,\n RouterClass: new () => Router\n): Router {\n const router = new RouterClass();\n\n // CORS middleware\n router.use((_req: Request, res: Response, next: NextFunction) => {\n res.header('Access-Control-Allow-Origin', '*');\n res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.header('Access-Control-Allow-Headers', 'Content-Type');\n next();\n });\n\n // OPTIONS handler\n router.options('/', (_req: Request, res: Response) => {\n res.sendStatus(200);\n });\n\n // GET handler\n router.get('/', (_req: Request, res: Response) => {\n try {\n const metadata = action.getMetadata();\n res.json(metadata);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ error: { message } });\n }\n });\n\n // POST handler\n router.post('/', async (req: Request, res: Response) => {\n try {\n const validation = validateTransactionRequest(req.body);\n\n if (!validation.success) {\n return res.status(400).json({ error: { message: validation.error } });\n }\n\n const response = await action.handleRequest(validation.data);\n res.json(response);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ error: { message } });\n }\n });\n\n return router;\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import { k as Action, A as ActionMetadata, a as TransactionResponse } from '../builders-OoJ5KB_g.mjs';
2
+ import { NextResponse, NextRequest } from 'next/server';
3
+
4
+ declare function createNextHandler(action: Action): {
5
+ GET: () => Promise<NextResponse<ActionMetadata> | NextResponse<{
6
+ error: {
7
+ message: string;
8
+ };
9
+ }>>;
10
+ POST: (request: NextRequest) => Promise<NextResponse<{
11
+ error: {
12
+ message: string;
13
+ };
14
+ }> | NextResponse<TransactionResponse>>;
15
+ OPTIONS: () => Promise<NextResponse<unknown>>;
16
+ };
17
+
18
+ export { createNextHandler };
@@ -0,0 +1,18 @@
1
+ import { k as Action, A as ActionMetadata, a as TransactionResponse } from '../builders-OoJ5KB_g.js';
2
+ import { NextResponse, NextRequest } from 'next/server';
3
+
4
+ declare function createNextHandler(action: Action): {
5
+ GET: () => Promise<NextResponse<ActionMetadata> | NextResponse<{
6
+ error: {
7
+ message: string;
8
+ };
9
+ }>>;
10
+ POST: (request: NextRequest) => Promise<NextResponse<{
11
+ error: {
12
+ message: string;
13
+ };
14
+ }> | NextResponse<TransactionResponse>>;
15
+ OPTIONS: () => Promise<NextResponse<unknown>>;
16
+ };
17
+
18
+ export { createNextHandler };
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var server = require('next/server');
4
+ var zod = require('zod');
5
+
6
+ // src/adapters/next.ts
7
+ var addressRegex = /^0x[a-fA-F0-9]{40}$/;
8
+ var hexRegex = /^0x[a-fA-F0-9]*$/;
9
+ var ActionButtonSchema = zod.z.object({
10
+ label: zod.z.string().min(1).max(50),
11
+ value: zod.z.string().min(1),
12
+ type: zod.z.enum(["button", "input"]),
13
+ placeholder: zod.z.string().optional(),
14
+ disabled: zod.z.boolean().optional()
15
+ });
16
+ zod.z.object({
17
+ title: zod.z.string().min(1).max(100),
18
+ icon: zod.z.string().url(),
19
+ description: zod.z.string().min(1).max(500),
20
+ actions: zod.z.array(ActionButtonSchema).min(1),
21
+ disabled: zod.z.boolean().optional(),
22
+ error: zod.z.object({ message: zod.z.string() }).optional()
23
+ });
24
+ var TransactionRequestSchema = zod.z.object({
25
+ account: zod.z.string().regex(addressRegex, "Invalid Ethereum address"),
26
+ action: zod.z.string().min(1),
27
+ input: zod.z.string().optional()
28
+ });
29
+ var EVMTransactionSchema = zod.z.object({
30
+ to: zod.z.string().regex(addressRegex, "Invalid to address"),
31
+ value: zod.z.string(),
32
+ data: zod.z.string().regex(hexRegex, "Invalid hex data"),
33
+ chainId: zod.z.number().positive()
34
+ });
35
+ zod.z.object({
36
+ transaction: EVMTransactionSchema,
37
+ message: zod.z.string().optional()
38
+ });
39
+ function validateTransactionRequest(data) {
40
+ const result = TransactionRequestSchema.safeParse(data);
41
+ if (result.success) {
42
+ return { success: true, data: result.data };
43
+ }
44
+ return { success: false, error: result.error.message };
45
+ }
46
+
47
+ // src/adapters/next.ts
48
+ var corsHeaders = {
49
+ "Access-Control-Allow-Origin": "*",
50
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
51
+ "Access-Control-Allow-Headers": "Content-Type"
52
+ };
53
+ function createNextHandler(action) {
54
+ async function GET() {
55
+ try {
56
+ const metadata = action.getMetadata();
57
+ return server.NextResponse.json(metadata, { headers: corsHeaders });
58
+ } catch (error) {
59
+ const message = error instanceof Error ? error.message : "Unknown error";
60
+ return server.NextResponse.json(
61
+ { error: { message } },
62
+ { status: 500, headers: corsHeaders }
63
+ );
64
+ }
65
+ }
66
+ async function POST(request) {
67
+ try {
68
+ const body = await request.json();
69
+ const validation = validateTransactionRequest(body);
70
+ if (!validation.success) {
71
+ return server.NextResponse.json(
72
+ { error: { message: validation.error } },
73
+ { status: 400, headers: corsHeaders }
74
+ );
75
+ }
76
+ const response = await action.handleRequest(validation.data);
77
+ return server.NextResponse.json(response, { headers: corsHeaders });
78
+ } catch (error) {
79
+ const message = error instanceof Error ? error.message : "Unknown error";
80
+ return server.NextResponse.json(
81
+ { error: { message } },
82
+ { status: 500, headers: corsHeaders }
83
+ );
84
+ }
85
+ }
86
+ async function OPTIONS() {
87
+ return new server.NextResponse(null, { headers: corsHeaders });
88
+ }
89
+ return { GET, POST, OPTIONS };
90
+ }
91
+
92
+ exports.createNextHandler = createNextHandler;
93
+ //# sourceMappingURL=next.js.map
94
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/validators.ts","../../src/adapters/next.ts"],"names":["z","NextResponse"],"mappings":"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","file":"next.js","sourcesContent":["import { z } from 'zod';\nimport type {\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\n ValidationResult,\n} from './types';\n\n// Ethereum address regex\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n// Hex string regex\nconst hexRegex = /^0x[a-fA-F0-9]*$/;\n\n// Zod Schemas\nexport const ActionButtonSchema = z.object({\n label: z.string().min(1).max(50),\n value: z.string().min(1),\n type: z.enum(['button', 'input']),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\nexport const ActionMetadataSchema = z.object({\n title: z.string().min(1).max(100),\n icon: z.string().url(),\n description: z.string().min(1).max(500),\n actions: z.array(ActionButtonSchema).min(1),\n disabled: z.boolean().optional(),\n error: z.object({ message: z.string() }).optional(),\n});\n\nexport const TransactionRequestSchema = z.object({\n account: z.string().regex(addressRegex, 'Invalid Ethereum address'),\n action: z.string().min(1),\n input: z.string().optional(),\n});\n\nexport const EVMTransactionSchema = z.object({\n to: z.string().regex(addressRegex, 'Invalid to address'),\n value: z.string(),\n data: z.string().regex(hexRegex, 'Invalid hex data'),\n chainId: z.number().positive(),\n});\n\nexport const TransactionResponseSchema = z.object({\n transaction: EVMTransactionSchema,\n message: z.string().optional(),\n});\n\n// Validation functions\nexport function validateActionMetadata(\n data: unknown\n): ValidationResult<ActionMetadata> {\n const result = ActionMetadataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as ActionMetadata };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionRequest(\n data: unknown\n): ValidationResult<TransactionRequest> {\n const result = TransactionRequestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionResponse(\n data: unknown\n): ValidationResult<TransactionResponse> {\n const result = TransactionResponseSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TransactionResponse };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function isValidAddress(address: string): boolean {\n return addressRegex.test(address);\n}\n\nexport function isValidHex(hex: string): boolean {\n return hexRegex.test(hex);\n}\n","import type { NextRequest } from 'next/server';\nimport { NextResponse } from 'next/server';\nimport type { Action } from '../builders';\nimport { validateTransactionRequest } from '../validators';\n\n// CORS headers\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type',\n};\n\n// Create Next.js App Router handlers\nexport function createNextHandler(action: Action) {\n // GET handler - returns action metadata\n async function GET() {\n try {\n const metadata = action.getMetadata();\n return NextResponse.json(metadata, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // POST handler - returns transaction\n async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n\n // Validate request\n const validation = validateTransactionRequest(body);\n if (!validation.success) {\n return NextResponse.json(\n { error: { message: validation.error } },\n { status: 400, headers: corsHeaders }\n );\n }\n\n // Handle request\n const response = await action.handleRequest(validation.data);\n\n return NextResponse.json(response, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // OPTIONS handler - CORS preflight\n async function OPTIONS() {\n return new NextResponse(null, { headers: corsHeaders });\n }\n\n return { GET, POST, OPTIONS };\n}\n"]}
@@ -0,0 +1,92 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { z } from 'zod';
3
+
4
+ // src/adapters/next.ts
5
+ var addressRegex = /^0x[a-fA-F0-9]{40}$/;
6
+ var hexRegex = /^0x[a-fA-F0-9]*$/;
7
+ var ActionButtonSchema = z.object({
8
+ label: z.string().min(1).max(50),
9
+ value: z.string().min(1),
10
+ type: z.enum(["button", "input"]),
11
+ placeholder: z.string().optional(),
12
+ disabled: z.boolean().optional()
13
+ });
14
+ z.object({
15
+ title: z.string().min(1).max(100),
16
+ icon: z.string().url(),
17
+ description: z.string().min(1).max(500),
18
+ actions: z.array(ActionButtonSchema).min(1),
19
+ disabled: z.boolean().optional(),
20
+ error: z.object({ message: z.string() }).optional()
21
+ });
22
+ var TransactionRequestSchema = z.object({
23
+ account: z.string().regex(addressRegex, "Invalid Ethereum address"),
24
+ action: z.string().min(1),
25
+ input: z.string().optional()
26
+ });
27
+ var EVMTransactionSchema = z.object({
28
+ to: z.string().regex(addressRegex, "Invalid to address"),
29
+ value: z.string(),
30
+ data: z.string().regex(hexRegex, "Invalid hex data"),
31
+ chainId: z.number().positive()
32
+ });
33
+ z.object({
34
+ transaction: EVMTransactionSchema,
35
+ message: z.string().optional()
36
+ });
37
+ function validateTransactionRequest(data) {
38
+ const result = TransactionRequestSchema.safeParse(data);
39
+ if (result.success) {
40
+ return { success: true, data: result.data };
41
+ }
42
+ return { success: false, error: result.error.message };
43
+ }
44
+
45
+ // src/adapters/next.ts
46
+ var corsHeaders = {
47
+ "Access-Control-Allow-Origin": "*",
48
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
49
+ "Access-Control-Allow-Headers": "Content-Type"
50
+ };
51
+ function createNextHandler(action) {
52
+ async function GET() {
53
+ try {
54
+ const metadata = action.getMetadata();
55
+ return NextResponse.json(metadata, { headers: corsHeaders });
56
+ } catch (error) {
57
+ const message = error instanceof Error ? error.message : "Unknown error";
58
+ return NextResponse.json(
59
+ { error: { message } },
60
+ { status: 500, headers: corsHeaders }
61
+ );
62
+ }
63
+ }
64
+ async function POST(request) {
65
+ try {
66
+ const body = await request.json();
67
+ const validation = validateTransactionRequest(body);
68
+ if (!validation.success) {
69
+ return NextResponse.json(
70
+ { error: { message: validation.error } },
71
+ { status: 400, headers: corsHeaders }
72
+ );
73
+ }
74
+ const response = await action.handleRequest(validation.data);
75
+ return NextResponse.json(response, { headers: corsHeaders });
76
+ } catch (error) {
77
+ const message = error instanceof Error ? error.message : "Unknown error";
78
+ return NextResponse.json(
79
+ { error: { message } },
80
+ { status: 500, headers: corsHeaders }
81
+ );
82
+ }
83
+ }
84
+ async function OPTIONS() {
85
+ return new NextResponse(null, { headers: corsHeaders });
86
+ }
87
+ return { GET, POST, OPTIONS };
88
+ }
89
+
90
+ export { createNextHandler };
91
+ //# sourceMappingURL=next.mjs.map
92
+ //# sourceMappingURL=next.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/validators.ts","../../src/adapters/next.ts"],"names":[],"mappings":"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","file":"next.mjs","sourcesContent":["import { z } from 'zod';\nimport type {\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\n ValidationResult,\n} from './types';\n\n// Ethereum address regex\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n// Hex string regex\nconst hexRegex = /^0x[a-fA-F0-9]*$/;\n\n// Zod Schemas\nexport const ActionButtonSchema = z.object({\n label: z.string().min(1).max(50),\n value: z.string().min(1),\n type: z.enum(['button', 'input']),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\nexport const ActionMetadataSchema = z.object({\n title: z.string().min(1).max(100),\n icon: z.string().url(),\n description: z.string().min(1).max(500),\n actions: z.array(ActionButtonSchema).min(1),\n disabled: z.boolean().optional(),\n error: z.object({ message: z.string() }).optional(),\n});\n\nexport const TransactionRequestSchema = z.object({\n account: z.string().regex(addressRegex, 'Invalid Ethereum address'),\n action: z.string().min(1),\n input: z.string().optional(),\n});\n\nexport const EVMTransactionSchema = z.object({\n to: z.string().regex(addressRegex, 'Invalid to address'),\n value: z.string(),\n data: z.string().regex(hexRegex, 'Invalid hex data'),\n chainId: z.number().positive(),\n});\n\nexport const TransactionResponseSchema = z.object({\n transaction: EVMTransactionSchema,\n message: z.string().optional(),\n});\n\n// Validation functions\nexport function validateActionMetadata(\n data: unknown\n): ValidationResult<ActionMetadata> {\n const result = ActionMetadataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as ActionMetadata };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionRequest(\n data: unknown\n): ValidationResult<TransactionRequest> {\n const result = TransactionRequestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionResponse(\n data: unknown\n): ValidationResult<TransactionResponse> {\n const result = TransactionResponseSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TransactionResponse };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function isValidAddress(address: string): boolean {\n return addressRegex.test(address);\n}\n\nexport function isValidHex(hex: string): boolean {\n return hexRegex.test(hex);\n}\n","import type { NextRequest } from 'next/server';\nimport { NextResponse } from 'next/server';\nimport type { Action } from '../builders';\nimport { validateTransactionRequest } from '../validators';\n\n// CORS headers\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type',\n};\n\n// Create Next.js App Router handlers\nexport function createNextHandler(action: Action) {\n // GET handler - returns action metadata\n async function GET() {\n try {\n const metadata = action.getMetadata();\n return NextResponse.json(metadata, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // POST handler - returns transaction\n async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n\n // Validate request\n const validation = validateTransactionRequest(body);\n if (!validation.success) {\n return NextResponse.json(\n { error: { message: validation.error } },\n { status: 400, headers: corsHeaders }\n );\n }\n\n // Handle request\n const response = await action.handleRequest(validation.data);\n\n return NextResponse.json(response, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // OPTIONS handler - CORS preflight\n async function OPTIONS() {\n return new NextResponse(null, { headers: corsHeaders });\n }\n\n return { GET, POST, OPTIONS };\n}\n"]}
@@ -0,0 +1,84 @@
1
+ type ActionType = 'button' | 'input';
2
+ interface ActionButton {
3
+ label: string;
4
+ value: string;
5
+ type: ActionType;
6
+ placeholder?: string;
7
+ disabled?: boolean;
8
+ }
9
+ interface ActionError {
10
+ message: string;
11
+ }
12
+ interface ActionMetadata {
13
+ title: string;
14
+ icon: string;
15
+ description: string;
16
+ actions: ActionButton[];
17
+ disabled?: boolean;
18
+ error?: ActionError;
19
+ }
20
+ interface TransactionRequest {
21
+ account: string;
22
+ action: string;
23
+ input?: string;
24
+ }
25
+ interface EVMTransaction {
26
+ to: string;
27
+ value: string;
28
+ data: string;
29
+ chainId: number;
30
+ }
31
+ interface TransactionResponse {
32
+ transaction: EVMTransaction;
33
+ message?: string;
34
+ }
35
+ interface ActionContext {
36
+ account: string;
37
+ action: string;
38
+ input?: string;
39
+ }
40
+ type ActionHandler = (context: ActionContext) => Promise<TransactionResponse>;
41
+ interface ActionDefinition {
42
+ title: string;
43
+ icon: string;
44
+ description: string;
45
+ actions: ActionButton[];
46
+ disabled?: boolean;
47
+ handler: ActionHandler;
48
+ }
49
+ interface ChainConfig {
50
+ chainId: number;
51
+ name: string;
52
+ rpcUrl: string;
53
+ explorerUrl: string;
54
+ nativeCurrency: {
55
+ name: string;
56
+ symbol: string;
57
+ decimals: number;
58
+ };
59
+ }
60
+ type ValidationResult<T> = {
61
+ success: true;
62
+ data: T;
63
+ } | {
64
+ success: false;
65
+ error: string;
66
+ };
67
+
68
+ declare function button(config: {
69
+ label: string;
70
+ value: string;
71
+ disabled?: boolean;
72
+ }): ActionButton;
73
+ declare function input(config: {
74
+ label: string;
75
+ placeholder?: string;
76
+ disabled?: boolean;
77
+ }): ActionButton;
78
+ interface Action {
79
+ getMetadata(): ActionMetadata;
80
+ handleRequest(request: TransactionRequest): Promise<TransactionResponse>;
81
+ }
82
+ declare function createAction(definition: ActionDefinition): Action;
83
+
84
+ export { type ActionMetadata as A, type ChainConfig as C, type EVMTransaction as E, type TransactionRequest as T, type ValidationResult as V, type TransactionResponse as a, type ActionType as b, type ActionButton as c, type ActionError as d, type ActionHandler as e, type ActionDefinition as f, type ActionContext as g, createAction as h, button as i, input as j, type Action as k };