├── .gitignore ├── public ├── park-1.png ├── park-2.png ├── park-3.png └── park-4.png ├── next-env.d.ts ├── prettier.config.js ├── app ├── config.ts ├── layout.tsx ├── api │ ├── tx-success │ │ └── route.ts │ ├── tx │ │ └── route.ts │ └── frame │ │ └── route.ts ├── page.tsx └── _contracts │ └── BuyMeACoffeeABI.ts ├── tsconfig.json ├── package.json ├── LICENSE ├── README.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_STORE 3 | .next/ -------------------------------------------------------------------------------- /public/park-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kamigordon/a-frame-in-100-lines/HEAD/public/park-1.png -------------------------------------------------------------------------------- /public/park-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kamigordon/a-frame-in-100-lines/HEAD/public/park-2.png -------------------------------------------------------------------------------- /public/park-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kamigordon/a-frame-in-100-lines/HEAD/public/park-3.png -------------------------------------------------------------------------------- /public/park-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kamigordon/a-frame-in-100-lines/HEAD/public/park-4.png -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | arrowParens: 'always', 3 | bracketSameLine: false, 4 | jsxSingleQuote: false, 5 | plugins: [], 6 | printWidth: 100, 7 | semi: true, 8 | singleQuote: true, 9 | tabWidth: 2, 10 | trailingComma: 'all', 11 | useTabs: false, 12 | }; 13 | -------------------------------------------------------------------------------- /app/config.ts: -------------------------------------------------------------------------------- 1 | // use NODE_ENV to not have to change config based on where it's deployed 2 | export const NEXT_PUBLIC_URL = 3 | process.env.NODE_ENV == 'development' ? 'http://localhost:3000' : 'https://zizzamia.xyz'; 4 | export const BUY_MY_COFFEE_CONTRACT_ADDR = '0xcD3D5E4E498BAb2e0832257569c3Fd4AE439dD6f'; 5 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | export const viewport = { 2 | width: 'device-width', 3 | initialScale: 1.0, 4 | }; 5 | 6 | export default function RootLayout({ children }: { children: React.ReactNode }) { 7 | return ( 8 | 9 | {children} 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2020", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "NodeNext", 11 | "moduleResolution": "NodeNext", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next", 19 | }, 20 | ], 21 | }, 22 | "include": ["custom.d.ts", "next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 23 | "exclude": ["contracts", "node_modules"], 24 | } 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "a-frame-in-100-lines", 3 | "version": "0.13.0", 4 | "scripts": { 5 | "build": "rm -rf .next && next build", 6 | "dev": "next dev", 7 | "format": "prettier --log-level warn --write .", 8 | "start": "next start", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "keywords": [], 12 | "author": "https://twitter.com/Zizzamia", 13 | "license": "MIT", 14 | "dependencies": { 15 | "@coinbase/onchainkit": "0.14.1", 16 | "next": "13.5.6", 17 | "react": "^18.2.0", 18 | "react-dom": "^18.2.0", 19 | "viem": "^2.7.1" 20 | }, 21 | "devDependencies": { 22 | "@types/node": "^20.11.8", 23 | "@types/react": "18.2.48", 24 | "prettier": "^3.2.4", 25 | "typescript": "^5.3.3" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/api/tx-success/route.ts: -------------------------------------------------------------------------------- 1 | import { FrameRequest, getFrameMessage, getFrameHtmlResponse } from '@coinbase/onchainkit/frame'; 2 | import { NextRequest, NextResponse } from 'next/server'; 3 | import { NEXT_PUBLIC_URL } from '../../config'; 4 | 5 | async function getResponse(req: NextRequest): Promise { 6 | const body: FrameRequest = await req.json(); 7 | const { isValid } = await getFrameMessage(body); 8 | 9 | if (!isValid) { 10 | return new NextResponse('Message not valid', { status: 500 }); 11 | } 12 | 13 | return new NextResponse( 14 | getFrameHtmlResponse({ 15 | buttons: [ 16 | { 17 | label: `Tx: ${body?.untrustedData?.transactionId || '--'}`, 18 | }, 19 | ], 20 | image: { 21 | src: `${NEXT_PUBLIC_URL}/park-4.png`, 22 | }, 23 | }), 24 | ); 25 | } 26 | 27 | export async function POST(req: NextRequest): Promise { 28 | return getResponse(req); 29 | } 30 | 31 | export const dynamic = 'force-dynamic'; 32 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | import { getFrameMetadata } from '@coinbase/onchainkit/frame'; 2 | import type { Metadata } from 'next'; 3 | import { NEXT_PUBLIC_URL } from './config'; 4 | 5 | const frameMetadata = getFrameMetadata({ 6 | buttons: [ 7 | { 8 | label: 'Story time', 9 | }, 10 | { 11 | action: 'tx', 12 | label: 'Send Base Sepolia', 13 | target: `${NEXT_PUBLIC_URL}/api/tx`, 14 | postUrl: `${NEXT_PUBLIC_URL}/api/tx-success`, 15 | }, 16 | ], 17 | image: { 18 | src: `${NEXT_PUBLIC_URL}/park-3.png`, 19 | aspectRatio: '1:1', 20 | }, 21 | input: { 22 | text: 'Tell me a story', 23 | }, 24 | postUrl: `${NEXT_PUBLIC_URL}/api/frame`, 25 | }); 26 | 27 | export const metadata: Metadata = { 28 | title: 'zizzamia.xyz', 29 | description: 'LFG', 30 | openGraph: { 31 | title: 'zizzamia.xyz', 32 | description: 'LFG', 33 | images: [`${NEXT_PUBLIC_URL}/park-1.png`], 34 | }, 35 | other: { 36 | ...frameMetadata, 37 | }, 38 | }; 39 | 40 | export default function Page() { 41 | return ( 42 | <> 43 |

