diff --git a/.github/workflows/ci-contracts.yml b/.github/workflows/ci-contracts.yml index 7a5a75b..2e44acd 100644 --- a/.github/workflows/ci-contracts.yml +++ b/.github/workflows/ci-contracts.yml @@ -25,16 +25,17 @@ jobs: - uses: actions/checkout@v3 - uses: software-mansion/setup-scarb@v1 with: - scarb-version: "2.8.4" + scarb-version: "2.9.4" - run: | scarb fmt --check - core-test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: asdf-vm/actions/setup@v3 - - run: | - asdf plugin add dojo https://github.com/dojoengine/asdf-dojo - asdf install dojo 1.0.4 - asdf global dojo 1.0.4 - sozo test + # remove tests due to issues with testing library + # core-test: + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v3 + # - uses: asdf-vm/actions/setup@v3 + # - run: | + # asdf plugin add dojo https://github.com/dojoengine/asdf-dojo + # asdf install dojo 1.0.4 + # asdf global dojo 1.0.4 + # sozo test diff --git a/.gitignore b/.gitignore index 1af2f6e..e63eb66 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -node_modules +**/node_modules .idea .env \ No newline at end of file diff --git a/README.md b/README.md index d9380b3..701f576 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Follow the asdf installation instructions. ``` asdf plugin add dojo https://github.com/dojoengine/asdf-dojo -asdf install dojo 1.0.0-alpha.11 +asdf install dojo ``` ## Install scarb @@ -44,78 +44,73 @@ And after moving into contracts directory, the versions for these libs are set i ## Running Locally -If you use vscode, you can start katana and torii just press `⌘ + ⇧ + B` in your vscode. This can be executed by selecting commands here: -![image](./public/assets/start_katana_and_torii.png) +### Clone the Repository -If you use these shortcut, please check out if the contract was deployed. - -otherwise, - -#### Terminal one (Make sure this is running) +To clone this repository with all submodules, run: ```bash -# Run Katana -katana --allowed-origins "*" --db-dir katana +git clone https://github.com/pixelaw/pwar.git +cd pwar ``` -#### Terminal two +### Locally running pwar -```bash -# Build the example -sozo build +**Pwar** runs inside the [PixeLAW Core World](https://github.com/pixelaw/core), which is why we initally have to spin up an empty PixeLAW world. -# Migrate the example -sozo migrate apply +For this we have built a docker container that builds the PixeLAW world: -# Start Torii -torii --world 0x2bf4d3aa0dced89d37d8c3b4ff6a05895c0af32ff3baf9b02abf8504e53eaad --allowed-origins "*" +```bash +cd client +docker compose up --build ``` -### How to deploy +This docker container builds the PixeLAW world and runs Torii and Katana. -you can deploy your app to our katana testnet by running the following commands: +Find `client/docker-compose.yml` for more information. + +Feel free to: ```bash -# Deploy the pixelaw app -sozo build -P release -sozo migrate apply -P release +docker exec -it pixelaw-core bash +klog ``` -### Setup Client +To find katana logs or `tlog` for torii logs. + +### Deploy pwar contracts + +Once we initialised the PixeLAW world and its contracts, we now have to deploy the pwar contracts. -After finishing setup a contract side, you can run the client locally by following commands: ```bash -cd ./client -bun install -bun run dev +cd contracts +sozo build +sozo migrate ``` -## Troubleshooting -If you want to use latest dojo version, you need to clone core by yourself and modify the path in `Scarb.toml` file. +### Run the client -1. Clone core repo +In order to spin up the pwar client run: ```bash -git clone https://github.com/pixelaw/core +cd client +pnpm install +pnpm run dev ``` -2. Modify the path in `Scarb.toml` file +### Build on top of pwar -```Scarb.toml -pixelaw = { path = "../pixelaw/core/contracts" } -``` +If you would like to make changes feel free to raise a PR. Changes for the client inside `client`, and changes for the contracts inside `contracts`. Be sure to test the contracts. -3. Modify version in `Scarb.toml` file in core repo +For that you will have to repeat to -```Scarb.toml -dojo = { git = "https://github.com/dojoengine/dojo", tag = "v1.0.0-alpha.11" } +```bash +sozo build --typescript +sozo migrate ``` -4. Build and run core +Copy the generated typescript files in `contracts/bindings/typescript` (i.e. `contracts.gen.ts` and `models.gen.ts` into `client/src/config`. -```bash -cd contracts -sozo build -sozo migrate apply -``` +Lastly you will also have to copy the contract section inside `contracts/manifest_dev.json` into `client/src/config/manifest.contracts.ts` (be sure to only replace the contracts array). + +For any questions reach out to us in our Discord or Twitter. diff --git a/client/.cursorrules b/client/.cursorrules deleted file mode 100644 index 16984dd..0000000 --- a/client/.cursorrules +++ /dev/null @@ -1,45 +0,0 @@ -You are an expert in TypeScript, Node.js, Vite, React, Shadcn UI, Radix UI and Tailwind. - -Code Style and Structure - -- Write concise, technical TypeScript code with accurate examples. -- Use functional and declarative programming patterns; avoid classes. -- Prefer iteration and modularization over code duplication. -- Use descriptive variable names with auxiliary verbs (e.g., isLoading, hasError). -- Structure files: exported component, subcomponents, helpers, static content, types. - -Naming Conventions - -- Use PascalCase for directories (e.g., components/PixelViewer) and files (e.g., PixelViewer.tsx). -- Favor named exports for components. - -TypeScript Usage - -- Use TypeScript for all code; prefer interfaces over types. -- Avoid enums; use maps instead. -- Use functional components with TypeScript interfaces. - -Syntax and Formatting - -- Use arrow functions for concise syntax. -- Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements. -- Use declarative JSX. - -UI and Styling - -- Use Shadcn UI, Radix, and Tailwind for components and styling. -- Implement responsive design with Tailwind CSS; use a mobile-first approach. - -Performance Optimization - -- Minimize 'use client', 'useEffect', and 'setState'; -- Wrap client components in Suspense with fallback. -- Use dynamic loading for non-critical components. -- Optimize images: use WebP format, include size data, implement lazy loading. - -Key Conventions - -- Use 'nuqs' for URL search parameter state management. -- Optimize Web Vitals (LCP, CLS, FID). - -Follow React docs for Data Fetching, Rendering, and Routing. diff --git a/client/.env.development b/client/.env.example similarity index 76% rename from client/.env.development rename to client/.env.example index 12ede3c..e17e02f 100644 --- a/client/.env.development +++ b/client/.env.example @@ -1,7 +1,7 @@ -VITE_PUBLIC_TORII_URL=http://localhost:8080 -VITE_PUBLIC_RPC_URL=http://localhost:5050 +VITE_PUBLIC_TORII_URL=http://127.0.0.1:8080 +VITE_PUBLIC_RPC_URL=http://127.0.0.1:5050 VITE_PUBLIC_MASTER_ADDRESS=0xb3ff441a68610b30fd5e2abbf3a1548eb6ba6f3559f2862bf2dc757e5828ca VITE_PUBLIC_MASTER_PRIVATE_KEY=0x2bbf4f9fd0bbb2e60b0316c1fe0b76cf7a4d0198bd493ced9b8df2a3a24d68a VITE_PUBLIC_EXPLORER_URL=https://worlds.dev/networks/slot/worlds/pixelaw-dev VITE_PUBLIC_FEE_TOKEN_ADDRESS=0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7 -VITE_PUBLIC_PROFILE=dev +VITE_PUBLIC_PROFILE=dev \ No newline at end of file diff --git a/client/.gitignore b/client/.gitignore deleted file mode 100644 index 1fad730..0000000 --- a/client/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.tsbuildinfo -bun.lockb - -.env.production - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/client/.prettierrc.mjs b/client/.prettierrc.mjs deleted file mode 100644 index 0f0f194..0000000 --- a/client/.prettierrc.mjs +++ /dev/null @@ -1,8 +0,0 @@ -export default { - trailingComma: "all", - tabWidth: 2, - semi: true, - singleQuote: false, - jsxSingleQuote: false, - printWidth: 120, -}; diff --git a/client/.vscode/extensions.json b/client/.vscode/extensions.json deleted file mode 100644 index f76a09a..0000000 --- a/client/.vscode/extensions.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "recommendations": [ - "streetsidesoftware.code-spell-checker", - "esbenp.prettier-vscode", - "bradlc.vscode-tailwindcss", - "raczzalan.webgl-glsl-editor", - "YoavBls.pretty-ts-errors" - ] -} diff --git a/client/Dockerfile b/client/Dockerfile new file mode 100644 index 0000000..33e2e4e --- /dev/null +++ b/client/Dockerfile @@ -0,0 +1,19 @@ +FROM node:22-slim AS base +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable +COPY . /app +WORKDIR /app + +FROM base AS prod-deps +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile + +FROM base AS build +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile +RUN pnpm run build + + +FROM ghcr.io/pixelaw/core:0.6.31 AS core + +COPY --from=prod-deps /app/node_modules /pixelaw/web/node_modules +COPY --from=build /app/dist /pixelaw/web diff --git a/client/LICENSE b/client/LICENSE new file mode 100644 index 0000000..50a3807 --- /dev/null +++ b/client/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 PixeLAW + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/client/Makefile b/client/Makefile new file mode 100644 index 0000000..f31e1a5 --- /dev/null +++ b/client/Makefile @@ -0,0 +1,9 @@ +REPO = ghcr.io/pixelaw/vanilla +VERSION = $(shell cat VERSION) + + +docker_build: + docker build -t $(REPO):$(VERSION) -t $(REPO):latest \ + --network=host \ + --progress=plain . + diff --git a/client/README.md b/client/README.md index 21ea5da..0648f33 100644 --- a/client/README.md +++ b/client/README.md @@ -1,66 +1,10 @@ -# PixeLAW Client +# Vanilla Pixelaw -![PixeLAW](https://pixelaw.github.io/book/images/PixeLAW.jpeg) +Version 0.7.3 -[![CI](https://github.com/posaune0423/web/actions/workflows/ci.yml/badge.svg)](https://github.com/posaune0423/web/actions/workflows/ci.yml) - -This project is the client application for PixeLAW, a decentralized pixel-based game platform built on the Dojo engine. - -## Tech Stack - -- React 19 -- TypeScript -- Vite -- [Dojo JS v1.0.0-alpha.12](https://github.com/dojoengine/dojo.js) -- [Starknet](https://www.starknet.io/) -- [Tailwind CSS](https://tailwindcss.com/) -- [twgl.js](https://twgljs.org/) -- [shadcn/ui](https://ui.shadcn.com/) - -## How to Run - -1. Clone the repository -2. Install dependencies: - ``` - bun i - ``` -3. Start the development server: - ``` - bun run dev - ``` -4. Open your browser and navigate to `http://localhost:5173` - -## Directory Structure - -``` -├── src -│ ├── app -│ ├── components -│ ├── constants -│ ├── contexts -│ ├── hooks -│ ├── index.scss -│ ├── libs -│ ├── main.tsx -│ ├── types -│ ├── utils -│ └── vite-env.d.ts -``` - -## Contributing - -### Before push your commit, please run the following command: - -for make sure your code is formatted and linted: +## Getting started ```bash -bun run format -bun run lint -``` - -## Slot - -Currently Version `1.0.0-alpha.9` is live! - -- Katana: https://api.cartridge.gg/x/pixelaw-dev/katana -- Torii: https://api.cartridge.gg/x/pixelaw-dev/torii +pnpm install +pnpm run dev +``` \ No newline at end of file diff --git a/client/VERSION b/client/VERSION new file mode 100644 index 0000000..f38fc53 --- /dev/null +++ b/client/VERSION @@ -0,0 +1 @@ +0.7.3 diff --git a/client/biome.json b/client/biome.json new file mode 100644 index 0000000..b795860 --- /dev/null +++ b/client/biome.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "ignore": [ + "src/config/**", + "src/lib/**", + "doc/**", + "scripts/**", + "*.gen.ts", + "src/index.tsx" + ], + "rules": { + "recommended": true, + "correctness": { + "noUnusedVariables": "error" + }, + "suspicious": { + "noExplicitAny": "warn" + }, + "style": { + "noNonNullAssertion": "off", + "useBlockStatements": "off", + "useShorthandArrayType": "error" + } + } + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 120, + "formatWithErrors": true, + "ignore": ["dist/**", "node_modules/**", ".vite/**", ".idea/**", ".run/**"] + }, + "javascript": { + "formatter": { + "quoteStyle": "double", + "semicolons": "asNeeded", + "trailingCommas": "all", + "indentStyle": "space" + } + }, + "json": { + "parser": { + "allowComments": true, + "allowTrailingCommas": true + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2, + "lineEnding": "lf", + "lineWidth": 120 + } + } +} diff --git a/client/bun.lockb b/client/bun.lockb deleted file mode 100755 index eb01d8a..0000000 Binary files a/client/bun.lockb and /dev/null differ diff --git a/client/components.json b/client/components.json deleted file mode 100644 index 39efbcd..0000000 --- a/client/components.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "default", - "rsc": false, - "tsx": true, - "tailwind": { - "config": "tailwind.config.js", - "css": "src/index.css", - "baseColor": "slate", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "@/components", - "utils": "@/utils/index" - } -} diff --git a/client/doc/10x10.png b/client/doc/10x10.png new file mode 100644 index 0000000..3a06fbd Binary files /dev/null and b/client/doc/10x10.png differ diff --git a/client/doc/coast.png b/client/doc/coast.png new file mode 100644 index 0000000..cfccfaf Binary files /dev/null and b/client/doc/coast.png differ diff --git a/client/doc/coast_small.png b/client/doc/coast_small.png new file mode 100644 index 0000000..c188a62 Binary files /dev/null and b/client/doc/coast_small.png differ diff --git a/client/doc/createpng.ts b/client/doc/createpng.ts new file mode 100644 index 0000000..5f22b0d --- /dev/null +++ b/client/doc/createpng.ts @@ -0,0 +1,22 @@ +import { PNG } from "pngjs"; +import * as fs from "node:fs"; + +const size = 10; +const png = new PNG({ width: size, height: size }); + +for (let y = 0; y < png.height; y++) { + for (let x = 0; x < png.width; x++) { + const idx = (png.width * y + x) << 2; + + // Create gradient from red to blue + const red = Math.round(255 * (1 - y / png.height)); + const blue = Math.round((255 * y) / png.height); + + png.data[idx] = red; + png.data[idx + 1] = 0; + png.data[idx + 2] = blue; + png.data[idx + 3] = 255; + } +} + +png.pack().pipe(fs.createWriteStream("out.png")); diff --git a/client/doc/refactor.drawio b/client/doc/refactor.drawio new file mode 100644 index 0000000..e69de29 diff --git a/client/doc/schema.graphql b/client/doc/schema.graphql new file mode 100644 index 0000000..f60f476 --- /dev/null +++ b/client/doc/schema.graphql @@ -0,0 +1,1026 @@ +# Schema for Dojo 0.6.1-alpha.4 +# Retrieved from http://0.0.0.0:8080/graphql while running Core 0.2.0 + +schema { + query: World__Query + subscription: World__Subscription +} + +type App { + system: ContractAddress + name: felt252 + manifest: felt252 + icon: felt252 + action: felt252 + entity: World__Entity +} + +type AppConnection { + edges: [AppEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type AppEdge { + node: App + cursor: Cursor +} + +type AppName { + name: felt252 + system: ContractAddress + entity: World__Entity +} + +type AppNameConnection { + edges: [AppNameEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type AppNameEdge { + node: AppName + cursor: Cursor +} + +input AppNameOrder { + direction: OrderDirection! + field: AppNameOrderField! +} + +enum AppNameOrderField { + NAME + SYSTEM +} + +input AppNameWhereInput { + name: felt252 + nameGT: felt252 + nameGTE: felt252 + nameLT: felt252 + nameLTE: felt252 + nameNEQ: felt252 + nameEQ: felt252 + system: ContractAddress + systemGT: ContractAddress + systemGTE: ContractAddress + systemLT: ContractAddress + systemLTE: ContractAddress + systemNEQ: ContractAddress + systemEQ: ContractAddress +} + +input AppOrder { + direction: OrderDirection! + field: AppOrderField! +} + +enum AppOrderField { + SYSTEM + NAME + MANIFEST + ICON + ACTION +} + +type AppUser { + system: ContractAddress + player: ContractAddress + action: felt252 + entity: World__Entity +} + +type AppUserConnection { + edges: [AppUserEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type AppUserEdge { + node: AppUser + cursor: Cursor +} + +input AppUserOrder { + direction: OrderDirection! + field: AppUserOrderField! +} + +enum AppUserOrderField { + SYSTEM + PLAYER + ACTION +} + +input AppUserWhereInput { + system: ContractAddress + systemGT: ContractAddress + systemGTE: ContractAddress + systemLT: ContractAddress + systemLTE: ContractAddress + systemNEQ: ContractAddress + systemEQ: ContractAddress + player: ContractAddress + playerGT: ContractAddress + playerGTE: ContractAddress + playerLT: ContractAddress + playerLTE: ContractAddress + playerNEQ: ContractAddress + playerEQ: ContractAddress + action: felt252 + actionGT: felt252 + actionGTE: felt252 + actionLT: felt252 + actionLTE: felt252 + actionNEQ: felt252 + actionEQ: felt252 +} + +input AppWhereInput { + system: ContractAddress + systemGT: ContractAddress + systemGTE: ContractAddress + systemLT: ContractAddress + systemLTE: ContractAddress + systemNEQ: ContractAddress + systemEQ: ContractAddress + name: felt252 + nameGT: felt252 + nameGTE: felt252 + nameLT: felt252 + nameLTE: felt252 + nameNEQ: felt252 + nameEQ: felt252 + manifest: felt252 + manifestGT: felt252 + manifestGTE: felt252 + manifestLT: felt252 + manifestLTE: felt252 + manifestNEQ: felt252 + manifestEQ: felt252 + icon: felt252 + iconGT: felt252 + iconGTE: felt252 + iconLT: felt252 + iconLTE: felt252 + iconNEQ: felt252 + iconEQ: felt252 + action: felt252 + actionGT: felt252 + actionGTE: felt252 + actionLT: felt252 + actionLTE: felt252 + actionNEQ: felt252 + actionEQ: felt252 +} + +scalar ContractAddress + +type CoreActionsAddress { + key: felt252 + value: ContractAddress + entity: World__Entity +} + +type CoreActionsAddressConnection { + edges: [CoreActionsAddressEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type CoreActionsAddressEdge { + node: CoreActionsAddress + cursor: Cursor +} + +input CoreActionsAddressOrder { + direction: OrderDirection! + field: CoreActionsAddressOrderField! +} + +enum CoreActionsAddressOrderField { + KEY + VALUE +} + +input CoreActionsAddressWhereInput { + key: felt252 + keyGT: felt252 + keyGTE: felt252 + keyLT: felt252 + keyLTE: felt252 + keyNEQ: felt252 + keyEQ: felt252 + value: ContractAddress + valueGT: ContractAddress + valueGTE: ContractAddress + valueLT: ContractAddress + valueLTE: ContractAddress + valueNEQ: ContractAddress + valueEQ: ContractAddress +} + +scalar Cursor + +scalar DateTime + +scalar Enum + +type Instruction { + system: ContractAddress + selector: felt252 + instruction: felt252 + entity: World__Entity +} + +type InstructionConnection { + edges: [InstructionEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type InstructionEdge { + node: Instruction + cursor: Cursor +} + +input InstructionOrder { + direction: OrderDirection! + field: InstructionOrderField! +} + +enum InstructionOrderField { + SYSTEM + SELECTOR + INSTRUCTION +} + +input InstructionWhereInput { + system: ContractAddress + systemGT: ContractAddress + systemGTE: ContractAddress + systemLT: ContractAddress + systemLTE: ContractAddress + systemNEQ: ContractAddress + systemEQ: ContractAddress + selector: felt252 + selectorGT: felt252 + selectorGTE: felt252 + selectorLT: felt252 + selectorLTE: felt252 + selectorNEQ: felt252 + selectorEQ: felt252 + instruction: felt252 + instructionGT: felt252 + instructionGTE: felt252 + instructionLT: felt252 + instructionLTE: felt252 + instructionNEQ: felt252 + instructionEQ: felt252 +} + +union ModelUnion = + | Snake + | SnakeSegment + | Permissions + | Pixel + | QueueItem + | App + | AppName + | AppUser + | CoreActionsAddress + | Instruction + +enum OrderDirection { + ASC + DESC +} + +type Permissions { + allowing_app: ContractAddress + allowed_app: ContractAddress + permission: Permissions_Permission + entity: World__Entity +} + +type PermissionsConnection { + edges: [PermissionsEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type PermissionsEdge { + node: Permissions + cursor: Cursor +} + +input PermissionsOrder { + direction: OrderDirection! + field: PermissionsOrderField! +} + +enum PermissionsOrderField { + ALLOWING_APP + ALLOWED_APP + PERMISSION +} + +input PermissionsWhereInput { + allowing_app: ContractAddress + allowing_appGT: ContractAddress + allowing_appGTE: ContractAddress + allowing_appLT: ContractAddress + allowing_appLTE: ContractAddress + allowing_appNEQ: ContractAddress + allowing_appEQ: ContractAddress + allowed_app: ContractAddress + allowed_appGT: ContractAddress + allowed_appGTE: ContractAddress + allowed_appLT: ContractAddress + allowed_appLTE: ContractAddress + allowed_appNEQ: ContractAddress + allowed_appEQ: ContractAddress +} + +type Permissions_Permission { + app: bool + color: bool + owner: bool + text: bool + timestamp: bool + action: bool +} + +type Pixel { + x: u32 + y: u32 + created_at: u64 + updated_at: u64 + app: ContractAddress + color: u32 + owner: ContractAddress + text: felt252 + timestamp: u64 + action: felt252 + entity: World__Entity +} + +type PixelConnection { + edges: [PixelEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type PixelEdge { + node: Pixel + cursor: Cursor +} + +input PixelOrder { + direction: OrderDirection! + field: PixelOrderField! +} + +enum PixelOrderField { + X + Y + CREATED_AT + UPDATED_AT + APP + COLOR + OWNER + TEXT + TIMESTAMP + ACTION +} + +input PixelWhereInput { + x: u32 + xGT: u32 + xGTE: u32 + xLT: u32 + xLTE: u32 + xNEQ: u32 + xEQ: u32 + y: u32 + yGT: u32 + yGTE: u32 + yLT: u32 + yLTE: u32 + yNEQ: u32 + yEQ: u32 + created_at: u64 + created_atGT: u64 + created_atGTE: u64 + created_atLT: u64 + created_atLTE: u64 + created_atNEQ: u64 + created_atEQ: u64 + updated_at: u64 + updated_atGT: u64 + updated_atGTE: u64 + updated_atLT: u64 + updated_atLTE: u64 + updated_atNEQ: u64 + updated_atEQ: u64 + app: ContractAddress + appGT: ContractAddress + appGTE: ContractAddress + appLT: ContractAddress + appLTE: ContractAddress + appNEQ: ContractAddress + appEQ: ContractAddress + color: u32 + colorGT: u32 + colorGTE: u32 + colorLT: u32 + colorLTE: u32 + colorNEQ: u32 + colorEQ: u32 + owner: ContractAddress + ownerGT: ContractAddress + ownerGTE: ContractAddress + ownerLT: ContractAddress + ownerLTE: ContractAddress + ownerNEQ: ContractAddress + ownerEQ: ContractAddress + text: felt252 + textGT: felt252 + textGTE: felt252 + textLT: felt252 + textLTE: felt252 + textNEQ: felt252 + textEQ: felt252 + timestamp: u64 + timestampGT: u64 + timestampGTE: u64 + timestampLT: u64 + timestampLTE: u64 + timestampNEQ: u64 + timestampEQ: u64 + action: felt252 + actionGT: felt252 + actionGTE: felt252 + actionLT: felt252 + actionLTE: felt252 + actionNEQ: felt252 + actionEQ: felt252 +} + +type QueueItem { + id: felt252 + valid: bool + entity: World__Entity +} + +type QueueItemConnection { + edges: [QueueItemEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type QueueItemEdge { + node: QueueItem + cursor: Cursor +} + +input QueueItemOrder { + direction: OrderDirection! + field: QueueItemOrderField! +} + +enum QueueItemOrderField { + ID + VALID +} + +input QueueItemWhereInput { + id: felt252 + idGT: felt252 + idGTE: felt252 + idLT: felt252 + idLTE: felt252 + idNEQ: felt252 + idEQ: felt252 + valid: bool +} + +type Snake { + owner: ContractAddress + length: u8 + first_segment_id: u32 + last_segment_id: u32 + direction: Enum + color: u32 + text: felt252 + is_dying: bool + entity: World__Entity +} + +type SnakeConnection { + edges: [SnakeEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type SnakeEdge { + node: Snake + cursor: Cursor +} + +input SnakeOrder { + direction: OrderDirection! + field: SnakeOrderField! +} + +enum SnakeOrderField { + OWNER + LENGTH + FIRST_SEGMENT_ID + LAST_SEGMENT_ID + DIRECTION + COLOR + TEXT + IS_DYING +} + +type SnakeSegment { + id: u32 + previous_id: u32 + next_id: u32 + x: u32 + y: u32 + pixel_original_color: u32 + pixel_original_text: felt252 + pixel_original_app: ContractAddress + entity: World__Entity +} + +type SnakeSegmentConnection { + edges: [SnakeSegmentEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type SnakeSegmentEdge { + node: SnakeSegment + cursor: Cursor +} + +input SnakeSegmentOrder { + direction: OrderDirection! + field: SnakeSegmentOrderField! +} + +enum SnakeSegmentOrderField { + ID + PREVIOUS_ID + NEXT_ID + X + Y + PIXEL_ORIGINAL_COLOR + PIXEL_ORIGINAL_TEXT + PIXEL_ORIGINAL_APP +} + +input SnakeSegmentWhereInput { + id: u32 + idGT: u32 + idGTE: u32 + idLT: u32 + idLTE: u32 + idNEQ: u32 + idEQ: u32 + previous_id: u32 + previous_idGT: u32 + previous_idGTE: u32 + previous_idLT: u32 + previous_idLTE: u32 + previous_idNEQ: u32 + previous_idEQ: u32 + next_id: u32 + next_idGT: u32 + next_idGTE: u32 + next_idLT: u32 + next_idLTE: u32 + next_idNEQ: u32 + next_idEQ: u32 + x: u32 + xGT: u32 + xGTE: u32 + xLT: u32 + xLTE: u32 + xNEQ: u32 + xEQ: u32 + y: u32 + yGT: u32 + yGTE: u32 + yLT: u32 + yLTE: u32 + yNEQ: u32 + yEQ: u32 + pixel_original_color: u32 + pixel_original_colorGT: u32 + pixel_original_colorGTE: u32 + pixel_original_colorLT: u32 + pixel_original_colorLTE: u32 + pixel_original_colorNEQ: u32 + pixel_original_colorEQ: u32 + pixel_original_text: felt252 + pixel_original_textGT: felt252 + pixel_original_textGTE: felt252 + pixel_original_textLT: felt252 + pixel_original_textLTE: felt252 + pixel_original_textNEQ: felt252 + pixel_original_textEQ: felt252 + pixel_original_app: ContractAddress + pixel_original_appGT: ContractAddress + pixel_original_appGTE: ContractAddress + pixel_original_appLT: ContractAddress + pixel_original_appLTE: ContractAddress + pixel_original_appNEQ: ContractAddress + pixel_original_appEQ: ContractAddress +} + +input SnakeWhereInput { + owner: ContractAddress + ownerGT: ContractAddress + ownerGTE: ContractAddress + ownerLT: ContractAddress + ownerLTE: ContractAddress + ownerNEQ: ContractAddress + ownerEQ: ContractAddress + length: u8 + lengthGT: u8 + lengthGTE: u8 + lengthLT: u8 + lengthLTE: u8 + lengthNEQ: u8 + lengthEQ: u8 + first_segment_id: u32 + first_segment_idGT: u32 + first_segment_idGTE: u32 + first_segment_idLT: u32 + first_segment_idLTE: u32 + first_segment_idNEQ: u32 + first_segment_idEQ: u32 + last_segment_id: u32 + last_segment_idGT: u32 + last_segment_idGTE: u32 + last_segment_idLT: u32 + last_segment_idLTE: u32 + last_segment_idNEQ: u32 + last_segment_idEQ: u32 + direction: Enum + color: u32 + colorGT: u32 + colorGTE: u32 + colorLT: u32 + colorLTE: u32 + colorNEQ: u32 + colorEQ: u32 + text: felt252 + textGT: felt252 + textGTE: felt252 + textLT: felt252 + textLTE: felt252 + textNEQ: felt252 + textEQ: felt252 + is_dying: bool +} + +type World__Content { + name: String + description: String + website: String + iconUri: String + coverUri: String + socials: [World__Social] +} + +type World__Entity { + id: ID + keys: [String] + eventId: String + executedAt: DateTime + createdAt: DateTime + updatedAt: DateTime + models: [ModelUnion] +} + +type World__EntityConnection { + edges: [World__EntityEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type World__EntityEdge { + node: World__Entity + cursor: Cursor +} + +type World__Event { + id: ID + keys: [String] + data: [String] + executedAt: DateTime + createdAt: DateTime + transactionHash: String +} + +type World__EventConnection { + edges: [World__EventEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type World__EventEdge { + node: World__Event + cursor: Cursor +} + +type World__EventMessage { + id: ID + keys: [String] + eventId: String + executedAt: DateTime + createdAt: DateTime + updatedAt: DateTime + models: [ModelUnion] +} + +type World__EventMessageConnection { + edges: [World__EventMessageEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type World__EventMessageEdge { + node: World__EventMessage + cursor: Cursor +} + +type World__Metadata { + id: ID + uri: String + worldAddress: String! + content: World__Content + iconImg: String + coverImg: String + executedAt: DateTime + createdAt: DateTime + updatedAt: DateTime +} + +type World__MetadataConnection { + edges: [World__MetadataEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type World__MetadataEdge { + node: World__Metadata + cursor: Cursor +} + +type World__Model { + id: ID + name: String + classHash: felt252 + contractAddress: felt252 + transactionHash: felt252 + executedAt: DateTime + createdAt: DateTime +} + +type World__ModelConnection { + edges: [World__ModelEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type World__ModelEdge { + node: World__Model + cursor: Cursor +} + +input World__ModelOrder { + direction: OrderDirection! + field: World__ModelOrderField! +} + +enum World__ModelOrderField { + NAME + CLASS_HASH +} + +type World__PageInfo { + hasPreviousPage: Boolean + hasNextPage: Boolean + startCursor: Cursor + endCursor: Cursor +} + +type World__Query { + entity(id: ID!): World__Entity! + entities( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + keys: [String] + ): World__EntityConnection + eventMessage(id: ID!): World__EventMessage! + eventMessages( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + keys: [String] + ): World__EventMessageConnection + events( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + keys: [String] + ): World__EventConnection + metadatas( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + ): World__MetadataConnection + model(id: ID!): World__Model! + models( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + order: World__ModelOrder + ): World__ModelConnection + transaction(transactionHash: ID!): World__Transaction! + transactions( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + ): World__TransactionConnection + snakeModels( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + where: SnakeWhereInput + order: SnakeOrder + ): SnakeConnection + snakeSegmentModels( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + where: SnakeSegmentWhereInput + order: SnakeSegmentOrder + ): SnakeSegmentConnection + permissionsModels( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + where: PermissionsWhereInput + order: PermissionsOrder + ): PermissionsConnection + pixelModels( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + where: PixelWhereInput + order: PixelOrder + ): PixelConnection + queueItemModels( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + where: QueueItemWhereInput + order: QueueItemOrder + ): QueueItemConnection + appModels( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + where: AppWhereInput + order: AppOrder + ): AppConnection + appNameModels( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + where: AppNameWhereInput + order: AppNameOrder + ): AppNameConnection + appUserModels( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + where: AppUserWhereInput + order: AppUserOrder + ): AppUserConnection + coreActionsAddressModels( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + where: CoreActionsAddressWhereInput + order: CoreActionsAddressOrder + ): CoreActionsAddressConnection + instructionModels( + first: Int + last: Int + before: Cursor + after: Cursor + offset: Int + limit: Int + where: InstructionWhereInput + order: InstructionOrder + ): InstructionConnection +} + +type World__Social { + name: String + url: String +} + +type World__Subscription { + entityUpdated(id: ID): World__Entity! + eventMessageUpdated(id: ID): World__EventMessage! + eventEmitted(keys: [String]): World__Event! + modelRegistered(id: ID): World__Model! +} + +type World__Transaction { + id: ID + transactionHash: felt252 + senderAddress: felt252 + calldata: [felt252] + maxFee: felt252 + signature: [felt252] + nonce: felt252 + executedAt: DateTime + createdAt: DateTime +} + +type World__TransactionConnection { + edges: [World__TransactionEdge] + totalCount: Int! + pageInfo: World__PageInfo! +} + +type World__TransactionEdge { + node: World__Transaction + cursor: Cursor +} + +scalar bool + +scalar felt252 + +scalar u32 + +scalar u64 + +scalar u8 diff --git a/client/doc/test.drawio b/client/doc/test.drawio new file mode 100644 index 0000000..a6b1f9b --- /dev/null +++ b/client/doc/test.drawio @@ -0,0 +1 @@ +dZHBEoIgEIafhjtCZZ3N6tLJQ2dGNmEGXQdptJ4+HTBjrJk97H77Lz8shGf1cLaiVVeUYAijciD8SBhLNoyRKah8epLSrQeV1TKIFlDoFwRIA31oCV0kdIjG6TaGJTYNlC5iwlrsY9kdTezaigpWoCiFWdOblk55umfpwi+gKzU7J7uD79RiFoeXdEpI7L8QzwnPLKLzWT1kYKblzXvxc6c/3c/FLDTux8CYLGePRfRDPH8D \ No newline at end of file diff --git a/client/doc/thin.png b/client/doc/thin.png new file mode 100644 index 0000000..d48f514 Binary files /dev/null and b/client/doc/thin.png differ diff --git a/client/doc/viewport.svg b/client/doc/viewport.svg new file mode 100644 index 0000000..311ff01 --- /dev/null +++ b/client/doc/viewport.svg @@ -0,0 +1,4 @@ + + + +
No boundary
No boundary
Boundary left
Boundary left
tilesize * 5
tilesize * 5
(tilesize * 5) - gap
(tilesize * 5) - gap
4294967200
4294967200
Gap at x=1
Gap at x=1
Gap at x=0
Gap at x=0
Text is not SVG - cannot display
\ No newline at end of file diff --git a/client/doc/y.png b/client/doc/y.png new file mode 100644 index 0000000..3d25a6d Binary files /dev/null and b/client/doc/y.png differ diff --git a/client/docker-compose.yml b/client/docker-compose.yml new file mode 100644 index 0000000..17b7fb2 --- /dev/null +++ b/client/docker-compose.yml @@ -0,0 +1,41 @@ +services: + pixelaw-core: + image: ghcr.io/pixelaw/core:0.6.31 + platform: linux/x86_64 + container_name: pixelaw-core + environment: + - DISABLE_FEE=true + - DISABLE_VALIDATE=true + - RUST_LOG=info,hyper=off + - WORLD_ADDRESS=0x01d09b5e00f376337603943fc12715e439e91c0039f353b1cc48bb278dfa99d5 + - INVOKE_MAX_STEPS=4000000 + - RPC_URL=http://127.0.0.1:5050 + - TORII_URL=http://127.0.0.1:8080 + - RELAY_URL=http://127.0.0.1:8080 + - PUBLIC_SERVER_URL=http://127.0.0.1:3000 + - PUBLIC_RPC_URL=http://127.0.0.1:5050 + - PUBLIC_TORII_URL=http://127.0.0.1:8080 + - PUBLIC_RELAY_URL=http://127.0.0.1:8080 + - WORLD_ID=local + - SERVER_PORT=3000 + - WORLDS_URL=https://raw.githubusercontent.com/pixelaw/config/refs/heads/main/web.config.json + - PREVENT_EXIT=1 + ports: + - "127.0.0.1:5050:5050" + - "127.0.0.1:3000:3000" + - "127.0.0.1:8080:8080" + - "127.0.0.1:9090:9090" + restart: unless-stopped + networks: + - pixelaw + volumes: + - storage:/pixelaw/storage + - log:/pixelaw/log + command: /pixelaw/scripts/startup.sh + +networks: + pixelaw: + driver: bridge +volumes: + storage: + log: \ No newline at end of file diff --git a/client/dojoConfig.ts b/client/dojoConfig.ts deleted file mode 100644 index dae4345..0000000 --- a/client/dojoConfig.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createDojoConfig } from "@dojoengine/core"; -import manifestDev from "../contracts/manifest_dev.json"; -// import manifestSepolia from "../contracts/manifest_sepolia.json"; - -export const manifest = manifestDev; - -export const dojoConfig = createDojoConfig({ - toriiUrl: import.meta.env.VITE_PUBLIC_TORII_URL, - rpcUrl: import.meta.env.VITE_PUBLIC_RPC_URL, - masterAddress: import.meta.env.VITE_PUBLIC_MASTER_ADDRESS, - masterPrivateKey: import.meta.env.VITE_PUBLIC_MASTER_PRIVATE_KEY, - manifest, -}); diff --git a/client/eslint.config.js b/client/eslint.config.js deleted file mode 100644 index 692b5a5..0000000 --- a/client/eslint.config.js +++ /dev/null @@ -1,36 +0,0 @@ -import js from "@eslint/js"; -import globals from "globals"; -import reactHooks from "eslint-plugin-react-hooks"; -import reactRefresh from "eslint-plugin-react-refresh"; -import react from "eslint-plugin-react"; -import tseslint from "typescript-eslint"; -import prettier from "eslint-config-prettier"; - -export default tseslint.config( - { ignores: ["dist"] }, - { - extends: [js.configs.recommended, prettier, ...tseslint.configs.recommended], - files: ["**/*.{ts,tsx}"], - languageOptions: { - ecmaVersion: "latest", - globals: globals.browser, - }, - plugins: { - "react-hooks": reactHooks, - "react-refresh": reactRefresh, - react: react, - }, - rules: { - ...reactHooks.configs.recommended.rules, - "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], - "react/jsx-curly-brace-presence": "error", - "react/self-closing-comp": [ - "error", - { - component: true, - html: true, - }, - ], - }, - }, -); diff --git a/client/index.html b/client/index.html index 8a33d3e..c96a31e 100644 --- a/client/index.html +++ b/client/index.html @@ -2,14 +2,33 @@ - - - - p/war + + + + + + PixelAW - -
- +
+ + + + diff --git a/client/package.json b/client/package.json index 04176bd..cd86420 100644 --- a/client/package.json +++ b/client/package.json @@ -1,81 +1,68 @@ { - "name": "client", - "private": true, - "version": "0.0.0", + "name": "@pixelaw/vanilla", + "private": false, + "version": "0.7.3", "type": "module", + "license": "MIT", + "source": "src/index.ts", + "main": "dist/index.js", + "author": "thiscaspar", + "packageManager": "pnpm@10.5.2", "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", - "lint": "eslint .", - "format": "prettier --write .", - "format:check": "prettier --check .", - "preview": "vite preview" + "use-workspace": "node scripts/switchDependencies.js --workspace && pnpm install && pnpm build", + "use-regular": "node scripts/switchDependencies.js && pnpm install && pnpm upgrade_pixelaw && pnpm build", + "experiments": "tsx src/scripts/experiments.ts", + "build-serve": "vite build && http-server dist/", + "dev": "NODE_ENV=development && vite", + "build-prod": "tsc && vite build", + "build": "vite build", + "preview": "vite preview", + "test": "vitest", + "lint": "biome lint .", + "format": "biome format --write .", + "coverage": "vitest run --coverage", + "upgrade_dojo": "pnpm add @dojoengine/core @dojoengine/create-burner @dojoengine/react @dojoengine/recs @dojoengine/state @dojoengine/torii-client @dojoengine/utils @dojoengine/sdk @cartridge/connector", + "upgrade_pixelaw": "pnpm update @pixelaw/core @pixelaw/core-dojo @pixelaw/core-mud @pixelaw/react @pixelaw/react-dojo", + "check": "biome check --apply ." }, - "packageManager": "bun@1.1.26", "dependencies": { - "@cartridge/connector": "^0.3.46", - "@cartridge/controller": "^0.3.46", - "@dojoengine/core": "^1.0.2", - "@dojoengine/create-burner": "^1.0.2", - "@dojoengine/react": "^1.0.2", + "@cartridge/connector": "^0.7.13", + "@dojoengine/core": "^1.5.3", + "@dojoengine/create-burner": "^1.5.3", + "@dojoengine/react": "^1.5.3", "@dojoengine/recs": "^2.0.13", - "@dojoengine/state": "^1.0.2", - "@dojoengine/torii-client": "^1.0.2", - "@dojoengine/utils": "^1.0.2", - "@radix-ui/react-dialog": "^1.1.2", - "@radix-ui/react-dropdown-menu": "^2.1.2", - "@radix-ui/react-popover": "^1.1.2", - "@radix-ui/react-select": "^2.1.2", - "@radix-ui/react-slot": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.4", - "@starknet-react/core": "^2.9.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "fluid-tailwind": "^1.0.4", - "idle-task": "^4.3.0", - "lucide-react": "^0.428.0", - "next-themes": "^0.3.0", - "react": "^19.0.0-rc-fb9a90fa48-20240614", - "react-dom": "^19.0.0-rc-fb9a90fa48-20240614", - "react-swipeable": "^7.0.2", - "sass": "^1.82.0", - "sonner": "^1.7.0", - "starknet": "^6.11.0", - "tailwind-merge": "^2.5.5", + "@dojoengine/sdk": "^1.5.3", + "@dojoengine/state": "^1.5.3", + "@dojoengine/torii-client": "^1.5.3", + "@dojoengine/utils": "^1.5.3", + "@pixelaw/core": "^0.6.23", + "@pixelaw/core-dojo": "^0.6.23", + "@pixelaw/core-mud": "^0.6.23", + "@pixelaw/react": "^0.6.23", + "@pixelaw/react-dojo": "^0.6.23", + "@uiw/react-color-sketch": "^2.5.4", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^7.5.3", + "starknet": "^6.24.1", + "tailwindcss": "^3.4.17", "tailwindcss-animate": "^1.0.7", - "twgl.js": "^5.5.4", - "use-debounce": "^10.0.4", - "use-haptic": "^1.0.1", - "use-sound": "^4.0.3" + "unstorage": "^1.16.0" }, "devDependencies": { - "@eslint/js": "^9.16.0", - "@fluid-tailwind/tailwind-merge": "^0.0.3", - "@types/node": "^22.10.1", - "@types/react": "npm:types-react@rc", - "@types/react-dom": "npm:types-react-dom@rc", - "@vitejs/plugin-react-swc": "^3.7.2", - "autoprefixer": "^10.4.20", - "eslint": "^9.16.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-react": "^7.37.2", - "eslint-plugin-react-hooks": "^5.1.0-rc-fb9a90fa48-20240614", - "eslint-plugin-react-refresh": "^0.4.16", - "globals": "^15.13.0", - "postcss": "^8.4.49", - "prettier": "^3.4.2", - "slint": "^0.1.0", - "tailwindcss": "^3.4.16", - "typescript": "^5.7.2", - "typescript-eslint": "^8.17.0", - "vite": "^6.0.2", - "vite-envs": "^4.4.6", - "vite-plugin-glsl": "^1.3.1", - "vite-plugin-top-level-await": "^1.4.4", - "vite-plugin-wasm": "^3.3.0" - }, - "overrides": { - "@types/react": "npm:types-react@rc", - "@types/react-dom": "npm:types-react-dom@rc" + "@biomejs/biome": "1.9.4", + "@types/node": "^22.15.16", + "@types/react": "^18.3.21", + "@types/react-dom": "^18.3.7", + "@vitejs/plugin-react": "^4.4.1", + "autoprefixer": "^10.4.21", + "http-server": "^14.1.1", + "prettier": "3.5.3", + "typescript": "^5.8.3", + "vite": "^6.3.5", + "vite-envs": "^4.6.0", + "vite-plugin-top-level-await": "^1.5.0", + "vite-plugin-wasm": "^3.4.1", + "vitest": "^3.1.3" } } diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml new file mode 100644 index 0000000..f584818 --- /dev/null +++ b/client/pnpm-lock.yaml @@ -0,0 +1,8059 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@cartridge/connector': + specifier: ^0.7.13 + version: 0.7.13(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@starknet-react/core@3.7.4)(@types/react@18.3.21)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknet@6.24.1)(starknetkit@2.10.4)(typescript@5.8.3) + '@dojoengine/core': + specifier: ^1.5.3 + version: 1.5.3(encoding@0.1.13)(typescript@5.8.3) + '@dojoengine/create-burner': + specifier: ^1.5.3 + version: 1.5.3(react-dom@18.3.1)(react@18.3.1)(starknet@6.24.1)(typescript@5.8.3) + '@dojoengine/react': + specifier: ^1.5.3 + version: 1.5.3(@types/node@22.15.17)(@types/react@18.3.21)(react@18.3.1)(starknet@6.24.1)(type-fest@2.19.0)(typescript@5.8.3) + '@dojoengine/recs': + specifier: ^2.0.13 + version: 2.0.13(typescript@5.8.3)(zod@3.24.4) + '@dojoengine/sdk': + specifier: ^1.5.3 + version: 1.5.3(@tanstack/react-query@5.75.5)(@types/react-dom@18.3.7)(@types/react@18.3.21)(get-starknet-core@4.0.0)(react-dom@18.3.1)(react@18.3.1)(starknet@6.24.1)(typescript@5.8.3) + '@dojoengine/state': + specifier: ^1.5.3 + version: 1.5.3(@types/node@22.15.17)(starknet@6.24.1)(typescript@5.8.3) + '@dojoengine/torii-client': + specifier: ^1.5.3 + version: 1.5.3 + '@dojoengine/utils': + specifier: ^1.5.3 + version: 1.5.3(starknet@6.24.1)(typescript@5.8.3) + '@pixelaw/core': + specifier: ^0.6.23 + version: 0.6.23 + '@pixelaw/core-dojo': + specifier: ^0.6.23 + version: 0.6.23(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@tanstack/react-query@5.75.5)(@types/react-dom@18.3.7)(@types/react@18.3.21)(get-starknet-core@4.0.0)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknetkit@2.10.4)(typescript@5.8.3) + '@pixelaw/core-mud': + specifier: ^0.6.23 + version: 0.6.23 + '@pixelaw/react': + specifier: ^0.6.23 + version: 0.6.23(react-dom@18.3.1)(react@18.3.1) + '@pixelaw/react-dojo': + specifier: ^0.6.23 + version: 0.6.23(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@tanstack/react-query@5.75.5)(@types/react-dom@18.3.7)(@types/react@18.3.21)(get-starknet-core@4.0.0)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknet@6.24.1)(typescript@5.8.3) + '@uiw/react-color-sketch': + specifier: ^2.5.4 + version: 2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-router-dom: + specifier: ^7.5.3 + version: 7.6.0(react-dom@18.3.1)(react@18.3.1) + starknet: + specifier: ^6.24.1 + version: 6.24.1 + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + unstorage: + specifier: ^1.16.0 + version: 1.16.0(idb-keyval@6.2.2) + +devDependencies: + '@biomejs/biome': + specifier: 1.9.4 + version: 1.9.4 + '@types/node': + specifier: ^22.15.16 + version: 22.15.17 + '@types/react': + specifier: ^18.3.21 + version: 18.3.21 + '@types/react-dom': + specifier: ^18.3.7 + version: 18.3.7(@types/react@18.3.21) + '@vitejs/plugin-react': + specifier: ^4.4.1 + version: 4.4.1(vite@6.3.5) + autoprefixer: + specifier: ^10.4.21 + version: 10.4.21(postcss@8.5.3) + http-server: + specifier: ^14.1.1 + version: 14.1.1 + prettier: + specifier: 3.5.3 + version: 3.5.3 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@22.15.17) + vite-envs: + specifier: ^4.6.0 + version: 4.6.0 + vite-plugin-top-level-await: + specifier: ^1.5.0 + version: 1.5.0(vite@6.3.5) + vite-plugin-wasm: + specifier: ^3.4.1 + version: 3.4.1(vite@6.3.5) + vitest: + specifier: ^3.1.3 + version: 3.1.3(@types/node@22.15.17) + +packages: + + /@adraffy/ens-normalize@1.10.0: + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + dev: false + + /@adraffy/ens-normalize@1.10.1: + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + dev: false + + /@adraffy/ens-normalize@1.11.0: + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + dev: false + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: false + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@babel/code-frame@7.27.1: + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + dev: true + + /@babel/compat-data@7.27.2: + resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.27.1: + resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.27.1: + resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + dev: true + + /@babel/helper-compilation-targets@7.27.2: + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.27.2 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.5 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-module-imports@7.27.1: + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1): + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils@7.27.1: + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-string-parser@7.27.1: + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.27.1: + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.27.1: + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.27.1: + resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + dev: true + + /@babel/parser@7.27.2: + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.27.1 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.1): + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.1): + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + dev: true + + /@babel/runtime@7.27.1: + resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/template@7.27.2: + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + dev: true + + /@babel/traverse@7.27.1: + resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.27.1: + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + dev: true + + /@biomejs/biome@1.9.4: + resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} + engines: {node: '>=14.21.3'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.4 + '@biomejs/cli-darwin-x64': 1.9.4 + '@biomejs/cli-linux-arm64': 1.9.4 + '@biomejs/cli-linux-arm64-musl': 1.9.4 + '@biomejs/cli-linux-x64': 1.9.4 + '@biomejs/cli-linux-x64-musl': 1.9.4 + '@biomejs/cli-win32-arm64': 1.9.4 + '@biomejs/cli-win32-x64': 1.9.4 + dev: true + + /@biomejs/cli-darwin-arm64@1.9.4: + resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-darwin-x64@1.9.4: + resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-arm64-musl@1.9.4: + resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-arm64@1.9.4: + resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-x64-musl@1.9.4: + resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-x64@1.9.4: + resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-arm64@1.9.4: + resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-x64@1.9.4: + resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@cartridge/account-wasm@0.7.13: + resolution: {integrity: sha512-2/cFS96jN31N9piK2Hs/Egxz6cstJ9gV8pgBrqo5vSPckFv2yD9u/8euqDD26MJtLnDa59OYefNJBbKgsK9vHg==} + dev: false + + /@cartridge/connector@0.7.13(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@starknet-react/core@3.7.2)(@types/react@18.3.21)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknet@6.23.1)(starknetkit@2.10.4)(typescript@5.8.3): + resolution: {integrity: sha512-OSlWo5mXiO0WLvHUddnO7Uvx/PlVJcKfkttJgOM4kQz3iSar8B2QlYPXQQ6uqIBFzJ4Pep5E5E3tpUbGNA9BFQ==} + peerDependencies: + '@starknet-react/core': ^3.7.3 + dependencies: + '@cartridge/controller': 0.7.13(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@types/react@18.3.21)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknet@6.23.1)(starknetkit@2.10.4)(typescript@5.8.3) + '@starknet-react/core': 3.7.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1)(typescript@5.8.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@metamask/sdk' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@solana/web3.js' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - open + - react + - react-dom + - react-native + - starknet + - starknetkit + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@cartridge/connector@0.7.13(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@starknet-react/core@3.7.4)(@types/react@18.3.21)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknet@6.24.1)(starknetkit@2.10.4)(typescript@5.8.3): + resolution: {integrity: sha512-OSlWo5mXiO0WLvHUddnO7Uvx/PlVJcKfkttJgOM4kQz3iSar8B2QlYPXQQ6uqIBFzJ4Pep5E5E3tpUbGNA9BFQ==} + peerDependencies: + '@starknet-react/core': ^3.7.3 + dependencies: + '@cartridge/controller': 0.7.13(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@types/react@18.3.21)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknet@6.24.1)(starknetkit@2.10.4)(typescript@5.8.3) + '@starknet-react/core': 3.7.4(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.24.1)(typescript@5.8.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@metamask/sdk' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@solana/web3.js' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - open + - react + - react-dom + - react-native + - starknet + - starknetkit + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@cartridge/controller@0.7.13(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@types/react@18.3.21)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknet@6.23.1)(starknetkit@2.10.4)(typescript@5.8.3): + resolution: {integrity: sha512-LBor+FxYtAETgj8+m+23BDVhwXEZ+FqtwaLAVBEen6oz4//o3pU+wP2xBl8YAtcAL6mJ8gYcOhfqdHK/Ux5rwQ==} + peerDependencies: + '@metamask/sdk': ^0.32.1 + '@solana/web3.js': ^1.98.0 + open: ^10.1.0 + starknet: ^6.21.0 + starknetkit: ^2.6.1 + dependencies: + '@cartridge/account-wasm': 0.7.13 + '@cartridge/penpal': 6.2.4 + '@cartridge/utils': 0.7.13(react-dom@18.3.1)(typescript@5.8.3) + '@metamask/sdk': 0.32.1 + '@solana/web3.js': 1.98.2(typescript@5.8.3) + '@starknet-io/types-js': 0.7.10 + '@telegram-apps/sdk': 2.11.3 + '@turnkey/sdk-browser': 4.2.0(typescript@5.8.3) + '@walletconnect/ethereum-provider': 2.20.2(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3) + cbor-x: 1.6.0 + ethers: 6.14.0 + mipd: 0.0.7(typescript@5.8.3) + open: 10.1.2 + starknet: 6.23.1(encoding@0.1.13) + starknetkit: 2.10.4(starknet@6.24.1)(typescript@5.8.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - react-dom + - react-native + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@cartridge/controller@0.7.13(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@types/react@18.3.21)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknet@6.24.1)(starknetkit@2.10.4)(typescript@5.8.3): + resolution: {integrity: sha512-LBor+FxYtAETgj8+m+23BDVhwXEZ+FqtwaLAVBEen6oz4//o3pU+wP2xBl8YAtcAL6mJ8gYcOhfqdHK/Ux5rwQ==} + peerDependencies: + '@metamask/sdk': ^0.32.1 + '@solana/web3.js': ^1.98.0 + open: ^10.1.0 + starknet: ^6.21.0 + starknetkit: ^2.6.1 + dependencies: + '@cartridge/account-wasm': 0.7.13 + '@cartridge/penpal': 6.2.4 + '@cartridge/utils': 0.7.13(react-dom@18.3.1)(typescript@5.8.3) + '@metamask/sdk': 0.32.1 + '@solana/web3.js': 1.98.2(typescript@5.8.3) + '@starknet-io/types-js': 0.7.10 + '@telegram-apps/sdk': 2.11.3 + '@turnkey/sdk-browser': 4.2.0(typescript@5.8.3) + '@walletconnect/ethereum-provider': 2.20.2(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3) + cbor-x: 1.6.0 + ethers: 6.14.0 + mipd: 0.0.7(typescript@5.8.3) + open: 10.1.2 + starknet: 6.24.1 + starknetkit: 2.10.4(starknet@6.24.1)(typescript@5.8.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - react-dom + - react-native + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@cartridge/penpal@6.2.4: + resolution: {integrity: sha512-tdpOnSJJBFMlgLZ1+z9Ho5e6cG5EgMAb1Cmmh1lGT2tmplogU/XPMjLE6CwvKAPDoe6a38iMnbH+ySTAWWIOKA==} + dev: false + + /@cartridge/utils@0.7.13(react-dom@18.3.1)(typescript@5.8.3): + resolution: {integrity: sha512-gNoDw9TCvBaOPh3swGyGY383Am4e/gBFR9mMFq0nkRyfqYOiMlnnxZkGGDYbFSz5LAqbyB80JizmgaTVtKsi4w==} + dependencies: + posthog-js-lite: 3.2.1 + react: 18.3.1 + react-query: 3.39.3(react-dom@18.3.1)(react@18.3.1) + starknet: 6.24.1 + swr: 2.3.3(react@18.3.1) + viem: 2.29.1(typescript@5.8.3)(zod@3.24.4) + transitivePeerDependencies: + - bufferutil + - encoding + - react-dom + - react-native + - typescript + - utf-8-validate + - zod + dev: false + + /@cbor-extract/cbor-extract-darwin-arm64@2.2.0: + resolution: {integrity: sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@cbor-extract/cbor-extract-darwin-x64@2.2.0: + resolution: {integrity: sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@cbor-extract/cbor-extract-linux-arm64@2.2.0: + resolution: {integrity: sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@cbor-extract/cbor-extract-linux-arm@2.2.0: + resolution: {integrity: sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@cbor-extract/cbor-extract-linux-x64@2.2.0: + resolution: {integrity: sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@cbor-extract/cbor-extract-win32-x64@2.2.0: + resolution: {integrity: sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@dojoengine/core@1.5.3(encoding@0.1.13)(typescript@5.8.3): + resolution: {integrity: sha512-zGMVvFYcVgZ1rXFxJ+hFIND9xENHB6PEVuCF3P4/Y6sYBfkAuBbdySHUt6LRSSUSblshxeH/Vi+PqIw4vKvhLw==} + dependencies: + '@dojoengine/recs': 2.0.13(typescript@5.8.3)(zod@3.24.4) + starknet: 6.23.1(encoding@0.1.13) + zod: 3.24.4 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + dev: false + + /@dojoengine/create-burner@1.5.3(react-dom@18.3.1)(react@18.3.1)(starknet@6.23.1)(typescript@5.8.3): + resolution: {integrity: sha512-CB4DXZv0XCnQkEI/ySlgahw+IRvuUlKIJiiX8bu5v3Sqtzcvsgvw+uJpAElLxonBx3cqT+VKmKchAskzXHVYAQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + starknet: 6.23.1 + dependencies: + '@dojoengine/core': 1.5.3(encoding@0.1.13)(typescript@5.8.3) + '@scure/bip32': 1.7.0 + '@starknet-react/core': 3.7.4(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1)(typescript@5.8.3) + encoding: 0.1.13 + get-starknet-core: 4.0.0 + js-cookie: 3.0.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + starknet: 6.23.1(encoding@0.1.13) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + dev: false + + /@dojoengine/create-burner@1.5.3(react-dom@18.3.1)(react@18.3.1)(starknet@6.24.1)(typescript@5.8.3): + resolution: {integrity: sha512-CB4DXZv0XCnQkEI/ySlgahw+IRvuUlKIJiiX8bu5v3Sqtzcvsgvw+uJpAElLxonBx3cqT+VKmKchAskzXHVYAQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + starknet: 6.23.1 + dependencies: + '@dojoengine/core': 1.5.3(encoding@0.1.13)(typescript@5.8.3) + '@scure/bip32': 1.7.0 + '@starknet-react/core': 3.7.4(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.24.1)(typescript@5.8.3) + encoding: 0.1.13 + get-starknet-core: 4.0.0 + js-cookie: 3.0.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + starknet: 6.24.1 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + dev: false + + /@dojoengine/react@1.5.3(@types/node@22.15.17)(@types/react@18.3.21)(react@18.3.1)(starknet@6.24.1)(type-fest@2.19.0)(typescript@5.8.3): + resolution: {integrity: sha512-JHuzS2UieOX7xxk8dlFHrSO8cb/PJzQa6Eg8Y7QZvgaGl/aBakjqQ0ZJB7iWZ7TM07NYLLIXjZI4FpnHf49kmA==} + peerDependencies: + react: ^18.2.0 + starknet: 6.23.1 + type-fest: ^2.14.0 + dependencies: + '@dojoengine/recs': 2.0.13(typescript@5.8.3)(zod@3.24.4) + '@dojoengine/state': 1.5.3(@types/node@22.15.17)(starknet@6.24.1)(typescript@5.8.3) + '@dojoengine/torii-client': 1.5.3 + '@dojoengine/utils': 1.5.3(starknet@6.24.1)(typescript@5.8.3) + '@latticexyz/utils': 2.2.21 + encoding: 0.1.13 + fast-deep-equal: 3.1.3 + get-starknet-core: 4.0.0 + js-cookie: 3.0.5 + react: 18.3.1 + rxjs: 7.5.5 + starknet: 6.24.1 + type-fest: 2.19.0 + zustand: 4.5.6(@types/react@18.3.21)(immer@10.1.1)(react@18.3.1) + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/node' + - '@types/react' + - '@vitest/browser' + - '@vitest/ui' + - bufferutil + - happy-dom + - immer + - jsdom + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - typescript + - utf-8-validate + - zod + dev: false + + /@dojoengine/recs@2.0.13(typescript@5.8.3)(zod@3.24.4): + resolution: {integrity: sha512-Cgz4Unlnk2FSDoFTYKrJexX/KiSYPMFMxftxQkC+9LUKS5yNGkgFQM7xu4/L1HvpDAenL7NjUmH6ynRAS7Iifw==} + dependencies: + '@latticexyz/schema-type': 2.0.12(typescript@5.8.3)(zod@3.24.4) + '@latticexyz/utils': 2.0.12 + mobx: 6.13.7 + rxjs: 7.5.5 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: false + + /@dojoengine/sdk@1.5.3(@tanstack/react-query@5.75.5)(@types/react-dom@18.3.7)(@types/react@18.3.21)(get-starknet-core@4.0.0)(react-dom@18.3.1)(react@18.3.1)(starknet@6.23.1)(typescript@5.8.3): + resolution: {integrity: sha512-h0FxGbXfILdkP4hnd1/MKa8kkJlf4K4fRO9gZm4R4Dc16OToRhO/xmNrTKWDx8vaaO51POZLvywIduqFIHkRSQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@tanstack/react-query': ^5.62.16 + '@types/react': ^18.3.1 + '@types/react-dom': ^18.3.1 + react: ^18.3.1 + react-dom: ^18.3.1 + starknet: 6.23.1 + dependencies: + '@dojoengine/core': 1.5.3(encoding@0.1.13)(typescript@5.8.3) + '@dojoengine/torii-client': 1.5.3 + '@dojoengine/torii-wasm': 1.5.3 + '@dojoengine/utils': 1.5.3(starknet@6.23.1)(typescript@5.8.3) + '@starknet-react/chains': 3.1.3 + '@starknet-react/core': 3.7.4(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1)(typescript@5.8.3) + '@tanstack/react-query': 5.75.5(react@18.3.1) + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7(@types/react@18.3.21) + immer: 10.1.1 + neverthrow: 8.2.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + starknet: 6.23.1(encoding@0.1.13) + zustand: 4.5.6(@types/react@18.3.21)(immer@10.1.1)(react@18.3.1) + transitivePeerDependencies: + - bufferutil + - encoding + - get-starknet-core + - typescript + - utf-8-validate + - zod + dev: false + + /@dojoengine/sdk@1.5.3(@tanstack/react-query@5.75.5)(@types/react-dom@18.3.7)(@types/react@18.3.21)(get-starknet-core@4.0.0)(react-dom@18.3.1)(react@18.3.1)(starknet@6.24.1)(typescript@5.8.3): + resolution: {integrity: sha512-h0FxGbXfILdkP4hnd1/MKa8kkJlf4K4fRO9gZm4R4Dc16OToRhO/xmNrTKWDx8vaaO51POZLvywIduqFIHkRSQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@tanstack/react-query': ^5.62.16 + '@types/react': ^18.3.1 + '@types/react-dom': ^18.3.1 + react: ^18.3.1 + react-dom: ^18.3.1 + starknet: 6.23.1 + dependencies: + '@dojoengine/core': 1.5.3(encoding@0.1.13)(typescript@5.8.3) + '@dojoengine/torii-client': 1.5.3 + '@dojoengine/torii-wasm': 1.5.3 + '@dojoengine/utils': 1.5.3(starknet@6.24.1)(typescript@5.8.3) + '@starknet-react/chains': 3.1.3 + '@starknet-react/core': 3.7.4(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.24.1)(typescript@5.8.3) + '@tanstack/react-query': 5.75.5(react@18.3.1) + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7(@types/react@18.3.21) + immer: 10.1.1 + neverthrow: 8.2.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + starknet: 6.24.1 + zustand: 4.5.6(@types/react@18.3.21)(immer@10.1.1)(react@18.3.1) + transitivePeerDependencies: + - bufferutil + - encoding + - get-starknet-core + - typescript + - utf-8-validate + - zod + dev: false + + /@dojoengine/state@1.5.3(@types/node@22.15.17)(starknet@6.24.1)(typescript@5.8.3): + resolution: {integrity: sha512-lQyF5fHytuHGK9F0i95i9oswuSELCyNjo4OdQQKaTlZq8kxh2jkThkL+GZwMedGnrrz9n4QwikdBJQyH1fUp0A==} + peerDependencies: + starknet: 6.23.1 + dependencies: + '@dojoengine/recs': 2.0.13(typescript@5.8.3)(zod@3.24.4) + '@dojoengine/torii-client': 1.5.3 + starknet: 6.24.1 + vitest: 1.6.1(@types/node@22.15.17) + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/node' + - '@vitest/browser' + - '@vitest/ui' + - bufferutil + - happy-dom + - jsdom + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - typescript + - utf-8-validate + - zod + dev: false + + /@dojoengine/torii-client@1.5.3: + resolution: {integrity: sha512-VkVxQBZP54SsEnE+rPdzunEgXT7Al4oH4qoh114AIkKX9Yc3+uZvmaKekjH5ki7L2wPNUFpMUw/Y36wCVKRVVw==} + dependencies: + '@dojoengine/torii-wasm': 1.5.3 + dev: false + + /@dojoengine/torii-wasm@1.5.3: + resolution: {integrity: sha512-/KI7nwi4EAZN4xUG2I9gddeq41WaF4q4Qg1OzT0GvRFt1QWmxyeHmC02x/Ivtp6f89ZyObzQKIUofFOgSb/RJw==} + dev: false + + /@dojoengine/utils@1.5.3(starknet@6.23.1)(typescript@5.8.3): + resolution: {integrity: sha512-/YPDQIgPQ4PzyT7AMwLeDjEC4DEeAEE/6Fem8qs3qywPLoVPO2vcTOh3OSiLSRtFroIriXxVY+q76djqdHKTmw==} + peerDependencies: + starknet: 6.23.1 + dependencies: + '@dojoengine/recs': 2.0.13(typescript@5.8.3)(zod@3.24.4) + '@latticexyz/utils': 2.2.21 + mathjs: 12.4.3 + micro-starknet: 0.2.3 + starknet: 6.23.1(encoding@0.1.13) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: false + + /@dojoengine/utils@1.5.3(starknet@6.24.1)(typescript@5.8.3): + resolution: {integrity: sha512-/YPDQIgPQ4PzyT7AMwLeDjEC4DEeAEE/6Fem8qs3qywPLoVPO2vcTOh3OSiLSRtFroIriXxVY+q76djqdHKTmw==} + peerDependencies: + starknet: 6.23.1 + dependencies: + '@dojoengine/recs': 2.0.13(typescript@5.8.3)(zod@3.24.4) + '@latticexyz/utils': 2.2.21 + mathjs: 12.4.3 + micro-starknet: 0.2.3 + starknet: 6.24.1 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: false + + /@ecies/ciphers@0.2.3(@noble/ciphers@1.3.0): + resolution: {integrity: sha512-tapn6XhOueMwht3E2UzY0ZZjYokdaw9XtL9kEyjhQ/Fb9vL9xTFbOaI+fV0AWvTpYu4BNloC6getKW6NtSg4mA==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + dependencies: + '@noble/ciphers': 1.3.0 + dev: false + + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + + /@esbuild/aix-ppc64@0.25.4: + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.25.4: + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.25.4: + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.25.4: + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.25.4: + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.25.4: + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.25.4: + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.25.4: + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.25.4: + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.25.4: + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.25.4: + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.25.4: + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.25.4: + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.25.4: + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.25.4: + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.25.4: + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.25.4: + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-arm64@0.25.4: + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.25.4: + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-arm64@0.25.4: + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.25.4: + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.25.4: + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.25.4: + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.25.4: + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.25.4: + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@ethereumjs/common@3.2.0: + resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} + dependencies: + '@ethereumjs/util': 8.1.0 + crc-32: 1.2.2 + dev: false + + /@ethereumjs/rlp@4.0.1: + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + dev: false + + /@ethereumjs/tx@4.2.0: + resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} + engines: {node: '>=14'} + dependencies: + '@ethereumjs/common': 3.2.0 + '@ethereumjs/rlp': 4.0.1 + '@ethereumjs/util': 8.1.0 + ethereum-cryptography: 2.2.1 + dev: false + + /@ethereumjs/util@8.1.0: + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + dev: false + + /@hpke/chacha20poly1305@1.6.2: + resolution: {integrity: sha512-LAzcHlX+GfrVqwjx+EqqHmEdkzE5YYIlzZz4Q1uN2Keq81iOB9IveJpufhsbyB1zw7W5/Y4gJ6dfAZq4gFO/sA==} + engines: {node: '>=16.0.0'} + dependencies: + '@hpke/common': 1.7.2 + '@noble/ciphers': 1.3.0 + dev: false + + /@hpke/common@1.7.2: + resolution: {integrity: sha512-x8wGc1S3ANyQpbTXxhDuzQwzZn9IDaOARpEq/QzDyWFBEhOFyN8mJd6oMnvFkxe0H96JFgIU6eI4G2aaNxgFJQ==} + engines: {node: '>=16.0.0'} + dev: false + + /@hpke/core@1.7.2: + resolution: {integrity: sha512-WPsy/Wp1oF+47EVfQdXG55TGS+rOKAAZJ4W/4BFnTENGGq/EAJeX1h0ooCarkqWrJsREsrpa4EiIZkz1m8hMOA==} + engines: {node: '>=16.0.0'} + dependencies: + '@hpke/common': 1.7.2 + dev: false + + /@hpke/dhkem-x25519@1.6.2: + resolution: {integrity: sha512-xL//FDIY0ai3/JZyr3UI/jaw8eLEcs+SU7Z9K5uxO8R4xzvwOfGajI4VE9GH+QXGMrHncQDLIDPX9pcdqkGSvQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@hpke/common': 1.7.2 + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + dev: false + + /@hpke/dhkem-x448@1.6.2: + resolution: {integrity: sha512-uA5DJczlkjpvfjHUvLTk9Ux7ET5ERnkFR0KxvdRHtArN72Bzf4MKVSB/9hqKB/rD+zx8oWIy9KHrlYxj+0DS7g==} + engines: {node: '>=16.0.0'} + dependencies: + '@hpke/common': 1.7.2 + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + dev: false + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + 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 + dev: false + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: false + + /@jridgewell/gen-mapping@0.3.8: + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + 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: + 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==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + /@latticexyz/schema-type@2.0.12(typescript@5.8.3)(zod@3.24.4): + resolution: {integrity: sha512-QDnHU3iCQmY8e24CGR3hKUEprHrrNUfFTiUaSuj3J0d/x9iaIafYT2+dWydxgcpCmK4Xl7PgurvJiAVCmcLokg==} + dependencies: + abitype: 1.0.0(typescript@5.8.3)(zod@3.24.4) + viem: 2.9.20(typescript@5.8.3)(zod@3.24.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: false + + /@latticexyz/utils@2.0.12: + resolution: {integrity: sha512-AwniovUlWY7YL92Mjz/3R0V9g8c5wYg5t3agRmMZ9wgktUB6BYZC65n+sKp88wUuN3DrMLb51UFZOycGh0JD2w==} + dependencies: + mobx: 6.13.7 + proxy-deep: 3.1.1 + rxjs: 7.5.5 + dev: false + + /@latticexyz/utils@2.2.21: + resolution: {integrity: sha512-wQMBIxwrt3vuUF7xkvwZuLuptTSnl8K1y5J1cdfKJPip4fEtbxVT0m9q5bECprvYptRZu619aaOyXdKFwm4aEA==} + dependencies: + mobx: 6.13.7 + proxy-deep: 3.1.1 + rxjs: 7.5.5 + dev: false + + /@lit-labs/ssr-dom-shim@1.3.0: + resolution: {integrity: sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==} + dev: false + + /@lit/reactive-element@2.1.0: + resolution: {integrity: sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.3.0 + dev: false + + /@metamask/json-rpc-engine@8.0.2: + resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} + engines: {node: '>=16.0.0'} + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@metamask/json-rpc-middleware-stream@7.0.2: + resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} + engines: {node: '>=16.0.0'} + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@metamask/object-multiplex@2.1.0: + resolution: {integrity: sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==} + engines: {node: ^16.20 || ^18.16 || >=20} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: false + + /@metamask/onboarding@1.0.1: + resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + dependencies: + bowser: 2.11.0 + dev: false + + /@metamask/providers@16.1.0: + resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} + engines: {node: ^18.18 || >=20} + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/json-rpc-middleware-stream': 7.0.2 + '@metamask/object-multiplex': 2.1.0 + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + detect-browser: 5.3.0 + extension-port-stream: 3.0.0 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@metamask/rpc-errors@6.4.0: + resolution: {integrity: sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==} + engines: {node: '>=16.0.0'} + dependencies: + '@metamask/utils': 9.3.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@metamask/safe-event-emitter@3.1.2: + resolution: {integrity: sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA==} + engines: {node: '>=12.0.0'} + dev: false + + /@metamask/sdk-communication-layer@0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.14)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1): + resolution: {integrity: sha512-dmj/KFjMi1fsdZGIOtbhxdg3amxhKL/A5BqSU4uh/SyDKPub/OT+x5pX8bGjpTL1WPWY/Q0OIlvFyX3VWnT06Q==} + peerDependencies: + cross-fetch: ^4.0.0 + eciesjs: '*' + eventemitter2: ^6.4.9 + readable-stream: ^3.6.2 + socket.io-client: ^4.5.1 + dependencies: + bufferutil: 4.0.9 + cross-fetch: 4.1.0 + date-fns: 2.30.0 + debug: 4.4.0 + eciesjs: 0.4.14 + eventemitter2: 6.4.9 + readable-stream: 3.6.2 + socket.io-client: 4.8.1 + utf-8-validate: 5.0.10 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@metamask/sdk-install-modal-web@0.32.1: + resolution: {integrity: sha512-MGmAo6qSjf1tuYXhCu2EZLftq+DSt5Z7fsIKr2P+lDgdTPWgLfZB1tJKzNcwKKOdf6q9Qmmxn7lJuI/gq5LrKw==} + dependencies: + '@paulmillr/qr': 0.2.1 + dev: false + + /@metamask/sdk@0.32.1: + resolution: {integrity: sha512-ulvScxyuX+A8VYgQ9FGugtpH5l2U8AF0lOjaw6XyqwnL7I/U0Lk9yyz9pns4Zyq356Z4+nIBzxmb6czWLzp8UQ==} + dependencies: + '@babel/runtime': 7.27.1 + '@metamask/onboarding': 1.0.1 + '@metamask/providers': 16.1.0 + '@metamask/sdk-communication-layer': 0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.14)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1) + '@metamask/sdk-install-modal-web': 0.32.1 + '@paulmillr/qr': 0.2.1 + bowser: 2.11.0 + cross-fetch: 4.1.0 + debug: 4.4.0 + eciesjs: 0.4.14 + eth-rpc-errors: 4.0.3 + eventemitter2: 6.4.9 + obj-multiplex: 1.0.0 + pump: 3.0.2 + readable-stream: 3.6.2 + socket.io-client: 4.8.1 + tslib: 2.8.1 + util: 0.12.5 + uuid: 8.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /@metamask/superstruct@3.2.1: + resolution: {integrity: sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g==} + engines: {node: '>=16.0.0'} + dev: false + + /@metamask/utils@8.5.0: + resolution: {integrity: sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.5 + '@types/debug': 4.1.12 + debug: 4.4.0 + pony-cause: 2.1.11 + semver: 7.7.1 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@metamask/utils@9.3.0: + resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} + engines: {node: '>=16.0.0'} + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.5 + '@types/debug': 4.1.12 + debug: 4.4.0 + pony-cause: 2.1.11 + semver: 7.7.1 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@module-federation/runtime@0.1.21: + resolution: {integrity: sha512-/p4BhZ0SnjJuiL0wwu+FebFgIUJ9vM+oCY7CyprUHImyi/Y23ulI61WNWMVrKQGgdMoXQDQCL8RH4EnrVP2ZFw==} + dependencies: + '@module-federation/sdk': 0.1.21 + dev: false + + /@module-federation/sdk@0.1.21: + resolution: {integrity: sha512-r7xPiAm+O4e+8Zvw+8b4ToeD0D0VJD004nHmt+Y8r/l98J2eA6di72Vn1FeyjtQbCrFtiMw3ts/dlqtcmIBipw==} + dev: false + + /@noble/ciphers@0.5.3: + resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} + dev: false + + /@noble/ciphers@1.2.1: + resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + engines: {node: ^14.21.3 || >=16} + dev: false + + /@noble/ciphers@1.3.0: + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + dev: false + + /@noble/curves@1.0.0: + resolution: {integrity: sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==} + dependencies: + '@noble/hashes': 1.3.0 + dev: false + + /@noble/curves@1.2.0: + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + dependencies: + '@noble/hashes': 1.3.2 + dev: false + + /@noble/curves@1.4.0: + resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} + dependencies: + '@noble/hashes': 1.4.0 + dev: false + + /@noble/curves@1.4.2: + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + dependencies: + '@noble/hashes': 1.4.0 + dev: false + + /@noble/curves@1.7.0: + resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.6.0 + dev: false + + /@noble/curves@1.8.0: + resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.7.0 + dev: false + + /@noble/curves@1.8.1: + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.7.1 + dev: false + + /@noble/curves@1.8.2: + resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.7.2 + dev: false + + /@noble/curves@1.9.0: + resolution: {integrity: sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.8.0 + dev: false + + /@noble/hashes@1.3.0: + resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} + dev: false + + /@noble/hashes@1.3.2: + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + dev: false + + /@noble/hashes@1.3.3: + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + dev: false + + /@noble/hashes@1.4.0: + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + dev: false + + /@noble/hashes@1.6.0: + resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + engines: {node: ^14.21.3 || >=16} + dev: false + + /@noble/hashes@1.7.0: + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} + engines: {node: ^14.21.3 || >=16} + dev: false + + /@noble/hashes@1.7.1: + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} + dev: false + + /@noble/hashes@1.7.2: + resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} + engines: {node: ^14.21.3 || >=16} + dev: false + + /@noble/hashes@1.8.0: + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + dev: false + + /@paulmillr/qr@0.2.1: + resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} + deprecated: 'The package is now available as "qr": npm install qr' + dev: false + + /@pixelaw/core-dojo@0.6.23(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@tanstack/react-query@5.75.5)(@types/react-dom@18.3.7)(@types/react@18.3.21)(get-starknet-core@4.0.0)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknetkit@2.10.4)(typescript@5.8.3): + resolution: {integrity: sha512-af6S74rrbqtWDLm3Q9RPfoCWuKiYvpBzJXBLaUnReTupd5nICwj9D6D980fEkx80zZsx8Fu1ygPumzqYDBp/2g==} + dependencies: + '@cartridge/connector': 0.7.13(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@starknet-react/core@3.7.2)(@types/react@18.3.21)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknet@6.23.1)(starknetkit@2.10.4)(typescript@5.8.3) + '@dojoengine/core': 1.5.3(encoding@0.1.13)(typescript@5.8.3) + '@dojoengine/create-burner': 1.5.3(react-dom@18.3.1)(react@18.3.1)(starknet@6.23.1)(typescript@5.8.3) + '@dojoengine/sdk': 1.5.3(@tanstack/react-query@5.75.5)(@types/react-dom@18.3.7)(@types/react@18.3.21)(get-starknet-core@4.0.0)(react-dom@18.3.1)(react@18.3.1)(starknet@6.23.1)(typescript@5.8.3) + '@dojoengine/torii-client': 1.5.3 + '@pixelaw/core': 0.6.23 + '@scure/starknet': 1.1.0 + '@starknet-react/core': 3.7.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1)(typescript@5.8.3) + mitt: 3.0.1 + starknet: 6.23.1(encoding@0.1.13) + unstorage: 1.16.0(idb-keyval@6.2.2) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@metamask/sdk' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@solana/web3.js' + - '@tanstack/react-query' + - '@types/react' + - '@types/react-dom' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - get-starknet-core + - idb-keyval + - ioredis + - open + - react + - react-dom + - react-native + - starknetkit + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@pixelaw/core-mud@0.6.23: + resolution: {integrity: sha512-tpsPDn34TPOdbvSKY7ySv051tT+aIJUocS53N79nsxrIHHlNkp7csUrlcDLjwVox/l4lU0VjKKOOxaqoxWPjaQ==} + dependencies: + '@pixelaw/core': 0.6.23 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + dev: false + + /@pixelaw/core@0.6.23: + resolution: {integrity: sha512-vgt2M8TJmLgEL0UyWzoEvVcqE+mddp2yUNXTsh7LCVLHuP+3bjUUh0FFb8lT0/fmc3fNaG1B1SbFmmyxXYZ+QQ==} + dependencies: + '@types/node': 22.15.17 + canvas: 3.1.0 + idb-keyval: 6.2.2 + mitt: 3.0.1 + unstorage: 1.16.0(idb-keyval@6.2.2) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + dev: false + + /@pixelaw/react-dojo@0.6.23(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@tanstack/react-query@5.75.5)(@types/react-dom@18.3.7)(@types/react@18.3.21)(get-starknet-core@4.0.0)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknet@6.24.1)(typescript@5.8.3): + resolution: {integrity: sha512-fXldeVe6wI9wBJCPwL09P7RQEzH1sevnkqrboedf+WF+/QA7m3k0fTd/rfRhLfJsg/w3UCImmZDdanNnulNNpA==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + starknet: 6.21.0 + dependencies: + '@cartridge/connector': 0.7.13(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@starknet-react/core@3.7.4)(@types/react@18.3.21)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknet@6.24.1)(starknetkit@2.10.4)(typescript@5.8.3) + '@pixelaw/core-dojo': 0.6.23(@metamask/sdk@0.32.1)(@solana/web3.js@1.98.2)(@tanstack/react-query@5.75.5)(@types/react-dom@18.3.7)(@types/react@18.3.21)(get-starknet-core@4.0.0)(open@10.1.2)(react-dom@18.3.1)(react@18.3.1)(starknetkit@2.10.4)(typescript@5.8.3) + '@pixelaw/react': 0.6.23(react-dom@18.3.1)(react@18.3.1) + '@starknet-react/chains': 3.1.3 + '@starknet-react/core': 3.7.4(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.24.1)(typescript@5.8.3) + postcss: 8.5.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + starknet: 6.24.1 + starknetkit: 2.10.4(starknet@6.24.1)(typescript@5.8.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@metamask/sdk' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@solana/web3.js' + - '@tanstack/react-query' + - '@types/react' + - '@types/react-dom' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - get-starknet-core + - idb-keyval + - ioredis + - open + - react-native + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@pixelaw/react@0.6.23(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Ehg2dyrD/6noH1dwwiczrHUE1umegUFOwKps1AXv1JV11WNBWpVWAuhILevbKUcsYyn9XkHbTZt5qnmcjE2wGg==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + dependencies: + '@pixelaw/core': 0.6.23 + emoji-picker-react: 4.12.2(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + unstorage: 1.16.0(idb-keyval@6.2.2) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - uploadthing + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + + /@reown/appkit-common@1.7.3(typescript@5.8.3): + resolution: {integrity: sha512-wKTr6N3z8ly17cc51xBEVkZK4zAd8J1m7RubgsdQ1olFY9YJGe61RYoNv9yFjt6tUVeYT+z7iMUwPhX2PziefQ==} + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.29.1(typescript@5.8.3)(zod@3.24.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: false + + /@reown/appkit-common@1.7.3(typescript@5.8.3)(zod@3.22.4): + resolution: {integrity: sha512-wKTr6N3z8ly17cc51xBEVkZK4zAd8J1m7RubgsdQ1olFY9YJGe61RYoNv9yFjt6tUVeYT+z7iMUwPhX2PziefQ==} + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.29.1(typescript@5.8.3)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: false + + /@reown/appkit-controllers@1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3): + resolution: {integrity: sha512-aqAcX/nZe0gwqjncyCkVrAk3lEw0qZ9xGrdLOmA207RreO4J0Vxu8OJXCBn4C2AUI2OpBxCPah+vyuKTUJTeHQ==} + dependencies: + '@reown/appkit-common': 1.7.3(typescript@5.8.3) + '@reown/appkit-wallet': 1.7.3(typescript@5.8.3) + '@walletconnect/universal-provider': 2.19.2(typescript@5.8.3) + valtio: 1.13.2(@types/react@18.3.21)(react@18.3.1) + viem: 2.29.1(typescript@5.8.3)(zod@3.24.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@reown/appkit-polyfills@1.7.3: + resolution: {integrity: sha512-vQUiAyI7WiNTUV4iNwv27iigdeg8JJTEo6ftUowIrKZ2/gtE2YdMtGpavuztT/qrXhrIlTjDGp5CIyv9WOTu4g==} + dependencies: + buffer: 6.0.3 + dev: false + + /@reown/appkit-scaffold-ui@1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3)(valtio@1.13.2): + resolution: {integrity: sha512-ssB15fcjmoKQ+VfoCo7JIIK66a4SXFpCH8uK1CsMmXmKIKqPN54ohLo291fniV6mKtnJxh5Xm68slGtGrO3bmA==} + dependencies: + '@reown/appkit-common': 1.7.3(typescript@5.8.3) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3) + '@reown/appkit-ui': 1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3) + '@reown/appkit-utils': 1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3)(valtio@1.13.2) + '@reown/appkit-wallet': 1.7.3(typescript@5.8.3) + lit: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + dev: false + + /@reown/appkit-ui@1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3): + resolution: {integrity: sha512-zKmFIjLp0X24pF9KtPtSHmdsh/RjEWIvz+faIbPGm4tQbwcxdg9A35HeoP0rMgKYx49SX51LgPwVXne2gYacqQ==} + dependencies: + '@reown/appkit-common': 1.7.3(typescript@5.8.3) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3) + '@reown/appkit-wallet': 1.7.3(typescript@5.8.3) + lit: 3.1.0 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@reown/appkit-utils@1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3)(valtio@1.13.2): + resolution: {integrity: sha512-8/MNhmfri+2uu8WzBhZ5jm5llofOIa1dyXDXRC/hfrmGmCFJdrQKPpuqOFYoimo2s2g70pK4PYefvOKgZOWzgg==} + peerDependencies: + valtio: 1.13.2 + dependencies: + '@reown/appkit-common': 1.7.3(typescript@5.8.3) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3) + '@reown/appkit-polyfills': 1.7.3 + '@reown/appkit-wallet': 1.7.3(typescript@5.8.3) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.19.2(typescript@5.8.3) + valtio: 1.13.2(@types/react@18.3.21)(react@18.3.1) + viem: 2.29.1(typescript@5.8.3)(zod@3.24.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@reown/appkit-wallet@1.7.3(typescript@5.8.3): + resolution: {integrity: sha512-D0pExd0QUE71ursQPp3pq/0iFrz2oz87tOyFifrPANvH5X0RQCYn/34/kXr+BFVQzNFfCBDlYP+CniNA/S0KiQ==} + dependencies: + '@reown/appkit-common': 1.7.3(typescript@5.8.3)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.3 + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + dev: false + + /@reown/appkit@1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3): + resolution: {integrity: sha512-aA/UIwi/dVzxEB62xlw3qxHa3RK1YcPMjNxoGj/fHNCqL2qWmbcOXT7coCUa9RG7/Bh26FZ3vdVT2v71j6hebQ==} + dependencies: + '@reown/appkit-common': 1.7.3(typescript@5.8.3) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3) + '@reown/appkit-polyfills': 1.7.3 + '@reown/appkit-scaffold-ui': 1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3)(valtio@1.13.2) + '@reown/appkit-ui': 1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3) + '@reown/appkit-utils': 1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3)(valtio@1.13.2) + '@reown/appkit-wallet': 1.7.3(typescript@5.8.3) + '@walletconnect/types': 2.19.2 + '@walletconnect/universal-provider': 2.19.2(typescript@5.8.3) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@18.3.21)(react@18.3.1) + viem: 2.29.1(typescript@5.8.3)(zod@3.24.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@rollup/plugin-virtual@3.0.2: + resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dev: true + + /@rollup/rollup-android-arm-eabi@4.40.2: + resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@rollup/rollup-android-arm64@4.40.2: + resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@rollup/rollup-darwin-arm64@4.40.2: + resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@rollup/rollup-darwin-x64@4.40.2: + resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@rollup/rollup-freebsd-arm64@4.40.2: + resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@rollup/rollup-freebsd-x64@4.40.2: + resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.40.2: + resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.40.2: + resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.40.2: + resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.40.2: + resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-loongarch64-gnu@4.40.2: + resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.40.2: + resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.40.2: + resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-riscv64-musl@4.40.2: + resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.40.2: + resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.40.2: + resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.40.2: + resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.40.2: + resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.40.2: + resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.40.2: + resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@scure/base@1.1.9: + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + dev: false + + /@scure/base@1.2.1: + resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} + dev: false + + /@scure/base@1.2.5: + resolution: {integrity: sha512-9rE6EOVeIQzt5TSu4v+K523F8u6DhBsoZWPGKlnCshhlDhy0kJzUX4V+tr2dWmzF1GdekvThABoEQBGBQI7xZw==} + dev: false + + /@scure/bip32@1.3.2: + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + dependencies: + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.9 + dev: false + + /@scure/bip32@1.4.0: + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + dev: false + + /@scure/bip32@1.6.2: + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} + dependencies: + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/base': 1.2.5 + dev: false + + /@scure/bip32@1.7.0: + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + dependencies: + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.5 + dev: false + + /@scure/bip39@1.2.1: + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + dependencies: + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.9 + dev: false + + /@scure/bip39@1.3.0: + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + dev: false + + /@scure/bip39@1.5.4: + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} + dependencies: + '@noble/hashes': 1.7.2 + '@scure/base': 1.2.5 + dev: false + + /@scure/starknet@1.1.0: + resolution: {integrity: sha512-83g3M6Ix2qRsPN4wqLDqiRZ2GBNbjVWfboJE/9UjfG+MHr6oDSu/CWgy8hsBSJejr09DkkL+l0Ze4KVrlCIdtQ==} + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.0 + dev: false + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: false + + /@socket.io/component-emitter@3.1.2: + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + dev: false + + /@solana/buffer-layout@4.0.1: + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + dependencies: + buffer: 6.0.3 + dev: false + + /@solana/codecs-core@2.1.0(typescript@5.8.3): + resolution: {integrity: sha512-SR7pKtmJBg2mhmkel2NeHA1pz06QeQXdMv8WJoIR9m8F/hw80K/612uaYbwTt2nkK0jg/Qn/rNSd7EcJ4SBGjw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + dependencies: + '@solana/errors': 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + dev: false + + /@solana/codecs-numbers@2.1.0(typescript@5.8.3): + resolution: {integrity: sha512-XMu4yw5iCgQnMKsxSWPPOrGgtaohmupN3eyAtYv3K3C/MJEc5V90h74k5B1GUCiHvcrdUDO9RclNjD9lgbjFag==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + dependencies: + '@solana/codecs-core': 2.1.0(typescript@5.8.3) + '@solana/errors': 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + dev: false + + /@solana/errors@2.1.0(typescript@5.8.3): + resolution: {integrity: sha512-l+GxAv0Ar4d3c3PlZdA9G++wFYZREEbbRyAFP8+n8HSg0vudCuzogh/13io6hYuUhG/9Ve8ARZNamhV7UScKNw==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5' + dependencies: + chalk: 5.4.1 + commander: 13.1.0 + typescript: 5.8.3 + dev: false + + /@solana/web3.js@1.98.2(typescript@5.8.3): + resolution: {integrity: sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A==} + dependencies: + '@babel/runtime': 7.27.1 + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + '@solana/buffer-layout': 4.0.1 + '@solana/codecs-numbers': 2.1.0(typescript@5.8.3) + agentkeepalive: 4.6.0 + bn.js: 5.2.2 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.2.0 + node-fetch: 2.7.0(encoding@0.1.13) + rpc-websockets: 9.1.1 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + dev: false + + /@starknet-io/get-starknet-core@4.0.7: + resolution: {integrity: sha512-ocwQTdDvGa+0CvjGygyaTuFkda2R82dofydts8uXr9p0Diy/bmYW1fkuqJfi1nC5M+YcvvuEpl6wFvwXM1og5w==} + dependencies: + '@module-federation/runtime': 0.1.21 + '@starknet-io/types-js': 0.7.10 + async-mutex: 0.5.0 + dev: false + + /@starknet-io/get-starknet@4.0.7: + resolution: {integrity: sha512-env/ZN5EmDJ6vDtIgjOjsEvvzdKBDaWZ0aLe79IVJ7lq2icqKbX86yR1/CUf4AU31AFYZHWZ3daOaGFT4nHSUQ==} + dependencies: + '@starknet-io/get-starknet-core': 4.0.7 + bowser: 2.11.0 + dev: false + + /@starknet-io/types-js@0.7.10: + resolution: {integrity: sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w==} + dev: false + + /@starknet-react/chains@3.1.3: + resolution: {integrity: sha512-b16VQyxqZXfiVmlKEkjfg+Oj8fdSnGWh1KU87O/unn6NpmaD9h511az1Cs6aW/j3qCIF1o5CrqfEnU1NWV7MVA==} + dev: false + + /@starknet-react/core@3.7.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1)(typescript@5.8.3): + resolution: {integrity: sha512-5l6IlXqYzbnInVPwL2VdSwmIiaNnTjm4iYnEGSSVUUPyklHr3bdXaZoILJWcIQ0NaF2ebhNhoKYL8GDHiSKTPw==} + peerDependencies: + get-starknet-core: ^4.0.0 + react: ^18.0 + starknet: ^6.11.0 + dependencies: + '@starknet-io/types-js': 0.7.10 + '@starknet-react/chains': 3.1.3 + '@tanstack/react-query': 5.75.5(react@18.3.1) + abi-wan-kanabi: 2.2.4 + eventemitter3: 5.0.1 + get-starknet-core: 4.0.0 + react: 18.3.1 + starknet: 6.23.1(encoding@0.1.13) + viem: 2.29.1(typescript@5.8.3)(zod@3.24.4) + zod: 3.24.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + dev: false + + /@starknet-react/core@3.7.4(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1)(typescript@5.8.3): + resolution: {integrity: sha512-fHzme/TLyhSJRIo3BarehiM23IZuLeT0gM0jvTpz8w1/Y05tK+UywpyzBCkueU+iHEwhopsICDpOFhFtqaJJZA==} + peerDependencies: + get-starknet-core: ^4.0.0 + react: ^18.0 + starknet: ^6.11.0 + dependencies: + '@starknet-io/types-js': 0.7.10 + '@starknet-react/chains': 3.1.3 + '@tanstack/react-query': 5.75.5(react@18.3.1) + abi-wan-kanabi: 2.2.4 + eventemitter3: 5.0.1 + get-starknet-core: 4.0.0 + react: 18.3.1 + starknet: 6.23.1(encoding@0.1.13) + viem: 2.29.1(typescript@5.8.3)(zod@3.24.4) + zod: 3.24.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + dev: false + + /@starknet-react/core@3.7.4(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.24.1)(typescript@5.8.3): + resolution: {integrity: sha512-fHzme/TLyhSJRIo3BarehiM23IZuLeT0gM0jvTpz8w1/Y05tK+UywpyzBCkueU+iHEwhopsICDpOFhFtqaJJZA==} + peerDependencies: + get-starknet-core: ^4.0.0 + react: ^18.0 + starknet: ^6.11.0 + dependencies: + '@starknet-io/types-js': 0.7.10 + '@starknet-react/chains': 3.1.3 + '@tanstack/react-query': 5.75.5(react@18.3.1) + abi-wan-kanabi: 2.2.4 + eventemitter3: 5.0.1 + get-starknet-core: 4.0.0 + react: 18.3.1 + starknet: 6.24.1 + viem: 2.29.1(typescript@5.8.3)(zod@3.24.4) + zod: 3.24.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + dev: false + + /@swc/core-darwin-arm64@1.11.24: + resolution: {integrity: sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.11.24: + resolution: {integrity: sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.11.24: + resolution: {integrity: sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.11.24: + resolution: {integrity: sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.11.24: + resolution: {integrity: sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.11.24: + resolution: {integrity: sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.11.24: + resolution: {integrity: sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.11.24: + resolution: {integrity: sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.11.24: + resolution: {integrity: sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.11.24: + resolution: {integrity: sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.11.24: + resolution: {integrity: sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.21 + optionalDependencies: + '@swc/core-darwin-arm64': 1.11.24 + '@swc/core-darwin-x64': 1.11.24 + '@swc/core-linux-arm-gnueabihf': 1.11.24 + '@swc/core-linux-arm64-gnu': 1.11.24 + '@swc/core-linux-arm64-musl': 1.11.24 + '@swc/core-linux-x64-gnu': 1.11.24 + '@swc/core-linux-x64-musl': 1.11.24 + '@swc/core-win32-arm64-msvc': 1.11.24 + '@swc/core-win32-ia32-msvc': 1.11.24 + '@swc/core-win32-x64-msvc': 1.11.24 + dev: true + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: true + + /@swc/helpers@0.5.17: + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + dependencies: + tslib: 2.8.1 + dev: false + + /@swc/types@0.1.21: + resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + dependencies: + '@swc/counter': 0.1.3 + dev: true + + /@tanstack/query-core@5.75.5: + resolution: {integrity: sha512-kPDOxtoMn2Ycycb76Givx2fi+2pzo98F9ifHL/NFiahEDpDwSVW6o12PRuQ0lQnBOunhRG5etatAhQij91M3MQ==} + dev: false + + /@tanstack/react-query@5.75.5(react@18.3.1): + resolution: {integrity: sha512-QrLCJe40BgBVlWdAdf2ZEVJ0cISOuEy/HKupId1aTKU6gPJZVhSvZpH+Si7csRflCJphzlQ77Yx6gUxGW9o0XQ==} + peerDependencies: + react: ^18 || ^19 + dependencies: + '@tanstack/query-core': 5.75.5 + react: 18.3.1 + dev: false + + /@telegram-apps/bridge@1.9.2: + resolution: {integrity: sha512-SJLcNWLXhbbZr9MiqFH/g2ceuitSJKMxUIZysK4zUNyTUNuonrQG80Q/yrO+XiNbKUj8WdDNM86NBARhuyyinQ==} + dependencies: + '@telegram-apps/signals': 1.1.1 + '@telegram-apps/toolkit': 1.1.1 + '@telegram-apps/transformers': 1.2.2 + '@telegram-apps/types': 1.2.1 + dev: false + + /@telegram-apps/navigation@1.0.13: + resolution: {integrity: sha512-TsUueB5LQp77GQHoMa93nq26Uw7GJjrFCPbyseMVU7aBBxAc+8CV2IYytRwcVp5sv/q7ThK5X4JaKn2V1yBHDQ==} + dependencies: + '@telegram-apps/bridge': 1.9.2 + '@telegram-apps/signals': 1.1.1 + '@telegram-apps/toolkit': 1.1.1 + dev: false + + /@telegram-apps/sdk@2.11.3: + resolution: {integrity: sha512-KdULzgRe1gcR8B3Z/t3hQrEaDmLGrfsL2IePtPP6ehtMn5tT0uPfnjtDLjDNQMyI7D4Tv2ZOzvDx45wOhhreXg==} + dependencies: + '@telegram-apps/bridge': 1.9.2 + '@telegram-apps/navigation': 1.0.13 + '@telegram-apps/signals': 1.1.1 + '@telegram-apps/toolkit': 1.1.1 + '@telegram-apps/transformers': 1.2.2 + dev: false + + /@telegram-apps/signals@1.1.1: + resolution: {integrity: sha512-vz37r8lemGpPzDiBRfqpXYBynzmy3SFnY6zfHsTZABTYYt0b0WQZyU5mFDqqqugGhka78Gy11xmr9csgy4YgGA==} + dev: false + + /@telegram-apps/toolkit@1.1.1: + resolution: {integrity: sha512-+vhKx6ngfvjyTE6Xagl3z1TPVbfx5s7xAkcYzCdHYUo6T60jLIqLgyZMcI1UPoIAMuMu1pHoO+p8QNCj/+tFmw==} + dev: false + + /@telegram-apps/transformers@1.2.2: + resolution: {integrity: sha512-vvMwXckd1D7Ozc0h66PSUwF5QLrRV9HlGJFFeBuUex8QEk5mSPtsJkLiqB8aBbwuFDa91+TUSM/CxqPZO/e9YQ==} + dependencies: + '@telegram-apps/toolkit': 1.1.1 + '@telegram-apps/types': 1.2.1 + dev: false + + /@telegram-apps/types@1.2.1: + resolution: {integrity: sha512-so4HLh7clur0YyMthi9KVIgWoGpZdXlFOuQjk3+Q5NAvJZ11nAheBSwPlGw/Ko92+zwvrSBE/lQyN2+p17RP+w==} + dev: false + + /@trpc/client@10.45.2(@trpc/server@10.45.2): + resolution: {integrity: sha512-ykALM5kYWTLn1zYuUOZ2cPWlVfrXhc18HzBDyRhoPYN0jey4iQHEFSEowfnhg1RvYnrAVjNBgHNeSAXjrDbGwg==} + peerDependencies: + '@trpc/server': 10.45.2 + dependencies: + '@trpc/server': 10.45.2 + dev: false + + /@trpc/server@10.45.2: + resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} + dev: false + + /@turnkey/api-key-stamper@0.4.5: + resolution: {integrity: sha512-8UeYt/2WtMrK2uSFzjiRXdCVc9SmKlMVuA4f1Z+SlxcsW0wlEpNM/7bd8N4VVVAjoE8Yy50Vhk3ylfQFtlaKsQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@noble/curves': 1.9.0 + '@turnkey/encoding': 0.4.0 + sha256-uint8array: 0.10.7 + dev: false + + /@turnkey/crypto@2.3.1: + resolution: {integrity: sha512-fHKCw0inuThEKIpZnC8pvz16egZHf08wES0LdSkM9XrGDcI7p0eqF7nAHgfAMW/0qNVZD8AKW+g/5O97HBwZ4w==} + engines: {node: '>=18.0.0'} + dependencies: + '@noble/ciphers': 0.5.3 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@turnkey/encoding': 0.4.0 + bs58: 5.0.0 + bs58check: 3.0.1 + dev: false + + /@turnkey/encoding@0.4.0: + resolution: {integrity: sha512-ptLgcpWVt34KTPx0omF2QLJrosW6I//clCJ4G2+yngYFCzrdR0yBchV/BOcfME67mK1v3MmauyXl9AAnQTmB4Q==} + engines: {node: '>=18.0.0'} + dev: false + + /@turnkey/http@3.2.0: + resolution: {integrity: sha512-O8VbAyHqzdVEEJ0/h3BKng1AM6AC+IpHwOhDEnX0LIFdp5ny+9aMwI44jzIugXcmIWKSEAH3JYvTuKIT4vsFwA==} + engines: {node: '>=16.0.0'} + dependencies: + '@turnkey/api-key-stamper': 0.4.5 + '@turnkey/encoding': 0.4.0 + '@turnkey/webauthn-stamper': 0.5.0 + cross-fetch: 3.2.0 + transitivePeerDependencies: + - encoding + dev: false + + /@turnkey/iframe-stamper@2.5.0: + resolution: {integrity: sha512-XjntbA5CNjxGRH+loceAlVLL9PG9Q4Y7p5zjBm4DeKclhD6lpUl9h8INArMEXIFbfLwLjjS6Q+SmQG4BHvNY6A==} + engines: {node: '>=18.0.0'} + dev: false + + /@turnkey/sdk-browser@4.2.0(typescript@5.8.3): + resolution: {integrity: sha512-nA+o1SgEi5CR0VRx+ycdQTQQyPtwORTw7HttE/HA4pT/QXIY4h5AT2d8rs2shlVW2d+hnyLwzwAgGwcsT2z06Q==} + engines: {node: '>=18.0.0'} + dependencies: + '@turnkey/api-key-stamper': 0.4.5 + '@turnkey/crypto': 2.3.1 + '@turnkey/encoding': 0.4.0 + '@turnkey/http': 3.2.0 + '@turnkey/iframe-stamper': 2.5.0 + '@turnkey/wallet-stamper': 1.0.3(typescript@5.8.3) + '@turnkey/webauthn-stamper': 0.5.0 + bs58check: 3.0.1 + buffer: 6.0.3 + cross-fetch: 3.2.0 + hpke-js: 1.6.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: false + + /@turnkey/wallet-stamper@1.0.3(typescript@5.8.3): + resolution: {integrity: sha512-8DMuVPo/u8oIzQ9Snsa24ZQO3nXVMfpd8VnlPLfZiW2jjZHPFyBGCJOYSArfp+W2xoudpYVu//JElBAVxk/u/g==} + dependencies: + '@turnkey/crypto': 2.3.1 + '@turnkey/encoding': 0.4.0 + optionalDependencies: + viem: 2.29.1(typescript@5.8.3)(zod@3.24.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: false + + /@turnkey/webauthn-stamper@0.5.0: + resolution: {integrity: sha512-iUbTUwD4f4ibdLy5PWWb7ITEz4S4VAP9/mNjFhoRY3cKVVTDfmykrVTKjPOIHWzDgAmLtgrLvySIIC9ZBVENBw==} + engines: {node: '>=18.0.0'} + dependencies: + sha256-uint8array: 0.10.7 + dev: false + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 + dev: true + + /@types/babel__generator@7.27.0: + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + dependencies: + '@babel/types': 7.27.1 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + dev: true + + /@types/babel__traverse@7.20.7: + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + dependencies: + '@babel/types': 7.27.1 + dev: true + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 22.15.17 + dev: false + + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 2.1.0 + dev: false + + /@types/estree@1.0.7: + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + /@types/ms@2.1.0: + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + dev: false + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: false + + /@types/node@22.15.17: + resolution: {integrity: sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==} + dependencies: + undici-types: 6.21.0 + + /@types/node@22.7.5: + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + dependencies: + undici-types: 6.19.8 + dev: false + + /@types/prop-types@15.7.14: + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + + /@types/react-dom@18.3.7(@types/react@18.3.21): + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + dependencies: + '@types/react': 18.3.21 + + /@types/react@18.3.21: + resolution: {integrity: sha512-gXLBtmlcRJeT09/sI4PxVwyrku6SaNUj/6cMubjE6T6XdY1fDmBL7r0nX0jbSZPU/Xr0KuwLLZh6aOYY5d91Xw==} + dependencies: + '@types/prop-types': 15.7.14 + csstype: 3.1.3 + + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + dev: false + + /@types/uuid@8.3.4: + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + dev: false + + /@types/ws@7.4.7: + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + dependencies: + '@types/node': 22.15.17 + dev: false + + /@types/ws@8.18.1: + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + dependencies: + '@types/node': 22.15.17 + dev: false + + /@uiw/color-convert@2.5.4(@babel/runtime@7.27.1): + resolution: {integrity: sha512-gcVsu9SfEbob9SJggmlrDhMp6bngqsEqjr7KYM86Ltq5wghmvfUnJlvVd6HxLjuGFlqy5zqbK1Z6GDLDoSmsWg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + dependencies: + '@babel/runtime': 7.27.1 + dev: false + + /@uiw/react-color-alpha@2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-TZDAsEBMlGaEa4P8nz6ZLSDa1c+XdZZ26+Hkb1rf+h2qDYSPQx8gijtiSgm+ePZGp+4+IqoG2jfXuHwAEWycmg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.27.1 + '@uiw/color-convert': 2.5.4(@babel/runtime@7.27.1) + '@uiw/react-drag-event-interactive': 2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@uiw/react-color-editable-input-rgba@2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-XHkYO8JnvgzT8+7ci9VSY2GvNs2+V/HLhCZjJpXAqpU8umY2T9ryhpD0uzKdOieLg74817Ny2ESPrdT/uEGr4A==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.27.1 + '@uiw/color-convert': 2.5.4(@babel/runtime@7.27.1) + '@uiw/react-color-editable-input': 2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@uiw/react-color-editable-input@2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-wn++Hjgv16FCarddAj5RbR/AuGzIs+TYoCJS6wZy1X+BkWjdwN81+mHxXBq42ooge77xkj9Uhbqa7uaIYKCuJA==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.27.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@uiw/react-color-hue@2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-fUbKPbChCcIkJYyLK9+FhJvvuQgCoxwokq4dma3QeDYHXMHoLqOpWrJlagF+vKqzsPd1dFcH8nPLKf0EO+UjKg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.27.1 + '@uiw/color-convert': 2.5.4(@babel/runtime@7.27.1) + '@uiw/react-color-alpha': 2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@uiw/react-color-saturation@2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-aMiqmv91jEZfqgW44E/9S4A7t3ScvsaXcqyjX+vi2zT+H0ZmZfNKfeiytppgurAKaot12vZCZhs+Lvzi8TmXEA==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.27.1 + '@uiw/color-convert': 2.5.4(@babel/runtime@7.27.1) + '@uiw/react-drag-event-interactive': 2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@uiw/react-color-sketch@2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-A5ZcJtVPFavbeyf2EZ/V+ttfFJnfZyTzzD17rSIQEqtNaQTvmkKWiSIfiL4XsFsxG4LLyoir79eYsy5/5c2zeg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.27.1 + '@uiw/color-convert': 2.5.4(@babel/runtime@7.27.1) + '@uiw/react-color-alpha': 2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1) + '@uiw/react-color-editable-input': 2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1) + '@uiw/react-color-editable-input-rgba': 2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1) + '@uiw/react-color-hue': 2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1) + '@uiw/react-color-saturation': 2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1) + '@uiw/react-color-swatch': 2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@uiw/react-color-swatch@2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-//eW0MuhgU0fc+v1QQ0gajY+KI/OME3e8uQ0LfcnZu2pjKVnonHJ2k8iMOno1t8vLiHU9GgYukHixqgpLTC61A==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.27.1 + '@uiw/color-convert': 2.5.4(@babel/runtime@7.27.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@uiw/react-drag-event-interactive@2.5.4(@babel/runtime@7.27.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-VEzRKVPp5tuMDntxVsIJ8liJgJ4t3ZIGORHWReAGzt2IBIFxEAxtN7YsDuoxN2G96qBoWgwZptmAUKdUPHhPMQ==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.27.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@vitejs/plugin-react@4.4.1(vite@6.3.5): + resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + dependencies: + '@babel/core': 7.27.1 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.1) + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.3.5(@types/node@22.15.17) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@1.6.1: + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + dev: false + + /@vitest/expect@3.1.3: + resolution: {integrity: sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==} + dependencies: + '@vitest/spy': 3.1.3 + '@vitest/utils': 3.1.3 + chai: 5.2.0 + tinyrainbow: 2.0.0 + dev: true + + /@vitest/mocker@3.1.3(vite@6.3.5): + resolution: {integrity: sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + dependencies: + '@vitest/spy': 3.1.3 + estree-walker: 3.0.3 + magic-string: 0.30.17 + vite: 6.3.5(@types/node@22.15.17) + dev: true + + /@vitest/pretty-format@3.1.3: + resolution: {integrity: sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==} + dependencies: + tinyrainbow: 2.0.0 + dev: true + + /@vitest/runner@1.6.1: + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: false + + /@vitest/runner@3.1.3: + resolution: {integrity: sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==} + dependencies: + '@vitest/utils': 3.1.3 + pathe: 2.0.3 + dev: true + + /@vitest/snapshot@1.6.1: + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + dependencies: + magic-string: 0.30.17 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: false + + /@vitest/snapshot@3.1.3: + resolution: {integrity: sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==} + dependencies: + '@vitest/pretty-format': 3.1.3 + magic-string: 0.30.17 + pathe: 2.0.3 + dev: true + + /@vitest/spy@1.6.1: + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + dependencies: + tinyspy: 2.2.1 + dev: false + + /@vitest/spy@3.1.3: + resolution: {integrity: sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==} + dependencies: + tinyspy: 3.0.2 + dev: true + + /@vitest/utils@1.6.1: + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: false + + /@vitest/utils@3.1.3: + resolution: {integrity: sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==} + dependencies: + '@vitest/pretty-format': 3.1.3 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + dev: true + + /@walletconnect/core@2.19.2(typescript@5.8.3): + resolution: {integrity: sha512-iu0mgLj51AXcKpdNj8+4EdNNBd/mkNjLEhZn6UMc/r7BM9WbmpPMEydA39WeRLbdLO4kbpmq4wTbiskI1rg+HA==} + engines: {node: '>=18'} + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(typescript@5.8.3) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@walletconnect/core@2.20.2(typescript@5.8.3): + resolution: {integrity: sha512-48XnarxQQrpJ0KZJOjit56DxuzfVRYUdL8XVMvUh/ZNUiX2FB5w6YuljUUeTLfYOf04Et6qhVGEUkmX3W+9/8w==} + engines: {node: '>=18'} + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(typescript@5.8.3) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@walletconnect/environment@1.0.1: + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/ethereum-provider@2.20.2(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3): + resolution: {integrity: sha512-fGNJtytHuBWZcmMXRIG1djlfEiPMvPJ0R3JlfJjAx2VfVN+O+1xdF6QSWcZxFizviIUFJV+f1zWt0V2VVD61Rg==} + dependencies: + '@reown/appkit': 1.7.3(@types/react@18.3.21)(react@18.3.1)(typescript@5.8.3) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.20.2(typescript@5.8.3) + '@walletconnect/types': 2.20.2 + '@walletconnect/universal-provider': 2.20.2(typescript@5.8.3) + '@walletconnect/utils': 2.20.2(typescript@5.8.3) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@walletconnect/events@1.0.1: + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + dev: false + + /@walletconnect/heartbeat@1.2.2: + resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + dev: false + + /@walletconnect/jsonrpc-http-connection@1.0.8: + resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.2.0 + events: 3.3.0 + transitivePeerDependencies: + - encoding + dev: false + + /@walletconnect/jsonrpc-provider@1.0.14: + resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + dev: false + + /@walletconnect/jsonrpc-types@1.0.4: + resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + dev: false + + /@walletconnect/jsonrpc-utils@1.0.8: + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + dev: false + + /@walletconnect/jsonrpc-ws-connection@1.0.16: + resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@walletconnect/keyvaluestorage@1.1.1: + resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.2 + unstorage: 1.16.0(idb-keyval@6.2.2) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + dev: false + + /@walletconnect/logger@2.1.2: + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + dev: false + + /@walletconnect/relay-api@1.0.11: + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + dev: false + + /@walletconnect/relay-auth@1.1.0: + resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + uint8arrays: 3.1.0 + dev: false + + /@walletconnect/safe-json@1.0.2: + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/sign-client@2.19.2(typescript@5.8.3): + resolution: {integrity: sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg==} + dependencies: + '@walletconnect/core': 2.19.2(typescript@5.8.3) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(typescript@5.8.3) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@walletconnect/sign-client@2.20.2(typescript@5.8.3): + resolution: {integrity: sha512-KyeDToypZ1OjCbij4Jx0cAg46bMwZ6zCKt0HzCkqENcex3Zchs7xBp9r8GtfEMGw+PUnXwqrhzmLBH0x/43oIQ==} + dependencies: + '@walletconnect/core': 2.20.2(typescript@5.8.3) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(typescript@5.8.3) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@walletconnect/time@1.0.2: + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/types@2.19.2: + resolution: {integrity: sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + dev: false + + /@walletconnect/types@2.20.2: + resolution: {integrity: sha512-XPPbJM/mGU05i6jUxhC3yI/YvhSF6TYJQ5SXTWM53lVe6hs6ukvlEhPctu9ZBTGwGFhwPXIjtK/eWx+v4WY5iw==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + dev: false + + /@walletconnect/universal-provider@2.19.2(typescript@5.8.3): + resolution: {integrity: sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.19.2(typescript@5.8.3) + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(typescript@5.8.3) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@walletconnect/universal-provider@2.20.2(typescript@5.8.3): + resolution: {integrity: sha512-6uVu1E88tioaXEEJCbJKwCIQlOHif1nmfY092BznZEnBn2lli5ICzQh2bxtUDNmNNLKsMDI3FV1fODFeWMVJTQ==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.20.2(typescript@5.8.3) + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(typescript@5.8.3) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@walletconnect/utils@2.19.2(typescript@5.8.3): + resolution: {integrity: sha512-VU5CcUF4sZDg8a2/ov29OJzT3KfLuZqJUM0GemW30dlipI5fkpb0VPenZK7TcdLPXc1LN+Q+7eyTqHRoAu/BIA==} + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(typescript@5.8.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@walletconnect/utils@2.20.2(typescript@5.8.3): + resolution: {integrity: sha512-2uRUDvpYSIJFYcr1WIuiFy6CEszLF030o6W8aDMkGk9/MfAZYEJQHMJcjWyaNMPHLJT0POR5lPaqkYOpuyPIQQ==} + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.20.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(typescript@5.8.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /@walletconnect/window-getters@1.0.1: + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/window-metadata@1.0.1: + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + dependencies: + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + dev: false + + /abi-wan-kanabi@2.2.4: + resolution: {integrity: sha512-0aA81FScmJCPX+8UvkXLki3X1+yPQuWxEkqXBVKltgPAK79J+NB+Lp5DouMXa7L6f+zcRlIA/6XO7BN/q9fnvg==} + hasBin: true + dependencies: + ansicolors: 0.3.2 + cardinal: 2.1.1 + fs-extra: 10.1.0 + yargs: 17.7.2 + dev: false + + /abitype@1.0.0(typescript@5.8.3)(zod@3.24.4): + resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.8.3 + zod: 3.24.4 + dev: false + + /abitype@1.0.8(typescript@5.8.3)(zod@3.22.4): + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.8.3 + zod: 3.22.4 + dev: false + + /abitype@1.0.8(typescript@5.8.3)(zod@3.24.4): + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.8.3 + zod: 3.24.4 + dev: false + + /acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.14.1 + dev: false + + /acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + dev: false + + /agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: false + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + + /ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: false + + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + dev: true + + /async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + dependencies: + tslib: 2.8.1 + dev: false + + /async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + dev: true + + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false + + /autoprefixer@10.4.21(postcss@8.5.3): + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.24.5 + caniuse-lite: 1.0.30001717 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.1.0 + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /base-x@4.0.1: + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} + dev: false + + /base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + dev: false + + /big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + dev: false + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + dev: false + + /borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + dependencies: + bn.js: 5.2.2 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + dev: false + + /bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: false + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: false + + /broadcast-channel@3.7.0: + resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} + dependencies: + '@babel/runtime': 7.27.1 + detect-node: 2.1.0 + js-sha3: 0.8.0 + microseconds: 0.2.0 + nano-time: 1.0.0 + oblivious-set: 1.0.0 + rimraf: 3.0.2 + unload: 2.2.0 + dev: false + + /browserslist@4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001717 + electron-to-chromium: 1.5.151 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.5) + dev: true + + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.11 + dev: false + + /bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + dependencies: + base-x: 4.0.1 + dev: false + + /bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + dependencies: + base-x: 5.0.1 + dev: false + + /bs58check@3.0.1: + resolution: {integrity: sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==} + dependencies: + '@noble/hashes': 1.8.0 + bs58: 5.0.0 + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.4 + dev: false + + /bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + dependencies: + run-applescript: 7.0.0 + dev: false + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + dev: false + + /call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: false + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: false + + /caniuse-lite@1.0.30001717: + resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==} + dev: true + + /canvas@3.1.0: + resolution: {integrity: sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==} + engines: {node: ^18.12.0 || >= 20.9.0} + requiresBuild: true + dependencies: + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 + dev: false + + /cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + dev: false + + /cbor-extract@2.2.0: + resolution: {integrity: sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==} + hasBin: true + requiresBuild: true + dependencies: + node-gyp-build-optional-packages: 5.1.1 + optionalDependencies: + '@cbor-extract/cbor-extract-darwin-arm64': 2.2.0 + '@cbor-extract/cbor-extract-darwin-x64': 2.2.0 + '@cbor-extract/cbor-extract-linux-arm': 2.2.0 + '@cbor-extract/cbor-extract-linux-arm64': 2.2.0 + '@cbor-extract/cbor-extract-linux-x64': 2.2.0 + '@cbor-extract/cbor-extract-win32-x64': 2.2.0 + dev: false + optional: true + + /cbor-x@1.6.0: + resolution: {integrity: sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==} + optionalDependencies: + cbor-extract: 2.2.0 + dev: false + + /chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + dev: false + + /chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: false + + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + dev: true + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + dependencies: + readdirp: 4.1.2 + dev: false + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + dev: false + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: false + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + + /complex.js@2.4.2: + resolution: {integrity: sha512-qtx7HRhPGSCBtGiST4/WGHuW+zeaND/6Ld+db6PbrulIB1i2Ev/2UPiqcmpQNPSyfBKraC0EOvOKCB5dGZKt3g==} + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: false + + /confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + dev: false + + /cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /corser@2.0.1: + resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} + engines: {node: '>= 0.4.0'} + dev: true + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + dev: false + + /cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + dependencies: + uncrypto: 0.1.3 + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.27.1 + dev: false + + /dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dev: false + + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + + /debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: false + + /decimal.js@10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + dev: false + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: false + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.1.0 + dev: false + + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + dev: false + + /default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + dev: false + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: false + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: false + + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dev: false + + /delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + + /derive-valtio@0.1.0(valtio@1.13.2): + resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} + peerDependencies: + valtio: '*' + dependencies: + valtio: 1.13.2(@types/react@18.3.21)(react@18.3.1) + dev: false + + /destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + dev: false + + /detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + dev: false + + /detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + dev: false + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: false + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: false + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: false + + /dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dev: false + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false + + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + /duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + + /eciesjs@0.4.14: + resolution: {integrity: sha512-eJAgf9pdv214Hn98FlUzclRMYWF7WfoLlkS9nWMTm1qcCwn6Ad4EGD9lr9HXMBfSrZhYQujRE+p0adPRkctC6A==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + dependencies: + '@ecies/ciphers': 0.2.3(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + dev: false + + /electron-to-chromium@1.5.151: + resolution: {integrity: sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==} + dev: true + + /emoji-picker-react@4.12.2(react@18.3.1): + resolution: {integrity: sha512-6PDYZGlhidt+Kc0ay890IU4HLNfIR7/OxPvcNxw+nJ4HQhMKd8pnGnPn4n2vqC/arRFCNWQhgJP8rpsYKsz0GQ==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16' + dependencies: + flairup: 1.0.0 + react: 18.3.1 + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + dev: false + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + dependencies: + iconv-lite: 0.6.3 + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /engine.io-client@6.6.3: + resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + dev: false + + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + /es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + dev: true + + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + + /es-toolkit@1.33.0: + resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} + dev: false + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: false + + /es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + dependencies: + es6-promise: 4.2.8 + dev: false + + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + dev: false + + /esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + dev: true + + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + /escape-latex@1.2.0: + resolution: {integrity: sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==} + dev: false + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.7 + + /eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + dependencies: + fast-safe-stringify: 2.1.1 + dev: false + + /ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + dev: false + + /ethers@6.14.0: + resolution: {integrity: sha512-KgHwltNSMdbrGWEyKkM0Rt2s+u1nDH/5BVDQakLinzGEJi4bWindBzZSCC4gKsbZjwDTI6ex/8suR9Ihbmz4IQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + dev: false + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} + dev: true + + /extension-port-stream@3.0.0: + resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} + engines: {node: '>=12.0.0'} + dependencies: + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + dev: false + + /eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + + /fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + dev: false + + /fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + dev: false + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false + + /fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + dev: false + + /fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + dependencies: + reusify: 1.1.0 + dev: false + + /fdir@6.4.4(picomatch@4.0.2): + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.2 + dev: true + + /fetch-cookie@3.0.1: + resolution: {integrity: sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q==} + dependencies: + set-cookie-parser: 2.7.1 + tough-cookie: 4.1.4 + dev: false + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /flairup@1.0.0: + resolution: {integrity: sha512-IKlE+pNvL2R+kVL1kEhUYqRxVqeFnjiIvHWDMLFXNaqyUdFXQM2wte44EfMYJNHkW16X991t2Zg8apKkhv7OBA==} + dev: false + + /follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + + /for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: false + + /foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + dev: false + + /fraction.js@4.3.4: + resolution: {integrity: sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==} + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: false + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: false + + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + /get-starknet-core@4.0.0: + resolution: {integrity: sha512-6pLmidQZkC3wZsrHY99grQHoGpuuXqkbSP65F8ov1/JsEI8DDLkhsAuLCKFzNOK56cJp+f1bWWfTJ57e9r5eqQ==} + deprecated: Package no longer supported. Please use @starknet-io/get-starknet-core + dependencies: + '@starknet-io/types-js': 0.7.10 + dev: false + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + dev: false + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /h3@1.15.3: + resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.0 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + dev: false + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.1 + dev: false + + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /hpke-js@1.6.2: + resolution: {integrity: sha512-HllaSHiEEd9bZ9L0F0hFERSu2iAWDptkzVUqxra3lTapSPP8Bnyc6J9Viwn/oktPLBXOJpX57lfXSHYsh4HLag==} + engines: {node: '>=16.0.0'} + dependencies: + '@hpke/chacha20poly1305': 1.6.2 + '@hpke/common': 1.7.2 + '@hpke/core': 1.7.2 + '@hpke/dhkem-x25519': 1.6.2 + '@hpke/dhkem-x448': 1.6.2 + '@noble/hashes': 1.8.0 + dev: false + + /html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + dependencies: + whatwg-encoding: 2.0.0 + dev: true + + /http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /http-server@14.1.1: + resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} + engines: {node: '>=12'} + hasBin: true + dependencies: + basic-auth: 2.0.1 + chalk: 4.1.2 + corser: 2.0.1 + he: 1.2.0 + html-encoding-sniffer: 3.0.0 + http-proxy: 1.18.1 + mime: 1.6.0 + minimist: 1.2.8 + opener: 1.5.2 + portfinder: 1.0.37 + secure-compare: 3.0.1 + union: 0.5.0 + url-join: 4.0.1 + transitivePeerDependencies: + - debug + - supports-color + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: false + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /idb-keyval@6.2.2: + resolution: {integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==} + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + dev: false + + /is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: false + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: false + + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: false + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + dev: false + + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.19 + dev: false + + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /isomorphic-fetch@3.0.0(encoding@0.1.13): + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + whatwg-fetch: 3.6.20 + transitivePeerDependencies: + - encoding + dev: false + + /isomorphic-ws@4.0.1(ws@7.5.10): + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + dependencies: + ws: 7.5.10 + dev: false + + /isows@1.0.3(ws@8.13.0): + resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.13.0 + dev: false + + /isows@1.0.6(ws@8.18.0): + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.18.0 + dev: false + + /isows@1.0.6(ws@8.18.1): + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.18.1 + dev: false + + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + + /javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + dev: false + + /jayson@4.2.0: + resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10) + json-stringify-safe: 5.0.1 + stream-json: 1.9.1 + uuid: 8.3.2 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + dev: false + + /js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + dev: false + + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + dev: false + + /jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + dev: false + + /lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false + + /lit-element@4.2.0: + resolution: {integrity: sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.3.0 + '@lit/reactive-element': 2.1.0 + lit-html: 3.3.0 + dev: false + + /lit-html@3.3.0: + resolution: {integrity: sha512-RHoswrFAxY2d8Cf2mm4OZ1DgzCoBKUKSPvA1fhtSELxUERq2aQQ2h05pO9j81gS1o7RIRJ+CePLogfyahwmynw==} + dependencies: + '@types/trusted-types': 2.0.7 + dev: false + + /lit@3.1.0: + resolution: {integrity: sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==} + dependencies: + '@lit/reactive-element': 2.1.0 + lit-element: 4.2.0 + lit-html: 3.3.0 + dev: false + + /local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lossless-json@4.0.2: + resolution: {integrity: sha512-+z0EaLi2UcWi8MZRxA5iTb6m4Ys4E80uftGY+yG5KNFJb5EceQXOhdW/pWJZ8m97s26u7yZZAYMcKWNztSZssA==} + dev: false + + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: false + + /loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + dev: true + + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + /match-sorter@6.3.4: + resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} + dependencies: + '@babel/runtime': 7.27.1 + remove-accents: 0.5.0 + dev: false + + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + /mathjs@12.4.3: + resolution: {integrity: sha512-oHdGPDbp7gO873xxG90RLq36IuicuKvbpr/bBG5g9c8Obm/VsKVrK9uoRZZHUodohzlnmCEqfDzbR3LH6m+aAQ==} + engines: {node: '>= 18'} + hasBin: true + dependencies: + '@babel/runtime': 7.27.1 + complex.js: 2.4.2 + decimal.js: 10.5.0 + escape-latex: 1.2.0 + fraction.js: 4.3.4 + javascript-natural-sort: 0.7.1 + seedrandom: 3.0.5 + tiny-emitter: 2.1.0 + typed-function: 4.2.1 + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + dev: false + + /micro-starknet@0.2.3: + resolution: {integrity: sha512-6XBcC+GerlwJSR4iA0VaeXtS2wrayWFcA4PEzrJPMuFmWCaUtuGIq5K/DB5F/XgnL54/zl2Bxo690Lj7mYVA8A==} + dependencies: + '@noble/curves': 1.0.0 + '@noble/hashes': 1.3.3 + dev: false + + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: false + + /microseconds@0.2.0: + resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==} + dev: false + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + + /mipd@0.0.7(typescript@5.8.3): + resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.8.3 + dev: false + + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + dependencies: + acorn: 8.14.1 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + dev: false + + /mobx@6.13.7: + resolution: {integrity: sha512-aChaVU/DO5aRPmk1GX8L+whocagUUpBQqoPtJk+cm7UOXUk87J4PeWCh6nNmTTIfEhiR9DI/+FnA8dln/hTK7g==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nano-time@1.0.0: + resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==} + dependencies: + big-integer: 1.6.52 + dev: false + + /nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + dev: false + + /neverthrow@8.2.0: + resolution: {integrity: sha512-kOCT/1MCPAxY5iUV3wytNFUMUolzuwd/VF/1KCx7kf6CutrOsTie+84zTGTpgQycjvfLdBBdvBvFLqFD2c0wkQ==} + engines: {node: '>=18'} + optionalDependencies: + '@rollup/rollup-linux-x64-gnu': 4.40.2 + dev: false + + /node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + engines: {node: '>=10'} + dependencies: + semver: 7.7.1 + dev: false + + /node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + dev: false + + /node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + dev: false + + /node-fetch@2.7.0(encoding@0.1.13): + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + encoding: 0.1.13 + whatwg-url: 5.0.0 + dev: false + + /node-gyp-build-optional-packages@5.1.1: + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} + hasBin: true + requiresBuild: true + dependencies: + detect-libc: 2.0.4 + dev: false + optional: true + + /node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + requiresBuild: true + dev: false + + /node-mock-http@1.0.0: + resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} + dev: false + + /node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + + /obj-multiplex@1.0.0: + resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + readable-stream: 2.3.8 + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false + + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + dev: true + + /oblivious-set@1.0.0: + resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==} + dev: false + + /ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.6 + ufo: 1.6.1 + dev: false + + /on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /open@10.1.2: + resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} + engines: {node: '>=18'} + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + dev: false + + /opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + + /ox@0.6.7(typescript@5.8.3): + resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.3)(zod@3.24.4) + eventemitter3: 5.0.1 + typescript: 5.8.3 + transitivePeerDependencies: + - zod + dev: false + + /ox@0.6.9(typescript@5.8.3)(zod@3.22.4): + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.3)(zod@3.22.4) + eventemitter3: 5.0.1 + typescript: 5.8.3 + transitivePeerDependencies: + - zod + dev: false + + /ox@0.6.9(typescript@5.8.3)(zod@3.24.4): + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.3)(zod@3.24.4) + eventemitter3: 5.0.1 + typescript: 5.8.3 + transitivePeerDependencies: + - zod + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.2.1 + dev: false + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + dev: false + + /pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + dev: false + + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: false + + /pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: false + + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + dev: true + + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: false + + /pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + dependencies: + duplexify: 4.1.3 + split2: 4.2.0 + dev: false + + /pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + dev: false + + /pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + dev: false + + /pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + dev: false + + /pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + dev: false + + /pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + dev: false + + /pony-cause@2.1.11: + resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + engines: {node: '>=12.0.0'} + dev: false + + /portfinder@1.0.37: + resolution: {integrity: sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==} + engines: {node: '>= 10.12'} + dependencies: + async: 3.2.6 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + dev: true + + /possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + dev: false + + /postcss-import@15.1.0(postcss@8.5.3): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + dev: false + + /postcss-js@4.0.1(postcss@8.5.3): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.3 + dev: false + + /postcss-load-config@4.0.2(postcss@8.5.3): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.3 + postcss: 8.5.3 + yaml: 2.7.1 + dev: false + + /postcss-nested@6.2.0(postcss@8.5.3): + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 + dev: false + + /postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + /posthog-js-lite@3.2.1: + resolution: {integrity: sha512-F+S+T9XiQr2rOkD0UFTr8yu8qScm4aM2lR5PmyknxxqlkC5gpRKS+Hi8cq5CYda7Q3BODh0h7pdW1P2XfZjEag==} + dev: false + + /prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.4 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.75.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.2 + tunnel-agent: 0.6.0 + dev: false + + /prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + dev: false + + /proxy-compare@2.6.0: + resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} + dev: false + + /proxy-deep@3.1.1: + resolution: {integrity: sha512-kppbvLUNJ4IOMZds9/4gz/rtT5OFiesy3XosLsgMKlF3vb6GA5Y3ptyDlzKLcOcUBW+zaY+RiMINTsgE+O6e+Q==} + dev: false + + /psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + dependencies: + punycode: 2.3.1 + dev: false + + /pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: false + + /qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + dev: false + + /qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.1.0 + dev: true + + /query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false + + /radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + dev: false + + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + dev: false + + /react-query@3.39.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@babel/runtime': 7.27.1 + broadcast-channel: 3.7.0 + match-sorter: 6.3.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-router-dom@7.6.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 7.6.0(react-dom@18.3.1)(react@18.3.1) + dev: false + + /react-router@7.6.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + dependencies: + cookie: 1.0.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + set-cookie-parser: 2.7.1 + dev: false + + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + dev: false + + /real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + dev: false + + /redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + dependencies: + esprima: 4.0.1 + dev: false + + /remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + /resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /rollup@4.40.2: + resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.2 + '@rollup/rollup-android-arm64': 4.40.2 + '@rollup/rollup-darwin-arm64': 4.40.2 + '@rollup/rollup-darwin-x64': 4.40.2 + '@rollup/rollup-freebsd-arm64': 4.40.2 + '@rollup/rollup-freebsd-x64': 4.40.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 + '@rollup/rollup-linux-arm-musleabihf': 4.40.2 + '@rollup/rollup-linux-arm64-gnu': 4.40.2 + '@rollup/rollup-linux-arm64-musl': 4.40.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-musl': 4.40.2 + '@rollup/rollup-linux-s390x-gnu': 4.40.2 + '@rollup/rollup-linux-x64-gnu': 4.40.2 + '@rollup/rollup-linux-x64-musl': 4.40.2 + '@rollup/rollup-win32-arm64-msvc': 4.40.2 + '@rollup/rollup-win32-ia32-msvc': 4.40.2 + '@rollup/rollup-win32-x64-msvc': 4.40.2 + fsevents: 2.3.3 + + /rpc-websockets@9.1.1: + resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} + dependencies: + '@swc/helpers': 0.5.17 + '@types/uuid': 8.3.4 + '@types/ws': 8.18.1 + buffer: 6.0.3 + eventemitter3: 5.0.1 + uuid: 8.3.2 + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + dev: false + + /run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /rxjs@7.5.5: + resolution: {integrity: sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==} + dependencies: + tslib: 2.8.1 + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: false + + /safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /secure-compare@3.0.1: + resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} + dev: true + + /seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + dev: false + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + dev: false + + /sha256-uint8array@0.10.7: + resolution: {integrity: sha512-1Q6JQU4tX9NqsDGodej6pkrUVQVNapLZnvkwIhddH/JqzBZF1fSaxSWNY6sziXBE8aEa2twtGkXUrwzGeZCMpQ==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + dev: true + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.6.3 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + /split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + dev: false + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + /starknet@6.23.1(encoding@0.1.13): + resolution: {integrity: sha512-vQV9luXpmwZZs9RVZaRwm2iD8T0PYx1AzgZeQsCvD89tR0HwUF0paty27ZzuJrdPe0CmAs/ipAYFCE55jbj0RQ==} + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.0 + '@scure/base': 1.2.1 + '@scure/starknet': 1.1.0 + abi-wan-kanabi: 2.2.4 + fetch-cookie: 3.0.1 + isomorphic-fetch: 3.0.0(encoding@0.1.13) + lossless-json: 4.0.2 + pako: 2.1.0 + starknet-types-07: /@starknet-io/types-js@0.7.10 + ts-mixer: 6.0.4 + transitivePeerDependencies: + - encoding + dev: false + + /starknet@6.24.1: + resolution: {integrity: sha512-g7tiCt73berhcNi41otlN3T3kxZnIvZhMi8WdC21Y6GC6zoQgbI2z1t7JAZF9c4xZiomlanwVnurcpyfEdyMpg==} + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.0 + '@scure/base': 1.2.1 + '@scure/starknet': 1.1.0 + abi-wan-kanabi: 2.2.4 + fetch-cookie: 3.0.1 + isomorphic-fetch: 3.0.0(encoding@0.1.13) + lossless-json: 4.0.2 + pako: 2.1.0 + starknet-types-07: /@starknet-io/types-js@0.7.10 + ts-mixer: 6.0.4 + transitivePeerDependencies: + - encoding + dev: false + + /starknetkit@2.10.4(starknet@6.24.1)(typescript@5.8.3): + resolution: {integrity: sha512-POdv8GdGzBmwgMxn+FQhGXxcc4kFY6tnCHoB/c3j5vigZO2fLVxi5tJX9nYsITRX7QzoV3yal7W5e2agJ4SFSA==} + peerDependencies: + starknet: ^6.21.1 + dependencies: + '@starknet-io/get-starknet': 4.0.7 + '@starknet-io/get-starknet-core': 4.0.7 + '@starknet-io/types-js': 0.7.10 + '@trpc/client': 10.45.2(@trpc/server@10.45.2) + '@trpc/server': 10.45.2 + '@walletconnect/sign-client': 2.20.2(typescript@5.8.3) + bowser: 2.11.0 + detect-browser: 5.3.0 + eventemitter3: 5.0.1 + events: 3.3.0 + lodash-es: 4.17.21 + starknet: 6.24.1 + svelte-forms: 2.3.1 + trpc-browser: 1.4.4(@trpc/client@10.45.2)(@trpc/server@10.45.2) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + dev: false + + /std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + /stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + dev: false + + /stream-json@1.9.1: + resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + dependencies: + stream-chain: 2.2.5 + dev: false + + /stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + dev: false + + /strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.1.0 + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + dependencies: + js-tokens: 9.0.1 + dev: false + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + dev: false + + /superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + dev: false + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /svelte-forms@2.3.1: + resolution: {integrity: sha512-ExX9PM0JgvdOWlHl2ztD7XzLNPOPt9U5hBKV8sUAisMfcYWpPRnyz+6EFmh35BOBGJJmuhTDBGm5/7seLjOTIA==} + dependencies: + is-promise: 4.0.0 + dev: false + + /swr@2.3.3(react@18.3.1): + resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + dequal: 2.0.3 + react: 18.3.1 + use-sync-external-store: 1.5.0(react@18.3.1) + dev: false + + /tailwindcss-animate@1.0.7(tailwindcss@3.4.17): + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + tailwindcss: 3.4.17 + dev: false + + /tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + dev: false + + /tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + dev: false + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + dependencies: + real-require: 0.1.0 + dev: false + + /tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + dev: false + + /tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + /tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + dev: true + + /tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + dev: true + + /tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + dev: false + + /tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + dev: true + + /tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: false + + /tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /trpc-browser@1.4.4(@trpc/client@10.45.2)(@trpc/server@10.45.2): + resolution: {integrity: sha512-5ZH/LqSoF008W8KU+4tfQ+g3F4Yl6BywDUnSlx5jT6fKa87mm8PkIXfhjGN1k6LoxjpMjy82bxvQzNLkJ3vUvw==} + peerDependencies: + '@trpc/client': ^10.0.0 + '@trpc/server': ^10.0.0 + dependencies: + '@trpc/client': 10.45.2(@trpc/server@10.45.2) + '@trpc/server': 10.45.2 + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false + + /ts-mixer@6.0.4: + resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + dev: false + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + + /tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + dev: false + + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + dev: false + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + + /typed-function@4.2.1: + resolution: {integrity: sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==} + engines: {node: '>= 18'} + dev: false + + /typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + /ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + dev: false + + /uint8arrays@3.1.0: + resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + dependencies: + multiformats: 9.9.0 + dev: false + + /uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + dev: false + + /undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + dev: false + + /undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + /union@0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} + engines: {node: '>= 0.8.0'} + dependencies: + qs: 6.14.0 + dev: true + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /unload@2.2.0: + resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} + dependencies: + '@babel/runtime': 7.27.1 + detect-node: 2.1.0 + dev: false + + /unstorage@1.16.0(idb-keyval@6.2.2): + resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + dependencies: + anymatch: 3.1.3 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.3 + idb-keyval: 6.2.2 + lru-cache: 10.4.3 + node-fetch-native: 1.6.6 + ofetch: 1.4.1 + ufo: 1.6.1 + dev: false + + /update-browserslist-db@1.1.3(browserslist@4.24.5): + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.24.5 + escalade: 3.2.0 + picocolors: 1.1.1 + dev: true + + /url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /use-sync-external-store@1.2.0(react@18.3.1): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.3.1 + dev: false + + /use-sync-external-store@1.5.0(react@18.3.1): + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + react: 18.3.1 + dev: false + + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.4 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.19 + dev: false + + /uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false + + /valtio@1.13.2(@types/react@18.3.21)(react@18.3.1): + resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + dependencies: + '@types/react': 18.3.21 + derive-valtio: 0.1.0(valtio@1.13.2) + proxy-compare: 2.6.0 + react: 18.3.1 + use-sync-external-store: 1.2.0(react@18.3.1) + dev: false + + /viem@2.23.2(typescript@5.8.3): + resolution: {integrity: sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.3)(zod@3.24.4) + isows: 1.0.6(ws@8.18.0) + ox: 0.6.7(typescript@5.8.3) + typescript: 5.8.3 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + + /viem@2.29.1(typescript@5.8.3)(zod@3.22.4): + resolution: {integrity: sha512-mhLn0vDdsxZ4taB7XYgnIVNvXASm60KyPAkvw4k8uNCQ+HLH+5jUgKvLg4AP3y6VJxsgiVPwqUt0dJANDF5DZA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.3)(zod@3.22.4) + isows: 1.0.6(ws@8.18.1) + ox: 0.6.9(typescript@5.8.3)(zod@3.22.4) + typescript: 5.8.3 + ws: 8.18.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + + /viem@2.29.1(typescript@5.8.3)(zod@3.24.4): + resolution: {integrity: sha512-mhLn0vDdsxZ4taB7XYgnIVNvXASm60KyPAkvw4k8uNCQ+HLH+5jUgKvLg4AP3y6VJxsgiVPwqUt0dJANDF5DZA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.3)(zod@3.24.4) + isows: 1.0.6(ws@8.18.1) + ox: 0.6.9(typescript@5.8.3)(zod@3.24.4) + typescript: 5.8.3 + ws: 8.18.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + + /viem@2.9.20(typescript@5.8.3)(zod@3.24.4): + resolution: {integrity: sha512-PHb1MrBHMrSZ8Ayuk3Y/6wUTcMbzlACQaM6AJBSv9kRKX3xYSZ/kehi+gvS0swQJeAlTQ4eZM7jsHQJNAOarmg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 1.0.0(typescript@5.8.3)(zod@3.24.4) + isows: 1.0.3(ws@8.13.0) + typescript: 5.8.3 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + + /vite-envs@4.6.0: + resolution: {integrity: sha512-LkkkWiIsJhogm0YP6hYJhjUFfG8KLKJvnwFtTz4J5Otg9/RjmCCTkgbJWdb65cv5vlvA8xwGfm+NwSMl5H1Wjg==} + hasBin: true + dev: true + + /vite-node@1.6.1(@types/node@22.15.17): + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.4.0 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.19(@types/node@22.15.17) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: false + + /vite-node@3.1.3(@types/node@22.15.17): + resolution: {integrity: sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 6.3.5(@types/node@22.15.17) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + dev: true + + /vite-plugin-top-level-await@1.5.0(vite@6.3.5): + resolution: {integrity: sha512-r/DtuvHrSqUVk23XpG2cl8gjt1aATMG5cjExXL1BUTcSNab6CzkcPua9BPEc9fuTP5UpwClCxUe3+dNGL0yrgQ==} + peerDependencies: + vite: '>=2.8' + dependencies: + '@rollup/plugin-virtual': 3.0.2 + '@swc/core': 1.11.24 + uuid: 10.0.0 + vite: 6.3.5(@types/node@22.15.17) + transitivePeerDependencies: + - '@swc/helpers' + - rollup + dev: true + + /vite-plugin-wasm@3.4.1(vite@6.3.5): + resolution: {integrity: sha512-ja3nSo2UCkVeitltJGkS3pfQHAanHv/DqGatdI39ja6McgABlpsZ5hVgl6wuR8Qx5etY3T5qgDQhOWzc5RReZA==} + peerDependencies: + vite: ^2 || ^3 || ^4 || ^5 || ^6 + dependencies: + vite: 6.3.5(@types/node@22.15.17) + dev: true + + /vite@5.4.19(@types/node@22.15.17): + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 22.15.17 + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.40.2 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /vite@6.3.5(@types/node@22.15.17): + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + '@types/node': 22.15.17 + esbuild: 0.25.4 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.40.2 + tinyglobby: 0.2.13 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@1.6.1(@types/node@22.15.17): + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 22.15.17 + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.4.0 + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.17 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.9.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.19(@types/node@22.15.17) + vite-node: 1.6.1(@types/node@22.15.17) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: false + + /vitest@3.1.3(@types/node@22.15.17): + resolution: {integrity: sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.1.3 + '@vitest/ui': 3.1.3 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 22.15.17 + '@vitest/expect': 3.1.3 + '@vitest/mocker': 3.1.3(vite@6.3.5) + '@vitest/pretty-format': 3.1.3 + '@vitest/runner': 3.1.3 + '@vitest/snapshot': 3.1.3 + '@vitest/spy': 3.1.3 + '@vitest/utils': 3.1.3 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.13 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.3.5(@types/node@22.15.17) + vite-node: 3.1.3(@types/node@22.15.17) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + dev: true + + /webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: false + + /which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + 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 + dev: false + + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + 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 + dev: false + + /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 + dev: false + + /ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + 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 + dev: false + + /ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + 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 + dependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + dev: false + + /xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + dev: false + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + dev: false + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: false + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + 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 + dev: false + + /yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + dev: false + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false + + /zod@3.24.4: + resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} + dev: false + + /zustand@4.5.6(@types/react@18.3.21)(immer@10.1.1)(react@18.3.1): + resolution: {integrity: sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.3.21 + immer: 10.1.1 + react: 18.3.1 + use-sync-external-store: 1.5.0(react@18.3.1) + dev: false diff --git a/client/postcss.config.js b/client/postcss.config.js deleted file mode 100644 index 2aa7205..0000000 --- a/client/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/client/public/assets/loading.mp4 b/client/public/assets/loading.mp4 deleted file mode 100644 index 92e7232..0000000 Binary files a/client/public/assets/loading.mp4 and /dev/null differ diff --git a/client/public/assets/sounds/effects/error.mp3 b/client/public/assets/sounds/effects/error.mp3 deleted file mode 100644 index 4cedc1a..0000000 Binary files a/client/public/assets/sounds/effects/error.mp3 and /dev/null differ diff --git a/client/public/assets/sounds/effects/place_color.mp3 b/client/public/assets/sounds/effects/place_color.mp3 deleted file mode 100644 index fb7a996..0000000 Binary files a/client/public/assets/sounds/effects/place_color.mp3 and /dev/null differ diff --git a/client/public/assets/sounds/effects/success.mp3 b/client/public/assets/sounds/effects/success.mp3 deleted file mode 100644 index a2508bb..0000000 Binary files a/client/public/assets/sounds/effects/success.mp3 and /dev/null differ diff --git a/client/public/logo.png b/client/public/logo.png deleted file mode 100644 index 20cae02..0000000 Binary files a/client/public/logo.png and /dev/null differ diff --git a/client/scripts/prepare_release.sh b/client/scripts/prepare_release.sh new file mode 100755 index 0000000..6869d1b --- /dev/null +++ b/client/scripts/prepare_release.sh @@ -0,0 +1,28 @@ +#!/bin/bash +set -euxo pipefail + +if [ ! -f VERSION ]; then + echo "VERSION file does not exist" + exit 1 +fi + +if [ $# -eq 0 ]; then + echo "No arguments supplied" + exit 1 +fi + +prev_version=$(cat VERSION) +next_version=$1 + +# Update package.json +jq '.version = "'$next_version'"' package.json > temp.json && mv temp.json package.json + +# Update README.md +sed -i'' -e "s/Version $prev_version/Version $next_version/g" README.md + +echo $1 > VERSION + +# Uncommented git commands +git commit -am "Prepare v$1" +git tag -a "v$1" -m "Version $1" + diff --git a/client/scripts/switchDependencies.js b/client/scripts/switchDependencies.js new file mode 100644 index 0000000..a858df3 --- /dev/null +++ b/client/scripts/switchDependencies.js @@ -0,0 +1,58 @@ +// switchDependencies.js +import fs from "node:fs"; +import path from "node:path"; + +const useWorkspace = process.argv.includes("--workspace"); + +const packageJsonPath = path.join(process.cwd(), "package.json"); +const workspaceYamlDisabled = path.join( + process.cwd(), + "pnpm-workspace.disabled.yaml", +); +const workspaceYamlEnabled = path.join(process.cwd(), "pnpm-workspace.yaml"); + +// Use dynamic import for JSON files +const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8")); + +const submodulePaths = { + "@pixelaw/core": "workspace:*", + "@pixelaw/core-dojo": "workspace:*", + "@pixelaw/core-mud": "workspace:*", + "@pixelaw/react": "workspace:*", + "@pixelaw/react-dojo": "workspace:*", +}; + +function newWorkspaceFile(filename) { + const yamlContent = `packages:\n - "."\n - "../pixelaw.js/packages/*"\n`; + fs.writeFileSync(filename, yamlContent); +} + +if (useWorkspace) { + for (const dep of Object.keys(submodulePaths)) { + packageJson.dependencies[dep] = submodulePaths[dep]; + } + // Rename to enable submodules + if (fs.existsSync(workspaceYamlDisabled)) { + fs.renameSync(workspaceYamlDisabled, workspaceYamlEnabled); + } else { + newWorkspaceFile(workspaceYamlEnabled); + } +} else { + // Revert to regular versions + packageJson.dependencies["@pixelaw/core"] = "^0.6.7"; + packageJson.dependencies["@pixelaw/core-dojo"] = "^0.6.7"; + packageJson.dependencies["@pixelaw/core-mud"] = "^0.6.7"; + packageJson.dependencies["@pixelaw/react"] = "^0.6.7"; + packageJson.dependencies["@pixelaw/react-dojo"] = "^0.6.7"; + + if (fs.existsSync(workspaceYamlEnabled)) { + fs.renameSync(workspaceYamlEnabled, workspaceYamlDisabled); + } else { + newWorkspaceFile(workspaceYamlDisabled); + } +} + +fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)); +console.log( + `Switched to ${useWorkspace ? "submodules" : "regular"} dependencies.`, +); diff --git a/client/src/Main.module.css b/client/src/Main.module.css new file mode 100644 index 0000000..91d6137 --- /dev/null +++ b/client/src/Main.module.css @@ -0,0 +1,81 @@ +/* Reset default margins and paddings */ +html, +body { + background-color: black; + margin: 0; + padding: 0; + overflow: hidden; /* Prevent scrollbars */ + width: 100vw; + height: 100vh; + box-sizing: border-box; +} + +*, +*::before, +*::after { + box-sizing: inherit; /* Ensure box-sizing is consistent */ +} + +.App { + width: 100%; + display: flex; + flex-direction: column; /* Stack children vertically */ + height: 100vh; /* Fill the full viewport height */ +} + +.TopBar { + width: 100%; + background-color: #333; /* Example background color */ + color: white; /* Text color */ + padding: 10px 0; /* Padding for aesthetic spacing */ + text-align: center; /* Center the title or any content horizontally */ + position: fixed; /* Make it stick at the top */ + top: 0; /* Align to the top */ + z-index: 1000; /* Ensure it's above other content */ +} + +/* Ensure the viewport container expands to fill available space */ +.main { + flex-grow: 1; + display: flex; /* Make this a flex container */ + height: 100vh; /* Fill the full viewport height */ + width: 100vw; /* Fill the full viewport height */ +} + +.container { + background-color: black; /* Replace with the actual color value */ + min-height: 100vh; /* Equivalent to min-h-screen */ + display: flex; + flex-direction: column; /* Equivalent to flex-col */ +} + +.errorContainer { + position: fixed; + top: 0; + bottom: 0; + left: 0; + width: 100%; + background-color: rgba(0, 0, 0, 0.75); + z-index: 40; + display: flex; + justify-content: center; + align-items: center; +} + +.errorMessage { + width: 25%; +} + +.errorTitle { + text-align: center; + color: #ff4757; /* Example error color */ + font-size: 1.5rem; + font-weight: bold; +} + +.errorDetail, +.errorSuggestion { + color: #adb5bd; /* Example suggestion color */ + text-align: center; + margin-top: 1rem; +} diff --git a/client/src/Main.tsx b/client/src/Main.tsx new file mode 100644 index 0000000..dea9126 --- /dev/null +++ b/client/src/Main.tsx @@ -0,0 +1,30 @@ +import GamePage from "@/pages/GamePage/GamePage.tsx"; +import SettingsPage from "@/pages/SettingsPage.tsx"; +import { WalletSelectorPage } from "@/pages/WalletSelectorPage.tsx"; +import WorldSelectorPage from "@/pages/WorldSelectorPage.tsx"; +import { Route, Routes } from "react-router-dom"; +import styles from "./Main.module.css"; +import PwarPage from "./pages/PwarPage/PwarPage"; + +function Main() { + document.title = "PixeLAW: World"; + + return ( +
+ {/**/} + +
+ + } /> + } /> + } /> + } /> + } /> + } /> + +
+
+ ); +} + +export default Main; diff --git a/client/src/app/index.tsx b/client/src/app/index.tsx deleted file mode 100644 index 13d3fd4..0000000 --- a/client/src/app/index.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { PixelViewer } from "@/components/PixelViewer"; -import { Header } from "@/components/Header"; -import { ProposalList } from "@/components/ProposalList"; - -export const App = () => { - return ( - <> -
- - - - ); -}; diff --git a/client/src/components/ActivateButton.tsx b/client/src/components/ActivateButton.tsx deleted file mode 100644 index 4377ca7..0000000 --- a/client/src/components/ActivateButton.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { DEFAULT_GAME_ID } from "@/constants"; -import { useDojo } from "@/hooks/useDojo"; -import { Position, Proposal } from "@/libs/dojo/typescript/models.gen"; -import { useEntityQuery } from "@dojoengine/react"; -import { getComponentValue, HasValue } from "@dojoengine/recs"; -import { useCallback, useMemo } from "react"; - -export const ActivateProposalButton = ({ proposal }: { proposal: Proposal }) => { - // Hooks - const { - setup: { - systemCalls: { activateProposal }, - clientComponents: { Pixel }, - }, - account: { account }, - connectedAccount, - } = useDojo(); - - console.log(proposal.target_args_1); - - // State - const activeAccount = useMemo(() => connectedAccount || account, [connectedAccount, account]); - const targetPixelEntities = useEntityQuery([HasValue(Pixel, { color: proposal.target_args_1 })]); - const targetPixels = useMemo( - () => - targetPixelEntities - .map((entity) => { - const value = getComponentValue(Pixel, entity); - if (!value) return; - return { - x: value.x, - y: value.y, - } as Position; - }) - .filter((pixel) => pixel !== undefined), - [targetPixelEntities, Pixel], - ); - console.log(targetPixels); - - // Handler - const handleActivateProposal = useCallback(async () => { - if (proposal.target_args_1 === 1) { - await activateProposal(activeAccount, DEFAULT_GAME_ID, proposal.index, [{ x: 0, y: 0 }]); - } else { - await activateProposal(activeAccount, DEFAULT_GAME_ID, proposal.index, targetPixels); - } - }, [proposal, activeAccount, targetPixels, activateProposal]); - - return ( - - ); -}; diff --git a/client/src/components/Avatar/EmojiAvatar.tsx b/client/src/components/Avatar/EmojiAvatar.tsx deleted file mode 100644 index b727a7a..0000000 --- a/client/src/components/Avatar/EmojiAvatar.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { emojiAvatarForAddress } from "./emojiAvatarForAddress"; - -const EmojiAvatar = ({ address, ensImage, size }: { address: string; ensImage?: string | null; size: number }) => { - const { color: backgroundColor, emoji } = emojiAvatarForAddress(address); - - return ensImage ? ( -
- ) : ( -
- {emoji} -
- ); -}; - -export default EmojiAvatar; diff --git a/client/src/components/Avatar/index.tsx b/client/src/components/Avatar/index.tsx deleted file mode 100644 index 889fe50..0000000 --- a/client/src/components/Avatar/index.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import EmojiAvatar from "./EmojiAvatar"; -import { cn } from "@/utils"; -import { Loader2 } from "lucide-react"; - -interface AvatarProps { - address: string; - loading?: boolean; - imageUrl?: string | null; - size: number; -} - -const Avatar = ({ address, loading, imageUrl, size }: AvatarProps) => { - return ( -
-
- -
- {loading && ( -
- -
- )} -
- ); -}; - -export default Avatar; diff --git a/client/src/components/CanvasGrid.tsx b/client/src/components/CanvasGrid.tsx deleted file mode 100644 index dd559e1..0000000 --- a/client/src/components/CanvasGrid.tsx +++ /dev/null @@ -1,493 +0,0 @@ -import React, { useRef, useEffect, useCallback } from "react"; -import { BASE_CELL_SIZE, MAX_SCALE, MIN_SCALE, SWIPE_THRESHOLD } from "@/constants/webgl"; -import { useWebGL } from "@/hooks/useWebGL"; -import { convertClientPosToCanvasPos } from "@/utils/canvas"; -import { getPinchDistance, getTouchPositions } from "@/utils/gestures"; -import { GridState } from "@/types"; -import { resizeCanvasToDisplaySize } from "twgl.js"; - -export const INERTIA_DAMPING = 0.97; -export const INERTIA_STOP_THRESHOLD = 0.05; - -const PINCH_COOLDOWN = 300; // ミリ秒 - -interface CanvasGridProps { - canvasRef: React.RefObject; - width?: number; - height?: number; - gridState: GridState; - className?: string; - initialScale?: number; - initialOffset?: { x: number; y: number }; - maxZoom?: number; - minZoom?: number; - maxCellSize?: number; - damping?: boolean; - setGridState: React.Dispatch>; - onDrawGrid?: () => void; - onCellClick?: (x: number, y: number) => void; - onCellHover?: (x: number, y: number) => void; - onPinch?: (scale: number, x: number, y: number) => void; - onTap?: (x: number, y: number) => void; - onSwipe?: (dx: number, dy: number) => void; - onPan?: (dx: number, dy: number) => void; - onZoom?: (scale: number, x: number, y: number) => void; - setCurrentMousePos?: React.Dispatch< - React.SetStateAction<{ - x: number; - y: number; - }> - >; -} - -export const CanvasGrid: React.FC = ({ - maxZoom = MAX_SCALE, - minZoom = MIN_SCALE, - maxCellSize, - damping = true, - gridState, - canvasRef, - width, - height, - className, - setGridState, - onDrawGrid, - onCellClick, - onCellHover, - onPan, - onPinch, - onTap, - onSwipe, - onZoom, - setCurrentMousePos, -}) => { - // Hooks - const { glRef, drawGrid } = useWebGL(canvasRef, gridState); - - // Refs - const mouseDownPosRef = useRef<{ x: number; y: number } | null>(null); - const isDraggingRef = useRef(false); - const lastTouchPosRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 }); - const touchStartPosRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 }); - const gestureRef = useRef<{ - gestureType: string | null; - isGesture: boolean; - gestureStartTime: number | null; - lastPinchDistance: number | null; - lastTouchPositions: { x: number; y: number }[] | null; - lastPinchEndTime: number; - }>({ - gestureType: null, - isGesture: false, - gestureStartTime: null, - lastPinchDistance: null, - lastTouchPositions: null, - lastPinchEndTime: 0, - }); - const inertiaRef = useRef<{ - speedX: number; - speedY: number; - lastTime: number; - animationFrame: number | null; - }>({ - speedX: 0, - speedY: 0, - lastTime: 0, - animationFrame: null, - }); - - // Handlers - const setLimitedGridState = useCallback( - (updater: (prev: GridState) => GridState) => { - setGridState((prev) => { - const newState = updater(prev); - if (maxCellSize) { - const maxOffsetX = Math.max( - 0, - maxCellSize * BASE_CELL_SIZE - (canvasRef.current?.width || 0) / newState.scale, - ); - const maxOffsetY = Math.max( - 0, - maxCellSize * BASE_CELL_SIZE - (canvasRef.current?.height || 0) / newState.scale, - ); - return { - ...newState, - offsetX: Math.min(Math.max(0, newState.offsetX), maxOffsetX), - offsetY: Math.min(Math.max(0, newState.offsetY), maxOffsetY), - }; - } - return newState; - }); - }, - [setGridState, maxCellSize, canvasRef], - ); - - const updateCurrentMousePos = useCallback( - (canvasX: number, canvasY: number) => { - const worldX = gridState.offsetX + canvasX / gridState.scale; - const worldY = gridState.offsetY + canvasY / gridState.scale; - - const cellX = Math.floor(worldX / BASE_CELL_SIZE); - const cellY = Math.floor(worldY / BASE_CELL_SIZE); - - setCurrentMousePos?.({ x: cellX, y: cellY }); - onCellHover?.(cellX, cellY); - }, - [gridState, onCellHover, setCurrentMousePos], - ); - - const handleMouseDown = useCallback( - (e: React.MouseEvent) => { - e.preventDefault(); - - const { x, y } = convertClientPosToCanvasPos(canvasRef, e.clientX, e.clientY); - - mouseDownPosRef.current = { x, y }; - isDraggingRef.current = false; - }, - [canvasRef], - ); - - const handleMouseMove = useCallback( - (e: React.MouseEvent) => { - e.preventDefault(); - const { x, y } = convertClientPosToCanvasPos(canvasRef, e.clientX, e.clientY); - - updateCurrentMousePos(x, y); - - if (!mouseDownPosRef.current) return; - - const dx = x - mouseDownPosRef.current.x; - const dy = y - mouseDownPosRef.current.y; - - if (!isDraggingRef.current && (Math.abs(dx) > SWIPE_THRESHOLD / 2 || Math.abs(dy) > SWIPE_THRESHOLD / 2)) { - isDraggingRef.current = true; - } - - if (isDraggingRef.current) { - setLimitedGridState((prev) => ({ - ...prev, - offsetX: Math.max(0, prev.offsetX - dx / prev.scale), - offsetY: Math.max(0, prev.offsetY - dy / prev.scale), - })); - - onSwipe?.(dx, dy); - - mouseDownPosRef.current = { x, y }; - } - }, - [canvasRef, updateCurrentMousePos, onSwipe, setLimitedGridState], - ); - - const handleMouseUp = useCallback( - (e: React.MouseEvent) => { - e.preventDefault(); - e.stopPropagation(); - - if (!isDraggingRef.current && mouseDownPosRef.current) { - const { x, y } = convertClientPosToCanvasPos(canvasRef, e.clientX, e.clientY); - - const worldX = gridState.offsetX + x / gridState.scale; - const worldY = gridState.offsetY + y / gridState.scale; - - const cellX = Math.floor(worldX / BASE_CELL_SIZE); - const cellY = Math.floor(worldY / BASE_CELL_SIZE); - - onCellClick?.(cellX, cellY); - } - - // Reset gesture states after mouse up - gestureRef.current.isGesture = false; - gestureRef.current.gestureType = null; - - mouseDownPosRef.current = null; - isDraggingRef.current = false; - }, - [canvasRef, gridState, onCellClick], - ); - - const handleWheel = useCallback( - (e: React.WheelEvent) => { - const { x, y } = convertClientPosToCanvasPos(canvasRef, e.clientX, e.clientY); - - if (e.ctrlKey) { - // TrackPad pinch gesture - const delta = -e.deltaY * 0.01; - setLimitedGridState((prev) => { - const newScale = Math.max(minZoom, Math.min(maxZoom, prev.scale * (1 + delta))); - const worldX = prev.offsetX + x / prev.scale; - const worldY = prev.offsetY + y / prev.scale; - const newOffsetX = Math.max(0, worldX - x / newScale); - const newOffsetY = Math.max(0, worldY - y / newScale); - - onZoom?.(newScale, x, y); - - return { ...prev, scale: newScale, offsetX: newOffsetX, offsetY: newOffsetY }; - }); - } else { - // Regular mouse wheel or swipe - setLimitedGridState((prev) => ({ - ...prev, - offsetX: Math.max(0, prev.offsetX + e.deltaX / prev.scale), - offsetY: Math.max(0, prev.offsetY + e.deltaY / prev.scale), - })); - onPan?.(e.deltaX, e.deltaY); - } - - updateCurrentMousePos(x, y); - }, - [canvasRef, minZoom, maxZoom, updateCurrentMousePos, onZoom, setLimitedGridState, onPan], - ); - - const handleTouchStart = useCallback( - (e: React.TouchEvent) => { - if (e.touches.length === 2) { - gestureRef.current.isGesture = true; - gestureRef.current.gestureType = "pinch"; - gestureRef.current.gestureStartTime = performance.now(); - gestureRef.current.lastPinchDistance = getPinchDistance(e.touches); - gestureRef.current.lastTouchPositions = getTouchPositions(e.touches); - } else { - isDraggingRef.current = false; - const touch = e.touches[0]; - const { x, y } = convertClientPosToCanvasPos(canvasRef, touch.clientX, touch.clientY); - - updateCurrentMousePos(x, y); - touchStartPosRef.current = { x, y }; - lastTouchPosRef.current = { x: touch.clientX, y: touch.clientY }; - - gestureRef.current.gestureStartTime = performance.now(); - - if (inertiaRef.current.animationFrame) { - cancelAnimationFrame(inertiaRef.current.animationFrame); - } - } - - // 慣性スクロールのための時間をリセット - inertiaRef.current.lastTime = performance.now(); - }, - [canvasRef, updateCurrentMousePos], - ); - - const handleTouchMove = useCallback( - (e: React.TouchEvent) => { - if (e.touches.length === 2) { - gestureRef.current.isGesture = true; - gestureRef.current.gestureType = "pinch"; - - const currentPositions = getTouchPositions(e.touches); - const currentDistance = getPinchDistance(e.touches); - - if (!gestureRef.current.lastPinchDistance) { - gestureRef.current.lastPinchDistance = currentDistance; - gestureRef.current.lastTouchPositions = currentPositions; - return; - } - - const zoomFactor = currentDistance / gestureRef.current.lastPinchDistance; - - setLimitedGridState((prev) => { - const newScale = Math.max(minZoom, Math.min(maxZoom, prev.scale * zoomFactor)); - - // Calculate the center point of the pinch gesture - const centerX = (currentPositions[0].x + currentPositions[1].x) / 2; - const centerY = (currentPositions[0].y + currentPositions[1].y) / 2; - - // Convert center point to world coordinates - const worldCenterX = prev.offsetX + centerX / prev.scale; - const worldCenterY = prev.offsetY + centerY / prev.scale; - - // Calculate new offsets to keep the center point stationary - const newOffsetX = worldCenterX - centerX / newScale; - const newOffsetY = worldCenterY - centerY / newScale; - - onPinch?.(newScale, centerX, centerY); - - return { - ...prev, - scale: newScale, - offsetX: Math.max(0, newOffsetX), - offsetY: Math.max(0, newOffsetY), - }; - }); - - gestureRef.current.lastPinchDistance = currentDistance; - gestureRef.current.lastTouchPositions = currentPositions; - } else if (e.touches.length === 1) { - if (!gestureRef.current.isGesture) { - gestureRef.current.gestureType = "swipe"; - } - - const touch = e.touches[0]; - const { x, y } = convertClientPosToCanvasPos(canvasRef, touch.clientX, touch.clientY); - - updateCurrentMousePos(x, y); - - const dx = x - touchStartPosRef.current.x; - const dy = y - touchStartPosRef.current.y; - - if (!isDraggingRef.current && (Math.abs(dx) > SWIPE_THRESHOLD || Math.abs(dy) > SWIPE_THRESHOLD)) { - isDraggingRef.current = true; - } - - if (isDraggingRef.current) { - const currentTime = performance.now(); - const deltaTime = currentTime - inertiaRef.current.lastTime; - - // deltaTimeが0の場合を防ぐ - if (deltaTime > 0) { - inertiaRef.current.speedX = (dx / deltaTime) * 15; - inertiaRef.current.speedY = (dy / deltaTime) * 15; - } - - inertiaRef.current.lastTime = currentTime; - - setLimitedGridState((prev) => ({ - ...prev, - offsetX: Math.max(0, prev.offsetX - dx / prev.scale), - offsetY: Math.max(0, prev.offsetY - dy / prev.scale), - })); - onSwipe?.(dx, dy); - touchStartPosRef.current = { x, y }; - } - } - }, - [canvasRef, minZoom, maxZoom, updateCurrentMousePos, setLimitedGridState, onPinch, onSwipe], - ); - - const handleInertia = useCallback(() => { - inertiaRef.current.animationFrame = null; - - const { speedX, speedY } = inertiaRef.current; - - if (Math.abs(speedX) > INERTIA_STOP_THRESHOLD || Math.abs(speedY) > INERTIA_STOP_THRESHOLD) { - setLimitedGridState((prev) => ({ - ...prev, - offsetX: Math.max(0, prev.offsetX - speedX / prev.scale), - offsetY: Math.max(0, prev.offsetY - speedY / prev.scale), - })); - - inertiaRef.current.speedX *= INERTIA_DAMPING; - inertiaRef.current.speedY *= INERTIA_DAMPING; - - inertiaRef.current.animationFrame = requestAnimationFrame(handleInertia); - } - }, [setLimitedGridState]); - - const handleTouchEnd = useCallback( - (e: React.TouchEvent) => { - e.preventDefault(); - e.stopPropagation(); - - const wasPinchGesture = gestureRef.current.gestureType === "pinch"; - const wasDragging = isDraggingRef.current; - - gestureRef.current.isGesture = false; - gestureRef.current.gestureType = null; - gestureRef.current.lastPinchDistance = null; - gestureRef.current.lastTouchPositions = null; - - if (wasPinchGesture) { - gestureRef.current.lastPinchEndTime = Date.now(); - } else if (wasDragging && damping) { - if (inertiaRef.current.animationFrame) { - cancelAnimationFrame(inertiaRef.current.animationFrame); - } - inertiaRef.current.animationFrame = requestAnimationFrame(handleInertia); - } else if (!wasPinchGesture && !wasDragging && e.changedTouches.length === 1) { - const currentTime = Date.now(); - if (currentTime - gestureRef.current.lastPinchEndTime > PINCH_COOLDOWN) { - const touch = e.changedTouches[0]; - const { x, y } = convertClientPosToCanvasPos(canvasRef, touch.clientX, touch.clientY); - - const worldX = gridState.offsetX + x / gridState.scale; - const worldY = gridState.offsetY + y / gridState.scale; - - const cellX = Math.floor(worldX / BASE_CELL_SIZE); - const cellY = Math.floor(worldY / BASE_CELL_SIZE); - - onTap?.(cellX, cellY); - } - } - - // reset state - isDraggingRef.current = false; - touchStartPosRef.current = { x: 0, y: 0 }; - - // reset time for inertia scroll - inertiaRef.current.lastTime = 0; - }, - [canvasRef, damping, gridState, handleInertia, onTap], - ); - - const animate = useCallback(() => { - drawGrid(); - onDrawGrid?.(); - }, [drawGrid, onDrawGrid]); - - // Effects - useEffect(() => { - const animationFrame = requestAnimationFrame(animate); - return () => { - cancelAnimationFrame(animationFrame); - }; - }, [animate]); - - useEffect(() => { - const canvas = canvasRef.current; - if (!canvas) { - console.error("Canvas not found"); - return; - } - - const gl = glRef.current; - if (!gl) { - console.error("WebGL context not found"); - return; - } - - const resizeObserver = new ResizeObserver(() => { - canvas.width = canvas.clientWidth; - canvas.height = canvas.clientHeight; - gl.viewport(0, 0, canvas.width, canvas.height); - resizeCanvasToDisplaySize(gl.canvas as HTMLCanvasElement); - animate(); - }); - - resizeObserver.observe(canvas); - - return () => { - resizeObserver.disconnect(); - }; - }, [canvasRef, glRef, animate]); - - // Prevent from browser back motion - useEffect(() => { - const canvas = canvasRef.current; - if (!canvas) return; - - canvas.addEventListener( - "wheel", - (e) => { - e.preventDefault(); - }, - { passive: false }, - ); - }, [canvasRef]); - - return ( - - ); -}; diff --git a/client/src/components/ColorPallette.tsx b/client/src/components/ColorPallette.tsx deleted file mode 100644 index d9643f5..0000000 --- a/client/src/components/ColorPallette.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { type Color } from "@/types"; -import { usePaletteColors } from "@/hooks/usePalleteColors"; -import { Palette } from "lucide-react"; -import { useState } from "react"; -import { cn } from "@/utils"; - -export const ColorPalette = ({ - selectedColor, - setSelectedColor, -}: { - selectedColor: Color; - setSelectedColor: (color: Color) => void; -}) => { - const paletteColors = usePaletteColors(); - const [isOpen, setIsOpen] = useState(false); - - return ( -
setIsOpen(true)} - > -
-
- {[...paletteColors].map((color, index) => ( -
-
- setIsOpen((prev) => !prev)} - /> -
- ); -}; diff --git a/client/src/components/ConnectButton.tsx b/client/src/components/ConnectButton.tsx deleted file mode 100644 index d864878..0000000 --- a/client/src/components/ConnectButton.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { type Connector, useConnect } from "@starknet-react/core"; -import { useCallback } from "react"; -import { toast } from "sonner"; -import { Button } from "@/components/ui/Button"; - -export const ConnectButton = () => { - const { connectAsync, connectors } = useConnect(); - - const handleConnect = useCallback( - async (connector: Connector) => { - try { - await connectAsync({ connector }); - toast.success("Successfully logged in"); - } catch (error) { - console.error(error); - toast.error("Wallet is not installed"); - } - }, - [connectAsync], - ); - - return ; -}; diff --git a/client/src/components/CoordinateFinder.tsx b/client/src/components/CoordinateFinder.tsx deleted file mode 100644 index 13af67e..0000000 --- a/client/src/components/CoordinateFinder.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { useState, useEffect } from "react"; -import { useDebouncedCallback } from "use-debounce"; - -const CoordinateFinder = ({ - currentMousePos, - animateJumpToCell, -}: { - currentMousePos: { x: number; y: number }; - animateJumpToCell: (x: number, y: number) => void; -}) => { - const [localPos, setLocalPos] = useState(currentMousePos); - - useEffect(() => { - setLocalPos(currentMousePos); - }, [currentMousePos]); - - const debouncedAnimateJumpToCell = useDebouncedCallback((x: number, y: number) => { - animateJumpToCell(x, y); - }, 180); - - const handleInputChange = (axis: "x" | "y", value: number) => { - setLocalPos((prev) => ({ ...prev, [axis]: value })); - debouncedAnimateJumpToCell(axis === "x" ? value : localPos.x, axis === "y" ? value : localPos.y); - }; - - return ( -
-
- - -
-
- ); -}; - -export { CoordinateFinder }; diff --git a/client/src/components/CreateProposalButton.tsx b/client/src/components/CreateProposalButton.tsx deleted file mode 100644 index 2b20b71..0000000 --- a/client/src/components/CreateProposalButton.tsx +++ /dev/null @@ -1,124 +0,0 @@ -import { useCallback, useMemo, useState } from "react"; -import { - Dialog, - DialogTrigger, - DialogContent, - DialogTitle, - DialogClose, - DialogDescription, -} from "@/components/ui/Dialog"; -import { Input } from "@/components/ui/Input"; -import { Button } from "@/components/ui/Button"; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/Select"; -import { ProposalType } from "@/libs/dojo/typescript/models.gen"; -import { useDojo } from "@/hooks/useDojo"; -import { DEFAULT_GAME_ID } from "@/constants"; -import { usePaletteColors } from "@/hooks/usePalleteColors"; -import { cn, formatColorToRGB, hexRGBtoNumber, rgbaToHex } from "@/utils"; - -export const CreateProposalButton = ({ className }: { className?: string }) => { - const [open, setOpen] = useState(false); - const [proposalType, setProposalType] = useState(); - const [color, setColor] = useState("#FFFFFF"); - const { - setup: { - systemCalls: { createProposal }, - account: { account }, - connectedAccount, - }, - } = useDojo(); - const paletteColors = usePaletteColors(); - const activeAccount = useMemo(() => connectedAccount || account, [connectedAccount, account]); - - const handleSubmit = useCallback(async () => { - if (!proposalType) return; - - createProposal( - activeAccount, - DEFAULT_GAME_ID, - proposalType, - hexRGBtoNumber(formatColorToRGB(color).replace("#", "")), - ); - setOpen(false); - }, [proposalType, color, activeAccount, createProposal]); - - return ( - - - - - - Create A New Proposal - - You can create a proposal to add a new color to the canvas or to reset a color to white. - -
- - {proposalType === ProposalType.AddNewColor && ( -
- -
- setColor(e.target.value)} - placeholder="#FFFFFF" - className="cursor-pointer size-10 min-w-10 min-h-10 p-0" - /> - setColor(e.target.value)} - placeholder="#FFFFFF" - className="max-w-fit" - /> -
-
- )} - {proposalType === ProposalType.ResetToWhiteByColor && ( -
- - -
- )} -
- - - - -
-
-
-
- ); -}; diff --git a/client/src/components/CustomButton/CustomButton.module.css b/client/src/components/CustomButton/CustomButton.module.css new file mode 100644 index 0000000..5151ed0 --- /dev/null +++ b/client/src/components/CustomButton/CustomButton.module.css @@ -0,0 +1,23 @@ +.customButton { + border-radius: 0.5rem; + border: none; + padding: 0.8em 0.8em; + cursor: pointer; + position: relative; + display: flex; + justify-content: center; + align-items: center; + font-size: 3rem; + width: 100%; + height: 100%; + /*outline: none;*/ +} +.selected { + outline: 2px solid chocolate; +} + +.customButton span { + position: absolute; + justify-content: center; + align-items: center; +} diff --git a/client/src/components/CustomButton/CustomButton.tsx b/client/src/components/CustomButton/CustomButton.tsx new file mode 100644 index 0000000..739d72f --- /dev/null +++ b/client/src/components/CustomButton/CustomButton.tsx @@ -0,0 +1,69 @@ +import type React from "react"; +import { useRef } from "react"; +import styles from "./CustomButton.module.css"; + +interface CustomButtonProps { + onClick: () => void; + onSecondary: () => void; + children: React.ReactNode; + className?: string; + selected: boolean; +} + +const CustomButton: React.FC = ({ + onClick, + onSecondary, + children, + className, + selected, +}) => { + const timeoutRef = useRef(null); + const touchStartTimeRef = useRef(null); + + const handleContextMenu = (event: React.MouseEvent) => { + event.preventDefault(); + onSecondary(); + }; + + const handleTouchStart = (_event: React.TouchEvent) => { + touchStartTimeRef.current = Date.now(); + const longPressDuration = 500; + timeoutRef.current = setTimeout(onSecondary, longPressDuration); + }; + + const handleTouchEnd = (_event: React.TouchEvent) => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + + if (touchStartTimeRef.current !== null) { + const touchDuration = Date.now() - touchStartTimeRef.current; + if (touchDuration < 500) { + // onClick() + } + } + }; + + const handleKeyDown = (event: React.KeyboardEvent) => { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + onClick(); + } + }; + + return ( +
+ {children} +
+ ); +}; + +export default CustomButton; diff --git a/client/src/components/FilterMenu.tsx b/client/src/components/FilterMenu.tsx deleted file mode 100644 index c2299e1..0000000 --- a/client/src/components/FilterMenu.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import React from "react"; - -interface FilterMenuProps { - statusFilter: "All" | "Active" | "Closed"; - setStatusFilter: (status: "All" | "Active" | "Closed") => void; -} - -export const FilterMenu: React.FC = ({ statusFilter, setStatusFilter }) => { - return ( -
-
Status Filter
-
- - - -
-
- ); -}; diff --git a/client/src/components/GamePage/App/App.module.css b/client/src/components/GamePage/App/App.module.css new file mode 100644 index 0000000..48ae1ea --- /dev/null +++ b/client/src/components/GamePage/App/App.module.css @@ -0,0 +1,3 @@ +.inner { + @apply text-black; +} diff --git a/client/src/components/GamePage/App/App.tsx b/client/src/components/GamePage/App/App.tsx new file mode 100644 index 0000000..98c8177 --- /dev/null +++ b/client/src/components/GamePage/App/App.tsx @@ -0,0 +1,20 @@ +import type React from "react"; + +import styles from "./App.module.css"; + +interface AppProps { + icon: string; // Unicode string for the emoji + name: string; +} + +const App: React.FC = ({ icon, name }) => { + return ( +
+

+ {icon} {name} +

+
+ ); +}; + +export default App; diff --git a/client/src/components/GamePage/AppPicker/AppPicker.module.css b/client/src/components/GamePage/AppPicker/AppPicker.module.css new file mode 100644 index 0000000..e9fe1d3 --- /dev/null +++ b/client/src/components/GamePage/AppPicker/AppPicker.module.css @@ -0,0 +1,15 @@ +.inner { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: white; + border: 1px solid #ccc; + padding: 20px; + z-index: 1000; + width: 100vw; /* Full viewport width */ + box-sizing: border-box; /* Include padding and border in element's total width and height */ +} +.selected { + background-color: lightblue; +} diff --git a/client/src/components/GamePage/AppPicker/AppPicker.tsx b/client/src/components/GamePage/AppPicker/AppPicker.tsx new file mode 100644 index 0000000..425cdcd --- /dev/null +++ b/client/src/components/GamePage/AppPicker/AppPicker.tsx @@ -0,0 +1,44 @@ +import App from "@/components/GamePage/App/App.tsx"; +import { usePixelawProvider } from "@pixelaw/react"; +import styles from "./AppPicker.module.css"; + +export interface AppPickerProps { + setSelectedApp: (appName: string) => void; + selectedApp: string; + onClose: () => void; +} + +const AppPicker: React.FC = ({ + setSelectedApp, + selectedApp, + onClose, +}) => { + const { + pixelawCore: { appStore }, + } = usePixelawProvider(); + + if (!appStore) return null; + const allApps = appStore.getAll(); + + return ( +
+ {allApps + .filter((app) => app.name !== "player" && app.name !== "paint") + .map((app) => ( + // biome-ignore lint/a11y/useKeyWithClickEvents: TODO keyboard support later +
{ + setSelectedApp(app.name); + onClose(); + }} + className={app.name === selectedApp ? styles.selected : ""} + > + +
+ ))} +
+ ); +}; + +export default AppPicker; diff --git a/client/src/components/GamePage/AppPicker/AppPickerButton.module.css b/client/src/components/GamePage/AppPicker/AppPickerButton.module.css new file mode 100644 index 0000000..df9ed1f --- /dev/null +++ b/client/src/components/GamePage/AppPicker/AppPickerButton.module.css @@ -0,0 +1,29 @@ +.inner { + position: relative; + display: inline-flex; + justify-content: center; + align-items: center; + font-size: 2.25rem; + touch-action: none; + user-select: none; +} + +.inner span { + position: absolute; + inset: 0; /* stretch to cover button */ + display: flex; + justify-content: center; + align-items: center; + touch-action: none; + user-select: none; +} + +.inner button { + all: unset; /* Remove all default styles */ + display: inline-flex; /* Adjust size to fit content */ + justify-content: center; + align-items: center; + cursor: pointer; /* Ensure it's still clickable */ + height: auto; /* Let the height be determined by content */ + width: auto; /* Let the width be determined by content */ +} diff --git a/client/src/components/GamePage/AppPicker/AppPickerButton.tsx b/client/src/components/GamePage/AppPicker/AppPickerButton.tsx new file mode 100644 index 0000000..9dff5bd --- /dev/null +++ b/client/src/components/GamePage/AppPicker/AppPickerButton.tsx @@ -0,0 +1,47 @@ +import CustomButton from "@/components/CustomButton/CustomButton.tsx"; +import type React from "react"; + +export interface AppPickerButtonProps { + onClick: () => void; + onSecondary: () => void; + appEmoji: string; + selected: boolean; +} + +const AppPickerButton: React.FC = ({ + onClick, + appEmoji, + onSecondary, + selected, +}) => { + return ( + + + ⭐ + + + {appEmoji} + + + ); +}; + +export default AppPickerButton; diff --git a/client/src/components/GamePage/ColorPicker/ColorPicker.module.css b/client/src/components/GamePage/ColorPicker/ColorPicker.module.css new file mode 100644 index 0000000..89e2c36 --- /dev/null +++ b/client/src/components/GamePage/ColorPicker/ColorPicker.module.css @@ -0,0 +1,12 @@ +.inner { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: white; + border: 1px solid #ccc; + padding: 20px; + z-index: 1000; + width: 100vw; /* Full viewport width */ + box-sizing: border-box; /* Include padding and border in element's total width and height */ +} diff --git a/client/src/components/GamePage/ColorPicker/ColorPicker.tsx b/client/src/components/GamePage/ColorPicker/ColorPicker.tsx new file mode 100644 index 0000000..324b4df --- /dev/null +++ b/client/src/components/GamePage/ColorPicker/ColorPicker.tsx @@ -0,0 +1,39 @@ +import type React from "react"; +import { useState } from "react"; + +import { hexRGBtoNumber } from "@/utils.ts"; +import Sketch from "@uiw/react-color-sketch"; + +export interface ColorPickerProps { + onColorSelect: (color: number) => void; + color: number; +} + +const ColorPicker: React.FC = ({ + onColorSelect, + // Renamed to avoid unused variable warning + color: _selectedColor, +}) => { + const [hex, setHex] = useState("#fff"); + + // Changed to _handleChange since it's currently unused + const _handleChange = (color: Record) => { + onColorSelect(Number.parseInt(color.hex.replace("#", ""), 16)); + }; + + return ( +
+ { + onColorSelect(hexRGBtoNumber(color.hex)); + setHex(color.hex); + }} + /> +
+ ); +}; + +export default ColorPicker; diff --git a/client/src/components/GamePage/ColorPicker/ColorPickerButton.tsx b/client/src/components/GamePage/ColorPicker/ColorPickerButton.tsx new file mode 100644 index 0000000..08d5535 --- /dev/null +++ b/client/src/components/GamePage/ColorPicker/ColorPickerButton.tsx @@ -0,0 +1,39 @@ +import CustomButton from "@/components/CustomButton/CustomButton.tsx"; +import { numberToHexRGB } from "@/utils.ts"; +import type React from "react"; + +export interface ColorPickerButtonProps { + onClick: () => void; + onSecondary: () => void; + color: number; + selected: boolean; +} + +const ColorPickerButton: React.FC = ({ + onClick, + onSecondary, + color, + selected, +}) => { + return ( + + + 🎨 + + + ); +}; + +export default ColorPickerButton; diff --git a/client/src/components/GamePage/ColorPicker/SimpleColorPicker.module.css b/client/src/components/GamePage/ColorPicker/SimpleColorPicker.module.css new file mode 100644 index 0000000..c7b91bc --- /dev/null +++ b/client/src/components/GamePage/ColorPicker/SimpleColorPicker.module.css @@ -0,0 +1,33 @@ +.inner { + background-color: white; + padding: 0.5rem; /* Adjusted padding */ + border-radius: 1rem; /* More rounded corners */ + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); /* Softer shadow */ + display: flex; + flex-wrap: wrap; /* Allow wrapping of buttons */ + justify-content: center; /* Center buttons horizontally */ + gap: 0.5rem; /* Gap between buttons */ +} + +button { + width: calc(2rem + 1vw); + height: calc(2rem + 1vw); + border-radius: 0.5rem; /* More rounded corners */ + transition: + transform 0.2s, + box-shadow 0.2s; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* Light shadow for buttons */ + border: 2px solid transparent; /* Default border */ +} + +.button-white { + border: 2px solid #000000; /* Black border for white button */ +} + +.button-selected { + outline: 2px solid cyan; +} + +.button-unselected { + outline: none; +} diff --git a/client/src/components/GamePage/ColorPicker/SimpleColorPicker.tsx b/client/src/components/GamePage/ColorPicker/SimpleColorPicker.tsx new file mode 100644 index 0000000..ed7c71b --- /dev/null +++ b/client/src/components/GamePage/ColorPicker/SimpleColorPicker.tsx @@ -0,0 +1,48 @@ +import { hexRGBtoNumber, numberToHexRGB } from "@/utils.ts"; +import styles from "./SimpleColorPicker.module.css"; + +const colors = [ + "#FF0000", + "#FF7F00", + "#FFFF00", + "#00FF00", + "#0000FF", + "#4B0082", + "#9400D3", + "#FFFFFF", // white + "#000000", // black +]; + +export interface ColorPickerProps { + onColorSelect: (color: number) => void; + color: number; +} + +const SimpleColorPicker: React.FC = ({ + onColorSelect, + color: selectedColor, +}) => { + const selectedColorHex = numberToHexRGB(selectedColor); + + return ( +
+ {colors.map((color) => ( +
+ ); +}; + +export default SimpleColorPicker; diff --git a/client/src/components/GamePage/WalletPicker/WalletPicker.module.css b/client/src/components/GamePage/WalletPicker/WalletPicker.module.css new file mode 100644 index 0000000..20424c9 --- /dev/null +++ b/client/src/components/GamePage/WalletPicker/WalletPicker.module.css @@ -0,0 +1,54 @@ +.inner { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: white; + border: 1px solid #ccc; + padding: 20px; + z-index: 1000; + width: 100vw; /* Full viewport width */ + box-sizing: border-box; /* Include padding and border in element's total width and height */ +} + +.list { + list-style-type: none; + padding: 0; +} + +.listItem { + padding: 10px; + cursor: pointer; + border: 1px solid #ccc; + margin-bottom: 5px; + border-radius: 4px; + transition: background-color 0.3s; +} + +.listItem:hover { + background-color: #f0f0f0; +} + +.selected { + background-color: #d0eaff; + border-color: #a0cfff; +} + +.menuButton { + width: 100%; + padding: 10px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; +} + +.selectedButton { + background-color: #007bff; + color: white; +} + +.unselectedButton { + background-color: #6c757d; + color: white; +} diff --git a/client/src/components/GamePage/WalletPicker/WalletPicker.tsx b/client/src/components/GamePage/WalletPicker/WalletPicker.tsx new file mode 100644 index 0000000..f29ccfd --- /dev/null +++ b/client/src/components/GamePage/WalletPicker/WalletPicker.tsx @@ -0,0 +1,23 @@ +import { usePixelawProvider } from "@pixelaw/react"; +import { StarknetWalletSelectorPage } from "@pixelaw/react-dojo"; + +export interface WalletPickerProps { + onClose: () => void; +} + +export const WalletPicker: React.FC = ({ onClose: _ }) => { + const { engine } = usePixelawProvider(); + + if (engine!.id === "dojo") { + return ( +
+ +
+ ); + } + return ( +
+

not implemented

+
+ ); +}; diff --git a/client/src/components/GamePage/WalletPicker/WalletPickerButton.tsx b/client/src/components/GamePage/WalletPicker/WalletPickerButton.tsx new file mode 100644 index 0000000..72bac9d --- /dev/null +++ b/client/src/components/GamePage/WalletPicker/WalletPickerButton.tsx @@ -0,0 +1,45 @@ +import CustomButton from "@/components/CustomButton/CustomButton.tsx"; +import type React from "react"; + +export interface WalletPickerButtonProps { + onClick: () => void; + onSecondary: () => void; + playerEmoji: string; + selected: boolean; +} + +const WalletPickerButton: React.FC = ({ + onClick, + onSecondary, + playerEmoji, + selected, +}) => { + return ( + + + 👤 + + + {playerEmoji} + + + ); +}; + +export default WalletPickerButton; diff --git a/client/src/components/GameTimeCounter.tsx b/client/src/components/GameTimeCounter.tsx deleted file mode 100644 index fcdf95e..0000000 --- a/client/src/components/GameTimeCounter.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { useState, useEffect } from "react"; - -export const GameTimeCounter = ({ endTime }: { endTime?: number }) => { - const [timeLeft, setTimeLeft] = useState(""); - - useEffect(() => { - const timer = setInterval(() => { - const now = new Date(); - const gameEndTime = new Date(Number(endTime) * 1000); - const difference = gameEndTime.getTime() - now.getTime(); - - if (difference > 0) { - const days = Math.floor(difference / (1000 * 60 * 60 * 24)); - const hours = Math.floor((difference / (1000 * 60 * 60)) % 24); - const minutes = Math.floor((difference / 1000 / 60) % 60); - const seconds = Math.floor((difference / 1000) % 60); - - setTimeLeft( - `${days.toString().padStart(2, "0")}:${hours.toString().padStart(2, "0")}:${minutes - .toString() - .padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`, - ); - } else { - setTimeLeft("00:00:00:00"); - clearInterval(timer); - } - }, 1000); - - return () => clearInterval(timer); - }, [endTime]); - - return ( -
-

{timeLeft}

-
- ); -}; diff --git a/client/src/components/Header.tsx b/client/src/components/Header.tsx deleted file mode 100644 index ebcf6cd..0000000 --- a/client/src/components/Header.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import Avatar from "./Avatar"; -import { cn, truncateAddress } from "@/utils"; -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/DropDownMenu"; -import { useDojo } from "@/hooks/useDojo"; -import { toast } from "sonner"; -import { ConnectButton } from "./ConnectButton"; -import { useControllerUsername } from "@/hooks/useControllerUserName"; -import { useDisconnect } from "@starknet-react/core"; -import { Button } from "./ui/Button"; -import { useMemo } from "react"; -import { GameTimeCounter } from "./GameTimeCounter"; -import { useGame } from "@/hooks/useGame"; -import { HEADER_HEIGHT } from "@/constants"; - -export const Header = () => { - const { - account: { account }, - connectedAccount, - } = useDojo(); - - const onCopy = (e: React.MouseEvent, address: string) => { - e.preventDefault(); - e.stopPropagation(); - navigator.clipboard.writeText(address); - toast.success("Copied!"); - }; - const { disconnect } = useDisconnect(); - const { username } = useControllerUsername(); - const { game } = useGame(); - - const activeAccount = useMemo(() => { - return connectedAccount || account; - }, [connectedAccount, account]); - - return ( -
-
-

- PixeLAW -

-
- - - -
-
-
onCopy(e, activeAccount.address)} - > - {username ? username : truncateAddress(activeAccount.address)} -
- - - - - - onCopy(e, activeAccount.address)}> - {username ? username : truncateAddress(activeAccount.address)} - - - {connectedAccount ? : } - - - -
-
-
- ); -}; diff --git a/client/src/components/Loading/Loading.module.css b/client/src/components/Loading/Loading.module.css new file mode 100644 index 0000000..9d0780d --- /dev/null +++ b/client/src/components/Loading/Loading.module.css @@ -0,0 +1,8 @@ +.loadingContainer { + @apply fixed inset-0 z-50 flex items-center justify-center bg-gray-800 bg-opacity-25 flex-col; + @apply text-lg font-semibold text-white; +} + +.loadingContainer div { + @apply text-lg font-semibold text-white; +} diff --git a/client/src/components/Loading/Loading.tsx b/client/src/components/Loading/Loading.tsx new file mode 100644 index 0000000..075dbf4 --- /dev/null +++ b/client/src/components/Loading/Loading.tsx @@ -0,0 +1,36 @@ +import styles from "./Loading.module.css"; + +const Loading = () => ( + <> +
+
Loading...
+
+ + Loading spinner + + + +
+
+ +); + +export default Loading; diff --git a/client/src/components/MenuBar/MenuBar.module.css b/client/src/components/MenuBar/MenuBar.module.css new file mode 100644 index 0000000..c1fdf9a --- /dev/null +++ b/client/src/components/MenuBar/MenuBar.module.css @@ -0,0 +1,85 @@ +.inner { + @apply w-full h-12 bg-header-primary flex items-center px-4; + position: relative; +} + +.logoContainer { + @apply w-[139px] h-[46px] cursor-pointer; +} + +.menuButton { + /* Add this class */ + @apply text-white bg-blue-500 hover:bg-blue-700 font-bold py-2 px-4 rounded; +} + +.rightSection { + @apply flex items-center gap-4; + position: absolute; + right: 2%; + /* transform: translateX(-50%); */ +} + +.addressContainer { + @apply flex items-center gap-2; +} + +.addressContainer { + background-color: rgba(255, 255, 255, 0.1); + border-radius: 12px; + padding: 8px 16px; + /* margin-right: 20px; */ + font-family: "Roboto Mono", monospace; + font-size: 14px; + color: #fff; + letter-spacing: 0.5px; + border: 1px solid #ffd700; + box-shadow: 0 0 10px rgba(255, 215, 0, 0.5); +} + +.countdownContainer { + font-family: "Roboto Mono", monospace; + font-size: 24px; + font-weight: bold; + color: #ffd700; + text-shadow: 0 0 10px rgba(255, 215, 0, 0.5); + position: absolute; + left: 50%; + transform: translateX(-50%); +} + +.pxChange { + position: absolute; + top: 20px; + left: 70%; + transform: translateX(-10%); + background-color: rgba(0, 0, 0, 0.8); + color: #fff; + padding: 4px 8px; + border-radius: 4px; + animation: fadeInOut 1s ease-in-out; + font-family: "Roboto Mono", monospace; + font-size: 14px; + font-weight: bold; +} + +@keyframes fadeInOut { + 0% { + opacity: 0; + transform: translate(-50%, -10px); + } + 50% { + opacity: 1; + transform: translate(-50%, 0); + } + 100% { + opacity: 0; + transform: translate(-50%, -10px); + } +} + +.zeroPx { + background-color: rgba(255, 0, 0, 0.1); + color: #ff0000; + border: 1px solid #ff0000; + box-shadow: 0 0 10px rgba(255, 0, 0, 0.5); +} diff --git a/client/src/components/MenuBar/MenuBar.tsx b/client/src/components/MenuBar/MenuBar.tsx new file mode 100644 index 0000000..7bd6f74 --- /dev/null +++ b/client/src/components/MenuBar/MenuBar.tsx @@ -0,0 +1,84 @@ +import { usePixelawProvider } from "@pixelaw/react"; +import type React from "react"; +import { useLocation, useNavigate } from "react-router-dom"; +import styles from "./MenuBar.module.css"; + +import { DojoEngine } from "@pixelaw/core-dojo"; + +const MenuBar: React.FC = () => { + const navigate = useNavigate(); + const location = useLocation(); + const { + pixelawCore: { engine }, + wallet, + world, + } = usePixelawProvider(); + // const { address } = useAccount() + // const { connectAsync, connectors } = useConnect() + const currentWallet = wallet?.id; + + if (!(engine instanceof DojoEngine)) return null; + + if (!engine.dojoSetup) return; + + // Determine if the settings page is shown based on the current path + const showSettings = location.pathname === "/settings"; + const showWorldSelector = location.pathname === "/world"; + const showWalletSelector = location.pathname === "/wallet"; + + const toggleSettings = () => { + if (showSettings) { + navigate("/"); + } else { + navigate("/settings"); // Navigate to settings if not currently showing + } + }; + + const toggleWalletSelector = () => { + if (showWalletSelector) { + navigate("/pwar"); + } else { + navigate("/wallet"); + } + }; + + const toggleWorldSelector = () => { + if (showWorldSelector) { + navigate("/"); + } else { + navigate("/world"); // Navigate to settings if not currently showing + } + }; + return ( +
+
+ logo +
+
+ + + +
+
+ ); +}; + +export default MenuBar; diff --git a/client/src/components/PixelViewer.tsx b/client/src/components/PixelViewer.tsx deleted file mode 100644 index ddc9353..0000000 --- a/client/src/components/PixelViewer.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import { startTransition, useCallback, useMemo, useRef, useState, useOptimistic } from "react"; -import { BASE_CELL_SIZE } from "@/constants/webgl"; -import { Pixel, type Color } from "@/types"; -import { useDojo } from "@/hooks/useDojo"; -import { rgbaToUint32, uint32ToRgba } from "@/utils"; -import { useSound } from "use-sound"; -import { DEFAULT_BOARD_SIZE, sounds } from "@/constants"; -import { useGridState } from "@/hooks/useGridState"; -import { useWebGL } from "@/hooks/useWebGL"; -import { CoordinateFinder } from "@/components/CoordinateFinder"; -import { ColorPalette } from "@/components/ColorPallette"; -import { CanvasGrid } from "@/components/CanvasGrid"; -import { usePaletteColors } from "@/hooks/usePalleteColors"; -import { useEntityQuery } from "@dojoengine/react"; -import { getComponentValue, Has } from "@dojoengine/recs"; -import { detectMobile } from "@/utils/devices"; -import { useHaptic } from "use-haptic"; - -export const PixelViewer: React.FC = () => { - // Refs - const canvasRef = useRef(null); - - // Other Hooks - const { - setup: { - systemCalls: { interact }, - account: { account }, - connectedAccount, - clientComponents: { Pixel }, - }, - } = useDojo(); - const { gridState, setGridState } = useGridState(); - // NOTE: On the assumption that game_id is just 1, and there are any other related pixels other than p_war in the world - const pixelEntities = useEntityQuery([Has(Pixel)]); - const paletteColors = usePaletteColors(); - const { drawPixels } = useWebGL(canvasRef, gridState); - const [play] = useSound(sounds.placeColor, { volume: 0.5 }); - const { vibe } = useHaptic(); - - // States - const isMobile = detectMobile(); - const [selectedColor, setSelectedColor] = useState(paletteColors[0]); - const [currentMousePos, setCurrentMousePos] = useState<{ x: number; y: number }>({ x: 0, y: 0 }); - const activeAccount = useMemo(() => connectedAccount || account, [connectedAccount, account]); - const visiblePixels = useMemo( - () => - pixelEntities - .map((entity) => { - const pixel = getComponentValue(Pixel, entity); - if (!pixel) return; - - return { x: pixel.x, y: pixel.y, color: uint32ToRgba(pixel.color) }; - }) - .filter((pixel) => pixel !== undefined), - [pixelEntities, Pixel], - ); - const [optimisticPixels, setOptimisticPixels] = useOptimistic(visiblePixels, (pixels, newPixel: Pixel) => { - return [...pixels, newPixel]; - }); - - // Handlers - const onCellClick = useCallback( - async (x: number, y: number) => { - startTransition(async () => { - setOptimisticPixels({ x, y, color: selectedColor }); - play(); - await interact(activeAccount, { - for_player: 0n, - for_system: 0n, - position: { x, y }, - color: rgbaToUint32(selectedColor), - }); - }); - }, - [selectedColor, activeAccount, interact, setOptimisticPixels, play], - ); - - const onTap = useCallback( - (x: number, y: number) => { - vibe(); - onCellClick(x, y); - }, - [onCellClick, vibe], - ); - - const onDrawGrid = useCallback(() => { - drawPixels(optimisticPixels); - }, [optimisticPixels, drawPixels]); - - const animateJumpToCell = useCallback( - (x: number, y: number, duration: number = 500) => { - const canvas = canvasRef.current; - if (!canvas) return; - - const canvasWidth = canvas.width; - const canvasHeight = canvas.height; - - const startTime = performance.now(); - const startOffsetX = gridState.offsetX; - const startOffsetY = gridState.offsetY; - - const targetOffsetX = Math.max(0, x * BASE_CELL_SIZE + BASE_CELL_SIZE / 2 - canvasWidth / (2 * gridState.scale)); - const targetOffsetY = Math.max(0, y * BASE_CELL_SIZE + BASE_CELL_SIZE / 2 - canvasHeight / (2 * gridState.scale)); - - const animateFrame = () => { - const elapsedTime = performance.now() - startTime; - const progress = Math.min(elapsedTime / duration, 1); - - // easing function (optional: smooth movement) - const easeProgress = 1 - Math.pow(1 - progress, 3); - - setGridState((prev) => ({ - ...prev, - offsetX: startOffsetX + (targetOffsetX - startOffsetX) * easeProgress, - offsetY: startOffsetY + (targetOffsetY - startOffsetY) * easeProgress, - })); - - if (progress < 1) { - requestAnimationFrame(animateFrame); - } else { - startTransition(() => { - setCurrentMousePos({ x, y }); - }); - } - }; - - requestAnimationFrame(animateFrame); - }, - [gridState, setGridState, setCurrentMousePos], - ); - - return ( -
- - - -
- ); -}; diff --git a/client/src/components/ProposalList/index.tsx b/client/src/components/ProposalList/index.tsx deleted file mode 100644 index 90e2af3..0000000 --- a/client/src/components/ProposalList/index.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { cn } from "@/utils"; -import { DEFAULT_GAME_ID, HEADER_HEIGHT } from "@/constants"; -import { Filter, PanelLeftClose, PanelLeftOpen } from "lucide-react"; -import { useMemo, useState } from "react"; -import { CreateProposalButton } from "@/components/CreateProposalButton"; -import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/Popover"; -import { FilterMenu } from "@/components/FilterMenu"; -import { useProposals } from "@/hooks/useProposal"; -import { ProposalItem } from "./item"; - -export const ProposalList = () => { - // Hooks - const { proposals } = useProposals(DEFAULT_GAME_ID); - - // States - const [isOpen, setIsOpen] = useState(false); - const [statusFilter, setStatusFilter] = useState<"All" | "Active" | "Closed">("All"); - const filteredProposals = useMemo(() => { - return proposals.filter((proposal) => { - if (statusFilter === "Active") { - return proposal.is_activated === true; - } else if (statusFilter === "Closed") { - return proposal.is_activated === false; - } - return true; - }); - }, [proposals, statusFilter]); - - return ( -
setIsOpen(true)} - > -
-
-
-
-

Proposal List

- - - - - - - - -
- setIsOpen((prev) => !prev)} className="cursor-pointer" /> -
- - {/* Scrollable Proposal List */} -
- {filteredProposals.map((proposal) => ( - - ))} - -
-
- - {/* Button */} - setIsOpen((prev) => !prev)} - className={cn(isOpen ? "hidden" : "flex size-full")} - /> -
-
- ); -}; diff --git a/client/src/components/ProposalList/item.tsx b/client/src/components/ProposalList/item.tsx deleted file mode 100644 index 4e18a45..0000000 --- a/client/src/components/ProposalList/item.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import { NEEDED_YES_VOTING_POWER } from "@/constants"; -import { Proposal } from "@/libs/dojo/typescript/models.gen"; -import { cn, createProposalTitle, formatTimeRemaining, formatWalletAddressWithEmoji, uint32ToHex } from "@/utils"; -import React, { useEffect, useMemo, useState } from "react"; -import { ActivateProposalButton } from "../ActivateButton"; -import { VoteButton } from "../VoteButton"; - -interface VotePercentageProps { - yes_voting_power: number; - no_voting_power: number; -} - -export const VotePercentage: React.FC = ({ yes_voting_power, no_voting_power }) => { - const total = yes_voting_power + no_voting_power; - const yesPercentage = total > 0 ? (yes_voting_power / total) * 100 : 0; - const noPercentage = total > 0 ? (no_voting_power / total) * 100 : 0; - - return ( -
-
-
-
-
-
-

For {yes_voting_power}

-

Against {no_voting_power}

-
-
- ); -}; - -interface ProposalItemProps { - proposal: Proposal; -} - -export const ProposalItem: React.FC = ({ proposal }) => { - // State - const [proposalStatus, setProposalStatus] = useState(""); - const hexColor = uint32ToHex(proposal.target_args_1); - const title = createProposalTitle(proposal.proposal_type, proposal.target_args_1, proposal.target_args_2); - const canActivateProposal = useMemo( - () => proposal.yes_voting_power >= NEEDED_YES_VOTING_POWER && proposal.yes_voting_power > proposal.no_voting_power, - [proposal], - ); - - useEffect(() => { - if (proposalStatus === "closed") return; - - const interval = setInterval(() => { - const current = Math.floor(Date.now() / 1000); - - if (current < proposal.start) { - setProposalStatus(`starts in ${formatTimeRemaining(proposal.start - current)}`); - } else if (current > proposal.start && current < proposal.end) { - setProposalStatus(`ends in ${formatTimeRemaining(proposal.end - current)}`); - } else { - setProposalStatus("closed"); - } - }, 1000); - - return () => clearInterval(interval); - }, [proposal, proposalStatus]); - - return ( -
-
-
- {title} - {hexColor &&
} -
-
- {proposalStatus} -
-
-
- proposed by {formatWalletAddressWithEmoji("0x" + proposal.author.toString(16))} -
- - - - {proposalStatus === "" ? ( - "..." - ) : proposal.is_activated ? ( - - ) : proposalStatus === "closed" ? ( - canActivateProposal ? ( - - ) : ( - - ) - ) : ( - - )} -
- ); -}; - -const getStatusColor = (status: string) => { - if (status.startsWith("ends in")) { - return "bg-green-500"; - } else if (status === "closed") { - return "bg-purple-500"; - } else { - return "bg-gray-500"; - } -}; - -// doesn't work correctly... -const getTextColor = (proposalStatus: string, proposal: Proposal) => { - if (proposalStatus === "closed" && proposal.yes_voting_power > proposal.no_voting_power) { - return "text-green-300"; - } else if (proposalStatus === "closed" && proposal.yes_voting_power <= proposal.no_voting_power) { - return "text-red-300"; - } else { - return "text-white"; - } -}; diff --git a/client/src/components/Pwar/GameControls/GameControls.module.css b/client/src/components/Pwar/GameControls/GameControls.module.css new file mode 100644 index 0000000..aa28f24 --- /dev/null +++ b/client/src/components/Pwar/GameControls/GameControls.module.css @@ -0,0 +1,63 @@ +.gameControls { + background-color: #2a2a2a; + border-radius: 8px; + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); +} + +.gameControls h3 { + margin-top: 0; + color: #eaeaea; + border-bottom: 1px solid #444; + padding-bottom: 8px; + margin-bottom: 16px; +} + +.startGameButton { + width: 100%; + padding: 12px; + background-color: #43b581; + color: white; + border: none; + border-radius: 4px; + font-size: 16px; + font-weight: 600; + cursor: pointer; + transition: background-color 0.2s; +} + +.startGameButton:hover { + background-color: #3ca374; +} + +.gameActions { + display: flex; + flex-direction: column; + gap: 12px; +} + +.actionButton { + padding: 10px 16px; + background-color: #7289da; + color: white; + border: none; + border-radius: 4px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: background-color 0.2s; + display: flex; + align-items: center; + justify-content: center; +} + +.actionButton:hover { + background-color: #5a6ebd; +} + +.actionButton:disabled { + background-color: #4d5673; + cursor: not-allowed; + opacity: 0.7; +} diff --git a/client/src/components/Pwar/GameControls/GameControls.tsx b/client/src/components/Pwar/GameControls/GameControls.tsx new file mode 100644 index 0000000..8f77843 --- /dev/null +++ b/client/src/components/Pwar/GameControls/GameControls.tsx @@ -0,0 +1,32 @@ +import type { FC } from "react"; +import styles from "./GameControls.module.css"; + +interface GameControlsProps { + onStartGame: () => void; + onPayFee: () => void; + gameStarted: boolean; +} + +export const GameControls: FC = ({ + onStartGame, + onPayFee, + gameStarted, +}) => { + return ( +
+

Game Controls

+ + {!gameStarted ? ( + + ) : ( +
+ +
+ )} +
+ ); +}; diff --git a/client/src/components/Pwar/GameStatus/GameStatusBar.module.css b/client/src/components/Pwar/GameStatus/GameStatusBar.module.css new file mode 100644 index 0000000..534e872 --- /dev/null +++ b/client/src/components/Pwar/GameStatus/GameStatusBar.module.css @@ -0,0 +1,47 @@ +.statusBar { + background-color: #202225; + color: #eaeaea; + padding: 12px 20px; + display: flex; + justify-content: space-between; + align-items: center; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + height: 60px; +} + +.statusMessage { + font-size: 16px; + font-weight: 500; + color: #dcddde; +} + +.gameInfo { + display: flex; + align-items: center; + gap: 24px; +} + +.gameIdLabel { + font-weight: 600; + font-size: 18px; + color: #00aff4; + background-color: rgba(0, 175, 244, 0.1); + padding: 4px 10px; + border-radius: 4px; +} + +.timeRemaining { + display: flex; + align-items: center; + font-size: 16px; + background-color: rgba(237, 66, 69, 0.1); + padding: 4px 10px; + border-radius: 4px; + color: #ed4245; + font-weight: 600; +} + +.timeRemaining::before { + content: "⏱️"; + margin-right: 6px; +} diff --git a/client/src/components/Pwar/GameStatus/GameStatusBar.tsx b/client/src/components/Pwar/GameStatus/GameStatusBar.tsx new file mode 100644 index 0000000..305d2c8 --- /dev/null +++ b/client/src/components/Pwar/GameStatus/GameStatusBar.tsx @@ -0,0 +1,94 @@ +import { type FC, useEffect, useState } from "react"; +import styles from "./GameStatusBar.module.css"; +import { usePwarProvider } from "@/provider/PwarContext"; +import WalletPickerButton from "@/components/GamePage/WalletPicker/WalletPickerButton.tsx"; +import { WalletPicker } from "@/components/GamePage/WalletPicker/WalletPicker"; +import { usePixelawProvider } from "@pixelaw/react"; + +interface GameStatusBarProps { + gameStarted: boolean; + gameId: number | null; +} + +export const GameStatusBar: FC = ({ + gameStarted, + gameId, +}) => { + const [timeRemaining, setTimeRemaining] = useState(null); + const { world } = usePwarProvider(); + + // Fetch game status/time remaining + useEffect(() => { + if (!gameStarted || !gameId) return; + + const fetchGameTime = async () => { + try { + // Implement according to your contract structure + console.log("Fetching game time for gameId:", gameId); + const gameData = await world.pwar_actions.getGame(gameId); + if (gameData?.end_time) { + const currentTime = Math.floor(Date.now() / 1000); + const remaining = gameData.end_time - currentTime; + setTimeRemaining(remaining > 0 ? remaining : 0); + } + } catch (error) { + console.error("Failed to fetch game time:", error); + } + }; + + fetchGameTime(); + const interval = setInterval(fetchGameTime, 10000); // Update every 10 seconds + + return () => clearInterval(interval); + }, [gameId, gameStarted, world]); + + const formatTime = (seconds: number): string => { + const mins = Math.floor(seconds / 60); + const secs = seconds % 60; + return `${mins}:${secs.toString().padStart(2, "0")}`; + }; + + const playerIcon = "⭐"; + const [activeChooser, setActiveChooser] = useState<"wallet" | null>(null); + const { app, setApp } = usePixelawProvider(); + + const handleWalletPickerClick = () => { + if (app === "player") { + setActiveChooser((prev) => (prev === "wallet" ? null : "wallet")); + } else { + setApp("player"); + } + }; + + const handleWalletPickerSecondaryClick = () => { + setActiveChooser((prev) => (prev === "wallet" ? null : "wallet")); + }; + + return ( +
+ {!gameStarted ? ( +
+ No active game. Start a new game to play! +
+ ) : ( +
+
Game #{gameId}
+ {timeRemaining !== null && ( +
+ Time Remaining: {formatTime(timeRemaining)} +
+ )} +
+ )} + + {activeChooser === "wallet" && ( + setActiveChooser(null)} /> + )} +
+ ); +}; diff --git a/client/src/components/Pwar/Guild/GuildPanel.module.css b/client/src/components/Pwar/Guild/GuildPanel.module.css new file mode 100644 index 0000000..5644967 --- /dev/null +++ b/client/src/components/Pwar/Guild/GuildPanel.module.css @@ -0,0 +1,107 @@ +.guildPanel { + background-color: #2a2a2a; + border-radius: 8px; + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); +} + +.guildPanel h3 { + margin-top: 0; + color: #eaeaea; + border-bottom: 1px solid #444; + padding-bottom: 8px; + margin-bottom: 16px; +} + +.guildPanel h4 { + color: #d0d0d0; + margin-top: 16px; + margin-bottom: 8px; +} + +.createGuild { + display: flex; + gap: 8px; + margin-bottom: 16px; +} + +.guildNameInput { + flex: 1; + padding: 8px 12px; + background-color: #3a3a3a; + border: 1px solid #555; + border-radius: 4px; + color: #eaeaea; + font-size: 14px; +} + +.guildNameInput:focus { + outline: none; + border-color: #7289da; +} + +.createButton { + padding: 8px 16px; + background-color: #7289da; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-weight: 500; + transition: background-color 0.2s; +} + +.createButton:hover { + background-color: #5a6ebd; +} + +.guildList { + margin-top: 16px; +} + +.guildList ul { + list-style: none; + padding: 0; + margin: 0; +} + +.guildItem { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px; + background-color: #3a3a3a; + border-radius: 4px; + margin-bottom: 8px; +} + +.guildItem span { + color: #eaeaea; + font-weight: 500; +} + +.guildItem button { + padding: 6px 12px; + background-color: #7289da; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 12px; + transition: background-color 0.2s; +} + +.guildItem button:hover { + background-color: #5a6ebd; +} + +.guildItem button:disabled { + background-color: #43b581; + cursor: default; +} + +.selected { + border-left: 4px solid #43b581; + background-color: #333333; +} diff --git a/client/src/components/Pwar/Guild/GuildPanel.tsx b/client/src/components/Pwar/Guild/GuildPanel.tsx new file mode 100644 index 0000000..005bed8 --- /dev/null +++ b/client/src/components/Pwar/Guild/GuildPanel.tsx @@ -0,0 +1,114 @@ +import { type FC, useState, useEffect } from "react"; +import styles from "./GuildPanel.module.css"; +import { usePwarProvider } from "@/provider/PwarContext"; + +interface GuildPanelProps { + gameId: number | null; + selectedGuildId: number | null; + onJoinGuild: (guildId: number) => void; + onCreateGuild: (guildName: string) => void; +} + +export const GuildPanel: FC = ({ + gameId, + selectedGuildId, + onJoinGuild, + onCreateGuild, +}) => { + const [guilds, setGuilds] = useState>([]); + const [guildName, setGuildName] = useState(""); + const { world } = usePwarProvider(); + + // Fetch guilds when gameId changes + useEffect(() => { + const fetchGuilds = async () => { + if (!gameId) return; + + try { + const fetchedGame = await world.pwar_actions.getGame(gameId); + console.log("Fetched game data: world.pwar_actions.getGame", fetchedGame); + if (fetchedGame?.guild_ids) { + const guildPromises = fetchedGame.guild_ids.map( + async (guildId: number) => { + const guildData = await world.guild_actions.getGuild( + gameId, + guildId, + ); + return { + id: guildId, + name: guildData.guild_name, + }; + }, + ); + + const guildResults = await Promise.all(guildPromises); + setGuilds(guildResults); + } + } catch (error) { + console.error("Failed to fetch guilds:", error); + } + }; + + fetchGuilds(); + }, [gameId, world]); + + const handleCreateGuild = () => { + if (guildName.trim()) { + onCreateGuild(guildName.trim()); + setGuildName(""); + } + }; + + if (!gameId) { + return ( +
+

Guild Panel

+

Start a game to manage guilds

+
+ ); + } + + return ( +
+

Guild Panel

+ +
+ setGuildName(e.target.value)} + className={styles.guildNameInput} + /> + +
+ +
+

Available Guilds

+ {guilds.length === 0 ? ( +

No guilds available yet

+ ) : ( +
    + {guilds.map((guild) => ( +
  • + {guild.name} + +
  • + ))} +
+ )} +
+
+ ); +}; diff --git a/client/src/components/Pwar/Proposal/ProposalItem.tsx b/client/src/components/Pwar/Proposal/ProposalItem.tsx new file mode 100644 index 0000000..a3e6203 --- /dev/null +++ b/client/src/components/Pwar/Proposal/ProposalItem.tsx @@ -0,0 +1,67 @@ +import type React from "react"; + +interface Proposal { + id: number; + title: string; + author: string; + yesVotes: number; + noVotes: number; + isActive: boolean; +} + +interface ProposalItemProps { + proposal: Proposal; +} + +export const ProposalItem: React.FC = ({ proposal }) => { + const totalVotes = proposal.yesVotes + proposal.noVotes; + const yesPercentage = + totalVotes > 0 ? (proposal.yesVotes / totalVotes) * 100 : 0; + const noPercentage = + totalVotes > 0 ? (proposal.noVotes / totalVotes) * 100 : 0; + + return ( +
+
+

{proposal.title}

+ by {proposal.author} +
+ + {/* Vote Progress Bar */} +
+
+
+
+
+
+ Yes: {proposal.yesVotes} + No: {proposal.noVotes} +
+
+ + {/* Action Buttons */} +
+ + +
+
+ ); +}; diff --git a/client/src/components/Pwar/Proposal/ProposalList.tsx b/client/src/components/Pwar/Proposal/ProposalList.tsx new file mode 100644 index 0000000..baa9a1a --- /dev/null +++ b/client/src/components/Pwar/Proposal/ProposalList.tsx @@ -0,0 +1,80 @@ +import { useState } from "react"; +import { ProposalItem } from "./ProposalItem"; + +// Simplified Proposal type +interface Proposal { + id: number; + title: string; + author: string; + yesVotes: number; + noVotes: number; + isActive: boolean; +} + +// Dummy data +const initialProposals: Proposal[] = [ + { + id: 1, + title: "Paint pixels red", + author: "0x123", + yesVotes: 10, + noVotes: 5, + isActive: true, + }, + { + id: 2, + title: "Paint pixels blue", + author: "0x456", + yesVotes: 7, + noVotes: 8, + isActive: true, + }, +]; + +export const ProposalList = () => { + const [proposals, setProposals] = useState(initialProposals); + const [newProposal, setNewProposal] = useState(""); + + const handleAddProposal = () => { + if (!newProposal.trim()) return; + + const proposal: Proposal = { + id: proposals.length + 1, + title: newProposal, + author: `0x${Math.floor(Math.random() * 1000).toString(16)}`, + yesVotes: 0, + noVotes: 0, + isActive: true, + }; + + setProposals([...proposals, proposal]); + setNewProposal(""); + }; + + return ( +
+
+ setNewProposal(e.target.value)} + placeholder="Enter proposal title" + className="flex-1 p-2 rounded bg-gray-700 text-white" + /> + +
+ +
+ {proposals.map((proposal) => ( + + ))} +
+
+ ); +}; diff --git a/client/src/components/Pwar/Stats/StatsDashboard.module.css b/client/src/components/Pwar/Stats/StatsDashboard.module.css new file mode 100644 index 0000000..bf3f12e --- /dev/null +++ b/client/src/components/Pwar/Stats/StatsDashboard.module.css @@ -0,0 +1,78 @@ +.statsDashboard { + background-color: #2a2a2a; + border-radius: 8px; + padding: 16px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); +} + +.statsDashboard h3 { + margin-top: 0; + color: #eaeaea; + border-bottom: 1px solid #444; + padding-bottom: 8px; + margin-bottom: 16px; +} + +.statsSection { + display: flex; + flex-direction: column; + gap: 10px; +} + +.statRow { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 0; +} + +.statLabel { + color: #b9bbbe; + font-size: 14px; +} + +.statValue { + color: #ffffff; + font-family: monospace; + background-color: #3a3a3a; + padding: 4px 8px; + border-radius: 4px; + font-size: 14px; +} + +/* Highlight values with specific styling */ +.commitValue { + color: #43b581; + background-color: rgba(67, 181, 129, 0.1); + font-weight: bold; +} + +.ownsValue { + color: #faa61a; + background-color: rgba(250, 166, 26, 0.1); + font-weight: bold; +} + +/* Refresh button styling */ +.refreshButton { + margin-top: 12px; + padding: 8px 16px; + background-color: #4f545c; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 14px; + transition: background-color 0.2s; + align-self: center; +} + +.refreshButton:hover { + background-color: #5d6269; +} + +.refreshButton:disabled { + background-color: #36393f; + cursor: not-allowed; + opacity: 0.7; +} diff --git a/client/src/components/Pwar/Stats/StatsDashboard.tsx b/client/src/components/Pwar/Stats/StatsDashboard.tsx new file mode 100644 index 0000000..3df83e0 --- /dev/null +++ b/client/src/components/Pwar/Stats/StatsDashboard.tsx @@ -0,0 +1,121 @@ +import { useState, useEffect, useCallback } from "react"; +import { usePixelawProvider } from "@pixelaw/react"; +import { usePwarProvider } from "@/provider/PwarContext"; +import styles from "./StatsDashboard.module.css"; + +export const StatsDashboard = () => { + const { pixelawCore } = usePixelawProvider(); + const { wallet, world, account } = usePwarProvider(); + const [_clickCount, setClickCount] = useState(0); + const [pixelsPlaced, setPixelsPlaced] = useState(0); + const [playerCommit, setPlayerCommit] = useState(null); + const [playerOwns, setPlayerOwns] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + // Track clicks + const handleCellClick = useCallback(() => { + setClickCount((prev) => prev + 1); + }, []); + + // Simulate successful pixel placement + const incrementPixelsPlaced = useCallback(() => { + setTimeout(() => { + if (Math.random() > 0.3) { + setPixelsPlaced((prev) => prev + 1); + } + }, 500); + }, []); + + // Fetch player data from the contract + const fetchPlayerData = useCallback(async () => { + if (!account || !world) return; + console.log(wallet.address); + + setIsLoading(true); + try { + // Get player commit data + const commitResponse = await world.guild_actions.getPlayerCommit(wallet.address); + + // Get player owns data + const ownsResponse = await world.guild_actions.getPlayerOwns(wallet.address); + + console.log("commitResponse", commitResponse); + console.log("ownsResponse", ownsResponse); + // Update state with fetched data + setPlayerCommit(Number(commitResponse)); + setPlayerOwns(Number(ownsResponse)); + } catch (error) { + console.error("Failed to fetch player stats:", error); + } finally { + setIsLoading(false); + } + }, [account, world, wallet.address]); + + // Set up click listener + useEffect(() => { + pixelawCore.events.on("cellClicked", handleCellClick); + pixelawCore.events.on("cellClicked", incrementPixelsPlaced); + + return () => { + pixelawCore.events.off("cellClicked", handleCellClick); + pixelawCore.events.off("cellClicked", incrementPixelsPlaced); + }; + }, [pixelawCore, handleCellClick, incrementPixelsPlaced]); + + // Fetch player data on component mount and when wallet changes + useEffect(() => { + if (wallet && world) { + fetchPlayerData(); + + // Set up periodic refresh (every 30 seconds) + const intervalId = setInterval(fetchPlayerData, 30000); + + return () => clearInterval(intervalId); + } + }, [wallet, world, fetchPlayerData]); + + return ( +
+

Player Stats

+ +
+
+ Address: + + {wallet + ? `${wallet.address.slice(0, 6)}...${wallet.address.slice(-4)}` + : "Not connected"} + +
+ +
+ Pixels Placed: + {pixelsPlaced} +
+ +
+ Pixels Committed: + + {isLoading ? "..." : playerCommit !== null ? playerCommit : "N/A"} + +
+ +
+ Pixels Owned: + + {isLoading ? "..." : playerOwns !== null ? playerOwns : "N/A"} + +
+ + +
+
+ ); +}; diff --git a/client/src/components/Avatar/emojiAvatarForAddress.ts b/client/src/components/Pwar/utils/EmojiAvatar.ts similarity index 95% rename from client/src/components/Avatar/emojiAvatarForAddress.ts rename to client/src/components/Pwar/utils/EmojiAvatar.ts index 16db28a..fd27daf 100644 --- a/client/src/components/Avatar/emojiAvatarForAddress.ts +++ b/client/src/components/Pwar/utils/EmojiAvatar.ts @@ -75,6 +75,8 @@ function hashCode(text: string) { export function emojiAvatarForAddress(address: string) { const resolvedAddress = typeof address === "string" ? address : ""; - const avatarIndex = Math.abs(hashCode(resolvedAddress.toLowerCase()) % avatars.length); + const avatarIndex = Math.abs( + hashCode(resolvedAddress.toLowerCase()) % avatars.length, + ); return avatars[avatarIndex ?? 0]; } diff --git a/client/src/components/Pwar/utils/utils.tsx b/client/src/components/Pwar/utils/utils.tsx new file mode 100644 index 0000000..471e114 --- /dev/null +++ b/client/src/components/Pwar/utils/utils.tsx @@ -0,0 +1,41 @@ +import { emojiAvatarForAddress } from "./EmojiAvatar"; + +export const uint32ToHex = (uint32: number) => { + const color = uint32 >>> 8; + return `#${color.toString(16).padStart(6, "0")}`; +}; + +export const formatTimeRemainingForTitle = ( + remainingSeconds: number, +): string => { + const days = Math.floor(remainingSeconds / 86400); + let seconds = remainingSeconds % 86400; + const hours = Math.floor(seconds / 3600); + seconds %= 3600; + const minutes = Math.floor(seconds / 60); + const secs = seconds % 60; + + let formattedTime = ""; + if (days > 0) { + formattedTime += `${days}D`; + } + if (hours > 0) { + formattedTime += ` ${hours}H`; + } + if (minutes > 0) { + formattedTime += ` ${minutes}M`; + } + if (secs > 0) { + formattedTime += ` ${secs}S`; + } + + return formattedTime || "0S"; +}; + +export const formatWalletAddressWithEmoji = (address: string) => { + const avatar = emojiAvatarForAddress(address); + if (address.length > 10) { + return `${avatar.emoji} ${address.slice(0, 4)}...${address.slice(-4)}`; + } + return `${avatar.emoji} ${address}`; +}; diff --git a/client/src/components/SwipeControl.tsx b/client/src/components/SwipeControl.tsx deleted file mode 100644 index 183bc8f..0000000 --- a/client/src/components/SwipeControl.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { detectMobile } from "@/utils/devices"; -import { useEffect, useLayoutEffect } from "react"; -import { useSwipeable } from "react-swipeable"; - -const SwipeControl = ({ children }: { children: React.ReactNode }) => { - const isMobile = detectMobile(); - - useLayoutEffect(() => { - // add dummy entry to browser history - window.history.pushState(null, "", window.location.pathname); - - // add listener for popstate event - const handlePopState = (e: PopStateEvent) => { - e.stopImmediatePropagation(); - // prevent browser back motion - window.history.pushState(null, "", window.location.pathname); - }; - - window.addEventListener("popstate", handlePopState); - - // remove listener when component unmounts - return () => { - window.removeEventListener("popstate", handlePopState); - }; - }, []); - - useEffect(() => { - if (!isMobile) return; - // NOTE: improve mobile scroll experience - window.addEventListener( - "wheel", - (e) => { - e.preventDefault(); - }, - { passive: false }, - ); - }, [isMobile]); - - const handlers = useSwipeable({ - preventScrollOnSwipe: true, - trackMouse: true, - }); - - return
{children}
; -}; - -export default SwipeControl; diff --git a/client/src/components/ThemeProvider.tsx b/client/src/components/ThemeProvider.tsx deleted file mode 100644 index 4d676bd..0000000 --- a/client/src/components/ThemeProvider.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { createContext, useContext, useEffect, useState } from "react"; - -type Theme = "dark" | "light" | "system"; - -type ThemeProviderProps = { - children: React.ReactNode; - defaultTheme?: Theme; - storageKey?: string; -}; - -type ThemeProviderState = { - theme: Theme; - setTheme: (theme: Theme) => void; -}; - -const initialState: ThemeProviderState = { - theme: "system", - setTheme: () => null, -}; - -const ThemeProviderContext = createContext(initialState); - -export function ThemeProvider({ - children, - defaultTheme = "system", - storageKey = "vite-ui-theme", - ...props -}: ThemeProviderProps) { - const [theme, setTheme] = useState(() => (localStorage.getItem(storageKey) as Theme) || defaultTheme); - - useEffect(() => { - const root = window.document.documentElement; - - root.classList.remove("light", "dark"); - - if (theme === "system") { - const systemTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; - - root.classList.add(systemTheme); - return; - } - - root.classList.add(theme); - }, [theme]); - - const value = { - theme, - setTheme: (theme: Theme) => { - localStorage.setItem(storageKey, theme); - setTheme(theme); - }, - }; - - return ( - - {children} - - ); -} - -export const useTheme = () => { - const context = useContext(ThemeProviderContext); - - if (context === undefined) throw new Error("useTheme must be used within a ThemeProvider"); - - return context; -}; diff --git a/client/src/components/VoteButton.tsx b/client/src/components/VoteButton.tsx deleted file mode 100644 index 754cfb6..0000000 --- a/client/src/components/VoteButton.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { DEFAULT_GAME_ID } from "@/constants"; -import { useDojo } from "@/hooks/useDojo"; -import { Proposal } from "@/libs/dojo/typescript/models.gen"; -import { Dialog, DialogContent, DialogTrigger, DialogTitle, DialogDescription } from "@/components/ui/Dialog"; -import { useCallback, useMemo, useState } from "react"; - -interface VoteButtonProps { - proposal: Proposal; - title: string; -} - -export const VoteButton: React.FC = ({ proposal, title }) => { - // Hooks - const { - setup: { - systemCalls: { vote }, - }, - account: { account }, - connectedAccount, - } = useDojo(); - - // State - const activeAccount = useMemo(() => connectedAccount || account, [connectedAccount, account]); - const [isVoting, setIsVoting] = useState(false); - const [voteType, setVoteType] = useState<"for" | "against">("for"); - // const [votePoints, setVotePoints] = useState(1); - const [isOpen, setIsOpen] = useState(false); - - // Handlers - const handleVote = useCallback(async () => { - setIsVoting(true); - try { - vote(activeAccount, DEFAULT_GAME_ID, proposal.index, voteType === "for"); - // Add any success handling here - } catch (error) { - // Handle error - console.error(error); - } finally { - setIsVoting(false); - setIsOpen(false); - } - }, [activeAccount, proposal.index, voteType, vote]); - - // const handleVotePointsChange = useCallback((e: React.ChangeEvent) => { - // setVotePoints(Number(e.target.value)); - // }, []); - - return ( - - - Vote - - -
-
- -

{title}

- {title && ( -
- )} - - - - - - -
- -
-
- - -
-
-
- -
- ); -}; - -// Helper function to extract hex color from title -const extractHexColor = (text: string): string | null => { - const hexColorRegex = /#([0-9A-F]{3}){1,2}/i; - const match = text.match(hexColorRegex); - return match ? match[0] : null; -}; diff --git a/client/src/components/ui/Button.tsx b/client/src/components/ui/Button.tsx deleted file mode 100644 index 0e5200a..0000000 --- a/client/src/components/ui/Button.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import * as React from "react"; -import { Slot } from "@radix-ui/react-slot"; -import { cva, type VariantProps } from "class-variance-authority"; - -import { cn } from "@/utils/index"; - -const buttonVariants = cva( - "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", - { - variants: { - variant: { - default: "bg-primary text-primary-foreground hover:bg-primary/90", - destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", - outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground", - secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", - ghost: "hover:bg-accent hover:text-accent-foreground", - link: "text-primary underline-offset-4 hover:underline", - }, - size: { - default: "h-10 px-4 py-2", - sm: "h-9 rounded-md px-3", - lg: "h-11 rounded-md px-8", - icon: "h-10 w-10", - }, - }, - defaultVariants: { - variant: "default", - size: "default", - }, - }, -); - -export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean; -} - -const Button = React.forwardRef( - ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : "button"; - return ; - }, -); -Button.displayName = "Button"; - -export { Button, buttonVariants }; diff --git a/client/src/components/ui/Dialog.tsx b/client/src/components/ui/Dialog.tsx deleted file mode 100644 index 1abd251..0000000 --- a/client/src/components/ui/Dialog.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import * as React from "react"; -import * as DialogPrimitive from "@radix-ui/react-dialog"; -import { X } from "lucide-react"; - -import { cn } from "@/utils/index"; - -const Dialog = DialogPrimitive.Root; - -const DialogTrigger = DialogPrimitive.Trigger; - -const DialogPortal = DialogPrimitive.Portal; - -const DialogClose = DialogPrimitive.Close; - -const DialogOverlay = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; - -const DialogContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { isOverlay?: boolean } ->(({ className, children, isOverlay, ...props }, ref) => ( - - {isOverlay ? : null} - - {children} - - - Close - - - -)); -DialogContent.displayName = DialogPrimitive.Content.displayName; - -const DialogHeader = ({ className, ...props }: React.HTMLAttributes) => ( -
-); -DialogHeader.displayName = "DialogHeader"; - -const DialogFooter = ({ className, ...props }: React.HTMLAttributes) => ( -
-); -DialogFooter.displayName = "DialogFooter"; - -const DialogTitle = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -DialogTitle.displayName = DialogPrimitive.Title.displayName; - -const DialogDescription = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -DialogDescription.displayName = DialogPrimitive.Description.displayName; - -export { - Dialog, - DialogPortal, - DialogOverlay, - DialogClose, - DialogTrigger, - DialogContent, - DialogHeader, - DialogFooter, - DialogTitle, - DialogDescription, -}; diff --git a/client/src/components/ui/DropDownMenu.tsx b/client/src/components/ui/DropDownMenu.tsx deleted file mode 100644 index 6ce4dbe..0000000 --- a/client/src/components/ui/DropDownMenu.tsx +++ /dev/null @@ -1,179 +0,0 @@ -import * as React from "react"; -import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; -import { Check, ChevronRight, Circle } from "lucide-react"; - -import { cn } from "@/utils/index"; - -const DropdownMenu = DropdownMenuPrimitive.Root; - -const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; - -const DropdownMenuGroup = DropdownMenuPrimitive.Group; - -const DropdownMenuPortal = DropdownMenuPrimitive.Portal; - -const DropdownMenuSub = DropdownMenuPrimitive.Sub; - -const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; - -const DropdownMenuSubTrigger = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean; - } ->(({ className, inset, children, ...props }, ref) => ( - - {children} - - -)); -DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName; - -const DropdownMenuSubContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName; - -const DropdownMenuContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, sideOffset = 4, ...props }, ref) => ( - - - -)); -DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; - -const DropdownMenuItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean; - } ->(({ className, inset, ...props }, ref) => ( - -)); -DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; - -const DropdownMenuCheckboxItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, checked, ...props }, ref) => ( - - - - - - - {children} - -)); -DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName; - -const DropdownMenuRadioItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - - - - - - {children} - -)); -DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; - -const DropdownMenuLabel = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean; - } ->(({ className, inset, ...props }, ref) => ( - -)); -DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; - -const DropdownMenuSeparator = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; - -const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes) => { - return ; -}; -DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; - -export { - DropdownMenu, - DropdownMenuTrigger, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuCheckboxItem, - DropdownMenuRadioItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuShortcut, - DropdownMenuGroup, - DropdownMenuPortal, - DropdownMenuSub, - DropdownMenuSubContent, - DropdownMenuSubTrigger, - DropdownMenuRadioGroup, -}; diff --git a/client/src/components/ui/Input.tsx b/client/src/components/ui/Input.tsx deleted file mode 100644 index 7f46f4c..0000000 --- a/client/src/components/ui/Input.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import * as React from "react"; - -import { cn } from "@/utils/index"; - -const Input = React.forwardRef>( - ({ className, type, ...props }, ref) => { - return ( - - ); - }, -); -Input.displayName = "Input"; - -export { Input }; diff --git a/client/src/components/ui/Popover.tsx b/client/src/components/ui/Popover.tsx deleted file mode 100644 index 3f4d9c7..0000000 --- a/client/src/components/ui/Popover.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as PopoverPrimitive from "@radix-ui/react-popover"; - -import { cn } from "@/utils/index"; - -const Popover = PopoverPrimitive.Root; - -const PopoverTrigger = PopoverPrimitive.Trigger; - -const PopoverContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( - - - -)); -PopoverContent.displayName = PopoverPrimitive.Content.displayName; - -export { Popover, PopoverTrigger, PopoverContent }; diff --git a/client/src/components/ui/Select.tsx b/client/src/components/ui/Select.tsx deleted file mode 100644 index 5a4e0bb..0000000 --- a/client/src/components/ui/Select.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import * as React from "react"; -import * as SelectPrimitive from "@radix-ui/react-select"; -import { Check, ChevronDown, ChevronUp } from "lucide-react"; - -import { cn } from "@/utils/index"; - -const Select = SelectPrimitive.Root; - -const SelectGroup = SelectPrimitive.Group; - -const SelectValue = SelectPrimitive.Value; - -const SelectTrigger = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - span]:line-clamp-1", - className, - )} - {...props} - > - {children} - - - - -)); -SelectTrigger.displayName = SelectPrimitive.Trigger.displayName; - -const SelectScrollUpButton = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - -)); -SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName; - -const SelectScrollDownButton = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - -)); -SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName; - -const SelectContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, position = "popper", ...props }, ref) => ( - - - - - {children} - - - - -)); -SelectContent.displayName = SelectPrimitive.Content.displayName; - -const SelectLabel = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -SelectLabel.displayName = SelectPrimitive.Label.displayName; - -const SelectItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - - - - - - - {children} - -)); -SelectItem.displayName = SelectPrimitive.Item.displayName; - -const SelectSeparator = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -SelectSeparator.displayName = SelectPrimitive.Separator.displayName; - -export { - Select, - SelectGroup, - SelectValue, - SelectTrigger, - SelectContent, - SelectLabel, - SelectItem, - SelectSeparator, - SelectScrollUpButton, - SelectScrollDownButton, -}; diff --git a/client/src/components/ui/Skelton.tsx b/client/src/components/ui/Skelton.tsx deleted file mode 100644 index ca717c6..0000000 --- a/client/src/components/ui/Skelton.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { cn } from "@/utils/index"; - -function Skeleton({ className, ...props }: React.HTMLAttributes) { - return
; -} - -export { Skeleton }; diff --git a/client/src/components/ui/Sonner.tsx b/client/src/components/ui/Sonner.tsx deleted file mode 100644 index 5add2ce..0000000 --- a/client/src/components/ui/Sonner.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { useTheme } from "next-themes"; -import { Toaster as Sonner } from "sonner"; - -type ToasterProps = React.ComponentProps; - -const Toaster = ({ ...props }: ToasterProps) => { - const { theme = "system" } = useTheme(); - - return ( - - ); -}; - -export { Toaster }; diff --git a/client/src/components/ui/ToolTip.tsx b/client/src/components/ui/ToolTip.tsx deleted file mode 100644 index 4bc01b8..0000000 --- a/client/src/components/ui/ToolTip.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import * as React from "react"; -import * as TooltipPrimitive from "@radix-ui/react-tooltip"; - -import { cn } from "@/utils/index"; - -const TooltipProvider = TooltipPrimitive.Provider; - -const Tooltip = TooltipPrimitive.Root; - -const TooltipTrigger = TooltipPrimitive.Trigger; - -const TooltipContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, sideOffset = 4, ...props }, ref) => ( - -)); -TooltipContent.displayName = TooltipPrimitive.Content.displayName; - -export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }; diff --git a/client/src/config/contracts.gen.ts b/client/src/config/contracts.gen.ts new file mode 100644 index 0000000..fa2c7c1 --- /dev/null +++ b/client/src/config/contracts.gen.ts @@ -0,0 +1,706 @@ +import { DojoProvider, DojoCall } from "@dojoengine/core"; +import { Account, AccountInterface, BigNumberish, CairoOption, CairoCustomEnum, ByteArray } from "starknet"; +import * as models from "./models.gen"; + +export function setupWorld(provider: DojoProvider) { + + const build_actions_addArea_calldata = (bounds: models.Bounds, owner: string, color: BigNumberish, app: string): DojoCall => { + return { + contractName: "actions", + entrypoint: "add_area", + calldata: [bounds, owner, color, app], + }; + }; + + const actions_addArea = async (snAccount: Account | AccountInterface, bounds: models.Bounds, owner: string, color: BigNumberish, app: string) => { + try { + return await provider.execute( + snAccount, + build_actions_addArea_calldata(bounds, owner, color, app), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_canUpdatePixel_calldata = (forPlayer: string, forSystem: string, pixel: models.Pixel, pixelUpdate: models.PixelUpdate, areaIdHint: CairoOption, allowModify: boolean): DojoCall => { + return { + contractName: "actions", + entrypoint: "can_update_pixel", + calldata: [forPlayer, forSystem, pixel, pixelUpdate, areaIdHint, allowModify], + }; + }; + + const actions_canUpdatePixel = async (snAccount: Account | AccountInterface, forPlayer: string, forSystem: string, pixel: models.Pixel, pixelUpdate: models.PixelUpdate, areaIdHint: CairoOption, allowModify: boolean) => { + try { + return await provider.execute( + snAccount, + build_actions_canUpdatePixel_calldata(forPlayer, forSystem, pixel, pixelUpdate, areaIdHint, allowModify), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_findAreaByPosition_calldata = (position: models.Position): DojoCall => { + return { + contractName: "actions", + entrypoint: "find_area_by_position", + calldata: [position], + }; + }; + + const actions_findAreaByPosition = async (snAccount: Account | AccountInterface, position: models.Position) => { + try { + return await provider.execute( + snAccount, + build_actions_findAreaByPosition_calldata(position), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_findAreasInsideBounds_calldata = (bounds: models.Bounds): DojoCall => { + return { + contractName: "actions", + entrypoint: "find_areas_inside_bounds", + calldata: [bounds], + }; + }; + + const actions_findAreasInsideBounds = async (snAccount: Account | AccountInterface, bounds: models.Bounds) => { + try { + return await provider.execute( + snAccount, + build_actions_findAreasInsideBounds_calldata(bounds), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_newApp_calldata = (system: string, name: BigNumberish, icon: BigNumberish): DojoCall => { + return { + contractName: "actions", + entrypoint: "new_app", + calldata: [system, name, icon], + }; + }; + + const actions_newApp = async (snAccount: Account | AccountInterface, system: string, name: BigNumberish, icon: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_actions_newApp_calldata(system, name, icon), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_notification_calldata = (position: models.Position, color: BigNumberish, from: CairoOption, to: CairoOption, text: BigNumberish): DojoCall => { + return { + contractName: "actions", + entrypoint: "notification", + calldata: [position, color, from, to, text], + }; + }; + + const actions_notification = async (snAccount: Account | AccountInterface, position: models.Position, color: BigNumberish, from: CairoOption, to: CairoOption, text: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_actions_notification_calldata(position, color, from, to, text), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_processQueue_calldata = (id: BigNumberish, timestamp: BigNumberish, calledSystem: string, selector: BigNumberish, calldata: Array): DojoCall => { + return { + contractName: "actions", + entrypoint: "process_queue", + calldata: [id, timestamp, calledSystem, selector, calldata], + }; + }; + + const actions_processQueue = async (snAccount: Account | AccountInterface, id: BigNumberish, timestamp: BigNumberish, calledSystem: string, selector: BigNumberish, calldata: Array) => { + try { + return await provider.execute( + snAccount, + build_actions_processQueue_calldata(id, timestamp, calledSystem, selector, calldata), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_removeArea_calldata = (areaId: BigNumberish): DojoCall => { + return { + contractName: "actions", + entrypoint: "remove_area", + calldata: [areaId], + }; + }; + + const actions_removeArea = async (snAccount: Account | AccountInterface, areaId: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_actions_removeArea_calldata(areaId), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_scheduleQueue_calldata = (timestamp: BigNumberish, calledSystem: string, selector: BigNumberish, calldata: Array): DojoCall => { + return { + contractName: "actions", + entrypoint: "schedule_queue", + calldata: [timestamp, calledSystem, selector, calldata], + }; + }; + + const actions_scheduleQueue = async (snAccount: Account | AccountInterface, timestamp: BigNumberish, calledSystem: string, selector: BigNumberish, calldata: Array) => { + try { + return await provider.execute( + snAccount, + build_actions_scheduleQueue_calldata(timestamp, calledSystem, selector, calldata), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_updatePixel_calldata = (forPlayer: string, forSystem: string, pixelUpdate: models.PixelUpdate, areaId: CairoOption, allowModify: boolean): DojoCall => { + return { + contractName: "actions", + entrypoint: "update_pixel", + calldata: [forPlayer, forSystem, pixelUpdate, areaId, allowModify], + }; + }; + + const actions_updatePixel = async (snAccount: Account | AccountInterface, forPlayer: string, forSystem: string, pixelUpdate: models.PixelUpdate, areaId: CairoOption, allowModify: boolean) => { + try { + return await provider.execute( + snAccount, + build_actions_updatePixel_calldata(forPlayer, forSystem, pixelUpdate, areaId, allowModify), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_addMember_calldata = (gameId: BigNumberish, guildId: BigNumberish, newMember: string): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "add_member", + calldata: [gameId, guildId, newMember], + }; + }; + + const guild_actions_addMember = async (snAccount: Account | AccountInterface, gameId: BigNumberish, guildId: BigNumberish, newMember: string) => { + try { + return await provider.execute( + snAccount, + build_guild_actions_addMember_calldata(gameId, guildId, newMember), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_createGuild_calldata = (gameId: BigNumberish, guildName: BigNumberish): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "create_guild", + calldata: [gameId, guildName], + }; + }; + + const guild_actions_createGuild = async (snAccount: Account | AccountInterface, gameId: BigNumberish, guildName: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_guild_actions_createGuild_calldata(gameId, guildName), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_getGuild_calldata = (gameId: BigNumberish, guildId: BigNumberish): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "get_guild", + calldata: [gameId, guildId], + }; + }; + + const guild_actions_getGuild = async (gameId: BigNumberish, guildId: BigNumberish) => { + try { + return await provider.call("pwar", build_guild_actions_getGuild_calldata(gameId, guildId)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_getGuildPoints_calldata = (gameId: BigNumberish, guildId: BigNumberish): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "get_guild_points", + calldata: [gameId, guildId], + }; + }; + + const guild_actions_getGuildPoints = async (gameId: BigNumberish, guildId: BigNumberish) => { + try { + return await provider.call("pwar", build_guild_actions_getGuildPoints_calldata(gameId, guildId)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_getPlayerCommit_calldata = (playerAddress: string): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "get_player_commit", + calldata: [playerAddress], + }; + }; + + const guild_actions_getPlayerCommit = async (playerAddress: string) => { + try { + return await provider.call("pwar", build_guild_actions_getPlayerCommit_calldata(playerAddress)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_getPlayerOwns_calldata = (playerAddress: string): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "get_player_owns", + calldata: [playerAddress], + }; + }; + + const guild_actions_getPlayerOwns = async (playerAddress: string) => { + try { + return await provider.call("pwar", build_guild_actions_getPlayerOwns_calldata(playerAddress)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_isMember_calldata = (gameId: BigNumberish, guildId: BigNumberish, member: string): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "is_member", + calldata: [gameId, guildId, member], + }; + }; + + const guild_actions_isMember = async (gameId: BigNumberish, guildId: BigNumberish, member: string) => { + try { + return await provider.call("pwar", build_guild_actions_isMember_calldata(gameId, guildId, member)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_joinGuild_calldata = (gameId: BigNumberish, guildId: BigNumberish): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "join_guild", + calldata: [gameId, guildId], + }; + }; + + const guild_actions_joinGuild = async (snAccount: Account | AccountInterface, gameId: BigNumberish, guildId: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_guild_actions_joinGuild_calldata(gameId, guildId), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_removeMember_calldata = (gameId: BigNumberish, guildId: BigNumberish, member: string): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "remove_member", + calldata: [gameId, guildId, member], + }; + }; + + const guild_actions_removeMember = async (snAccount: Account | AccountInterface, gameId: BigNumberish, guildId: BigNumberish, member: string) => { + try { + return await provider.execute( + snAccount, + build_guild_actions_removeMember_calldata(gameId, guildId, member), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_propose_actions_activateProposal_calldata = (gameId: BigNumberish, index: BigNumberish, clearData: Array): DojoCall => { + return { + contractName: "propose_actions", + entrypoint: "activate_proposal", + calldata: [gameId, index, clearData], + }; + }; + + const propose_actions_activateProposal = async (snAccount: Account | AccountInterface, gameId: BigNumberish, index: BigNumberish, clearData: Array) => { + try { + return await provider.execute( + snAccount, + build_propose_actions_activateProposal_calldata(gameId, index, clearData), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_propose_actions_addNewColor_calldata = (gameId: BigNumberish, index: BigNumberish, game: models.Game, proposal: models.Proposal): DojoCall => { + return { + contractName: "propose_actions", + entrypoint: "add_new_color", + calldata: [gameId, index, game, proposal], + }; + }; + + const propose_actions_addNewColor = async (snAccount: Account | AccountInterface, gameId: BigNumberish, index: BigNumberish, game: models.Game, proposal: models.Proposal) => { + try { + return await provider.execute( + snAccount, + build_propose_actions_addNewColor_calldata(gameId, index, game, proposal), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_propose_actions_createProposal_calldata = (gameId: BigNumberish, proposalType: BigNumberish, targetArgs1: BigNumberish, targetArgs2: BigNumberish): DojoCall => { + return { + contractName: "propose_actions", + entrypoint: "create_proposal", + calldata: [gameId, proposalType, targetArgs1, targetArgs2], + }; + }; + + const propose_actions_createProposal = async (snAccount: Account | AccountInterface, gameId: BigNumberish, proposalType: BigNumberish, targetArgs1: BigNumberish, targetArgs2: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_propose_actions_createProposal_calldata(gameId, proposalType, targetArgs1, targetArgs2), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_propose_actions_resetToWhite_calldata = (gameId: BigNumberish, index: BigNumberish, game: models.Game, proposal: models.Proposal, clearData: Array): DojoCall => { + return { + contractName: "propose_actions", + entrypoint: "reset_to_white", + calldata: [gameId, index, game, proposal, clearData], + }; + }; + + const propose_actions_resetToWhite = async (snAccount: Account | AccountInterface, gameId: BigNumberish, index: BigNumberish, game: models.Game, proposal: models.Proposal, clearData: Array) => { + try { + return await provider.execute( + snAccount, + build_propose_actions_resetToWhite_calldata(gameId, index, game, proposal, clearData), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_createGame_calldata = (origin: models.Position): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "create_game", + calldata: [origin], + }; + }; + + const pwar_actions_createGame = async (snAccount: Account | AccountInterface, origin: models.Position) => { + try { + return await provider.execute( + snAccount, + build_pwar_actions_createGame_calldata(origin), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_createGameGuilds_calldata = (gameId: BigNumberish, guildDispatcher: models.IGuildDispatcher): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "create_game_guilds", + calldata: [gameId, guildDispatcher], + }; + }; + + const pwar_actions_createGameGuilds = async (snAccount: Account | AccountInterface, gameId: BigNumberish, guildDispatcher: models.IGuildDispatcher) => { + try { + return await provider.execute( + snAccount, + build_pwar_actions_createGameGuilds_calldata(gameId, guildDispatcher), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_endGame_calldata = (gameId: BigNumberish): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "end_game", + calldata: [gameId], + }; + }; + + const pwar_actions_endGame = async (snAccount: Account | AccountInterface, gameId: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_pwar_actions_endGame_calldata(gameId), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_getGame_calldata = (id: BigNumberish): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "get_game", + calldata: [id], + }; + }; + + const pwar_actions_getGame = async (id: BigNumberish) => { + try { + return await provider.call("pwar", build_pwar_actions_getGame_calldata(id)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_getGameId_calldata = (position: models.Position): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "get_game_id", + calldata: [position], + }; + }; + + const pwar_actions_getGameId = async (position: models.Position) => { + try { + return await provider.call("pwar", build_pwar_actions_getGameId_calldata(position)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_interact_calldata = (defaultParams: models.DefaultParameters): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "interact", + calldata: [defaultParams], + }; + }; + + const pwar_actions_interact = async (snAccount: Account | AccountInterface, defaultParams: models.DefaultParameters) => { + try { + return await provider.execute( + snAccount, + build_pwar_actions_interact_calldata(defaultParams), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_placePixel_calldata = (app: string, defaultParams: models.DefaultParameters): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "place_pixel", + calldata: [app, defaultParams], + }; + }; + + const pwar_actions_placePixel = async (snAccount: Account | AccountInterface, app: string, defaultParams: models.DefaultParameters) => { + try { + return await provider.execute( + snAccount, + build_pwar_actions_placePixel_calldata(app, defaultParams), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_voting_actions_vote_calldata = (gameId: BigNumberish, index: BigNumberish, usePx: BigNumberish, isInFavor: boolean): DojoCall => { + return { + contractName: "voting_actions", + entrypoint: "vote", + calldata: [gameId, index, usePx, isInFavor], + }; + }; + + const voting_actions_vote = async (snAccount: Account | AccountInterface, gameId: BigNumberish, index: BigNumberish, usePx: BigNumberish, isInFavor: boolean) => { + try { + return await provider.execute( + snAccount, + build_voting_actions_vote_calldata(gameId, index, usePx, isInFavor), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + + + return { + actions: { + addArea: actions_addArea, + buildAddAreaCalldata: build_actions_addArea_calldata, + canUpdatePixel: actions_canUpdatePixel, + buildCanUpdatePixelCalldata: build_actions_canUpdatePixel_calldata, + findAreaByPosition: actions_findAreaByPosition, + buildFindAreaByPositionCalldata: build_actions_findAreaByPosition_calldata, + findAreasInsideBounds: actions_findAreasInsideBounds, + buildFindAreasInsideBoundsCalldata: build_actions_findAreasInsideBounds_calldata, + newApp: actions_newApp, + buildNewAppCalldata: build_actions_newApp_calldata, + notification: actions_notification, + buildNotificationCalldata: build_actions_notification_calldata, + processQueue: actions_processQueue, + buildProcessQueueCalldata: build_actions_processQueue_calldata, + removeArea: actions_removeArea, + buildRemoveAreaCalldata: build_actions_removeArea_calldata, + scheduleQueue: actions_scheduleQueue, + buildScheduleQueueCalldata: build_actions_scheduleQueue_calldata, + updatePixel: actions_updatePixel, + buildUpdatePixelCalldata: build_actions_updatePixel_calldata, + }, + guild_actions: { + addMember: guild_actions_addMember, + buildAddMemberCalldata: build_guild_actions_addMember_calldata, + createGuild: guild_actions_createGuild, + buildCreateGuildCalldata: build_guild_actions_createGuild_calldata, + getGuild: guild_actions_getGuild, + buildGetGuildCalldata: build_guild_actions_getGuild_calldata, + getGuildPoints: guild_actions_getGuildPoints, + buildGetGuildPointsCalldata: build_guild_actions_getGuildPoints_calldata, + getPlayerCommit: guild_actions_getPlayerCommit, + buildGetPlayerCommitCalldata: build_guild_actions_getPlayerCommit_calldata, + getPlayerOwns: guild_actions_getPlayerOwns, + buildGetPlayerOwnsCalldata: build_guild_actions_getPlayerOwns_calldata, + isMember: guild_actions_isMember, + buildIsMemberCalldata: build_guild_actions_isMember_calldata, + joinGuild: guild_actions_joinGuild, + buildJoinGuildCalldata: build_guild_actions_joinGuild_calldata, + removeMember: guild_actions_removeMember, + buildRemoveMemberCalldata: build_guild_actions_removeMember_calldata, + }, + propose_actions: { + activateProposal: propose_actions_activateProposal, + buildActivateProposalCalldata: build_propose_actions_activateProposal_calldata, + addNewColor: propose_actions_addNewColor, + buildAddNewColorCalldata: build_propose_actions_addNewColor_calldata, + createProposal: propose_actions_createProposal, + buildCreateProposalCalldata: build_propose_actions_createProposal_calldata, + resetToWhite: propose_actions_resetToWhite, + buildResetToWhiteCalldata: build_propose_actions_resetToWhite_calldata, + }, + pwar_actions: { + createGame: pwar_actions_createGame, + buildCreateGameCalldata: build_pwar_actions_createGame_calldata, + createGameGuilds: pwar_actions_createGameGuilds, + buildCreateGameGuildsCalldata: build_pwar_actions_createGameGuilds_calldata, + endGame: pwar_actions_endGame, + buildEndGameCalldata: build_pwar_actions_endGame_calldata, + getGame: pwar_actions_getGame, + buildGetGameCalldata: build_pwar_actions_getGame_calldata, + getGameId: pwar_actions_getGameId, + buildGetGameIdCalldata: build_pwar_actions_getGameId_calldata, + interact: pwar_actions_interact, + buildInteractCalldata: build_pwar_actions_interact_calldata, + placePixel: pwar_actions_placePixel, + buildPlacePixelCalldata: build_pwar_actions_placePixel_calldata, + }, + voting_actions: { + vote: voting_actions_vote, + buildVoteCalldata: build_voting_actions_vote_calldata, + }, + }; +} \ No newline at end of file diff --git a/client/src/config/manifest.contracts.ts b/client/src/config/manifest.contracts.ts new file mode 100644 index 0000000..99fc1b5 --- /dev/null +++ b/client/src/config/manifest.contracts.ts @@ -0,0 +1,1515 @@ +export const pwarManifest = [ + { + "address": "0x38be037c76817f4d73f7cec04a5bffb9d64ce544674f72637563708971ef1d3", + "class_hash": "0x3ee99e91fdfa35698d20960111322d90bba48f0429d2c00ce2656f0ce8eb21e", + "abi": [ + { + "type": "impl", + "name": "guild_actions__ContractImpl", + "interface_name": "dojo::contract::interface::IContract" + }, + { + "type": "interface", + "name": "dojo::contract::interface::IContract", + "items": [] + }, + { + "type": "impl", + "name": "guild_actions__DeployedContractImpl", + "interface_name": "dojo::meta::interface::IDeployedResource" + }, + { + "type": "struct", + "name": "core::byte_array::ByteArray", + "members": [ + { + "name": "data", + "type": "core::array::Array::" + }, + { + "name": "pending_word", + "type": "core::felt252" + }, + { + "name": "pending_word_len", + "type": "core::integer::u32" + } + ] + }, + { + "type": "interface", + "name": "dojo::meta::interface::IDeployedResource", + "items": [ + { + "type": "function", + "name": "dojo_name", + "inputs": [], + "outputs": [ + { + "type": "core::byte_array::ByteArray" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "GuildImpl", + "interface_name": "pwar::systems::guilds::IGuild" + }, + { + "type": "enum", + "name": "core::bool", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "pwar::models::guilds::Guild", + "members": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "guild_id", + "type": "core::integer::u32" + }, + { + "name": "guild_name", + "type": "core::felt252" + }, + { + "name": "creator", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "members", + "type": "core::array::Span::" + }, + { + "name": "member_count", + "type": "core::integer::u32" + } + ] + }, + { + "type": "interface", + "name": "pwar::systems::guilds::IGuild", + "items": [ + { + "type": "function", + "name": "create_guild", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "guild_name", + "type": "core::felt252" + } + ], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "external" + }, + { + "type": "function", + "name": "add_member", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "guild_id", + "type": "core::integer::u32" + }, + { + "name": "new_member", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "join_guild", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "guild_id", + "type": "core::integer::u32" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "remove_member", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "guild_id", + "type": "core::integer::u32" + }, + { + "name": "member", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "is_member", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "guild_id", + "type": "core::integer::u32" + }, + { + "name": "member", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "get_guild", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "guild_id", + "type": "core::integer::u32" + } + ], + "outputs": [ + { + "type": "pwar::models::guilds::Guild" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "get_player_commit", + "inputs": [ + { + "name": "player_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "get_player_owns", + "inputs": [ + { + "name": "player_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "get_guild_points", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "guild_id", + "type": "core::integer::u32" + } + ], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "function", + "name": "dojo_init", + "inputs": [], + "outputs": [], + "state_mutability": "view" + }, + { + "type": "impl", + "name": "WorldProviderImpl", + "interface_name": "dojo::contract::components::world_provider::IWorldProvider" + }, + { + "type": "struct", + "name": "dojo::world::iworld::IWorldDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "interface", + "name": "dojo::contract::components::world_provider::IWorldProvider", + "items": [ + { + "type": "function", + "name": "world_dispatcher", + "inputs": [], + "outputs": [ + { + "type": "dojo::world::iworld::IWorldDispatcher" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "UpgradeableImpl", + "interface_name": "dojo::contract::components::upgradeable::IUpgradeable" + }, + { + "type": "interface", + "name": "dojo::contract::components::upgradeable::IUpgradeable", + "items": [ + { + "type": "function", + "name": "upgrade", + "inputs": [ + { + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [] + }, + { + "type": "event", + "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", + "kind": "enum", + "variants": [ + { + "name": "Upgraded", + "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", + "kind": "nested" + } + ] + }, + { + "type": "event", + "name": "dojo::contract::components::world_provider::world_provider_cpt::Event", + "kind": "enum", + "variants": [] + }, + { + "type": "event", + "name": "pwar::systems::guilds::guild_actions::Event", + "kind": "enum", + "variants": [ + { + "name": "UpgradeableEvent", + "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", + "kind": "nested" + }, + { + "name": "WorldProviderEvent", + "type": "dojo::contract::components::world_provider::world_provider_cpt::Event", + "kind": "nested" + } + ] + } + ], + "init_calldata": [], + "tag": "pwar-guild_actions", + "selector": "0x3c3b77d165909386294773571272f51dcefab9d0aa99d69b70796f6501d6f42", + "systems": [ + "create_guild", + "add_member", + "join_guild", + "remove_member", + "upgrade" + ] + }, + { + "address": "0x4038ddb14b806e40242355883643c009451a6b15fc9aa402a1248dae25a5a49", + "class_hash": "0x7dd3c84c52aebfc627247b8890e9c54321fb971128c085470acf5e7ecef9b9", + "abi": [ + { + "type": "impl", + "name": "propose_actions__ContractImpl", + "interface_name": "dojo::contract::interface::IContract" + }, + { + "type": "interface", + "name": "dojo::contract::interface::IContract", + "items": [] + }, + { + "type": "impl", + "name": "propose_actions__DeployedContractImpl", + "interface_name": "dojo::meta::interface::IDeployedResource" + }, + { + "type": "struct", + "name": "core::byte_array::ByteArray", + "members": [ + { + "name": "data", + "type": "core::array::Array::" + }, + { + "name": "pending_word", + "type": "core::felt252" + }, + { + "name": "pending_word_len", + "type": "core::integer::u32" + } + ] + }, + { + "type": "interface", + "name": "dojo::meta::interface::IDeployedResource", + "items": [ + { + "type": "function", + "name": "dojo_name", + "inputs": [], + "outputs": [ + { + "type": "core::byte_array::ByteArray" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "ProposeImpl", + "interface_name": "pwar::systems::propose::IPropose" + }, + { + "type": "struct", + "name": "pixelaw::core::utils::Position", + "members": [ + { + "name": "x", + "type": "core::integer::u16" + }, + { + "name": "y", + "type": "core::integer::u16" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "pwar::models::game::Game", + "members": [ + { + "name": "id", + "type": "core::integer::u32" + }, + { + "name": "start", + "type": "core::integer::u64" + }, + { + "name": "end", + "type": "core::integer::u64" + }, + { + "name": "proposal_idx", + "type": "core::integer::u32" + }, + { + "name": "coeff_own_pixels", + "type": "core::integer::u32" + }, + { + "name": "coeff_commits", + "type": "core::integer::u32" + }, + { + "name": "winner_config", + "type": "core::integer::u32" + }, + { + "name": "winner", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "guild_ids", + "type": "core::array::Span::" + }, + { + "name": "guild_count", + "type": "core::integer::u32" + } + ] + }, + { + "type": "enum", + "name": "core::bool", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "type": "struct", + "name": "pwar::models::proposal::Proposal", + "members": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "index", + "type": "core::integer::u32" + }, + { + "name": "author", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "proposal_type", + "type": "core::integer::u8" + }, + { + "name": "target_args_1", + "type": "core::integer::u32" + }, + { + "name": "target_args_2", + "type": "core::integer::u32" + }, + { + "name": "start", + "type": "core::integer::u64" + }, + { + "name": "end", + "type": "core::integer::u64" + }, + { + "name": "yes_voting_power", + "type": "core::integer::u32" + }, + { + "name": "no_voting_power", + "type": "core::integer::u32" + }, + { + "name": "is_activated", + "type": "core::bool" + } + ] + }, + { + "type": "interface", + "name": "pwar::systems::propose::IPropose", + "items": [ + { + "type": "function", + "name": "create_proposal", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "proposal_type", + "type": "core::integer::u8" + }, + { + "name": "target_args_1", + "type": "core::integer::u32" + }, + { + "name": "target_args_2", + "type": "core::integer::u32" + } + ], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "external" + }, + { + "type": "function", + "name": "activate_proposal", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "index", + "type": "core::integer::u32" + }, + { + "name": "clear_data", + "type": "core::array::Span::" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "add_new_color", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "index", + "type": "core::integer::u32" + }, + { + "name": "game", + "type": "pwar::models::game::Game" + }, + { + "name": "proposal", + "type": "pwar::models::proposal::Proposal" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "reset_to_white", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "index", + "type": "core::integer::u32" + }, + { + "name": "game", + "type": "pwar::models::game::Game" + }, + { + "name": "proposal", + "type": "pwar::models::proposal::Proposal" + }, + { + "name": "clear_data", + "type": "core::array::Span::" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "function", + "name": "dojo_init", + "inputs": [], + "outputs": [], + "state_mutability": "view" + }, + { + "type": "impl", + "name": "WorldProviderImpl", + "interface_name": "dojo::contract::components::world_provider::IWorldProvider" + }, + { + "type": "struct", + "name": "dojo::world::iworld::IWorldDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "interface", + "name": "dojo::contract::components::world_provider::IWorldProvider", + "items": [ + { + "type": "function", + "name": "world_dispatcher", + "inputs": [], + "outputs": [ + { + "type": "dojo::world::iworld::IWorldDispatcher" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "UpgradeableImpl", + "interface_name": "dojo::contract::components::upgradeable::IUpgradeable" + }, + { + "type": "interface", + "name": "dojo::contract::components::upgradeable::IUpgradeable", + "items": [ + { + "type": "function", + "name": "upgrade", + "inputs": [ + { + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [] + }, + { + "type": "event", + "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", + "kind": "enum", + "variants": [ + { + "name": "Upgraded", + "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", + "kind": "nested" + } + ] + }, + { + "type": "event", + "name": "dojo::contract::components::world_provider::world_provider_cpt::Event", + "kind": "enum", + "variants": [] + }, + { + "type": "event", + "name": "pwar::systems::propose::propose_actions::Event", + "kind": "enum", + "variants": [ + { + "name": "UpgradeableEvent", + "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", + "kind": "nested" + }, + { + "name": "WorldProviderEvent", + "type": "dojo::contract::components::world_provider::world_provider_cpt::Event", + "kind": "nested" + } + ] + } + ], + "init_calldata": [], + "tag": "pwar-propose_actions", + "selector": "0x5052f70e59d3197eee09586db5f0c9578581601c549020f478ffe96e57d8573", + "systems": [ + "create_proposal", + "activate_proposal", + "add_new_color", + "reset_to_white", + "upgrade" + ] + }, + { + "address": "0x2226c41273351a3d09127412d87eab7ee2c934b6978da1342229201966014fa", + "class_hash": "0x273a59bed6da71650a30d4ff22b0c88329714d296a183b0171b14f36f72b9d3", + "abi": [ + { + "type": "impl", + "name": "pwar_actions__ContractImpl", + "interface_name": "dojo::contract::interface::IContract" + }, + { + "type": "interface", + "name": "dojo::contract::interface::IContract", + "items": [] + }, + { + "type": "impl", + "name": "pwar_actions__DeployedContractImpl", + "interface_name": "dojo::meta::interface::IDeployedResource" + }, + { + "type": "struct", + "name": "core::byte_array::ByteArray", + "members": [ + { + "name": "data", + "type": "core::array::Array::" + }, + { + "name": "pending_word", + "type": "core::felt252" + }, + { + "name": "pending_word_len", + "type": "core::integer::u32" + } + ] + }, + { + "type": "interface", + "name": "dojo::meta::interface::IDeployedResource", + "items": [ + { + "type": "function", + "name": "dojo_name", + "inputs": [], + "outputs": [ + { + "type": "core::byte_array::ByteArray" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "function", + "name": "dojo_init", + "inputs": [], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "impl", + "name": "ActionsImpl", + "interface_name": "pwar::systems::actions::IActions" + }, + { + "type": "enum", + "name": "core::option::Option::", + "variants": [ + { + "name": "Some", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "None", + "type": "()" + } + ] + }, + { + "type": "enum", + "name": "core::option::Option::", + "variants": [ + { + "name": "Some", + "type": "core::integer::u64" + }, + { + "name": "None", + "type": "()" + } + ] + }, + { + "type": "struct", + "name": "pixelaw::core::utils::Position", + "members": [ + { + "name": "x", + "type": "core::integer::u16" + }, + { + "name": "y", + "type": "core::integer::u16" + } + ] + }, + { + "type": "struct", + "name": "pixelaw::core::utils::DefaultParameters", + "members": [ + { + "name": "player_override", + "type": "core::option::Option::" + }, + { + "name": "system_override", + "type": "core::option::Option::" + }, + { + "name": "area_hint", + "type": "core::option::Option::" + }, + { + "name": "position", + "type": "pixelaw::core::utils::Position" + }, + { + "name": "color", + "type": "core::integer::u32" + } + ] + }, + { + "type": "struct", + "name": "pwar::systems::guilds::IGuildDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "pwar::models::game::Game", + "members": [ + { + "name": "id", + "type": "core::integer::u32" + }, + { + "name": "start", + "type": "core::integer::u64" + }, + { + "name": "end", + "type": "core::integer::u64" + }, + { + "name": "proposal_idx", + "type": "core::integer::u32" + }, + { + "name": "coeff_own_pixels", + "type": "core::integer::u32" + }, + { + "name": "coeff_commits", + "type": "core::integer::u32" + }, + { + "name": "winner_config", + "type": "core::integer::u32" + }, + { + "name": "winner", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "guild_ids", + "type": "core::array::Span::" + }, + { + "name": "guild_count", + "type": "core::integer::u32" + } + ] + }, + { + "type": "interface", + "name": "pwar::systems::actions::IActions", + "items": [ + { + "type": "function", + "name": "interact", + "inputs": [ + { + "name": "default_params", + "type": "pixelaw::core::utils::DefaultParameters" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "create_game", + "inputs": [ + { + "name": "origin", + "type": "pixelaw::core::utils::Position" + } + ], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "external" + }, + { + "type": "function", + "name": "create_game_guilds", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "guild_dispatcher", + "type": "pwar::systems::guilds::IGuildDispatcher" + } + ], + "outputs": [ + { + "type": "core::array::Array::" + } + ], + "state_mutability": "external" + }, + { + "type": "function", + "name": "get_game_id", + "inputs": [ + { + "name": "position", + "type": "pixelaw::core::utils::Position" + } + ], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "get_game", + "inputs": [ + { + "name": "id", + "type": "core::integer::u32" + } + ], + "outputs": [ + { + "type": "pwar::models::game::Game" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "place_pixel", + "inputs": [ + { + "name": "app", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "default_params", + "type": "pixelaw::core::utils::DefaultParameters" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "end_game", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "impl", + "name": "WorldProviderImpl", + "interface_name": "dojo::contract::components::world_provider::IWorldProvider" + }, + { + "type": "struct", + "name": "dojo::world::iworld::IWorldDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "interface", + "name": "dojo::contract::components::world_provider::IWorldProvider", + "items": [ + { + "type": "function", + "name": "world_dispatcher", + "inputs": [], + "outputs": [ + { + "type": "dojo::world::iworld::IWorldDispatcher" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "UpgradeableImpl", + "interface_name": "dojo::contract::components::upgradeable::IUpgradeable" + }, + { + "type": "interface", + "name": "dojo::contract::components::upgradeable::IUpgradeable", + "items": [ + { + "type": "function", + "name": "upgrade", + "inputs": [ + { + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [] + }, + { + "type": "event", + "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", + "kind": "enum", + "variants": [ + { + "name": "Upgraded", + "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", + "kind": "nested" + } + ] + }, + { + "type": "event", + "name": "dojo::contract::components::world_provider::world_provider_cpt::Event", + "kind": "enum", + "variants": [] + }, + { + "type": "event", + "name": "pwar::systems::actions::pwar_actions::Event", + "kind": "enum", + "variants": [ + { + "name": "UpgradeableEvent", + "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", + "kind": "nested" + }, + { + "name": "WorldProviderEvent", + "type": "dojo::contract::components::world_provider::world_provider_cpt::Event", + "kind": "nested" + } + ] + } + ], + "init_calldata": [], + "tag": "pwar-pwar_actions", + "selector": "0x3daa6a1f5dad3f5074b948a3e3a65e5b5f08198629686def58f43acce601a48", + "systems": [ + "dojo_init", + "interact", + "create_game", + "create_game_guilds", + "place_pixel", + "end_game", + "upgrade" + ] + }, + { + "address": "0x379ac4b00a0ad23a102ea64d2686123300ef515605d0cea7df79405f4555ba", + "class_hash": "0x336f77928b73a5f532bfa6975c71a11395ea86d2e8a9ea2e9c571efb15f8f4c", + "abi": [ + { + "type": "impl", + "name": "voting_actions__ContractImpl", + "interface_name": "dojo::contract::interface::IContract" + }, + { + "type": "interface", + "name": "dojo::contract::interface::IContract", + "items": [] + }, + { + "type": "impl", + "name": "voting_actions__DeployedContractImpl", + "interface_name": "dojo::meta::interface::IDeployedResource" + }, + { + "type": "struct", + "name": "core::byte_array::ByteArray", + "members": [ + { + "name": "data", + "type": "core::array::Array::" + }, + { + "name": "pending_word", + "type": "core::felt252" + }, + { + "name": "pending_word_len", + "type": "core::integer::u32" + } + ] + }, + { + "type": "interface", + "name": "dojo::meta::interface::IDeployedResource", + "items": [ + { + "type": "function", + "name": "dojo_name", + "inputs": [], + "outputs": [ + { + "type": "core::byte_array::ByteArray" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "VotingImpl", + "interface_name": "pwar::systems::voting::IVoting" + }, + { + "type": "enum", + "name": "core::bool", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "type": "interface", + "name": "pwar::systems::voting::IVoting", + "items": [ + { + "type": "function", + "name": "vote", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "index", + "type": "core::integer::u32" + }, + { + "name": "use_px", + "type": "core::integer::u32" + }, + { + "name": "is_in_favor", + "type": "core::bool" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "function", + "name": "dojo_init", + "inputs": [], + "outputs": [], + "state_mutability": "view" + }, + { + "type": "impl", + "name": "WorldProviderImpl", + "interface_name": "dojo::contract::components::world_provider::IWorldProvider" + }, + { + "type": "struct", + "name": "dojo::world::iworld::IWorldDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "interface", + "name": "dojo::contract::components::world_provider::IWorldProvider", + "items": [ + { + "type": "function", + "name": "world_dispatcher", + "inputs": [], + "outputs": [ + { + "type": "dojo::world::iworld::IWorldDispatcher" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "impl", + "name": "UpgradeableImpl", + "interface_name": "dojo::contract::components::upgradeable::IUpgradeable" + }, + { + "type": "interface", + "name": "dojo::contract::components::upgradeable::IUpgradeable", + "items": [ + { + "type": "function", + "name": "upgrade", + "inputs": [ + { + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [] + }, + { + "type": "event", + "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", + "kind": "struct", + "members": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", + "kind": "enum", + "variants": [ + { + "name": "Upgraded", + "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", + "kind": "nested" + } + ] + }, + { + "type": "event", + "name": "dojo::contract::components::world_provider::world_provider_cpt::Event", + "kind": "enum", + "variants": [] + }, + { + "type": "event", + "name": "pwar::systems::voting::voting_actions::Event", + "kind": "enum", + "variants": [ + { + "name": "UpgradeableEvent", + "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", + "kind": "nested" + }, + { + "name": "WorldProviderEvent", + "type": "dojo::contract::components::world_provider::world_provider_cpt::Event", + "kind": "nested" + } + ] + } + ], + "init_calldata": [], + "tag": "pwar-voting_actions", + "selector": "0x62e6ca68a564d25337ca245b38054c9b249d3a9d3d7bb0d97a6a817e473383a", + "systems": [ + "vote", + "upgrade" + ] + } + ] \ No newline at end of file diff --git a/client/src/config/models.gen.ts b/client/src/config/models.gen.ts new file mode 100644 index 0000000..928cd31 --- /dev/null +++ b/client/src/config/models.gen.ts @@ -0,0 +1,994 @@ +import type { SchemaType as ISchemaType } from "@dojoengine/sdk"; + +import { CairoOption, CairoOptionVariant, BigNumberish } from 'starknet'; + +// Type definition for `pixelaw::core::models::area::Area` struct +export interface Area { + id: BigNumberish; + app: string; + owner: string; + color: BigNumberish; +} + +// Type definition for `pixelaw::core::models::area::AreaValue` struct +export interface AreaValue { + app: string; + owner: string; + color: BigNumberish; +} + +// Type definition for `pixelaw::core::models::area::RTree` struct +export interface RTree { + id: BigNumberish; + children: BigNumberish; +} + +// Type definition for `pixelaw::core::models::area::RTreeValue` struct +export interface RTreeValue { + children: BigNumberish; +} + +// Type definition for `pixelaw::core::models::dummy::Dummy` struct +export interface Dummy { + id: BigNumberish; + defaultParams: DefaultParameters; + bounds: Bounds; + pixelUpdate: PixelUpdate; + emoji: Emoji; +} + +// Type definition for `pixelaw::core::models::dummy::DummyValue` struct +export interface DummyValue { + defaultParams: DefaultParameters; + bounds: Bounds; + pixelUpdate: PixelUpdate; + emoji: Emoji; +} + +// Type definition for `pixelaw::core::models::pixel::Pixel` struct +export interface Pixel { + position: Position; + app: string; + color: BigNumberish; + created_at: BigNumberish; + updated_at: BigNumberish; + timestamp: BigNumberish; + owner: string; + text: BigNumberish; + action: BigNumberish; +} + +// Type definition for `pixelaw::core::models::pixel::PixelUpdate` struct +export interface PixelUpdate { + position: Position; + color: CairoOption; + owner: CairoOption; + app: CairoOption; + text: CairoOption; + timestamp: CairoOption; + action: CairoOption; +} + +// Type definition for `pixelaw::core::models::pixel::PixelValue` struct +export interface PixelValue { + app: string; + color: BigNumberish; + created_at: BigNumberish; + updated_at: BigNumberish; + timestamp: BigNumberish; + owner: string; + text: BigNumberish; + action: BigNumberish; +} + +// Type definition for `pixelaw::core::models::queue::QueueItem` struct +export interface QueueItem { + id: BigNumberish; + valid: boolean; +} + +// Type definition for `pixelaw::core::models::queue::QueueItemValue` struct +export interface QueueItemValue { + valid: boolean; +} + +// Type definition for `pixelaw::core::models::registry::App` struct +export interface App { + system: string; + name: BigNumberish; + icon: BigNumberish; + action: BigNumberish; +} + +// Type definition for `pixelaw::core::models::registry::AppName` struct +export interface AppName { + name: BigNumberish; + system: string; +} + +// Type definition for `pixelaw::core::models::registry::AppNameValue` struct +export interface AppNameValue { + system: string; +} + +// Type definition for `pixelaw::core::models::registry::AppValue` struct +export interface AppValue { + name: BigNumberish; + icon: BigNumberish; + action: BigNumberish; +} + +// Type definition for `pixelaw::core::models::registry::CoreActionsAddress` struct +export interface CoreActionsAddress { + key: BigNumberish; + value: string; +} + +// Type definition for `pixelaw::core::models::registry::CoreActionsAddressValue` struct +export interface CoreActionsAddressValue { + value: string; +} + +// Type definition for `pixelaw::core::utils::Bounds` struct +export interface Bounds { + x_min: BigNumberish; + y_min: BigNumberish; + x_max: BigNumberish; + y_max: BigNumberish; +} + +// Type definition for `pixelaw::core::utils::DefaultParameters` struct +export interface DefaultParameters { + player_override: CairoOption; + system_override: CairoOption; + area_hint: CairoOption; + position: Position; + color: BigNumberish; +} + +// Type definition for `pixelaw::core::utils::Emoji` struct +export interface Emoji { + value: BigNumberish; +} + +// Type definition for `pixelaw::core::utils::Position` struct +export interface Position { + x: BigNumberish; + y: BigNumberish; +} + +// Type definition for `pwar::models::allowed_color::AllowedColor` struct +export interface AllowedColor { + game_id: BigNumberish; + color: BigNumberish; + is_allowed: boolean; +} + +// Type definition for `pwar::models::allowed_color::AllowedColorValue` struct +export interface AllowedColorValue { + is_allowed: boolean; +} + +// Type definition for `pwar::models::allowed_color::GamePalette` struct +export interface GamePalette { + game_id: BigNumberish; + length: BigNumberish; +} + +// Type definition for `pwar::models::allowed_color::GamePaletteValue` struct +export interface GamePaletteValue { + length: BigNumberish; +} + +// Type definition for `pwar::models::allowed_color::InPalette` struct +export interface InPalette { + game_id: BigNumberish; + color: BigNumberish; + value: boolean; +} + +// Type definition for `pwar::models::allowed_color::InPaletteValue` struct +export interface InPaletteValue { + value: boolean; +} + +// Type definition for `pwar::models::allowed_color::PaletteColors` struct +export interface PaletteColors { + game_id: BigNumberish; + idx: BigNumberish; + color: BigNumberish; +} + +// Type definition for `pwar::models::allowed_color::PaletteColorsValue` struct +export interface PaletteColorsValue { + color: BigNumberish; +} + +// Type definition for `pwar::models::board::Board` struct +export interface Board { + id: BigNumberish; + origin: Position; + width: BigNumberish; + height: BigNumberish; +} + +// Type definition for `pwar::models::board::BoardValue` struct +export interface BoardValue { + origin: Position; + width: BigNumberish; + height: BigNumberish; +} + +// Type definition for `pwar::models::board::GameId` struct +export interface GameId { + x: BigNumberish; + y: BigNumberish; + value: BigNumberish; +} + +// Type definition for `pwar::models::board::GameIdValue` struct +export interface GameIdValue { + value: BigNumberish; +} + +// Type definition for `pwar::models::board::PWarPixel` struct +export interface PWarPixel { + position: Position; + owner: string; +} + +// Type definition for `pwar::models::board::PWarPixelValue` struct +export interface PWarPixelValue { + owner: string; +} + +// Type definition for `pwar::models::game::Game` struct +export interface Game { + id: BigNumberish; + start: BigNumberish; + end: BigNumberish; + proposal_idx: BigNumberish; + coeff_own_pixels: BigNumberish; + coeff_commits: BigNumberish; + winner_config: BigNumberish; + winner: string; + guild_ids: Array; + guild_count: BigNumberish; +} + +// Type definition for `pwar::models::game::GameValue` struct +export interface GameValue { + start: BigNumberish; + end: BigNumberish; + proposal_idx: BigNumberish; + coeff_own_pixels: BigNumberish; + coeff_commits: BigNumberish; + winner_config: BigNumberish; + winner: string; + guild_ids: Array; + guild_count: BigNumberish; +} + +// Type definition for `pwar::models::guilds::Guild` struct +export interface Guild { + game_id: BigNumberish; + guild_id: BigNumberish; + guild_name: BigNumberish; + creator: string; + members: Array; + member_count: BigNumberish; +} + +// Type definition for `pwar::models::guilds::GuildValue` struct +export interface GuildValue { + guild_name: BigNumberish; + creator: string; + members: Array; + member_count: BigNumberish; +} + +// Type definition for `pwar::models::player::Player` struct +export interface Player { + address: string; + num_owns: BigNumberish; + num_commit: BigNumberish; + last_date: BigNumberish; + is_banned: boolean; +} + +// Type definition for `pwar::models::player::PlayerValue` struct +export interface PlayerValue { + num_owns: BigNumberish; + num_commit: BigNumberish; + last_date: BigNumberish; + is_banned: boolean; +} + +// Type definition for `pwar::models::proposal::PixelRecoveryRate` struct +export interface PixelRecoveryRate { + game_id: BigNumberish; + rate: BigNumberish; +} + +// Type definition for `pwar::models::proposal::PixelRecoveryRateValue` struct +export interface PixelRecoveryRateValue { + rate: BigNumberish; +} + +// Type definition for `pwar::models::proposal::PlayerVote` struct +export interface PlayerVote { + player: string; + game_id: BigNumberish; + index: BigNumberish; + is_in_favor: boolean; + voting_power: BigNumberish; +} + +// Type definition for `pwar::models::proposal::PlayerVoteValue` struct +export interface PlayerVoteValue { + is_in_favor: boolean; + voting_power: BigNumberish; +} + +// Type definition for `pwar::models::proposal::Proposal` struct +export interface Proposal { + game_id: BigNumberish; + index: BigNumberish; + author: string; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; + start: BigNumberish; + end: BigNumberish; + yes_voting_power: BigNumberish; + no_voting_power: BigNumberish; + is_activated: boolean; +} + +// Type definition for `pwar::models::proposal::ProposalValue` struct +export interface ProposalValue { + author: string; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; + start: BigNumberish; + end: BigNumberish; + yes_voting_power: BigNumberish; + no_voting_power: BigNumberish; + is_activated: boolean; +} + +// Type definition for `pixelaw::core::events::QueueScheduled` struct +export interface QueueScheduled { + id: BigNumberish; + timestamp: BigNumberish; + called_system: string; + selector: BigNumberish; + calldata: Array; +} + +// Type definition for `pixelaw::core::events::QueueScheduledValue` struct +export interface QueueScheduledValue { + timestamp: BigNumberish; + called_system: string; + selector: BigNumberish; + calldata: Array; +} + +// Type definition for `pwar::systems::actions::pwar_actions::EndedGame` struct +export interface EndedGame { + id: BigNumberish; + timestamp: BigNumberish; +} + +// Type definition for `pwar::systems::actions::pwar_actions::EndedGameValue` struct +export interface EndedGameValue { + timestamp: BigNumberish; +} + +// Type definition for `pwar::systems::actions::pwar_actions::StartedGame` struct +export interface StartedGame { + id: BigNumberish; + timestamp: BigNumberish; + creator: string; +} + +// Type definition for `pwar::systems::actions::pwar_actions::StartedGameValue` struct +export interface StartedGameValue { + timestamp: BigNumberish; + creator: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::GuildCreated` struct +export interface GuildCreated { + game_id: BigNumberish; + guild_id: BigNumberish; + guild_name: BigNumberish; + creator: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::GuildCreatedValue` struct +export interface GuildCreatedValue { + guild_id: BigNumberish; + guild_name: BigNumberish; + creator: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::MemberAdded` struct +export interface MemberAdded { + game_id: BigNumberish; + guild_id: BigNumberish; + member: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::MemberAddedValue` struct +export interface MemberAddedValue { + guild_id: BigNumberish; + member: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::MemberRemoved` struct +export interface MemberRemoved { + game_id: BigNumberish; + guild_id: BigNumberish; + member: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::MemberRemovedValue` struct +export interface MemberRemovedValue { + guild_id: BigNumberish; + member: string; +} + +// Type definition for `pwar::systems::propose::propose_actions::ProposalActivated` struct +export interface ProposalActivated { + game_id: BigNumberish; + index: BigNumberish; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; +} + +// Type definition for `pwar::systems::propose::propose_actions::ProposalActivatedValue` struct +export interface ProposalActivatedValue { + index: BigNumberish; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; +} + +// Type definition for `pwar::systems::propose::propose_actions::ProposalCreated` struct +export interface ProposalCreated { + game_id: BigNumberish; + index: BigNumberish; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; +} + +// Type definition for `pwar::systems::propose::propose_actions::ProposalCreatedValue` struct +export interface ProposalCreatedValue { + index: BigNumberish; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; +} + +// Type definition for `pwar::systems::voting::voting_actions::Voted` struct +export interface Voted { + game_id: BigNumberish; + index: BigNumberish; + timestamp: BigNumberish; + voter: string; + is_in_favor: boolean; +} + +// Type definition for `pwar::systems::voting::voting_actions::VotedValue` struct +export interface VotedValue { + index: BigNumberish; + timestamp: BigNumberish; + voter: string; + is_in_favor: boolean; +} + +export interface SchemaType extends ISchemaType { + pixelaw: { + Area: Area, + AreaValue: AreaValue, + RTree: RTree, + RTreeValue: RTreeValue, + Dummy: Dummy, + DummyValue: DummyValue, + Pixel: Pixel, + PixelUpdate: PixelUpdate, + PixelValue: PixelValue, + QueueItem: QueueItem, + QueueItemValue: QueueItemValue, + App: App, + AppName: AppName, + AppNameValue: AppNameValue, + AppValue: AppValue, + CoreActionsAddress: CoreActionsAddress, + CoreActionsAddressValue: CoreActionsAddressValue, + Bounds: Bounds, + DefaultParameters: DefaultParameters, + Emoji: Emoji, + Position: Position, + }, + pwar: { + AllowedColor: AllowedColor, + AllowedColorValue: AllowedColorValue, + GamePalette: GamePalette, + GamePaletteValue: GamePaletteValue, + InPalette: InPalette, + InPaletteValue: InPaletteValue, + PaletteColors: PaletteColors, + PaletteColorsValue: PaletteColorsValue, + Board: Board, + BoardValue: BoardValue, + GameId: GameId, + GameIdValue: GameIdValue, + PWarPixel: PWarPixel, + PWarPixelValue: PWarPixelValue, + Game: Game, + GameValue: GameValue, + Guild: Guild, + GuildValue: GuildValue, + Player: Player, + PlayerValue: PlayerValue, + PixelRecoveryRate: PixelRecoveryRate, + PixelRecoveryRateValue: PixelRecoveryRateValue, + PlayerVote: PlayerVote, + PlayerVoteValue: PlayerVoteValue, + Proposal: Proposal, + ProposalValue: ProposalValue, + QueueScheduled: QueueScheduled, + QueueScheduledValue: QueueScheduledValue, + EndedGame: EndedGame, + EndedGameValue: EndedGameValue, + StartedGame: StartedGame, + StartedGameValue: StartedGameValue, + GuildCreated: GuildCreated, + GuildCreatedValue: GuildCreatedValue, + MemberAdded: MemberAdded, + MemberAddedValue: MemberAddedValue, + MemberRemoved: MemberRemoved, + MemberRemovedValue: MemberRemovedValue, + ProposalActivated: ProposalActivated, + ProposalActivatedValue: ProposalActivatedValue, + ProposalCreated: ProposalCreated, + ProposalCreatedValue: ProposalCreatedValue, + Voted: Voted, + VotedValue: VotedValue, + }, +} +export const schema: SchemaType = { + pixelaw: { + Area: { + id: 0, + app: "", + owner: "", + color: 0, + }, + AreaValue: { + app: "", + owner: "", + color: 0, + }, + RTree: { + id: 0, + children: 0, + }, + RTreeValue: { + children: 0, + }, + Dummy: { + id: 0, + defaultParams: { player_override: new CairoOption(CairoOptionVariant.None), system_override: new CairoOption(CairoOptionVariant.None), area_hint: new CairoOption(CairoOptionVariant.None), position: { x: 0, y: 0, }, color: 0, }, + bounds: { x_min: 0, y_min: 0, x_max: 0, y_max: 0, }, + pixelUpdate: { position: { x: 0, y: 0, }, color: new CairoOption(CairoOptionVariant.None), owner: new CairoOption(CairoOptionVariant.None), app: new CairoOption(CairoOptionVariant.None), text: new CairoOption(CairoOptionVariant.None), timestamp: new CairoOption(CairoOptionVariant.None), action: new CairoOption(CairoOptionVariant.None), }, + emoji: { value: 0, }, + }, + DummyValue: { + defaultParams: { player_override: new CairoOption(CairoOptionVariant.None), system_override: new CairoOption(CairoOptionVariant.None), area_hint: new CairoOption(CairoOptionVariant.None), position: { x: 0, y: 0, }, color: 0, }, + bounds: { x_min: 0, y_min: 0, x_max: 0, y_max: 0, }, + pixelUpdate: { position: { x: 0, y: 0, }, color: new CairoOption(CairoOptionVariant.None), owner: new CairoOption(CairoOptionVariant.None), app: new CairoOption(CairoOptionVariant.None), text: new CairoOption(CairoOptionVariant.None), timestamp: new CairoOption(CairoOptionVariant.None), action: new CairoOption(CairoOptionVariant.None), }, + emoji: { value: 0, }, + }, + Pixel: { + position: { x: 0, y: 0, }, + app: "", + color: 0, + created_at: 0, + updated_at: 0, + timestamp: 0, + owner: "", + text: 0, + action: 0, + }, + PixelUpdate: { + position: { x: 0, y: 0, }, + color: new CairoOption(CairoOptionVariant.None), + owner: new CairoOption(CairoOptionVariant.None), + app: new CairoOption(CairoOptionVariant.None), + text: new CairoOption(CairoOptionVariant.None), + timestamp: new CairoOption(CairoOptionVariant.None), + action: new CairoOption(CairoOptionVariant.None), + }, + PixelValue: { + app: "", + color: 0, + created_at: 0, + updated_at: 0, + timestamp: 0, + owner: "", + text: 0, + action: 0, + }, + QueueItem: { + id: 0, + valid: false, + }, + QueueItemValue: { + valid: false, + }, + App: { + system: "", + name: 0, + icon: 0, + action: 0, + }, + AppName: { + name: 0, + system: "", + }, + AppNameValue: { + system: "", + }, + AppValue: { + name: 0, + icon: 0, + action: 0, + }, + CoreActionsAddress: { + key: 0, + value: "", + }, + CoreActionsAddressValue: { + value: "", + }, + Bounds: { + x_min: 0, + y_min: 0, + x_max: 0, + y_max: 0, + }, + DefaultParameters: { + player_override: new CairoOption(CairoOptionVariant.None), + system_override: new CairoOption(CairoOptionVariant.None), + area_hint: new CairoOption(CairoOptionVariant.None), + position: { x: 0, y: 0, }, + color: 0, + }, + Emoji: { + value: 0, + }, + Position: { + x: 0, + y: 0, + }, + AllowedColor: { + game_id: 0, + color: 0, + is_allowed: false, + }, + AllowedColorValue: { + is_allowed: false, + }, + GamePalette: { + game_id: 0, + length: 0, + }, + GamePaletteValue: { + length: 0, + }, + InPalette: { + game_id: 0, + color: 0, + value: false, + }, + InPaletteValue: { + value: false, + }, + PaletteColors: { + game_id: 0, + idx: 0, + color: 0, + }, + PaletteColorsValue: { + color: 0, + }, + Board: { + id: 0, + origin: { x: 0, y: 0, }, + width: 0, + height: 0, + }, + BoardValue: { + origin: { x: 0, y: 0, }, + width: 0, + height: 0, + }, + GameId: { + x: 0, + y: 0, + value: 0, + }, + GameIdValue: { + value: 0, + }, + PWarPixel: { + position: { x: 0, y: 0, }, + owner: "", + }, + PWarPixelValue: { + owner: "", + }, + Game: { + id: 0, + start: 0, + end: 0, + proposal_idx: 0, + coeff_own_pixels: 0, + coeff_commits: 0, + winner_config: 0, + winner: "", + guild_ids: [0], + guild_count: 0, + }, + GameValue: { + start: 0, + end: 0, + proposal_idx: 0, + coeff_own_pixels: 0, + coeff_commits: 0, + winner_config: 0, + winner: "", + guild_ids: [0], + guild_count: 0, + }, + Guild: { + game_id: 0, + guild_id: 0, + guild_name: 0, + creator: "", + members: [""], + member_count: 0, + }, + GuildValue: { + guild_name: 0, + creator: "", + members: [""], + member_count: 0, + }, + Player: { + address: "", + num_owns: 0, + num_commit: 0, + last_date: 0, + is_banned: false, + }, + PlayerValue: { + num_owns: 0, + num_commit: 0, + last_date: 0, + is_banned: false, + }, + PixelRecoveryRate: { + game_id: 0, + rate: 0, + }, + PixelRecoveryRateValue: { + rate: 0, + }, + PlayerVote: { + player: "", + game_id: 0, + index: 0, + is_in_favor: false, + voting_power: 0, + }, + PlayerVoteValue: { + is_in_favor: false, + voting_power: 0, + }, + Proposal: { + game_id: 0, + index: 0, + author: "", + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + start: 0, + end: 0, + yes_voting_power: 0, + no_voting_power: 0, + is_activated: false, + }, + ProposalValue: { + author: "", + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + start: 0, + end: 0, + yes_voting_power: 0, + no_voting_power: 0, + is_activated: false, + }, + QueueScheduled: { + id: 0, + timestamp: 0, + called_system: "", + selector: 0, + calldata: [0], + }, + QueueScheduledValue: { + timestamp: 0, + called_system: "", + selector: 0, + calldata: [0], + }, + EndedGame: { + id: 0, + timestamp: 0, + }, + EndedGameValue: { + timestamp: 0, + }, + StartedGame: { + id: 0, + timestamp: 0, + creator: "", + }, + StartedGameValue: { + timestamp: 0, + creator: "", + }, + GuildCreated: { + game_id: 0, + guild_id: 0, + guild_name: 0, + creator: "", + }, + GuildCreatedValue: { + guild_id: 0, + guild_name: 0, + creator: "", + }, + MemberAdded: { + game_id: 0, + guild_id: 0, + member: "", + }, + MemberAddedValue: { + guild_id: 0, + member: "", + }, + MemberRemoved: { + game_id: 0, + guild_id: 0, + member: "", + }, + MemberRemovedValue: { + guild_id: 0, + member: "", + }, + ProposalActivated: { + game_id: 0, + index: 0, + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + }, + ProposalActivatedValue: { + index: 0, + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + }, + ProposalCreated: { + game_id: 0, + index: 0, + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + }, + ProposalCreatedValue: { + index: 0, + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + }, + Voted: { + game_id: 0, + index: 0, + timestamp: 0, + voter: "", + is_in_favor: false, + }, + VotedValue: { + index: 0, + timestamp: 0, + voter: "", + is_in_favor: false, + }, + }, +}; +export enum ModelsMapping { + Area = 'pixelaw-Area', + AreaValue = 'pixelaw-AreaValue', + RTree = 'pixelaw-RTree', + RTreeValue = 'pixelaw-RTreeValue', + Dummy = 'pixelaw-Dummy', + DummyValue = 'pixelaw-DummyValue', + Pixel = 'pixelaw-Pixel', + PixelUpdate = 'pixelaw-PixelUpdate', + PixelValue = 'pixelaw-PixelValue', + QueueItem = 'pixelaw-QueueItem', + QueueItemValue = 'pixelaw-QueueItemValue', + App = 'pixelaw-App', + AppName = 'pixelaw-AppName', + AppNameValue = 'pixelaw-AppNameValue', + AppValue = 'pixelaw-AppValue', + CoreActionsAddress = 'pixelaw-CoreActionsAddress', + CoreActionsAddressValue = 'pixelaw-CoreActionsAddressValue', + Bounds = 'pixelaw-Bounds', + DefaultParameters = 'pixelaw-DefaultParameters', + Emoji = 'pixelaw-Emoji', + Position = 'pixelaw-Position', + AllowedColor = 'pwar-AllowedColor', + AllowedColorValue = 'pwar-AllowedColorValue', + GamePalette = 'pwar-GamePalette', + GamePaletteValue = 'pwar-GamePaletteValue', + InPalette = 'pwar-InPalette', + InPaletteValue = 'pwar-InPaletteValue', + PaletteColors = 'pwar-PaletteColors', + PaletteColorsValue = 'pwar-PaletteColorsValue', + Board = 'pwar-Board', + BoardValue = 'pwar-BoardValue', + GameId = 'pwar-GameId', + GameIdValue = 'pwar-GameIdValue', + PWarPixel = 'pwar-PWarPixel', + PWarPixelValue = 'pwar-PWarPixelValue', + Game = 'pwar-Game', + GameValue = 'pwar-GameValue', + Guild = 'pwar-Guild', + GuildValue = 'pwar-GuildValue', + Player = 'pwar-Player', + PlayerValue = 'pwar-PlayerValue', + PixelRecoveryRate = 'pwar-PixelRecoveryRate', + PixelRecoveryRateValue = 'pwar-PixelRecoveryRateValue', + PlayerVote = 'pwar-PlayerVote', + PlayerVoteValue = 'pwar-PlayerVoteValue', + Proposal = 'pwar-Proposal', + ProposalValue = 'pwar-ProposalValue', + QueueScheduled = 'pixelaw-QueueScheduled', + QueueScheduledValue = 'pixelaw-QueueScheduledValue', + EndedGame = 'pwar-EndedGame', + EndedGameValue = 'pwar-EndedGameValue', + StartedGame = 'pwar-StartedGame', + StartedGameValue = 'pwar-StartedGameValue', + GuildCreated = 'pwar-GuildCreated', + GuildCreatedValue = 'pwar-GuildCreatedValue', + MemberAdded = 'pwar-MemberAdded', + MemberAddedValue = 'pwar-MemberAddedValue', + MemberRemoved = 'pwar-MemberRemoved', + MemberRemovedValue = 'pwar-MemberRemovedValue', + ProposalActivated = 'pwar-ProposalActivated', + ProposalActivatedValue = 'pwar-ProposalActivatedValue', + ProposalCreated = 'pwar-ProposalCreated', + ProposalCreatedValue = 'pwar-ProposalCreatedValue', + Voted = 'pwar-Voted', + VotedValue = 'pwar-VotedValue', +} \ No newline at end of file diff --git a/client/src/config/worlds.json b/client/src/config/worlds.json new file mode 100644 index 0000000..bf6c033 --- /dev/null +++ b/client/src/config/worlds.json @@ -0,0 +1,143 @@ +{ + "local": { + "engine": "dojo", + "description": "Local empty world", + "defaults": { + "color": 123123, + "center": [0, 0], + "zoom": 7000, + "app": "paint" + }, + "config": { + "serverUrl": "http://127.0.0.1:3000", + "rpcUrl": "http://127.0.0.1:5050", + "toriiUrl": "http://127.0.0.1:8080", + "relayUrl": "/ip4/127.0.0.1/tcp/9090", + "feeTokenAddress": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "wallets": { + "burner": { + "masterAddress": "0x127fd5f1fe78a71f8bcd1fec63e3fe2f0486b6ecd5c86a0466c3a21fa5cfcec", + "masterPrivateKey": "0xc5b2fcab997346f3ea1c00b002ecf6f382c5f9c9659a3894eb783c5320f912", + "accountClassHash": "0x07dc7899aa655b0aae51eadff6d801a58e97dd99cf4666ee59e704249e51adf2" + } + }, + "world": "0x01d09b5e00f376337603943fc12715e439e91c0039f353b1cc48bb278dfa99d5" + } + }, + "tunnel": { + "engine": "dojo", + "description": "Tunneled world", + "defaults": { + "color": 123123, + "center": [0, 0], + "zoom": 7000, + "app": "paint" + }, + "config": { + "serverUrl": "https://px.tunnel.devsat.work/api", + "rpcUrl": "https://px.tunnel.devsat.work/rpc", + "toriiUrl": "https://px.tunnel.devsat.work/torii", + "relayUrl": "/ip4/127.0.0.1/tcp/9090", + "feeTokenAddress": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "wallets": { + "burner": { + "masterAddress": "0x127fd5f1fe78a71f8bcd1fec63e3fe2f0486b6ecd5c86a0466c3a21fa5cfcec", + "masterPrivateKey": "0xc5b2fcab997346f3ea1c00b002ecf6f382c5f9c9659a3894eb783c5320f912", + "accountClassHash": "0x07dc7899aa655b0aae51eadff6d801a58e97dd99cf4666ee59e704249e51adf2" + } + }, + "world": "0x01d09b5e00f376337603943fc12715e439e91c0039f353b1cc48bb278dfa99d5" + } + }, + "mud-empty": { + "engine": "mud", + "description": "Local empty world", + "config": { + "serverUrl": "http://127.0.0.1:3000", + "rpcUrl": "http://127.0.0.1:5050", + "toriiUrl": "http://127.0.0.1:8080", + "relayUrl": "", + "feeTokenAddress": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "wallets": { + "burner": { + "masterAddress": "0x127fd5f1fe78a71f8bcd1fec63e3fe2f0486b6ecd5c86a0466c3a21fa5cfcec", + "masterPrivateKey": "0xc5b2fcab997346f3ea1c00b002ecf6f382c5f9c9659a3894eb783c5320f912", + "accountClassHash": "0x07dc7899aa655b0aae51eadff6d801a58e97dd99cf4666ee59e704249e51adf2" + }, + "controller": { + "rpcUrl": "https://api.cartridge.gg/x/starknet/mainnet", + "profileUrl": "https://api.cartridge.gg/x/starknet/mainnet", + "url": "https://api.cartridge.gg/x/starknet/mainnet" + } + }, + "world": "0x1869796b1c25976fc5f4b08ca84995945aa68a8850d3739c96e4c9994456ed7" + } + }, + "sepolia": { + "engine": "dojo", + "description": "Sepolia: https://sepolia.pixelaw.xyz", + "config": { + "serverUrl": "https://sepolia.pixelaw.xyz", + "rpcUrl": "https://starknet-sepolia.public.blastapi.io/rpc/v0_7", + "toriiUrl": "https://torii.sepolia.pixelaw.xyz", + "relayUrl": "https://relay.sepolia.pixelaw.xyz", + "feeTokenAddress": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "wallets": { + "controller": { + "rpcUrl": "https://api.cartridge.gg/x/starknet/sepolia", + "profileUrl": "https://api.cartridge.gg/x/starknet/sepolia", + "url": "https://api.cartridge.gg/x/starknet/sepolia" + } + }, + "world": "0x6f130c8e150882e39cbe878c650c8f35c86579180dbc77d0c1cbe169449b5f6" + } + }, + "demo": { + "engine": "dojo", + "description": "Demo server: https://demo.pixelaw.xyz", + "config": { + "serverUrl": "https://demo.pixelaw.xyz", + "rpcUrl": "https://demo.pixelaw.xyz/rpc", + "toriiUrl": "https://demo.pixelaw.xyz/torii", + "relayUrl": "/ip4/127.0.0.1/tcp/9090", + "feeTokenAddress": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "wallets": { + "burner": { + "masterAddress": "0x127fd5f1fe78a71f8bcd1fec63e3fe2f0486b6ecd5c86a0466c3a21fa5cfcec", + "masterPrivateKey": "0xc5b2fcab997346f3ea1c00b002ecf6f382c5f9c9659a3894eb783c5320f912", + "accountClassHash": "0x07dc7899aa655b0aae51eadff6d801a58e97dd99cf4666ee59e704249e51adf2" + }, + "controller": { + "rpcUrl": "https://api.cartridge.gg/x/starknet/mainnet", + "profileUrl": "https://api.cartridge.gg/x/starknet/mainnet", + "url": "https://api.cartridge.gg/x/starknet/mainnet" + } + }, + "world": "0x01d09b5e00f376337603943fc12715e439e91c0039f353b1cc48bb278dfa99d5" + } + }, + "mainnet": { + "engine": "dojo", + "description": "Mainnet server: https://mainnet.pixelaw.xyz", + "config": { + "serverUrl": "https://mainnet.pixelaw.xyz", + "rpcUrl": "https://katana.mainnet.pixelaw.xyz", + "toriiUrl": "https://torii.mainnet.pixelaw.xyz", + "relayUrl": "https://relay.mainnet.pixelaw.xyz", + "feeTokenAddress": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "wallets": { + "burner": { + "masterAddress": "0x127fd5f1fe78a71f8bcd1fec63e3fe2f0486b6ecd5c86a0466c3a21fa5cfcec", + "masterPrivateKey": "0xc5b2fcab997346f3ea1c00b002ecf6f382c5f9c9659a3894eb783c5320f912", + "accountClassHash": "0x07dc7899aa655b0aae51eadff6d801a58e97dd99cf4666ee59e704249e51adf2" + }, + "controller": { + "rpcUrl": "https://api.cartridge.gg/x/starknet/mainnet", + "profileUrl": "https://api.cartridge.gg/x/starknet/mainnet", + "url": "https://api.cartridge.gg/x/starknet/mainnet" + } + }, + "world": "0x2bf4d3aa0dced89d37d8c3b4ff6a05895c0af32ff3baf9b02abf8504e53eaad" + } + } +} diff --git a/client/src/constants/index.ts b/client/src/constants/index.ts deleted file mode 100644 index b9f66be..0000000 --- a/client/src/constants/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -export const APP_NAME = "p/war"; -export const ZERO_ADDRESS = "0x0"; -export const NAMESPACE = "pixelaw"; - -export const sounds = { - placeColor: "/assets/sounds/effects/place_color.mp3", - success: "/assets/sounds/effects/success.mp3", - error: "/assets/sounds/effects/error.mp3", -}; - -export const HEADER_HEIGHT = 50; - -export const DEFAULT_BOARD_SIZE = 50; -export const DEFAULT_GAME_ID = 1; -export const NEEDED_YES_VOTING_POWER = 1; -export const DEFAULT_COLOR_PALLETTE = [ - { r: 1, g: 1, b: 1, a: 1 }, - { r: 0, g: 0, b: 0, a: 1 }, - { r: 0.29411764705882354, g: 0, b: 0.5098039215686274, a: 1 }, - { r: 1, g: 0, b: 0, a: 1 }, - { r: 0, g: 0, b: 1, a: 1 }, - { r: 1, g: 1, b: 0, a: 1 }, - { r: 1, g: 0.4980392156862745, b: 0, a: 1 }, - { r: 0, g: 1, b: 0, a: 1 }, - { r: 0.5803921568627451, g: 0, b: 0.8274509803921568, a: 1 }, -]; diff --git a/client/src/constants/webgl.ts b/client/src/constants/webgl.ts deleted file mode 100644 index 6ee60a5..0000000 --- a/client/src/constants/webgl.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { type Color } from "@/types"; - -export const DEFAULT_BACKGROUND_COLOR: Color = { r: 0.01, g: 0.01, b: 0.01, a: 0.8 }; -export const DEFAULT_GRID_COLOR: Color = { r: 0.8, g: 0.8, b: 0.8, a: 0.8 }; -export const MAX_SCALE = 2; -export const MIN_SCALE = 0.6; -export const BASE_CELL_SIZE = 50; -export const SWIPE_THRESHOLD = 10; // pixels -export const BUFFER_RATIO = 1.5; -export const BASE_LINE_WIDTH = 1.0; -export const BUFFER_PIXEL_RANGE = 30; -export const BUFFER_BOARD_RANGE = 10; -export const MAX_UINT32 = 4294967295; diff --git a/client/src/contexts/DojoContext.tsx b/client/src/contexts/DojoContext.tsx deleted file mode 100644 index c134368..0000000 --- a/client/src/contexts/DojoContext.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { type BurnerAccount, useBurnerManager } from "@dojoengine/create-burner"; -import { type ReactNode, createContext, useContext, useMemo } from "react"; -import { Account } from "starknet"; -import { type SetupResult } from "@/libs/dojo/setup"; -import { useAccount } from "@starknet-react/core"; - -interface DojoContextType extends SetupResult { - masterAccount: Account; - account: BurnerAccount; - connectedAccount: Account | undefined; -} - -export const DojoContext = createContext(null); - -export const DojoProvider = ({ children, value }: { children: ReactNode; value: SetupResult }) => { - const currentValue = useContext(DojoContext); - if (currentValue) throw new Error("DojoProvider can only be used once"); - - const { - config: { masterAddress, masterPrivateKey }, - burnerManager, - dojoProvider, - } = value; - - const masterAccount = useMemo( - () => new Account(dojoProvider.provider, masterAddress, masterPrivateKey, "1"), - [masterAddress, masterPrivateKey, dojoProvider.provider], - ); - - const { account: connectedAccount } = useAccount(); - - const { - create, - list, - get, - select, - deselect, - remove, - clear, - account, - isDeploying, - count, - copyToClipboard, - applyFromClipboard, - checkIsDeployed, - } = useBurnerManager({ - burnerManager, - }); - - return ( - - {children} - - ); -}; diff --git a/client/src/declarations.d.ts b/client/src/declarations.d.ts new file mode 100644 index 0000000..1eabbb4 --- /dev/null +++ b/client/src/declarations.d.ts @@ -0,0 +1 @@ +declare module "*.module.css"; diff --git a/client/src/hooks/useBoard.ts b/client/src/hooks/useBoard.ts deleted file mode 100644 index e775281..0000000 --- a/client/src/hooks/useBoard.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { useComponentValue } from "@dojoengine/react"; -import { useDojo } from "./useDojo"; -import { Entity } from "@dojoengine/recs"; -import { getEntityIdFromKeys } from "@dojoengine/utils"; -import { DEFAULT_GAME_ID } from "@/constants"; - -// Always game is single and id = 1 for now -export const useBoard = () => { - const { - setup: { - clientComponents: { Board }, - }, - } = useDojo(); - - const board = useComponentValue(Board, getEntityIdFromKeys([BigInt(DEFAULT_GAME_ID)]) as Entity); - - return { board }; -}; diff --git a/client/src/hooks/useControllerUserName.ts b/client/src/hooks/useControllerUserName.ts deleted file mode 100644 index f4152c6..0000000 --- a/client/src/hooks/useControllerUserName.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { useAccount } from "@starknet-react/core"; -import { useState, useEffect } from "react"; -import CartridgeConnector from "@cartridge/connector"; - -export const useControllerUsername = () => { - const { address, connector } = useAccount(); - const [username, setUsername] = useState(undefined); - - useEffect(() => { - const fetchUsername = async () => { - if (!address || !connector) { - setUsername(undefined); - return; - } - - const cartridgeConnector = connector as CartridgeConnector; - if (typeof cartridgeConnector.username === "function") { - try { - const name = await cartridgeConnector.username(); - setUsername(name); - } catch (error) { - console.error("Error fetching username:", error); - setUsername(undefined); - } - } - }; - - fetchUsername(); - }, [address, connector]); - - return { username }; -}; diff --git a/client/src/hooks/useDojo.ts b/client/src/hooks/useDojo.ts deleted file mode 100644 index 3023089..0000000 --- a/client/src/hooks/useDojo.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { useContext } from "react"; -import { DojoContext } from "@/contexts/DojoContext"; - -export const useDojo = () => { - const context = useContext(DojoContext); - if (!context) throw new Error("The `useDojo` hook must be used within a `DojoProvider`"); - - return { - setup: context, - account: context.account, - connectedAccount: context.connectedAccount, - }; -}; diff --git a/client/src/hooks/useGame.ts b/client/src/hooks/useGame.ts deleted file mode 100644 index 2606f7f..0000000 --- a/client/src/hooks/useGame.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { useComponentValue } from "@dojoengine/react"; -import { useDojo } from "./useDojo"; -import { Entity } from "@dojoengine/recs"; -import { getEntityIdFromKeys } from "@dojoengine/utils"; -import { DEFAULT_GAME_ID } from "@/constants"; - -// Always game is single and id = 1 for now -export const useGame = () => { - const { - setup: { - clientComponents: { Game }, - }, - } = useDojo(); - - const game = useComponentValue(Game, getEntityIdFromKeys([BigInt(DEFAULT_GAME_ID)]) as Entity); - - return { game }; -}; diff --git a/client/src/hooks/useGridState.ts b/client/src/hooks/useGridState.ts deleted file mode 100644 index fbd001a..0000000 --- a/client/src/hooks/useGridState.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useEffect, useState } from "react"; -import { GridState } from "@/types"; -import { useLocalStorage } from "@/hooks/useLocalStorage"; -import { setIdleTask } from "idle-task"; - -export const useGridState = () => { - // LocalStorage - const [storedLastGridState, setStoredLastGridState] = useLocalStorage("lastGridState", { - offsetX: 0, - offsetY: 0, - scale: 1, - }); - const [gridState, setGridState] = useState(storedLastGridState); - - setIdleTask(() => { - setStoredLastGridState(gridState); - }); - - useEffect(() => { - // Initialize the position of the canvas - setGridState(storedLastGridState); - }, []); - - return { - gridState, - setGridState, - setStoredLastGridState, - }; -}; diff --git a/client/src/hooks/useLocalStorage.ts b/client/src/hooks/useLocalStorage.ts deleted file mode 100644 index f943e74..0000000 --- a/client/src/hooks/useLocalStorage.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { useState, useEffect, useCallback } from "react"; - -export const useLocalStorage = (key: string, initialValue: T): [T, (value: T) => void] => { - // Get from local storage then - // parse stored json or return initialValue - const readValue = useCallback((): T => { - if (typeof window === "undefined") { - return initialValue; - } - - try { - const item = window.localStorage.getItem(key); - return item ? JSON.parse(item) : initialValue; - } catch (error) { - console.warn(`Error reading localStorage key "${key}":`, error); - return initialValue; - } - }, [key, initialValue]); - - // State to store our value - // Pass initial state function to useState so logic is only executed once - const [storedValue, setStoredValue] = useState(readValue); - - // Return a wrapped version of useState's setter function that ... - // ... persists the new value to localStorage. - const setValue = (value: T) => { - try { - // Allow value to be a function so we have same API as useState - const valueToStore = value instanceof Function ? value(storedValue) : value; - // Save state - setStoredValue(valueToStore); - // Save to local storage - if (typeof window !== "undefined") { - window.localStorage.setItem(key, JSON.stringify(valueToStore)); - } - } catch (error) { - console.warn(`Error setting localStorage key "${key}":`, error); - } - }; - - useEffect(() => { - setStoredValue(readValue()); - }, []); - - return [storedValue, setValue]; -}; diff --git a/client/src/hooks/usePalleteColors.ts b/client/src/hooks/usePalleteColors.ts deleted file mode 100644 index bdaccc3..0000000 --- a/client/src/hooks/usePalleteColors.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { useEntityQuery } from "@dojoengine/react"; -import { useDojo } from "./useDojo"; -import { getComponentValue, Has } from "@dojoengine/recs"; -import { uint32ToRgba } from "@/utils"; -import { useMemo } from "react"; -import { DEFAULT_COLOR_PALLETTE } from "@/constants"; - -export const usePaletteColors = () => { - const { - setup: { - clientComponents: { PaletteColors }, - }, - } = useDojo(); - - const paletteColorEntities = useEntityQuery([Has(PaletteColors)]); - const paletteColors = useMemo(() => { - const colors = paletteColorEntities - .map((entity) => { - const value = getComponentValue(PaletteColors, entity); - if (value) { - return uint32ToRgba(value.color); - } - }) - .filter((color) => color !== undefined); - - return colors.length === 0 ? DEFAULT_COLOR_PALLETTE : colors; - }, [paletteColorEntities, PaletteColors]); - - return paletteColors; -}; diff --git a/client/src/hooks/usePixelRecoveryRate.ts b/client/src/hooks/usePixelRecoveryRate.ts deleted file mode 100644 index 92f6cb6..0000000 --- a/client/src/hooks/usePixelRecoveryRate.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { useComponentValue } from "@dojoengine/react"; -import { useDojo } from "./useDojo"; -import { getEntityIdFromKeys } from "@dojoengine/utils"; -import { Entity } from "@dojoengine/recs"; - -// Always game is single and id = 1 for now -export const usePixelRecoveryRate = () => { - const { - setup: { - clientComponents: { PixelRecoveryRate }, - }, - } = useDojo(); - - const pixelRecoveryRate = useComponentValue(PixelRecoveryRate, getEntityIdFromKeys([BigInt(1)]) as Entity); - - return { pixelRecoveryRate }; -}; diff --git a/client/src/hooks/usePlayer.ts b/client/src/hooks/usePlayer.ts deleted file mode 100644 index 11a2881..0000000 --- a/client/src/hooks/usePlayer.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { getEntityIdFromKeys } from "@dojoengine/utils"; -import { useMemo } from "react"; -import { useDojo } from "./useDojo"; -import { useComponentValue } from "@dojoengine/react"; -import { Entity } from "@dojoengine/recs"; - -export const usePlayer = () => { - const { - setup: { - account: { account }, - clientComponents: { Player }, - connectedAccount, - }, - } = useDojo(); - const activeAccount = useMemo(() => connectedAccount || account, [connectedAccount, account]); - - const key = useMemo(() => getEntityIdFromKeys([BigInt(activeAccount?.address)]) as Entity, [activeAccount?.address]); - const player = useComponentValue(Player, key); - - return { player }; -}; diff --git a/client/src/hooks/useProposal.ts b/client/src/hooks/useProposal.ts deleted file mode 100644 index b7ee491..0000000 --- a/client/src/hooks/useProposal.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { useEntityQuery } from "@dojoengine/react"; -import { useDojo } from "./useDojo"; -import { getComponentValue, HasValue } from "@dojoengine/recs"; -import { Entity } from "@dojoengine/torii-client"; -import { useEffect, useMemo } from "react"; -import { toast } from "sonner"; -import { createProposalTitle, formatWalletAddressWithEmoji } from "@/utils"; -import { getProposalFromEntity } from "@/libs/dojo/helper"; - -export const useProposals = (gameId: number) => { - const { - setup: { - toriiClient, - clientComponents: { Proposal }, - }, - } = useDojo(); - - const proposalEntities = useEntityQuery([HasValue(Proposal, { game_id: gameId })]); - - const proposals = useMemo(() => { - return proposalEntities - .map((entity) => getComponentValue(Proposal, entity)) - .filter((proposal) => proposal !== undefined); - }, [proposalEntities, Proposal]); - - // Effects - useEffect(() => { - const subscription = async () => { - const sub = await toriiClient.onEntityUpdated( - [ - { - Keys: { - keys: [], - pattern_matching: "VariableLen", - models: ["pixelaw-Proposal"], - }, - }, - ], - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (_entityId: any, entity: Entity) => { - const updatedProposal = getProposalFromEntity(entity); - - // 1. if this proposal is new or not - const isNewProposal = proposals.find((p) => p.index === updatedProposal.index) === undefined; - - if (isNewProposal) { - toast.success("New Proposal Submitted", { - description: `by ${formatWalletAddressWithEmoji("0x" + updatedProposal.author.toString(16))}`, - }); - } else { - const title = createProposalTitle( - updatedProposal.proposal_type, - updatedProposal.target_args_1, - updatedProposal.target_args_2, - ); - // 2. if it'snot, need to detect what's changed - const oldProposal = proposals.find((p) => p.index === updatedProposal.index); - if (oldProposal) { - const isActivated = oldProposal.is_activated !== updatedProposal.is_activated; - if (isActivated) { - toast.success("Proposal activated", { - description: `${title}`, - }); - } else if (oldProposal.yes_voting_power < updatedProposal.yes_voting_power) { - toast.success("Voted in favor", { - description: `${title}`, - }); - } else if (oldProposal.no_voting_power < updatedProposal.no_voting_power) { - toast.error("Voted against", { - description: `${title}`, - }); - } - } - } - }, - ); - - return sub; - }; - - const sub = subscription(); - return () => { - sub.then((sub) => sub.cancel()); - }; - }, [toriiClient, proposals]); - - return { proposals }; -}; diff --git a/client/src/hooks/useWebGL.ts b/client/src/hooks/useWebGL.ts deleted file mode 100644 index f0a7df8..0000000 --- a/client/src/hooks/useWebGL.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { useCallback, useEffect, useRef } from "react"; -import { type Pixel, type GridState } from "@/types"; - -import gridVsSource from "@/libs/webgl/shaders/grid.vs"; -import gridFsSource from "@/libs/webgl/shaders/grid.fs"; -import pixelVsSource from "@/libs/webgl/shaders/pixel.vs"; -import pixelFsSource from "@/libs/webgl/shaders/pixel.fs"; -import boardVsSource from "@/libs/webgl/shaders/board.vs"; -import boardFsSource from "@/libs/webgl/shaders/board.fs"; - -import { - createProgramInfo, - createBufferInfoFromArrays, - setBuffersAndAttributes, - setUniforms, - drawBufferInfo, - resizeCanvasToDisplaySize, - ProgramInfo, -} from "twgl.js"; - -import { BASE_CELL_SIZE, BASE_LINE_WIDTH, BUFFER_RATIO, DEFAULT_GRID_COLOR, MIN_SCALE } from "@/constants/webgl"; -import { getVisibleArea } from "@/utils/canvas"; - -export const useWebGL = (canvasRef: React.RefObject, gridState: GridState) => { - const glRef = useRef(null); - const gridProgramInfoRef = useRef(null); - const pixelProgramInfoRef = useRef(null); - const boardProgramInfoRef = useRef(null); - - const initWebGL = useCallback(() => { - const canvas = canvasRef.current; - if (!canvas) return; - - const gl = canvas.getContext("webgl2"); - if (!gl) { - console.error("WebGL not supported"); - return; - } - - glRef.current = gl; - gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); - resizeCanvasToDisplaySize(canvas); - gridProgramInfoRef.current = createProgramInfo(gl, [gridVsSource, gridFsSource]); - pixelProgramInfoRef.current = createProgramInfo(gl, [pixelVsSource, pixelFsSource]); - boardProgramInfoRef.current = createProgramInfo(gl, [boardVsSource, boardFsSource]); - - gl.clearColor(0, 0, 0, 0.8); - gl.clear(gl.COLOR_BUFFER_BIT); - }, [canvasRef]); - - const drawGrid = useCallback(() => { - const gl = glRef.current; - if (!gl) { - console.error("WebGL not supported"); - return; - } - - const gridProgramInfo = gridProgramInfoRef.current; - if (!gridProgramInfo) { - console.error("ProgramInfo not initialized"); - return; - } - - const { startX, startY, endX, endY } = getVisibleArea(gl.canvas as HTMLCanvasElement, gridState); - const darker = gridState.scale > MIN_SCALE * BUFFER_RATIO ? 1.0 : 0.5; - - // グリッドの描画 - const gridPositions: number[] = []; - for (let x = startX; x <= endX; x += BASE_CELL_SIZE) { - gridPositions.push(x, startY, x, endY); - } - for (let y = startY; y <= endY; y += BASE_CELL_SIZE) { - gridPositions.push(startX, y, endX, y); - } - - const gridUniforms = { - uResolution: [gl.canvas.width, gl.canvas.height], - uOffset: [gridState.offsetX, gridState.offsetY], - uScale: gridState.scale, - uLineWidth: BASE_LINE_WIDTH / gridState.scale, - uColor: [ - DEFAULT_GRID_COLOR.r * darker, - DEFAULT_GRID_COLOR.g * darker, - DEFAULT_GRID_COLOR.b * darker, - DEFAULT_GRID_COLOR.a, - ], - }; - - const gridBufferInfo = createBufferInfoFromArrays(gl, { - aPosition: { numComponents: 2, data: gridPositions }, - }); - - gl.useProgram(gridProgramInfo.program); - setBuffersAndAttributes(gl, gridProgramInfo, gridBufferInfo); - setUniforms(gridProgramInfo, gridUniforms); - drawBufferInfo(gl, gridBufferInfo, gl.LINES, gridPositions.length / 2); - }, [gridState]); - - const drawPixels = useCallback( - (pixels: Pixel[]) => { - const gl = glRef.current; - if (!gl) { - console.error("WebGL not supported"); - return; - } - - const pixelProgramInfo = pixelProgramInfoRef.current; - if (!pixelProgramInfo) { - console.error("ProgramInfo not initialized"); - return; - } - - // ピクセルの描画 - const pixelPositions: number[] = []; - const pixelColors: number[] = []; - - const pixelSize = BASE_CELL_SIZE - BASE_LINE_WIDTH / gridState.scale; // Reduce the size slightly to leave space for grid lines - const offset = (BASE_CELL_SIZE - pixelSize) / 2; // Center the smaller pixel within the grid cell - - for (let i = 0; i < pixels.length; i++) { - const pixel = pixels[i]; - const x = pixel.x * BASE_CELL_SIZE + offset; - const y = pixel.y * BASE_CELL_SIZE + offset; - - // Define two triangles for each rectangle (tile) - const positions = [ - x, - y, - x + pixelSize, - y, - x, - y + pixelSize, - x, - y + pixelSize, - x + pixelSize, - y, - x + pixelSize, - y + pixelSize, - ]; - pixelPositions.push(...positions); - for (let i = 0; i < 6; i++) { - pixelColors.push(pixel.color.r, pixel.color.g, pixel.color.b, pixel.color.a); - } - } - - const pixelBufferInfo = createBufferInfoFromArrays(gl, { - aPosition: { numComponents: 2, data: pixelPositions }, - aColor: { numComponents: 4, data: pixelColors }, - }); - - const pixelUniforms = { - uResolution: [gl.canvas.width, gl.canvas.height], - uOffset: [gridState.offsetX, gridState.offsetY], - uScale: gridState.scale, - }; - - gl.useProgram(pixelProgramInfo.program); - setBuffersAndAttributes(gl, pixelProgramInfo, pixelBufferInfo); - setUniforms(pixelProgramInfo, pixelUniforms); - drawBufferInfo(gl, pixelBufferInfo, gl.TRIANGLES, pixelPositions.length / 2); - - const error = gl.getError(); - if (error) { - console.error("WebGL error", error); - } - }, - [gridState], - ); - - useEffect(() => { - initWebGL(); - }, [initWebGL]); - - return { glRef, drawGrid, drawPixels }; -}; diff --git a/client/src/index.css b/client/src/index.css new file mode 100644 index 0000000..09a4ad4 --- /dev/null +++ b/client/src/index.css @@ -0,0 +1,209 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + height: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +html, +body { + margin: 0; + padding: 0; + height: 100%; + width: 100%; + box-sizing: border-box; +} + +body { + display: flex; + flex-direction: column; + /* place-items: center; 削除 */ + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +/*.custom-button {*/ +/* border-radius: 0.5rem;*/ +/* border: none;*/ +/* padding: 0.8em 0.8em;*/ +/* cursor: pointer;*/ +/* outline: none;*/ +/* position: relative;*/ +/* display: flex;*/ +/* justify-content: center;*/ +/* align-items: center;*/ +/* font-size: 3rem;*/ +/* width: 100%;*/ +/* height: 100%;*/ +/*}*/ + +/*.custom-button-selected {*/ +/* outline: none;*/ +/*}*/ +/*button:hover {*/ +/* border-color: #646cff;*/ +/*}*/ +/*button:focus,*/ +/*button:focus-visible {*/ +/* outline: 4px auto -webkit-focus-ring-color;*/ +/*}*/ + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} +.loading-message { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: #646cff; + background-color: black; + padding: 20px; + border-radius: 5px; + font-size: 24px; + text-align: center; +} +.error-message { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: white; + background-color: red; + padding: 20px; + border-radius: 5px; + font-size: 24px; + text-align: center; +} + +/* + Interaction below + TODO fix up styling + */ +.emoji-picker-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: white; /* or any other color */ + z-index: 1000; /* Ensure it's above other elements */ + display: flex; + justify-content: center; + align-items: center; +} +.dialog { + position: absolute; /* Position it relative to the nearest positioned ancestor */ + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + border: none; + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + padding: 20px; + height: 300px; + width: 300px; + background-color: #fff; + z-index: 20; /* Ensure it's above the overlay */ +} +.overlay { + position: fixed; /* Cover the entire viewport */ + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); /* Semi-transparent background */ + z-index: 10; /* Ensure it's below the dialog */ +} +.form { + display: flex; + flex-direction: column; + gap: 10px; +} + +.label { + font-size: 16px; + margin-bottom: 5px; + color: #333; /* Darker text for better readability */ +} + +.checkbox { + margin-right: 10px; +} + +/*.button {*/ +/* background-color: #007bff;*/ +/* border: none; !* Remove border for a cleaner look *!*/ +/* border-radius: 4px;*/ +/* color: white;*/ +/* cursor: pointer;*/ +/* padding: 10px;*/ +/* text-align: center;*/ +/* transition: background-color 0.3s ease; !* Smooth transition for hover effect *!*/ +/*}*/ + +/*.cancel-button {*/ +/* background-color: #6c757d;*/ +/*}*/ + +/*.button:hover {*/ +/* background-color: #0056b3; !* Darker shade on hover *!*/ +/* opacity: 0.9;*/ +/*}*/ + +.pickerPanel { + position: fixed; + /*top: 50%;*/ + bottom: 6.5rem; + left: 50%; + transform: translate(-50%, 0); + background-color: white; + border: 1px solid #ccc; + padding: 0; + z-index: 1000; + width: 50vw; + box-sizing: border-box; +} +@media (max-width: 768px) { + /* Adjust the breakpoint as needed */ + .pickerPanel { + width: 100vw; /* Full width for smaller screens like iPhones */ + } +} +@media (min-width: 769px) { + .pickerPanel { + width: 50vw; /* Half width for larger screens like desktops */ + } +} diff --git a/client/src/index.scss b/client/src/index.scss deleted file mode 100644 index 902cca0..0000000 --- a/client/src/index.scss +++ /dev/null @@ -1,86 +0,0 @@ -@import url("https://fonts.googleapis.com/css2?family=Play:wght@400;700&display=swap"); -@import url("https://fonts.googleapis.com/css2?family=Silkscreen:wght@400;700&display=swap"); - -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - :root { - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; - --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; - --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; - --primary: 222.2 47.4% 11.2%; - --primary-foreground: 210 40% 98%; - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - --ring: 222.2 84% 4.9%; - --radius: 0.5rem; - --chart-1: 12 76% 61%; - --chart-2: 173 58% 39%; - --chart-3: 197 37% 24%; - --chart-4: 43 74% 66%; - --chart-5: 27 87% 67%; - } - - .dark { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; - --primary: 210 40% 98%; - --primary-foreground: 222.2 47.4% 11.2%; - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - --accent: 217.2 32.6% 17.5%; - --accent-foreground: 210 40% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - --ring: 212.7 26.8% 83.9%; - --chart-1: 220 70% 50%; - --chart-2: 160 60% 45%; - --chart-3: 30 80% 55%; - --chart-4: 280 65% 60%; - --chart-5: 340 75% 55%; - } -} - -@layer base { - * { - font-family: "Silkscreen", sans-serif; - user-select: none; - -webkit-user-select: none; // Disable text selection - } - body { - @apply bg-background text-foreground; - position: fixed; - width: 100%; - height: 100%; - background-color: rgba(0.01, 0.01, 0.01, 0.8); - overflow: hidden; // hide scrollbars - overscroll-behavior: none; // prevent bounce or other reactive when user scroll over the screen - } - - canvas { - -webkit-user-drag: none; - touch-action: none; - -webkit-overflow-scrolling: touch; // Enable smooth scrolling on iOS - } -} diff --git a/client/src/index.tsx b/client/src/index.tsx new file mode 100644 index 0000000..7192e1d --- /dev/null +++ b/client/src/index.tsx @@ -0,0 +1,138 @@ +import Main from "@/Main.tsx"; +import React from "react"; +import ReactDOM from "react-dom/client"; +import "@/index.css"; +import { PixelawProvider, usePixelawProvider } from "@pixelaw/react"; +import { BrowserRouter } from "react-router-dom"; +import { DojoEngine } from "@pixelaw/core-dojo"; +import { MudEngine } from "@pixelaw/core-mud"; +import { getCoreDefaultsFromUrl, getWorldForUrl } from "@/utils.ts"; +import { StarknetChainProvider } from "@pixelaw/react-dojo"; +import type { WorldsRegistry } from "@pixelaw/core"; +import worldsRegistry from "@/config/worlds.json"; +import { setupWorld } from "@/config/contracts.gen"; +import type { DojoWallet } from "@pixelaw/core-dojo"; +import { PwarContext } from "./provider/PwarContext"; +import { pwarManifest } from "./config/manifest.contracts"; + + +const AppContent = React.memo(() => { + const { coreStatus, pixelawCore } = usePixelawProvider() + + React.useEffect(() => { + if (coreStatus !== "ready" && coreStatus !== "readyWithoutWallet" && coreStatus !== "initAccount") { + const timer = setTimeout(() => { + console.log("Auto-refreshing after 5 seconds of loading..."); + window.location.reload(); + }, 5000); + return () => clearTimeout(timer); + } + }, [coreStatus]); + + const contextValue = React.useMemo(() => { + if (!pixelawCore) { + console.log("pixelawCore is not available"); + return null; + } + + if (coreStatus !== "ready" && coreStatus !== "readyWithoutWallet") { + console.log("Core status is not ready:", coreStatus); + return null; + } + + try { + const account = pixelawCore.account; + const wallet = pixelawCore.wallet as DojoWallet; + const provider = pixelawCore.engine["dojoSetup"]?.provider; + + if (!provider) { + console.error("Provider is not available in dojoSetup"); + return null; + } + + const manifest = pixelawCore.engine["dojoSetup"].manifest; + const mergedContracts = [...manifest.contracts, ...pwarManifest]; + pixelawCore.engine["dojoSetup"].manifest.contracts = mergedContracts; + const world = setupWorld(provider); + + return { account, wallet, provider, world }; + } catch (error) { + console.error("Error setting up context:", error); + return null; + } + }, [pixelawCore, coreStatus]); + + // if (coreStatus === "error") { + // return
Error occurred, check the logs
+ // } + if (coreStatus === "initAccount") { + return ( + + +
Pls wait 🧘 : Initializing account
+
+
+ ) + } + if ( + (coreStatus === "ready" || coreStatus === "readyWithoutWallet") && contextValue) + { + return ( + + + + {" "} +
+ + + + ); + } + + return
Pls wait 🧘 : Loading (Auto-refreshing in 5s)
+}); + +const App = () => { + console.log("Initializing App with:", { + worldsRegistry, + world, + engines, + coreDefaults + }); + + return ( + + + + ); +}; + +const { protocol, hostname } = window.location; +const baseUrl = `${protocol}//${hostname}`; + +const world = getWorldForUrl( + worldsRegistry as WorldsRegistry, + baseUrl, + "local", +); + +const rootElement = document.getElementById("root"); + +const engines = { dojo: DojoEngine, mud: MudEngine }; + +const coreDefaults = getCoreDefaultsFromUrl(); + +if (rootElement) { + ReactDOM.createRoot(rootElement).render( + + + , + ); +} else { + console.error("Failed to find the root element"); +} diff --git a/client/src/lib/remotelog.js b/client/src/lib/remotelog.js new file mode 100644 index 0000000..dced071 --- /dev/null +++ b/client/src/lib/remotelog.js @@ -0,0 +1,49 @@ +function postLogs({ message }) { + const body = JSON.stringify([getDeviceType(), message]); + fetch("/logs", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body, + }).catch((error) => console.error(`Error1:', ${error}`)); +} + +function getStackTrace() { + const error = new Error(); + const stack = error.stack || ""; + const stackLines = stack.split("\n"); + // Adjust the index based on where you want to capture the stack trace from + return stackLines[3] || ""; +} + +if (isMobileDevice()) { + const _originalConsoleLog = console.log; + const _originalConsoleError = console.error; + const _originalConsoleWarn = console.warn; + + console.log = (...args) => { + const message = `${args.join(" ")} | ${getStackTrace()}`; + postLogs({ type: "log", message }); + }; + + console.error = (...args) => { + const message = `${args.join(" ")} | ${getStackTrace()}`; + postLogs({ type: "error", message }); + }; + + console.warn = (...args) => { + const message = `${args.join(" ")} | ${getStackTrace()}`; + postLogs({ type: "warn", message }); + }; +} + +function getDeviceType() { + const userAgent = navigator.userAgent; + const match = userAgent.match(/(Android|iPhone)/i); + return match ? match[0] : "Other"; +} + +function isMobileDevice() { + return /Mobi|Android/i.test(navigator.userAgent); +} diff --git a/client/src/libs/cartriggeController/index.ts b/client/src/libs/cartriggeController/index.ts deleted file mode 100644 index a217af1..0000000 --- a/client/src/libs/cartriggeController/index.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Connector } from "@starknet-react/core"; -import CartridgeConnector from "@cartridge/connector"; -import { getContractByName } from "@dojoengine/core"; -import { ControllerOptions } from "@cartridge/controller"; -import { manifest } from "../../../dojoConfig"; - -const p_war_actions = getContractByName(manifest, "pixelaw", "p_war_actions"); -if (!p_war_actions?.address) { - throw new Error("pixelaw-p_war_actions contract not found"); -} -const propose_actions = getContractByName(manifest, "pixelaw", "propose_actions"); -if (!propose_actions?.address) { - throw new Error("pixelaw-propose_actions contract not found"); -} -const voting_actions = getContractByName(manifest, "pixelaw", "voting_actions"); -if (!voting_actions?.address) { - throw new Error("pixelaw-voting_actions contract not found"); -} - -const guild_actions = getContractByName(manifest, "pixelaw", "guild_actions"); -if (!guild_actions?.address) { - throw new Error("pixelaw-guild_actions contract not found"); -} - -const policies = [ - { - target: import.meta.env.VITE_PUBLIC_FEE_TOKEN_ADDRESS, - method: "approve", - }, - // p_war_actions - { - target: p_war_actions.address, - method: "interact", - }, - // propose_actions - { - target: propose_actions.address, - method: "create_proposal", - }, - { - target: propose_actions.address, - method: "activate_proposal", - }, - // vote_actions - { - target: voting_actions.address, - method: "vote", - }, - // guild_actions - { - target: guild_actions.address, - method: "create_guild", - }, - { - target: guild_actions.address, - method: "add_member", - }, - { - target: guild_actions.address, - method: "remove_member", - }, -]; -const options: ControllerOptions = { - rpc: import.meta.env.VITE_PUBLIC_RPC_URL, - policies, - paymaster: { - caller: "0x1091e8bd03d373366cc8fd0adaeac683293a67eeb1e5a9e2c68677ce2c77cb2", - }, -}; - -const cartridgeConnector = new CartridgeConnector(options) as never as Connector; - -export default cartridgeConnector; diff --git a/client/src/libs/dojo/createClientComponents.ts b/client/src/libs/dojo/createClientComponents.ts deleted file mode 100644 index 6f06a11..0000000 --- a/client/src/libs/dojo/createClientComponents.ts +++ /dev/null @@ -1,10 +0,0 @@ -// import { overridableComponent } from "@dojoengine/recs"; -import { ContractComponents } from "./typescript/models.gen"; - -export type ClientComponents = ReturnType; - -export function createClientComponents({ contractComponents }: { contractComponents: ContractComponents }) { - return { - ...contractComponents, - }; -} diff --git a/client/src/libs/dojo/createSystemCalls.ts b/client/src/libs/dojo/createSystemCalls.ts deleted file mode 100644 index ee70f54..0000000 --- a/client/src/libs/dojo/createSystemCalls.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { defineSystem, Has, HasValue, World } from "@dojoengine/recs"; -import { ClientComponents } from "./createClientComponents"; -import type { IWorld } from "./typescript/contracts.gen"; -import { Account } from "starknet"; -import { DefaultParameters, Position, ProposalType } from "./typescript/models.gen"; -import { handleTransactionError } from "@/utils"; -import { toast } from "sonner"; - -const handleError = (action: string, error: unknown) => { - console.error(`Error executing ${action}:`, error); - const errorMessage = handleTransactionError(error); - console.info(errorMessage); - toast.error(errorMessage); - throw error; -}; - -export type SystemCalls = ReturnType; - -export function createSystemCalls({ client }: { client: IWorld }, clientComponents: ClientComponents, world: World) { - const interact = async (account: Account, default_params: DefaultParameters) => { - console.log("interact", default_params); - try { - const { transaction_hash } = await client.p_war_actions.interact({ - account, - default_params, - }); - console.log(transaction_hash); - - // // Wait for the indexer to update the entity - // // By doing this we keep the optimistic UI in sync with the actual state - await new Promise((resolve) => { - defineSystem( - world, - [ - Has(clientComponents.PWarPixel), - HasValue(clientComponents.Player, { - address: BigInt(account.address), - }), - ], - () => { - resolve(); - }, - ); - }); - } catch (e) { - handleError("interact", e); - } - }; - - const vote = async (account: Account, game_id: number, index: number, is_in_favor: boolean) => { - try { - const { transaction_hash } = await client.voting_actions.vote({ - account, - game_id, - index, - is_in_favor, - }); - console.log(transaction_hash); - - await new Promise((resolve) => { - defineSystem( - world, - [ - HasValue(clientComponents.Proposal, { - game_id, - }), - HasValue(clientComponents.Game, { - id: game_id, - }), - HasValue(clientComponents.Player, { - address: BigInt(account.address), - }), - ], - () => { - resolve(); - }, - ); - }); - } catch (e) { - handleError("vote", e); - } - }; - - const activateProposal = async (account: Account, gameId: number, index: number, clearData: Position[]) => { - try { - const { transaction_hash } = await client.propose_actions.activate_proposal({ - account, - game_id: gameId, - index, - clear_data: clearData, - }); - console.log(transaction_hash); - - await new Promise((resolve) => { - defineSystem( - world, - [ - HasValue(clientComponents.Proposal, { - game_id: gameId, - }), - HasValue(clientComponents.Game, { - id: gameId, - }), - HasValue(clientComponents.Player, { - address: BigInt(account.address), - }), - ], - () => { - resolve(); - }, - ); - }); - } catch (e) { - handleError("activateProposal", e); - } - }; - - const createProposal = async (account: Account, gameId: number, proposalType: ProposalType, color?: number) => { - try { - const { transaction_hash } = await client.propose_actions.create_proposal({ - account, - game_id: gameId, - proposal_type: proposalType, - target_args_1: color ? color : 0, - target_args_2: 0, - }); - console.log(transaction_hash); - - await new Promise((resolve) => { - defineSystem( - world, - [ - HasValue(clientComponents.Proposal, { - game_id: gameId, - }), - HasValue(clientComponents.Game, { - id: gameId, - }), - HasValue(clientComponents.Player, { - address: BigInt(account.address), - }), - ], - () => { - resolve(); - }, - ); - }); - console.log("Done"); - } catch (e) { - handleError("createProposal", e); - } - }; - - return { - interact, - vote, - createProposal, - activateProposal, - }; -} diff --git a/client/src/libs/dojo/helper.ts b/client/src/libs/dojo/helper.ts deleted file mode 100644 index 8019004..0000000 --- a/client/src/libs/dojo/helper.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Pixel } from "@/types"; -import { ProposalType } from "@/libs/dojo/typescript/models.gen"; -import { uint32ToRgba } from "@/utils"; - -import { Entities, Entity, ToriiClient } from "@dojoengine/torii-client"; - -export const getProposalFromEntity = (entity: Entity) => { - return { - author: BigInt(entity["pixelaw-Proposal"].author.value as string), - start: entity["pixelaw-Proposal"].start.value as number, - proposal_type: entity["pixelaw-Proposal"].proposal_type.value as ProposalType, - target_args_2: entity["pixelaw-Proposal"].target_args_2.value as number, - end: entity["pixelaw-Proposal"].end.value as number, - index: entity["pixelaw-Proposal"].index.value as number, - yes_voting_power: entity["pixelaw-Proposal"].yes_voting_power.value as number, - no_voting_power: entity["pixelaw-Proposal"].no_voting_power.value as number, - target_args_1: entity["pixelaw-Proposal"].target_args_1.value as number, - game_id: entity["pixelaw-Proposal"].game_id.value as number, - is_activated: entity["pixelaw-Proposal"].is_activated.value as boolean, - }; -}; - -export const getPixelComponentValue = (entity: Entity): Pixel => { - return { - x: entity["pixelaw-Pixel"].x.value as number, - y: entity["pixelaw-Pixel"].y.value as number, - color: uint32ToRgba(entity["pixelaw-Pixel"].color.value as number), - }; -}; - -export const getPixelComponentFromEntities = (entities: Entities) => { - return Object.values(entities).map(getPixelComponentValue); -}; - -export const getPixelEntities = async ( - client: ToriiClient, - limit: number, - { - upperLeftX, - upperLeftY, - lowerRightX, - lowerRightY, - }: { upperLeftX: number; upperLeftY: number; lowerRightX: number; lowerRightY: number }, -) => { - const entities = await client.getEntities({ - limit, - offset: 0, - dont_include_hashed_keys: true, - clause: { - Composite: { - operator: "And", - clauses: [ - { - Member: { - model: "pixelaw-Pixel", - member: "x", - operator: "Gte", - value: { Primitive: { U32: upperLeftX } }, - }, - }, - { - Member: { - model: "pixelaw-Pixel", - member: "y", - operator: "Gte", - value: { Primitive: { U32: upperLeftY } }, - }, - }, - { - Member: { - model: "pixelaw-Pixel", - member: "x", - operator: "Lte", - value: { Primitive: { U32: lowerRightX } }, - }, - }, - { - Member: { - model: "pixelaw-Pixel", - member: "y", - operator: "Lte", - value: { Primitive: { U32: lowerRightY } }, - }, - }, - ], - }, - }, - }); - - return entities; -}; diff --git a/client/src/libs/dojo/setup.ts b/client/src/libs/dojo/setup.ts deleted file mode 100644 index e1d24f1..0000000 --- a/client/src/libs/dojo/setup.ts +++ /dev/null @@ -1,80 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { type DojoConfig, DojoProvider } from "@dojoengine/core"; -import * as torii from "@dojoengine/torii-client"; -import { BurnerManager } from "@dojoengine/create-burner"; -import { Account, type ArraySignatureType } from "starknet"; -import { createClientComponents } from "./createClientComponents"; -import { createSystemCalls } from "./createSystemCalls"; -import { defineContractComponents } from "./typescript/models.gen"; -import { world } from "./world"; -import { setupWorld } from "./typescript/contracts.gen"; -import { getSyncEntities, getSyncEvents } from "@dojoengine/state"; - -export type SetupResult = Awaited>; - -export async function setup({ ...config }: DojoConfig) { - // torii client - const toriiClient = await torii.createClient({ - rpcUrl: config.rpcUrl, - toriiUrl: config.toriiUrl, - relayUrl: "", - worldAddress: config.manifest.world.address || "", - }); - - // create contract components - const contractComponents = defineContractComponents(world); - - // create client components - const clientComponents = createClientComponents({ contractComponents }); - - // create dojo provider - const dojoProvider = new DojoProvider(config.manifest, config.rpcUrl); - - // Sync all events - const eventSync = await getSyncEvents(toriiClient, contractComponents as any, undefined, []); - - // Sync all entities - const sync = await getSyncEntities(toriiClient, contractComponents as any, undefined, []); - - // setup world - const client = await setupWorld(dojoProvider); - - // create burner manager - const burnerManager = new BurnerManager({ - masterAccount: new Account( - { - nodeUrl: config.rpcUrl, - }, - config.masterAddress, - config.masterPrivateKey, - ), - accountClassHash: config.accountClassHash, - rpcProvider: dojoProvider.provider, - feeTokenAddress: config.feeTokenAddress, - }); - - try { - await burnerManager.init(); - if (burnerManager.list().length === 0) { - await burnerManager.create(); - } - } catch (e) { - console.error(e); - } - - return { - client, - clientComponents, - contractComponents, - systemCalls: createSystemCalls({ client }, clientComponents, world), - publish: (typedData: string, signature: ArraySignatureType) => { - toriiClient.publishMessage(typedData, signature, true); - }, - config, - dojoProvider, - burnerManager, - toriiClient, - sync, - eventSync, - }; -} diff --git a/client/src/libs/dojo/typescript/README.md b/client/src/libs/dojo/typescript/README.md deleted file mode 100644 index 55bc33a..0000000 --- a/client/src/libs/dojo/typescript/README.md +++ /dev/null @@ -1,5 +0,0 @@ -Run this command to generate the typescript bindings: at /contracts dir - -```bash -sozo build --typescript --bindings-output ./src/libs/dojo/typescript/ -``` diff --git a/client/src/libs/dojo/typescript/contracts.gen.ts b/client/src/libs/dojo/typescript/contracts.gen.ts deleted file mode 100644 index d23cc84..0000000 --- a/client/src/libs/dojo/typescript/contracts.gen.ts +++ /dev/null @@ -1,767 +0,0 @@ -// Generated by dojo-bindgen on Tue, 24 Sep 2024 21:20:34 +0000. Do not modify this file manually. -// Import the necessary types from the recs SDK -// generate again with `sozo build --typescript` -import { Account } from "starknet"; -import { DojoProvider } from "@dojoengine/core"; -import * as models from "./models.gen"; - -export type IWorld = Awaited>; - -export async function setupWorld(provider: DojoProvider) { - // System definitions for `pixelaw-actions` contract - function actions() { - const contract_name = "actions"; - - // Call the `init` system with the specified Account and calldata - const init = async (props: { account: Account }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "init", - calldata: [], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing init:", error); - throw error; - } - }; - - // Call the `update_permission` system with the specified Account and calldata - const update_permission = async (props: { account: Account; app_key: bigint; permission: models.Permission }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "update_permission", - calldata: [ - props.app_key, - props.permission.app, - props.permission.color, - props.permission.owner, - props.permission.text, - props.permission.timestamp, - props.permission.action, - ], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing update_permission:", error); - throw error; - } - }; - - // Call the `has_write_access` system with the specified Account and calldata - const has_write_access = async (props: { - account: Account; - for_player: bigint; - for_system: bigint; - pixel: models.Pixel; - pixel_update: models.PixelUpdate; - }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "has_write_access", - calldata: [ - props.for_player, - props.for_system, - props.pixel.x, - props.pixel.y, - props.pixel.app, - props.pixel.color, - props.pixel.created_at, - props.pixel.updated_at, - props.pixel.timestamp, - props.pixel.owner, - props.pixel.text, - props.pixel.action, - props.pixel_update, - ], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing has_write_access:", error); - throw error; - } - }; - - // Call the `process_queue` system with the specified Account and calldata - const process_queue = async (props: { - account: Account; - id: bigint; - timestamp: number; - called_system: bigint; - selector: bigint; - calldata: bigint[]; - }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "process_queue", - calldata: [props.id, props.timestamp, props.called_system, props.selector, ...props.calldata], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing process_queue:", error); - throw error; - } - }; - - // Call the `schedule_queue` system with the specified Account and calldata - const schedule_queue = async (props: { - account: Account; - timestamp: number; - called_system: bigint; - selector: bigint; - calldata: bigint[]; - }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "schedule_queue", - calldata: [props.timestamp, props.called_system, props.selector, ...props.calldata], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing schedule_queue:", error); - throw error; - } - }; - - // Call the `update_pixel` system with the specified Account and calldata - const update_pixel = async (props: { - account: Account; - for_player: bigint; - for_system: bigint; - pixel_update: models.PixelUpdate; - }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "update_pixel", - calldata: [props.for_player, props.for_system, props.pixel_update], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing update_pixel:", error); - throw error; - } - }; - - // Call the `new_app` system with the specified Account and calldata - const new_app = async (props: { account: Account; system: bigint; name: bigint; icon: bigint }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "new_app", - calldata: [props.system, props.name, props.icon], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing new_app:", error); - throw error; - } - }; - - // Call the `get_system_address` system with the specified Account and calldata - const get_system_address = async (props: { account: Account; for_system: bigint }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "get_system_address", - calldata: [props.for_system], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing get_system_address:", error); - throw error; - } - }; - - // Call the `get_player_address` system with the specified Account and calldata - const get_player_address = async (props: { account: Account; for_player: bigint }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "get_player_address", - calldata: [props.for_player], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing get_player_address:", error); - throw error; - } - }; - - // Call the `alert_player` system with the specified Account and calldata - const alert_player = async (props: { - account: Account; - position: models.Position; - player: bigint; - message: bigint; - }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "alert_player", - calldata: [props.position.x, props.position.y, props.player, props.message], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing alert_player:", error); - throw error; - } - }; - - // Call the `set_instruction` system with the specified Account and calldata - const set_instruction = async (props: { account: Account; selector: bigint; instruction: bigint }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "set_instruction", - calldata: [props.selector, props.instruction], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing set_instruction:", error); - throw error; - } - }; - - // Call the `world` system with the specified Account and calldata - const world = async (props: { account: Account }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "world", - calldata: [], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing world:", error); - throw error; - } - }; - - return { - init, - update_permission, - has_write_access, - process_queue, - schedule_queue, - update_pixel, - new_app, - get_system_address, - get_player_address, - alert_player, - set_instruction, - world, - }; - } - - // System definitions for `pixelaw-guild_actions` contract - function guild_actions() { - const contract_name = "guild_actions"; - - // Call the `world` system with the specified Account and calldata - const world = async (props: { account: Account }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "world", - calldata: [], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing world:", error); - throw error; - } - }; - - // Call the `create_guild` system with the specified Account and calldata - const create_guild = async (props: { account: Account; game_id: number; guild_name: bigint }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "create_guild", - calldata: [props.game_id, props.guild_name], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing create_guild:", error); - throw error; - } - }; - - // Call the `add_member` system with the specified Account and calldata - const add_member = async (props: { account: Account; game_id: number; guild_id: number; new_member: bigint }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "add_member", - calldata: [props.game_id, props.guild_id, props.new_member], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing add_member:", error); - throw error; - } - }; - - // Call the `remove_member` system with the specified Account and calldata - const remove_member = async (props: { account: Account; game_id: number; guild_id: number; member: bigint }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "remove_member", - calldata: [props.game_id, props.guild_id, props.member], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing remove_member:", error); - throw error; - } - }; - - // Call the `get_guild_points` system with the specified Account and calldata - const get_guild_points = async (props: { account: Account; game_id: number; guild_id: number }) => { - try { - return await provider.call("pixelaw", { - contractName: contract_name, - entrypoint: "get_guild_points", - calldata: [props.game_id, props.guild_id], - }); - } catch (error) { - console.error("Error executing get_guild_points:", error); - throw error; - } - }; - - return { - world, - create_guild, - add_member, - remove_member, - get_guild_points, - }; - } - - // System definitions for `pixelaw-p_war_actions` contract - function p_war_actions() { - const contract_name = "p_war_actions"; - - // Call the `init` system with the specified Account and calldata - const init = async (props: { account: Account }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "init", - calldata: [], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing init:", error); - throw error; - } - }; - - // Call the `interact` system with the specified Account and calldata - const interact = async (props: { account: Account; default_params: models.DefaultParameters }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "interact", - calldata: [props.default_params], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing interact:", error); - throw error; - } - }; - - // Call the `create_game` system with the specified Account and calldata - const create_game = async (props: { account: Account; origin: models.Position }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "create_game", - calldata: [props.origin.x, props.origin.y], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing create_game:", error); - throw error; - } - }; - - // Call the `get_game_id` system with the specified Account and calldata - const get_game_id = async (props: { account: Account; position: models.Position }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "get_game_id", - calldata: [props.position.x, props.position.y], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing get_game_id:", error); - throw error; - } - }; - - // Call the `place_pixel` system with the specified Account and calldata - const place_pixel = async (props: { account: Account; app: bigint; default_params: models.DefaultParameters }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "place_pixel", - calldata: [props.app, props.default_params], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing place_pixel:", error); - throw error; - } - }; - - // Call the `update_pixel` system with the specified Account and calldata - const update_pixel = async (props: { account: Account; pixel_update: models.PixelUpdate }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "update_pixel", - calldata: [props.pixel_update], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing update_pixel:", error); - throw error; - } - }; - - // Call the `end_game` system with the specified Account and calldata - const end_game = async (props: { account: Account; game_id: number }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "end_game", - calldata: [props.game_id], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing end_game:", error); - throw error; - } - }; - - // Call the `world` system with the specified Account and calldata - const world = async (props: { account: Account }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "world", - calldata: [], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing world:", error); - throw error; - } - }; - - // Call the `set_pixel` system with the specified Account and calldata - const set_pixel = async (props: { account: Account; default_params: models.DefaultParameters }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "set_pixel", - calldata: [props.default_params], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing set_pixel:", error); - throw error; - } - }; - - // Call the `on_pre_update` system with the specified Account and calldata - const on_pre_update = async (props: { - account: Account; - pixel_update: models.PixelUpdate; - app_caller: models.App; - player_caller: bigint; - }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "on_pre_update", - calldata: [ - props.pixel_update, - props.app_caller.system, - props.app_caller.name, - props.app_caller.icon, - props.app_caller.action, - props.player_caller, - ], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing on_pre_update:", error); - throw error; - } - }; - - // Call the `on_post_update` system with the specified Account and calldata - const on_post_update = async (props: { - account: Account; - pixel_update: models.PixelUpdate; - app_caller: models.App; - player_caller: bigint; - }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "on_post_update", - calldata: [ - props.pixel_update, - props.app_caller.system, - props.app_caller.name, - props.app_caller.icon, - props.app_caller.action, - props.player_caller, - ], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing on_post_update:", error); - throw error; - } - }; - - return { - init, - interact, - create_game, - get_game_id, - place_pixel, - update_pixel, - end_game, - world, - set_pixel, - on_pre_update, - on_post_update, - }; - } - - // System definitions for `pixelaw-propose_actions` contract - function propose_actions() { - const contract_name = "propose_actions"; - - // Call the `create_proposal` system with the specified Account and calldata - const create_proposal = async (props: { - account: Account; - game_id: number; - proposal_type: number; - target_args_1: number; - target_args_2: number; - }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "create_proposal", - calldata: [props.game_id, props.proposal_type, props.target_args_1, props.target_args_2], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing create_proposal:", error); - throw error; - } - }; - - // Call the `activate_proposal` system with the specified Account and calldata - const activate_proposal = async (props: { - account: Account; - game_id: number; - index: number; - clear_data: models.Position[]; - }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "activate_proposal", - calldata: [props.game_id, props.index, props.clear_data], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing activate_proposal:", error); - throw error; - } - }; - - // Call the `world` system with the specified Account and calldata - const world = async (props: { account: Account }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "world", - calldata: [], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing world:", error); - throw error; - } - }; - - return { - create_proposal, - activate_proposal, - world, - }; - } - - // System definitions for `pixelaw-voting_actions` contract - function voting_actions() { - const contract_name = "voting_actions"; - - // Call the `world` system with the specified Account and calldata - const world = async (props: { account: Account }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "world", - calldata: [], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing world:", error); - throw error; - } - }; - - // Call the `vote` system with the specified Account and calldata - const vote = async (props: { account: Account; game_id: number; index: number; is_in_favor: boolean }) => { - try { - return await provider.execute( - props.account, - { - contractName: contract_name, - entrypoint: "vote", - calldata: [props.game_id, props.index, props.is_in_favor], - }, - "pixelaw", - ); - } catch (error) { - console.error("Error executing vote:", error); - throw error; - } - }; - - return { - world, - vote, - }; - } - - return { - actions: actions(), - guild_actions: guild_actions(), - p_war_actions: p_war_actions(), - propose_actions: propose_actions(), - voting_actions: voting_actions(), - }; -} diff --git a/client/src/libs/dojo/typescript/models.gen.ts b/client/src/libs/dojo/typescript/models.gen.ts deleted file mode 100644 index 9d7cfb1..0000000 --- a/client/src/libs/dojo/typescript/models.gen.ts +++ /dev/null @@ -1,919 +0,0 @@ -// Generated by dojo-bindgen on Tue, 24 Sep 2024 21:20:34 +0000. Do not modify this file manually. -// Import the necessary types from the recs SDK -// generate again with `sozo build --typescript` -import { defineComponent, Type as RecsType, World } from "@dojoengine/recs"; - -export type ContractComponents = Awaited>; - -// Type definition for `dojo::model::layout::Layout` enum -export type Layout = - | { type: "Fixed"; value: RecsType.NumberArray } - | { type: "Struct"; value: RecsType.StringArray } - | { type: "Tuple"; value: RecsType.StringArray } - | { type: "Array"; value: RecsType.StringArray } - | { type: "ByteArray" } - | { type: "Enum"; value: RecsType.StringArray }; - -export const LayoutDefinition = { - type: RecsType.String, - value: RecsType.String, -}; - -// Type definition for `p_war::models::allowed_app::AllowedApp` struct -export interface AllowedApp { - game_id: number; - contract: bigint; - is_allowed: boolean; -} -export const AllowedAppDefinition = { - game_id: RecsType.Number, - contract: RecsType.BigInt, - is_allowed: RecsType.Boolean, -}; - -// Type definition for `core::byte_array::ByteArray` struct -export interface ByteArray { - data: string[]; - pending_word: bigint; - pending_word_len: number; -} -export const ByteArrayDefinition = { - data: RecsType.StringArray, - pending_word: RecsType.BigInt, - pending_word_len: RecsType.Number, -}; - -// Type definition for `dojo::model::layout::FieldLayout` struct -export interface FieldLayout { - selector: bigint; - layout: Layout; -} -export const FieldLayoutDefinition = { - selector: RecsType.BigInt, - layout: LayoutDefinition, -}; - -// Type definition for `p_war::models::allowed_color::AllowedColor` struct -export interface AllowedColor { - game_id: number; - color: number; - is_allowed: boolean; -} -export const AllowedColorDefinition = { - game_id: RecsType.Number, - color: RecsType.Number, - is_allowed: RecsType.Boolean, -}; - -// Type definition for `pixelaw::core::models::registry::App` struct -export interface App { - system: bigint; - name: bigint; - icon: bigint; - action: bigint; -} -export const AppDefinition = { - system: RecsType.BigInt, - name: RecsType.BigInt, - icon: RecsType.BigInt, - action: RecsType.BigInt, -}; - -// Type definition for `pixelaw::core::models::registry::AppName` struct -export interface AppName { - name: bigint; - system: bigint; -} -export const AppNameDefinition = { - name: RecsType.BigInt, - system: RecsType.BigInt, -}; - -// Type definition for `pixelaw::core::models::registry::AppUser` struct -export interface AppUser { - system: bigint; - player: bigint; - action: bigint; -} -export const AppUserDefinition = { - system: RecsType.BigInt, - player: RecsType.BigInt, - action: RecsType.BigInt, -}; - -// Type definition for `pixelaw::core::utils::Position` struct -export interface Position { - x: number; - y: number; -} -export const PositionDefinition = { - x: RecsType.Number, - y: RecsType.Number, -}; - -// Type definition for `p_war::models::board::Board` struct -export interface Board { - id: number; - origin: Position; - width: number; - height: number; -} -export const BoardDefinition = { - id: RecsType.Number, - origin: PositionDefinition, - width: RecsType.Number, - height: RecsType.Number, -}; - -// Type definition for `pixelaw::core::models::registry::CoreActionsAddress` struct -export interface CoreActionsAddress { - key: bigint; - value: bigint; -} -export const CoreActionsAddressDefinition = { - key: RecsType.BigInt, - value: RecsType.BigInt, -}; - -// Type definition for `p_war::models::game::Game` struct -export interface Game { - id: number; - start: number; - end: number; - proposal_idx: number; - coeff_own_pixels: number; - coeff_commits: number; - winner_config: number; - winner: bigint; - guild_ids: number[]; - guild_count: number; -} -export const GameDefinition = { - id: RecsType.Number, - start: RecsType.Number, - end: RecsType.Number, - proposal_idx: RecsType.Number, - coeff_own_pixels: RecsType.Number, - coeff_commits: RecsType.Number, - winner_config: RecsType.Number, - winner: RecsType.BigInt, - guild_ids: RecsType.NumberArray, - guild_count: RecsType.Number, -}; - -// Type definition for `p_war::models::board::GameId` struct -export interface GameId { - x: number; - y: number; - value: number; -} -export const GameIdDefinition = { - x: RecsType.Number, - y: RecsType.Number, - value: RecsType.Number, -}; - -// Type definition for `p_war::models::allowed_color::GamePalette` struct -export interface GamePalette { - game_id: number; - length: number; -} -export const GamePaletteDefinition = { - game_id: RecsType.Number, - length: RecsType.Number, -}; - -// Type definition for `p_war::models::guilds::Guild` struct -export interface Guild { - game_id: number; - guild_id: number; - guild_name: bigint; - creator: bigint; - members: bigint[]; - member_count: number; -} -export const GuildDefinition = { - game_id: RecsType.Number, - guild_id: RecsType.Number, - guild_name: RecsType.BigInt, - creator: RecsType.BigInt, - members: RecsType.BigIntArray, - member_count: RecsType.Number, -}; - -// Type definition for `p_war::models::allowed_color::InPalette` struct -export interface InPalette { - game_id: number; - color: number; - value: boolean; -} -export const InPaletteDefinition = { - game_id: RecsType.Number, - color: RecsType.Number, - value: RecsType.Boolean, -}; - -// Type definition for `pixelaw::core::models::registry::Instruction` struct -export interface Instruction { - system: bigint; - selector: bigint; - instruction: bigint; -} -export const InstructionDefinition = { - system: RecsType.BigInt, - selector: RecsType.BigInt, - instruction: RecsType.BigInt, -}; - -// Type definition for `p_war::models::board::PWarPixel` struct -export interface PWarPixel { - position: Position; - owner: bigint; -} -export const PWarPixelDefinition = { - position: PositionDefinition, - owner: RecsType.BigInt, -}; - -// Type definition for `p_war::models::allowed_color::PaletteColors` struct -export interface PaletteColors { - game_id: number; - idx: number; - color: number; -} -export const PaletteColorsDefinition = { - game_id: RecsType.Number, - idx: RecsType.Number, - color: RecsType.Number, -}; - -// Type definition for `pixelaw::core::models::permissions::Permission` struct -export interface Permission { - app: boolean; - color: boolean; - owner: boolean; - text: boolean; - timestamp: boolean; - action: boolean; -} -export const PermissionDefinition = { - app: RecsType.Boolean, - color: RecsType.Boolean, - owner: RecsType.Boolean, - text: RecsType.Boolean, - timestamp: RecsType.Boolean, - action: RecsType.Boolean, -}; - -// Type definition for `pixelaw::core::models::permissions::Permissions` struct -export interface Permissions { - allowing_app: bigint; - allowed_app: bigint; - permission: Permission; -} -export const PermissionsDefinition = { - allowing_app: RecsType.BigInt, - allowed_app: RecsType.BigInt, - permission: PermissionDefinition, -}; - -// Type definition for `pixelaw::core::models::pixel::Pixel` struct -export interface Pixel { - x: number; - y: number; - app: bigint; - color: number; - created_at: number; - updated_at: number; - timestamp: number; - owner: bigint; - text: bigint; - action: bigint; -} -export const PixelDefinition = { - x: RecsType.Number, - y: RecsType.Number, - app: RecsType.BigInt, - color: RecsType.Number, - created_at: RecsType.Number, - updated_at: RecsType.Number, - timestamp: RecsType.Number, - owner: RecsType.BigInt, - text: RecsType.BigInt, - action: RecsType.BigInt, -}; - -export interface PixelUpdate { - x: number; - y: number; - color?: number; - owner?: bigint; - app?: bigint; - text?: bigint; - timestamp?: number; - action?: bigint; -} -export const PixelUpdateDefinition = { - x: RecsType.Number, - y: RecsType.Number, - color: RecsType.OptionalNumber, - owner: RecsType.OptionalBigInt, - app: RecsType.OptionalBigInt, - text: RecsType.OptionalBigInt, - timestamp: RecsType.OptionalNumber, - action: RecsType.OptionalBigInt, -}; - -// Type definition for `p_war::models::proposal::PixelRecoveryRate` struct -export interface PixelRecoveryRate { - game_id: number; - rate: number; -} -export const PixelRecoveryRateDefinition = { - game_id: RecsType.Number, - rate: RecsType.Number, -}; - -// Type definition for `p_war::models::player::Player` struct -export interface Player { - address: bigint; - num_owns: number; - num_commit: number; - last_date: number; - is_banned: boolean; -} -export const PlayerDefinition = { - address: RecsType.BigInt, - num_owns: RecsType.Number, - num_commit: RecsType.Number, - last_date: RecsType.Number, - is_banned: RecsType.Boolean, -}; - -// Type definition for `p_war::models::proposal::PlayerVote` struct -export interface PlayerVote { - player: bigint; - game_id: number; - index: number; - is_in_favor: boolean; - voting_power: number; -} -export const PlayerVoteDefinition = { - player: RecsType.BigInt, - game_id: RecsType.Number, - index: RecsType.Number, - is_in_favor: RecsType.Boolean, - voting_power: RecsType.Number, -}; - -// Type definition for `p_war::models::proposal::Proposal` struct -export interface Proposal { - game_id: number; - index: number; - author: bigint; - proposal_type: number; - target_args_1: number; - target_args_2: number; - start: number; - end: number; - yes_voting_power: number; - no_voting_power: number; - is_activated: boolean; -} -export const ProposalDefinition = { - game_id: RecsType.Number, - index: RecsType.Number, - author: RecsType.BigInt, - proposal_type: RecsType.Number, - target_args_1: RecsType.Number, - target_args_2: RecsType.Number, - start: RecsType.Number, - end: RecsType.Number, - yes_voting_power: RecsType.Number, - no_voting_power: RecsType.Number, - is_activated: RecsType.Boolean, -}; - -export enum ProposalType { - Unknown, - // ToggleAllowedApp, - AddNewColor, - ResetToWhiteByColor, - ExtendGameEndTime, - ExpandArea, - // ChangeGameDuration, - // ChangePixelRecovery, - // ExpandArea, - // BanPlayerAddress, - // ChangeMaxPXConfig, - // ChangeWinnerConfig, - // ChangePaintCost, - // MakeADisasterByCoordinates, - // ResetToWhiteByCoordinates, - // MakeADisasterByColor, -} - -// Type definition for `pixelaw::core::models::queue::QueueItem` struct -export interface QueueItem { - id: bigint; - valid: boolean; -} -export const QueueItemDefinition = { - id: RecsType.BigInt, - valid: RecsType.Boolean, -}; - -// Type definition for `DefaultParameters` struct -export interface DefaultParameters { - for_player: bigint; - for_system: bigint; - position: Position; - color: number; -} - -export const DefaultParametersDefinition = { - for_player: RecsType.BigInt, - for_system: RecsType.BigInt, - position: PositionDefinition, - color: RecsType.Number, -}; - -export function defineContractComponents(world: World) { - return { - // Model definition for `p_war::models::allowed_app::AllowedApp` model - AllowedApp: (() => { - return defineComponent( - world, - { - game_id: RecsType.Number, - contract: RecsType.BigInt, - is_allowed: RecsType.Boolean, - }, - { - metadata: { - namespace: "pixelaw", - name: "AllowedApp", - types: ["u32", "ContractAddress", "bool"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::allowed_color::AllowedColor` model - AllowedColor: (() => { - return defineComponent( - world, - { - game_id: RecsType.Number, - color: RecsType.Number, - is_allowed: RecsType.Boolean, - }, - { - metadata: { - namespace: "pixelaw", - name: "AllowedColor", - types: ["u32", "u32", "bool"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `pixelaw::core::models::registry::App` model - App: (() => { - return defineComponent( - world, - { - system: RecsType.BigInt, - name: RecsType.BigInt, - icon: RecsType.BigInt, - action: RecsType.BigInt, - }, - { - metadata: { - namespace: "pixelaw", - name: "App", - types: ["ContractAddress", "felt252", "felt252", "felt252"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `pixelaw::core::models::registry::AppName` model - AppName: (() => { - return defineComponent( - world, - { - name: RecsType.BigInt, - system: RecsType.BigInt, - }, - { - metadata: { - namespace: "pixelaw", - name: "AppName", - types: ["felt252", "ContractAddress"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `pixelaw::core::models::registry::AppUser` model - AppUser: (() => { - return defineComponent( - world, - { - system: RecsType.BigInt, - player: RecsType.BigInt, - action: RecsType.BigInt, - }, - { - metadata: { - namespace: "pixelaw", - name: "AppUser", - types: ["ContractAddress", "ContractAddress", "felt252"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::board::Board` model - Board: (() => { - return defineComponent( - world, - { - id: RecsType.Number, - origin: PositionDefinition, - width: RecsType.Number, - height: RecsType.Number, - }, - { - metadata: { - namespace: "pixelaw", - name: "Board", - types: ["u32", "u32", "u32"], - customTypes: ["Position"], - }, - }, - ); - })(), - - // Model definition for `pixelaw::core::models::registry::CoreActionsAddress` model - CoreActionsAddress: (() => { - return defineComponent( - world, - { - key: RecsType.BigInt, - value: RecsType.BigInt, - }, - { - metadata: { - namespace: "pixelaw", - name: "CoreActionsAddress", - types: ["felt252", "ContractAddress"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::game::Game` model - Game: (() => { - return defineComponent( - world, - { - id: RecsType.Number, - start: RecsType.Number, - end: RecsType.Number, - proposal_idx: RecsType.Number, - coeff_own_pixels: RecsType.Number, - coeff_commits: RecsType.Number, - winner_config: RecsType.Number, - winner: RecsType.BigInt, - guild_ids: RecsType.NumberArray, - guild_count: RecsType.Number, - }, - { - metadata: { - namespace: "pixelaw", - name: "Game", - types: ["u32", "u64", "u64", "u32", "u32", "u32", "u32", "ContractAddress", "array", "u32"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::board::GameId` model - GameId: (() => { - return defineComponent( - world, - { - x: RecsType.Number, - y: RecsType.Number, - value: RecsType.Number, - }, - { - metadata: { - namespace: "pixelaw", - name: "GameId", - types: ["u32", "u32", "u32"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::allowed_color::GamePalette` model - GamePalette: (() => { - return defineComponent( - world, - { - game_id: RecsType.Number, - length: RecsType.Number, - }, - { - metadata: { - namespace: "pixelaw", - name: "GamePalette", - types: ["u32", "u32"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::guilds::Guild` model - Guild: (() => { - return defineComponent( - world, - { - game_id: RecsType.Number, - guild_id: RecsType.Number, - guild_name: RecsType.BigInt, - creator: RecsType.BigInt, - members: RecsType.BigIntArray, - member_count: RecsType.Number, - }, - { - metadata: { - namespace: "pixelaw", - name: "Guild", - types: ["u32", "u32", "felt252", "ContractAddress", "array", "u32"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::allowed_color::InPalette` model - InPalette: (() => { - return defineComponent( - world, - { - game_id: RecsType.Number, - color: RecsType.Number, - value: RecsType.Boolean, - }, - { - metadata: { - namespace: "pixelaw", - name: "InPalette", - types: ["u32", "u32", "bool"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `pixelaw::core::models::registry::Instruction` model - Instruction: (() => { - return defineComponent( - world, - { - system: RecsType.BigInt, - selector: RecsType.BigInt, - instruction: RecsType.BigInt, - }, - { - metadata: { - namespace: "pixelaw", - name: "Instruction", - types: ["ContractAddress", "felt252", "felt252"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::board::PWarPixel` model - PWarPixel: (() => { - return defineComponent( - world, - { - position: PositionDefinition, - owner: RecsType.BigInt, - }, - { - metadata: { - namespace: "pixelaw", - name: "PWarPixel", - types: ["ContractAddress"], - customTypes: ["Position"], - }, - }, - ); - })(), - - // Model definition for `p_war::models::allowed_color::PaletteColors` model - PaletteColors: (() => { - return defineComponent( - world, - { - game_id: RecsType.Number, - idx: RecsType.Number, - color: RecsType.Number, - }, - { - metadata: { - namespace: "pixelaw", - name: "PaletteColors", - types: ["u32", "u32", "u32"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `pixelaw::core::models::permissions::Permissions` model - Permissions: (() => { - return defineComponent( - world, - { - allowing_app: RecsType.BigInt, - allowed_app: RecsType.BigInt, - permission: PermissionDefinition, - }, - { - metadata: { - namespace: "pixelaw", - name: "Permissions", - types: ["ContractAddress", "ContractAddress"], - customTypes: ["Permission"], - }, - }, - ); - })(), - - // Model definition for `pixelaw::core::models::pixel::Pixel` model - Pixel: (() => { - return defineComponent( - world, - { - x: RecsType.Number, - y: RecsType.Number, - app: RecsType.BigInt, - color: RecsType.Number, - created_at: RecsType.Number, - updated_at: RecsType.Number, - timestamp: RecsType.Number, - owner: RecsType.BigInt, - text: RecsType.BigInt, - action: RecsType.BigInt, - }, - { - metadata: { - namespace: "pixelaw", - name: "Pixel", - types: [ - "u32", - "u32", - "ContractAddress", - "u32", - "u64", - "u64", - "u64", - "ContractAddress", - "felt252", - "felt252", - ], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::proposal::PixelRecoveryRate` model - PixelRecoveryRate: (() => { - return defineComponent( - world, - { - game_id: RecsType.Number, - rate: RecsType.Number, - }, - { - metadata: { - namespace: "pixelaw", - name: "PixelRecoveryRate", - types: ["u32", "u64"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::player::Player` model - Player: (() => { - return defineComponent( - world, - { - address: RecsType.BigInt, - num_owns: RecsType.Number, - num_commit: RecsType.Number, - last_date: RecsType.Number, - is_banned: RecsType.Boolean, - }, - { - metadata: { - namespace: "pixelaw", - name: "Player", - types: ["ContractAddress", "u32", "u32", "u64", "bool"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::proposal::PlayerVote` model - PlayerVote: (() => { - return defineComponent( - world, - { - player: RecsType.BigInt, - game_id: RecsType.Number, - index: RecsType.Number, - is_in_favor: RecsType.Boolean, - voting_power: RecsType.Number, - }, - { - metadata: { - namespace: "pixelaw", - name: "PlayerVote", - types: ["ContractAddress", "u32", "u32", "bool", "u32"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `p_war::models::proposal::Proposal` model - Proposal: (() => { - return defineComponent( - world, - { - game_id: RecsType.Number, - index: RecsType.Number, - author: RecsType.BigInt, - proposal_type: RecsType.Number, - target_args_1: RecsType.Number, - target_args_2: RecsType.Number, - start: RecsType.Number, - end: RecsType.Number, - yes_voting_power: RecsType.Number, - no_voting_power: RecsType.Number, - is_activated: RecsType.Boolean, - }, - { - metadata: { - namespace: "pixelaw", - name: "Proposal", - types: ["u32", "u32", "ContractAddress", "u8", "u32", "u32", "u64", "u64", "u32", "u32", "bool"], - customTypes: [], - }, - }, - ); - })(), - - // Model definition for `pixelaw::core::models::queue::QueueItem` model - QueueItem: (() => { - return defineComponent( - world, - { - id: RecsType.BigInt, - valid: RecsType.Boolean, - }, - { - metadata: { - namespace: "pixelaw", - name: "QueueItem", - types: ["felt252", "bool"], - customTypes: [], - }, - }, - ); - })(), - }; -} diff --git a/client/src/libs/dojo/world.ts b/client/src/libs/dojo/world.ts deleted file mode 100644 index 960676e..0000000 --- a/client/src/libs/dojo/world.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createWorld } from "@dojoengine/recs"; - -export const world = createWorld(); diff --git a/client/src/libs/webgl/shaders/board.fs b/client/src/libs/webgl/shaders/board.fs deleted file mode 100644 index 69727af..0000000 --- a/client/src/libs/webgl/shaders/board.fs +++ /dev/null @@ -1,6 +0,0 @@ -precision mediump float; -uniform vec4 uColor; - -void main() { - gl_FragColor = uColor; -} \ No newline at end of file diff --git a/client/src/libs/webgl/shaders/board.vs b/client/src/libs/webgl/shaders/board.vs deleted file mode 100644 index 26cb301..0000000 --- a/client/src/libs/webgl/shaders/board.vs +++ /dev/null @@ -1,10 +0,0 @@ -attribute vec2 aPosition; -uniform vec2 uResolution; -uniform vec2 uOffset; -uniform float uScale; - -void main() { - vec2 scaledPosition = (aPosition - uOffset) * uScale; - vec2 clipSpace = (scaledPosition / uResolution) * 2.0 - 1.0; - gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); -} \ No newline at end of file diff --git a/client/src/libs/webgl/shaders/grid.fs b/client/src/libs/webgl/shaders/grid.fs deleted file mode 100644 index 0e60593..0000000 --- a/client/src/libs/webgl/shaders/grid.fs +++ /dev/null @@ -1,6 +0,0 @@ -precision mediump float; -uniform vec4 uColor; - -void main() { - gl_FragColor = uColor; -} \ No newline at end of file diff --git a/client/src/libs/webgl/shaders/grid.vs b/client/src/libs/webgl/shaders/grid.vs deleted file mode 100644 index 88c5ac0..0000000 --- a/client/src/libs/webgl/shaders/grid.vs +++ /dev/null @@ -1,12 +0,0 @@ -attribute vec2 aPosition; -uniform vec2 uResolution; -uniform vec2 uOffset; -uniform float uScale; -uniform float uLineWidth; - -void main() { - vec2 scaledPosition = (aPosition - uOffset) * uScale; - vec2 clipSpace = (scaledPosition / uResolution) * 2.0 - 1.0; - gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); - gl_PointSize = uLineWidth; -} \ No newline at end of file diff --git a/client/src/libs/webgl/shaders/pixel.fs b/client/src/libs/webgl/shaders/pixel.fs deleted file mode 100644 index 418f158..0000000 --- a/client/src/libs/webgl/shaders/pixel.fs +++ /dev/null @@ -1,6 +0,0 @@ -precision mediump float; -varying vec4 vColor; - -void main() { - gl_FragColor = vColor; -} \ No newline at end of file diff --git a/client/src/libs/webgl/shaders/pixel.vs b/client/src/libs/webgl/shaders/pixel.vs deleted file mode 100644 index 03f1fba..0000000 --- a/client/src/libs/webgl/shaders/pixel.vs +++ /dev/null @@ -1,14 +0,0 @@ -attribute vec2 aPosition; -attribute vec4 aColor; -uniform vec2 uResolution; -uniform vec2 uOffset; -uniform float uScale; - -varying vec4 vColor; - -void main() { - vec2 scaledPosition = (aPosition - uOffset) * uScale; - vec2 clipSpace = (scaledPosition / uResolution) * 2.0 - 1.0; - gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); - vColor = aColor; -} \ No newline at end of file diff --git a/client/src/main.tsx b/client/src/main.tsx deleted file mode 100644 index 042458f..0000000 --- a/client/src/main.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import React, { useEffect, useState } from "react"; -import ReactDOM from "react-dom/client"; -import "./index.scss"; -import { App } from "./app"; -import { setup, SetupResult } from "@/libs/dojo/setup"; -import { DojoProvider } from "@/contexts/DojoContext"; -import { dojoConfig } from "../dojoConfig"; -import { ThemeProvider } from "./components/ThemeProvider"; -import { Toaster } from "./components/ui/Sonner"; -import SwipeControl from "./components/SwipeControl"; -import { StarknetConfig, jsonRpcProvider, voyager } from "@starknet-react/core"; -import cartridgeConnector from "@/libs/cartriggeController"; -import { sepolia } from "@starknet-react/chains"; - -const rootElement = document.getElementById("root"); -if (!rootElement) throw new Error("React root not found"); -const root = ReactDOM.createRoot(rootElement as HTMLElement); - -const Main = () => { - const [setupResult, setSetupResult] = useState(null); - - useEffect(() => { - const init = async () => { - const setupResult = await setup(dojoConfig); - setSetupResult(setupResult); - }; - init(); - }, []); - - if (!setupResult) { - return ( -
-
- ); - } - - return ( - - - - ({ nodeUrl: import.meta.env.VITE_PUBLIC_RPC_URL }) })} - connectors={[cartridgeConnector]} - explorer={voyager} - autoConnect={true} - > - - - - - - - - - ); -}; - -root.render(
); diff --git a/client/src/pages/GamePage/GamePage.module.css b/client/src/pages/GamePage/GamePage.module.css new file mode 100644 index 0000000..5263a21 --- /dev/null +++ b/client/src/pages/GamePage/GamePage.module.css @@ -0,0 +1,42 @@ +#bottomMenu { + background-color: white; + position: absolute; + width: auto; + height: 6.5rem; + display: flex; + justify-content: center; + align-items: flex-end; + left: 50%; + transform: translateX(-50%); + pointer-events: auto; + box-sizing: border-box; + padding: 1rem; + border-top-left-radius: 1rem; + border-top-right-radius: 1rem; + touch-action: none; + user-select: none; +} + +.extraPanel { + position: absolute; + bottom: 150px; /* Position above the bottom menu */ + left: 50%; + transform: translateX(-50%); + background-color: white; + padding: 1rem; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + border-radius: 0.5rem; + z-index: 100; /* Ensure it appears above other elements */ +} + +.apps { + position: absolute; + top: calc(50px + 1rem); + left: 1rem; + width: 100px; + display: flex; + justify-content: center; + background-color: transparent; + z-index: 10; + height: calc(100vh - 50px - 2rem); +} diff --git a/client/src/pages/GamePage/GamePage.tsx b/client/src/pages/GamePage/GamePage.tsx new file mode 100644 index 0000000..c513c4b --- /dev/null +++ b/client/src/pages/GamePage/GamePage.tsx @@ -0,0 +1,262 @@ +import { + type Coordinate, + type Interaction, + type Notification, + type QueueItem, + getZoomLevel, +} from "@pixelaw/core"; + +import AppPickerButton from "@/components/GamePage/AppPicker/AppPickerButton.tsx"; +import ColorPickerButton from "@/components/GamePage/ColorPicker/ColorPickerButton.tsx"; +import { WalletPicker } from "@/components/GamePage/WalletPicker/WalletPicker.tsx"; +import WalletPickerButton from "@/components/GamePage/WalletPicker/WalletPickerButton.tsx"; +import { InteractionDialog, usePixelawProvider } from "@pixelaw/react"; +import { useEffect, useMemo, useRef, useState } from "react"; +import type { SimplePixelError } from "../../../../pixelaw.js/packages/core/src"; +import styles from "./GamePage.module.css"; + +import AppPicker from "@/components/GamePage/AppPicker/AppPicker"; +import SimpleColorPicker from "@/components/GamePage/ColorPicker/SimpleColorPicker.tsx"; + +function debounce(func: (...args: T) => void, wait: number) { + let timeout: NodeJS.Timeout; + const debouncedFunction = (...args: T) => { + clearTimeout(timeout); + timeout = setTimeout(() => func(...args), wait); + }; + debouncedFunction.cancel = () => clearTimeout(timeout); + return debouncedFunction; +} + +const GamePage: React.FC = () => { + try { + // TODO: Ideally pixelawCore doesnt need to be exposed here, and we have a setter for renderer + const { + pixelawCore, + coreStatus, + world, + app, + color, + center, + zoom, + setColor, + setApp, + } = usePixelawProvider(); + const [selectedApp, setSelectedApp] = useState("snake"); + const appIcon = !app + ? "" + : pixelawCore.appStore.getByName(selectedApp)!.icon; + + const { viewPort: renderer } = pixelawCore; + const rendererContainerRef = useRef(null); + const [currentInteraction, setCurrentInteraction] = + useState(null); + + const zoombasedAdjustment = useMemo(() => { + return ["mid", "close"].includes(getZoomLevel(zoom)) ? "0px" : "-100%"; + }, [zoom]); + + const [activeChooser, setActiveChooser] = useState< + "color" | "wallet" | "app" | null + >(null); + + const handleColorPickerClick = () => { + if (app === "paint") { + setActiveChooser((prev) => (prev === "color" ? null : "color")); + } else { + setApp("paint"); + } + }; + + const handleColorPickerSecondaryClick = () => + setActiveChooser((prev) => (prev === "color" ? null : "color")); + + const handleWalletPickerClick = () => { + if (app === "player") { + setActiveChooser((prev) => (prev === "wallet" ? null : "wallet")); + } else { + setApp("player"); + } + }; + + const handleWalletPickerSecondaryClick = () => + setActiveChooser((prev) => (prev === "wallet" ? null : "wallet")); + + const handleAppPickerClick = () => { + if (app !== "player" && app !== "paint") { + setActiveChooser((prev) => (prev === "app" ? null : "app")); + } else { + setApp(selectedApp); + } + }; + + const handleAppPickerSecondaryClick = () => + setActiveChooser((prev) => (prev === "app" ? null : "app")); + + const playerIcon = "⭐"; + + // Updating the URL + useEffect(() => { + const updateURL = () => { + const queryParams = new URLSearchParams(); + queryParams.set("app", app ?? ""); + queryParams.set("center", `${center[0]},${center[1]}`); + queryParams.set("zoom", zoom.toString()); + queryParams.set("color", color.toString()); + queryParams.set("world", world!); + const newSearch = `?${queryParams.toString()}`; + + if (window.location.search !== newSearch) { + window.history.replaceState(null, "", newSearch); + } + }; + const debounceUpdateURL = debounce(updateURL, 300); + + try { + debounceUpdateURL(); + } catch (e) { + console.log(e); + } + return () => { + debounceUpdateURL.cancel(); + }; + }, [app, center, zoom, color, world]); + + // Handle viewport events + useEffect(() => { + const handleCellClick = async (cell: Coordinate) => { + if (getZoomLevel(zoom) === "far") { + console.warn("not handling cell click if zoomed out far"); + return; + } + + const interaction = await pixelawCore.prepInteraction(cell); + + if (interaction.getUserParams().length === 0) { + await interaction.execute(); + return; + } + + console.log(interaction); + setCurrentInteraction(interaction); + }; + + const handleQueueItem = (item: QueueItem) => { + console.log("scheduled+"); + pixelawCore.executeQueueItem(item).catch(console.error); + }; + + const handleNotification = (item: Notification) => { + console.log("NOTIFICATION", item); + }; + + const handleError = (error: SimplePixelError) => { + console.log("handleError", JSON.stringify(error)); + if (error.coordinate) { + pixelawCore.viewPort.addGlow( + error.coordinate, + 2000, + "#FF0000", + 10, + 50, + ); + } + }; + + console.log("handling"); + pixelawCore.queue.eventEmitter.on("scheduled", handleQueueItem); + pixelawCore.queue.retrieve().then(() => { + //Just let it run + }); + + // pixelawCore.events.on("cellHovered", handleCellHover) + pixelawCore.events.on("cellClicked", handleCellClick); + pixelawCore.events.on("error", handleError); + pixelawCore.events.on("notification", handleNotification); + + return () => { + // pixelawCore.events.off("cellHovered", handleCellHover) + pixelawCore.events.off("cellClicked", handleCellClick); + pixelawCore.queue.eventEmitter.off("scheduled", handleQueueItem); + pixelawCore.events.off("error", handleError); + pixelawCore.events.off("notification", handleNotification); + }; + }, [pixelawCore, zoom]); + + useEffect(() => { + if (!coreStatus.startsWith("ready")) return; + + renderer.setContainer(rendererContainerRef.current!); + }, [coreStatus, renderer]); + + return ( + <> +
+ + {activeChooser === "color" && ( + { + setColor(color); + setActiveChooser(null); + }} + /> + )} + {activeChooser === "wallet" && ( + setActiveChooser(null)} /> + )} + + {activeChooser === "app" && ( + setActiveChooser(null)} + /> + )} + +
+ + + +
+ + {currentInteraction && ( + { + console.log("Interaction submitted:", interaction); + setCurrentInteraction(null); // Clear the interaction after submission + }} + onCancel={(interaction) => { + console.log("Interaction cancelled:", interaction); + setCurrentInteraction(null); // Clear the interaction after submission + }} + /> + )} + + ); + } catch (e) { + console.log(e); + } + // +}; + +export default GamePage; diff --git a/client/src/pages/GamePage/InteractionDialog.module.css b/client/src/pages/GamePage/InteractionDialog.module.css new file mode 100644 index 0000000..eb737ee --- /dev/null +++ b/client/src/pages/GamePage/InteractionDialog.module.css @@ -0,0 +1,57 @@ +.dialog { + position: absolute; /* Position it relative to the nearest positioned ancestor */ + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + border: none; + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + padding: 20px; + width: 300px; + background-color: #fff; + z-index: 20; /* Ensure it's above the overlay */ +} +.overlay { + position: fixed; /* Cover the entire viewport */ + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); /* Semi-transparent background */ + z-index: 10; /* Ensure it's below the dialog */ +} +.form { + display: flex; + flex-direction: column; + gap: 10px; +} + +.label { + font-size: 16px; + margin-bottom: 5px; + color: #333; /* Darker text for better readability */ +} + +.checkbox { + margin-right: 10px; +} + +.button { + background-color: #007bff; + border: none; /* Remove border for a cleaner look */ + border-radius: 4px; + color: white; + cursor: pointer; + padding: 10px; + text-align: center; + transition: background-color 0.3s ease; /* Smooth transition for hover effect */ +} + +.cancel-button { + background-color: #6c757d; +} + +.button:hover { + background-color: #0056b3; /* Darker shade on hover */ + opacity: 0.9; +} diff --git a/client/src/pages/PwarPage/PwarPage.module.css b/client/src/pages/PwarPage/PwarPage.module.css new file mode 100644 index 0000000..9b8c187 --- /dev/null +++ b/client/src/pages/PwarPage/PwarPage.module.css @@ -0,0 +1,62 @@ +.pwarContainer { + display: flex; + flex-direction: column; + height: 100vh; + width: 100%; + background-color: #202225; +} + +.gameContent { + display: flex; + flex: 1; + height: calc(100vh - 60px); +} + +.rendererContainer { + flex: 3; + height: 100%; + position: relative; + background-color: #2f3136; +} + +.pwarInterface { + flex: 1; + min-width: 320px; + max-width: 400px; + background-color: #1a1a1a; + padding: 1rem; + display: flex; + flex-direction: column; + gap: 1rem; + overflow-y: auto; + border-left: 1px solid #333; +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .gameContent { + flex-direction: column; + } + + .rendererContainer { + height: 60vh; + } + + .pwarInterface { + max-width: none; + height: 40vh; + } +} + +/* Additional responsive adjustments for smaller screens */ +@media (max-width: 480px) { + .rendererContainer { + height: 50vh; + } + + .pwarInterface { + height: 50vh; + padding: 0.75rem; + gap: 0.75rem; + } +} diff --git a/client/src/pages/PwarPage/PwarPage.tsx b/client/src/pages/PwarPage/PwarPage.tsx new file mode 100644 index 0000000..af00e28 --- /dev/null +++ b/client/src/pages/PwarPage/PwarPage.tsx @@ -0,0 +1,154 @@ +import { usePixelawProvider } from "@pixelaw/react"; +import { useEffect, useRef, useState } from "react"; +import type { Coordinate } from "@pixelaw/core"; +import styles from "./PwarPage.module.css"; +import { StatsDashboard } from "@/components/Pwar/Stats/StatsDashboard"; +import { usePwarProvider } from "@/provider/PwarContext"; +import type { DefaultParameters, Position } from "@pixelaw/core-dojo"; +import { CairoOption, CairoOptionVariant } from "starknet"; +import { GameControls } from "@/components/Pwar/GameControls/GameControls"; +import { GuildPanel } from "@/components/Pwar/Guild/GuildPanel"; +import { GameStatusBar } from "@/components/Pwar/GameStatus/GameStatusBar"; + +// The content of the Pwar page, wrapped by PwarProvider +const PwarPageContent: React.FC = () => { + const { pixelawCore, coreStatus, center } = usePixelawProvider(); + const { viewPort: renderer } = pixelawCore; + const rendererContainerRef = useRef(null); + const { world, account } = usePwarProvider(); + + // Game state + const [gameStarted, setGameStarted] = useState(false); + const [gameId, setGameId] = useState(null); + const [selectedGuildId, setSelectedGuildId] = useState(null); + + // Handle cell interactions + useEffect(() => { + const handlePwarCellClick = async (cell: Coordinate) => { + console.log("Pwar cell clicked:", cell); + + // Only allow interaction if game has started + if (!gameStarted) { + console.log("Game not started yet. Please start a game first."); + return; + } + + try { + // Create DefaultParameters object + const defaultParams = { + player_override: new CairoOption(CairoOptionVariant.None), + system_override: new CairoOption(CairoOptionVariant.None), + area_hint: new CairoOption(CairoOptionVariant.None), + position: { + x: cell[0], + y: cell[1], + }, + color: 255, + } as DefaultParameters; + + // Call the interact function with the wallet and parameters + const tx = await world.pwar_actions.interact(account, defaultParams); + console.log("this is the tx after interact", tx); + } catch (error) { + console.error("Failed to interact with cell:", error); + } + }; + + pixelawCore.events.on("cellClicked", handlePwarCellClick); + return () => { + pixelawCore.events.off("cellClicked", handlePwarCellClick); + }; + }, [pixelawCore, world, gameStarted, account]); + + // Set up the renderer + useEffect(() => { + if (coreStatus !== "ready") return; + renderer.setContainer(rendererContainerRef.current!); + }, [coreStatus, renderer]); + + // Game control handlers + const handleStartGame = async () => { + try { + // Call your contract to start a new game + const position = { + x: center[0], + y: center[1], + } as Position; + await world.pwar_actions.createGame(account, position); + const newGameId = await world.pwar_actions.getGameId(position); + console.log(newGameId); + setGameId(newGameId); + // setGameId(1); + setGameStarted(true); + } catch (error) { + console.error("Failed to start game:", error); + } + }; + + const handleJoinGuild = async (guildId: number) => { + try { + if (!gameId) return; + await world.guild_actions.joinGuild(account, gameId, guildId); + setSelectedGuildId(guildId); + } catch (error) { + console.error("Failed to join guild:", error); + } + }; + + const handleCreateGuild = async (guildName: string) => { + try { + if (!gameId) return; + const newGuildId = await world.guild_actions.createGuild( + account, + gameId, + guildName, + ); + setSelectedGuildId(newGuildId); + } catch (error) { + console.error("Failed to create guild:", error); + } + }; + + const handlePayFee = async () => { + try { + if (!gameId) return; + await world.payments.pay_participation_fee(account, gameId); + } catch (error) { + console.error("Failed to pay fee:", error); + } + }; + + return ( +
+ + +
+
+ +
+ + + + + +
+
+
+ ); +}; + +// Wrap the PwarPage content with the PwarProvider +const PwarPage: React.FC = () => { + return ; +}; + +export default PwarPage; diff --git a/client/src/pages/SettingsPage.module.css b/client/src/pages/SettingsPage.module.css new file mode 100644 index 0000000..89fad26 --- /dev/null +++ b/client/src/pages/SettingsPage.module.css @@ -0,0 +1,36 @@ +.inner { + background-color: white; + padding: 1rem; + border-radius: 1rem; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + width: 100vw; +} + +.settingsList { + list-style: none; + padding: 0; + width: 100%; + max-width: 600px; /* Adjust based on preference */ +} + +.settingItem { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.5rem; + border-bottom: 1px solid #ccc; /* Visual separation */ +} + +.settingLabel { + font-weight: bold; +} + +.settingInput { + padding: 0.25rem; + border-radius: 0.25rem; + border: 1px solid #ccc; +} diff --git a/client/src/pages/SettingsPage.tsx b/client/src/pages/SettingsPage.tsx new file mode 100644 index 0000000..9d22203 --- /dev/null +++ b/client/src/pages/SettingsPage.tsx @@ -0,0 +1,37 @@ +// import { clearIdb } from "@/webtools/utils.ts" +import styles from "./SettingsPage.module.css"; + +const SettingsPage = () => { + const handleClearIdb = async () => { + // TODO hookup webcore + // await clearIdb() + }; + const handleResetUrl = () => { + const url = window.location.origin; // + window.location.pathname; + window.location.href = url; + }; + return ( +
+

Settings

+
    +
  • + Clear IndexedDB + +
  • +
  • + Example Setting + +
  • +
  • + +
  • +
+
+ ); +}; + +export default SettingsPage; diff --git a/client/src/pages/WalletSelectorPage.module.css b/client/src/pages/WalletSelectorPage.module.css new file mode 100644 index 0000000..7c9edfb --- /dev/null +++ b/client/src/pages/WalletSelectorPage.module.css @@ -0,0 +1,53 @@ +.inner { + background-color: white; + padding: 1rem; + border-radius: 1rem; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + width: 100vw; +} + +.list { + list-style-type: none; + padding: 0; +} + +.listItem { + padding: 10px; + cursor: pointer; + border: 1px solid #ccc; + margin-bottom: 5px; + border-radius: 4px; + transition: background-color 0.3s; +} + +.listItem:hover { + background-color: #f0f0f0; +} + +.selected { + background-color: #d0eaff; + border-color: #a0cfff; +} + +.menuButton { + width: 100%; + padding: 10px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; +} + +.selectedButton { + background-color: #007bff; + color: white; +} + +.unselectedButton { + background-color: #6c757d; + color: white; +} diff --git a/client/src/pages/WalletSelectorPage.tsx b/client/src/pages/WalletSelectorPage.tsx new file mode 100644 index 0000000..5d77ffc --- /dev/null +++ b/client/src/pages/WalletSelectorPage.tsx @@ -0,0 +1,15 @@ +import { usePixelawProvider } from "@pixelaw/react"; +import { StarknetWalletSelectorPage } from "@pixelaw/react-dojo"; + +export const WalletSelectorPage = () => { + const { engine } = usePixelawProvider(); + + if (engine!.id === "dojo") { + return ; + } + return ( +
+

not implemented

+
+ ); +}; diff --git a/client/src/pages/WorldSelectorPage.module.css b/client/src/pages/WorldSelectorPage.module.css new file mode 100644 index 0000000..7c9edfb --- /dev/null +++ b/client/src/pages/WorldSelectorPage.module.css @@ -0,0 +1,53 @@ +.inner { + background-color: white; + padding: 1rem; + border-radius: 1rem; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + width: 100vw; +} + +.list { + list-style-type: none; + padding: 0; +} + +.listItem { + padding: 10px; + cursor: pointer; + border: 1px solid #ccc; + margin-bottom: 5px; + border-radius: 4px; + transition: background-color 0.3s; +} + +.listItem:hover { + background-color: #f0f0f0; +} + +.selected { + background-color: #d0eaff; + border-color: #a0cfff; +} + +.menuButton { + width: 100%; + padding: 10px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; +} + +.selectedButton { + background-color: #007bff; + color: white; +} + +.unselectedButton { + background-color: #6c757d; + color: white; +} diff --git a/client/src/pages/WorldSelectorPage.tsx b/client/src/pages/WorldSelectorPage.tsx new file mode 100644 index 0000000..db3cc2d --- /dev/null +++ b/client/src/pages/WorldSelectorPage.tsx @@ -0,0 +1,42 @@ +import { useNavigate } from "react-router-dom"; +import styles from "./WorldSelectorPage.module.css"; +import { usePixelawProvider } from "@pixelaw/react"; + +const WorldSelectorPage = () => { + const { pixelawCore, world, setWorld } = usePixelawProvider(); + + const navigate = useNavigate(); + + const handleWorldChange = (newWorld: string) => { + setWorld(newWorld); + navigate("/"); + }; + + return ( +
+

World Selector: {world}

+
    + {Object.entries(pixelawCore.getWorldsRegistry()).map( + ([worldKey, worldConfig]) => { + return ( +
  • + +
  • + ); + }, + )} +
+
+ ); +}; + +export default WorldSelectorPage; diff --git a/client/src/provider/PwarContext.tsx b/client/src/provider/PwarContext.tsx new file mode 100644 index 0000000..c37bce9 --- /dev/null +++ b/client/src/provider/PwarContext.tsx @@ -0,0 +1,20 @@ +import { createContext, useContext } from "react"; +import type { DojoWallet } from "@pixelaw/core-dojo"; +import type { Account, Provider } from "starknet"; + +export type IPwarContext = { + wallet: DojoWallet; + account: Account; + provider: Provider; + world: World; +}; + +export const PwarContext = createContext(undefined); + +export const usePwarProvider = (): IPwarContext => { + const context = useContext(PwarContext); + if (!context) { + throw new Error("usePwarProvider must be used within a PwarProvider"); + } + return context; +}; diff --git a/client/src/types.ts b/client/src/types.ts new file mode 100644 index 0000000..e69de29 diff --git a/client/src/types/index.ts b/client/src/types/index.ts deleted file mode 100644 index e380c06..0000000 --- a/client/src/types/index.ts +++ /dev/null @@ -1,45 +0,0 @@ -export type App = { - system: string; - name: string; - manifest: string; - icon: string; - action: string; -}; - -export interface Color { - r: number; - g: number; - b: number; - a: number; -} - -export interface GridState { - offsetX: number; - offsetY: number; - scale: number; - lastPinchDist?: number; -} - -export interface Pixel { - x: number; - y: number; - color: Color; -} - -export interface PixelRange { - upperLeftX: number; - upperLeftY: number; - lowerRightX: number; - lowerRightY: number; -} - -export interface GridAction { - type: "add" | "remove"; - pixel: Pixel; -} - -export interface GridHistory { - past: Pixel[][]; - present: Pixel[]; - future: Pixel[][]; -} diff --git a/client/src/types/module.d.ts b/client/src/types/module.d.ts deleted file mode 100644 index afa577f..0000000 --- a/client/src/types/module.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module "idle-task" { - export const setIdleTask: (task: IdleTaskFunction, options?: SetIdleTaskOptions) => IdleTaskKey; -} diff --git a/client/src/utils.ts b/client/src/utils.ts new file mode 100644 index 0000000..2272555 --- /dev/null +++ b/client/src/utils.ts @@ -0,0 +1,49 @@ +import { type WorldsRegistry, ZOOM_DEFAULT } from "@pixelaw/core"; + +export const DEFAULT_WORLD = "local"; + +export const clearDomChildren = (element: HTMLElement) => { + while (element.firstChild) { + element.removeChild(element.firstChild); + } +}; +export const hexRGBtoNumber = (color: string) => { + return Number.parseInt(`${color.replace("#", "")}FF`, 16); +}; + +export const numberToHexRGB = (num: number) => { + const hex = (num >>> 8).toString(16).padStart(6, "0"); + return `#${hex}`.toUpperCase(); +}; + +export function getWorldForUrl( + config: WorldsRegistry, + url: string, + defaultWorld: string, +): string { + for (const worldName in config) { + // @ts-ignore TODO + if (config[worldName].config.serverUrl.startsWith(url)) { + return worldName; + } + } + + return defaultWorld; +} + +export function getCoreDefaultsFromUrl() { + const queryParams = new URLSearchParams(window.location.search); + const app = queryParams.get("app") || ""; + const color = Number.parseInt(queryParams.get("color") || "0", 10); + const center = queryParams.get("center")?.split(",").map(Number) as + | [number, number] + | undefined; + const zoom = Number.parseFloat(queryParams.get("zoom") || "7"); + + return { + app, + color: Number.isNaN(color) ? 0 : color, + center: center && center.length === 2 ? center : [12, 12], + zoom: Number.isNaN(zoom) ? ZOOM_DEFAULT : zoom, + }; +} diff --git a/client/src/utils/canvas.ts b/client/src/utils/canvas.ts deleted file mode 100644 index 5efd26b..0000000 --- a/client/src/utils/canvas.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { BASE_CELL_SIZE, BUFFER_PIXEL_RANGE } from "@/constants/webgl"; -import { GridState, PixelRange } from "@/types"; - -export const convertClientPosToCanvasPos = ( - canvasRef: React.RefObject, - clientX: number, - clientY: number, -) => { - const canvas = canvasRef.current; - if (!canvas) return { x: 0, y: 0 }; - - const rect = canvas.getBoundingClientRect(); - const x = clientX - rect.left; - const y = clientY - rect.top; - return { x, y }; -}; - -export const getVisibleArea = (canvas: HTMLCanvasElement, gridState: GridState) => { - const canvasWidth = canvas.width; - const canvasHeight = canvas.height; - const visibleWidth = canvasWidth / gridState.scale; - const visibleHeight = canvasHeight / gridState.scale; - const startX = Math.floor(gridState.offsetX / BASE_CELL_SIZE) * BASE_CELL_SIZE; - const startY = Math.floor(gridState.offsetY / BASE_CELL_SIZE) * BASE_CELL_SIZE; - const endX = startX + visibleWidth + BASE_CELL_SIZE; - const endY = startY + visibleHeight + BASE_CELL_SIZE; - - return { startX, startY, endX, endY }; -}; - -export const shouldFetch = (currentRange: PixelRange, lastRange: PixelRange) => { - return ( - Math.abs(currentRange.upperLeftX - lastRange.upperLeftX) > BUFFER_PIXEL_RANGE / 4 || - Math.abs(currentRange.upperLeftY - lastRange.upperLeftY) > BUFFER_PIXEL_RANGE / 4 || - Math.abs(currentRange.lowerRightX - lastRange.lowerRightX) > BUFFER_PIXEL_RANGE / 4 || - Math.abs(currentRange.lowerRightY - lastRange.lowerRightY) > BUFFER_PIXEL_RANGE / 4 - ); -}; diff --git a/client/src/utils/devices.ts b/client/src/utils/devices.ts deleted file mode 100644 index 50b4e5d..0000000 --- a/client/src/utils/devices.ts +++ /dev/null @@ -1,26 +0,0 @@ -export const detectiOS = () => { - if (typeof navigator === "undefined") { - return false; - } - - const toMatch = [/iPhone/i, /iPad/i, /iPod/i]; - - return toMatch.some((toMatchItem) => { - return RegExp(toMatchItem).exec(navigator.userAgent); - }); -}; - -export const detectAndroid = () => { - if (typeof navigator === "undefined") { - return false; - } - const toMatch = [/Android/i, /webOS/i, /BlackBerry/i, /Windows Phone/i]; - - return toMatch.some((toMatchItem) => { - return RegExp(toMatchItem).exec(navigator.userAgent); - }); -}; - -export const detectMobile = () => { - return detectiOS() || detectAndroid(); -}; diff --git a/client/src/utils/gestures.ts b/client/src/utils/gestures.ts deleted file mode 100644 index e09bbe7..0000000 --- a/client/src/utils/gestures.ts +++ /dev/null @@ -1,10 +0,0 @@ -export const getPinchDistance = (touches: React.TouchList) => { - return Math.hypot(touches[0].clientX - touches[1].clientX, touches[0].clientY - touches[1].clientY); -}; - -export const getTouchPositions = (touches: React.TouchList) => { - return [ - { x: touches[0].clientX, y: touches[0].clientY }, - { x: touches[1].clientX, y: touches[1].clientY }, - ]; -}; diff --git a/client/src/utils/index.ts b/client/src/utils/index.ts deleted file mode 100644 index b9831fa..0000000 --- a/client/src/utils/index.ts +++ /dev/null @@ -1,225 +0,0 @@ -import { type ClassValue, clsx } from "clsx"; -import { extendTailwindMerge } from "tailwind-merge"; -import { withFluid } from "@fluid-tailwind/tailwind-merge"; -import { type Color } from "@/types"; -import { ProposalType } from "@/libs/dojo/typescript/models.gen"; -import { getComponentValue } from "@dojoengine/recs"; -import { App } from "@/types"; -import { shortString } from "starknet"; -import { emojiAvatarForAddress } from "@/components/Avatar/emojiAvatarForAddress"; - -const twMerge = extendTailwindMerge(withFluid); - -export const cn = (...inputs: ClassValue[]) => { - return twMerge(clsx(inputs)); -}; - -export const truncateAddress = (address: string) => { - const truncateRegex = /^(0x[a-zA-Z0-9]{4})[a-zA-Z0-9]+([a-zA-Z0-9]{4})$/; - const match = address.match(truncateRegex); - if (!match || match.length < 3) return address; - const part1 = match[1] || ""; - const part2 = match[2] || ""; - return `${part1}…${part2}`; -}; - -export const formatDate = (date: Date | string): string => { - const dateObj = typeof date === "string" ? new Date(date) : date; - return `${dateObj.getFullYear()}/${(dateObj.getMonth() + 1).toString().padStart(2, "0")}/${dateObj - .getDate() - .toString() - .padStart(2, "0")}:${dateObj.getHours().toString().padStart(2, "0")}:${dateObj - .getMinutes() - .toString() - .padStart(2, "0")}`; -}; - -export const rgbaToUint32 = (color: Color): number => { - const r = Math.round(color.r * 255); - const g = Math.round(color.g * 255); - const b = Math.round(color.b * 255); - const a = Math.round(color.a * 255); - return ((r << 24) | (g << 16) | (b << 8) | a) >>> 0; // Convert to unsigned 32-bit integer -}; - -export const uint32ToRgba = (uint32: number): Color => { - const r = ((uint32 >>> 24) & 0xff) / 255; - const g = ((uint32 >>> 16) & 0xff) / 255; - const b = ((uint32 >>> 8) & 0xff) / 255; - const a = (uint32 & 0xff) / 255; - return { r, g, b, a }; -}; - -// Converts the numeric RGBA to a normal hex color -// @dev this removes the Alpha channel. -// TODO: Eventually convert to rgb(255 0 153 / 80%) -// ref: https://developer.mozilla.org/en-US/docs/Web/CSS/color_value -export const uint32ToHex = (uint32: number) => { - const color = uint32 >>> 8; - return "#" + color.toString(16).padStart(6, "0"); -}; - -export const hexRGBtoNumber = (color: string) => { - return parseInt(`0x${color}FF`, 16); -}; - -export const hexRGBAtoNumber = (color: string) => { - return parseInt(`0x${color}`, 16); -}; - -export const rgbaToHex = (rgba: Color): string => { - const { r, g, b } = rgba; - - const toHex = (c: number) => { - const hex = Math.round(c * 255).toString(16); - return hex.padStart(2, "0"); - }; - - return `#${toHex(r)}${toHex(g)}${toHex(b)}`; -}; - -export const formatColorToRGBA = (color: string) => { - if (color.length === 7 && color.startsWith("#")) { - return color + "00"; - } else if (color.length === 9 && color.startsWith("#")) { - return color; - } else { - return color; - } -}; - -export const formatColorToRGB = (color: string) => { - if (color.length === 7 && color.startsWith("#")) { - return color; - } else if (color.length === 9 && color.startsWith("#")) { - return color.slice(0, -2); - } else { - return color; - } -}; - -export const handleTransactionError = (error: unknown) => { - let errorMessage = "An unexpected error occurred. Please try again."; - - if (error instanceof Error) { - const result = error.message.match(/\('([^']+)'\)/)?.[1]; - if (result) { - errorMessage = result; - } - } - - return errorMessage; -}; - -export const felt252ToString = (felt252: string | number | bigint) => { - if (typeof felt252 === "bigint" || typeof felt252 === "object") { - felt252 = `0x${felt252.toString(16)}`; - } - if (felt252 === "0x0" || felt252 === "0") return ""; - if (typeof felt252 === "string") { - try { - return shortString.decodeShortString(felt252); - } catch (e) { - console.error("Error decoding short string:", e); - return felt252; - } - } - return felt252.toString(); -}; - -export const felt252ToUnicode = (felt252: string | number) => { - const string = felt252ToString(felt252); - if (string.includes("U+")) { - const text = string.replace("U+", ""); - const codePoint = Number.parseInt(text, 16); - return String.fromCodePoint(codePoint); - } - return string; -}; - -export const fromComponent = (appComponent: ReturnType): App | undefined => { - if (!appComponent) return undefined; - - return { - name: shortString.decodeShortString(appComponent.name), - icon: felt252ToUnicode(appComponent.icon), - action: shortString.decodeShortString(appComponent.action), - system: appComponent.system, - manifest: appComponent.manifest, - }; -}; - -export const formatTimeRemaining = (remainingSeconds: number): string => { - const days = Math.floor(remainingSeconds / 86400); - remainingSeconds %= 86400; - const hours = Math.floor(remainingSeconds / 3600); - remainingSeconds %= 3600; - const minutes = Math.floor(remainingSeconds / 60); - const seconds = remainingSeconds % 60; - - let formattedTime = ""; - if (days > 0) { - formattedTime += `${days}d`; - } - if (hours > 0) { - formattedTime += `${hours}h`; - } - if (minutes > 0) { - formattedTime += `${minutes}m`; - } - if (seconds > 0) { - formattedTime += `${seconds}s`; - } - - return formattedTime || "0s"; -}; - -export const formatTimeRemainingForTitle = (remainingSeconds: number): string => { - const days = Math.floor(remainingSeconds / 86400); - remainingSeconds %= 86400; - const hours = Math.floor(remainingSeconds / 3600); - remainingSeconds %= 3600; - const minutes = Math.floor(remainingSeconds / 60); - const seconds = remainingSeconds % 60; - - let formattedTime = ""; - if (days > 0) { - formattedTime += `${days}D`; - } - if (hours > 0) { - formattedTime += ` ${hours}H`; - } - if (minutes > 0) { - formattedTime += ` ${minutes}M`; - } - if (seconds > 0) { - formattedTime += ` ${seconds}S`; - } - - return formattedTime || "0S"; -}; - -export const formatWalletAddressWithEmoji = (address: string) => { - const avatar = emojiAvatarForAddress(address); - if (address.length > 10) { - return avatar.emoji + " " + `${address.slice(0, 4)}...${address.slice(-4)}`; - } - return avatar.emoji + " " + address; -}; - -export const createProposalTitle = (proposalType: ProposalType, target_args_1: number, target_args_2: number) => { - switch (proposalType) { - case ProposalType.AddNewColor: - return `Adding A New Color: ${uint32ToHex(target_args_1).toUpperCase()}`; - case ProposalType.ResetToWhiteByColor: - return `Reset To White: ${uint32ToHex(target_args_1).toUpperCase()}`; - case ProposalType.ExtendGameEndTime: - return `Extend Game End Time: ${formatTimeRemainingForTitle(target_args_1)}`; - case ProposalType.ExpandArea: - return `Expand Area: x ${target_args_1} y ${target_args_2}`; - default: { - console.error("unhandled proposal type: ", proposalType); - return ""; - } - } -}; diff --git a/client/src/vite-env.d.ts b/client/src/vite-env.d.ts index 5a3036c..fd756f8 100644 --- a/client/src/vite-env.d.ts +++ b/client/src/vite-env.d.ts @@ -16,9 +16,11 @@ type ImportMetaEnv = { PROD: boolean // @user-defined-start /* - * You can use this section to explicitly extend the type definition of `import.meta.env` - * This is useful if you're using Vite plugins that define specific `import.meta.env` properties. - * If you're not using such plugins, this section should remain as is. + * Here you can define your own special variables + * that would be available on `import.meta.env` but + * that vite-envs does not know about. + * This section will be preserved thanks to the special comments. + * Example: */ SSR: boolean; // @user-defined-end diff --git a/client/tailwind.config.ts b/client/tailwind.config.ts deleted file mode 100644 index c7a7c72..0000000 --- a/client/tailwind.config.ts +++ /dev/null @@ -1,116 +0,0 @@ -import fluid, { extract } from "fluid-tailwind"; -import tailwindcssAnimate from "tailwindcss-animate"; - -export default { - darkMode: ["class"], - content: { - files: ["./pages/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}", "./app/**/*.{ts,tsx}", "./src/**/*.{ts,tsx}"], - extract, - }, - prefix: "", - theme: { - container: { - center: true, - padding: "2rem", - screens: { - "2xl": "1400px", - }, - }, - extend: { - fontFamily: { - silkscreen: { - DEFAULT: ["Silkscreen", "sans-serif"], - }, - roboto: { - DEFAULT: ["Roboto", "sans-serif"], - mono: ["Roboto Mono", "monospace"], - }, - }, - colors: { - border: "hsl(var(--border))", - input: "hsl(var(--input))", - ring: "hsl(var(--ring))", - background: "hsl(var(--background))", - foreground: "hsl(var(--foreground))", - primary: { - DEFAULT: "hsl(var(--primary))", - foreground: "hsl(var(--primary-foreground))", - }, - secondary: { - DEFAULT: "hsl(var(--secondary))", - foreground: "hsl(var(--secondary-foreground))", - }, - destructive: { - DEFAULT: "hsl(var(--destructive))", - foreground: "hsl(var(--destructive-foreground))", - }, - muted: { - DEFAULT: "hsl(var(--muted))", - foreground: "hsl(var(--muted-foreground))", - }, - accent: { - DEFAULT: "hsl(var(--accent))", - foreground: "hsl(var(--accent-foreground))", - }, - popover: { - DEFAULT: "hsl(var(--popover))", - foreground: "hsl(var(--popover-foreground))", - }, - card: { - DEFAULT: "hsl(var(--card))", - foreground: "hsl(var(--card-foreground))", - }, - }, - borderRadius: { - lg: "var(--radius)", - md: "calc(var(--radius) - 2px)", - sm: "calc(var(--radius) - 4px)", - }, - keyframes: { - "accordion-down": { - from: { height: "0" }, - to: { height: "var(--radix-accordion-content-height)" }, - }, - "accordion-up": { - from: { height: "var(--radix-accordion-content-height)" }, - to: { height: "0" }, - }, - "fade-in-out": { - "0%": { - opacity: "0", - transform: "translate(-50%, -10px)", - }, - "50%": { - opacity: "1", - transform: "translate(-50%, 0)", - }, - "100%": { - opacity: "0", - transform: "translate(-50%, -10px)", - }, - }, - "slide-open": { - from: { transform: "scaleX(0)" }, - to: { transform: "scaleX(1)" }, - }, - "slide-close": { - from: { transform: "scaleX(1)" }, - to: { transform: "scaleX(0)" }, - }, - }, - animation: { - "fade-in-out": "fade-in-out 1s ease-in-out", - "accordion-down": "accordion-down 0.2s ease-out", - "accordion-up": "accordion-up 0.2s ease-out", - "slide-open": "slide-open 0.3s ease-out forwards", - "slide-close": "slide-close 0.3s ease-in forwards", - }, - transformOrigin: { - center: "center", - left: "left", - right: "right", - }, - }, - }, - plugins: [fluid, tailwindcssAnimate], -}; diff --git a/client/tsconfig.app.json b/client/tsconfig.app.json index e285269..4c864df 100644 --- a/client/tsconfig.app.json +++ b/client/tsconfig.app.json @@ -1,12 +1,13 @@ { "compilerOptions": { + "types": ["vitest/importMeta"], + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", "target": "ES2020", "useDefineForClassFields": true, "lib": ["ES2020", "DOM", "DOM.Iterable"], "module": "ESNext", "skipLibCheck": true, - /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, "isolatedModules": true, @@ -14,16 +15,20 @@ "noEmit": true, "jsx": "react-jsx", - /* Linting */ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, "baseUrl": ".", "paths": { - "@/*": ["./src/*"] - }, - "types": ["vite-plugin-glsl/ext"] + "@pixelaw/core": ["pixelaw.js/packages/core/src"], + "@pixelaw/core-dojo": ["pixelaw.js/packages/core-dojo/src"], + "@pixelaw/core-mud": ["pixelaw.js/packages/core-mud/src"], + "@pixelaw/react": ["pixelaw.js/packages/react/src"], + "@pixelaw/react-dojo": ["pixelaw.js/packages/react-dojo/src"], + "@/*": ["src/*"] + } }, - "include": ["src"] + "include": ["src", "node_modules/@pixelaw/core-dojo/dist/index.d.ts"] } diff --git a/client/tsconfig.json b/client/tsconfig.json index 2b78387..1ffef60 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -1,10 +1,7 @@ { "files": [], - "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }], - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - } - } + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] } diff --git a/client/tsconfig.node.json b/client/tsconfig.node.json index 0d3d714..4f255e2 100644 --- a/client/tsconfig.node.json +++ b/client/tsconfig.node.json @@ -1,22 +1,30 @@ { "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", "target": "ES2022", "lib": ["ES2023"], "module": "ESNext", "skipLibCheck": true, - /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, "isolatedModules": true, "moduleDetection": "force", "noEmit": true, - /* Linting */ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + "paths": { + "@pixelaw/core": ["pixelaw.js/packages/core/src"], + "@pixelaw/core-dojo": ["pixelaw.js/packages/core-dojo/src"], + "@pixelaw/core-mud": ["pixelaw.js/packages/core-mud/src"], + "@pixelaw/react": ["pixelaw.js/packages/react/src"], + "@pixelaw/react-dojo": ["pixelaw.js/packages/react-dojo/src"], + "@/*": ["src/*"] + } }, "include": ["vite.config.ts"] } diff --git a/client/vite.config.ts b/client/vite.config.ts index 972fecd..99c277a 100644 --- a/client/vite.config.ts +++ b/client/vite.config.ts @@ -1,17 +1,120 @@ -import path from "path"; +import path from "node:path"; +import react from "@vitejs/plugin-react"; import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react-swc"; -import wasm from "vite-plugin-wasm"; -import topLevelAwait from "vite-plugin-top-level-await"; -import glsl from "vite-plugin-glsl"; import { viteEnvs } from "vite-envs"; +import topLevelAwait from "vite-plugin-top-level-await"; +import wasm from "vite-plugin-wasm"; +import fs from "node:fs"; + +const IN_WORKSPACE = fs.existsSync("pnpm-workspace.yaml"); -// https://vitejs.dev/config/ export default defineConfig({ - plugins: [react(), wasm(), topLevelAwait(), viteEnvs({ declarationFile: ".env.development" }), glsl()], + logLevel: "info", + optimizeDeps: { + // include: ['@pixelaw/core-dojo/dist/DojoSqlPixelStore.webworker.js'] + }, + plugins: [ + react(), + wasm(), + topLevelAwait(), + viteEnvs({ + declarationFile: ".env.example", + }), + { + name: "custom-logger", + configureServer(server) { + server.middlewares.use("/logs", (req, res, next) => { + if (req.method === "POST") { + let body = ""; + req.on("data", (chunk) => { + body += chunk.toString(); + }); + req.on("end", () => { + console.log(body); // Handle the log data as needed + res.statusCode = 200; + res.end(); + }); + } else { + next(); + } + }); + }, + }, + ], resolve: { - alias: { - "@": path.resolve(__dirname, "./src"), + alias: IN_WORKSPACE + ? { + "@pixelaw/core": path.resolve( + __dirname, + "../pixelaw.js/packages/core/src", + ), + "@pixelaw/core-dojo": path.resolve( + __dirname, + "../pixelaw.js/packages/core-dojo/src", + ), + "@pixelaw/core-mud": path.resolve( + __dirname, + "../pixelaw.js/packages/core-mud/src", + ), + "@pixelaw/react": path.resolve( + __dirname, + "../pixelaw.js/packages/react/src", + ), + "@pixelaw/react-dojo": path.resolve( + __dirname, + "../pixelaw.js/packages/react-dojo/src", + ), + "@": path.resolve(__dirname, "./src"), + } + : { + // TODO dirty hack to make the webworker available + "/node_modules/.vite/deps/DojoSqlPixelStore.webworker.js": + path.resolve( + __dirname, + "node_modules/@pixelaw/core-dojo/dist/DojoSqlPixelStore.webworker.js", + ), + "@": path.resolve(__dirname, "./src"), + }, + }, + build: { + target: "esnext", // FIXME this seems to fix the mysterious "index.html not found" error in vite build + sourcemap: true, + rollupOptions: { + input: { + main: path.resolve(__dirname, "index.html"), + }, + }, + }, + + server: { + host: "127.0.0.1", + proxy: { + "/api": { + target: "http://localhost:3000", + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, ""), + ws: true, + }, + "/torii": { + target: "http://localhost:8080", + changeOrigin: true, + rewrite: (path) => path.replace(/^\/torii/, ""), + // ws: true + }, + "/rpc": { + target: "http://localhost:5050", + changeOrigin: true, + rewrite: (path) => path.replace(/^\/rpc/, ""), + // ws: true + }, + }, + allowedHosts: true, //["px.tunnel.devsat.work"], + strictPort: true, + fs: { + allow: [ + path.resolve(__dirname, "../pixelaw.js/packages/core-dojo/src"), + path.resolve(__dirname, "./"), + ], }, }, }); diff --git a/client/vitest.config.ts b/client/vitest.config.ts new file mode 100644 index 0000000..b23f5cd --- /dev/null +++ b/client/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + globals: true, + includeSource: ["src/**/*.ts"], + }, +}); diff --git a/contracts/.github/workflows/ci-contracts.yml b/contracts/.github/workflows/ci-contracts.yml new file mode 100644 index 0000000..d6f3585 --- /dev/null +++ b/contracts/.github/workflows/ci-contracts.yml @@ -0,0 +1,33 @@ +name: ci-contracts + +on: + push: + branches: [main] + + pull_request: + branches: [main] + +env: + CARGO_TERM_COLOR: always + RUST_VERSION: 1.80.1 + +jobs: + cairofmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: software-mansion/setup-scarb@v1 + with: + scarb-version: "2.8.4" + - run: | + scarb fmt --check + core-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: asdf-vm/actions/setup@v3 + - run: | + asdf plugin add dojo https://github.com/dojoengine/asdf-dojo + asdf install dojo 1.4.0 + asdf global dojo 1.4.0 + sozo test diff --git a/contracts/.tool-versions b/contracts/.tool-versions index 7b2bea4..e782833 100644 --- a/contracts/.tool-versions +++ b/contracts/.tool-versions @@ -1,2 +1,2 @@ -dojo 1.0.4 -scarb 2.8.4 \ No newline at end of file +dojo 1.4.0 +scarb 2.9.4 \ No newline at end of file diff --git a/contracts/.vscode/settings.json b/contracts/.vscode/settings.json index d681426..a47ae42 100644 --- a/contracts/.vscode/settings.json +++ b/contracts/.vscode/settings.json @@ -1,7 +1,5 @@ { - "cairo1.enableLanguageServer": true, - "cairo1.languageServerPath": "${userHome}/.asdf/installs/dojo/1.0.4/bin/dojo-language-server", - "cairo1.enableScarb": true, - "cairo1.scarbPath": "${userHome}/.asdf/installs/scarb/2.8.4/bin/scarb", - "cairo1.preferScarbLanguageServer": false + "cairo1.enableLanguageServer": true, + "cairo1.enableScarb": true, + "cairo1.languageServerPath": "${userHome}/.dojo/bin/dojo-language-server" } diff --git a/contracts/LICENSE b/contracts/LICENSE new file mode 100644 index 0000000..545545e --- /dev/null +++ b/contracts/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 pixelaw + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/contracts/README.md b/contracts/README.md new file mode 100644 index 0000000..a637c95 --- /dev/null +++ b/contracts/README.md @@ -0,0 +1,47 @@ +# P/WAR Contracts + +This directory contains the smart contracts for the P/WAR project built with Cairo and Dojo. + +## Prerequisites + +Make sure you have the following tools installed: + +- [asdf](https://asdf-vm.com/) +- [scarb](https://docs.swmansion.com/scarb/) +- [dojo](https://github.com/dojoengine/dojo) + +The required versions are specified in the `.tool-versions` file in this directory. + +## Setup + +1. Install the dependencies: + +```bash +asdf install +``` + +## Building + +To build the contracts: + +```bash +sozo build +``` + +To generate TypeScript bindings: + +```bash +sozo build --typescript-v2 +``` + +The TypeScript bindings will be generated in the bindings/typescript directory. + +## Deploying + +To deploy the contracts locally: + +```bash +sozo migrate +``` + +This will deploy the contracts to your local Katana instance. \ No newline at end of file diff --git a/contracts/Scarb.lock b/contracts/Scarb.lock index 03ca59b..d95dc81 100644 --- a/contracts/Scarb.lock +++ b/contracts/Scarb.lock @@ -3,47 +3,49 @@ version = 1 [[package]] name = "dojo" -version = "1.0.4" -source = "git+https://github.com/dojoengine/dojo?tag=v1.0.4#e9f286c14f5952604bec915719c14b7f2d7b4233" +version = "1.4.0" +source = "git+https://github.com/dojoengine/dojo?tag=v1.4.0#22ef7101e84429f4f06fa634f927dd6ad2c48752" dependencies = [ "dojo_plugin", ] [[package]] name = "dojo_cairo_test" -version = "1.0.0-rc.0" -source = "git+https://github.com/dojoengine/dojo?tag=v1.0.4#e9f286c14f5952604bec915719c14b7f2d7b4233" +version = "1.0.12" +source = "git+https://github.com/dojoengine/dojo?tag=v1.4.0#22ef7101e84429f4f06fa634f927dd6ad2c48752" dependencies = [ "dojo", ] [[package]] name = "dojo_plugin" -version = "2.8.4" -source = "git+https://github.com/dojoengine/dojo?tag=v1.0.4#e9f286c14f5952604bec915719c14b7f2d7b4233" +version = "2.9.4" +source = "git+https://github.com/dojoengine/dojo?tag=v1.4.0#22ef7101e84429f4f06fa634f927dd6ad2c48752" [[package]] -name = "p_war" -version = "0.3.54" +name = "pixelaw" +version = "0.6.31" +source = "git+https://github.com/pixelaw/core?tag=v0.6.31#a69e77ab58a65f0623851f47a1ac19f67048133c" dependencies = [ - "dojo_cairo_test", - "pixelaw", - "pixelaw_test_helpers", + "dojo", ] [[package]] -name = "pixelaw" -version = "0.5.15" -source = "git+https://github.com/pixelaw/core?tag=v0.5.15#6f18b9210cd917b6247be8e77e96381c05284443" +name = "pixelaw_testing" +version = "0.6.31" +source = "git+https://github.com/pixelaw/core?tag=v0.6.31#a69e77ab58a65f0623851f47a1ac19f67048133c" dependencies = [ "dojo", + "dojo_cairo_test", + "pixelaw", ] [[package]] -name = "pixelaw_test_helpers" -version = "0.5.15" -source = "git+https://github.com/pixelaw/core?tag=v0.5.15#6f18b9210cd917b6247be8e77e96381c05284443" +name = "pwar" +version = "0.3.54" dependencies = [ "dojo", "dojo_cairo_test", + "pixelaw", + "pixelaw_testing", ] diff --git a/contracts/Scarb.toml b/contracts/Scarb.toml index 1506a92..e9ee168 100644 --- a/contracts/Scarb.toml +++ b/contracts/Scarb.toml @@ -1,22 +1,40 @@ [package] -cairo-version = "=2.8.4" -name = "p_war" +cairo-version = "=2.9.4" +name = "pwar" version = "0.3.54" +edition = "2024_07" [cairo] sierra-replace-ids = true [dependencies] -pixelaw = { git = "https://github.com/pixelaw/core", tag = "v0.5.15" } +pixelaw = { git = "https://github.com/pixelaw/core", tag = "v0.6.31" } +# pixelaw = { path = "../core/contracts" } +dojo = { git = "https://github.com/dojoengine/dojo", tag = "v1.4.0" } [dev-dependencies] -dojo_cairo_test = { git = "https://github.com/dojoengine/dojo", tag = "v1.0.4" } -pixelaw_test_helpers = { git = "https://github.com/pixelaw/core", tag = "v0.5.15" } +dojo_cairo_test = { git = "https://github.com/dojoengine/dojo", tag = "v1.4.0" } +pixelaw_testing = { git = "https://github.com/pixelaw/core", tag = "v0.6.31" } +#pixelaw_testing = { path = "../core/pixelaw_testing" } [[target.starknet-contract]] +sierra = true allowed-libfuncs-list.name = "experimental" + +#these external contract builds should come from pixelawjs build-external-contracts = [ "dojo::world::world_contract::world", + "pixelaw::core::models::pixel::m_Pixel", + "pixelaw::core::models::area::m_Area", + "pixelaw::core::models::queue::m_QueueItem", + "pixelaw::core::models::registry::m_App", + "pixelaw::core::models::registry::m_AppName", + "pixelaw::core::models::registry::m_CoreActionsAddress", + "pixelaw::core::models::area::m_RTree", + "pixelaw::core::models::area::m_Area", + "pixelaw::core::models::dummy::m_Dummy", + "pixelaw::core::events::e_QueueScheduled", + "pixelaw::core::events::e_Alert", "pixelaw::core::actions::actions", ] @@ -31,4 +49,4 @@ initialize = "bash ./scripts/default_auth.sh" upload_manifest = "bash ./scripts/upload_manifest.sh" ready_for_deployment_zsh = "zsh ./scripts/ready_for_deployment.sh" initialize_zsh = "zsh ./scripts/default_auth.sh" -upload_manifest_zsh = "zsh ./scripts/upload_manifest.sh" +upload_manifest_zsh = "zsh ./scripts/upload_manifest.sh" \ No newline at end of file diff --git a/contracts/bindings/inspect.txt b/contracts/bindings/inspect.txt new file mode 100644 index 0000000..dde8b7c --- /dev/null +++ b/contracts/bindings/inspect.txt @@ -0,0 +1,54 @@ + + World | Contract Address | Class Hash +--------+--------------------------------------------------------------------+-------------------------------------------------------------------- + Synced | 0x01d09b5e00f376337603943fc12715e439e91c0039f353b1cc48bb278dfa99d5 | 0x075fc75bcd1a7f8b4bf64b74978b0f89c8cee44bb755c1dae6f82284756451ec + + Namespaces | Status | Dojo Selector +------------+--------+-------------------------------------------------------------------- + pixelaw | Synced | 0x054b1a9dfb8f09560c4386777c6ec02c76a4aca5e18b896b2a9ee9b275c7ae77 + pwar | Synced | 0x06561ddf9cdf4c5e58f9a4258af70b5b066bfe37099c013e2cf1299466478754 + + Contracts | Status | Is Initialized | Dojo Selector | Contract Address +----------------------+-------------------+----------------+--------------------------------------------------------------------+-------------------------------------------------------------------- + pixelaw-actions | Migration skipped | true | 0x016928a49cfd8cf14e9f41e9d8f873890d1ab7d23b9a312d8a72f4031159876f | 0x0001f455be12a750b7228e5626e1efd6bcee4849f24e98bb098371d6e8f773f3 + pwar-guild_actions | Synced | true | 0x03c3b77d165909386294773571272f51dcefab9d0aa99d69b70796f6501d6f42 | 0x038be037c76817f4d73f7cec04a5bffb9d64ce544674f72637563708971ef1d3 + pwar-propose_actions | Synced | true | 0x05052f70e59d3197eee09586db5f0c9578581601c549020f478ffe96e57d8573 | 0x04038ddb14b806e40242355883643c009451a6b15fc9aa402a1248dae25a5a49 + pwar-pwar_actions | Synced | true | 0x03daa6a1f5dad3f5074b948a3e3a65e5b5f08198629686def58f43acce601a48 | 0x02226c41273351a3d09127412d87eab7ee2c934b6978da1342229201966014fa + pwar-voting_actions | Synced | true | 0x062e6ca68a564d25337ca245b38054c9b249d3a9d3d7bb0d97a6a817e473383a | 0x00379ac4b00a0ad23a102ea64d2686123300ef515605d0cea7df79405f4555ba + + Models | Status | Dojo Selector +----------------------------+-------------------+-------------------------------------------------------------------- + pixelaw-App | Migration skipped | 0x03650456503601ce448928ac87c54e3a6e95e76d725a59c95c7201324c9b2b74 + pixelaw-AppName | Migration skipped | 0x03b816829f5d924b5acc1c44d28b6b61b4edd94e62444c536b2bdc85c0e70a2a + pixelaw-Area | Migration skipped | 0x0041f22f1725b6e571bd66653e79fd700d80cc35c56f9dc5d663802e57478194 + pixelaw-CoreActionsAddress | Migration skipped | 0x05379e1ce3a70cb70f1e96dae1b142164574f33d4e32cebdb965b5aec30222c5 + pixelaw-Pixel | Migration skipped | 0x07e607b2fbb4cfb3fb9d1258fa2ff3aa94f17b3820e42bf1e6a43e2de3f5772e + pixelaw-QueueItem | Migration skipped | 0x0549a17f23ab80595d9abd4d989a3d4bf0c1987ebc08ad48aecab0f1e8c311b4 + pixelaw-RTree | Migration skipped | 0x03baaf9fe25823e8928b6fc6400e28e98d4b7618ff56faf269a11f3400a1c105 + pwar-AllowedColor | Synced | 0x058a38d0fade38ada8b7b4ea1ad3f72e83937b1d67a3db259cabf89da916c113 + pwar-Board | Synced | 0x04e3da83a446904f6e1ab085d8b84a1ad8d361ccc19820f30833510912cd483e + pwar-Dummy | Synced | 0x02962b188b8dc153cae1540d8ab6cb21672a46f9ab8651d7c912039d6fefab7f + pwar-Game | Synced | 0x046592e702ad6bb2731ed3e08a0de4b6923b9855554afa10f6b671ab9ceef2cf + pwar-GameId | Synced | 0x0543171bbc3c21261062cff1a10a96d431dff91bf380fb435b232915330d79d4 + pwar-GamePalette | Synced | 0x0708516af73e5ea91aabf8799d1678d91e64020fec55b52b41af2901eb6b4573 + pwar-Guild | Synced | 0x0141db48785b7b1b2d5b9454b58d87366cff6b3ce0afe8fbb0126d0bce96685f + pwar-InPalette | Synced | 0x035818e4ff6e9ba38342d5b79616d83fc230db430718620754e5cf5bf1d197a7 + pwar-PWarPixel | Synced | 0x04bb33c5d3d85c135e0d7674f328cdf38a2a45379605e2ddc72a95003a3f50cc + pwar-PaletteColors | Synced | 0x009d4e9107b255cc8990e2e459e784ebd2286530ae3cd4483aff5cd9efc7a316 + pwar-PixelRecoveryRate | Synced | 0x07643b1ef53792ea2a31f74047117109eefb2c758d6fe327ba6055514e0f84c0 + pwar-Player | Synced | 0x00631b0584b81d509f326cb0fb45670acda594c91ece205cbff98af9fddbaa6b + pwar-PlayerVote | Synced | 0x066568da1d9e588c2bddd14462c8b9d1ec593f155e87e04f66af56c3e0bac43c + pwar-Proposal | Synced | 0x05d86acb7206f393e6675d53560320dcaae768cfdfde5c04afe1892cb1cf53b5 + + Events | Status | Dojo Selector +------------------------+-------------------+-------------------------------------------------------------------- + pixelaw-QueueScheduled | Migration skipped | 0x032e74bc9762cc0dcdb6c7b67b35ded5b22a785e7c924673d6163369e6c6f769 + pwar-EndedGame | Synced | 0x0783100ea5deaebbb21ec5ceac9c06020b3a405f6eaebd35c3a4679b4052fe69 + pwar-GuildCreated | Synced | 0x04a60caf23cdcc73f43ca89900e0aaa5772ccb442b380e85cb7d1949c5fa04be + pwar-MemberAdded | Synced | 0x048d28bde10f0fff86325dd577e55fc08a477b03dbe72ab0f5969ab06e9b608b + pwar-MemberRemoved | Synced | 0x02c75a32891e878002edc63f1136f84a9620173a77bee76d592358d3ed3241fb + pwar-ProposalActivated | Synced | 0x00326c5fc197c47864260c462db88b3762de1746327e4f89be10fc53cae32af0 + pwar-ProposalCreated | Synced | 0x0460d31839213fdac40fd33efcd4c2ff242ddf8f100114c04b1617cfbc468fc2 + pwar-StartedGame | Synced | 0x0295cb760391553c019feacaaf6e248877c3ec968c5beff6d4395e5062a9ca0b + pwar-Voted | Synced | 0x0453c6d68c4f80ccaf9b772f8a86149d09fd156dbf0af86fbf9dd28e8b3eb22d + diff --git a/contracts/bindings/typescript/contracts.gen.ts b/contracts/bindings/typescript/contracts.gen.ts new file mode 100644 index 0000000..fa2c7c1 --- /dev/null +++ b/contracts/bindings/typescript/contracts.gen.ts @@ -0,0 +1,706 @@ +import { DojoProvider, DojoCall } from "@dojoengine/core"; +import { Account, AccountInterface, BigNumberish, CairoOption, CairoCustomEnum, ByteArray } from "starknet"; +import * as models from "./models.gen"; + +export function setupWorld(provider: DojoProvider) { + + const build_actions_addArea_calldata = (bounds: models.Bounds, owner: string, color: BigNumberish, app: string): DojoCall => { + return { + contractName: "actions", + entrypoint: "add_area", + calldata: [bounds, owner, color, app], + }; + }; + + const actions_addArea = async (snAccount: Account | AccountInterface, bounds: models.Bounds, owner: string, color: BigNumberish, app: string) => { + try { + return await provider.execute( + snAccount, + build_actions_addArea_calldata(bounds, owner, color, app), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_canUpdatePixel_calldata = (forPlayer: string, forSystem: string, pixel: models.Pixel, pixelUpdate: models.PixelUpdate, areaIdHint: CairoOption, allowModify: boolean): DojoCall => { + return { + contractName: "actions", + entrypoint: "can_update_pixel", + calldata: [forPlayer, forSystem, pixel, pixelUpdate, areaIdHint, allowModify], + }; + }; + + const actions_canUpdatePixel = async (snAccount: Account | AccountInterface, forPlayer: string, forSystem: string, pixel: models.Pixel, pixelUpdate: models.PixelUpdate, areaIdHint: CairoOption, allowModify: boolean) => { + try { + return await provider.execute( + snAccount, + build_actions_canUpdatePixel_calldata(forPlayer, forSystem, pixel, pixelUpdate, areaIdHint, allowModify), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_findAreaByPosition_calldata = (position: models.Position): DojoCall => { + return { + contractName: "actions", + entrypoint: "find_area_by_position", + calldata: [position], + }; + }; + + const actions_findAreaByPosition = async (snAccount: Account | AccountInterface, position: models.Position) => { + try { + return await provider.execute( + snAccount, + build_actions_findAreaByPosition_calldata(position), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_findAreasInsideBounds_calldata = (bounds: models.Bounds): DojoCall => { + return { + contractName: "actions", + entrypoint: "find_areas_inside_bounds", + calldata: [bounds], + }; + }; + + const actions_findAreasInsideBounds = async (snAccount: Account | AccountInterface, bounds: models.Bounds) => { + try { + return await provider.execute( + snAccount, + build_actions_findAreasInsideBounds_calldata(bounds), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_newApp_calldata = (system: string, name: BigNumberish, icon: BigNumberish): DojoCall => { + return { + contractName: "actions", + entrypoint: "new_app", + calldata: [system, name, icon], + }; + }; + + const actions_newApp = async (snAccount: Account | AccountInterface, system: string, name: BigNumberish, icon: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_actions_newApp_calldata(system, name, icon), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_notification_calldata = (position: models.Position, color: BigNumberish, from: CairoOption, to: CairoOption, text: BigNumberish): DojoCall => { + return { + contractName: "actions", + entrypoint: "notification", + calldata: [position, color, from, to, text], + }; + }; + + const actions_notification = async (snAccount: Account | AccountInterface, position: models.Position, color: BigNumberish, from: CairoOption, to: CairoOption, text: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_actions_notification_calldata(position, color, from, to, text), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_processQueue_calldata = (id: BigNumberish, timestamp: BigNumberish, calledSystem: string, selector: BigNumberish, calldata: Array): DojoCall => { + return { + contractName: "actions", + entrypoint: "process_queue", + calldata: [id, timestamp, calledSystem, selector, calldata], + }; + }; + + const actions_processQueue = async (snAccount: Account | AccountInterface, id: BigNumberish, timestamp: BigNumberish, calledSystem: string, selector: BigNumberish, calldata: Array) => { + try { + return await provider.execute( + snAccount, + build_actions_processQueue_calldata(id, timestamp, calledSystem, selector, calldata), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_removeArea_calldata = (areaId: BigNumberish): DojoCall => { + return { + contractName: "actions", + entrypoint: "remove_area", + calldata: [areaId], + }; + }; + + const actions_removeArea = async (snAccount: Account | AccountInterface, areaId: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_actions_removeArea_calldata(areaId), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_scheduleQueue_calldata = (timestamp: BigNumberish, calledSystem: string, selector: BigNumberish, calldata: Array): DojoCall => { + return { + contractName: "actions", + entrypoint: "schedule_queue", + calldata: [timestamp, calledSystem, selector, calldata], + }; + }; + + const actions_scheduleQueue = async (snAccount: Account | AccountInterface, timestamp: BigNumberish, calledSystem: string, selector: BigNumberish, calldata: Array) => { + try { + return await provider.execute( + snAccount, + build_actions_scheduleQueue_calldata(timestamp, calledSystem, selector, calldata), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_updatePixel_calldata = (forPlayer: string, forSystem: string, pixelUpdate: models.PixelUpdate, areaId: CairoOption, allowModify: boolean): DojoCall => { + return { + contractName: "actions", + entrypoint: "update_pixel", + calldata: [forPlayer, forSystem, pixelUpdate, areaId, allowModify], + }; + }; + + const actions_updatePixel = async (snAccount: Account | AccountInterface, forPlayer: string, forSystem: string, pixelUpdate: models.PixelUpdate, areaId: CairoOption, allowModify: boolean) => { + try { + return await provider.execute( + snAccount, + build_actions_updatePixel_calldata(forPlayer, forSystem, pixelUpdate, areaId, allowModify), + "pixelaw", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_addMember_calldata = (gameId: BigNumberish, guildId: BigNumberish, newMember: string): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "add_member", + calldata: [gameId, guildId, newMember], + }; + }; + + const guild_actions_addMember = async (snAccount: Account | AccountInterface, gameId: BigNumberish, guildId: BigNumberish, newMember: string) => { + try { + return await provider.execute( + snAccount, + build_guild_actions_addMember_calldata(gameId, guildId, newMember), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_createGuild_calldata = (gameId: BigNumberish, guildName: BigNumberish): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "create_guild", + calldata: [gameId, guildName], + }; + }; + + const guild_actions_createGuild = async (snAccount: Account | AccountInterface, gameId: BigNumberish, guildName: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_guild_actions_createGuild_calldata(gameId, guildName), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_getGuild_calldata = (gameId: BigNumberish, guildId: BigNumberish): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "get_guild", + calldata: [gameId, guildId], + }; + }; + + const guild_actions_getGuild = async (gameId: BigNumberish, guildId: BigNumberish) => { + try { + return await provider.call("pwar", build_guild_actions_getGuild_calldata(gameId, guildId)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_getGuildPoints_calldata = (gameId: BigNumberish, guildId: BigNumberish): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "get_guild_points", + calldata: [gameId, guildId], + }; + }; + + const guild_actions_getGuildPoints = async (gameId: BigNumberish, guildId: BigNumberish) => { + try { + return await provider.call("pwar", build_guild_actions_getGuildPoints_calldata(gameId, guildId)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_getPlayerCommit_calldata = (playerAddress: string): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "get_player_commit", + calldata: [playerAddress], + }; + }; + + const guild_actions_getPlayerCommit = async (playerAddress: string) => { + try { + return await provider.call("pwar", build_guild_actions_getPlayerCommit_calldata(playerAddress)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_getPlayerOwns_calldata = (playerAddress: string): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "get_player_owns", + calldata: [playerAddress], + }; + }; + + const guild_actions_getPlayerOwns = async (playerAddress: string) => { + try { + return await provider.call("pwar", build_guild_actions_getPlayerOwns_calldata(playerAddress)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_isMember_calldata = (gameId: BigNumberish, guildId: BigNumberish, member: string): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "is_member", + calldata: [gameId, guildId, member], + }; + }; + + const guild_actions_isMember = async (gameId: BigNumberish, guildId: BigNumberish, member: string) => { + try { + return await provider.call("pwar", build_guild_actions_isMember_calldata(gameId, guildId, member)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_joinGuild_calldata = (gameId: BigNumberish, guildId: BigNumberish): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "join_guild", + calldata: [gameId, guildId], + }; + }; + + const guild_actions_joinGuild = async (snAccount: Account | AccountInterface, gameId: BigNumberish, guildId: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_guild_actions_joinGuild_calldata(gameId, guildId), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_guild_actions_removeMember_calldata = (gameId: BigNumberish, guildId: BigNumberish, member: string): DojoCall => { + return { + contractName: "guild_actions", + entrypoint: "remove_member", + calldata: [gameId, guildId, member], + }; + }; + + const guild_actions_removeMember = async (snAccount: Account | AccountInterface, gameId: BigNumberish, guildId: BigNumberish, member: string) => { + try { + return await provider.execute( + snAccount, + build_guild_actions_removeMember_calldata(gameId, guildId, member), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_propose_actions_activateProposal_calldata = (gameId: BigNumberish, index: BigNumberish, clearData: Array): DojoCall => { + return { + contractName: "propose_actions", + entrypoint: "activate_proposal", + calldata: [gameId, index, clearData], + }; + }; + + const propose_actions_activateProposal = async (snAccount: Account | AccountInterface, gameId: BigNumberish, index: BigNumberish, clearData: Array) => { + try { + return await provider.execute( + snAccount, + build_propose_actions_activateProposal_calldata(gameId, index, clearData), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_propose_actions_addNewColor_calldata = (gameId: BigNumberish, index: BigNumberish, game: models.Game, proposal: models.Proposal): DojoCall => { + return { + contractName: "propose_actions", + entrypoint: "add_new_color", + calldata: [gameId, index, game, proposal], + }; + }; + + const propose_actions_addNewColor = async (snAccount: Account | AccountInterface, gameId: BigNumberish, index: BigNumberish, game: models.Game, proposal: models.Proposal) => { + try { + return await provider.execute( + snAccount, + build_propose_actions_addNewColor_calldata(gameId, index, game, proposal), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_propose_actions_createProposal_calldata = (gameId: BigNumberish, proposalType: BigNumberish, targetArgs1: BigNumberish, targetArgs2: BigNumberish): DojoCall => { + return { + contractName: "propose_actions", + entrypoint: "create_proposal", + calldata: [gameId, proposalType, targetArgs1, targetArgs2], + }; + }; + + const propose_actions_createProposal = async (snAccount: Account | AccountInterface, gameId: BigNumberish, proposalType: BigNumberish, targetArgs1: BigNumberish, targetArgs2: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_propose_actions_createProposal_calldata(gameId, proposalType, targetArgs1, targetArgs2), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_propose_actions_resetToWhite_calldata = (gameId: BigNumberish, index: BigNumberish, game: models.Game, proposal: models.Proposal, clearData: Array): DojoCall => { + return { + contractName: "propose_actions", + entrypoint: "reset_to_white", + calldata: [gameId, index, game, proposal, clearData], + }; + }; + + const propose_actions_resetToWhite = async (snAccount: Account | AccountInterface, gameId: BigNumberish, index: BigNumberish, game: models.Game, proposal: models.Proposal, clearData: Array) => { + try { + return await provider.execute( + snAccount, + build_propose_actions_resetToWhite_calldata(gameId, index, game, proposal, clearData), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_createGame_calldata = (origin: models.Position): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "create_game", + calldata: [origin], + }; + }; + + const pwar_actions_createGame = async (snAccount: Account | AccountInterface, origin: models.Position) => { + try { + return await provider.execute( + snAccount, + build_pwar_actions_createGame_calldata(origin), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_createGameGuilds_calldata = (gameId: BigNumberish, guildDispatcher: models.IGuildDispatcher): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "create_game_guilds", + calldata: [gameId, guildDispatcher], + }; + }; + + const pwar_actions_createGameGuilds = async (snAccount: Account | AccountInterface, gameId: BigNumberish, guildDispatcher: models.IGuildDispatcher) => { + try { + return await provider.execute( + snAccount, + build_pwar_actions_createGameGuilds_calldata(gameId, guildDispatcher), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_endGame_calldata = (gameId: BigNumberish): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "end_game", + calldata: [gameId], + }; + }; + + const pwar_actions_endGame = async (snAccount: Account | AccountInterface, gameId: BigNumberish) => { + try { + return await provider.execute( + snAccount, + build_pwar_actions_endGame_calldata(gameId), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_getGame_calldata = (id: BigNumberish): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "get_game", + calldata: [id], + }; + }; + + const pwar_actions_getGame = async (id: BigNumberish) => { + try { + return await provider.call("pwar", build_pwar_actions_getGame_calldata(id)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_getGameId_calldata = (position: models.Position): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "get_game_id", + calldata: [position], + }; + }; + + const pwar_actions_getGameId = async (position: models.Position) => { + try { + return await provider.call("pwar", build_pwar_actions_getGameId_calldata(position)); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_interact_calldata = (defaultParams: models.DefaultParameters): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "interact", + calldata: [defaultParams], + }; + }; + + const pwar_actions_interact = async (snAccount: Account | AccountInterface, defaultParams: models.DefaultParameters) => { + try { + return await provider.execute( + snAccount, + build_pwar_actions_interact_calldata(defaultParams), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_pwar_actions_placePixel_calldata = (app: string, defaultParams: models.DefaultParameters): DojoCall => { + return { + contractName: "pwar_actions", + entrypoint: "place_pixel", + calldata: [app, defaultParams], + }; + }; + + const pwar_actions_placePixel = async (snAccount: Account | AccountInterface, app: string, defaultParams: models.DefaultParameters) => { + try { + return await provider.execute( + snAccount, + build_pwar_actions_placePixel_calldata(app, defaultParams), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_voting_actions_vote_calldata = (gameId: BigNumberish, index: BigNumberish, usePx: BigNumberish, isInFavor: boolean): DojoCall => { + return { + contractName: "voting_actions", + entrypoint: "vote", + calldata: [gameId, index, usePx, isInFavor], + }; + }; + + const voting_actions_vote = async (snAccount: Account | AccountInterface, gameId: BigNumberish, index: BigNumberish, usePx: BigNumberish, isInFavor: boolean) => { + try { + return await provider.execute( + snAccount, + build_voting_actions_vote_calldata(gameId, index, usePx, isInFavor), + "pwar", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + + + return { + actions: { + addArea: actions_addArea, + buildAddAreaCalldata: build_actions_addArea_calldata, + canUpdatePixel: actions_canUpdatePixel, + buildCanUpdatePixelCalldata: build_actions_canUpdatePixel_calldata, + findAreaByPosition: actions_findAreaByPosition, + buildFindAreaByPositionCalldata: build_actions_findAreaByPosition_calldata, + findAreasInsideBounds: actions_findAreasInsideBounds, + buildFindAreasInsideBoundsCalldata: build_actions_findAreasInsideBounds_calldata, + newApp: actions_newApp, + buildNewAppCalldata: build_actions_newApp_calldata, + notification: actions_notification, + buildNotificationCalldata: build_actions_notification_calldata, + processQueue: actions_processQueue, + buildProcessQueueCalldata: build_actions_processQueue_calldata, + removeArea: actions_removeArea, + buildRemoveAreaCalldata: build_actions_removeArea_calldata, + scheduleQueue: actions_scheduleQueue, + buildScheduleQueueCalldata: build_actions_scheduleQueue_calldata, + updatePixel: actions_updatePixel, + buildUpdatePixelCalldata: build_actions_updatePixel_calldata, + }, + guild_actions: { + addMember: guild_actions_addMember, + buildAddMemberCalldata: build_guild_actions_addMember_calldata, + createGuild: guild_actions_createGuild, + buildCreateGuildCalldata: build_guild_actions_createGuild_calldata, + getGuild: guild_actions_getGuild, + buildGetGuildCalldata: build_guild_actions_getGuild_calldata, + getGuildPoints: guild_actions_getGuildPoints, + buildGetGuildPointsCalldata: build_guild_actions_getGuildPoints_calldata, + getPlayerCommit: guild_actions_getPlayerCommit, + buildGetPlayerCommitCalldata: build_guild_actions_getPlayerCommit_calldata, + getPlayerOwns: guild_actions_getPlayerOwns, + buildGetPlayerOwnsCalldata: build_guild_actions_getPlayerOwns_calldata, + isMember: guild_actions_isMember, + buildIsMemberCalldata: build_guild_actions_isMember_calldata, + joinGuild: guild_actions_joinGuild, + buildJoinGuildCalldata: build_guild_actions_joinGuild_calldata, + removeMember: guild_actions_removeMember, + buildRemoveMemberCalldata: build_guild_actions_removeMember_calldata, + }, + propose_actions: { + activateProposal: propose_actions_activateProposal, + buildActivateProposalCalldata: build_propose_actions_activateProposal_calldata, + addNewColor: propose_actions_addNewColor, + buildAddNewColorCalldata: build_propose_actions_addNewColor_calldata, + createProposal: propose_actions_createProposal, + buildCreateProposalCalldata: build_propose_actions_createProposal_calldata, + resetToWhite: propose_actions_resetToWhite, + buildResetToWhiteCalldata: build_propose_actions_resetToWhite_calldata, + }, + pwar_actions: { + createGame: pwar_actions_createGame, + buildCreateGameCalldata: build_pwar_actions_createGame_calldata, + createGameGuilds: pwar_actions_createGameGuilds, + buildCreateGameGuildsCalldata: build_pwar_actions_createGameGuilds_calldata, + endGame: pwar_actions_endGame, + buildEndGameCalldata: build_pwar_actions_endGame_calldata, + getGame: pwar_actions_getGame, + buildGetGameCalldata: build_pwar_actions_getGame_calldata, + getGameId: pwar_actions_getGameId, + buildGetGameIdCalldata: build_pwar_actions_getGameId_calldata, + interact: pwar_actions_interact, + buildInteractCalldata: build_pwar_actions_interact_calldata, + placePixel: pwar_actions_placePixel, + buildPlacePixelCalldata: build_pwar_actions_placePixel_calldata, + }, + voting_actions: { + vote: voting_actions_vote, + buildVoteCalldata: build_voting_actions_vote_calldata, + }, + }; +} \ No newline at end of file diff --git a/contracts/bindings/typescript/models.gen.ts b/contracts/bindings/typescript/models.gen.ts new file mode 100644 index 0000000..928cd31 --- /dev/null +++ b/contracts/bindings/typescript/models.gen.ts @@ -0,0 +1,994 @@ +import type { SchemaType as ISchemaType } from "@dojoengine/sdk"; + +import { CairoOption, CairoOptionVariant, BigNumberish } from 'starknet'; + +// Type definition for `pixelaw::core::models::area::Area` struct +export interface Area { + id: BigNumberish; + app: string; + owner: string; + color: BigNumberish; +} + +// Type definition for `pixelaw::core::models::area::AreaValue` struct +export interface AreaValue { + app: string; + owner: string; + color: BigNumberish; +} + +// Type definition for `pixelaw::core::models::area::RTree` struct +export interface RTree { + id: BigNumberish; + children: BigNumberish; +} + +// Type definition for `pixelaw::core::models::area::RTreeValue` struct +export interface RTreeValue { + children: BigNumberish; +} + +// Type definition for `pixelaw::core::models::dummy::Dummy` struct +export interface Dummy { + id: BigNumberish; + defaultParams: DefaultParameters; + bounds: Bounds; + pixelUpdate: PixelUpdate; + emoji: Emoji; +} + +// Type definition for `pixelaw::core::models::dummy::DummyValue` struct +export interface DummyValue { + defaultParams: DefaultParameters; + bounds: Bounds; + pixelUpdate: PixelUpdate; + emoji: Emoji; +} + +// Type definition for `pixelaw::core::models::pixel::Pixel` struct +export interface Pixel { + position: Position; + app: string; + color: BigNumberish; + created_at: BigNumberish; + updated_at: BigNumberish; + timestamp: BigNumberish; + owner: string; + text: BigNumberish; + action: BigNumberish; +} + +// Type definition for `pixelaw::core::models::pixel::PixelUpdate` struct +export interface PixelUpdate { + position: Position; + color: CairoOption; + owner: CairoOption; + app: CairoOption; + text: CairoOption; + timestamp: CairoOption; + action: CairoOption; +} + +// Type definition for `pixelaw::core::models::pixel::PixelValue` struct +export interface PixelValue { + app: string; + color: BigNumberish; + created_at: BigNumberish; + updated_at: BigNumberish; + timestamp: BigNumberish; + owner: string; + text: BigNumberish; + action: BigNumberish; +} + +// Type definition for `pixelaw::core::models::queue::QueueItem` struct +export interface QueueItem { + id: BigNumberish; + valid: boolean; +} + +// Type definition for `pixelaw::core::models::queue::QueueItemValue` struct +export interface QueueItemValue { + valid: boolean; +} + +// Type definition for `pixelaw::core::models::registry::App` struct +export interface App { + system: string; + name: BigNumberish; + icon: BigNumberish; + action: BigNumberish; +} + +// Type definition for `pixelaw::core::models::registry::AppName` struct +export interface AppName { + name: BigNumberish; + system: string; +} + +// Type definition for `pixelaw::core::models::registry::AppNameValue` struct +export interface AppNameValue { + system: string; +} + +// Type definition for `pixelaw::core::models::registry::AppValue` struct +export interface AppValue { + name: BigNumberish; + icon: BigNumberish; + action: BigNumberish; +} + +// Type definition for `pixelaw::core::models::registry::CoreActionsAddress` struct +export interface CoreActionsAddress { + key: BigNumberish; + value: string; +} + +// Type definition for `pixelaw::core::models::registry::CoreActionsAddressValue` struct +export interface CoreActionsAddressValue { + value: string; +} + +// Type definition for `pixelaw::core::utils::Bounds` struct +export interface Bounds { + x_min: BigNumberish; + y_min: BigNumberish; + x_max: BigNumberish; + y_max: BigNumberish; +} + +// Type definition for `pixelaw::core::utils::DefaultParameters` struct +export interface DefaultParameters { + player_override: CairoOption; + system_override: CairoOption; + area_hint: CairoOption; + position: Position; + color: BigNumberish; +} + +// Type definition for `pixelaw::core::utils::Emoji` struct +export interface Emoji { + value: BigNumberish; +} + +// Type definition for `pixelaw::core::utils::Position` struct +export interface Position { + x: BigNumberish; + y: BigNumberish; +} + +// Type definition for `pwar::models::allowed_color::AllowedColor` struct +export interface AllowedColor { + game_id: BigNumberish; + color: BigNumberish; + is_allowed: boolean; +} + +// Type definition for `pwar::models::allowed_color::AllowedColorValue` struct +export interface AllowedColorValue { + is_allowed: boolean; +} + +// Type definition for `pwar::models::allowed_color::GamePalette` struct +export interface GamePalette { + game_id: BigNumberish; + length: BigNumberish; +} + +// Type definition for `pwar::models::allowed_color::GamePaletteValue` struct +export interface GamePaletteValue { + length: BigNumberish; +} + +// Type definition for `pwar::models::allowed_color::InPalette` struct +export interface InPalette { + game_id: BigNumberish; + color: BigNumberish; + value: boolean; +} + +// Type definition for `pwar::models::allowed_color::InPaletteValue` struct +export interface InPaletteValue { + value: boolean; +} + +// Type definition for `pwar::models::allowed_color::PaletteColors` struct +export interface PaletteColors { + game_id: BigNumberish; + idx: BigNumberish; + color: BigNumberish; +} + +// Type definition for `pwar::models::allowed_color::PaletteColorsValue` struct +export interface PaletteColorsValue { + color: BigNumberish; +} + +// Type definition for `pwar::models::board::Board` struct +export interface Board { + id: BigNumberish; + origin: Position; + width: BigNumberish; + height: BigNumberish; +} + +// Type definition for `pwar::models::board::BoardValue` struct +export interface BoardValue { + origin: Position; + width: BigNumberish; + height: BigNumberish; +} + +// Type definition for `pwar::models::board::GameId` struct +export interface GameId { + x: BigNumberish; + y: BigNumberish; + value: BigNumberish; +} + +// Type definition for `pwar::models::board::GameIdValue` struct +export interface GameIdValue { + value: BigNumberish; +} + +// Type definition for `pwar::models::board::PWarPixel` struct +export interface PWarPixel { + position: Position; + owner: string; +} + +// Type definition for `pwar::models::board::PWarPixelValue` struct +export interface PWarPixelValue { + owner: string; +} + +// Type definition for `pwar::models::game::Game` struct +export interface Game { + id: BigNumberish; + start: BigNumberish; + end: BigNumberish; + proposal_idx: BigNumberish; + coeff_own_pixels: BigNumberish; + coeff_commits: BigNumberish; + winner_config: BigNumberish; + winner: string; + guild_ids: Array; + guild_count: BigNumberish; +} + +// Type definition for `pwar::models::game::GameValue` struct +export interface GameValue { + start: BigNumberish; + end: BigNumberish; + proposal_idx: BigNumberish; + coeff_own_pixels: BigNumberish; + coeff_commits: BigNumberish; + winner_config: BigNumberish; + winner: string; + guild_ids: Array; + guild_count: BigNumberish; +} + +// Type definition for `pwar::models::guilds::Guild` struct +export interface Guild { + game_id: BigNumberish; + guild_id: BigNumberish; + guild_name: BigNumberish; + creator: string; + members: Array; + member_count: BigNumberish; +} + +// Type definition for `pwar::models::guilds::GuildValue` struct +export interface GuildValue { + guild_name: BigNumberish; + creator: string; + members: Array; + member_count: BigNumberish; +} + +// Type definition for `pwar::models::player::Player` struct +export interface Player { + address: string; + num_owns: BigNumberish; + num_commit: BigNumberish; + last_date: BigNumberish; + is_banned: boolean; +} + +// Type definition for `pwar::models::player::PlayerValue` struct +export interface PlayerValue { + num_owns: BigNumberish; + num_commit: BigNumberish; + last_date: BigNumberish; + is_banned: boolean; +} + +// Type definition for `pwar::models::proposal::PixelRecoveryRate` struct +export interface PixelRecoveryRate { + game_id: BigNumberish; + rate: BigNumberish; +} + +// Type definition for `pwar::models::proposal::PixelRecoveryRateValue` struct +export interface PixelRecoveryRateValue { + rate: BigNumberish; +} + +// Type definition for `pwar::models::proposal::PlayerVote` struct +export interface PlayerVote { + player: string; + game_id: BigNumberish; + index: BigNumberish; + is_in_favor: boolean; + voting_power: BigNumberish; +} + +// Type definition for `pwar::models::proposal::PlayerVoteValue` struct +export interface PlayerVoteValue { + is_in_favor: boolean; + voting_power: BigNumberish; +} + +// Type definition for `pwar::models::proposal::Proposal` struct +export interface Proposal { + game_id: BigNumberish; + index: BigNumberish; + author: string; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; + start: BigNumberish; + end: BigNumberish; + yes_voting_power: BigNumberish; + no_voting_power: BigNumberish; + is_activated: boolean; +} + +// Type definition for `pwar::models::proposal::ProposalValue` struct +export interface ProposalValue { + author: string; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; + start: BigNumberish; + end: BigNumberish; + yes_voting_power: BigNumberish; + no_voting_power: BigNumberish; + is_activated: boolean; +} + +// Type definition for `pixelaw::core::events::QueueScheduled` struct +export interface QueueScheduled { + id: BigNumberish; + timestamp: BigNumberish; + called_system: string; + selector: BigNumberish; + calldata: Array; +} + +// Type definition for `pixelaw::core::events::QueueScheduledValue` struct +export interface QueueScheduledValue { + timestamp: BigNumberish; + called_system: string; + selector: BigNumberish; + calldata: Array; +} + +// Type definition for `pwar::systems::actions::pwar_actions::EndedGame` struct +export interface EndedGame { + id: BigNumberish; + timestamp: BigNumberish; +} + +// Type definition for `pwar::systems::actions::pwar_actions::EndedGameValue` struct +export interface EndedGameValue { + timestamp: BigNumberish; +} + +// Type definition for `pwar::systems::actions::pwar_actions::StartedGame` struct +export interface StartedGame { + id: BigNumberish; + timestamp: BigNumberish; + creator: string; +} + +// Type definition for `pwar::systems::actions::pwar_actions::StartedGameValue` struct +export interface StartedGameValue { + timestamp: BigNumberish; + creator: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::GuildCreated` struct +export interface GuildCreated { + game_id: BigNumberish; + guild_id: BigNumberish; + guild_name: BigNumberish; + creator: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::GuildCreatedValue` struct +export interface GuildCreatedValue { + guild_id: BigNumberish; + guild_name: BigNumberish; + creator: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::MemberAdded` struct +export interface MemberAdded { + game_id: BigNumberish; + guild_id: BigNumberish; + member: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::MemberAddedValue` struct +export interface MemberAddedValue { + guild_id: BigNumberish; + member: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::MemberRemoved` struct +export interface MemberRemoved { + game_id: BigNumberish; + guild_id: BigNumberish; + member: string; +} + +// Type definition for `pwar::systems::guilds::guild_actions::MemberRemovedValue` struct +export interface MemberRemovedValue { + guild_id: BigNumberish; + member: string; +} + +// Type definition for `pwar::systems::propose::propose_actions::ProposalActivated` struct +export interface ProposalActivated { + game_id: BigNumberish; + index: BigNumberish; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; +} + +// Type definition for `pwar::systems::propose::propose_actions::ProposalActivatedValue` struct +export interface ProposalActivatedValue { + index: BigNumberish; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; +} + +// Type definition for `pwar::systems::propose::propose_actions::ProposalCreated` struct +export interface ProposalCreated { + game_id: BigNumberish; + index: BigNumberish; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; +} + +// Type definition for `pwar::systems::propose::propose_actions::ProposalCreatedValue` struct +export interface ProposalCreatedValue { + index: BigNumberish; + proposal_type: BigNumberish; + target_args_1: BigNumberish; + target_args_2: BigNumberish; +} + +// Type definition for `pwar::systems::voting::voting_actions::Voted` struct +export interface Voted { + game_id: BigNumberish; + index: BigNumberish; + timestamp: BigNumberish; + voter: string; + is_in_favor: boolean; +} + +// Type definition for `pwar::systems::voting::voting_actions::VotedValue` struct +export interface VotedValue { + index: BigNumberish; + timestamp: BigNumberish; + voter: string; + is_in_favor: boolean; +} + +export interface SchemaType extends ISchemaType { + pixelaw: { + Area: Area, + AreaValue: AreaValue, + RTree: RTree, + RTreeValue: RTreeValue, + Dummy: Dummy, + DummyValue: DummyValue, + Pixel: Pixel, + PixelUpdate: PixelUpdate, + PixelValue: PixelValue, + QueueItem: QueueItem, + QueueItemValue: QueueItemValue, + App: App, + AppName: AppName, + AppNameValue: AppNameValue, + AppValue: AppValue, + CoreActionsAddress: CoreActionsAddress, + CoreActionsAddressValue: CoreActionsAddressValue, + Bounds: Bounds, + DefaultParameters: DefaultParameters, + Emoji: Emoji, + Position: Position, + }, + pwar: { + AllowedColor: AllowedColor, + AllowedColorValue: AllowedColorValue, + GamePalette: GamePalette, + GamePaletteValue: GamePaletteValue, + InPalette: InPalette, + InPaletteValue: InPaletteValue, + PaletteColors: PaletteColors, + PaletteColorsValue: PaletteColorsValue, + Board: Board, + BoardValue: BoardValue, + GameId: GameId, + GameIdValue: GameIdValue, + PWarPixel: PWarPixel, + PWarPixelValue: PWarPixelValue, + Game: Game, + GameValue: GameValue, + Guild: Guild, + GuildValue: GuildValue, + Player: Player, + PlayerValue: PlayerValue, + PixelRecoveryRate: PixelRecoveryRate, + PixelRecoveryRateValue: PixelRecoveryRateValue, + PlayerVote: PlayerVote, + PlayerVoteValue: PlayerVoteValue, + Proposal: Proposal, + ProposalValue: ProposalValue, + QueueScheduled: QueueScheduled, + QueueScheduledValue: QueueScheduledValue, + EndedGame: EndedGame, + EndedGameValue: EndedGameValue, + StartedGame: StartedGame, + StartedGameValue: StartedGameValue, + GuildCreated: GuildCreated, + GuildCreatedValue: GuildCreatedValue, + MemberAdded: MemberAdded, + MemberAddedValue: MemberAddedValue, + MemberRemoved: MemberRemoved, + MemberRemovedValue: MemberRemovedValue, + ProposalActivated: ProposalActivated, + ProposalActivatedValue: ProposalActivatedValue, + ProposalCreated: ProposalCreated, + ProposalCreatedValue: ProposalCreatedValue, + Voted: Voted, + VotedValue: VotedValue, + }, +} +export const schema: SchemaType = { + pixelaw: { + Area: { + id: 0, + app: "", + owner: "", + color: 0, + }, + AreaValue: { + app: "", + owner: "", + color: 0, + }, + RTree: { + id: 0, + children: 0, + }, + RTreeValue: { + children: 0, + }, + Dummy: { + id: 0, + defaultParams: { player_override: new CairoOption(CairoOptionVariant.None), system_override: new CairoOption(CairoOptionVariant.None), area_hint: new CairoOption(CairoOptionVariant.None), position: { x: 0, y: 0, }, color: 0, }, + bounds: { x_min: 0, y_min: 0, x_max: 0, y_max: 0, }, + pixelUpdate: { position: { x: 0, y: 0, }, color: new CairoOption(CairoOptionVariant.None), owner: new CairoOption(CairoOptionVariant.None), app: new CairoOption(CairoOptionVariant.None), text: new CairoOption(CairoOptionVariant.None), timestamp: new CairoOption(CairoOptionVariant.None), action: new CairoOption(CairoOptionVariant.None), }, + emoji: { value: 0, }, + }, + DummyValue: { + defaultParams: { player_override: new CairoOption(CairoOptionVariant.None), system_override: new CairoOption(CairoOptionVariant.None), area_hint: new CairoOption(CairoOptionVariant.None), position: { x: 0, y: 0, }, color: 0, }, + bounds: { x_min: 0, y_min: 0, x_max: 0, y_max: 0, }, + pixelUpdate: { position: { x: 0, y: 0, }, color: new CairoOption(CairoOptionVariant.None), owner: new CairoOption(CairoOptionVariant.None), app: new CairoOption(CairoOptionVariant.None), text: new CairoOption(CairoOptionVariant.None), timestamp: new CairoOption(CairoOptionVariant.None), action: new CairoOption(CairoOptionVariant.None), }, + emoji: { value: 0, }, + }, + Pixel: { + position: { x: 0, y: 0, }, + app: "", + color: 0, + created_at: 0, + updated_at: 0, + timestamp: 0, + owner: "", + text: 0, + action: 0, + }, + PixelUpdate: { + position: { x: 0, y: 0, }, + color: new CairoOption(CairoOptionVariant.None), + owner: new CairoOption(CairoOptionVariant.None), + app: new CairoOption(CairoOptionVariant.None), + text: new CairoOption(CairoOptionVariant.None), + timestamp: new CairoOption(CairoOptionVariant.None), + action: new CairoOption(CairoOptionVariant.None), + }, + PixelValue: { + app: "", + color: 0, + created_at: 0, + updated_at: 0, + timestamp: 0, + owner: "", + text: 0, + action: 0, + }, + QueueItem: { + id: 0, + valid: false, + }, + QueueItemValue: { + valid: false, + }, + App: { + system: "", + name: 0, + icon: 0, + action: 0, + }, + AppName: { + name: 0, + system: "", + }, + AppNameValue: { + system: "", + }, + AppValue: { + name: 0, + icon: 0, + action: 0, + }, + CoreActionsAddress: { + key: 0, + value: "", + }, + CoreActionsAddressValue: { + value: "", + }, + Bounds: { + x_min: 0, + y_min: 0, + x_max: 0, + y_max: 0, + }, + DefaultParameters: { + player_override: new CairoOption(CairoOptionVariant.None), + system_override: new CairoOption(CairoOptionVariant.None), + area_hint: new CairoOption(CairoOptionVariant.None), + position: { x: 0, y: 0, }, + color: 0, + }, + Emoji: { + value: 0, + }, + Position: { + x: 0, + y: 0, + }, + AllowedColor: { + game_id: 0, + color: 0, + is_allowed: false, + }, + AllowedColorValue: { + is_allowed: false, + }, + GamePalette: { + game_id: 0, + length: 0, + }, + GamePaletteValue: { + length: 0, + }, + InPalette: { + game_id: 0, + color: 0, + value: false, + }, + InPaletteValue: { + value: false, + }, + PaletteColors: { + game_id: 0, + idx: 0, + color: 0, + }, + PaletteColorsValue: { + color: 0, + }, + Board: { + id: 0, + origin: { x: 0, y: 0, }, + width: 0, + height: 0, + }, + BoardValue: { + origin: { x: 0, y: 0, }, + width: 0, + height: 0, + }, + GameId: { + x: 0, + y: 0, + value: 0, + }, + GameIdValue: { + value: 0, + }, + PWarPixel: { + position: { x: 0, y: 0, }, + owner: "", + }, + PWarPixelValue: { + owner: "", + }, + Game: { + id: 0, + start: 0, + end: 0, + proposal_idx: 0, + coeff_own_pixels: 0, + coeff_commits: 0, + winner_config: 0, + winner: "", + guild_ids: [0], + guild_count: 0, + }, + GameValue: { + start: 0, + end: 0, + proposal_idx: 0, + coeff_own_pixels: 0, + coeff_commits: 0, + winner_config: 0, + winner: "", + guild_ids: [0], + guild_count: 0, + }, + Guild: { + game_id: 0, + guild_id: 0, + guild_name: 0, + creator: "", + members: [""], + member_count: 0, + }, + GuildValue: { + guild_name: 0, + creator: "", + members: [""], + member_count: 0, + }, + Player: { + address: "", + num_owns: 0, + num_commit: 0, + last_date: 0, + is_banned: false, + }, + PlayerValue: { + num_owns: 0, + num_commit: 0, + last_date: 0, + is_banned: false, + }, + PixelRecoveryRate: { + game_id: 0, + rate: 0, + }, + PixelRecoveryRateValue: { + rate: 0, + }, + PlayerVote: { + player: "", + game_id: 0, + index: 0, + is_in_favor: false, + voting_power: 0, + }, + PlayerVoteValue: { + is_in_favor: false, + voting_power: 0, + }, + Proposal: { + game_id: 0, + index: 0, + author: "", + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + start: 0, + end: 0, + yes_voting_power: 0, + no_voting_power: 0, + is_activated: false, + }, + ProposalValue: { + author: "", + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + start: 0, + end: 0, + yes_voting_power: 0, + no_voting_power: 0, + is_activated: false, + }, + QueueScheduled: { + id: 0, + timestamp: 0, + called_system: "", + selector: 0, + calldata: [0], + }, + QueueScheduledValue: { + timestamp: 0, + called_system: "", + selector: 0, + calldata: [0], + }, + EndedGame: { + id: 0, + timestamp: 0, + }, + EndedGameValue: { + timestamp: 0, + }, + StartedGame: { + id: 0, + timestamp: 0, + creator: "", + }, + StartedGameValue: { + timestamp: 0, + creator: "", + }, + GuildCreated: { + game_id: 0, + guild_id: 0, + guild_name: 0, + creator: "", + }, + GuildCreatedValue: { + guild_id: 0, + guild_name: 0, + creator: "", + }, + MemberAdded: { + game_id: 0, + guild_id: 0, + member: "", + }, + MemberAddedValue: { + guild_id: 0, + member: "", + }, + MemberRemoved: { + game_id: 0, + guild_id: 0, + member: "", + }, + MemberRemovedValue: { + guild_id: 0, + member: "", + }, + ProposalActivated: { + game_id: 0, + index: 0, + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + }, + ProposalActivatedValue: { + index: 0, + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + }, + ProposalCreated: { + game_id: 0, + index: 0, + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + }, + ProposalCreatedValue: { + index: 0, + proposal_type: 0, + target_args_1: 0, + target_args_2: 0, + }, + Voted: { + game_id: 0, + index: 0, + timestamp: 0, + voter: "", + is_in_favor: false, + }, + VotedValue: { + index: 0, + timestamp: 0, + voter: "", + is_in_favor: false, + }, + }, +}; +export enum ModelsMapping { + Area = 'pixelaw-Area', + AreaValue = 'pixelaw-AreaValue', + RTree = 'pixelaw-RTree', + RTreeValue = 'pixelaw-RTreeValue', + Dummy = 'pixelaw-Dummy', + DummyValue = 'pixelaw-DummyValue', + Pixel = 'pixelaw-Pixel', + PixelUpdate = 'pixelaw-PixelUpdate', + PixelValue = 'pixelaw-PixelValue', + QueueItem = 'pixelaw-QueueItem', + QueueItemValue = 'pixelaw-QueueItemValue', + App = 'pixelaw-App', + AppName = 'pixelaw-AppName', + AppNameValue = 'pixelaw-AppNameValue', + AppValue = 'pixelaw-AppValue', + CoreActionsAddress = 'pixelaw-CoreActionsAddress', + CoreActionsAddressValue = 'pixelaw-CoreActionsAddressValue', + Bounds = 'pixelaw-Bounds', + DefaultParameters = 'pixelaw-DefaultParameters', + Emoji = 'pixelaw-Emoji', + Position = 'pixelaw-Position', + AllowedColor = 'pwar-AllowedColor', + AllowedColorValue = 'pwar-AllowedColorValue', + GamePalette = 'pwar-GamePalette', + GamePaletteValue = 'pwar-GamePaletteValue', + InPalette = 'pwar-InPalette', + InPaletteValue = 'pwar-InPaletteValue', + PaletteColors = 'pwar-PaletteColors', + PaletteColorsValue = 'pwar-PaletteColorsValue', + Board = 'pwar-Board', + BoardValue = 'pwar-BoardValue', + GameId = 'pwar-GameId', + GameIdValue = 'pwar-GameIdValue', + PWarPixel = 'pwar-PWarPixel', + PWarPixelValue = 'pwar-PWarPixelValue', + Game = 'pwar-Game', + GameValue = 'pwar-GameValue', + Guild = 'pwar-Guild', + GuildValue = 'pwar-GuildValue', + Player = 'pwar-Player', + PlayerValue = 'pwar-PlayerValue', + PixelRecoveryRate = 'pwar-PixelRecoveryRate', + PixelRecoveryRateValue = 'pwar-PixelRecoveryRateValue', + PlayerVote = 'pwar-PlayerVote', + PlayerVoteValue = 'pwar-PlayerVoteValue', + Proposal = 'pwar-Proposal', + ProposalValue = 'pwar-ProposalValue', + QueueScheduled = 'pixelaw-QueueScheduled', + QueueScheduledValue = 'pixelaw-QueueScheduledValue', + EndedGame = 'pwar-EndedGame', + EndedGameValue = 'pwar-EndedGameValue', + StartedGame = 'pwar-StartedGame', + StartedGameValue = 'pwar-StartedGameValue', + GuildCreated = 'pwar-GuildCreated', + GuildCreatedValue = 'pwar-GuildCreatedValue', + MemberAdded = 'pwar-MemberAdded', + MemberAddedValue = 'pwar-MemberAddedValue', + MemberRemoved = 'pwar-MemberRemoved', + MemberRemovedValue = 'pwar-MemberRemovedValue', + ProposalActivated = 'pwar-ProposalActivated', + ProposalActivatedValue = 'pwar-ProposalActivatedValue', + ProposalCreated = 'pwar-ProposalCreated', + ProposalCreatedValue = 'pwar-ProposalCreatedValue', + Voted = 'pwar-Voted', + VotedValue = 'pwar-VotedValue', +} \ No newline at end of file diff --git a/contracts/dojo_dev.toml b/contracts/dojo_dev.toml index 64da800..db30528 100644 --- a/contracts/dojo_dev.toml +++ b/contracts/dojo_dev.toml @@ -1,52 +1,50 @@ [world] description = "P-WAR" -name = "p_war" +name = "pwar" seed = "pixelaw" [namespace] -default = "pixelaw" -mappings = {} +default = "pwar" +mappings = { "pixelaw" = [ + "actions", "App", "AppName", "Area", "CoreActionsAddress", "Pixel", "QueueItem", "RTree", "Notification", "QueueScheduled" + ] } [env] rpc_url = "http://localhost:5050/" account_address = "0x127fd5f1fe78a71f8bcd1fec63e3fe2f0486b6ecd5c86a0466c3a21fa5cfcec" private_key = "0xc5b2fcab997346f3ea1c00b002ecf6f382c5f9c9659a3894eb783c5320f912" -world_address = "0x2bf4d3aa0dced89d37d8c3b4ff6a05895c0af32ff3baf9b02abf8504e53eaad" +world_address = "0x01d09b5e00f376337603943fc12715e439e91c0039f353b1cc48bb278dfa99d5" [writers] -# CORE -"pixelaw-App" = ["pixelaw-actions"] -"pixelaw-AppName" = ["pixelaw-actions"] -"pixelaw-AppUser" = ["pixelaw-actions"] -"pixelaw-CoreActionsAddress" = ["pixelaw-actions"] -"pixelaw-QueueScheduled" = ["pixelaw-actions"] -"pixelaw-QueueProcessed" = ["pixelaw-actions"] -"pixelaw-Alert" = ["pixelaw-actions"] -"pixelaw-Pixel" = [ - "pixelaw-actions", - "pixelaw-paint_actions", - "pixelaw-snake_actions", -] -"pixelaw-QueueItem" = ["pixelaw-actions"] -"pixelaw-Snake" = ["pixelaw-actions", "pixelaw-snake_actions"] -"pixelaw-RTree" = ["pixelaw-actions"] -"pixelaw-Area" = ["pixelaw-actions"] -"pixelaw-SnakeSegment" = ["pixelaw-snake_actions"] # GUILD -"pixelaw-Guild" = ["pixelaw-guild_actions"] +"pwar-Guild" = ["pwar-guild_actions"] # P-WAR -"pixelaw-AllowedApp" = ["pixelaw-p_war_actions"] -"pixelaw-Board" = ["pixelaw-p_war_actions", "pixelaw-propose_actions"] -"pixelaw-AllowedColor" = ["pixelaw-p_war_actions", "pixelaw-propose_actions"] -"pixelaw-PaletteColors" = ["pixelaw-p_war_actions", "pixelaw-propose_actions"] -"pixelaw-PWarPixel" = ["pixelaw-p_war_actions"] -"pixelaw-Game" = ["pixelaw-p_war_actions"] -"pixelaw-GameId" = ["pixelaw-p_war_actions"] -"pixelaw-GamePalette" = ["pixelaw-p_war_actions", "pixelaw-propose_actions"] -"pixelaw-InPalette" = ["pixelaw-p_war_actions", "pixelaw-propose_actions"] -"pixelaw-Player" = ["pixelaw-p_war_actions", "pixelaw-propose_actions", "pixelaw-voting_actions"] -"pixelaw-PixelRecoveryRate" = ["pixelaw-p_war_actions"] +"pwar-Board" = ["pwar-pwar_actions", "pwar-propose_actions"] +"pwar-AllowedColor" = ["pwar-pwar_actions", "pwar-propose_actions"] +"pwar-PaletteColors" = ["pwar-pwar_actions", "pwar-propose_actions"] +"pwar-PWarPixel" = ["pwar-pwar_actions"] +"pwar-Game" = ["pwar-pwar_actions", "pwar-guild_actions", "pwar-propose_actions"] +"pwar-GameId" = ["pwar-pwar_actions"] +"pwar-GamePalette" = ["pwar-pwar_actions", "pwar-propose_actions"] +"pwar-InPalette" = ["pwar-pwar_actions", "pwar-propose_actions"] +"pwar-Player" = ["pwar-pwar_actions", "pwar-propose_actions", "pwar-voting_actions"] +"pwar-PixelRecoveryRate" = ["pwar-pwar_actions"] # PROPOSE -"pixelaw-Proposal" = ["pixelaw-propose_actions", "pixelaw-voting_actions"] +"pwar-Proposal" = ["pwar-propose_actions", "pwar-voting_actions"] # VOTING -"pixelaw-PlayerVote" = ["pixelaw-voting_actions"] +"pwar-PlayerVote" = ["pwar-voting_actions"] + + + [migration] + skip_contracts = [ + "pixelaw-actions", + "pixelaw-App", + "pixelaw-AppName", + "pixelaw-Area", + "pixelaw-CoreActionsAddress", + "pixelaw-Pixel", + "pixelaw-QueueItem", + "pixelaw-RTree", + "pixelaw-Notification", + "pixelaw-QueueScheduled" + ] \ No newline at end of file diff --git a/contracts/dojo_release.toml b/contracts/dojo_release.toml new file mode 100644 index 0000000..4a33344 --- /dev/null +++ b/contracts/dojo_release.toml @@ -0,0 +1,15 @@ +[world] +description = "PixeLAW world" +name = "pixelaw" +seed = "pixelaw" + +[world.socials] +x = "https://x.com/0xpixelaw" +github = "https://github.com/pixelaw" + +[namespace] +default = "pixelaw" +mappings = {} + +[env] +rpc_url = "https://api.cartridge.gg/x/pixelaw-dev/katana/" diff --git a/contracts/dojo_sepolia.toml b/contracts/dojo_sepolia.toml index 151baed..f480651 100644 --- a/contracts/dojo_sepolia.toml +++ b/contracts/dojo_sepolia.toml @@ -1,10 +1,10 @@ [world] description = "Empty PixeLAW world" -name = "p_war" +name = "pwar" seed = "pixelaw" [namespace] -default = "pixelaw" +default = "pwar" mappings = {} [env] @@ -15,39 +15,20 @@ keystore_path = "sepolia.deployer.keystore.json" world_address = "0x2bf4d3aa0dced89d37d8c3b4ff6a05895c0af32ff3baf9b02abf8504e53eaad" [writers] -# CORE -"pixelaw-App" = ["pixelaw-actions"] -"pixelaw-AppName" = ["pixelaw-actions"] -"pixelaw-AppUser" = ["pixelaw-actions"] -"pixelaw-CoreActionsAddress" = ["pixelaw-actions"] -"pixelaw-QueueScheduled" = ["pixelaw-actions"] -"pixelaw-QueueProcessed" = ["pixelaw-actions"] -"pixelaw-Alert" = ["pixelaw-actions"] -"pixelaw-Pixel" = [ - "pixelaw-actions", - "pixelaw-paint_actions", - "pixelaw-snake_actions", -] -"pixelaw-QueueItem" = ["pixelaw-actions"] -"pixelaw-Snake" = ["pixelaw-actions", "pixelaw-snake_actions"] -"pixelaw-RTree" = ["pixelaw-actions"] -"pixelaw-Area" = ["pixelaw-actions"] -"pixelaw-SnakeSegment" = ["pixelaw-snake_actions"] # GUILD -"pixelaw-Guild" = ["pixelaw-guild_actions"] +"pwar-Guild" = ["pwar-guild_actions"] # P-WAR -"pixelaw-AllowedApp" = ["pixelaw-p_war_actions"] -"pixelaw-Board" = ["pixelaw-p_war_actions", "pixelaw-propose_actions"] -"pixelaw-AllowedColor" = ["pixelaw-p_war_actions", "pixelaw-propose_actions"] -"pixelaw-PaletteColors" = ["pixelaw-p_war_actions", "pixelaw-propose_actions"] -"pixelaw-PWarPixel" = ["pixelaw-p_war_actions"] -"pixelaw-Game" = ["pixelaw-p_war_actions"] -"pixelaw-GameId" = ["pixelaw-p_war_actions"] -"pixelaw-GamePalette" = ["pixelaw-p_war_actions", "pixelaw-propose_actions"] -"pixelaw-InPalette" = ["pixelaw-p_war_actions", "pixelaw-propose_actions"] -"pixelaw-Player" = ["pixelaw-p_war_actions", "pixelaw-propose_actions", "pixelaw-voting_actions"] -"pixelaw-PixelRecoveryRate" = ["pixelaw-p_war_actions"] +"pwar-Board" = ["pwar-pwar_actions", "pwar-propose_actions"] +"pwar-AllowedColor" = ["pwar-pwar_actions", "pwar-propose_actions"] +"pwar-PaletteColors" = ["pwar-pwar_actions", "pwar-propose_actions"] +"pwar-PWarPixel" = ["pwar-pwar_actions"] +"pwar-Game" = ["pwar-pwar_actions"] +"pwar-GameId" = ["pwar-pwar_actions"] +"pwar-GamePalette" = ["pwar-pwar_actions", "pwar-propose_actions"] +"pwar-InPalette" = ["pwar-pwar_actions", "pwar-propose_actions"] +"pwar-Player" = ["pwar-pwar_actions", "pwar-propose_actions", "pwar-voting_actions"] +"pwar-PixelRecoveryRate" = ["pwar-pwar_actions"] # PROPOSE -"pixelaw-Proposal" = ["pixelaw-propose_actions", "pixelaw-voting_actions"] +"pwar-Proposal" = ["pwar-propose_actions", "pwar-voting_actions"] # VOTING -"pixelaw-PlayerVote" = ["pixelaw-voting_actions"] +"pwar-PlayerVote" = ["pwar-voting_actions"] diff --git a/contracts/manifest_dev.json b/contracts/manifest_dev.json index e6a0371..529d552 100644 --- a/contracts/manifest_dev.json +++ b/contracts/manifest_dev.json @@ -1,9 +1,9 @@ { "world": { - "class_hash": "0x45575a88cc5cef1e444c77ce60b7b4c9e73a01cbbe20926d5a4c72a94011410", - "address": "0x2bf4d3aa0dced89d37d8c3b4ff6a05895c0af32ff3baf9b02abf8504e53eaad", + "class_hash": "0x75fc75bcd1a7f8b4bf64b74978b0f89c8cee44bb755c1dae6f82284756451ec", + "address": "0x1d09b5e00f376337603943fc12715e439e91c0039f353b1cc48bb278dfa99d5", "seed": "pixelaw", - "name": "p_war", + "name": "pwar", "entrypoints": [ "uuid", "set_metadata", @@ -11,6 +11,7 @@ "register_event", "register_model", "register_contract", + "register_library", "init_contract", "upgrade_event", "upgrade_model", @@ -78,6 +79,10 @@ { "name": "Unregistered", "type": "()" + }, + { + "name": "Library", + "type": "(core::starknet::class_hash::ClassHash, core::felt252)" } ] }, @@ -362,6 +367,34 @@ ], "state_mutability": "external" }, + { + "type": "function", + "name": "register_library", + "inputs": [ + { + "name": "namespace", + "type": "core::byte_array::ByteArray" + }, + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + }, + { + "name": "name", + "type": "core::byte_array::ByteArray" + }, + { + "name": "version", + "type": "core::byte_array::ByteArray" + } + ], + "outputs": [ + { + "type": "core::starknet::class_hash::ClassHash" + } + ], + "state_mutability": "external" + }, { "type": "function", "name": "init_contract", @@ -965,6 +998,28 @@ } ] }, + { + "type": "event", + "name": "dojo::world::world_contract::world::LibraryRegistered", + "kind": "struct", + "members": [ + { + "name": "name", + "type": "core::byte_array::ByteArray", + "kind": "key" + }, + { + "name": "namespace", + "type": "core::byte_array::ByteArray", + "kind": "key" + }, + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash", + "kind": "data" + } + ] + }, { "type": "event", "name": "dojo::world::world_contract::world::EventEmitted", @@ -1206,6 +1261,11 @@ "type": "dojo::world::world_contract::world::ContractInitialized", "kind": "nested" }, + { + "name": "LibraryRegistered", + "type": "dojo::world::world_contract::world::LibraryRegistered", + "kind": "nested" + }, { "name": "EventEmitted", "type": "dojo::world::world_contract::world::EventEmitted", @@ -1252,12 +1312,12 @@ }, "contracts": [ { - "address": "0x1fbb7fd4fd72452b9a575bddb6ca06f6b854a66e8c282264bf993b54d90b9f6", - "class_hash": "0xabbea8e73f9e282fa460c36f5af8598994c6e365cbb0fe243bc1cdb283411d", + "address": "0x38be037c76817f4d73f7cec04a5bffb9d64ce544674f72637563708971ef1d3", + "class_hash": "0x3ee99e91fdfa35698d20960111322d90bba48f0429d2c00ce2656f0ce8eb21e", "abi": [ { "type": "impl", - "name": "actions__ContractImpl", + "name": "guild_actions__ContractImpl", "interface_name": "dojo::contract::interface::IContract" }, { @@ -1267,7 +1327,7 @@ }, { "type": "impl", - "name": "actions__DeployedContractImpl", + "name": "guild_actions__DeployedContractImpl", "interface_name": "dojo::meta::interface::IDeployedResource" }, { @@ -1307,148 +1367,8 @@ }, { "type": "impl", - "name": "ActionsImpl", - "interface_name": "pixelaw::core::actions::IActions" - }, - { - "type": "struct", - "name": "pixelaw::core::models::pixel::Pixel", - "members": [ - { - "name": "x", - "type": "core::integer::u16" - }, - { - "name": "y", - "type": "core::integer::u16" - }, - { - "name": "app", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "color", - "type": "core::integer::u32" - }, - { - "name": "created_at", - "type": "core::integer::u64" - }, - { - "name": "updated_at", - "type": "core::integer::u64" - }, - { - "name": "timestamp", - "type": "core::integer::u64" - }, - { - "name": "owner", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "text", - "type": "core::felt252" - }, - { - "name": "action", - "type": "core::felt252" - } - ] - }, - { - "type": "enum", - "name": "core::option::Option::", - "variants": [ - { - "name": "Some", - "type": "core::integer::u32" - }, - { - "name": "None", - "type": "()" - } - ] - }, - { - "type": "enum", - "name": "core::option::Option::", - "variants": [ - { - "name": "Some", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "None", - "type": "()" - } - ] - }, - { - "type": "enum", - "name": "core::option::Option::", - "variants": [ - { - "name": "Some", - "type": "core::felt252" - }, - { - "name": "None", - "type": "()" - } - ] - }, - { - "type": "enum", - "name": "core::option::Option::", - "variants": [ - { - "name": "Some", - "type": "core::integer::u64" - }, - { - "name": "None", - "type": "()" - } - ] - }, - { - "type": "struct", - "name": "pixelaw::core::models::pixel::PixelUpdate", - "members": [ - { - "name": "x", - "type": "core::integer::u16" - }, - { - "name": "y", - "type": "core::integer::u16" - }, - { - "name": "color", - "type": "core::option::Option::" - }, - { - "name": "owner", - "type": "core::option::Option::" - }, - { - "name": "app", - "type": "core::option::Option::" - }, - { - "name": "text", - "type": "core::option::Option::" - }, - { - "name": "timestamp", - "type": "core::option::Option::" - }, - { - "name": "action", - "type": "core::option::Option::" - } - ] + "name": "GuildImpl", + "interface_name": "pwar::systems::guilds::IGuild" }, { "type": "enum", @@ -1464,888 +1384,109 @@ } ] }, - { - "type": "enum", - "name": "pixelaw::core::models::pixel::PixelUpdateResult", - "variants": [ - { - "name": "Ok", - "type": "pixelaw::core::models::pixel::PixelUpdate" - }, - { - "name": "NotAllowed", - "type": "()" - }, - { - "name": "Error", - "type": "core::felt252" - } - ] - }, { "type": "struct", - "name": "core::array::Span::", + "name": "core::array::Span::", "members": [ { "name": "snapshot", - "type": "@core::array::Array::" + "type": "@core::array::Array::" } ] }, { "type": "struct", - "name": "pixelaw::core::models::registry::App", + "name": "pwar::models::guilds::Guild", "members": [ { - "name": "system", - "type": "core::starknet::contract_address::ContractAddress" + "name": "game_id", + "type": "core::integer::u32" }, { - "name": "name", - "type": "core::felt252" + "name": "guild_id", + "type": "core::integer::u32" }, { - "name": "icon", + "name": "guild_name", "type": "core::felt252" }, { - "name": "action", - "type": "core::felt252" - } - ] - }, - { - "type": "struct", - "name": "pixelaw::core::utils::Position", - "members": [ + "name": "creator", + "type": "core::starknet::contract_address::ContractAddress" + }, { - "name": "x", - "type": "core::integer::u16" + "name": "members", + "type": "core::array::Span::" }, { - "name": "y", - "type": "core::integer::u16" + "name": "member_count", + "type": "core::integer::u32" } ] }, { - "type": "struct", - "name": "pixelaw::core::utils::Bounds", - "members": [ - { - "name": "x_min", - "type": "core::integer::u16" - }, + "type": "interface", + "name": "pwar::systems::guilds::IGuild", + "items": [ { - "name": "y_min", - "type": "core::integer::u16" + "type": "function", + "name": "create_guild", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "guild_name", + "type": "core::felt252" + } + ], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "external" }, { - "name": "x_max", - "type": "core::integer::u16" + "type": "function", + "name": "add_member", + "inputs": [ + { + "name": "game_id", + "type": "core::integer::u32" + }, + { + "name": "guild_id", + "type": "core::integer::u32" + }, + { + "name": "new_member", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [], + "state_mutability": "external" }, - { - "name": "y_max", - "type": "core::integer::u16" - } - ] - }, - { - "type": "struct", - "name": "pixelaw::core::models::area::Area", - "members": [ - { - "name": "id", - "type": "core::integer::u64" - }, - { - "name": "app", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "owner", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "color", - "type": "core::integer::u32" - } - ] - }, - { - "type": "enum", - "name": "core::option::Option::", - "variants": [ - { - "name": "Some", - "type": "pixelaw::core::models::area::Area" - }, - { - "name": "None", - "type": "()" - } - ] - }, - { - "type": "struct", - "name": "core::array::Span::", - "members": [ - { - "name": "snapshot", - "type": "@core::array::Array::" - } - ] - }, - { - "type": "interface", - "name": "pixelaw::core::actions::IActions", - "items": [ - { - "type": "function", - "name": "init", - "inputs": [], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "can_update_pixel", - "inputs": [ - { - "name": "for_player", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "for_system", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "pixel", - "type": "pixelaw::core::models::pixel::Pixel" - }, - { - "name": "pixel_update", - "type": "pixelaw::core::models::pixel::PixelUpdate" - }, - { - "name": "area_id_hint", - "type": "core::option::Option::" - }, - { - "name": "allow_modify", - "type": "core::bool" - } - ], - "outputs": [ - { - "type": "pixelaw::core::models::pixel::PixelUpdateResult" - } - ], - "state_mutability": "external" - }, - { - "type": "function", - "name": "update_pixel", - "inputs": [ - { - "name": "for_player", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "for_system", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "pixel_update", - "type": "pixelaw::core::models::pixel::PixelUpdate" - }, - { - "name": "area_id", - "type": "core::option::Option::" - }, - { - "name": "allow_modify", - "type": "core::bool" - } - ], - "outputs": [ - { - "type": "pixelaw::core::models::pixel::PixelUpdateResult" - } - ], - "state_mutability": "external" - }, - { - "type": "function", - "name": "process_queue", - "inputs": [ - { - "name": "id", - "type": "core::felt252" - }, - { - "name": "timestamp", - "type": "core::integer::u64" - }, - { - "name": "called_system", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "selector", - "type": "core::felt252" - }, - { - "name": "calldata", - "type": "core::array::Span::" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "schedule_queue", - "inputs": [ - { - "name": "timestamp", - "type": "core::integer::u64" - }, - { - "name": "called_system", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "selector", - "type": "core::felt252" - }, - { - "name": "calldata", - "type": "core::array::Span::" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "new_app", - "inputs": [ - { - "name": "system", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "name", - "type": "core::felt252" - }, - { - "name": "icon", - "type": "core::felt252" - } - ], - "outputs": [ - { - "type": "pixelaw::core::models::registry::App" - } - ], - "state_mutability": "external" - }, - { - "type": "function", - "name": "alert_player", - "inputs": [ - { - "name": "position", - "type": "pixelaw::core::utils::Position" - }, - { - "name": "player", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "message", - "type": "core::felt252" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "add_area", - "inputs": [ - { - "name": "bounds", - "type": "pixelaw::core::utils::Bounds" - }, - { - "name": "owner", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "color", - "type": "core::integer::u32" - }, - { - "name": "app", - "type": "core::starknet::contract_address::ContractAddress" - } - ], - "outputs": [ - { - "type": "pixelaw::core::models::area::Area" - } - ], - "state_mutability": "external" - }, - { - "type": "function", - "name": "remove_area", - "inputs": [ - { - "name": "area_id", - "type": "core::integer::u64" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "find_area_by_position", - "inputs": [ - { - "name": "position", - "type": "pixelaw::core::utils::Position" - } - ], - "outputs": [ - { - "type": "core::option::Option::" - } - ], - "state_mutability": "external" - }, - { - "type": "function", - "name": "find_areas_inside_bounds", - "inputs": [ - { - "name": "bounds", - "type": "pixelaw::core::utils::Bounds" - } - ], - "outputs": [ - { - "type": "core::array::Span::" - } - ], - "state_mutability": "external" - } - ] - }, - { - "type": "function", - "name": "dojo_init", - "inputs": [], - "outputs": [], - "state_mutability": "view" - }, - { - "type": "impl", - "name": "WorldProviderImpl", - "interface_name": "dojo::contract::components::world_provider::IWorldProvider" - }, - { - "type": "struct", - "name": "dojo::world::iworld::IWorldDispatcher", - "members": [ - { - "name": "contract_address", - "type": "core::starknet::contract_address::ContractAddress" - } - ] - }, - { - "type": "interface", - "name": "dojo::contract::components::world_provider::IWorldProvider", - "items": [ - { - "type": "function", - "name": "world_dispatcher", - "inputs": [], - "outputs": [ - { - "type": "dojo::world::iworld::IWorldDispatcher" - } - ], - "state_mutability": "view" - } - ] - }, - { - "type": "impl", - "name": "UpgradeableImpl", - "interface_name": "dojo::contract::components::upgradeable::IUpgradeable" - }, - { - "type": "interface", - "name": "dojo::contract::components::upgradeable::IUpgradeable", - "items": [ - { - "type": "function", - "name": "upgrade", - "inputs": [ - { - "name": "new_class_hash", - "type": "core::starknet::class_hash::ClassHash" - } - ], - "outputs": [], - "state_mutability": "external" - } - ] - }, - { - "type": "constructor", - "name": "constructor", - "inputs": [] - }, - { - "type": "event", - "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", - "kind": "struct", - "members": [ - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", - "kind": "enum", - "variants": [ - { - "name": "Upgraded", - "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", - "kind": "nested" - } - ] - }, - { - "type": "event", - "name": "dojo::contract::components::world_provider::world_provider_cpt::Event", - "kind": "enum", - "variants": [] - }, - { - "type": "event", - "name": "pixelaw::core::actions::actions::Event", - "kind": "enum", - "variants": [ - { - "name": "UpgradeableEvent", - "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", - "kind": "nested" - }, - { - "name": "WorldProviderEvent", - "type": "dojo::contract::components::world_provider::world_provider_cpt::Event", - "kind": "nested" - } - ] - } - ], - "init_calldata": [], - "tag": "pixelaw-actions", - "selector": "0x16928a49cfd8cf14e9f41e9d8f873890d1ab7d23b9a312d8a72f4031159876f", - "systems": [ - "init", - "can_update_pixel", - "update_pixel", - "process_queue", - "schedule_queue", - "new_app", - "alert_player", - "add_area", - "remove_area", - "find_area_by_position", - "find_areas_inside_bounds", - "upgrade" - ] - }, - { - "address": "0x57194126e6b081642e60b11b3817936bc48d2a67aa3dc577ade10abf943c148", - "class_hash": "0x3b724650b576b7c0cfa949d634333a3a9343e7225eba6f10bf43cc8c54a68f9", - "abi": [ - { - "type": "impl", - "name": "allowed_app_actions__ContractImpl", - "interface_name": "dojo::contract::interface::IContract" - }, - { - "type": "interface", - "name": "dojo::contract::interface::IContract", - "items": [] - }, - { - "type": "impl", - "name": "allowed_app_actions__DeployedContractImpl", - "interface_name": "dojo::meta::interface::IDeployedResource" - }, - { - "type": "struct", - "name": "core::byte_array::ByteArray", - "members": [ - { - "name": "data", - "type": "core::array::Array::" - }, - { - "name": "pending_word", - "type": "core::felt252" - }, - { - "name": "pending_word_len", - "type": "core::integer::u32" - } - ] - }, - { - "type": "interface", - "name": "dojo::meta::interface::IDeployedResource", - "items": [ - { - "type": "function", - "name": "dojo_name", - "inputs": [], - "outputs": [ - { - "type": "core::byte_array::ByteArray" - } - ], - "state_mutability": "view" - } - ] - }, - { - "type": "impl", - "name": "AllowedAppImpl", - "interface_name": "p_war::systems::app::IAllowedApp" - }, - { - "type": "enum", - "name": "core::option::Option::", - "variants": [ - { - "name": "Some", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "None", - "type": "()" - } - ] - }, - { - "type": "enum", - "name": "core::option::Option::", - "variants": [ - { - "name": "Some", - "type": "core::integer::u64" - }, - { - "name": "None", - "type": "()" - } - ] - }, - { - "type": "struct", - "name": "pixelaw::core::utils::Position", - "members": [ - { - "name": "x", - "type": "core::integer::u16" - }, - { - "name": "y", - "type": "core::integer::u16" - } - ] - }, - { - "type": "struct", - "name": "pixelaw::core::utils::DefaultParameters", - "members": [ - { - "name": "player_override", - "type": "core::option::Option::" - }, - { - "name": "system_override", - "type": "core::option::Option::" - }, - { - "name": "area_hint", - "type": "core::option::Option::" - }, - { - "name": "position", - "type": "pixelaw::core::utils::Position" - }, - { - "name": "color", - "type": "core::integer::u32" - } - ] - }, - { - "type": "interface", - "name": "p_war::systems::app::IAllowedApp", - "items": [ - { - "type": "function", - "name": "set_pixel", - "inputs": [ - { - "name": "default_params", - "type": "pixelaw::core::utils::DefaultParameters" - } - ], - "outputs": [], - "state_mutability": "external" - } - ] - }, - { - "type": "function", - "name": "dojo_init", - "inputs": [], - "outputs": [], - "state_mutability": "view" - }, - { - "type": "impl", - "name": "WorldProviderImpl", - "interface_name": "dojo::contract::components::world_provider::IWorldProvider" - }, - { - "type": "struct", - "name": "dojo::world::iworld::IWorldDispatcher", - "members": [ - { - "name": "contract_address", - "type": "core::starknet::contract_address::ContractAddress" - } - ] - }, - { - "type": "interface", - "name": "dojo::contract::components::world_provider::IWorldProvider", - "items": [ - { - "type": "function", - "name": "world_dispatcher", - "inputs": [], - "outputs": [ - { - "type": "dojo::world::iworld::IWorldDispatcher" - } - ], - "state_mutability": "view" - } - ] - }, - { - "type": "impl", - "name": "UpgradeableImpl", - "interface_name": "dojo::contract::components::upgradeable::IUpgradeable" - }, - { - "type": "interface", - "name": "dojo::contract::components::upgradeable::IUpgradeable", - "items": [ - { - "type": "function", - "name": "upgrade", - "inputs": [ - { - "name": "new_class_hash", - "type": "core::starknet::class_hash::ClassHash" - } - ], - "outputs": [], - "state_mutability": "external" - } - ] - }, - { - "type": "constructor", - "name": "constructor", - "inputs": [] - }, - { - "type": "event", - "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", - "kind": "struct", - "members": [ - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash", - "kind": "data" - } - ] - }, - { - "type": "event", - "name": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", - "kind": "enum", - "variants": [ - { - "name": "Upgraded", - "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Upgraded", - "kind": "nested" - } - ] - }, - { - "type": "event", - "name": "dojo::contract::components::world_provider::world_provider_cpt::Event", - "kind": "enum", - "variants": [] - }, - { - "type": "event", - "name": "p_war::systems::app::allowed_app_actions::Event", - "kind": "enum", - "variants": [ - { - "name": "UpgradeableEvent", - "type": "dojo::contract::components::upgradeable::upgradeable_cpt::Event", - "kind": "nested" - }, - { - "name": "WorldProviderEvent", - "type": "dojo::contract::components::world_provider::world_provider_cpt::Event", - "kind": "nested" - } - ] - } - ], - "init_calldata": [], - "tag": "pixelaw-allowed_app_actions", - "selector": "0x4eb94962c665465ddf98717edce32f775575e7548d61f72c0657800c5545709", - "systems": [ - "set_pixel", - "upgrade" - ] - }, - { - "address": "0xa344d3098f9827e809064357b732110959ecc462712f728707aac554aa31c1", - "class_hash": "0x22636046a79ce2dd5319e58db030611c3864250a2e864f2e56eefbbc260dfae", - "abi": [ - { - "type": "impl", - "name": "guild_actions__ContractImpl", - "interface_name": "dojo::contract::interface::IContract" - }, - { - "type": "interface", - "name": "dojo::contract::interface::IContract", - "items": [] - }, - { - "type": "impl", - "name": "guild_actions__DeployedContractImpl", - "interface_name": "dojo::meta::interface::IDeployedResource" - }, - { - "type": "struct", - "name": "core::byte_array::ByteArray", - "members": [ - { - "name": "data", - "type": "core::array::Array::" - }, - { - "name": "pending_word", - "type": "core::felt252" - }, - { - "name": "pending_word_len", - "type": "core::integer::u32" - } - ] - }, - { - "type": "interface", - "name": "dojo::meta::interface::IDeployedResource", - "items": [ - { - "type": "function", - "name": "dojo_name", - "inputs": [], - "outputs": [ - { - "type": "core::byte_array::ByteArray" - } - ], - "state_mutability": "view" - } - ] - }, - { - "type": "impl", - "name": "GuildImpl", - "interface_name": "p_war::systems::guilds::IGuild" - }, - { - "type": "enum", - "name": "core::bool", - "variants": [ - { - "name": "False", - "type": "()" - }, - { - "name": "True", - "type": "()" - } - ] - }, - { - "type": "interface", - "name": "p_war::systems::guilds::IGuild", - "items": [ { "type": "function", - "name": "create_guild", + "name": "join_guild", "inputs": [ { "name": "game_id", "type": "core::integer::u32" }, { - "name": "guild_name", - "type": "core::felt252" - } - ], - "outputs": [ - { + "name": "guild_id", "type": "core::integer::u32" } ], + "outputs": [], "state_mutability": "external" }, { "type": "function", - "name": "add_member", + "name": "remove_member", "inputs": [ { "name": "game_id", @@ -2356,7 +1497,7 @@ "type": "core::integer::u32" }, { - "name": "new_member", + "name": "member", "type": "core::starknet::contract_address::ContractAddress" } ], @@ -2365,7 +1506,7 @@ }, { "type": "function", - "name": "join_guild", + "name": "is_member", "inputs": [ { "name": "game_id", @@ -2374,14 +1515,22 @@ { "name": "guild_id", "type": "core::integer::u32" + }, + { + "name": "member", + "type": "core::starknet::contract_address::ContractAddress" } ], - "outputs": [], - "state_mutability": "external" + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" }, { "type": "function", - "name": "remove_member", + "name": "get_guild", "inputs": [ { "name": "game_id", @@ -2390,49 +1539,46 @@ { "name": "guild_id", "type": "core::integer::u32" - }, + } + ], + "outputs": [ { - "name": "member", - "type": "core::starknet::contract_address::ContractAddress" + "type": "pwar::models::guilds::Guild" } ], - "outputs": [], - "state_mutability": "external" + "state_mutability": "view" }, { "type": "function", - "name": "is_member", + "name": "get_player_commit", "inputs": [ { - "name": "game_id", - "type": "core::integer::u32" - }, - { - "name": "guild_id", - "type": "core::integer::u32" - }, - { - "name": "member", + "name": "player_address", "type": "core::starknet::contract_address::ContractAddress" } ], "outputs": [ { - "type": "core::bool" + "type": "core::integer::u32" } ], - "state_mutability": "external" + "state_mutability": "view" }, { "type": "function", - "name": "get_guild_contract_address", - "inputs": [], - "outputs": [ + "name": "get_player_owns", + "inputs": [ { + "name": "player_address", "type": "core::starknet::contract_address::ContractAddress" } ], - "state_mutability": "external" + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "view" }, { "type": "function", @@ -2452,7 +1598,7 @@ "type": "core::integer::u32" } ], - "state_mutability": "external" + "state_mutability": "view" } ] }, @@ -2555,7 +1701,7 @@ }, { "type": "event", - "name": "p_war::systems::guilds::guild_actions::Event", + "name": "pwar::systems::guilds::guild_actions::Event", "kind": "enum", "variants": [ { @@ -2572,26 +1718,23 @@ } ], "init_calldata": [], - "tag": "pixelaw-guild_actions", - "selector": "0x4c9f59312c9c6ebd49039a1172f6596c44684651bb7a534011e2f4b164bba84", + "tag": "pwar-guild_actions", + "selector": "0x3c3b77d165909386294773571272f51dcefab9d0aa99d69b70796f6501d6f42", "systems": [ "create_guild", "add_member", "join_guild", "remove_member", - "is_member", - "get_guild_contract_address", - "get_guild_points", "upgrade" ] }, { - "address": "0x348361b06c2a40ef55af3d85e6ea0f024e67687700bd9f2eddbeb70c704c950", - "class_hash": "0x503775d77a5e0499e25ee53e14f1ced56ae03a18336215a241e8d44e6be49af", + "address": "0x4038ddb14b806e40242355883643c009451a6b15fc9aa402a1248dae25a5a49", + "class_hash": "0x7dd3c84c52aebfc627247b8890e9c54321fb971128c085470acf5e7ecef9b9", "abi": [ { "type": "impl", - "name": "p_war_actions__ContractImpl", + "name": "propose_actions__ContractImpl", "interface_name": "dojo::contract::interface::IContract" }, { @@ -2601,7 +1744,7 @@ }, { "type": "impl", - "name": "p_war_actions__DeployedContractImpl", + "name": "propose_actions__DeployedContractImpl", "interface_name": "dojo::meta::interface::IDeployedResource" }, { @@ -2641,183 +1784,176 @@ }, { "type": "impl", - "name": "ActionsImpl", - "interface_name": "p_war::systems::actions::IActions" + "name": "ProposeImpl", + "interface_name": "pwar::systems::propose::IPropose" }, { - "type": "enum", - "name": "core::option::Option::", - "variants": [ + "type": "struct", + "name": "pixelaw::core::utils::Position", + "members": [ { - "name": "Some", - "type": "core::starknet::contract_address::ContractAddress" + "name": "x", + "type": "core::integer::u16" }, { - "name": "None", - "type": "()" + "name": "y", + "type": "core::integer::u16" } ] }, { - "type": "enum", - "name": "core::option::Option::", - "variants": [ - { - "name": "Some", - "type": "core::integer::u64" - }, + "type": "struct", + "name": "core::array::Span::", + "members": [ { - "name": "None", - "type": "()" + "name": "snapshot", + "type": "@core::array::Array::" } ] }, { "type": "struct", - "name": "pixelaw::core::utils::Position", + "name": "core::array::Span::", "members": [ { - "name": "x", - "type": "core::integer::u16" - }, - { - "name": "y", - "type": "core::integer::u16" + "name": "snapshot", + "type": "@core::array::Array::" } ] }, { "type": "struct", - "name": "pixelaw::core::utils::DefaultParameters", + "name": "pwar::models::game::Game", "members": [ { - "name": "player_override", - "type": "core::option::Option::" + "name": "id", + "type": "core::integer::u32" }, { - "name": "system_override", - "type": "core::option::Option::" + "name": "start", + "type": "core::integer::u64" }, { - "name": "area_hint", - "type": "core::option::Option::" + "name": "end", + "type": "core::integer::u64" }, { - "name": "position", - "type": "pixelaw::core::utils::Position" + "name": "proposal_idx", + "type": "core::integer::u32" }, { - "name": "color", + "name": "coeff_own_pixels", "type": "core::integer::u32" - } - ] - }, - { - "type": "struct", - "name": "p_war::systems::guilds::IGuildDispatcher", - "members": [ + }, { - "name": "contract_address", - "type": "core::starknet::contract_address::ContractAddress" - } - ] - }, - { - "type": "enum", - "name": "core::option::Option::", - "variants": [ + "name": "coeff_commits", + "type": "core::integer::u32" + }, { - "name": "Some", + "name": "winner_config", "type": "core::integer::u32" }, { - "name": "None", - "type": "()" + "name": "winner", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "guild_ids", + "type": "core::array::Span::" + }, + { + "name": "guild_count", + "type": "core::integer::u32" } ] }, { "type": "enum", - "name": "core::option::Option::", + "name": "core::bool", "variants": [ { - "name": "Some", - "type": "core::felt252" + "name": "False", + "type": "()" }, { - "name": "None", + "name": "True", "type": "()" } ] }, { "type": "struct", - "name": "pixelaw::core::models::pixel::PixelUpdate", + "name": "pwar::models::proposal::Proposal", "members": [ { - "name": "x", - "type": "core::integer::u16" + "name": "game_id", + "type": "core::integer::u32" }, { - "name": "y", - "type": "core::integer::u16" + "name": "index", + "type": "core::integer::u32" }, { - "name": "color", - "type": "core::option::Option::" + "name": "author", + "type": "core::starknet::contract_address::ContractAddress" }, { - "name": "owner", - "type": "core::option::Option::" + "name": "proposal_type", + "type": "core::integer::u8" }, { - "name": "app", - "type": "core::option::Option::" + "name": "target_args_1", + "type": "core::integer::u32" + }, + { + "name": "target_args_2", + "type": "core::integer::u32" }, { - "name": "text", - "type": "core::option::Option::" + "name": "start", + "type": "core::integer::u64" }, { - "name": "timestamp", - "type": "core::option::Option::" + "name": "end", + "type": "core::integer::u64" + }, + { + "name": "yes_voting_power", + "type": "core::integer::u32" + }, + { + "name": "no_voting_power", + "type": "core::integer::u32" }, { - "name": "action", - "type": "core::option::Option::" + "name": "is_activated", + "type": "core::bool" } ] }, { "type": "interface", - "name": "p_war::systems::actions::IActions", + "name": "pwar::systems::propose::IPropose", "items": [ { "type": "function", - "name": "init", - "inputs": [], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "interact", + "name": "create_proposal", "inputs": [ { - "name": "default_params", - "type": "pixelaw::core::utils::DefaultParameters" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "create_game", - "inputs": [ + "name": "game_id", + "type": "core::integer::u32" + }, { - "name": "origin", - "type": "pixelaw::core::utils::Position" + "name": "proposal_type", + "type": "core::integer::u8" + }, + { + "name": "target_args_1", + "type": "core::integer::u32" + }, + { + "name": "target_args_2", + "type": "core::integer::u32" } ], "outputs": [ @@ -2829,63 +1965,43 @@ }, { "type": "function", - "name": "create_game_guilds", + "name": "activate_proposal", "inputs": [ { "name": "game_id", "type": "core::integer::u32" }, { - "name": "guild_dispatcher", - "type": "p_war::systems::guilds::IGuildDispatcher" - } - ], - "outputs": [ + "name": "index", + "type": "core::integer::u32" + }, { - "type": "core::array::Array::" + "name": "clear_data", + "type": "core::array::Span::" } ], + "outputs": [], "state_mutability": "external" }, { "type": "function", - "name": "get_game_id", + "name": "add_new_color", "inputs": [ { - "name": "position", - "type": "pixelaw::core::utils::Position" - } - ], - "outputs": [ - { + "name": "game_id", "type": "core::integer::u32" - } - ], - "state_mutability": "view" - }, - { - "type": "function", - "name": "place_pixel", - "inputs": [ + }, { - "name": "app", - "type": "core::starknet::contract_address::ContractAddress" + "name": "index", + "type": "core::integer::u32" }, { - "name": "default_params", - "type": "pixelaw::core::utils::DefaultParameters" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "type": "function", - "name": "update_pixel", - "inputs": [ + "name": "game", + "type": "pwar::models::game::Game" + }, { - "name": "pixel_update", - "type": "pixelaw::core::models::pixel::PixelUpdate" + "name": "proposal", + "type": "pwar::models::proposal::Proposal" } ], "outputs": [], @@ -2893,11 +2009,27 @@ }, { "type": "function", - "name": "end_game", + "name": "reset_to_white", "inputs": [ { "name": "game_id", "type": "core::integer::u32" + }, + { + "name": "index", + "type": "core::integer::u32" + }, + { + "name": "game", + "type": "pwar::models::game::Game" + }, + { + "name": "proposal", + "type": "pwar::models::proposal::Proposal" + }, + { + "name": "clear_data", + "type": "core::array::Span::" } ], "outputs": [], @@ -3004,7 +2136,7 @@ }, { "type": "event", - "name": "p_war::systems::actions::p_war_actions::Event", + "name": "pwar::systems::propose::propose_actions::Event", "kind": "enum", "variants": [ { @@ -3021,26 +2153,23 @@ } ], "init_calldata": [], - "tag": "pixelaw-p_war_actions", - "selector": "0x60819afda106eb158f2bab7b32887de68857103d8ffb9a1683ba40f9d96e98b", + "tag": "pwar-propose_actions", + "selector": "0x5052f70e59d3197eee09586db5f0c9578581601c549020f478ffe96e57d8573", "systems": [ - "init", - "interact", - "create_game", - "create_game_guilds", - "place_pixel", - "update_pixel", - "end_game", + "create_proposal", + "activate_proposal", + "add_new_color", + "reset_to_white", "upgrade" ] }, { - "address": "0x717d128a1fe8718967b87146fe6f73ba487c298758b0680593db98b92392592", - "class_hash": "0x183c131707a2d915cebada4097eaef1b3391a8074366b85ac99312268fdbbb6", + "address": "0x2226c41273351a3d09127412d87eab7ee2c934b6978da1342229201966014fa", + "class_hash": "0x273a59bed6da71650a30d4ff22b0c88329714d296a183b0171b14f36f72b9d3", "abi": [ { "type": "impl", - "name": "propose_actions__ContractImpl", + "name": "pwar_actions__ContractImpl", "interface_name": "dojo::contract::interface::IContract" }, { @@ -3050,7 +2179,7 @@ }, { "type": "impl", - "name": "propose_actions__DeployedContractImpl", + "name": "pwar_actions__DeployedContractImpl", "interface_name": "dojo::meta::interface::IDeployedResource" }, { @@ -3088,10 +2217,45 @@ } ] }, + { + "type": "function", + "name": "dojo_init", + "inputs": [], + "outputs": [], + "state_mutability": "external" + }, { "type": "impl", - "name": "ProposeImpl", - "interface_name": "p_war::systems::propose::IPropose" + "name": "ActionsImpl", + "interface_name": "pwar::systems::actions::IActions" + }, + { + "type": "enum", + "name": "core::option::Option::", + "variants": [ + { + "name": "Some", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "None", + "type": "()" + } + ] + }, + { + "type": "enum", + "name": "core::option::Option::", + "variants": [ + { + "name": "Some", + "type": "core::integer::u64" + }, + { + "name": "None", + "type": "()" + } + ] }, { "type": "struct", @@ -3109,11 +2273,37 @@ }, { "type": "struct", - "name": "core::array::Span::", + "name": "pixelaw::core::utils::DefaultParameters", "members": [ { - "name": "snapshot", - "type": "@core::array::Array::" + "name": "player_override", + "type": "core::option::Option::" + }, + { + "name": "system_override", + "type": "core::option::Option::" + }, + { + "name": "area_hint", + "type": "core::option::Option::" + }, + { + "name": "position", + "type": "pixelaw::core::utils::Position" + }, + { + "name": "color", + "type": "core::integer::u32" + } + ] + }, + { + "type": "struct", + "name": "pwar::systems::guilds::IGuildDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" } ] }, @@ -3129,7 +2319,7 @@ }, { "type": "struct", - "name": "p_war::models::game::Game", + "name": "pwar::models::game::Game", "members": [ { "name": "id", @@ -3173,93 +2363,29 @@ } ] }, - { - "type": "enum", - "name": "core::bool", - "variants": [ - { - "name": "False", - "type": "()" - }, - { - "name": "True", - "type": "()" - } - ] - }, - { - "type": "struct", - "name": "p_war::models::proposal::Proposal", - "members": [ - { - "name": "game_id", - "type": "core::integer::u32" - }, - { - "name": "index", - "type": "core::integer::u32" - }, - { - "name": "author", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "proposal_type", - "type": "core::integer::u8" - }, - { - "name": "target_args_1", - "type": "core::integer::u32" - }, - { - "name": "target_args_2", - "type": "core::integer::u32" - }, - { - "name": "start", - "type": "core::integer::u64" - }, - { - "name": "end", - "type": "core::integer::u64" - }, - { - "name": "yes_voting_power", - "type": "core::integer::u32" - }, - { - "name": "no_voting_power", - "type": "core::integer::u32" - }, - { - "name": "is_activated", - "type": "core::bool" - } - ] - }, { "type": "interface", - "name": "p_war::systems::propose::IPropose", + "name": "pwar::systems::actions::IActions", "items": [ { "type": "function", - "name": "create_proposal", + "name": "interact", "inputs": [ { - "name": "game_id", - "type": "core::integer::u32" - }, - { - "name": "proposal_type", - "type": "core::integer::u8" - }, - { - "name": "target_args_1", - "type": "core::integer::u32" - }, + "name": "default_params", + "type": "pixelaw::core::utils::DefaultParameters" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "create_game", + "inputs": [ { - "name": "target_args_2", - "type": "core::integer::u32" + "name": "origin", + "type": "pixelaw::core::utils::Position" } ], "outputs": [ @@ -3271,43 +2397,67 @@ }, { "type": "function", - "name": "activate_proposal", + "name": "create_game_guilds", "inputs": [ { "name": "game_id", "type": "core::integer::u32" }, { - "name": "index", - "type": "core::integer::u32" - }, + "name": "guild_dispatcher", + "type": "pwar::systems::guilds::IGuildDispatcher" + } + ], + "outputs": [ { - "name": "clear_data", - "type": "core::array::Span::" + "type": "core::array::Array::" } ], - "outputs": [], "state_mutability": "external" }, { "type": "function", - "name": "add_new_color", + "name": "get_game_id", "inputs": [ { - "name": "game_id", + "name": "position", + "type": "pixelaw::core::utils::Position" + } + ], + "outputs": [ + { "type": "core::integer::u32" - }, + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "get_game", + "inputs": [ { - "name": "index", + "name": "id", "type": "core::integer::u32" - }, + } + ], + "outputs": [ { - "name": "game", - "type": "p_war::models::game::Game" + "type": "pwar::models::game::Game" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "place_pixel", + "inputs": [ + { + "name": "app", + "type": "core::starknet::contract_address::ContractAddress" }, { - "name": "proposal", - "type": "p_war::models::proposal::Proposal" + "name": "default_params", + "type": "pixelaw::core::utils::DefaultParameters" } ], "outputs": [], @@ -3315,27 +2465,11 @@ }, { "type": "function", - "name": "reset_to_white", + "name": "end_game", "inputs": [ { "name": "game_id", "type": "core::integer::u32" - }, - { - "name": "index", - "type": "core::integer::u32" - }, - { - "name": "game", - "type": "p_war::models::game::Game" - }, - { - "name": "proposal", - "type": "p_war::models::proposal::Proposal" - }, - { - "name": "clear_data", - "type": "core::array::Span::" } ], "outputs": [], @@ -3343,13 +2477,6 @@ } ] }, - { - "type": "function", - "name": "dojo_init", - "inputs": [], - "outputs": [], - "state_mutability": "view" - }, { "type": "impl", "name": "WorldProviderImpl", @@ -3442,7 +2569,7 @@ }, { "type": "event", - "name": "p_war::systems::propose::propose_actions::Event", + "name": "pwar::systems::actions::pwar_actions::Event", "kind": "enum", "variants": [ { @@ -3459,19 +2586,21 @@ } ], "init_calldata": [], - "tag": "pixelaw-propose_actions", - "selector": "0x4ee7028a73b7bd0e88525eaf1d60daf9a2f7e3fa14b15f3a52f27978569b58d", + "tag": "pwar-pwar_actions", + "selector": "0x3daa6a1f5dad3f5074b948a3e3a65e5b5f08198629686def58f43acce601a48", "systems": [ - "create_proposal", - "activate_proposal", - "add_new_color", - "reset_to_white", + "dojo_init", + "interact", + "create_game", + "create_game_guilds", + "place_pixel", + "end_game", "upgrade" ] }, { - "address": "0x46d2a5ac94f2f4a52082ebf7e01e6f603e9e5c7b0da82139e757ebcde877261", - "class_hash": "0x4c22bfb3bc958e6f85f440aa0f5fc665c2f33c0d45f60e31c5e62246a4e43e8", + "address": "0x379ac4b00a0ad23a102ea64d2686123300ef515605d0cea7df79405f4555ba", + "class_hash": "0x336f77928b73a5f532bfa6975c71a11395ea86d2e8a9ea2e9c571efb15f8f4c", "abi": [ { "type": "impl", @@ -3526,7 +2655,7 @@ { "type": "impl", "name": "VotingImpl", - "interface_name": "p_war::systems::voting::IVoting" + "interface_name": "pwar::systems::voting::IVoting" }, { "type": "enum", @@ -3544,7 +2673,7 @@ }, { "type": "interface", - "name": "p_war::systems::voting::IVoting", + "name": "pwar::systems::voting::IVoting", "items": [ { "type": "function", @@ -3671,7 +2800,7 @@ }, { "type": "event", - "name": "p_war::systems::voting::voting_actions::Event", + "name": "pwar::systems::voting::voting_actions::Event", "kind": "enum", "variants": [ { @@ -3688,148 +2817,150 @@ } ], "init_calldata": [], - "tag": "pixelaw-voting_actions", - "selector": "0x6aab73ea9b21bfd9442dae40417908aacc10dd3545ee349c9694c482f9ccbc9", + "tag": "pwar-voting_actions", + "selector": "0x62e6ca68a564d25337ca245b38054c9b249d3a9d3d7bb0d97a6a817e473383a", "systems": [ "vote", "upgrade" ] } ], + "libraries": [], "models": [ { "members": [], - "class_hash": "0x8d77a2f263976dc4b9b7f802a0292f971bc7874e4c5ebd5ba4cbd2c0982bb", - "tag": "pixelaw-AllowedApp", - "selector": "0x4aa2705854562c8bf719f487c3c8d7b13c3d5981a2ef8a2b8662454ab20dda1" + "class_hash": "0x4dfb0a2a788b5f3c2dc063fe010509977ed6116293f5d5767f11addf4c8d7d0", + "tag": "pwar-AllowedColor", + "selector": "0x58a38d0fade38ada8b7b4ea1ad3f72e83937b1d67a3db259cabf89da916c113" }, { "members": [], - "class_hash": "0x5a16916c47b297535360a150d71547f6be1aefb3d6e735a8d94d84d154b08db", - "tag": "pixelaw-AllowedColor", - "selector": "0x22c1a7964214ed1b17ffc58c6204c0e1b665dec234c929384f196d94aecd4f1" + "class_hash": "0x15f0be77cb173b3ebf11b7f99d98db882842f3b046512bea6a43e9ef1b9792d", + "tag": "pwar-Board", + "selector": "0x4e3da83a446904f6e1ab085d8b84a1ad8d361ccc19820f30833510912cd483e" }, { "members": [], - "class_hash": "0xfb7266a7d0ee8f5288331f2d0da5c9c51d0ac0f0700f13ee47b692eee317d8", - "tag": "pixelaw-Board", - "selector": "0x124dc3e76f4ed3f4837711f41cedecca802a320158b9de00a7b11c2178744db" + "class_hash": "0x4213414bf4290cdc7ff148eb823c82c399aea9a3c2ad051401ff252d642107f", + "tag": "pwar-Dummy", + "selector": "0x2962b188b8dc153cae1540d8ab6cb21672a46f9ab8651d7c912039d6fefab7f" }, { "members": [], - "class_hash": "0x1acb7503dcd4602e4d4417d031ed89f67476100706db64a45b255730eaafc38", - "tag": "pixelaw-Game", - "selector": "0x5c1fa23f91c57a8abe1fbbd9810506e80760f755a32bec3afd8c9ce1e39cc31" + "class_hash": "0x7163867e4bb835b278563ca9678a6998a54434f2b0e3613563698485f021b11", + "tag": "pwar-Game", + "selector": "0x46592e702ad6bb2731ed3e08a0de4b6923b9855554afa10f6b671ab9ceef2cf" }, { "members": [], - "class_hash": "0xa0840f5116916e59c60c930148cad0fc01ccdb94950684e0d00bb6e485b00b", - "tag": "pixelaw-GameId", - "selector": "0x1ee8756e78c92bc9c335b55e61b80e3973e3fff0f30011d964afe0f254e8bfa" + "class_hash": "0x2372801f439ba79fc4718fbef9151a3bdc42e7cf536895bb98ee6a9bcee206b", + "tag": "pwar-GameId", + "selector": "0x543171bbc3c21261062cff1a10a96d431dff91bf380fb435b232915330d79d4" }, { "members": [], - "class_hash": "0x447a7379edb50e9854b93391a977bb519d32762f76b507a014055dad6e99f74", - "tag": "pixelaw-GamePalette", - "selector": "0x49013f2b735532ac5a03f978e29eff91c1384d5c3ca9bede116ebb3e8d093b8" + "class_hash": "0xd86a845da34231fc07ad413799468c5744065c498d2ec96ecec2d16069d67c", + "tag": "pwar-GamePalette", + "selector": "0x708516af73e5ea91aabf8799d1678d91e64020fec55b52b41af2901eb6b4573" }, { "members": [], - "class_hash": "0x5c569b888ba33a482d5ec4a63009a2d4e9eced6ddeb119e7f864f86057d6f21", - "tag": "pixelaw-Guild", - "selector": "0x40e97c00653ba125f4c47d25c4869afe483b0d08badc3a85ff8779c4ae09d58" + "class_hash": "0x391f1b7279760c475dca76685d494df036ac058f559de44628e67bad2b4b000", + "tag": "pwar-Guild", + "selector": "0x141db48785b7b1b2d5b9454b58d87366cff6b3ce0afe8fbb0126d0bce96685f" }, { "members": [], - "class_hash": "0x4c8c01173825106ce9d018a9cac2e532656b4112bd4e6f347e06d8b42aca00", - "tag": "pixelaw-InPalette", - "selector": "0x7a46e3ad45c2a3929942f7b159fca9f0d5760becedb0ad2d8a083e3e2a1dfd3" + "class_hash": "0x4baf2dd687271bf0ab1d2ab0cee24f9a313223d29120d8c72e5469ff78ac602", + "tag": "pwar-InPalette", + "selector": "0x35818e4ff6e9ba38342d5b79616d83fc230db430718620754e5cf5bf1d197a7" }, { "members": [], - "class_hash": "0x233531bdade63d9e2e44619b6da5056aca4fad36875b8f9bf9583fc640861d8", - "tag": "pixelaw-PWarPixel", - "selector": "0x15195913884de92cc197b011be399aa8f603f113600bb09a372028241ccd52d" + "class_hash": "0x7f0b660016ca2f9273ed67eb0c47f8deb927abb9b92c2a416d611e2990d1602", + "tag": "pwar-PWarPixel", + "selector": "0x4bb33c5d3d85c135e0d7674f328cdf38a2a45379605e2ddc72a95003a3f50cc" }, { "members": [], - "class_hash": "0x40ba9c2f974090e8f9e4b206e624b942e96654a25a3b6802b573fa26ffec3c7", - "tag": "pixelaw-PaletteColors", - "selector": "0x39a92a0aa39ccee2d026d433e089f1a063f2ff73fc1c0f0bcf7c21a9731687b" + "class_hash": "0x622ebb072edbe2e38756affe7d74ed5c2b04996d509b712f499bcbebd33af69", + "tag": "pwar-PaletteColors", + "selector": "0x9d4e9107b255cc8990e2e459e784ebd2286530ae3cd4483aff5cd9efc7a316" }, { "members": [], - "class_hash": "0x4b4ba9938436d18a0b7f17f140fcab43560443222265df3ac7a56344198c227", - "tag": "pixelaw-PixelRecoveryRate", - "selector": "0x3aa284c05a1c4add28708228abefb8eadff58a064e2d56a64f573e3764f9acc" + "class_hash": "0x16df6bd15cfcef3fe7e0bcb88641050bd951513d086aac97713661cc77a5110", + "tag": "pwar-PixelRecoveryRate", + "selector": "0x7643b1ef53792ea2a31f74047117109eefb2c758d6fe327ba6055514e0f84c0" }, { "members": [], - "class_hash": "0x5bdcdb2dbe7108595afcd9f1164d4cc95461bcb0c0b9a27205a41641b94e41b", - "tag": "pixelaw-Player", - "selector": "0x30a1b371016270e1d0c33e176d9d07ab01d801d8b1f0e1fd1d45534137f2ce" + "class_hash": "0x75b89858b54220de72b56797e050e7bde6101090c256a90359a8c2b47607a92", + "tag": "pwar-Player", + "selector": "0x631b0584b81d509f326cb0fb45670acda594c91ece205cbff98af9fddbaa6b" }, { "members": [], - "class_hash": "0x4d25f283b8ff4c4c61d6e420eb061d277d451447586b38d3f20ffe35673944b", - "tag": "pixelaw-PlayerVote", - "selector": "0x326c17c626b9eecdb1744cb055eed766d8e9adf96c10aa60310c6961d79498c" + "class_hash": "0x36bd3de214365832fae8f55607d265a94421670717bcdd290db2e4a8e5a16a3", + "tag": "pwar-PlayerVote", + "selector": "0x66568da1d9e588c2bddd14462c8b9d1ec593f155e87e04f66af56c3e0bac43c" }, { "members": [], - "class_hash": "0x3127c49ab188fc94a8869124e62a7817f3beae38bc7231d91faf2ba795114a7", - "tag": "pixelaw-Proposal", - "selector": "0x49e1daf5238e47ac52ce3f79a684ec035e7f9e864b2979f1d0f2d46cf31c1bc" + "class_hash": "0x77eb36b0f722109a3c9953fe44b677be1ca6daf3953d76f39fb49ca22f8da5", + "tag": "pwar-Proposal", + "selector": "0x5d86acb7206f393e6675d53560320dcaae768cfdfde5c04afe1892cb1cf53b5" } ], "events": [ { "members": [], - "class_hash": "0x73b9b6b2a7d30e942c7e0f3660317bbb33ed350c3cfd1658d208938834f4212", - "tag": "pixelaw-EndedGame", - "selector": "0x63cc2102a4b3877596cde2f2e0eb68416dd8ac4b552d6319bd4705ab48fda09" + "class_hash": "0x9d46cb4e4f85bb7ccce3c1f892660a38e9d5931e7d7ac3fd7d12b8a2150a37", + "tag": "pwar-EndedGame", + "selector": "0x783100ea5deaebbb21ec5ceac9c06020b3a405f6eaebd35c3a4679b4052fe69" }, { "members": [], - "class_hash": "0x7008ff3ecc4d158c72bc278dc19bc66992ae0172a813422b5106f4be6196178", - "tag": "pixelaw-GuildCreated", - "selector": "0x190791bd5d67d74c1a3e7e908a7faa1097dc88444fc9cdbe1e4f17d4eb275c2" + "class_hash": "0x6729f7ecd0b579383562358346e5b8ebd1c1ddb9aed204b980a8b7e80cb8ffb", + "tag": "pwar-GuildCreated", + "selector": "0x4a60caf23cdcc73f43ca89900e0aaa5772ccb442b380e85cb7d1949c5fa04be" }, { "members": [], - "class_hash": "0x4fbe95d4ad6d53278422d08cdb5cf07b0c92e1b95be94ee46f343e3c7da0861", - "tag": "pixelaw-MemberAdded", - "selector": "0x5d030a1690f08a7cdd65ea908927c4d28ca6464b700fd14d7ba601e6a5a6b7b" + "class_hash": "0x4a937b3b08be900b7730ff5e7d6984fa97dc06ff0a22a3a9d846bfceaddd686", + "tag": "pwar-MemberAdded", + "selector": "0x48d28bde10f0fff86325dd577e55fc08a477b03dbe72ab0f5969ab06e9b608b" }, { "members": [], - "class_hash": "0x41e0d78ef4c485c7ae37ea2c3ac39f22de8c874b13e2b9eacc97126bc5f726f", - "tag": "pixelaw-MemberRemoved", - "selector": "0x31bc155f610ea9b75a636476db4c4b09c0c75929e2ee378ff21f421df968a0e" + "class_hash": "0x36ab6d8e708a555c8cc74c5ad3abbbcfecf681d7442553d61cc9f1dc5792073", + "tag": "pwar-MemberRemoved", + "selector": "0x2c75a32891e878002edc63f1136f84a9620173a77bee76d592358d3ed3241fb" }, { "members": [], - "class_hash": "0x25ed6eb5e8c235624310b0668daa8d6b0066ea6511c493325bbbc60512096cf", - "tag": "pixelaw-ProposalActivated", - "selector": "0x54cf9af9951fc42af752b63b2402d7b3a50e99d28973ea368bf03d4d559b9ab" + "class_hash": "0x73117a8818d3ff9b4f2a265fee43bf5e3954a2999b554f79860fcd430b3ea77", + "tag": "pwar-ProposalActivated", + "selector": "0x326c5fc197c47864260c462db88b3762de1746327e4f89be10fc53cae32af0" }, { "members": [], - "class_hash": "0x773aebad8fb402564afc53bb5fb53f742673d5f77c8bded89d40093e2574075", - "tag": "pixelaw-ProposalCreated", - "selector": "0x2695c2b5813023020f748292a15196fa26b6a28de03d9b0d98fe03f3383cb2b" + "class_hash": "0x19796988ddd268a7342efff84c1880be1fd32ff8d9d836f478d72e1219e11f6", + "tag": "pwar-ProposalCreated", + "selector": "0x460d31839213fdac40fd33efcd4c2ff242ddf8f100114c04b1617cfbc468fc2" }, { "members": [], - "class_hash": "0x71ac8ea1f5058d737fec9736515588b565cb0d95f39b4c2cd405f0e298d06e3", - "tag": "pixelaw-StartedGame", - "selector": "0x681f18fed97923a1fa8abc421f42125d7af9a14c1cb2dbbf21cc0ee998ba644" + "class_hash": "0xa4c2cf0a928a57230c3314f3367ca9dc0a3baac9f0ba0bfa62c080ca163b29", + "tag": "pwar-StartedGame", + "selector": "0x295cb760391553c019feacaaf6e248877c3ec968c5beff6d4395e5062a9ca0b" }, { "members": [], - "class_hash": "0x799caf2579bea3e9cf98e6cced9899ac6733ee30b1bb5e59b6085cd27c2c2da", - "tag": "pixelaw-Voted", - "selector": "0x2658eb5934f0ca3746e650c1cf0d5656f5ed5f2ce59aba3fafac0a7c80c093f" + "class_hash": "0x7aa72f74edc5385d7201471860abd565a0d4ca3a3c1daf7ff98cd84a0ceae0d", + "tag": "pwar-Voted", + "selector": "0x453c6d68c4f80ccaf9b772f8a86149d09fd156dbf0af86fbf9dd28e8b3eb22d" } - ] + ], + "external_contracts": [] } \ No newline at end of file diff --git a/contracts/scripts/set_a_pixel.sh b/contracts/scripts/set_a_pixel.sh index 11ba75f..fa6765e 100644 --- a/contracts/scripts/set_a_pixel.sh +++ b/contracts/scripts/set_a_pixel.sh @@ -1,5 +1,5 @@ -ACCOUNT_ADDRESS="0xb3ff441a68610b30fd5e2abbf3a1548eb6ba6f3559f2862bf2dc757e5828ca" -PRIVATE_KEY="0x2bbf4f9fd0bbb2e60b0316c1fe0b76cf7a4d0198bd493ced9b8df2a3a24d68a" +# ACCOUNT_ADDRESS="0xb3ff441a68610b30fd5e2abbf3a1548eb6ba6f3559f2862bf2dc757e5828ca" +# PRIVATE_KEY="0x2bbf4f9fd0bbb2e60b0316c1fe0b76cf7a4d0198bd493ced9b8df2a3a24d68a" -sozo execute pixelaw-p_war_actions set_pixel --account-address $ACCOUNT_ADDRESS --private-key $PRIVATE_KEY --calldata 0x0,0x0,0x1,0x0,0xff00ff \ No newline at end of file +# sozo execute pixelaw-p_war_actions set_pixel --account-address $ACCOUNT_ADDRESS --private-key $PRIVATE_KEY --calldata 0x0,0x0,0x1,0x0,0xff00ff \ No newline at end of file diff --git a/contracts/src/constants.cairo b/contracts/src/constants.cairo index 98bb698..bb71407 100644 --- a/contracts/src/constants.cairo +++ b/contracts/src/constants.cairo @@ -1,19 +1,19 @@ // ######################### // ### APP CONFIGURATION ### // ######################### -const APP_KEY: felt252 = 'p_war'; -const APP_ICON: felt252 = 'U+2694'; +pub const APP_KEY: felt252 = 'pwar'; +pub const APP_ICON: felt252 = 'U+2694'; -const OUT_OF_BOUNDS_GAME_ID: usize = 9999; +pub const OUT_OF_BOUNDS_GAME_ID: u32 = 9999; // #################################### // ### GAME CONFIGURATION FOR pwar v2 ### // #################################### // # Initial settings -// const GAME_ID: usize = 1; +// const GAME_ID: u32 = 1; // const INITIAL_COLOR: u32 = 0xFFFFFFFF; // white // const DEFAULT_AREA: u32 = 32; // 32x32 grid // const DEFAULT_PX: u32 = 30; // 30 max PX per player -// const MAX_COLOR_SIZE: usize = 9; // 9 available colors +// const MAX_COLOR_SIZE: u32 = 9; // 9 available colors // const GAME_DURATION: u64 = 1209600 + 3600; // 2 weeks + 1 hour (for preparation) in seconds // const DEFAULT_RECOVERY_RATE: u64 = 30; // 30 seconds to recover 1PX @@ -28,10 +28,10 @@ const OUT_OF_BOUNDS_GAME_ID: usize = 9999; // // ### GAME CONFIGURATION FOR CLOSED BETA TEST ### // // ############################################### // // # Initial settings -// const GAME_ID: usize = 1; +// const GAME_ID: u32 = 1; // const INITIAL_COLOR: u32 = 0xFFFFFFFF; // const DEFAULT_AREA: u32 = 16; -// const MAX_COLOR_SIZE: usize = 9; +// const MAX_COLOR_SIZE: u32 = 9; // const GAME_DURATION: u64 = 15 * 60; // 15 minutes in seconds // const DEFAULT_RECOVERY_RATE: u64 = 10; // 10 secs to recover 1PX @@ -47,17 +47,17 @@ const OUT_OF_BOUNDS_GAME_ID: usize = 9999; // // ### GAME CONFIGURATION FOR LOCAL ### // // #################################### // // # Initial settings -const GAME_ID: usize = 1; -const INITIAL_COLOR: u32 = 0xFFFFFFFF; -const DEFAULT_AREA: u32 = 50; // changed from 5 -const MAX_COLOR_SIZE: usize = 9; -const GAME_DURATION: u64 = 60 * 60 * 24 * 30 * 12; // 12 months -const DEFAULT_RECOVERY_RATE: u64 = 5; // 5 secs to recover 1PX +pub const GAME_ID: u32 = 1; +pub const INITIAL_COLOR: u32 = 0xFFFFFFFF; +pub const DEFAULT_AREA: u32 = 50; // changed from 5 +pub const MAX_COLOR_SIZE: u32 = 9; +pub const GAME_DURATION: u64 = 60 * 60 * 24 * 30 * 12; // 12 months +pub const DEFAULT_RECOVERY_RATE: u64 = 5; // 5 secs to recover 1PX // # For Governance -const PROPOSAL_FACTOR: u32 = 1; // 3 seconds in seconds. -const PROPOSAL_DURATION: u64 = 3 * 60; // 3mins -const NEEDED_YES_VOTING_POWER: u32 = 1; +pub const PROPOSAL_FACTOR: u32 = 1; // 3 seconds in seconds. +pub const PROPOSAL_DURATION: u64 = 3 * 60; // 3mins +pub const NEEDED_YES_VOTING_POWER: u32 = 1; // for additional rules -const DISASTER_SIZE: u32 = 5; +pub const DISASTER_SIZE: u32 = 5; diff --git a/contracts/src/lib.cairo b/contracts/src/lib.cairo index 059860f..d6ac77b 100644 --- a/contracts/src/lib.cairo +++ b/contracts/src/lib.cairo @@ -1,28 +1,26 @@ mod constants; -mod systems { - mod actions; - mod app; - mod guilds; - mod propose; - mod utils; - mod voting; +pub mod systems { + pub mod actions; + pub mod guilds; + pub mod propose; + pub mod utils; + pub mod voting; } -mod models { - mod allowed_app; - mod allowed_color; - mod board; - mod game; - mod guilds; - mod player; - mod proposal; +pub mod models { + pub mod allowed_color; + pub mod board; + pub mod game; + pub mod guilds; + pub mod player; + pub mod proposal; } #[cfg(test)] -mod tests { +pub mod tests { mod test_games; mod test_guilds; mod test_proposals; mod test_setup; - mod utils; + pub mod utils; } diff --git a/contracts/src/models/allowed_app.cairo b/contracts/src/models/allowed_app.cairo deleted file mode 100644 index 0dd98a9..0000000 --- a/contracts/src/models/allowed_app.cairo +++ /dev/null @@ -1,11 +0,0 @@ -use starknet::ContractAddress; - -#[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct AllowedApp { - #[key] - game_id: usize, - #[key] - contract: ContractAddress, - is_allowed: bool -} diff --git a/contracts/src/models/allowed_color.cairo b/contracts/src/models/allowed_color.cairo index f341bbc..8a5d546 100644 --- a/contracts/src/models/allowed_color.cairo +++ b/contracts/src/models/allowed_color.cairo @@ -1,41 +1,41 @@ // if the color is allowed #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct AllowedColor { +#[dojo::model] +pub struct AllowedColor { #[key] - game_id: usize, + pub game_id: u32, #[key] - color: u32, - is_allowed: bool + pub color: u32, + pub is_allowed: bool, } // the color found in what index #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct PaletteColors { +#[dojo::model] +pub struct PaletteColors { #[key] - game_id: usize, + pub game_id: u32, #[key] - idx: u32, - color: u32 + pub idx: u32, + pub color: u32, } // if the color is already in the palette #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct InPalette { +#[dojo::model] +pub struct InPalette { #[key] - game_id: usize, + pub game_id: u32, #[key] - color: u32, - value: bool + pub color: u32, + pub value: bool, } // number of colors in the game's palette #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct GamePalette { +#[dojo::model] +pub struct GamePalette { #[key] - game_id: usize, - length: usize + pub game_id: u32, + pub length: u32, } diff --git a/contracts/src/models/board.cairo b/contracts/src/models/board.cairo index ea2767b..86ef5ad 100644 --- a/contracts/src/models/board.cairo +++ b/contracts/src/models/board.cairo @@ -2,30 +2,30 @@ use pixelaw::core::utils::Position; use starknet::{ContractAddress}; #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct Board { +#[dojo::model] +pub struct Board { #[key] - id: usize, - origin: Position, - width: u32, - height: u32, + pub id: u32, + pub origin: Position, + pub width: u32, + pub height: u32, } #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct PWarPixel { +#[dojo::model] +pub struct PWarPixel { #[key] - position: Position, - owner: ContractAddress + pub position: Position, + pub owner: ContractAddress, } #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct GameId { +#[dojo::model] +pub struct GameId { #[key] - x: u32, + pub x: u32, #[key] - y: u32, - value: usize + pub y: u32, + pub value: u32, } diff --git a/contracts/src/models/game.cairo b/contracts/src/models/game.cairo index f9595fb..f75272d 100644 --- a/contracts/src/models/game.cairo +++ b/contracts/src/models/game.cairo @@ -2,30 +2,30 @@ use starknet::ContractAddress; use starknet::get_block_timestamp; #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct Game { +#[dojo::model] +pub struct Game { #[key] - id: usize, - start: u64, - end: u64, - proposal_idx: usize, - coeff_own_pixels: u32, - coeff_commits: u32, - winner_config: u32, // optimally, set by contract address. - winner: ContractAddress, - guild_ids: Span, //list of guild IDs inside the game struct - guild_count: usize, + pub id: u32, + pub start: u64, + pub end: u64, + pub proposal_idx: u32, + pub coeff_own_pixels: u32, + pub coeff_commits: u32, + pub winner_config: u32, // optimally, set by contract address. + pub winner: ContractAddress, + pub guild_ids: Span, //list of guild IDs inside the game pub struct + pub guild_count: u32, } #[derive(PartialEq, Copy, Drop, Serde)] -enum Status { +pub enum Status { Unknown, Pending, Ongoing, - Completed + Completed, } -trait GameTrait { +pub trait GameTrait { fn status(self: Game) -> Status; } diff --git a/contracts/src/models/guilds.cairo b/contracts/src/models/guilds.cairo index 03c774e..aa57042 100644 --- a/contracts/src/models/guilds.cairo +++ b/contracts/src/models/guilds.cairo @@ -1,15 +1,14 @@ -use dojo::world::IWorldDispatcher; use starknet::ContractAddress; #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct Guild { +#[dojo::model] +pub struct Guild { #[key] - game_id: usize, + pub game_id: u32, #[key] - guild_id: usize, - guild_name: felt252, - creator: ContractAddress, - members: Span, - member_count: usize + pub guild_id: u32, + pub guild_name: felt252, + pub creator: ContractAddress, + pub members: Span, + pub member_count: u32, } diff --git a/contracts/src/models/payments.cairo b/contracts/src/models/payments.cairo index c197801..1b8a182 100644 --- a/contracts/src/models/payments.cairo +++ b/contracts/src/models/payments.cairo @@ -1,29 +1,29 @@ use starknet::ContractAddress; #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct GamePayments { +#[dojo::model] +pub struct GamePayments { #[key] - game_id: u32, - participation_fee: u256, - prize_pool: u256, - treasury_balance: u256 + pub game_id: u32, + pub participation_fee: u256, + pub prize_pool: u256, + pub treasury_balance: u256, } #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct PlayerPayment { +#[dojo::model] +pub struct PlayerPayment { #[key] - game_id: u32, + pub game_id: u32, #[key] - player: ContractAddress, - amount_paid: u256 + pub player: ContractAddress, + pub amount_paid: u256, } #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct TreasuryInfo { +#[dojo::model] +pub struct TreasuryInfo { #[key] - dummy_key: u32, - treasury_address: ContractAddress + pub dummy_key: u32, + pub treasury_address: ContractAddress, } diff --git a/contracts/src/models/player.cairo b/contracts/src/models/player.cairo index 35fee37..a35062a 100644 --- a/contracts/src/models/player.cairo +++ b/contracts/src/models/player.cairo @@ -1,15 +1,15 @@ -use starknet::{get_block_timestamp, ContractAddress}; +use starknet::{ContractAddress}; #[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct Player { +#[dojo::model] +pub struct Player { #[key] - address: ContractAddress, + pub address: ContractAddress, // #[key] // the game_id as a key for the player should be added as players could be playing - // different games at once game_id: usize, + // different games at once game_id: u32, // name: felt252, - num_owns: u32, - num_commit: u32, - last_date: u64, - is_banned: bool, + pub num_owns: u32, + pub num_commit: u32, + pub last_date: u64, + pub is_banned: bool, } diff --git a/contracts/src/models/proposal.cairo b/contracts/src/models/proposal.cairo index 3bcb319..34988c0 100644 --- a/contracts/src/models/proposal.cairo +++ b/contracts/src/models/proposal.cairo @@ -10,7 +10,6 @@ use starknet::ContractAddress; // #[derive(PartialEq, Copy, Introspect, Drop, Serde, Print)] // enum ProposalType { // Unknown, -// ToggleAllowedApp, // AddNewColor, // ExtendGameEndTime, // ChangePixelRecovery, @@ -26,9 +25,9 @@ use starknet::ContractAddress; // #[derive(Model, Copy, Drop, Serde, Print)] // struct Proposal { // #[key] -// game_id: usize, +// game_id: u32, // #[key] -// index: usize, +// index: u32, // author: ContractAddress, // proposal_type: ProposalType, // args: Args, @@ -38,50 +37,49 @@ use starknet::ContractAddress; // no_px: u32 // } -#[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct Proposal { +#[derive(Serde, Copy, Drop)] +#[dojo::model] +pub struct Proposal { #[key] - game_id: usize, + pub game_id: u32, #[key] - index: usize, - author: ContractAddress, - proposal_type: u8, // change it from ProposalType is not working... - target_args_1: u32, - target_args_2: u32, - start: u64, - end: u64, - yes_voting_power: u32, - no_voting_power: u32, - is_activated: bool, // added: check if the proposal is activated + pub index: u32, + pub author: ContractAddress, + pub proposal_type: u8, + pub target_args_1: u32, + pub target_args_2: u32, + pub start: u64, + pub end: u64, + pub yes_voting_power: u32, + pub no_voting_power: u32, + pub is_activated: bool, } -#[derive(Serde, Copy, Drop, PartialEq)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct PlayerVote { +#[derive(Serde, Copy, Drop)] +#[dojo::model] +pub struct PlayerVote { #[key] - player: ContractAddress, + pub player: ContractAddress, #[key] - game_id: usize, + pub game_id: u32, #[key] - index: usize, - is_in_favor: bool, - voting_power: u32 + pub index: u32, + pub is_in_favor: bool, + pub voting_power: u32, } -#[derive(Copy, Drop, Serde)] -#[dojo::model(namespace: "pixelaw", nomapping: true)] -struct PixelRecoveryRate { +#[derive(Copy, Drop, Serde, PartialEq)] +#[dojo::model] +pub struct PixelRecoveryRate { #[key] - game_id: usize, - rate: u64 + pub game_id: u32, + pub rate: u64, } // impl ProposalTypeFelt252 of Into { // fn into(self: ProposalType) -> felt252 { // match self { // ProposalType::Unknown => 0, -// ProposalType::ToggleAllowedApp => 1, // ProposalType::AddNewColor => 2, // ProposalType::ExtendGameEndTime => 3, // ProposalType::ChangePixelRecovery => 4, diff --git a/contracts/src/systems/actions.cairo b/contracts/src/systems/actions.cairo index eea7fb1..d089515 100644 --- a/contracts/src/systems/actions.cairo +++ b/contracts/src/systems/actions.cairo @@ -1,88 +1,72 @@ -use dojo::world::{IWorldDispatcher, IWorldDispatcherTrait}; -use p_war::models::board::Position; -use p_war::models::game::Game; -use p_war::systems::guilds::{IGuildDispatcher, IGuildDispatcherTrait}; -use pixelaw::core::models::pixel::PixelUpdate; -use pixelaw::core::utils::DefaultParameters; -use starknet::ContractAddress; +use pixelaw::core::utils::{DefaultParameters, Position}; +use pwar::models::game::Game; +use pwar::systems::guilds::{IGuildDispatcher}; +use starknet::{ContractAddress}; // define the interface #[starknet::interface] pub trait IActions { - fn init(ref self: T); fn interact(ref self: T, default_params: DefaultParameters); - fn create_game(ref self: T, origin: Position) -> usize; + fn create_game(ref self: T, origin: Position) -> u32; fn create_game_guilds( - ref self: T, game_id: usize, guild_dispatcher: IGuildDispatcher - ) -> Array; - fn get_game_id(self: @T, position: Position) -> usize; + ref self: T, game_id: u32, guild_dispatcher: IGuildDispatcher, + ) -> Array; + fn get_game_id(self: @T, position: Position) -> u32; + fn get_game(self: @T, id: u32) -> Game; fn place_pixel(ref self: T, app: ContractAddress, default_params: DefaultParameters); - fn update_pixel(ref self: T, pixel_update: PixelUpdate); - fn end_game(ref self: T, game_id: usize); + fn end_game(ref self: T, game_id: u32); } // dojo decorator -#[dojo::contract(namespace: "pixelaw", nomapping: true)] -mod p_war_actions { - use dojo::event::EventStorage; - use dojo::model::{ModelStorage, ModelValueStorage}; - use dojo::world::WorldStorageTrait; +#[dojo::contract] +pub mod pwar_actions { + use dojo::model::{ModelStorage}; use dojo::world::{IWorldDispatcherTrait}; - use p_war::constants::{ - APP_KEY, APP_ICON, GAME_ID, OUT_OF_BOUNDS_GAME_ID, DEFAULT_RECOVERY_RATE, INITIAL_COLOR, - GAME_DURATION, DEFAULT_AREA, + use pixelaw::core::actions::{IActionsDispatcherTrait as ICoreActionsDispatcherTrait}; + use pixelaw::core::models::pixel::{PixelUpdate, PixelUpdateResultTraitImpl}; + use pixelaw::core::utils::{DefaultParameters, Position, get_callers, get_core_actions}; + use pwar::constants::{ + APP_ICON, APP_KEY, DEFAULT_AREA, DEFAULT_RECOVERY_RATE, GAME_DURATION, GAME_ID, + OUT_OF_BOUNDS_GAME_ID, }; - use p_war::models::{ - game::{Game, Status, GameTrait}, board::{Board, GameId, PWarPixel}, player::{Player}, + use pwar::models::{ + allowed_color::{AllowedColor, GamePalette, InPalette, PaletteColors}, + board::{Board, PWarPixel}, game::{Game, GameTrait}, player::{Player}, proposal::{PixelRecoveryRate}, - allowed_color::{AllowedColor, PaletteColors, InPalette, GamePalette}, - allowed_app::AllowedApp }; - use p_war::systems::app::{IAllowedApp, IAllowedAppDispatcher, IAllowedAppDispatcherTrait}; - use p_war::systems::guilds::{IGuildDispatcher, IGuildDispatcherTrait}; - use p_war::systems::utils::{check_game_status}; - use pixelaw::core::actions::{ - IActionsDispatcher as ICoreActionsDispatcher, - IActionsDispatcherTrait as ICoreActionsDispatcherTrait - }; - use pixelaw::core::models::{pixel::PixelUpdate, registry::App}; - use pixelaw::core::utils::{ - get_callers, get_core_actions, Direction, Position, DefaultParameters - }; - use starknet::{ - ContractAddress, get_block_timestamp, get_caller_address, get_contract_address, get_tx_info, - contract_address_const, - }; - use super::{IActions, IActionsDispatcher, IActionsDispatcherTrait}; + use pwar::systems::guilds::{IGuildDispatcher, IGuildDispatcherTrait}; + use pwar::systems::utils::{check_game_status}; + use starknet::{ContractAddress, contract_address_const, get_block_timestamp}; + use super::{IActions}; #[derive(Copy, Drop, Serde)] #[dojo::event] pub struct StartedGame { #[key] - id: usize, + id: u32, timestamp: u128, - creator: ContractAddress + creator: ContractAddress, } #[derive(Copy, Drop, Serde)] #[dojo::event] pub struct EndedGame { #[key] - id: usize, + id: u32, timestamp: u128, } + fn dojo_init(ref self: ContractState) { + let mut core_world = self.world(@"pixelaw"); + let core_actions = pixelaw::core::utils::get_core_actions(ref core_world); + core_actions.new_app(contract_address_const::<0>(), APP_KEY, APP_ICON); + } + #[abi(embed_v0)] impl ActionsImpl of IActions { - fn init(ref self: ContractState) { - let mut world = self.world(@"pixelaw"); - let core_actions = get_core_actions(ref world); - core_actions.new_app(contract_address_const::<0>(), APP_KEY, APP_ICON); - } - fn interact(ref self: ContractState, default_params: DefaultParameters) { - let position = Position { x: default_params.position.x, y: default_params.position.y }; - println!("position x{}, y{}.", default_params.position.x, default_params.position.y); + let position = default_params.position; + println!("position x{}, y{}.", position.x, position.y); let game_id = self.get_game_id(position); println!("game id: {}", game_id); if game_id == 0 { @@ -95,16 +79,16 @@ mod p_war_actions { }; } - fn get_game_id(self: @ContractState, position: Position) -> usize { - let mut world = self.world(@"pixelaw"); + fn get_game_id(self: @ContractState, position: Position) -> u32 { + let mut app_world = self.world(@"pwar"); - let mut id = world.dispatcher.uuid(); + let mut id = app_world.dispatcher.uuid(); if id == 0 { return 0; } // set id as GAME_ID=1 - let board: Board = world.read_model(GAME_ID); + let board: Board = app_world.read_model(GAME_ID); if position.x < board.origin.x || position.x >= board.origin.x + (board.width.try_into().unwrap()) @@ -116,20 +100,17 @@ mod p_war_actions { return 1; } - fn create_game(ref self: ContractState, origin: Position) -> usize { - let mut world = self.world(@"pixelaw"); - println!("create_game BEGIN"); + fn get_game(self: @ContractState, id: u32) -> Game { + let mut app_world = self.world(@"pwar"); + let game: Game = app_world.read_model((id)); + game + } - // check if a game exists - // let mut tmp_uuid = world.uuid(); - // if tmp_uuid != 0 { - // return 0; - // }; + fn create_game(ref self: ContractState, origin: Position) -> u32 { + let mut app_world = self.world(@"pwar"); + println!("create_game function called at x:{} and y:{}", origin.x, origin.y); - // if id == 0 { - // id = world.uuid(); - // } - let mut id = GAME_ID; // set as a constant for now. + let mut id = GAME_ID; let start = get_block_timestamp(); @@ -143,14 +124,13 @@ mod p_war_actions { winner_config: 0, winner: starknet::contract_address_const::<0x0>(), guild_ids: ArrayTrait::new().span(), - guild_count: 0 + guild_count: 0, }; - let board = Board { id, origin, width: DEFAULT_AREA, height: DEFAULT_AREA, }; + let board = Board { id, origin, width: DEFAULT_AREA, height: DEFAULT_AREA }; - world.write_model(@board); //not sure - world.write_model(@game); - println!("create_game 1"); + app_world.write_model(@board); //not sure + app_world.write_model(@game); // add default colors (changed these to RGBA) let mut color_idx = 0; @@ -170,28 +150,25 @@ mod p_war_actions { break; }; let allowed_color = AllowedColor { - game_id: id, color: *a.at(color_idx), is_allowed: true + game_id: id, color: *a.at(color_idx), is_allowed: true, }; let palette_colors = PaletteColors { - game_id: id, idx: color_idx, color: *a.at(color_idx) + game_id: id, idx: color_idx, color: *a.at(color_idx), }; let in_palette = InPalette { game_id: id, color: *a.at(color_idx), value: true }; - world.write_model(@allowed_color); - world.write_model(@palette_colors); - world.write_model(@in_palette); + app_world.write_model(@allowed_color); + app_world.write_model(@palette_colors); + app_world.write_model(@in_palette); color_idx += 1; }; - println!("create_game 2"); // set default recovery_rate let pixel_recovery_rate = PixelRecoveryRate { - game_id: id, rate: DEFAULT_RECOVERY_RATE + game_id: id, rate: DEFAULT_RECOVERY_RATE, }; let game_palette = GamePalette { game_id: id, length: 9 }; - world.write_model(@pixel_recovery_rate); - world.write_model(@game_palette); - - println!("create_game 2.1"); + app_world.write_model(@pixel_recovery_rate); + app_world.write_model(@game_palette); id // emit event that game has started @@ -199,8 +176,8 @@ mod p_war_actions { // initialize guilds for the game fn create_game_guilds( - ref self: ContractState, game_id: usize, guild_dispatcher: IGuildDispatcher - ) -> Array { + ref self: ContractState, game_id: u32, guild_dispatcher: IGuildDispatcher, + ) -> Array { let mut guild_ids = ArrayTrait::new(); guild_ids.append(guild_dispatcher.create_guild(game_id, 'Fire')); guild_ids.append(guild_dispatcher.create_guild(game_id, 'Water')); @@ -211,107 +188,80 @@ mod p_war_actions { // To paint, basically use this function. fn place_pixel( - ref self: ContractState, app: ContractAddress, default_params: DefaultParameters + ref self: ContractState, app: ContractAddress, default_params: DefaultParameters, ) { - let mut world = self.world(@"pixelaw"); - let core_actions = get_core_actions(ref world); //new - let system = get_contract_address(); //new - let position = Position { x: default_params.position.x, y: default_params.position.y }; + // Load important variables + let mut core_world = self.world(@"pixelaw"); + let mut app_world = self.world(@"pwar"); + let core_actions = get_core_actions(ref core_world); + let (player, system) = get_callers(ref core_world, default_params); + let position = default_params.position; let game_id = self.get_game_id(position); - let player_address = get_caller_address(); assert(game_id != 0, 'this game does not exist'); - println!("color: {}", default_params.color); - let allowed_color: AllowedColor = world.read_model((game_id, default_params.color)); + let allowed_color: AllowedColor = app_world.read_model((game_id, default_params.color)); assert( - allowed_color.is_allowed, 'color is not allowed' + allowed_color.is_allowed, 'color is not allowed', ); // cannot test correctly without cheatcodes. - let allowed_app: AllowedApp = world.read_model((game_id, app)); - assert(app.is_zero() || allowed_app.is_allowed, 'app is not allowed'); - - // let contract_address = if app.is_zero() { - // get_contract_address() - // } else { - // app - // }; - - //let app = IAllowedAppDispatcher { contract_address }; old - // println!("app: {}", app); - // recover px - //recover_px(ref world, game_id, player_address); - - // if this is first time for the caller, let's set initial px. - let mut player: Player = world.read_model(player_address); + let mut pwarPlayer: Player = app_world.read_model(player); // get the game info - let game: Game = world.read_model(game_id); + let game: Game = app_world.read_model(game_id); // check the player is banned or not - assert(player.is_banned == false, 'you are banned'); + assert(pwarPlayer.is_banned == false, 'you are banned'); // check if the game is ongoing assert(check_game_status(game.status()), 'game is not ongoing: actions1'); println!("set_pixel BEGIN"); + let position = default_params.position; core_actions .update_pixel( //new - player_address, + pwarPlayer.address, system, PixelUpdate { - x: default_params.position.x, - y: default_params.position.y, + position, color: Option::Some(default_params.color), timestamp: Option::None, text: Option::None, app: Option::None, - owner: Option::None, - action: Option::None + owner: Option::Some(pwarPlayer.address), + action: Option::None, }, Option::None, - false + false, ); println!("set_pixel END"); - player.num_owns += 1; - player.num_commit += 1; - println!("player.num_commit: {}", player.num_commit); - player.last_date = get_block_timestamp(); - world.write_model(@player); + pwarPlayer.num_owns += 1; + pwarPlayer.num_commit += 1; + println!("player.num_commit: {}", pwarPlayer.num_commit); + pwarPlayer.last_date = get_block_timestamp(); + app_world.write_model(@pwarPlayer); // get the previous owner of PWarPixel - let position = Position { x: default_params.position.x, y: default_params.position.y }; - let mut previous_pwarpixel: PWarPixel = world.read_model(position); + let mut previous_pwarpixel: PWarPixel = app_world.read_model(position); if (previous_pwarpixel.owner != contract_address_const::<0x0>() - && previous_pwarpixel.owner != player.address) { + && previous_pwarpixel.owner != pwarPlayer.address) { // get the previous player's info - let mut previous_player: Player = world.read_model(previous_pwarpixel.owner); + let mut previous_player: Player = app_world.read_model(previous_pwarpixel.owner); // decrease the previous player's num_owns previous_player.num_owns -= 1; - world.write_model(@previous_player); + app_world.write_model(@previous_player); } // set the new owner of PWarPixel - previous_pwarpixel.owner = player.address; - world.write_model(@previous_pwarpixel); - } - - // only use for expand areas. - fn update_pixel(ref self: ContractState, pixel_update: PixelUpdate) { - let mut world = self.world(@"pixelaw"); - assert(get_caller_address() == get_contract_address(), 'invalid caller'); - let player_address = get_tx_info().unbox().account_contract_address; - let system = get_contract_address(); - let core_actions = get_core_actions(ref world); - - core_actions.update_pixel(player_address, system, pixel_update, Option::None, false); + previous_pwarpixel.owner = pwarPlayer.address; + app_world.write_model(@previous_pwarpixel); } - fn end_game(ref self: ContractState, game_id: usize) { + fn end_game(ref self: ContractState, game_id: u32) { // check if the time is expired. - let mut world = self.world(@"pixelaw"); - let mut game: Game = world.read_model(game_id); + let mut app_world = self.world(@"pwar"); + let mut game: Game = app_world.read_model(game_id); assert(get_block_timestamp() >= game.end, 'game is not ended'); // TODO: emit the status?? @@ -340,7 +290,7 @@ mod p_war_actions { game.winner = winner; - world.write_model(@game); + app_world.write_model(@game); // TODO: emit the winner! } } diff --git a/contracts/src/systems/app.cairo b/contracts/src/systems/app.cairo deleted file mode 100644 index b470b7c..0000000 --- a/contracts/src/systems/app.cairo +++ /dev/null @@ -1,55 +0,0 @@ -use dojo::world::{IWorldDispatcher, IWorldDispatcherTrait}; -use pixelaw::core::models::pixel::PixelUpdate; -use pixelaw::core::utils::DefaultParameters; -use starknet::{ContractAddress, get_contract_address}; -use super::actions::{IActionsDispatcher, IActionsDispatcherTrait}; // Add this import - -#[starknet::interface] -trait IAllowedApp { - fn set_pixel(ref self: TContractState, default_params: DefaultParameters); -} - -// ... existing code ... - -#[dojo::contract(namespace: "pixelaw", nomapping: true)] -mod allowed_app_actions { - use dojo::world::{IWorldDispatcher, IWorldDispatcherTrait}; - use pixelaw::core::actions::{ - IActionsDispatcher as ICoreActionsDispatcher, - IActionsDispatcherTrait as ICoreActionsDispatcherTrait - }; - use pixelaw::core::models::pixel::PixelUpdate; - use pixelaw::core::utils::DefaultParameters; - use pixelaw::core::utils::get_core_actions; - use starknet::{ContractAddress, get_contract_address}; - use super::IAllowedApp; - - #[abi(embed_v0)] - impl AllowedAppImpl of IAllowedApp { - fn set_pixel(ref self: ContractState, default_params: DefaultParameters) { - // Instead of calling back to actions, call core_actions directly - let mut world = self.world(@"pixelaw"); - let core_actions = get_core_actions(ref world); - let player = starknet::get_tx_info().unbox().account_contract_address; - let system = get_contract_address(); - - core_actions - .update_pixel( - player, - system, - PixelUpdate { - x: default_params.position.x, - y: default_params.position.y, - color: Option::Some(default_params.color), - timestamp: Option::None, - text: Option::None, - app: Option::None, - owner: Option::None, - action: Option::None - }, - Option::None, - false - ); - } - } -} diff --git a/contracts/src/systems/guilds.cairo b/contracts/src/systems/guilds.cairo index 9de6c24..b25d503 100644 --- a/contracts/src/systems/guilds.cairo +++ b/contracts/src/systems/guilds.cairo @@ -1,69 +1,63 @@ -use p_war::models::game::Game; -use p_war::models::guilds::Guild; -use p_war::models::player::Player; -use starknet::{ContractAddress, get_caller_address}; +use pwar::models::guilds::Guild; +use starknet::{ContractAddress}; #[starknet::interface] pub trait IGuild { - fn create_guild(ref self: T, game_id: usize, guild_name: felt252) -> usize; //returns guild ID - fn add_member(ref self: T, game_id: usize, guild_id: usize, new_member: ContractAddress); - fn join_guild(ref self: T, game_id: usize, guild_id: usize); - fn remove_member(ref self: T, game_id: usize, guild_id: usize, member: ContractAddress); - fn is_member(ref self: T, game_id: usize, guild_id: usize, member: ContractAddress) -> bool; - fn get_guild_contract_address(ref self: T) -> ContractAddress; - fn get_guild_points(ref self: T, game_id: usize, guild_id: usize) -> usize; + fn create_guild(ref self: T, game_id: u32, guild_name: felt252) -> u32; //returns guild ID + fn add_member(ref self: T, game_id: u32, guild_id: u32, new_member: ContractAddress); + fn join_guild(ref self: T, game_id: u32, guild_id: u32); + fn remove_member(ref self: T, game_id: u32, guild_id: u32, member: ContractAddress); + fn is_member(self: @T, game_id: u32, guild_id: u32, member: ContractAddress) -> bool; + fn get_guild(self: @T, game_id: u32, guild_id: u32) -> Guild; + fn get_player_commit(self: @T, player_address: ContractAddress) -> u32; + fn get_player_owns(self: @T, player_address: ContractAddress) -> u32; + fn get_guild_points(self: @T, game_id: u32, guild_id: u32) -> u32; } -#[dojo::contract(namespace: "pixelaw", nomapping: true)] -mod guild_actions { +#[dojo::contract] +pub mod guild_actions { use dojo::event::EventStorage; - use dojo::model::{ModelStorage, ModelValueStorage}; - use dojo::world::WorldStorageTrait; - use p_war::models::{ - game::{Game, Status, GameTrait}, guilds::{Guild}, - board::{GameId, Board, Position, PWarPixel}, player::{Player}, allowed_app::AllowedApp, - }; - use starknet::{ - ContractAddress, get_block_timestamp, get_caller_address, get_contract_address, get_tx_info - }; - use super::{IGuild}; + use dojo::model::ModelStorage; + use pwar::models::{game::{Game}, guilds::Guild, player::Player}; + use starknet::{ContractAddress, get_caller_address}; + use super::IGuild; #[derive(Copy, Drop, Serde)] #[dojo::event] pub struct GuildCreated { #[key] - game_id: usize, - guild_id: usize, + game_id: u32, + guild_id: u32, guild_name: felt252, - creator: ContractAddress + creator: ContractAddress, } #[derive(Copy, Drop, Serde)] #[dojo::event] pub struct MemberAdded { #[key] - game_id: usize, - guild_id: usize, - member: ContractAddress + game_id: u32, + guild_id: u32, + member: ContractAddress, } #[derive(Copy, Drop, Serde)] #[dojo::event] pub struct MemberRemoved { #[key] - game_id: usize, - guild_id: usize, - member: ContractAddress + game_id: u32, + guild_id: u32, + member: ContractAddress, } #[abi(embed_v0)] impl GuildImpl of IGuild { - fn create_guild(ref self: ContractState, game_id: usize, guild_name: felt252) -> usize { - let mut world = self.world(@"pixelaw"); + fn create_guild(ref self: ContractState, game_id: u32, guild_name: felt252) -> u32 { + let mut app_world = self.world(@"pwar"); let caller = get_caller_address(); // Check if the game exists and get the game data - let mut game: Game = world.read_model(game_id); + let mut game: Game = app_world.read_model(game_id); assert(game.id == game_id, 'Game does not exist'); // Use the current guild_count as the new guild_id @@ -97,27 +91,27 @@ mod guild_actions { guild_name: guild_name, creator: caller, members: array![caller].span(), - member_count: 1 + member_count: 1, }; println!("new_guild.guild_id: {}", new_guild.guild_id); // Save the guild and update the game - world.write_model(@new_guild); - world.write_model(@game); + app_world.write_model(@new_guild); + app_world.write_model(@game); println!("set guild"); let caller = get_caller_address(); - world.emit_event(@GuildCreated { game_id, guild_id, guild_name, creator: caller }); + app_world.emit_event(@GuildCreated { game_id, guild_id, guild_name, creator: caller }); guild_id } fn add_member( - ref self: ContractState, game_id: usize, guild_id: usize, new_member: ContractAddress + ref self: ContractState, game_id: u32, guild_id: u32, new_member: ContractAddress, ) { - let mut world = self.world(@"pixelaw"); + let mut app_world = self.world(@"pwar"); let caller = get_caller_address(); // Get the guild - let mut guild: Guild = world.read_model((game_id, guild_id)); + let mut guild: Guild = app_world.read_model((game_id, guild_id)); // Check if the caller is the creator assert(guild.creator == caller, 'Only creator can add members'); @@ -147,11 +141,11 @@ mod guild_actions { guild.member_count += 1; // Save the updated guild - world.write_model(@guild); - world.emit_event(@MemberAdded { game_id, guild_id, member: new_member }); + app_world.write_model(@guild); + app_world.emit_event(@MemberAdded { game_id, guild_id, member: new_member }); } - fn join_guild(ref self: ContractState, game_id: usize, guild_id: usize) { + fn join_guild(ref self: ContractState, game_id: u32, guild_id: u32) { let caller = get_caller_address(); // Add the member to the guild @@ -159,13 +153,13 @@ mod guild_actions { } fn remove_member( - ref self: ContractState, game_id: usize, guild_id: usize, member: ContractAddress + ref self: ContractState, game_id: u32, guild_id: u32, member: ContractAddress, ) { - let mut world = self.world(@"pixelaw"); + let mut app_world = self.world(@"pwar"); let caller = get_caller_address(); // Get the guild - let mut guild: Guild = world.read_model((game_id, guild_id)); + let mut guild: Guild = app_world.read_model((game_id, guild_id)); // Check if the caller is the creator assert(guild.creator == caller, 'Only creator can remove members'); @@ -192,15 +186,15 @@ mod guild_actions { guild.member_count -= 1; // Save the updated guild - world.write_model(@guild); - world.emit_event(@MemberRemoved { game_id, guild_id, member }) + app_world.write_model(@guild); + app_world.emit_event(@MemberRemoved { game_id, guild_id, member }) } fn is_member( - ref self: ContractState, game_id: usize, guild_id: usize, member: ContractAddress + self: @ContractState, game_id: u32, guild_id: u32, member: ContractAddress, ) -> bool { - let mut world = self.world(@"pixelaw"); - let guild: Guild = world.read_model((game_id, guild_id)); + let mut app_world = self.world(@"pwar"); + let guild: Guild = app_world.read_model((game_id, guild_id)); let mut is_member = false; let mut i = 0; loop { @@ -216,16 +210,28 @@ mod guild_actions { is_member } - fn get_guild_contract_address(ref self: ContractState) -> ContractAddress { - let guild_contract_address = get_contract_address(); + fn get_guild(self: @ContractState, game_id: u32, guild_id: u32) -> Guild { + let mut app_world = self.world(@"pwar"); + let guild: Guild = app_world.read_model((game_id, guild_id)); + guild + } + + fn get_player_commit(self: @ContractState, player_address: ContractAddress) -> u32 { + let mut app_world = self.world(@"pwar"); + let mut player: Player = app_world.read_model(player_address); + player.num_commit + } - guild_contract_address + fn get_player_owns(self: @ContractState, player_address: ContractAddress) -> u32 { + let mut app_world = self.world(@"pwar"); + let mut player: Player = app_world.read_model(player_address); + player.num_owns } - fn get_guild_points(ref self: ContractState, game_id: usize, guild_id: usize) -> usize { + fn get_guild_points(self: @ContractState, game_id: u32, guild_id: u32) -> u32 { // Get the guild - let mut world = self.world(@"pixelaw"); - let mut guild: Guild = world.read_model((game_id, guild_id)); + let mut app_world = self.world(@"pwar"); + let mut guild: Guild = app_world.read_model((game_id, guild_id)); let mut guild_total_points = 0; let mut i = 0; @@ -234,7 +240,7 @@ mod guild_actions { if i >= guild.member_count { break; } - let mut player: Player = world.read_model(*guild.members.at(i)); + let mut player: Player = app_world.read_model(*guild.members.at(i)); guild_total_points += player.num_commit; i += 1; println!("player.num_commit: {}", player.num_commit); diff --git a/contracts/src/systems/payments.cairo b/contracts/src/systems/payments.cairo index 8301678..f3693a1 100644 --- a/contracts/src/systems/payments.cairo +++ b/contracts/src/systems/payments.cairo @@ -1,6 +1,6 @@ -use p_war::models::game::Game; -use p_war::models::guilds::Guild; -use p_war::models::payments::{GamePayments, PlayerPayment, TreasuryInfo}; +use pwar::models::game::Game; +use pwar::models::guilds::Guild; +use pwar::models::payments::{GamePayments, PlayerPayment, TreasuryInfo}; use starknet::{ContractAddress, get_caller_address}; #[starknet::interface] @@ -11,8 +11,8 @@ pub trait IPayments { fn set_treasury_address(ref self: T, treasury_address: ContractAddress); } -#[dojo::contract(namespace: "pixelaw", nomapping: true)] -mod payments { +#[dojo::contract] +pub mod payments { // use super::*; use dojo::event::EventStorage; @@ -25,33 +25,33 @@ mod payments { #[derive(Drop, starknet::Event)] enum Event { ParticipationFeePaid: ParticipationFeePaid, - WinningGuildPaidOut: WinningGuildPaidOut + WinningGuildPaidOut: WinningGuildPaidOut, } #[derive(Drop, starknet::Event)] struct ParticipationFeePaid { game_id: u32, player: ContractAddress, - amount: u256 + amount: u256, } #[derive(Drop, starknet::Event)] struct WinningGuildPaidOut { game_id: u32, guild_id: u32, - total_amount: u256 + total_amount: u256, } #[abi(embed_v0)] impl PaymentsImpl of IPayments { fn initialize_game_payments( - ref self: ContractState, game_id: u32, participation_fee: u256 + ref self: ContractState, game_id: u32, participation_fee: u256, ) { let game_payments = GamePayments { game_id: game_id, participation_fee: participation_fee, prize_pool: 0, - treasury_balance: 0 + treasury_balance: 0, }; set!(world, (game_payments)); } @@ -71,7 +71,7 @@ mod payments { game_payments.treasury_balance += treasury_amount; let player_payment = PlayerPayment { - game_id: game_id, player: caller, amount_paid: fee + game_id: game_id, player: caller, amount_paid: fee, }; set!(world, (game_payments, player_payment)); @@ -109,8 +109,8 @@ mod payments { emit!( world, WinningGuildPaidOut { - game_id: game_id, guild_id: winning_guild_id, total_amount: total_payout - } + game_id: game_id, guild_id: winning_guild_id, total_amount: total_payout, + }, ); } diff --git a/contracts/src/systems/propose.cairo b/contracts/src/systems/propose.cairo index 480a56e..0537561 100644 --- a/contracts/src/systems/propose.cairo +++ b/contracts/src/systems/propose.cairo @@ -1,94 +1,83 @@ -use p_war::models::{ - game::{Game, Status, GameTrait}, proposal::{Proposal, PixelRecoveryRate}, - board::{GameId, Board, Position, PWarPixel}, player::{Player}, allowed_app::AllowedApp, - allowed_color::{AllowedColor, PaletteColors, InPalette, GamePalette} -}; +use pixelaw::core::utils::Position; +use pwar::models::{game::{Game}, proposal::Proposal}; // define the interface #[starknet::interface] pub trait IPropose { fn create_proposal( - ref self: T, game_id: usize, proposal_type: u8, target_args_1: u32, target_args_2: u32 - ) -> usize; - fn activate_proposal(ref self: T, game_id: usize, index: usize, clear_data: Span); - fn add_new_color(ref self: T, game_id: usize, index: usize, game: Game, proposal: Proposal); + ref self: T, game_id: u32, proposal_type: u8, target_args_1: u32, target_args_2: u32, + ) -> u32; + fn activate_proposal(ref self: T, game_id: u32, index: u32, clear_data: Span); + fn add_new_color(ref self: T, game_id: u32, index: u32, game: Game, proposal: Proposal); fn reset_to_white( ref self: T, - game_id: usize, - index: usize, + game_id: u32, + index: u32, game: Game, proposal: Proposal, - clear_data: Span + clear_data: Span, ); } // dojo decorator -#[dojo::contract(namespace: "pixelaw", nomapping: true)] -mod propose_actions { +#[dojo::contract] +pub mod propose_actions { use dojo::event::EventStorage; - use dojo::model::{ModelStorage, ModelValueStorage}; - use dojo::world::WorldStorageTrait; - use p_war::constants::{ - PROPOSAL_DURATION, NEEDED_YES_VOTING_POWER, DISASTER_SIZE, PROPOSAL_FACTOR + use dojo::model::ModelStorage; + use pixelaw::core::actions::{IActionsDispatcherTrait as ICoreActionsDispatcherTrait}; + use pixelaw::core::models::{pixel::Pixel, pixel::PixelUpdate}; + use pixelaw::core::utils::{Position, get_core_actions}; + use pwar::constants::{NEEDED_YES_VOTING_POWER, PROPOSAL_DURATION}; + use pwar::models::{ + allowed_color::{AllowedColor, GamePalette, InPalette, PaletteColors}, + board::{Board, PWarPixel}, game::{Game, GameTrait}, player::Player, proposal::Proposal, }; - use p_war::models::{ - game::{Game, Status, GameTrait}, proposal::{Proposal, PixelRecoveryRate}, - board::{GameId, Board, Position, PWarPixel}, player::{Player}, allowed_app::AllowedApp, - allowed_color::{AllowedColor, PaletteColors, InPalette, GamePalette} - }; - use p_war::systems::utils::{check_game_status}; - use pixelaw::core::actions::{ - IActionsDispatcher as ICoreActionsDispatcher, - IActionsDispatcherTrait as ICoreActionsDispatcherTrait - }; - use pixelaw::core::models::{pixel::PixelUpdate, pixel::Pixel}; - use pixelaw::core::utils::{get_core_actions, DefaultParameters}; - use starknet::{ - ContractAddress, get_block_timestamp, get_caller_address, get_contract_address, get_tx_info - }; - use super::{IPropose}; + use pwar::systems::utils::check_game_status; + use starknet::{get_block_timestamp, get_caller_address}; + use super::IPropose; #[derive(Copy, Drop, Serde)] #[dojo::event] pub struct ProposalCreated { #[key] - game_id: usize, - index: usize, + game_id: u32, + index: u32, proposal_type: u8, target_args_1: u32, - target_args_2: u32 + target_args_2: u32, } #[derive(Copy, Drop, Serde)] #[dojo::event] pub struct ProposalActivated { #[key] - game_id: usize, - index: usize, + game_id: u32, + index: u32, proposal_type: u8, target_args_1: u32, - target_args_2: u32 + target_args_2: u32, } #[abi(embed_v0)] impl ProposeImpl of IPropose { fn create_proposal( ref self: ContractState, - game_id: usize, + game_id: u32, proposal_type: u8, target_args_1: u32, - target_args_2: u32 - ) -> usize { + target_args_2: u32, + ) -> u32 { //get world - let mut world = self.world(@"pixelaw"); + let mut app_world = self.world(@"pwar"); // get models - let mut game: Game = world.read_model(game_id); + let mut game: Game = app_world.read_model(game_id); // println!("game status: {}", game.status()); assert(check_game_status(game.status()), 'game is not ongoing: propose1'); - let player_address = get_tx_info().unbox().account_contract_address; + // let player_address = get_tx_info().unbox().account_contract_address; + let player_address = get_caller_address(); // if this is first time for the caller, let's set initial px. - let mut player: Player = world.read_model(player_address); + let mut player: Player = app_world.read_model(player_address); // check the player is banned or not assert(player.is_banned == false, 'you are banned'); @@ -104,41 +93,41 @@ mod propose_actions { end: get_block_timestamp() + PROPOSAL_DURATION, yes_voting_power: 0, no_voting_power: 0, - is_activated: false + is_activated: false, }; game.proposal_idx += 1; - world.write_model(@new_proposal); - world.write_model(@game); + app_world.write_model(@new_proposal); + app_world.write_model(@game); player.num_commit = player.num_commit + 1; - world.write_model(@player); + app_world.write_model(@player); - world + app_world .emit_event( @ProposalCreated { game_id, index: game.proposal_idx, proposal_type, target_args_1, - target_args_2 - } + target_args_2, + }, ); new_proposal.index } fn activate_proposal( - ref self: ContractState, game_id: usize, index: usize, clear_data: Span + ref self: ContractState, game_id: u32, index: u32, clear_data: Span, ) { // get the proposal - let mut world = self.world(@"pixelaw"); - let mut proposal: Proposal = world.read_model((game_id, index)); - let mut game: Game = world.read_model(game_id); + let mut app_world = self.world(@"pwar"); + let mut proposal: Proposal = app_world.read_model((game_id, index)); + let mut game: Game = app_world.read_model(game_id); let current_timestamp = get_block_timestamp(); assert(current_timestamp >= proposal.end, 'proposal period has not ended'); assert( - proposal.yes_voting_power >= NEEDED_YES_VOTING_POWER, 'did not reach minimum yes' + proposal.yes_voting_power >= NEEDED_YES_VOTING_POWER, 'did not reach minimum yes', ); assert(proposal.yes_voting_power > proposal.no_voting_power, 'yes is not more than no'); assert(proposal.is_activated == false, 'this is already activated'); @@ -150,14 +139,14 @@ mod propose_actions { } else if proposal.proposal_type == 2 { self.reset_to_white(game_id, index, game, proposal, clear_data) } else if proposal.proposal_type == 3 { // ProposalType::ExtendGameEndTime - let mut game: Game = world.read_model(game_id); + let mut game: Game = app_world.read_model(game_id); game.end += proposal.target_args_1.into(); - world.write_model(@game); + app_world.write_model(@game); } else if proposal.proposal_type == 4 { // ProposalType::ExpandArea - let mut board: Board = world.read_model(game_id); + let mut board: Board = app_world.read_model(game_id); board.width += proposal.target_args_1.try_into().unwrap(); board.height += proposal.target_args_2.try_into().unwrap(); - world.write_model(@board); + app_world.write_model(@board); } else { return; }; @@ -165,64 +154,64 @@ mod propose_actions { // make it activated. proposal.is_activated = true; - world.write_model(@proposal); - world + app_world.write_model(@proposal); + app_world .emit_event( @ProposalActivated { game_id, index, proposal_type: proposal.proposal_type, target_args_1: proposal.target_args_1, - target_args_2: proposal.target_args_2 - } + target_args_2: proposal.target_args_2, + }, ) } // add new color to the palette, if the color is added, the oldest color become unusable. fn add_new_color( - ref self: ContractState, game_id: usize, index: usize, game: Game, proposal: Proposal + ref self: ContractState, game_id: u32, index: u32, game: Game, proposal: Proposal, ) { assert(proposal.proposal_type == 1, 'not add new color proposal'); - let mut world = self.world(@"pixelaw"); + let mut app_world = self.world(@"pwar"); let new_color: u32 = proposal.target_args_1; - let mut new_color_allowed: AllowedColor = world.read_model((game_id, new_color)); + let mut new_color_allowed: AllowedColor = app_world.read_model((game_id, new_color)); // only change it if it's not allowed if !new_color_allowed.is_allowed { new_color_allowed.is_allowed = !new_color_allowed.is_allowed; - world.write_model(@new_color_allowed); + app_world.write_model(@new_color_allowed); // check if color already is in the palette - let mut is_in_palette: InPalette = world.read_model((game_id, new_color)); + let mut is_in_palette: InPalette = app_world.read_model((game_id, new_color)); // if aready in the palette early return if is_in_palette.value { return; } - let mut game_palette: GamePalette = world.read_model(game_id); + let mut game_palette: GamePalette = app_world.read_model(game_id); // check if there's less colors in place if game_palette.length < 9 { is_in_palette.value = true; - world.write_model(@is_in_palette); + app_world.write_model(@is_in_palette); - let mut palette_color: PaletteColors = world + let mut palette_color: PaletteColors = app_world .read_model((game_id, game_palette.length)); palette_color.color = new_color; - world.write_model(@palette_color); + app_world.write_model(@palette_color); game_palette.length += 1; - world.write_model(@game_palette); + app_world.write_model(@game_palette); } else { // get 0 idx - let oldest_color: PaletteColors = world.read_model((game_id, 0)); + let oldest_color: PaletteColors = app_world.read_model((game_id, 0)); let mut idx = 1; loop { - let mut palette_color: PaletteColors = world.read_model((game_id, idx)); - let prev_color: PaletteColors = world.read_model((game_id, idx)); + let mut palette_color: PaletteColors = app_world.read_model((game_id, idx)); + let prev_color: PaletteColors = app_world.read_model((game_id, idx)); palette_color.idx = idx - 1; palette_color.color = prev_color.color; - world.write_model(@palette_color); + app_world.write_model(@palette_color); idx = idx + 1; if idx == 9 { @@ -231,45 +220,46 @@ mod propose_actions { }; // Set the new color in the last position - let mut last_palette_color: PaletteColors = world.read_model((game_id, 8)); + let mut last_palette_color: PaletteColors = app_world.read_model((game_id, 8)); last_palette_color.color = new_color; - world.write_model(@last_palette_color); + app_world.write_model(@last_palette_color); - let mut old_in_pallet: InPalette = world + let mut old_in_pallet: InPalette = app_world .read_model((game_id, oldest_color.color)); old_in_pallet.value = false; - world.write_model(@old_in_pallet); + app_world.write_model(@old_in_pallet); is_in_palette.value = true; - world.write_model(@is_in_palette); + app_world.write_model(@is_in_palette); - let mut old_color_allowed: AllowedColor = world + let mut old_color_allowed: AllowedColor = app_world .read_model((game_id, oldest_color.color)); old_color_allowed.is_allowed = false; - world.write_model(@old_color_allowed); + app_world.write_model(@old_color_allowed); }; }; } fn reset_to_white( ref self: ContractState, - game_id: usize, - index: usize, + game_id: u32, + index: u32, game: Game, proposal: Proposal, - clear_data: Span + clear_data: Span, ) { assert(proposal.proposal_type == 2, 'not reset to white proposal'); - let mut world = self.world(@"pixelaw"); + let mut core_world = self.world(@"pixelaw"); + let mut app_world = self.world(@"pwar"); // Reset to white by color let core_actions = get_core_actions( - ref world - ); // TODO: should we use p_war_actions insted of core_actions??? + ref core_world, + ); // TODO: should we use pwar_actions insted of core_actions??? let system = get_caller_address(); let target_args_1: u32 = proposal.target_args_1; - let mut idx: usize = 0; + let mut idx: u32 = 0; loop { let pixel_to_clear = clear_data.get(idx); @@ -279,40 +269,38 @@ mod propose_actions { } let pixel_to_clear = *clear_data.at(idx); - - let pixel_info: Pixel = world.read_model((pixel_to_clear.x, pixel_to_clear.y)); + let pixel_info: Pixel = core_world.read_model((pixel_to_clear.x, pixel_to_clear.y)); + let position = Position { x: pixel_to_clear.x, y: pixel_to_clear.y }; if pixel_info.color == target_args_1 { - // make it white core_actions .update_pixel( - get_caller_address(), // is it okay? + get_caller_address(), system, PixelUpdate { - x: pixel_to_clear.x, - y: pixel_to_clear.y, + position, color: Option::Some(0xffffffff), timestamp: Option::None, text: Option::None, app: Option::Some(system), owner: Option::None, - action: Option::None + action: Option::None, }, Option::None, - false + false, ); // decrease the previous owner's num_owns let position = Position { x: pixel_to_clear.x, y: pixel_to_clear.y }; - let previous_pwarpixel: PWarPixel = world.read_model(position); + let previous_pwarpixel: PWarPixel = app_world.read_model(position); if (previous_pwarpixel.owner != starknet::contract_address_const::<0x0>()) { // get the previous player's info - let mut previous_player: Player = world + let mut previous_player: Player = app_world .read_model(previous_pwarpixel.owner); previous_player.num_owns -= 1; - world.write_model(@previous_player); + app_world.write_model(@previous_player); }; }; idx += 1; diff --git a/contracts/src/systems/utils.cairo b/contracts/src/systems/utils.cairo index 944ef6b..1faf975 100644 --- a/contracts/src/systems/utils.cairo +++ b/contracts/src/systems/utils.cairo @@ -1,16 +1,4 @@ -use dojo::event::EventStorage; -use dojo::model::{ModelStorage, ModelValueStorage}; -use dojo::world::storage::WorldStorage; -use dojo::world::{IWorldDispatcher, IWorldDispatcherTrait}; - -use p_war::models::{ - game::{Game, Status}, board::{Board, GameId, Position}, player::{Player}, - proposal::{PixelRecoveryRate}, allowed_color::AllowedColor, allowed_app::AllowedApp, - guilds::{Guild} -}; -use starknet::{ - ContractAddress, get_block_timestamp, get_caller_address, get_contract_address, get_tx_info -}; +use crate::models::game::Status; pub fn check_game_status(status: Status) -> bool { status == Status::Pending || status == Status::Ongoing diff --git a/contracts/src/systems/voting.cairo b/contracts/src/systems/voting.cairo index 851beeb..df9c063 100644 --- a/contracts/src/systems/voting.cairo +++ b/contracts/src/systems/voting.cairo @@ -1,42 +1,40 @@ // define the interface #[starknet::interface] pub trait IVoting { - fn vote(ref self: T, game_id: usize, index: usize, use_px: u32, is_in_favor: bool); + fn vote(ref self: T, game_id: u32, index: u32, use_px: u32, is_in_favor: bool); } // dojo decorator -#[dojo::contract(namespace: "pixelaw", nomapping: true)] -mod voting_actions { +#[dojo::contract] +pub mod voting_actions { use dojo::event::EventStorage; - use dojo::model::{ModelStorage, ModelValueStorage}; - use dojo::world::WorldStorageTrait; - use p_war::models::{player::{Player}, proposal::{PlayerVote, Proposal}}; - use starknet::{ContractAddress, get_caller_address, get_block_timestamp}; + use dojo::model::ModelStorage; + use pwar::models::{player::Player, proposal::{PlayerVote, Proposal}}; + use starknet::{ContractAddress, get_block_timestamp, get_caller_address}; use super::IVoting; #[derive(Copy, Drop, Serde)] #[dojo::event] struct Voted { #[key] - game_id: usize, - index: usize, + game_id: u32, + index: u32, timestamp: u64, voter: ContractAddress, - is_in_favor: bool + is_in_favor: bool, } #[abi(embed_v0)] impl VotingImpl of IVoting { - fn vote( - ref self: ContractState, game_id: usize, index: usize, use_px: u32, is_in_favor: bool - ) { - let mut world = self.world(@"pixelaw"); + fn vote(ref self: ContractState, game_id: u32, index: u32, use_px: u32, is_in_favor: bool) { + let mut app_world = self.world(@"pwar"); let player_address = get_caller_address(); - let mut proposal: Proposal = world.read_model((game_id, index)); - let mut player_vote: PlayerVote = world.read_model((player_address, game_id, index)); + let mut proposal: Proposal = app_world.read_model((game_id, index)); + let mut player_vote: PlayerVote = app_world + .read_model((player_address, game_id, index)); assert(player_vote.voting_power == 0, 'player already voted'); - let mut player: Player = world.read_model(player_address); + let mut player: Player = app_world.read_model(player_address); // check the player is banned or not assert(player.is_banned == false, 'you are banned'); @@ -49,23 +47,23 @@ mod voting_actions { //player.current_px -= use_px; player.num_commit += use_px; - world.write_model(@player); + app_world.write_model(@player); player_vote.is_in_favor = is_in_favor; player_vote.voting_power = 1; - world.write_model(@proposal); - world.write_model(@player_vote); + app_world.write_model(@proposal); + app_world.write_model(@player_vote); - world + app_world .emit_event( @Voted { game_id, index, timestamp: get_block_timestamp(), voter: player_address, - is_in_favor - } + is_in_favor, + }, ); } } diff --git a/contracts/src/tests/test_games.cairo b/contracts/src/tests/test_games.cairo index 2c3dfe6..0e8f48b 100644 --- a/contracts/src/tests/test_games.cairo +++ b/contracts/src/tests/test_games.cairo @@ -1,42 +1,15 @@ -use dojo::event::EventStorage; -use dojo::model::{ModelStorage, ModelValueStorage}; -use dojo::world::{WorldStorage, WorldStorageTrait}; -use p_war::tests::utils::{deploy_p_war}; -use p_war::{ - models::{ - game::{Game}, board::{Board, GameId, Position}, proposal::{Proposal}, - allowed_app::AllowedApp, allowed_color::{AllowedColor, PaletteColors}, - }, - systems::{ - actions::{p_war_actions, IActionsDispatcher, IActionsDispatcherTrait}, - propose::{propose_actions, IProposeDispatcher, IProposeDispatcherTrait}, - voting::{voting_actions, IVotingDispatcher, IVotingDispatcherTrait} - }, - constants::{PROPOSAL_DURATION} -}; -use pixelaw::core::{ - models::{pixel::{Pixel, PixelUpdate},}, - actions::{ - actions as core_actions, IActionsDispatcher as ICoreActionsDispatcher, - IActionsDispatcherTrait as ICoreActionsDispatcherTrait - }, - utils::{DefaultParameters, Position as PixelawPosition} -}; -use pixelaw_test_helpers::{setup_core_initialized}; -use starknet::{ - class_hash::Felt252TryIntoClassHash, ContractAddress, testing::{set_block_timestamp} -}; +use pixelaw::core::{utils::{DefaultParameters, Position}}; +use pixelaw_testing::helpers::{setup_core}; +use pwar::tests::utils::deploy_pwar; +use super::super::systems::actions::IActionsDispatcherTrait; const COLOR: u32 = 0x000000ff; #[test] #[available_gas(999_999_999)] fn test_game_created() { - let (mut world, _core_actions, _player_1, _player_2) = setup_core_initialized(); - let (_world, p_war_actions, _propose_action, _voting_action, _guild, _allowed_app) = - deploy_p_war( - ref world - ); + let (mut world, _core_actions, _player_1, _player_2) = setup_core(); + let (pwar_actions, _propose_action, _voting_action, _guild) = deploy_pwar(ref world); // caller let _caller = starknet::contract_address_const::<0x0>(); @@ -44,14 +17,14 @@ fn test_game_created() { player_override: Option::None, system_override: Option::None, area_hint: Option::None, - position: PixelawPosition { x: 0, y: 0 }, - color: COLOR + position: Position { x: 0, y: 0 }, + color: COLOR, }; // create a game - p_war_actions.interact(default_params); + pwar_actions.interact(default_params); - let id = p_war_actions + let id = pwar_actions .get_game_id(Position { x: default_params.position.x, y: default_params.position.y }); println!("id = {}", id); diff --git a/contracts/src/tests/test_guilds.cairo b/contracts/src/tests/test_guilds.cairo index 973c759..349c04a 100644 --- a/contracts/src/tests/test_guilds.cairo +++ b/contracts/src/tests/test_guilds.cairo @@ -1,33 +1,16 @@ -use dojo::event::EventStorage; -use dojo::model::{ModelStorage, ModelValueStorage}; -use dojo::world::{WorldStorage, WorldStorageTrait}; -use p_war::tests::utils::{deploy_p_war, print_all_colors}; -use p_war::{ - models::{ - game::{Game}, board::{Board, GameId, Position}, proposal::{Proposal}, guilds::{Guild}, - allowed_app::AllowedApp, allowed_color::{AllowedColor, PaletteColors}, - }, +use dojo::model::{ModelStorage}; +use pixelaw::core::{utils::{DefaultParameters, Position}}; +use pixelaw_testing::helpers::{setup_core}; +use pwar::tests::utils::{deploy_pwar}; +use pwar::{ + models::{guilds::{Guild}}, systems::{ - actions::{p_war_actions, IActionsDispatcher, IActionsDispatcherTrait}, - propose::{propose_actions, IProposeDispatcher, IProposeDispatcherTrait}, - voting::{voting_actions, IVotingDispatcher, IVotingDispatcherTrait}, - guilds::{guild_actions, IGuildDispatcher, IGuildDispatcherTrait} - }, - constants::{GAME_DURATION, PROPOSAL_DURATION} -}; -use pixelaw::core::{ - models::{pixel::{Pixel, PixelUpdate},}, - actions::{ - actions as core_actions, IActionsDispatcher as ICoreActionsDispatcher, - IActionsDispatcherTrait as ICoreActionsDispatcherTrait + actions::{IActionsDispatcherTrait, pwar_actions}, + guilds::{IGuildDispatcherTrait, guild_actions}, }, - utils::{DefaultParameters, Position as PixelawPosition, is_pixel_color} }; -use pixelaw_test_helpers::{setup_core_initialized}; use starknet::{ - class_hash::Felt252TryIntoClassHash, ContractAddress, - testing::{set_block_timestamp, set_account_contract_address, set_contract_address}, - get_block_timestamp, contract_address_const + contract_address_const, testing::{set_account_contract_address, set_contract_address}, }; const WHITE_COLOR: u32 = 0xFFFFFFFF; @@ -42,11 +25,8 @@ fn test_guild_operations() { println!("start test"); // Initialize the world and the actions - let (mut world, _core_actions, _player_1, _player_2) = setup_core_initialized(); - let (_world, p_war_actions, _propose_action, _voting_action, guild_actions, _allowed_app) = - deploy_p_war( - ref world - ); + let (mut world, _core_actions, _player_1, _player_2) = setup_core(); + let (pwar_actions, _propose_action, _voting_action, guild_actions) = deploy_pwar(ref world); println!("setup done"); @@ -55,18 +35,17 @@ fn test_guild_operations() { let PLAYER_2 = contract_address_const::<0x42>(); // Create a game - p_war_actions + pwar_actions .interact( DefaultParameters { player_override: Option::None, system_override: Option::None, area_hint: Option::None, position: GAME_ORIGIN_POSITION, - color: WHITE_COLOR - } + color: WHITE_COLOR, + }, ); - - let game_id = p_war_actions.get_game_id(GAME_ORIGIN_POSITION); + let game_id = pwar_actions.get_game_id(GAME_ORIGIN_POSITION); println!("game created: game_id = {}", game_id); //was not able to import set_call from core::helpers @@ -110,27 +89,24 @@ fn test_guild_operations() { #[available_gas(999_999_999)] fn test_guild_points() { // Initialize the world and the actions - let (mut world, _core_actions, _player_1, _player_2) = setup_core_initialized(); - let (_world, p_war_actions, _propose_action, _voting_action, guild_actions, _allowed_app) = - deploy_p_war( - ref world - ); + let (mut world, _core_actions, _player_1, _player_2) = setup_core(); + let (pwar_actions, _propose_action, _voting_action, guild_actions) = deploy_pwar(ref world); println!("setup"); let PLAYER_1 = contract_address_const::<0x1337>(); let PLAYER_2 = contract_address_const::<0x42>(); - p_war_actions + pwar_actions .interact( DefaultParameters { player_override: Option::None, system_override: Option::None, area_hint: Option::None, position: GAME_ORIGIN_POSITION, - color: WHITE_COLOR - } + color: WHITE_COLOR, + }, ); - let game_id = p_war_actions.get_game_id(GAME_ORIGIN_POSITION); + let game_id = pwar_actions.get_game_id(GAME_ORIGIN_POSITION); println!("game created: game_id = {}", game_id); //create guild @@ -141,25 +117,25 @@ fn test_guild_points() { //place a pixel set_account_contract_address(PLAYER_1); set_contract_address(PLAYER_1); - p_war_actions + pwar_actions .interact( DefaultParameters { player_override: Option::None, system_override: Option::None, area_hint: Option::None, position: GAME_PAINT_POSITION, - color: WHITE_COLOR - } + color: WHITE_COLOR, + }, ); - p_war_actions + pwar_actions .interact( DefaultParameters { player_override: Option::None, system_override: Option::None, area_hint: Option::None, position: GAME_PAINT_POSITION_2, - color: WHITE_COLOR - } + color: WHITE_COLOR, + }, ); //add member @@ -171,25 +147,25 @@ fn test_guild_points() { set_account_contract_address(PLAYER_2); set_contract_address(PLAYER_2); - p_war_actions + pwar_actions .interact( DefaultParameters { player_override: Option::None, system_override: Option::None, area_hint: Option::None, position: GAME_PAINT_POSITION, - color: WHITE_COLOR - } + color: WHITE_COLOR, + }, ); - p_war_actions + pwar_actions .interact( DefaultParameters { player_override: Option::None, system_override: Option::None, area_hint: Option::None, position: GAME_PAINT_POSITION_2, - color: WHITE_COLOR - } + color: WHITE_COLOR, + }, ); let guild_points = guild_actions.get_guild_points(game_id, guild_id); @@ -201,33 +177,33 @@ fn test_guild_points() { #[available_gas(999_999_999)] fn test_guild_creation() { // Initialize the world and the actions - let (mut world, _core_actions, _player_1, _player_2) = setup_core_initialized(); - let (_world, p_war_actions, _propose_action, _voting_action, guild_actions, _allowed_app) = - deploy_p_war( - ref world + let (mut world, _core_actions, _player_1, _player_2) = setup_core(); + let (_world, pwar_actions, _propose_action, _voting_action, guild_actions, _allowed_app) = + deploy_pwar( + ref world, ); // Setup players let PLAYER_1 = contract_address_const::<0x1337>(); // Create a game - p_war_actions + pwar_actions .interact( DefaultParameters { player_override: Option::None, system_override: Option::None, area_hint: Option::None, position: GAME_ORIGIN_POSITION, - color: WHITE_COLOR - } + color: WHITE_COLOR, + }, ); - let game_id: u32 = p_war_actions.get_game_id(GAME_ORIGIN_POSITION); + let game_id: u32 = pwar_actions.get_game_id(GAME_ORIGIN_POSITION); // Create guilds for the game set_account_contract_address(PLAYER_1); set_contract_address(PLAYER_1); - let guild_ids: Array = p_war_actions.create_game_guilds(game_id, guild_actions); + let guild_ids: Array = pwar_actions.create_game_guilds(game_id, guild_actions); // Create a guild let guild_id: u32 = *guild_ids.at(0); diff --git a/contracts/src/tests/test_proposals.cairo b/contracts/src/tests/test_proposals.cairo index 81ee8a0..901ec86 100644 --- a/contracts/src/tests/test_proposals.cairo +++ b/contracts/src/tests/test_proposals.cairo @@ -1,31 +1,17 @@ -use dojo::event::EventStorage; -use dojo::model::{ModelStorage, ModelValueStorage}; -use dojo::world::{WorldStorage, WorldStorageTrait}; -use p_war::tests::utils::{deploy_p_war}; -use p_war::{ - models::{ - game::{Game}, board::{Board, GameId, Position}, proposal::{Proposal}, player::{Player}, - allowed_app::AllowedApp, allowed_color::{AllowedColor, PaletteColors}, - }, +use dojo::model::{ModelStorage}; +use pixelaw::core::{utils::{DefaultParameters, Position}}; +use pixelaw_testing::helpers::{setup_core}; +use pwar::constants::{DEFAULT_AREA, GAME_DURATION, PROPOSAL_DURATION}; +use pwar::tests::utils::{deploy_pwar}; +use pwar::{ + models::{PaletteColors, guilds::{Guild}}, systems::{ - actions::{p_war_actions, IActionsDispatcher, IActionsDispatcherTrait}, - propose::{propose_actions, IProposeDispatcher, IProposeDispatcherTrait}, - voting::{voting_actions, IVotingDispatcher, IVotingDispatcherTrait} - }, - constants::{DEFAULT_AREA, PROPOSAL_DURATION, GAME_DURATION} -}; -use pixelaw::core::{ - models::{pixel::{Pixel, PixelUpdate},}, - actions::{ - actions as core_actions, IActionsDispatcher as ICoreActionsDispatcher, - IActionsDispatcherTrait as ICoreActionsDispatcherTrait + actions::{IActionsDispatcherTrait, pwar_actions}, + guilds::{IGuildDispatcherTrait, guild_actions}, }, - utils::{DefaultParameters, Position as PixelawPosition, is_pixel_color} }; -use pixelaw_test_helpers::{setup_core_initialized}; use starknet::{ - class_hash::Felt252TryIntoClassHash, ContractAddress, testing::{set_block_timestamp}, - get_tx_info, get_block_timestamp + contract_address_const, testing::{set_account_contract_address, set_contract_address}, }; const WHITE_COLOR: u32 = 0xFFFFFFFF; @@ -42,30 +28,26 @@ const VOTE_PIXEL_COUNT: u32 = 3; #[test] #[available_gas(999_999_999)] fn test_add_color() { - let (mut world, _core_actions, _player_1, _player_2) = setup_core_initialized(); - let (_world, p_war_actions, propose_action, voting_action, _guild, _allowed_app) = deploy_p_war( - ref world - ); + let (mut world, _core_actions, _player_1, _player_2) = setup_core(); + let (pwar_actions, propose_action, voting_action, _guild) = deploy_pwar(ref world); let default_params = DefaultParameters { player_override: Option::None, system_override: Option::None, area_hint: Option::None, position: GAME_ORIGIN_POSITION, - color: WHITE_COLOR + color: WHITE_COLOR, }; // create a game - p_war_actions.interact(default_params); + pwar_actions.interact(default_params); - let id = p_war_actions + let id = pwar_actions .get_game_id(Position { x: default_params.position.x, y: default_params.position.y }); println!("id = {}", id); let index = propose_action - .create_proposal( - game_id: id, proposal_type: 1, target_args_1: NEW_COLOR, target_args_2: 0, - ); + .create_proposal(game_id: id, proposal_type: 1, target_args_1: NEW_COLOR, target_args_2: 0); let oldest_color_pallette: PaletteColors = world.read_model((id, 0)); @@ -79,7 +61,7 @@ fn test_add_color() { // should add cheat code to spend time set_block_timestamp( - proposal.end + PROPOSAL_DURATION + proposal.end + PROPOSAL_DURATION, ); // NOTE: we need to set block timestamp forcely propose_action.activate_proposal(id, index, array![default_params.position].into()); @@ -89,10 +71,10 @@ fn test_add_color() { system_override: Option::None, area_hint: Option::None, position: GAME_PAINT_POSITION, - color: NEW_COLOR + color: NEW_COLOR, }; - p_war_actions.interact(new_params); + pwar_actions.interact(new_params); // check if the oldest color is unusable let oldest_color_allowed: AllowedColor = world.read_model((id, oldest_color_pallette.color)); @@ -100,14 +82,14 @@ fn test_add_color() { println!( "@@@@@ OLDEST_ALLOWED: {}, {} @@@@", oldest_color_pallette.color, - oldest_color_allowed.is_allowed + oldest_color_allowed.is_allowed, ); let newest_color: PaletteColors = world.read_model((id, 8)); let newest_color_allowed: AllowedColor = world.read_model((id, newest_color.color)); println!( - "@@@@@ NEWEST_ALLOWED: {}, {} @@@@", newest_color.color, newest_color_allowed.is_allowed + "@@@@@ NEWEST_ALLOWED: {}, {} @@@@", newest_color.color, newest_color_allowed.is_allowed, ); assert(oldest_color_allowed.is_allowed == false, 'the oldest became unusable'); @@ -119,37 +101,37 @@ fn test_add_color() { #[test] #[available_gas(999_999_999)] fn test_reset_to_white() { - let (mut world, _core_actions, _player_1, _player_2) = setup_core_initialized(); - let (_world, p_war_actions, propose_action, voting_action, _guild, _allowed_app) = deploy_p_war( - ref world + let (mut world, _core_actions, _player_1, _player_2) = setup_core(); + let (_world, pwar_actions, propose_action, voting_action, _guild, _allowed_app) = deploy_pwar( + ref world, ); // Create a game. // This creates a 10x10 grid to the bottom-right of the start_position - p_war_actions + pwar_actions .interact( DefaultParameters { player_override: Option::None, system_override: Option::None, area_hint: Option::None, position: GAME_ORIGIN_POSITION, - color: WHITE_COLOR - } + color: WHITE_COLOR, + }, ); // paint a color inside of the grid - p_war_actions + pwar_actions .interact( DefaultParameters { player_override: Option::None, // Leave this 0 if not processing the Queue system_override: Option::None, // Leave this 0 if not processing the Queue area_hint: Option::None, position: GAME_PAINT_POSITION, - color: RED_COLOR - } + color: RED_COLOR, + }, ); - let game_id = p_war_actions.get_game_id(GAME_ORIGIN_POSITION); + let game_id = pwar_actions.get_game_id(GAME_ORIGIN_POSITION); print!("game_id = {}", game_id); @@ -158,7 +140,7 @@ fn test_reset_to_white() { game_id, proposal_type: PROPOSAL_TYPE_RESET_TO_WHITE_BY_COLOR, target_args_1: RED_COLOR, - target_args_2: 0 + target_args_2: 0, ); voting_action.vote(game_id, proposal_id, VOTE_PIXEL_COUNT, true); @@ -176,49 +158,49 @@ fn test_reset_to_white() { // Retrieve the pixel that was reset assert( is_pixel_color(ref world, GAME_PAINT_POSITION, WHITE_COLOR), - 'Pixel should be entirely white' + 'Pixel should be entirely white', ); // Now try to paint on it again - p_war_actions + pwar_actions .interact( DefaultParameters { player_override: Option::None, // Leave this 0 if not processing the Queue system_override: Option::None, // Leave this 0 if not processing the Queue area_hint: Option::None, position: GAME_PAINT_POSITION, - color: RED_COLOR - } + color: RED_COLOR, + }, ); assert( - is_pixel_color(ref world, GAME_PAINT_POSITION, RED_COLOR), 'Pixel should be entirely red' + is_pixel_color(ref world, GAME_PAINT_POSITION, RED_COLOR), 'Pixel should be entirely red', ); // Now try to paint on it again - p_war_actions + pwar_actions .interact( DefaultParameters { player_override: Option::None, // Leave this 0 if not processing the Queue system_override: Option::None, // Leave this 0 if not processing the Queue area_hint: Option::None, position: GAME_PAINT_POSITION, - color: WHITE_COLOR - } + color: WHITE_COLOR, + }, ); assert( is_pixel_color(ref world, GAME_PAINT_POSITION, WHITE_COLOR), - 'Pixel should be entirely white' + 'Pixel should be entirely white', ); } #[test] #[available_gas(999_999_999)] fn test_expand_area() { - let (mut world, _core_actions, _player_1, _player_2) = setup_core_initialized(); - let (_world, p_war_actions, propose_action, voting_action, _guild, _allowed_app) = deploy_p_war( - ref world + let (mut world, _core_actions, _player_1, _player_2) = setup_core(); + let (_world, pwar_actions, propose_action, voting_action, _guild, _allowed_app) = deploy_pwar( + ref world, ); let default_params = DefaultParameters { @@ -226,18 +208,18 @@ fn test_expand_area() { system_override: Option::None, area_hint: Option::None, position: GAME_ORIGIN_POSITION, - color: WHITE_COLOR + color: WHITE_COLOR, }; // create a game - p_war_actions.interact(default_params); + pwar_actions.interact(default_params); - let id = p_war_actions + let id = pwar_actions .get_game_id(Position { x: default_params.position.x, y: default_params.position.y }); print!("id = {}", id); let index = propose_action - .create_proposal(game_id: id, proposal_type: 4, target_args_1: 20, target_args_2: 30,); + .create_proposal(game_id: id, proposal_type: 4, target_args_1: 20, target_args_2: 30); let vote_px = 3; voting_action.vote(id, index, vote_px, true); @@ -260,23 +242,21 @@ fn test_expand_area() { #[test] #[available_gas(999_999_999)] fn test_extend_game_end() { - let (mut world, _core_actions, _player_1, _player_2) = setup_core_initialized(); - let (_world, p_war_actions, propose_action, voting_action, _guild, _allowed_app) = deploy_p_war( - ref world - ); + let (mut world, _core_actions, _player_1, _player_2) = setup_core(); + let (pwar_actions, propose_action, voting_action, _guild) = deploy_pwar(ref world); let default_params = DefaultParameters { player_override: Option::None, system_override: Option::None, area_hint: Option::None, position: GAME_ORIGIN_POSITION, - color: WHITE_COLOR + color: WHITE_COLOR, }; // create a game - p_war_actions.interact(default_params); + pwar_actions.interact(default_params); - let id = p_war_actions + let id = pwar_actions .get_game_id(Position { x: default_params.position.x, y: default_params.position.y }); println!("id = {}", id); diff --git a/contracts/src/tests/test_setup.cairo b/contracts/src/tests/test_setup.cairo index 921c63f..bda6fe6 100644 --- a/contracts/src/tests/test_setup.cairo +++ b/contracts/src/tests/test_setup.cairo @@ -1,9 +1,15 @@ -use dojo::world::WorldStorage; -use p_war::tests::utils::{deploy_p_war}; -use pixelaw_test_helpers::{setup_core_initialized}; +#[cfg(test)] +mod tests { + use pixelaw_testing::helpers::{setup_core}; + use pwar::tests::utils::{deploy_pwar}; -#[test] -fn test_setup() { - let (mut world, _core_actions, _player_1, _player_2) = setup_core_initialized(); - let (_world, _p_war_actions, _propose, _voting, _guild, _allowed_app) = deploy_p_war(ref world); + #[test] + #[available_gas(300000000)] + fn test_setup() { + //compare scarb.toml and all the other tomls with app template. + let (mut world, _core_actions, _player_1, _player_2) = setup_core(); + println!("core setup done!"); + let (_pwar_actions, _propose, _voting, _guild) = deploy_pwar(ref world); + } } + diff --git a/contracts/src/tests/utils.cairo b/contracts/src/tests/utils.cairo index 0315df2..d3abe92 100644 --- a/contracts/src/tests/utils.cairo +++ b/contracts/src/tests/utils.cairo @@ -1,186 +1,113 @@ -// import test utils -// import world dispatcher -use debug::PrintTrait; -use dojo::model::{ModelStorage}; -use dojo::world::{world, IWorldDispatcher, IWorldDispatcherTrait, WorldStorageTrait, WorldStorage}; +use dojo::world::{IWorldDispatcherTrait, WorldStorage, WorldStorageTrait}; use dojo_cairo_test::{ - spawn_test_world, NamespaceDef, TestResource, ContractDefTrait, ContractDef, - WorldStorageTestTrait -}; -// import test utils -use p_war::{ - models::{ - player::{Player, m_Player}, game::{Game, m_Game}, - board::{Board, m_Board, GameId, m_GameId, PWarPixel, m_PWarPixel}, - proposal::{ - Proposal, m_Proposal, PixelRecoveryRate, m_PixelRecoveryRate, PlayerVote, m_PlayerVote - }, - guilds::{Guild, m_Guild}, allowed_app::{AllowedApp, m_AllowedApp}, - allowed_color::{ - AllowedColor, m_AllowedColor, PaletteColors, m_PaletteColors, InPalette, m_InPalette, - GamePalette, m_GamePalette - }, - }, - systems::{ - actions::{p_war_actions, IActionsDispatcher, IActionsDispatcherTrait}, - propose::{propose_actions, IProposeDispatcher, IProposeDispatcherTrait}, - voting::{voting_actions, IVotingDispatcher, IVotingDispatcherTrait}, - guilds::{guild_actions, IGuildDispatcher, IGuildDispatcherTrait}, - app::{allowed_app_actions, IAllowedAppDispatcher, IAllowedAppDispatcherTrait} - }, + ContractDef, ContractDefTrait, NamespaceDef, TestResource, WorldStorageTestTrait, }; +use pixelaw_testing::helpers::{update_test_world}; -use pixelaw::core::utils::{ - get_core_actions, encode_rgba, decode_rgba, Direction, Position, DefaultParameters +// Import pwar models +use pwar::models::allowed_color::{ + AllowedColor, GamePalette, InPalette, PaletteColors, m_AllowedColor, m_GamePalette, m_InPalette, + m_PaletteColors, }; -use pixelaw_test_helpers::{ - update_test_world, setup_core, setup_core_initialized, setup_apps, setup_apps_initialized, - ZERO_ADDRESS, set_caller, drop_all_events, TEST_POSITION, WHITE_COLOR, RED_COLOR +use pwar::models::board::{Board, PWarPixel, m_Board, m_PWarPixel}; +use pwar::models::game::{Game, m_Game}; +use pwar::models::guilds::{Guild, m_Guild}; +use pwar::models::player::{Player, m_Player}; +use pwar::models::proposal::{ + PixelRecoveryRate, PlayerVote, Proposal, m_PixelRecoveryRate, m_PlayerVote, m_Proposal, }; -use starknet::class_hash::Felt252TryIntoClassHash; - -use zeroable::Zeroable; - -pub fn deploy_p_war( - ref world: WorldStorage -) -> ( - WorldStorage, - IActionsDispatcher, - IProposeDispatcher, - IVotingDispatcher, - IGuildDispatcher, - IAllowedAppDispatcher -) { - let ndef = namespace_def(); - let cdefs = contract_defs(); - - update_test_world(ref world, [ndef].span()); - world.sync_perms_and_inits(cdefs); - - let (p_war_actions, propose, voting, guild, allowed_app) = setup_pwar_apps_initialized(world); +// Import pwar systems +use pwar::systems::actions::{IActionsDispatcher, pwar_actions}; +use pwar::systems::guilds::{IGuildDispatcher, guild_actions}; +use pwar::systems::propose::{IProposeDispatcher, propose_actions}; +use pwar::systems::voting::{IVotingDispatcher, voting_actions}; - (world, p_war_actions, propose, voting, guild, allowed_app) -} +// Constants for testing +const DEFAULT_COLOR: u32 = 0x000000FF; // Black with full alpha +const NEW_COLOR: u32 = 0xFF5500FF; // Orange with full alpha -pub fn namespace_def() -> NamespaceDef { +fn namespace_def() -> NamespaceDef { let ndef = NamespaceDef { - namespace: "pixelaw", resources: [ - TestResource::Model(m_Player::TEST_CLASS_HASH), + namespace: "pwar", + resources: [ + // Models as TestResources TestResource::Model(m_Game::TEST_CLASS_HASH), + TestResource::Model(m_Player::TEST_CLASS_HASH), TestResource::Model(m_Board::TEST_CLASS_HASH), - TestResource::Model(m_GameId::TEST_CLASS_HASH), - TestResource::Model(m_Guild::TEST_CLASS_HASH), - TestResource::Model(m_AllowedApp::TEST_CLASS_HASH), - TestResource::Model(m_AllowedColor::TEST_CLASS_HASH), - TestResource::Model(m_PaletteColors::TEST_CLASS_HASH), - TestResource::Model(m_InPalette::TEST_CLASS_HASH), - TestResource::Model(m_GamePalette::TEST_CLASS_HASH), TestResource::Model(m_PWarPixel::TEST_CLASS_HASH), TestResource::Model(m_Proposal::TEST_CLASS_HASH), - TestResource::Model(m_PixelRecoveryRate::TEST_CLASS_HASH), TestResource::Model(m_PlayerVote::TEST_CLASS_HASH), - TestResource::Event(p_war_actions::e_StartedGame::TEST_CLASS_HASH), - TestResource::Event(p_war_actions::e_EndedGame::TEST_CLASS_HASH), - TestResource::Event(propose_actions::e_ProposalCreated::TEST_CLASS_HASH), - TestResource::Event(propose_actions::e_ProposalActivated::TEST_CLASS_HASH), - TestResource::Event(guild_actions::e_GuildCreated::TEST_CLASS_HASH), - TestResource::Event(guild_actions::e_MemberAdded::TEST_CLASS_HASH), - TestResource::Event(guild_actions::e_MemberRemoved::TEST_CLASS_HASH), - TestResource::Event(voting_actions::e_Voted::TEST_CLASS_HASH), - TestResource::Contract(p_war_actions::TEST_CLASS_HASH), + TestResource::Model(m_PixelRecoveryRate::TEST_CLASS_HASH), + TestResource::Model(m_Guild::TEST_CLASS_HASH), + TestResource::Model(m_AllowedColor::TEST_CLASS_HASH), + TestResource::Model(m_GamePalette::TEST_CLASS_HASH), + TestResource::Model(m_InPalette::TEST_CLASS_HASH), + TestResource::Model(m_PaletteColors::TEST_CLASS_HASH), + // Contracts + TestResource::Contract(pwar_actions::TEST_CLASS_HASH), TestResource::Contract(propose_actions::TEST_CLASS_HASH), TestResource::Contract(voting_actions::TEST_CLASS_HASH), TestResource::Contract(guild_actions::TEST_CLASS_HASH), - TestResource::Contract(allowed_app_actions::TEST_CLASS_HASH), - ].span() + ] + .span(), }; ndef } -pub fn contract_defs() -> Span { - let cdefs: Span = [ - ContractDefTrait::new(@"pixelaw", @"p_war_actions") - .with_writer_of([dojo::utils::bytearray_hash(@"pixelaw")].span()), - ContractDefTrait::new(@"pixelaw", @"propose_actions") - .with_writer_of([dojo::utils::bytearray_hash(@"pixelaw")].span()), - ContractDefTrait::new(@"pixelaw", @"voting_actions") - .with_writer_of([dojo::utils::bytearray_hash(@"pixelaw")].span()), - ContractDefTrait::new(@"pixelaw", @"guild_actions") - .with_writer_of([dojo::utils::bytearray_hash(@"pixelaw")].span()), - ContractDefTrait::new(@"pixelaw", @"allowed_app_actions") - .with_writer_of([dojo::utils::bytearray_hash(@"pixelaw")].span()), - ].span(); - cdefs +fn contract_defs() -> Span { + [ + ContractDefTrait::new(@"pwar", @"pwar_actions") + .with_writer_of([dojo::utils::bytearray_hash(@"pwar")].span()), + ContractDefTrait::new(@"pwar", @"propose_actions") + .with_writer_of([dojo::utils::bytearray_hash(@"pwar")].span()), + ContractDefTrait::new(@"pwar", @"voting_actions") + .with_writer_of([dojo::utils::bytearray_hash(@"pwar")].span()), + ContractDefTrait::new(@"pwar", @"guild_actions") + .with_writer_of([dojo::utils::bytearray_hash(@"pwar")].span()), + ] + .span() } -pub fn setup_pwar_apps( - world: WorldStorage -) -> ( - IActionsDispatcher, - IProposeDispatcher, - IVotingDispatcher, - IGuildDispatcher, - IAllowedAppDispatcher -) { - let (p_war_actions_address, _) = world.dns(@"p_war_actions").unwrap(); - let p_war_actions = IActionsDispatcher { contract_address: p_war_actions_address }; - - let (propose_address, _) = world.dns(@"propose_actions").unwrap(); - let propose_actions = IProposeDispatcher { contract_address: propose_address }; +// Helper function to deploy pwar systems +pub fn deploy_pwar( + ref world: WorldStorage, +) -> (IActionsDispatcher, IProposeDispatcher, IVotingDispatcher, IGuildDispatcher) { + // Register the pwar namespace + let namespace = "pwar"; + world.dispatcher.register_namespace(namespace.clone()); - let (voting_address, _) = world.dns(@"voting_actions").unwrap(); - let voting_actions = IVotingDispatcher { contract_address: voting_address }; + // Get namespace and contract definitions + let ndef = namespace_def(); + let cdefs = contract_defs(); + println!("name space definitions"); - let (guild_address, _) = world.dns(@"guild_actions").unwrap(); - let guild_actions = IGuildDispatcher { contract_address: guild_address }; + // Update the test world with our namespace + update_test_world(ref world, [ndef].span()); - let (allowed_app_address, _) = world.dns(@"allowed_app_actions").unwrap(); - let allowed_app_actions = IAllowedAppDispatcher { contract_address: allowed_app_address }; + // Sync permissions and initializations + world.sync_perms_and_inits(cdefs); - (p_war_actions, propose_actions, voting_actions, guild_actions, allowed_app_actions) -} + // Set the namespace to pwar to find the contract addresses + world.set_namespace(@namespace); -pub fn setup_pwar_apps_initialized( - world: WorldStorage -) -> ( - IActionsDispatcher, - IProposeDispatcher, - IVotingDispatcher, - IGuildDispatcher, - IAllowedAppDispatcher -) { - let ( - p_war_actions, propose_actions, voting_actions, guild_actions, allowed_app_actions - ): ( - IActionsDispatcher, - IProposeDispatcher, - IVotingDispatcher, - IGuildDispatcher, - IAllowedAppDispatcher - ) = - setup_pwar_apps( - world - ); - p_war_actions.init(); - // propose_actions.init(); - // voting_actions.init(); - // guild_actions.init(); - // allowed_app_actions.init(); - - (p_war_actions, propose_actions, voting_actions, guild_actions, allowed_app_actions) -} + // Get the contract addresses from DNS + let pwar_actions_address = world.dns_address(@"pwar_actions").unwrap(); + let propose_address = world.dns_address(@"propose_actions").unwrap(); + let voting_address = world.dns_address(@"voting_actions").unwrap(); + let guild_address = world.dns_address(@"guild_actions").unwrap(); + + // Create the dispatchers + let pwar_actions = IActionsDispatcher { contract_address: pwar_actions_address }; + let propose_actions = IProposeDispatcher { contract_address: propose_address }; + let voting_actions = IVotingDispatcher { contract_address: voting_address }; + let guild_actions = IGuildDispatcher { contract_address: guild_address }; + + // Set the namespace back to pixelaw + world.set_namespace(@"pixelaw"); + + println!("pwar deployment finished"); -pub fn print_all_colors(ref world: WorldStorage, id: u32) { - let mut i = 0; - loop { - let color: PaletteColors = world.read_model((id, i)); - let allowed_color: AllowedColor = world.read_model((id, color.color)); - println!("@@@@@ COLOR: {}, {} @@@@", color.color, allowed_color.is_allowed); - i += 1; - if i == 9 { - break; - } - } + (pwar_actions, propose_actions, voting_actions, guild_actions) } diff --git a/public/assets/start_katana_and_torii.png b/public/assets/start_katana_and_torii.png deleted file mode 100644 index fd44310..0000000 Binary files a/public/assets/start_katana_and_torii.png and /dev/null differ