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:
-
+### 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
-
+Version 0.7.3
-[](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 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 (
-
- );
-};
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 (
-
- );
-};
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 (
+
+ );
+};
+
+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 (
+
+ );
+};
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 (
-
- );
-};
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 (
-
-
-
-
-
-
-
-
-
-
-
-
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...
+
+
+
+
+ >
+);
+
+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 (
+
+
+

+
+
+
+
+
+
+
+ );
+};
+
+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 (
-
- );
-};
-
-// 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 (
+
+ );
+};
+
+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 (
+
+ );
+};
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 @@
+
+ [90mWorld[39m | Contract Address | Class Hash
+--------+--------------------------------------------------------------------+--------------------------------------------------------------------
+ Synced | 0x01d09b5e00f376337603943fc12715e439e91c0039f353b1cc48bb278dfa99d5 | 0x075fc75bcd1a7f8b4bf64b74978b0f89c8cee44bb755c1dae6f82284756451ec
+
+ [90mNamespaces[39m | Status | Dojo Selector
+------------+--------+--------------------------------------------------------------------
+ pixelaw | Synced | 0x054b1a9dfb8f09560c4386777c6ec02c76a4aca5e18b896b2a9ee9b275c7ae77
+ pwar | Synced | 0x06561ddf9cdf4c5e58f9a4258af70b5b066bfe37099c013e2cf1299466478754
+
+ [90mContracts[39m | 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
+
+ [90mModels[39m | 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
+
+ [90mEvents[39m | 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::