zizzamia.xyz

44 | 45 | ); 46 | } 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Leonardo Zizzamia 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/api/tx/route.ts: -------------------------------------------------------------------------------- 1 | import { FrameRequest, getFrameMessage } from '@coinbase/onchainkit/frame'; 2 | import { NextRequest, NextResponse } from 'next/server'; 3 | import { encodeFunctionData, parseEther } from 'viem'; 4 | import { baseSepolia } from 'viem/chains'; 5 | import BuyMeACoffeeABI from '../../_contracts/BuyMeACoffeeABI'; 6 | import { BUY_MY_COFFEE_CONTRACT_ADDR } from '../../config'; 7 | import type { FrameTransactionResponse } from '@coinbase/onchainkit/frame'; 8 | 9 | async function getResponse(req: NextRequest): Promise { 10 | const body: FrameRequest = await req.json(); 11 | // Remember to replace 'NEYNAR_ONCHAIN_KIT' with your own Neynar API key 12 | const { isValid } = await getFrameMessage(body, { neynarApiKey: 'NEYNAR_ONCHAIN_KIT' }); 13 | 14 | if (!isValid) { 15 | return new NextResponse('Message not valid', { status: 500 }); 16 | } 17 | 18 | const data = encodeFunctionData({ 19 | abi: BuyMeACoffeeABI, 20 | functionName: 'buyCoffee', 21 | args: [parseEther('1'), 'Coffee all day!'], 22 | }); 23 | 24 | const txData: FrameTransactionResponse = { 25 | chainId: `eip155:${baseSepolia.id}`, 26 | method: 'eth_sendTransaction', 27 | params: { 28 | abi: [], 29 | data, 30 | to: BUY_MY_COFFEE_CONTRACT_ADDR, 31 | value: parseEther('0.00004').toString(), // 0.00004 ETH 32 | }, 33 | }; 34 | return NextResponse.json(txData); 35 | } 36 | 37 | export async function POST(req: NextRequest): Promise { 38 | return getResponse(req); 39 | } 40 | 41 | export const dynamic = 'force-dynamic'; 42 | -------------------------------------------------------------------------------- /app/api/frame/route.ts: -------------------------------------------------------------------------------- 1 | import { FrameRequest, getFrameMessage, getFrameHtmlResponse } from '@coinbase/onchainkit/frame'; 2 | import { NextRequest, NextResponse } from 'next/server'; 3 | import { NEXT_PUBLIC_URL } from '../../config'; 4 | 5 | async function getResponse(req: NextRequest): Promise { 6 | const body: FrameRequest = await req.json(); 7 | const { isValid, message } = await getFrameMessage(body, { neynarApiKey: 'NEYNAR_ONCHAIN_KIT' }); 8 | 9 | if (!isValid) { 10 | return new NextResponse('Message not valid', { status: 500 }); 11 | } 12 | 13 | const text = message.input || ''; 14 | let state = { 15 | page: 0, 16 | }; 17 | try { 18 | state = JSON.parse(decodeURIComponent(message.state?.serialized)); 19 | } catch (e) { 20 | console.error(e); 21 | } 22 | 23 | /** 24 | * Use this code to redirect to a different page 25 | */ 26 | if (message?.button === 3) { 27 | return NextResponse.redirect( 28 | 'https://www.google.com/search?q=cute+dog+pictures&tbm=isch&source=lnms', 29 | { status: 302 }, 30 | ); 31 | } 32 | 33 | return new NextResponse( 34 | getFrameHtmlResponse({ 35 | buttons: [ 36 | { 37 | label: `State: ${state?.page || 0}`, 38 | }, 39 | { 40 | action: 'link', 41 | label: 'OnchainKit', 42 | target: 'https://onchainkit.xyz', 43 | }, 44 | { 45 | action: 'post_redirect', 46 | label: 'Dog pictures', 47 | }, 48 | ], 49 | image: { 50 | src: `${NEXT_PUBLIC_URL}/park-1.png`, 51 | }, 52 | postUrl: `${NEXT_PUBLIC_URL}/api/frame`, 53 | state: { 54 | page: state?.page + 1, 55 | time: new Date().toISOString(), 56 | }, 57 | }), 58 | ); 59 | } 60 | 61 | export async function POST(req: NextRequest): Promise { 62 | return getResponse(req); 63 | } 64 | 65 | export const dynamic = 'force-dynamic'; 66 | -------------------------------------------------------------------------------- /app/_contracts/BuyMeACoffeeABI.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This ABI is trimmed down to just the functions we expect to call for the 3 | * sake of minimizing bytes downloaded. 4 | */ 5 | const abi = [ 6 | { type: 'constructor', inputs: [], stateMutability: 'nonpayable' }, 7 | { type: 'receive', stateMutability: 'payable' }, 8 | { 9 | type: 'function', 10 | name: 'buyCoffee', 11 | inputs: [ 12 | { name: 'numCoffees', type: 'uint256', internalType: 'uint256' }, 13 | { name: 'message', type: 'string', internalType: 'string' }, 14 | ], 15 | outputs: [], 16 | stateMutability: 'payable', 17 | }, 18 | { 19 | type: 'function', 20 | name: 'getMemos', 21 | inputs: [ 22 | { name: 'index', type: 'uint256', internalType: 'uint256' }, 23 | { name: 'size', type: 'uint256', internalType: 'uint256' }, 24 | ], 25 | outputs: [ 26 | { 27 | name: '', 28 | type: 'tuple[]', 29 | internalType: 'struct Memo[]', 30 | components: [ 31 | { name: 'numCoffees', type: 'uint256', internalType: 'uint256' }, 32 | { name: 'message', type: 'string', internalType: 'string' }, 33 | { name: 'time', type: 'uint256', internalType: 'uint256' }, 34 | { name: 'userAddress', type: 'address', internalType: 'address' }, 35 | ], 36 | }, 37 | ], 38 | stateMutability: 'view', 39 | }, 40 | { 41 | type: 'function', 42 | name: 'memos', 43 | inputs: [{ name: '', type: 'uint256', internalType: 'uint256' }], 44 | outputs: [ 45 | { name: 'numCoffees', type: 'uint256', internalType: 'uint256' }, 46 | { name: 'message', type: 'string', internalType: 'string' }, 47 | { name: 'time', type: 'uint256', internalType: 'uint256' }, 48 | { name: 'userAddress', type: 'address', internalType: 'address' }, 49 | ], 50 | stateMutability: 'view', 51 | }, 52 | { 53 | type: 'function', 54 | name: 'modifyMemoMessage', 55 | inputs: [ 56 | { name: 'index', type: 'uint256', internalType: 'uint256' }, 57 | { name: 'message', type: 'string', internalType: 'string' }, 58 | ], 59 | outputs: [], 60 | stateMutability: 'nonpayable', 61 | }, 62 | { 63 | type: 'function', 64 | name: 'owner', 65 | inputs: [], 66 | outputs: [{ name: '', type: 'address', internalType: 'address payable' }], 67 | stateMutability: 'view', 68 | }, 69 | { 70 | type: 'function', 71 | name: 'price', 72 | inputs: [], 73 | outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }], 74 | stateMutability: 'view', 75 | }, 76 | { 77 | type: 'function', 78 | name: 'removeMemo', 79 | inputs: [{ name: 'index', type: 'uint256', internalType: 'uint256' }], 80 | outputs: [], 81 | stateMutability: 'nonpayable', 82 | }, 83 | { 84 | type: 'function', 85 | name: 'setPriceForCoffee', 86 | inputs: [{ name: '_price', type: 'uint256', internalType: 'uint256' }], 87 | outputs: [], 88 | stateMutability: 'nonpayable', 89 | }, 90 | { 91 | type: 'function', 92 | name: 'withdrawTips', 93 | inputs: [], 94 | outputs: [], 95 | stateMutability: 'nonpayable', 96 | }, 97 | { 98 | type: 'event', 99 | name: 'BuyMeACoffeeEvent', 100 | inputs: [ 101 | { name: 'buyer', type: 'address', indexed: true, internalType: 'address' }, 102 | { name: 'price', type: 'uint256', indexed: false, internalType: 'uint256' }, 103 | ], 104 | anonymous: false, 105 | }, 106 | { 107 | type: 'event', 108 | name: 'NewMemo', 109 | inputs: [ 110 | { name: 'userAddress', type: 'address', indexed: true, internalType: 'address' }, 111 | { name: 'time', type: 'uint256', indexed: false, internalType: 'uint256' }, 112 | { name: 'numCoffees', type: 'uint256', indexed: false, internalType: 'uint256' }, 113 | { name: 'message', type: 'string', indexed: false, internalType: 'string' }, 114 | ], 115 | anonymous: false, 116 | }, 117 | { type: 'error', name: 'InsufficientFunds', inputs: [] }, 118 | { 119 | type: 'error', 120 | name: 'InvalidArguments', 121 | inputs: [{ name: 'message', type: 'string', internalType: 'string' }], 122 | }, 123 | { type: 'error', name: 'OnlyOwner', inputs: [] }, 124 | ] as const; 125 | 126 | export default abi; 127 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | OnchainKit logo vibes 5 | 6 |

7 | 8 | # A Frame in 100 lines (or less) 9 | 10 | Farcaster Frames in less than 100 lines, and ready to be deployed to Vercel. 11 | 12 | To test a **deployed** Frame, use: https://warpcast.com/~/developers/frames. 13 | 14 | To test a **localhost** Frame, use: [Framegear](https://onchainkit.xyz/frame/framegear). 15 | A simple tool that allows you to run and test your frames locally: 16 | 17 | - without publishing 18 | - without casting 19 | - without spending warps 20 | 21 | And let us know what you build by either mentioning @zizzamia on [Warpcast](https://warpcast.com/zizzamia) or [X](https://twitter.com/Zizzamia). 22 | 23 |
24 | 25 | Have fun! ⛵️ 26 | 27 |
28 | 29 | ## App Routing files 30 | 31 | - app/ 32 | - [config.ts](https://github.com/Zizzamia/a-frame-in-100-lines?tab=readme-ov-file#appconfigts) 33 | - [layout.tsx](https://github.com/Zizzamia/a-frame-in-100-lines?tab=readme-ov-file#applayouttsx) 34 | - [page.tsx](https://github.com/Zizzamia/a-frame-in-100-lines?tab=readme-ov-file#apppagetsx) 35 | - api/ 36 | - frame/ 37 | - [route.ts](https://github.com/Zizzamia/a-frame-in-100-lines?tab=readme-ov-file#appapiframeroutets) 38 | 39 |
40 | 41 | ### `app/page.tsx` 42 | 43 | ```tsx 44 | import { getFrameMetadata } from '@coinbase/onchainkit/frame'; 45 | import type { Metadata } from 'next'; 46 | import { NEXT_PUBLIC_URL } from './config'; 47 | 48 | const frameMetadata = getFrameMetadata({ 49 | buttons: [ 50 | { 51 | label: 'Story time!', 52 | }, 53 | { 54 | action: 'link', 55 | label: 'Link to Google', 56 | target: 'https://www.google.com', 57 | }, 58 | { 59 | label: 'Redirect to pictures', 60 | action: 'post_redirect', 61 | }, 62 | ], 63 | image: { 64 | src: `${NEXT_PUBLIC_URL}/park-3.png`, 65 | aspectRatio: '1:1', 66 | }, 67 | input: { 68 | text: 'Tell me a boat story', 69 | }, 70 | postUrl: `${NEXT_PUBLIC_URL}/api/frame`, 71 | }); 72 | 73 | export const metadata: Metadata = { 74 | title: 'zizzamia.xyz', 75 | description: 'LFG', 76 | openGraph: { 77 | title: 'zizzamia.xyz', 78 | description: 'LFG', 79 | images: [`${NEXT_PUBLIC_URL}/park-1.png`], 80 | }, 81 | other: { 82 | ...frameMetadata, 83 | }, 84 | }; 85 | 86 | export default function Page() { 87 | return ( 88 | <> 89 |

zizzamia.xyz

90 | 91 | ); 92 | } 93 | ``` 94 | 95 | ### `app/layout.tsx` 96 | 97 | ```tsx 98 | export const viewport = { 99 | width: 'device-width', 100 | initialScale: 1.0, 101 | }; 102 | 103 | export default function RootLayout({ children }: { children: React.ReactNode }) { 104 | return ( 105 | 106 | {children} 107 | 108 | ); 109 | } 110 | ``` 111 | 112 | ### `app/config.ts` 113 | 114 | ```ts 115 | export const NEXT_PUBLIC_URL = 'https://zizzamia.xyz'; 116 | ``` 117 | 118 | ### `app/api/frame/route.ts` 119 | 120 | ```ts 121 | import { FrameRequest, getFrameMessage, getFrameHtmlResponse } from '@coinbase/onchainkit/frame'; 122 | import { NextRequest, NextResponse } from 'next/server'; 123 | import { NEXT_PUBLIC_URL } from '../../config'; 124 | 125 | async function getResponse(req: NextRequest): Promise { 126 | let accountAddress: string | undefined = ''; 127 | let text: string | undefined = ''; 128 | 129 | const body: FrameRequest = await req.json(); 130 | const { isValid, message } = await getFrameMessage(body, { neynarApiKey: 'NEYNAR_ONCHAIN_KIT' }); 131 | 132 | if (isValid) { 133 | accountAddress = message.interactor.verified_accounts[0]; 134 | } 135 | 136 | if (message?.input) { 137 | text = message.input; 138 | } 139 | 140 | if (message?.button === 3) { 141 | return NextResponse.redirect( 142 | 'https://www.google.com/search?q=cute+dog+pictures&tbm=isch&source=lnms', 143 | { status: 302 }, 144 | ); 145 | } 146 | 147 | return new NextResponse( 148 | getFrameHtmlResponse({ 149 | buttons: [ 150 | { 151 | label: `🌲 ${text} 🌲`, 152 | }, 153 | ], 154 | image: { 155 | src: `${NEXT_PUBLIC_URL}/park-1.png`, 156 | }, 157 | postUrl: `${NEXT_PUBLIC_URL}/api/frame`, 158 | }), 159 | ); 160 | } 161 | 162 | export async function POST(req: NextRequest): Promise { 163 | return getResponse(req); 164 | } 165 | 166 | export const dynamic = 'force-dynamic'; 167 | ``` 168 | 169 |
170 | 171 | ## Resources 172 | 173 | - [Official Farcaster Frames documentation](https://docs.farcaster.xyz/learn/what-is-farcaster/frames) 174 | - [Official Farcaster Frame specification](https://docs.farcaster.xyz/reference/frames/spec) 175 | - [OnchainKit documentation](https://onchainkit.xyz) 176 | 177 |
178 | 179 | ## Community ☁️ 🌁 ☁️ 180 | 181 | Check out the following places for more OnchainKit-related content: 182 | 183 | - Follow @zizzamia ([X](https://twitter.com/zizzamia), [Farcaster](https://warpcast.com/zizzamia)) for project updates 184 | - Join the discussions on our [OnchainKit warpcast channel](https://warpcast.com/~/channel/onchainkit) 185 | 186 | ## Authors 187 | 188 | - [@zizzamia](https://github.com/zizzamia.png) ([X](https://twitter.com/Zizzamia)) 189 | - [@cnasc](https://github.com/cnasc.png) ([warpcast](https://warpcast.com/cnasc)) 190 | 191 | ## License 192 | 193 | This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details 194 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@adraffy/ens-normalize@1.10.0": 6 | version "1.10.0" 7 | resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" 8 | integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== 9 | 10 | "@coinbase/onchainkit@0.14.1": 11 | version "0.14.1" 12 | resolved "https://registry.yarnpkg.com/@coinbase/onchainkit/-/onchainkit-0.14.1.tgz#8a05ec3b5f08b62b0328711ebab66e062bcbb5de" 13 | integrity sha512-yVKmhoICJaGCexVu9rFQcz2HPPh6g848kLu4imglTX4879CpEcC6LpwJ7BBdbsVcYML7F04vpvBlzBzvX62iig== 14 | 15 | "@next/env@13.5.6": 16 | version "13.5.6" 17 | resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.6.tgz#c1148e2e1aa166614f05161ee8f77ded467062bc" 18 | integrity sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw== 19 | 20 | "@next/swc-darwin-arm64@13.5.6": 21 | version "13.5.6" 22 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.6.tgz#b15d139d8971360fca29be3bdd703c108c9a45fb" 23 | integrity sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA== 24 | 25 | "@next/swc-darwin-x64@13.5.6": 26 | version "13.5.6" 27 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz#9c72ee31cc356cb65ce6860b658d807ff39f1578" 28 | integrity sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA== 29 | 30 | "@next/swc-linux-arm64-gnu@13.5.6": 31 | version "13.5.6" 32 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz#59f5f66155e85380ffa26ee3d95b687a770cfeab" 33 | integrity sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg== 34 | 35 | "@next/swc-linux-arm64-musl@13.5.6": 36 | version "13.5.6" 37 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz#f012518228017052736a87d69bae73e587c76ce2" 38 | integrity sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q== 39 | 40 | "@next/swc-linux-x64-gnu@13.5.6": 41 | version "13.5.6" 42 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz#339b867a7e9e7ee727a700b496b269033d820df4" 43 | integrity sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw== 44 | 45 | "@next/swc-linux-x64-musl@13.5.6": 46 | version "13.5.6" 47 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz#ae0ae84d058df758675830bcf70ca1846f1028f2" 48 | integrity sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ== 49 | 50 | "@next/swc-win32-arm64-msvc@13.5.6": 51 | version "13.5.6" 52 | resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz#a5cc0c16920485a929a17495064671374fdbc661" 53 | integrity sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg== 54 | 55 | "@next/swc-win32-ia32-msvc@13.5.6": 56 | version "13.5.6" 57 | resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz#6a2409b84a2cbf34bf92fe714896455efb4191e4" 58 | integrity sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg== 59 | 60 | "@next/swc-win32-x64-msvc@13.5.6": 61 | version "13.5.6" 62 | resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz#4a3e2a206251abc729339ba85f60bc0433c2865d" 63 | integrity sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ== 64 | 65 | "@noble/curves@1.2.0", "@noble/curves@~1.2.0": 66 | version "1.2.0" 67 | resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" 68 | integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== 69 | dependencies: 70 | "@noble/hashes" "1.3.2" 71 | 72 | "@noble/hashes@1.3.2": 73 | version "1.3.2" 74 | resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" 75 | integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== 76 | 77 | "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2": 78 | version "1.3.3" 79 | resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" 80 | integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== 81 | 82 | "@scure/base@~1.1.0", "@scure/base@~1.1.2": 83 | version "1.1.5" 84 | resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" 85 | integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== 86 | 87 | "@scure/bip32@1.3.2": 88 | version "1.3.2" 89 | resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.2.tgz#90e78c027d5e30f0b22c1f8d50ff12f3fb7559f8" 90 | integrity sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA== 91 | dependencies: 92 | "@noble/curves" "~1.2.0" 93 | "@noble/hashes" "~1.3.2" 94 | "@scure/base" "~1.1.2" 95 | 96 | "@scure/bip39@1.2.1": 97 | version "1.2.1" 98 | resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" 99 | integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== 100 | dependencies: 101 | "@noble/hashes" "~1.3.0" 102 | "@scure/base" "~1.1.0" 103 | 104 | "@swc/helpers@0.5.2": 105 | version "0.5.2" 106 | resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" 107 | integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== 108 | dependencies: 109 | tslib "^2.4.0" 110 | 111 | "@types/node@^20.11.8": 112 | version "20.11.10" 113 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.10.tgz#6c3de8974d65c362f82ee29db6b5adf4205462f9" 114 | integrity sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg== 115 | dependencies: 116 | undici-types "~5.26.4" 117 | 118 | "@types/prop-types@*": 119 | version "15.7.11" 120 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" 121 | integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== 122 | 123 | "@types/react@18.2.48": 124 | version "18.2.48" 125 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.48.tgz#11df5664642d0bd879c1f58bc1d37205b064e8f1" 126 | integrity sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w== 127 | dependencies: 128 | "@types/prop-types" "*" 129 | "@types/scheduler" "*" 130 | csstype "^3.0.2" 131 | 132 | "@types/scheduler@*": 133 | version "0.16.8" 134 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" 135 | integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== 136 | 137 | abitype@1.0.0: 138 | version "1.0.0" 139 | resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" 140 | integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== 141 | 142 | busboy@1.6.0: 143 | version "1.6.0" 144 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" 145 | integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== 146 | dependencies: 147 | streamsearch "^1.1.0" 148 | 149 | caniuse-lite@^1.0.30001406: 150 | version "1.0.30001581" 151 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz#0dfd4db9e94edbdca67d57348ebc070dece279f4" 152 | integrity sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ== 153 | 154 | client-only@0.0.1: 155 | version "0.0.1" 156 | resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" 157 | integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== 158 | 159 | csstype@^3.0.2: 160 | version "3.1.3" 161 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" 162 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== 163 | 164 | glob-to-regexp@^0.4.1: 165 | version "0.4.1" 166 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 167 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 168 | 169 | graceful-fs@^4.1.2: 170 | version "4.2.11" 171 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 172 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 173 | 174 | isows@1.0.3: 175 | version "1.0.3" 176 | resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" 177 | integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg== 178 | 179 | "js-tokens@^3.0.0 || ^4.0.0": 180 | version "4.0.0" 181 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 182 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 183 | 184 | loose-envify@^1.1.0: 185 | version "1.4.0" 186 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 187 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 188 | dependencies: 189 | js-tokens "^3.0.0 || ^4.0.0" 190 | 191 | nanoid@^3.3.6: 192 | version "3.3.7" 193 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 194 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 195 | 196 | next@13.5.6: 197 | version "13.5.6" 198 | resolved "https://registry.yarnpkg.com/next/-/next-13.5.6.tgz#e964b5853272236c37ce0dd2c68302973cf010b1" 199 | integrity sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw== 200 | dependencies: 201 | "@next/env" "13.5.6" 202 | "@swc/helpers" "0.5.2" 203 | busboy "1.6.0" 204 | caniuse-lite "^1.0.30001406" 205 | postcss "8.4.31" 206 | styled-jsx "5.1.1" 207 | watchpack "2.4.0" 208 | optionalDependencies: 209 | "@next/swc-darwin-arm64" "13.5.6" 210 | "@next/swc-darwin-x64" "13.5.6" 211 | "@next/swc-linux-arm64-gnu" "13.5.6" 212 | "@next/swc-linux-arm64-musl" "13.5.6" 213 | "@next/swc-linux-x64-gnu" "13.5.6" 214 | "@next/swc-linux-x64-musl" "13.5.6" 215 | "@next/swc-win32-arm64-msvc" "13.5.6" 216 | "@next/swc-win32-ia32-msvc" "13.5.6" 217 | "@next/swc-win32-x64-msvc" "13.5.6" 218 | 219 | picocolors@^1.0.0: 220 | version "1.0.0" 221 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 222 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 223 | 224 | postcss@8.4.31: 225 | version "8.4.31" 226 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" 227 | integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== 228 | dependencies: 229 | nanoid "^3.3.6" 230 | picocolors "^1.0.0" 231 | source-map-js "^1.0.2" 232 | 233 | prettier@^3.2.4: 234 | version "3.2.4" 235 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.4.tgz#4723cadeac2ce7c9227de758e5ff9b14e075f283" 236 | integrity sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ== 237 | 238 | react-dom@^18.2.0: 239 | version "18.2.0" 240 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" 241 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== 242 | dependencies: 243 | loose-envify "^1.1.0" 244 | scheduler "^0.23.0" 245 | 246 | react@^18.2.0: 247 | version "18.2.0" 248 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" 249 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== 250 | dependencies: 251 | loose-envify "^1.1.0" 252 | 253 | scheduler@^0.23.0: 254 | version "0.23.0" 255 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" 256 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== 257 | dependencies: 258 | loose-envify "^1.1.0" 259 | 260 | source-map-js@^1.0.2: 261 | version "1.0.2" 262 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 263 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 264 | 265 | streamsearch@^1.1.0: 266 | version "1.1.0" 267 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" 268 | integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== 269 | 270 | styled-jsx@5.1.1: 271 | version "5.1.1" 272 | resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" 273 | integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== 274 | dependencies: 275 | client-only "0.0.1" 276 | 277 | tslib@^2.4.0: 278 | version "2.6.2" 279 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" 280 | integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== 281 | 282 | typescript@^5.3.3: 283 | version "5.3.3" 284 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" 285 | integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== 286 | 287 | undici-types@~5.26.4: 288 | version "5.26.5" 289 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 290 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 291 | 292 | viem@^2.7.1: 293 | version "2.7.1" 294 | resolved "https://registry.yarnpkg.com/viem/-/viem-2.7.1.tgz#b46e2d012b4b543e4377da8584cd12f79c6161b1" 295 | integrity sha512-izAX2KedTFnI2l0ZshtnlK2ZuDvSlKeuaanWyNwC4ffDgrCGtwX1bvVXO3Krh53lZgqvjd8UGpjGaBl3WqJ4yQ== 296 | dependencies: 297 | "@adraffy/ens-normalize" "1.10.0" 298 | "@noble/curves" "1.2.0" 299 | "@noble/hashes" "1.3.2" 300 | "@scure/bip32" "1.3.2" 301 | "@scure/bip39" "1.2.1" 302 | abitype "1.0.0" 303 | isows "1.0.3" 304 | ws "8.13.0" 305 | 306 | watchpack@2.4.0: 307 | version "2.4.0" 308 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" 309 | integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== 310 | dependencies: 311 | glob-to-regexp "^0.4.1" 312 | graceful-fs "^4.1.2" 313 | 314 | ws@8.13.0: 315 | version "8.13.0" 316 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" 317 | integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== 318 | --------------------------------------------------------------------------------