From 34b754c8b23de5a47a96d6f85d3b534f1c44445c Mon Sep 17 00:00:00 2001 From: TF Date: Fri, 10 May 2024 11:57:18 -0500 Subject: [PATCH 1/5] added some ceptor games in --- README.md | 2 +- packages/nextjs/app/games/page.tsx | 35 ++ packages/nextjs/app/page.tsx | 27 +- packages/nextjs/components/Header.tsx | 7 +- .../components/ceptor/CharacterCard.tsx | 52 +++ .../nextjs/components/ceptor/CharacterData.ts | 82 ++++ .../nextjs/contracts/deployedContracts.ts | 427 +++++++++++++++++- 7 files changed, 607 insertions(+), 25 deletions(-) create mode 100644 packages/nextjs/app/games/page.tsx create mode 100644 packages/nextjs/components/ceptor/CharacterCard.tsx create mode 100644 packages/nextjs/components/ceptor/CharacterData.ts diff --git a/README.md b/README.md index 9109e28..ff10a8f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@
-# 🏗🔴 Scaffold-OP +# 🏗🔴 Ceptor-Games-Scaffold

Documentation | diff --git a/packages/nextjs/app/games/page.tsx b/packages/nextjs/app/games/page.tsx new file mode 100644 index 0000000..42ab391 --- /dev/null +++ b/packages/nextjs/app/games/page.tsx @@ -0,0 +1,35 @@ +"use client"; + +import type { NextPage } from "next"; +import { useAccount } from "wagmi"; +import CharacterCard from "~~/components/ceptor/CharacterCard"; +import characters from "~~/components/ceptor/CharacterData"; +import { Address } from "~~/components/scaffold-eth"; + +const Games: NextPage = () => { + const { address: connectedAddress } = useAccount(); + + return ( + <> +
+
+

+ Welcome to + Games-Scaffold 🏗🔴 +

+
+

Connected Address:

+
+
+
+ {characters.map((character, index) => ( + + ))} +
+
+
+ + ); +}; + +export default Games; diff --git a/packages/nextjs/app/page.tsx b/packages/nextjs/app/page.tsx index 8243e2f..7f19ba5 100644 --- a/packages/nextjs/app/page.tsx +++ b/packages/nextjs/app/page.tsx @@ -14,31 +14,14 @@ const Home: NextPage = () => {

- Welcome to - Scaffold-OP 🏗🔴 + Welcome hooty to + Ceptor Scaffold 🏗🔴

Connected Address:

-

- Get started by editing{" "} - - packages/nextjs/app/page.tsx - -

-

- Edit your smart contract{" "} - - YourContract.sol - {" "} - in{" "} - - packages/hardhat/contracts - -

-
@@ -54,9 +37,9 @@ const Home: NextPage = () => {

- Explore your local transactions with the{" "} - - Block Explorer + Explore your local characters with the{" "} + + Games {" "} tab.

diff --git a/packages/nextjs/components/Header.tsx b/packages/nextjs/components/Header.tsx index 3489729..7bf157c 100644 --- a/packages/nextjs/components/Header.tsx +++ b/packages/nextjs/components/Header.tsx @@ -5,7 +5,7 @@ import Image from "next/image"; import Link from "next/link"; import { usePathname } from "next/navigation"; import sunny from "./assets/sunny.svg"; -import { Bars3Icon, BugAntIcon } from "@heroicons/react/24/outline"; +import { Bars3Icon, BugAntIcon, PuzzlePieceIcon } from "@heroicons/react/24/outline"; import { DappConsoleButton, FaucetButton, @@ -30,6 +30,11 @@ export const menuLinks: HeaderMenuLink[] = [ href: "/debug", icon: , }, + { + label: "Games Hooty", + href: "/games", + icon: , + }, ]; export const HeaderMenuLinks = () => { diff --git a/packages/nextjs/components/ceptor/CharacterCard.tsx b/packages/nextjs/components/ceptor/CharacterCard.tsx new file mode 100644 index 0000000..2405dbe --- /dev/null +++ b/packages/nextjs/components/ceptor/CharacterCard.tsx @@ -0,0 +1,52 @@ +// components/ceptor/CharacterCard.tsx +import React from "react"; + +interface Character { + name: string; + classInfo: string; + race: string; + level: number; + background: string; + alignment: string; + abilities: Record; + combatStats: { + ac: number; + hitPoints: number; + initiative: number; + speed: string; + }; +} + +interface CharacterCardProps { + character: Character; +} + +const CharacterCard: React.FC = ({ character }) => { + return ( +
+

+ {character.name} - Level {character.level} {character.classInfo} +

+

+ {character.race} | {character.background} | {character.alignment} +

+
+

Abilities:

+ {Object.entries(character.abilities).map(([ability, value]) => ( +

+ {ability}: {value} +

+ ))} +
+
+

Combat Stats:

+

AC: {character.combatStats.ac}

+

Hit Points: {character.combatStats.hitPoints}

+

Initiative: {character.combatStats.initiative}

+

Speed: {character.combatStats.speed}

+
+
+ ); +}; + +export default CharacterCard; diff --git a/packages/nextjs/components/ceptor/CharacterData.ts b/packages/nextjs/components/ceptor/CharacterData.ts new file mode 100644 index 0000000..e535db9 --- /dev/null +++ b/packages/nextjs/components/ceptor/CharacterData.ts @@ -0,0 +1,82 @@ +interface Character { + name: string; + race: string; + classInfo: string; + level: number; + background: string; + alignment: string; + player: string; + abilities: { + strength: number; + dexterity: number; + constitution: number; + intelligence: number; + wisdom: number; + charisma: number; + }; + proficiencies: { + armor: string[]; + weapons: string[]; + tools: string[]; + savingThrows: string[]; + skills: string[]; + }; + featuresTraits: string[]; + equipment: string[]; + combatStats: { + ac: number; + initiative: number; + speed: string; + hitPoints: number; + }; +} + +const characters: Character[] = [ + { + name: "猪八戒", + race: "Zhu Bajie", + classInfo: "Fighter", + level: 1, + background: "Folk Hero", + alignment: "Neutral Good", + player: "Allan Ma", + abilities: { + strength: 15, + dexterity: 10, + constitution: 16, + intelligence: 8, + wisdom: 13, + charisma: 12, + }, + proficiencies: { + armor: ["All armor", "shields"], + weapons: ["Simple weapons", "martial weapons"], + tools: ["Brewer's supplies"], + savingThrows: ["Strength", "Constitution"], + skills: ["Athletics", "Perception"], + }, + featuresTraits: [ + "Pig's Resilience: Resistance to poison damage and advantage on saving throws against poison.", + "Noble Heart: Proficiency in Insight.", + "Forager: Can find food and fresh water for himself and up to five others each day in suitable environments.", + "Fighting Style (Defense): +1 bonus to AC while wearing armor.", + "Second Wind: Use a bonus action to regain hit points equal to 1d10 + your fighter level once per short or long rest.", + ], + equipment: [ + "Guandao (1d12 slashing damage, heavy, two-handed)", + "Chain mail (AC 16)", + "Adventurer's pack", + "Flask of strong liquor", + "Signet of his celestial origin", + "Set of common clothes", + ], + combatStats: { + ac: 17, + initiative: 0, + speed: "30 feet", + hitPoints: 13, + }, + }, +]; + +export default characters; diff --git a/packages/nextjs/contracts/deployedContracts.ts b/packages/nextjs/contracts/deployedContracts.ts index 008d4eb..e1437ef 100644 --- a/packages/nextjs/contracts/deployedContracts.ts +++ b/packages/nextjs/contracts/deployedContracts.ts @@ -4,6 +4,431 @@ */ import { GenericContractsDeclaration } from "~~/utils/scaffold-eth/contract"; -const deployedContracts = {} as const; +const deployedContracts = { + 31337: { + BuyMeACoffee: { + address: "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + abi: [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "InsufficientFunds", + type: "error", + }, + { + inputs: [ + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "InvalidArguments", + type: "error", + }, + { + inputs: [], + name: "OnlyOwner", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "buyer", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "price", + type: "uint256", + }, + ], + name: "BuyMeACoffeeEvent", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "userAddress", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "numCoffees", + type: "uint256", + }, + { + indexed: false, + internalType: "string", + name: "userName", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "twitterHandle", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "NewMemo", + type: "event", + }, + { + inputs: [ + { + internalType: "uint256", + name: "numCoffees", + type: "uint256", + }, + { + internalType: "string", + name: "userName", + type: "string", + }, + { + internalType: "string", + name: "twitterHandle", + type: "string", + }, + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "buyCoffee", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "getMemos", + outputs: [ + { + components: [ + { + internalType: "uint256", + name: "numCoffees", + type: "uint256", + }, + { + internalType: "string", + name: "userName", + type: "string", + }, + { + internalType: "string", + name: "twitterHandle", + type: "string", + }, + { + internalType: "string", + name: "message", + type: "string", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "address", + name: "userAddress", + type: "address", + }, + ], + internalType: "struct Memo[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "memos", + outputs: [ + { + internalType: "uint256", + name: "numCoffees", + type: "uint256", + }, + { + internalType: "string", + name: "userName", + type: "string", + }, + { + internalType: "string", + name: "twitterHandle", + type: "string", + }, + { + internalType: "string", + name: "message", + type: "string", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "address", + name: "userAddress", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "modifyMemoMessage", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "price", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + ], + name: "removeMemo", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "withdrawTips", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + stateMutability: "payable", + type: "receive", + }, + ], + inheritedFunctions: {}, + }, + YourContract: { + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "greetingSetter", + type: "address", + }, + { + indexed: false, + internalType: "string", + name: "newGreeting", + type: "string", + }, + { + indexed: false, + internalType: "bool", + name: "premium", + type: "bool", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "GreetingChange", + type: "event", + }, + { + inputs: [], + name: "greeting", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "premium", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "string", + name: "_newGreeting", + type: "string", + }, + ], + name: "setGreeting", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "totalCounter", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "userGreetingCounter", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + stateMutability: "payable", + type: "receive", + }, + ], + inheritedFunctions: {}, + }, + }, +} as const; export default deployedContracts satisfies GenericContractsDeclaration; From aa89bab154b5320154fd98a732e948a4df55990e Mon Sep 17 00:00:00 2001 From: TF Date: Mon, 13 May 2024 21:38:32 -0500 Subject: [PATCH 2/5] buy me a ceptor world adaptation --- packages/hardhat/contracts/BuyMeACeptor.sol | 137 ++ packages/hardhat/contracts/BuyMeACoffee.sol | 156 --- packages/hardhat/contracts/CeptorCS.txt | 90 ++ .../contracts/CeptorCharacterGenerator.sol | 91 ++ .../hardhat/contracts/CharacterSheets.txt | 125 ++ packages/hardhat/contracts/DynamicHooty.sol | 119 ++ packages/hardhat/contracts/YourContract.sol | 8 + ...coffee.ts => 01_deploy_buy_me_a_ceptor.ts} | 16 +- packages/hardhat/package.json | 1 + .../nextjs/contracts/deployedContracts.ts | 330 +++++ yarn.lock | 1188 ++++++++++++++++- 11 files changed, 2065 insertions(+), 196 deletions(-) create mode 100644 packages/hardhat/contracts/BuyMeACeptor.sol delete mode 100644 packages/hardhat/contracts/BuyMeACoffee.sol create mode 100644 packages/hardhat/contracts/CeptorCS.txt create mode 100644 packages/hardhat/contracts/CeptorCharacterGenerator.sol create mode 100644 packages/hardhat/contracts/CharacterSheets.txt create mode 100644 packages/hardhat/contracts/DynamicHooty.sol rename packages/hardhat/deploy/{01_deploy_buy_me_a_coffee.ts => 01_deploy_buy_me_a_ceptor.ts} (75%) diff --git a/packages/hardhat/contracts/BuyMeACeptor.sol b/packages/hardhat/contracts/BuyMeACeptor.sol new file mode 100644 index 0000000..fcbb20f --- /dev/null +++ b/packages/hardhat/contracts/BuyMeACeptor.sol @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0 <0.9.0; + +/** + * @title World + * @dev World struct + */ +struct World { + string vibe; + string gameMasterName; + string gameMasterTwitterHandle; + string description; + uint256 time; + address gameMasterAddress; +} + +/** + * @title BuyMeACeptorWorld + * @dev BuyMeACeptorWorld contract to accept donations and for our users to create a world for us + */ +contract BuyMeACeptor{ + address payable public owner; + uint256 public price; + World[] public worlds; + + error InsufficientFunds(); + error InvalidArguments(string message); + error OnlyOwner(); + + event BuyMeACeptorWorldEvent(address indexed buyer, uint256 price); + event NewWorld(address indexed gameMasterAddress, uint256 time, string vibe, string gameMasterName, string gameMasterTwitterHandle, string description); + + constructor() { + owner = payable(msg.sender); + price = 0.0001 ether; + } + + /** + * WRITE FUNCTIONS ************* + */ + + /** + * @dev Function to buy a world + * @param gameMasterName The name of the game master + * @param gameMasterTwitterHandle The Twitter handle of the game master + * @param description The description of the world + * (Note: Using calldata for gas efficiency) + */ + function buyWorld(string calldata vibe, string calldata gameMasterName, string calldata gameMasterTwitterHandle, string calldata description) public payable { + if (msg.value < price) { + revert InsufficientFunds(); + } + + emit BuyMeACeptorWorldEvent(msg.sender, msg.value); + + if (bytes(gameMasterName).length == 0 && bytes(description).length == 0) { + revert InvalidArguments("Invalid gameMasterName or description"); + } + + worlds.push(World(vibe, gameMasterName, gameMasterTwitterHandle, description, block.timestamp, msg.sender)); + + emit NewWorld(msg.sender, block.timestamp, vibe, gameMasterName, gameMasterTwitterHandle, description); + } + + /** + * @dev Function to remove a world + * @param index The index of the world + */ + function removeWorld(uint256 index) public { + if (index >= worlds.length) { + revert InvalidArguments("Invalid index"); + } + + World memory world = worlds[index]; + + // if operation isnt sent from the same game master or the owner, then not allowed + if (world.gameMasterAddress != msg.sender && msg.sender != owner) { + revert InvalidArguments("Operation not allowed"); + } + + World memory indexWorld = worlds[index]; + worlds[index] = worlds[worlds.length - 1]; + worlds[worlds.length - 1] = indexWorld; + worlds.pop(); + } + + /** + * @dev Function to modify a world description + * @param index The index of the world + * @param description The description of the world + */ + function modifyWorldDescription(uint256 index, string memory description) public { + if (index >= worlds.length) { + revert InvalidArguments("Invalid index"); + } + + World memory world = worlds[index]; + + if (world.gameMasterAddress != msg.sender || msg.sender != owner) { + revert InvalidArguments("Operation not allowed"); + } + + worlds[index].description = description; + } + + /** + * @dev Function to withdraw the balance + */ + function withdrawTips() public { + if (msg.sender != owner) { + revert OnlyOwner(); + } + + if (address(this).balance == 0) { + revert InsufficientFunds(); + } + + (bool sent,) = owner.call{value: address(this).balance}(""); + require(sent, "Failed to send Ether"); + } + + /** + * READ FUNCTIONS ************* + */ + + /** + * @dev Function to get the worlds + */ + function getWorlds() public view returns (World[] memory) { + return worlds; + } + + /** + * @dev Recieve function to accept ether + */ + receive() external payable {} +} diff --git a/packages/hardhat/contracts/BuyMeACoffee.sol b/packages/hardhat/contracts/BuyMeACoffee.sol deleted file mode 100644 index 2e09998..0000000 --- a/packages/hardhat/contracts/BuyMeACoffee.sol +++ /dev/null @@ -1,156 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.0 <0.9.0; -/** - * ---------------------------------------------------------------------------------------------------------------- - * ---------██████╗ ██╗ ██╗██╗██╗ ██████╗ ██████╗ ███╗ ██╗ ██████╗██╗ ██╗ █████╗ ██╗███╗ ██╗----- - * ---------██╔══██╗██║ ██║██║██║ ██╔══██╗ ██╔═══██╗████╗ ██║██╔════╝██║ ██║██╔══██╗██║████╗ ██║----- - * ---------██████╔╝██║ ██║██║██║ ██║ ██║█████╗██║ ██║██╔██╗ ██║██║ ███████║███████║██║██╔██╗ ██║----- - * ---------██╔══██╗██║ ██║██║██║ ██║ ██║╚════╝██║ ██║██║╚██╗██║██║ ██╔══██║██╔══██║██║██║╚██╗██║----- - * ---------██████╔╝╚██████╔╝██║███████╗██████╔╝ ╚██████╔╝██║ ╚████║╚██████╗██║ ██║██║ ██║██║██║ ╚████║----- - * ---------╚═════╝ ╚═════╝ ╚═╝╚══════╝╚═════╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝----- - * ---------------------------------------------------------------------------------------------------------------- - * https://github.com/coinbase/build-onchain-apps - * - * Disclaimer: The provided Solidity contracts are intended solely for educational purposes and are - * not warranted for any specific use. They have not been audited and may contain vulnerabilities, hence should - * not be deployed in production environments. Users are advised to seek professional review and conduct a - * comprehensive security audit before any real-world application to mitigate risks of financial loss or other - * consequences. The author(s) disclaim all liability for any damages arising from the use of these contracts. - * Use at your own risk, acknowledging the inherent risks of smart contract technology on the blockchain. - * - */ - -/** - * @title Memos - * @dev Memo struct - */ -struct Memo { - uint numCoffees; - string userName; - string twitterHandle; - string message; - uint256 time; - address userAddress; -} - -/** - * @title BuyMeACoffee - * @dev BuyMeACoffee contract to accept donations and for our users to leave a memo for us - */ -contract BuyMeACoffee { - address payable public owner; - uint256 public price; - Memo[] public memos; - - error InsufficientFunds(); - error InvalidArguments(string message); - error OnlyOwner(); - - event BuyMeACoffeeEvent(address indexed buyer, uint256 price); - event NewMemo(address indexed userAddress, uint256 time, uint numCoffees, string userName, string twitterHandle, string message); - - constructor() { - owner = payable(msg.sender); - price = 0.0001 ether; - } - - /** - * WRITE FUNCTIONS ************* - */ - - /** - * @dev Function to buy a coffee - * @param userName The name of the user - * @param twitterHandle The Twitter handle of the user - * @param message The message of the user - * (Note: Using calldata for gas efficiency) - */ - function buyCoffee(uint numCoffees, string calldata userName, string calldata twitterHandle, string calldata message) public payable { - if (msg.value < price*numCoffees) { - revert InsufficientFunds(); - } - - emit BuyMeACoffeeEvent(msg.sender, msg.value); - - if (bytes(userName).length == 0 && bytes(message).length == 0) { - revert InvalidArguments("Invalid userName or message"); - } - - memos.push(Memo(numCoffees, userName, twitterHandle, message, block.timestamp, msg.sender)); - - emit NewMemo(msg.sender, block.timestamp, numCoffees, userName, twitterHandle, message); - } - - /** - * @dev Function to remove a memo - * @param index The index of the memo - */ - function removeMemo(uint256 index) public { - if (index >= memos.length) { - revert InvalidArguments("Invalid index"); - } - - Memo memory memo = memos[index]; - - // if operation isnt sent from the same user or the owner, then not allowed - if (memo.userAddress != msg.sender && msg.sender != owner) { - revert InvalidArguments("Operation not allowed"); - } - - Memo memory indexMemo = memos[index]; - memos[index] = memos[memos.length - 1]; - memos[memos.length - 1] = indexMemo; - memos.pop(); - } - - /** - * @dev Function to modify a memo - * @param index The index of the memo - * @param message The message of the memo - */ - function modifyMemoMessage(uint256 index, string memory message) public { - if (index >= memos.length) { - revert InvalidArguments("Invalid index"); - } - - Memo memory memo = memos[index]; - - if (memo.userAddress != msg.sender || msg.sender != owner) { - revert InvalidArguments("Operation not allowed"); - } - - memos[index].message = message; - } - - /** - * @dev Function to withdraw the balance - */ - function withdrawTips() public { - if (msg.sender != owner) { - revert OnlyOwner(); - } - - if (address(this).balance == 0) { - revert InsufficientFunds(); - } - - (bool sent,) = owner.call{value: address(this).balance}(""); - require(sent, "Failed to send Ether"); - } - - /** - * READ FUNCTIONS ************* - */ - - /** - * @dev Function to get the memos - */ - function getMemos() public view returns (Memo[] memory) { - return memos; - } - - /** - * @dev Recieve function to accept ether - */ - receive() external payable {} -} diff --git a/packages/hardhat/contracts/CeptorCS.txt b/packages/hardhat/contracts/CeptorCS.txt new file mode 100644 index 0000000..01ea2ed --- /dev/null +++ b/packages/hardhat/contracts/CeptorCS.txt @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; +import "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; + +contract CeptorCharacterSheets is ERC721URIStorage, VRFConsumerBaseV2, Ownable { + struct Stats { + uint8 strength; + uint8 dexterity; + uint8 constitution; + uint8 intelligence; + uint8 wisdom; + uint8 charisma; + uint8 luck; + } + + struct Character { + Stats stats; + string name; + uint swapsLeft; + } + + mapping(address => uint256) public ownerToTokenId; + mapping(uint256 => Character) public tokenIdToCharacter; + + uint256 public tokenIdCounter; + bytes32 public keyHash; + uint256 public fee; + uint64 public subscriptionId; + + event CharacterCreated(uint256 indexed tokenId, address owner); + event StatsSwapped(uint256 indexed tokenId, address owner); + + constructor( + address vrfCoordinator, + address linkToken, + bytes32 _keyHash, + uint64 _subscriptionId + ) + VRFConsumerBaseV2(vrfCoordinator) + ERC721("CeptorCharacterSheets", "CCS") + { + keyHash = _keyHash; + fee = 0.1 * 10**18; // Chainlink VRF fee + subscriptionId = _subscriptionId; + tokenIdCounter = 1; + } + + function createCharacter(string memory name) external { + require(ownerToTokenId[msg.sender] == 0, "Owner already has a character"); + uint256 tokenId = tokenIdCounter++; + ownerToTokenId[msg.sender] = tokenId; + tokenIdToCharacter[tokenId] = Character({ + name: name, + stats: Stats(0, 0, 0, 0, 0, 0, 0), + swapsLeft: 3 + }); + _safeMint(msg.sender, tokenId); + emit CharacterCreated(tokenId, msg.sender); + requestStats(tokenId); + } + + function requestStats(uint256 tokenId) internal { + require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK"); + requestRandomWords(keyHash, subscriptionId, 3, fee, 1); + } + + function fulfillRandomWords(uint256, uint256[] memory randomWords) internal override { + uint256 tokenId = ownerToTokenId[msg.sender]; + Character storage character = tokenIdToCharacter[tokenId]; + character.stats.strength = uint8(randomWords[0] % 16 + 3); + character.stats.dexterity = uint8(randomWords[1] % 16 + 3); + character.stats.constitution = uint8(randomWords[2] % 16 + 3); + character.stats.intelligence = uint8(randomWords[3] % 16 + 3); + character.stats.wisdom = uint8(randomWords[4] % 16 + 3); + character.stats.charisma = uint8(randomWords[5] % 16 + 3); + character.stats.luck = uint8(randomWords[6] % 16 + 3); + } + + function swapStats(uint256 tokenId) external { + require(ownerOf(tokenId) == msg.sender, "Not the owner"); + Character storage character = tokenIdToCharacter[tokenId]; + require(character.swapsLeft > 0, "No swaps left"); + character.swapsLeft--; + requestStats(tokenId); + emit StatsSwapped(tokenId, msg.sender); + } +} diff --git a/packages/hardhat/contracts/CeptorCharacterGenerator.sol b/packages/hardhat/contracts/CeptorCharacterGenerator.sol new file mode 100644 index 0000000..0a7cce4 --- /dev/null +++ b/packages/hardhat/contracts/CeptorCharacterGenerator.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + +contract DnDCharacterGenerator is VRFConsumerBaseV2, ConfirmedOwner { + VRFCoordinatorV2Interface COORDINATOR; + uint64 s_subscriptionId; + bytes32 keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + uint32 callbackGasLimit = 100000; + uint16 requestConfirmations = 3; + uint32 numWords = 7; // 6 ability scores + 1 for class + + struct Character { + uint256[6] abilities; + string class; + string name; + string alignment; + string background; + uint8 swaps; + } + + mapping(uint256 => address) requestToSender; + mapping(address => Character) public characters; + + event CharacterCreated(address owner, uint256 requestId); + event CharacterUpdated(address owner, string name, string alignment, string background); + event ScoresSwapped(address owner); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + constructor(uint64 subscriptionId) VRFConsumerBaseV2(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625) + ConfirmedOwner(msg.sender) { + COORDINATOR = VRFCoordinatorV2Interface(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625); + s_subscriptionId = subscriptionId; + } + + function createCharacter() external onlyOwner { + require(characters[msg.sender].abilities[0] == 0, "Character already created"); + uint256 requestId = COORDINATOR.requestRandomWords( + keyHash, + s_subscriptionId, + requestConfirmations, + callbackGasLimit, + numWords + ); + requestToSender[requestId] = msg.sender; + emit CharacterCreated(msg.sender, requestId); + } + + function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override { + address owner = requestToSender[requestId]; + uint256[6] memory abilities; + for (uint i = 0; i < 6; i++) { + abilities[i] = (randomWords[i] % 16) + 3; // Score range: 3-18 + } + characters[owner] = Character({ + abilities: abilities, + class: getClass(randomWords[6]), + name: "", + alignment: "", + background: "", + swaps: 0 + }); + emit RequestFulfilled(requestId, randomWords); + } + + function updateCharacterDetails(string calldata name, string calldata alignment, string calldata background) external { + require(characters[msg.sender].abilities[0] != 0, "Character not created"); + characters[msg.sender].name = name; + characters[msg.sender].alignment = alignment; + characters[msg.sender].background = background; + emit CharacterUpdated(msg.sender, name, alignment, background); + } + + function swapScores(uint8 index1, uint8 index2) external { + require(characters[msg.sender].swaps < 3, "Max swaps reached"); + require(index1 < 6 && index2 < 6, "Invalid index"); + + (characters[msg.sender].abilities[index1], characters[msg.sender].abilities[index2]) = + (characters[msg.sender].abilities[index2], characters[msg.sender].abilities[index1]); + characters[msg.sender].swaps++; + emit ScoresSwapped(msg.sender); + } + + function getClass(uint256 randomNumber) private pure returns (string memory) { + string[12] memory classes = ["Barbarian", "Bard", "Cleric", "Druid", "Fighter", "Monk", "Paladin", "Ranger", "Rogue", "Sorcerer", "Warlock", "Wizard"]; + return classes[randomNumber % classes.length]; + } +} diff --git a/packages/hardhat/contracts/CharacterSheets.txt b/packages/hardhat/contracts/CharacterSheets.txt new file mode 100644 index 0000000..0eb0de6 --- /dev/null +++ b/packages/hardhat/contracts/CharacterSheets.txt @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.7; + +// Useful for debugging. Remove when deploying to a live network. +import "hardhat/console.sol"; + +// Use openzeppelin to inherit battle-tested implementations (ERC20, ERC721, etc) +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +contract VRFv2Consumer is VRFConsumerBaseV2, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + mapping(uint256 => RequestStatus) + public s_requests; /* requestId --> requestStatus */ + VRFCoordinatorV2Interface COORDINATOR; + + // Your subscription ID. + uint64 s_subscriptionId; + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf/v2/subscription/supported-networks/#configurations + bytes32 keyHash = + 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 100000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625 + */ + constructor( + uint64 subscriptionId + ) + VRFConsumerBaseV2(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625) + ConfirmedOwner(msg.sender) + { + COORDINATOR = VRFCoordinatorV2Interface( + 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625 + ); + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + function requestRandomWords() + external + onlyOwner + returns (uint256 requestId) + { + // Will revert if subscription is not set and funded. + requestId = COORDINATOR.requestRandomWords( + keyHash, + s_subscriptionId, + requestConfirmations, + callbackGasLimit, + numWords + ); + s_requests[requestId] = RequestStatus({ + randomWords: new uint256[](0), + exists: true, + fulfilled: false + }); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } +} diff --git a/packages/hardhat/contracts/DynamicHooty.sol b/packages/hardhat/contracts/DynamicHooty.sol new file mode 100644 index 0000000..39bbe4c --- /dev/null +++ b/packages/hardhat/contracts/DynamicHooty.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.7; + +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +contract VRFv2Consumer is VRFConsumerBaseV2, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + mapping(uint256 => RequestStatus) + public s_requests; /* requestId --> requestStatus */ + VRFCoordinatorV2Interface COORDINATOR; + + // Your subscription ID. + uint64 s_subscriptionId; + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf/v2/subscription/supported-networks/#configurations + bytes32 keyHash = + 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 100000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625 + */ + constructor( + uint64 subscriptionId + ) + VRFConsumerBaseV2(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625) + ConfirmedOwner(msg.sender) + { + COORDINATOR = VRFCoordinatorV2Interface( + 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625 + ); + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + function requestRandomWords() + external + onlyOwner + returns (uint256 requestId) + { + // Will revert if subscription is not set and funded. + requestId = COORDINATOR.requestRandomWords( + keyHash, + s_subscriptionId, + requestConfirmations, + callbackGasLimit, + numWords + ); + s_requests[requestId] = RequestStatus({ + randomWords: new uint256[](0), + exists: true, + fulfilled: false + }); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } +} diff --git a/packages/hardhat/contracts/YourContract.sol b/packages/hardhat/contracts/YourContract.sol index 3d364a0..ccd9a12 100644 --- a/packages/hardhat/contracts/YourContract.sol +++ b/packages/hardhat/contracts/YourContract.sol @@ -70,7 +70,15 @@ contract YourContract { // emit: keyword used to trigger an event emit GreetingChange(msg.sender, _newGreeting, msg.value > 0, msg.value); } +// Mapping from address to number +mapping(address => uint) public userNumbers; +event NumberUpdated(address indexed user, uint number); +// Function to store a number +function storeNumber(uint _number) public { + userNumbers[msg.sender] = _number; + emit NumberUpdated(msg.sender, _number); + } /** * Function that allows the owner to withdraw all the Ether in the contract * The function can only be called by the owner of the contract as defined by the isOwner modifier diff --git a/packages/hardhat/deploy/01_deploy_buy_me_a_coffee.ts b/packages/hardhat/deploy/01_deploy_buy_me_a_ceptor.ts similarity index 75% rename from packages/hardhat/deploy/01_deploy_buy_me_a_coffee.ts rename to packages/hardhat/deploy/01_deploy_buy_me_a_ceptor.ts index 474d826..fd61c54 100644 --- a/packages/hardhat/deploy/01_deploy_buy_me_a_coffee.ts +++ b/packages/hardhat/deploy/01_deploy_buy_me_a_ceptor.ts @@ -3,12 +3,12 @@ import { DeployFunction } from "hardhat-deploy/types"; import { Contract } from "ethers"; /** - * Deploys a contract named "BuyMeACoffee" using the deployer account and + * Deploys a contract named "BuyMeACeptor" using the deployer account and * constructor arguments set to the deployer address * * @param hre HardhatRuntimeEnvironment object. */ -const deployBuyMeACoffee: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { +const deployBuyMeACeptor: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { /* On localhost, the deployer account is the one that comes with Hardhat, which is already funded. @@ -22,7 +22,7 @@ const deployBuyMeACoffee: DeployFunction = async function (hre: HardhatRuntimeEn const { deployer } = await hre.getNamedAccounts(); const { deploy } = hre.deployments; - await deploy("BuyMeACoffee", { + await deploy("BuyMeACeptor", { from: deployer, // Contract constructor arguments log: true, @@ -32,12 +32,12 @@ const deployBuyMeACoffee: DeployFunction = async function (hre: HardhatRuntimeEn }); // Get the deployed contract to interact with it after deploying. - const buyMeACoffeeContract = await hre.ethers.getContract("BuyMeACoffee", deployer); - console.log("👋 Buy this person a coffee!", await buyMeACoffeeContract.owner()); + const buyMeACeptorContract = await hre.ethers.getContract("BuyMeACeptor", deployer); + console.log("👋 Buy this person a Ceptor!", await buyMeACeptorContract.owner()); }; -export default deployBuyMeACoffee; +export default deployBuyMeACeptor; // Tags are useful if you have multiple deploy files and only want to run one of them. -// e.g. yarn deploy --tags BuyMeACoffee -deployBuyMeACoffee.tags = ["BuyMeACoffee"]; +// e.g. yarn deploy --tags BuyMeACeptor +deployBuyMeACeptor.tags = ["BuyMeACeptor"]; diff --git a/packages/hardhat/package.json b/packages/hardhat/package.json index 918b5d0..c5a9a2a 100644 --- a/packages/hardhat/package.json +++ b/packages/hardhat/package.json @@ -50,6 +50,7 @@ "typescript": "^5.1.6" }, "dependencies": { + "@chainlink/contracts": "^1.1.0", "@openzeppelin/contracts": "^4.8.1", "@typechain/ethers-v6": "^0.5.1", "dotenv": "^16.0.3", diff --git a/packages/nextjs/contracts/deployedContracts.ts b/packages/nextjs/contracts/deployedContracts.ts index e1437ef..da0a5b3 100644 --- a/packages/nextjs/contracts/deployedContracts.ts +++ b/packages/nextjs/contracts/deployedContracts.ts @@ -6,6 +6,285 @@ import { GenericContractsDeclaration } from "~~/utils/scaffold-eth/contract"; const deployedContracts = { 31337: { + BuyMeACeptor: { + address: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + abi: [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "InsufficientFunds", + type: "error", + }, + { + inputs: [ + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "InvalidArguments", + type: "error", + }, + { + inputs: [], + name: "OnlyOwner", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "buyer", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "price", + type: "uint256", + }, + ], + name: "BuyMeACeptorWorldEvent", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "gameMasterAddress", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + indexed: false, + internalType: "string", + name: "vibe", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "gameMasterName", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "gameMasterTwitterHandle", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "description", + type: "string", + }, + ], + name: "NewWorld", + type: "event", + }, + { + inputs: [ + { + internalType: "string", + name: "vibe", + type: "string", + }, + { + internalType: "string", + name: "gameMasterName", + type: "string", + }, + { + internalType: "string", + name: "gameMasterTwitterHandle", + type: "string", + }, + { + internalType: "string", + name: "description", + type: "string", + }, + ], + name: "buyWorld", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "getWorlds", + outputs: [ + { + components: [ + { + internalType: "string", + name: "vibe", + type: "string", + }, + { + internalType: "string", + name: "gameMasterName", + type: "string", + }, + { + internalType: "string", + name: "gameMasterTwitterHandle", + type: "string", + }, + { + internalType: "string", + name: "description", + type: "string", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "address", + name: "gameMasterAddress", + type: "address", + }, + ], + internalType: "struct World[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "string", + name: "description", + type: "string", + }, + ], + name: "modifyWorldDescription", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "price", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + ], + name: "removeWorld", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "withdrawTips", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "worlds", + outputs: [ + { + internalType: "string", + name: "vibe", + type: "string", + }, + { + internalType: "string", + name: "gameMasterName", + type: "string", + }, + { + internalType: "string", + name: "gameMasterTwitterHandle", + type: "string", + }, + { + internalType: "string", + name: "description", + type: "string", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "address", + name: "gameMasterAddress", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + stateMutability: "payable", + type: "receive", + }, + ], + inheritedFunctions: {}, + }, BuyMeACoffee: { address: "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", abi: [ @@ -330,6 +609,25 @@ const deployedContracts = { name: "GreetingChange", type: "event", }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "user", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "number", + type: "uint256", + }, + ], + name: "NumberUpdated", + type: "event", + }, { inputs: [], name: "greeting", @@ -382,6 +680,19 @@ const deployedContracts = { stateMutability: "payable", type: "function", }, + { + inputs: [ + { + internalType: "uint256", + name: "_number", + type: "uint256", + }, + ], + name: "storeNumber", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, { inputs: [], name: "totalCounter", @@ -414,6 +725,25 @@ const deployedContracts = { stateMutability: "view", type: "function", }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "userNumbers", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [], name: "withdraw", diff --git a/yarn.lock b/yarn.lock index 5a19760..c1f4bb3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,6 +33,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.0.0": + version: 7.24.2 + resolution: "@babel/code-frame@npm:7.24.2" + dependencies: + "@babel/highlight": ^7.24.2 + picocolors: ^1.0.0 + checksum: 70e867340cfe09ca5488b2f36372c45cabf43c79a5b6426e6df5ef0611ff5dfa75a57dda841895693de6008f32c21a7c97027a8c7bcabd63a7d17416cbead6f8 + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.22.13": version: 7.22.13 resolution: "@babel/code-frame@npm:7.22.13" @@ -115,6 +125,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.24.5": + version: 7.24.5 + resolution: "@babel/helper-validator-identifier@npm:7.24.5" + checksum: 75d6f9f475c08f3be87bae4953e9b8d8c72983e16ed2860870b328d048cb20dccb4fcbf85eacbdd817ea1efbb38552a6db9046e2e37bfe13bdec44ac8939024c + languageName: node + linkType: hard + "@babel/highlight@npm:^7.22.13": version: 7.22.20 resolution: "@babel/highlight@npm:7.22.20" @@ -126,6 +143,18 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.24.2": + version: 7.24.5 + resolution: "@babel/highlight@npm:7.24.5" + dependencies: + "@babel/helper-validator-identifier": ^7.24.5 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: eece0e63e9210e902f1ee88f15cabfa31d2693bd2e56806eb849478b859d274c24477081c649cee6a241c4aed7da6f3e05c7afa5c3cd70094006ed095292b0d0 + languageName: node + linkType: hard + "@babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.22.15": version: 7.23.0 resolution: "@babel/parser@npm:7.23.0" @@ -144,6 +173,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.5.5": + version: 7.24.5 + resolution: "@babel/runtime@npm:7.24.5" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: 755383192f3ac32ba4c62bd4f1ae92aed5b82d2c6665f39eb28fa94546777cf5c63493ea92dd03f1c2e621b17e860f190c056684b7f234270fdc91e29beda063 + languageName: node + linkType: hard + "@babel/template@npm:^7.22.15": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" @@ -194,6 +232,21 @@ __metadata: languageName: node linkType: hard +"@chainlink/contracts@npm:^1.1.0": + version: 1.1.0 + resolution: "@chainlink/contracts@npm:1.1.0" + dependencies: + "@changesets/changelog-github": ^0.4.8 + "@changesets/cli": ~2.26.2 + "@eth-optimism/contracts": 0.6.0 + "@openzeppelin/contracts": 4.9.3 + "@openzeppelin/contracts-upgradeable": 4.9.3 + "@scroll-tech/contracts": 0.1.0 + semver: ^7.6.0 + checksum: 99be0045648c1fa3fffb76822bb8b4e9893077f6ad7d384aee421f465bf6d7d751b5375a66f4232d6a0a11f490c85c85bbd9f63c5744344050bb303a4859acfc + languageName: node + linkType: hard + "@chainsafe/as-sha256@npm:^0.3.1": version: 0.3.1 resolution: "@chainsafe/as-sha256@npm:0.3.1" @@ -240,6 +293,263 @@ __metadata: languageName: node linkType: hard +"@changesets/apply-release-plan@npm:^6.1.4": + version: 6.1.4 + resolution: "@changesets/apply-release-plan@npm:6.1.4" + dependencies: + "@babel/runtime": ^7.20.1 + "@changesets/config": ^2.3.1 + "@changesets/get-version-range-type": ^0.3.2 + "@changesets/git": ^2.0.0 + "@changesets/types": ^5.2.1 + "@manypkg/get-packages": ^1.1.3 + detect-indent: ^6.0.0 + fs-extra: ^7.0.1 + lodash.startcase: ^4.4.0 + outdent: ^0.5.0 + prettier: ^2.7.1 + resolve-from: ^5.0.0 + semver: ^7.5.3 + checksum: d386aee70c5483c97d964c6fa1191878005b7050d34b2e1e4a1ad66d9ad44f8f20d1c884e01e770b954bd2d4364f935510e53ae896212669f67e5c37b2a610c7 + languageName: node + linkType: hard + +"@changesets/assemble-release-plan@npm:^5.2.4": + version: 5.2.4 + resolution: "@changesets/assemble-release-plan@npm:5.2.4" + dependencies: + "@babel/runtime": ^7.20.1 + "@changesets/errors": ^0.1.4 + "@changesets/get-dependents-graph": ^1.3.6 + "@changesets/types": ^5.2.1 + "@manypkg/get-packages": ^1.1.3 + semver: ^7.5.3 + checksum: 32f443a0afec3d5a4afc68c8de32e8ff88531ea24976b50583b1d6870d71cec2729f27952af82854eb54e2ad0a619872d211d654c596ee0eb42c83ab54ad15ae + languageName: node + linkType: hard + +"@changesets/changelog-git@npm:^0.1.14": + version: 0.1.14 + resolution: "@changesets/changelog-git@npm:0.1.14" + dependencies: + "@changesets/types": ^5.2.1 + checksum: 60b45bb899e66cec669ab3884d5d18550cd30bf5a8b06f335eb72aa6c9e018dd3e0187e4df61c91a22076153e346b735b792f0e9c6186e6245b1b7aec2fc42d4 + languageName: node + linkType: hard + +"@changesets/changelog-github@npm:^0.4.8": + version: 0.4.8 + resolution: "@changesets/changelog-github@npm:0.4.8" + dependencies: + "@changesets/get-github-info": ^0.5.2 + "@changesets/types": ^5.2.1 + dotenv: ^8.1.0 + checksum: 8a357cc08757e0eeca267ee05141f68bef936582abef8b78a5d30d99f5a86e41b7d3debba70992b73b2f57b0fc6201ec1cc3c65116930167ee3197b427b865c5 + languageName: node + linkType: hard + +"@changesets/cli@npm:~2.26.2": + version: 2.26.2 + resolution: "@changesets/cli@npm:2.26.2" + dependencies: + "@babel/runtime": ^7.20.1 + "@changesets/apply-release-plan": ^6.1.4 + "@changesets/assemble-release-plan": ^5.2.4 + "@changesets/changelog-git": ^0.1.14 + "@changesets/config": ^2.3.1 + "@changesets/errors": ^0.1.4 + "@changesets/get-dependents-graph": ^1.3.6 + "@changesets/get-release-plan": ^3.0.17 + "@changesets/git": ^2.0.0 + "@changesets/logger": ^0.0.5 + "@changesets/pre": ^1.0.14 + "@changesets/read": ^0.5.9 + "@changesets/types": ^5.2.1 + "@changesets/write": ^0.2.3 + "@manypkg/get-packages": ^1.1.3 + "@types/is-ci": ^3.0.0 + "@types/semver": ^7.5.0 + ansi-colors: ^4.1.3 + chalk: ^2.1.0 + enquirer: ^2.3.0 + external-editor: ^3.1.0 + fs-extra: ^7.0.1 + human-id: ^1.0.2 + is-ci: ^3.0.1 + meow: ^6.0.0 + outdent: ^0.5.0 + p-limit: ^2.2.0 + preferred-pm: ^3.0.0 + resolve-from: ^5.0.0 + semver: ^7.5.3 + spawndamnit: ^2.0.0 + term-size: ^2.1.0 + tty-table: ^4.1.5 + bin: + changeset: bin.js + checksum: fc7b5bf319b19abed7a8d33a9fbd9ce49108af61c9c51920f609a49cb0c557f0b998711250d0cac149d0bed8a522f3109c4d8b0dda65b96ff2f823d16ca2f972 + languageName: node + linkType: hard + +"@changesets/config@npm:^2.3.1": + version: 2.3.1 + resolution: "@changesets/config@npm:2.3.1" + dependencies: + "@changesets/errors": ^0.1.4 + "@changesets/get-dependents-graph": ^1.3.6 + "@changesets/logger": ^0.0.5 + "@changesets/types": ^5.2.1 + "@manypkg/get-packages": ^1.1.3 + fs-extra: ^7.0.1 + micromatch: ^4.0.2 + checksum: 8af58e3add4751ac8ce2c01f026ac8843b8d1c07c9a3df6518496eaef67f56458a84cad310763c588f7eccbf6831afbf280df7e05e78b294027b6b847be3d0cc + languageName: node + linkType: hard + +"@changesets/errors@npm:^0.1.4": + version: 0.1.4 + resolution: "@changesets/errors@npm:0.1.4" + dependencies: + extendable-error: ^0.1.5 + checksum: 10734f1379715bf5a70b566dd42b50a75964d76f382bb67332776614454deda6d04a43dd7e727cd7cba56d7f2f7c95a07c7c0a19dd5d64fb1980b28322840733 + languageName: node + linkType: hard + +"@changesets/get-dependents-graph@npm:^1.3.6": + version: 1.3.6 + resolution: "@changesets/get-dependents-graph@npm:1.3.6" + dependencies: + "@changesets/types": ^5.2.1 + "@manypkg/get-packages": ^1.1.3 + chalk: ^2.1.0 + fs-extra: ^7.0.1 + semver: ^7.5.3 + checksum: d2cbbc5041063b939899502d1b264a0d9edb655acefd7f6197883229156bb7cfd1ace642ae4a1f7f7b432f2c51429f5dc9851ff5a9ed47f1c0159916e66627a9 + languageName: node + linkType: hard + +"@changesets/get-github-info@npm:^0.5.2": + version: 0.5.2 + resolution: "@changesets/get-github-info@npm:0.5.2" + dependencies: + dataloader: ^1.4.0 + node-fetch: ^2.5.0 + checksum: 067e07eeaecdbedbd1c715513c4aa6206a941bd1d3af292d067792808c6fa6644caad2b35fba614a44892559c031c234df8028f8d2abd4cb2682d48080ef5df3 + languageName: node + linkType: hard + +"@changesets/get-release-plan@npm:^3.0.17": + version: 3.0.17 + resolution: "@changesets/get-release-plan@npm:3.0.17" + dependencies: + "@babel/runtime": ^7.20.1 + "@changesets/assemble-release-plan": ^5.2.4 + "@changesets/config": ^2.3.1 + "@changesets/pre": ^1.0.14 + "@changesets/read": ^0.5.9 + "@changesets/types": ^5.2.1 + "@manypkg/get-packages": ^1.1.3 + checksum: 8a0e3794d0f1e6220d173dbec96352ad69b585d013c3183888ca598dfdfcaa8a5ac3f7f36d5c511575cdc3559c2ad6f8cecfaa16ba9c24380899a81daa7af924 + languageName: node + linkType: hard + +"@changesets/get-version-range-type@npm:^0.3.2": + version: 0.3.2 + resolution: "@changesets/get-version-range-type@npm:0.3.2" + checksum: b7ee7127c472a3886906ca6db336ac11233a5e75abc882084bfb4794e79a8936e3faceec3c04bf61c26453cd7f74278d9bf22aea4cdca8c1cd992591925b3c9b + languageName: node + linkType: hard + +"@changesets/git@npm:^2.0.0": + version: 2.0.0 + resolution: "@changesets/git@npm:2.0.0" + dependencies: + "@babel/runtime": ^7.20.1 + "@changesets/errors": ^0.1.4 + "@changesets/types": ^5.2.1 + "@manypkg/get-packages": ^1.1.3 + is-subdir: ^1.1.1 + micromatch: ^4.0.2 + spawndamnit: ^2.0.0 + checksum: 3820b7b689bbe8dfb93222c766bee214e68a45f07b2b5c8056891f9ffe6f1e369c0f84388246a9eea5317b496ae80ffd1508319190f79c359f060ebf8ccb7b13 + languageName: node + linkType: hard + +"@changesets/logger@npm:^0.0.5": + version: 0.0.5 + resolution: "@changesets/logger@npm:0.0.5" + dependencies: + chalk: ^2.1.0 + checksum: bfec3cd9122b00c0ec25e96730f771ffd662ef3906d571bad1e4e9993f9d54d357d3eaf074b3dfaa4e23af759ce68efa2a97d8b845b0d8c951df5d21c6dfdff5 + languageName: node + linkType: hard + +"@changesets/parse@npm:^0.3.16": + version: 0.3.16 + resolution: "@changesets/parse@npm:0.3.16" + dependencies: + "@changesets/types": ^5.2.1 + js-yaml: ^3.13.1 + checksum: 475f808ac8d33ec90af3914d55af1da8eeb9336d6cab7dd9e5be74af844f0ec04f4a67d5237a1d3284a468e0c9198e2be01d0e5870a1b28e63bc240f5f1ffea9 + languageName: node + linkType: hard + +"@changesets/pre@npm:^1.0.14": + version: 1.0.14 + resolution: "@changesets/pre@npm:1.0.14" + dependencies: + "@babel/runtime": ^7.20.1 + "@changesets/errors": ^0.1.4 + "@changesets/types": ^5.2.1 + "@manypkg/get-packages": ^1.1.3 + fs-extra: ^7.0.1 + checksum: 6b849bd6f916476a5b5664bc4286020bee506985c82f723a757fa4e681b0b7129db81751f16072ac55a980ffd83a4b234d6b8d0f8b6bc889aa0c0fd5377431e8 + languageName: node + linkType: hard + +"@changesets/read@npm:^0.5.9": + version: 0.5.9 + resolution: "@changesets/read@npm:0.5.9" + dependencies: + "@babel/runtime": ^7.20.1 + "@changesets/git": ^2.0.0 + "@changesets/logger": ^0.0.5 + "@changesets/parse": ^0.3.16 + "@changesets/types": ^5.2.1 + chalk: ^2.1.0 + fs-extra: ^7.0.1 + p-filter: ^2.1.0 + checksum: 0875a80829186de2da55bc0347601cc31b269d54fb6967a5093abacbbd9f949e352907b8340b61348a304228fdade670ded151327f16eea3424b5b4b2bb9888c + languageName: node + linkType: hard + +"@changesets/types@npm:^4.0.1": + version: 4.1.0 + resolution: "@changesets/types@npm:4.1.0" + checksum: 72c1f58044178ca867dd9349ecc4b7c233ce3781bb03b5b72a70c3166fbbab54a2f2cb19a81f96b4649ba004442c8734569fba238be4dd737fb4624a135c6098 + languageName: node + linkType: hard + +"@changesets/types@npm:^5.2.1": + version: 5.2.1 + resolution: "@changesets/types@npm:5.2.1" + checksum: 527dc1aa41b040fe35bcd55f7d07bec710320b179b000c429723e25b87aac18be487daf5047d4fecf2781aad78f73abff111e76e411b652f7a2e812a464c69f2 + languageName: node + linkType: hard + +"@changesets/write@npm:^0.2.3": + version: 0.2.3 + resolution: "@changesets/write@npm:0.2.3" + dependencies: + "@babel/runtime": ^7.20.1 + "@changesets/types": ^5.2.1 + fs-extra: ^7.0.1 + human-id: ^1.0.2 + prettier: ^2.7.1 + checksum: 40ad8069f9adc565b78a5f25992e31b41a12e551d94c29e1b4def49ce98871a1e358feda6536be8b363a6dba18b1226a22ecfc60fdd7bc1e74bfcf46b07f91be + languageName: node + linkType: hard + "@coinbase/wallet-sdk@npm:^3.6.6": version: 3.7.2 resolution: "@coinbase/wallet-sdk@npm:3.7.2" @@ -362,6 +672,43 @@ __metadata: languageName: node linkType: hard +"@eth-optimism/contracts@npm:0.6.0": + version: 0.6.0 + resolution: "@eth-optimism/contracts@npm:0.6.0" + dependencies: + "@eth-optimism/core-utils": 0.12.0 + "@ethersproject/abstract-provider": ^5.7.0 + "@ethersproject/abstract-signer": ^5.7.0 + peerDependencies: + ethers: ^5 + checksum: 52e9a6cc6ad9bf3ab085d3be501fa4c89e48865baa8aee01aff39c2b007b69600304c7e8f8f4e00d67396e48a0dbfe3a260437efd3a4d7216424cece52639870 + languageName: node + linkType: hard + +"@eth-optimism/core-utils@npm:0.12.0": + version: 0.12.0 + resolution: "@eth-optimism/core-utils@npm:0.12.0" + dependencies: + "@ethersproject/abi": ^5.7.0 + "@ethersproject/abstract-provider": ^5.7.0 + "@ethersproject/address": ^5.7.0 + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/constants": ^5.7.0 + "@ethersproject/contracts": ^5.7.0 + "@ethersproject/hash": ^5.7.0 + "@ethersproject/keccak256": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/providers": ^5.7.0 + "@ethersproject/rlp": ^5.7.0 + "@ethersproject/transactions": ^5.7.0 + "@ethersproject/web": ^5.7.0 + bufio: ^1.0.7 + chai: ^4.3.4 + checksum: 1c820107c44bdbb46becb1b00fd0dabb44f3ac8f54e6da7872a5a134411fad26f53b193225da55e79d6a8d7f0d01cc16a123db5d41ebaf02ca78360249a4b52a + languageName: node + linkType: hard + "@ethereumjs/rlp@npm:^4.0.1": version: 4.0.1 resolution: "@ethereumjs/rlp@npm:4.0.1" @@ -609,7 +956,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.1, @ethersproject/providers@npm:^5.7.2": +"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.0, @ethersproject/providers@npm:^5.7.1, @ethersproject/providers@npm:^5.7.2": version: 5.7.2 resolution: "@ethersproject/providers@npm:5.7.2" dependencies: @@ -916,6 +1263,32 @@ __metadata: languageName: node linkType: hard +"@manypkg/find-root@npm:^1.1.0": + version: 1.1.0 + resolution: "@manypkg/find-root@npm:1.1.0" + dependencies: + "@babel/runtime": ^7.5.5 + "@types/node": ^12.7.1 + find-up: ^4.1.0 + fs-extra: ^8.1.0 + checksum: f0fd881a5a81a351cb6561cd24117e8ee9481bbf3b6d1c7d9d10bef1f4744ca2ba3d064713e83c0a0574416d1e5b4a4c6c414aad91913c4a1c6040d87283ac50 + languageName: node + linkType: hard + +"@manypkg/get-packages@npm:^1.1.3": + version: 1.1.3 + resolution: "@manypkg/get-packages@npm:1.1.3" + dependencies: + "@babel/runtime": ^7.5.5 + "@changesets/types": ^4.0.1 + "@manypkg/find-root": ^1.1.0 + fs-extra: ^8.1.0 + globby: ^11.0.0 + read-yaml-file: ^1.1.0 + checksum: f5a756e5a659e0e1c33f48852d56826d170d5b10a3cdea89ce4fcaa77678d8799aa4004b30e1985c87b73dbc390b95bb6411b78336dd1e0db87c08c74b5c0e74 + languageName: node + linkType: hard + "@mapbox/node-pre-gyp@npm:^1.0.5": version: 1.0.11 resolution: "@mapbox/node-pre-gyp@npm:1.0.11" @@ -1540,7 +1913,14 @@ __metadata: languageName: node linkType: hard -"@openzeppelin/contracts@npm:^4.8.1": +"@openzeppelin/contracts-upgradeable@npm:4.9.3": + version: 4.9.3 + resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.3" + checksum: bda0240b1d44c913ec5a4e109c622f216c2bbd7b468d210822f75782a5f7fe0609d08bf03b78b253333625e99e507cf2f75212f1de3b274bd9fc64ae967aeec3 + languageName: node + linkType: hard + +"@openzeppelin/contracts@npm:4.9.3, @openzeppelin/contracts@npm:^4.8.1": version: 4.9.3 resolution: "@openzeppelin/contracts@npm:4.9.3" checksum: 4932063e733b35fa7669b9fe2053f69b062366c5c208b0c6cfa1ac451712100c78acff98120c3a4b88d94154c802be05d160d71f37e7d74cadbe150964458838 @@ -1763,6 +2143,13 @@ __metadata: languageName: node linkType: hard +"@scroll-tech/contracts@npm:0.1.0": + version: 0.1.0 + resolution: "@scroll-tech/contracts@npm:0.1.0" + checksum: 61aa3ca76043276dd38dfb2ed67c019fcd1bf42c8b5d33726e6addfa95cad96ba057988cc00572159c47fcdbbad6fbd1da4821c82f512f5a8704f7807820a04b + languageName: node + linkType: hard + "@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": version: 1.1.3 resolution: "@scure/base@npm:1.1.3" @@ -1827,6 +2214,7 @@ __metadata: version: 0.0.0-use.local resolution: "@se-2/hardhat@workspace:packages/hardhat" dependencies: + "@chainlink/contracts": ^1.1.0 "@ethersproject/abi": ^5.7.0 "@ethersproject/providers": ^5.7.1 "@nomicfoundation/hardhat-chai-matchers": ^2.0.3 @@ -2501,6 +2889,15 @@ __metadata: languageName: node linkType: hard +"@types/is-ci@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/is-ci@npm:3.0.4" + dependencies: + ci-info: ^3.1.0 + checksum: 5cb58dd3b64830bf2ce577017f554139cd35e3250a3feb3c2d5e5a2cb261cca909cf68faab6f31dde0c054719c7b360dd0f46d3a83a05b1e78453a9872d056c5 + languageName: node + linkType: hard + "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.9": version: 7.0.13 resolution: "@types/json-schema@npm:7.0.13" @@ -2529,6 +2926,13 @@ __metadata: languageName: node linkType: hard +"@types/minimist@npm:^1.2.0": + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 477047b606005058ab0263c4f58097136268007f320003c348794f74adedc3166ffc47c80ec3e94687787f2ab7f4e72c468223946e79892cf0fd9e25e9970a90 + languageName: node + linkType: hard + "@types/mocha@npm:^9.1.1": version: 9.1.1 resolution: "@types/mocha@npm:9.1.1" @@ -2571,7 +2975,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^12.12.54": +"@types/node@npm:^12.12.54, @types/node@npm:^12.7.1": version: 12.20.55 resolution: "@types/node@npm:12.20.55" checksum: e4f86785f4092706e0d3b0edff8dca5a13b45627e4b36700acd8dfe6ad53db71928c8dee914d4276c7fd3b6ccd829aa919811c9eb708a2c8e4c6eb3701178c37 @@ -2592,6 +2996,13 @@ __metadata: languageName: node linkType: hard +"@types/normalize-package-data@npm:^2.4.0": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 + languageName: node + linkType: hard + "@types/nprogress@npm:^0": version: 0.2.1 resolution: "@types/nprogress@npm:0.2.1" @@ -3974,7 +4385,7 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:^4.1.1": +"ansi-colors@npm:^4.1.1, ansi-colors@npm:^4.1.3": version: 4.1.3 resolution: "ansi-colors@npm:4.1.3" checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e @@ -4222,7 +4633,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.3.1": +"array.prototype.flat@npm:^1.2.3, array.prototype.flat@npm:^1.3.1": version: 1.3.2 resolution: "array.prototype.flat@npm:1.3.2" dependencies: @@ -4287,6 +4698,13 @@ __metadata: languageName: node linkType: hard +"arrify@npm:^1.0.1": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 + languageName: node + linkType: hard + "asap@npm:~2.0.6": version: 2.0.6 resolution: "asap@npm:2.0.6" @@ -4508,6 +4926,15 @@ __metadata: languageName: node linkType: hard +"better-path-resolve@npm:1.0.0": + version: 1.0.0 + resolution: "better-path-resolve@npm:1.0.0" + dependencies: + is-windows: ^1.0.0 + checksum: 5392dbe04e7fe68b944eb37961d9dfa147aaac3ee9ee3f6e13d42e2c9fbe949e68d16e896c14ee9016fa5f8e6e53ec7fd8b5f01b50a32067a7d94ac9cfb9a050 + languageName: node + linkType: hard + "big.js@npm:^5.2.2": version: 5.2.2 resolution: "big.js@npm:5.2.2" @@ -4640,6 +5067,15 @@ __metadata: languageName: node linkType: hard +"breakword@npm:^1.0.5": + version: 1.0.6 + resolution: "breakword@npm:1.0.6" + dependencies: + wcwidth: ^1.0.1 + checksum: e8a3f308c0214986e1b768ca4460a798ffe4bbe08c375576de526431a01a9738318710cc05e309486ac5809d77d9f33d957f80939a890e07be5e89baad9816f8 + languageName: node + linkType: hard + "brorand@npm:^1.1.0": version: 1.1.0 resolution: "brorand@npm:1.1.0" @@ -4765,6 +5201,13 @@ __metadata: languageName: node linkType: hard +"bufio@npm:^1.0.7": + version: 1.2.1 + resolution: "bufio@npm:1.2.1" + checksum: b6e1216f4a5877617a3580b83807d8b96c794c015bc2d5eb9e70e152dc79fe923517472bd96df3d5b8feb59a0e25e2aa3cd8a70b8f90905b92d86f2e5719ed68 + languageName: node + linkType: hard + "busboy@npm:1.6.0, busboy@npm:^1.6.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" @@ -4845,7 +5288,18 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^5.0.0": +"camelcase-keys@npm:^6.2.2": + version: 6.2.2 + resolution: "camelcase-keys@npm:6.2.2" + dependencies: + camelcase: ^5.3.1 + map-obj: ^4.0.0 + quick-lru: ^4.0.1 + checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a + languageName: node + linkType: hard + +"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b @@ -4907,6 +5361,21 @@ __metadata: languageName: node linkType: hard +"chai@npm:^4.3.4": + version: 4.4.1 + resolution: "chai@npm:4.4.1" + dependencies: + assertion-error: ^1.1.0 + check-error: ^1.0.3 + deep-eql: ^4.1.3 + get-func-name: ^2.0.2 + loupe: ^2.3.6 + pathval: ^1.1.1 + type-detect: ^4.0.8 + checksum: 9ab84f36eb8e0b280c56c6c21ca4da5933132cd8a0c89c384f1497f77953640db0bc151edd47f81748240a9fab57b78f7d925edfeedc8e8fc98016d71f40c36e + languageName: node + linkType: hard + "chai@npm:^4.3.6": version: 4.3.9 resolution: "chai@npm:4.3.9" @@ -4929,7 +5398,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.4.2": +"chalk@npm:^2.1.0, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -5051,6 +5520,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^3.1.0, ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 + languageName: node + linkType: hard + "cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": version: 1.0.4 resolution: "cipher-base@npm:1.0.4" @@ -5198,6 +5674,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" @@ -5492,6 +5979,17 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:^5.1.0": + version: 5.1.0 + resolution: "cross-spawn@npm:5.1.0" + dependencies: + lru-cache: ^4.0.1 + shebang-command: ^1.2.0 + which: ^1.2.9 + checksum: 726939c9954fc70c20e538923feaaa33bebc253247d13021737c3c7f68cdc3e0a57f720c0fe75057c0387995349f3f12e20e9bfdbf12274db28019c7ea4ec166 + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -5543,6 +6041,39 @@ __metadata: languageName: node linkType: hard +"csv-generate@npm:^3.4.3": + version: 3.4.3 + resolution: "csv-generate@npm:3.4.3" + checksum: 868dc630e8bcabf42d3d1ef22c09fb783de72d7e5929854aad0323f44059b1747edf8a2724e32fdc5008396e2ea38d5c45df0b0e3a1b506e3ab34f76f3e2fb3a + languageName: node + linkType: hard + +"csv-parse@npm:^4.16.3": + version: 4.16.3 + resolution: "csv-parse@npm:4.16.3" + checksum: 5ad7790fc31c32ca1623bad1a54906134ba44fa109e8dd2dfda440bf7e9fd93610d9076a78f45c872701bfafdf7f93c9b75500c09d7efd6611d863f1d45ec69f + languageName: node + linkType: hard + +"csv-stringify@npm:^5.6.5": + version: 5.6.5 + resolution: "csv-stringify@npm:5.6.5" + checksum: f93e1444857416081de3d86765b62e4c4f7c110974ad6bbcb0031d7db39b6624847ac9ee5705726e7011346f32f3696f27299b74b23a6c2b083adff0dd2755fe + languageName: node + linkType: hard + +"csv@npm:^5.5.3": + version: 5.5.3 + resolution: "csv@npm:5.5.3" + dependencies: + csv-generate: ^3.4.3 + csv-parse: ^4.16.3 + csv-stringify: ^5.6.5 + stream-transform: ^2.1.3 + checksum: 0decc2d0d7a0abf127f4556d6f3cef5a54015b78d348608b5e8f42256c2bd0a021f34f1efc9723b2cd162680917de4c0b3967bfb65a07305eca0827654ca727e + languageName: node + linkType: hard + "culori@npm:^3": version: 3.3.0 resolution: "culori@npm:3.3.0" @@ -5578,6 +6109,13 @@ __metadata: languageName: node linkType: hard +"dataloader@npm:^1.4.0": + version: 1.4.0 + resolution: "dataloader@npm:1.4.0" + checksum: e2c93d43afde68980efc0cd9ff48e9851116e27a9687f863e02b56d46f7e7868cc762cd6dcbaf4197e1ca850a03651510c165c2ae24b8e9843fd894002ad0e20 + languageName: node + linkType: hard + "death@npm:^1.1.0": version: 1.1.0 resolution: "death@npm:1.1.0" @@ -5624,7 +6162,17 @@ __metadata: languageName: node linkType: hard -"decamelize@npm:^1.2.0": +"decamelize-keys@npm:^1.1.0": + version: 1.1.1 + resolution: "decamelize-keys@npm:1.1.1" + dependencies: + decamelize: ^1.1.0 + map-obj: ^1.0.0 + checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 + languageName: node + linkType: hard + +"decamelize@npm:^1.1.0, decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa @@ -5652,7 +6200,7 @@ __metadata: languageName: node linkType: hard -"deep-eql@npm:^4.0.1, deep-eql@npm:^4.1.2": +"deep-eql@npm:^4.0.1, deep-eql@npm:^4.1.2, deep-eql@npm:^4.1.3": version: 4.1.3 resolution: "deep-eql@npm:4.1.3" dependencies: @@ -5801,8 +6349,15 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^1.0.3": - version: 1.0.3 +"detect-indent@npm:^6.0.0": + version: 6.1.0 + resolution: "detect-indent@npm:6.1.0" + checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d + languageName: node + linkType: hard + +"detect-libc@npm:^1.0.3": + version: 1.0.3 resolution: "detect-libc@npm:1.0.3" bin: detect-libc: ./bin/detect-libc.js @@ -5922,6 +6477,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^8.1.0": + version: 8.6.0 + resolution: "dotenv@npm:8.6.0" + checksum: 38e902c80b0666ab59e9310a3d24ed237029a7ce34d976796349765ac96b8d769f6df19090f1f471b77a25ca391971efde8a1ea63bb83111bd8bec8e5cc9b2cd + languageName: node + linkType: hard + "duplexify@npm:^4.1.2": version: 4.1.2 resolution: "duplexify@npm:4.1.2" @@ -6090,6 +6652,15 @@ __metadata: languageName: node linkType: hard +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: ^0.2.1 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + languageName: node + linkType: hard + "es-abstract@npm:^1.22.1": version: 1.22.2 resolution: "es-abstract@npm:1.22.2" @@ -7217,6 +7788,13 @@ __metadata: languageName: node linkType: hard +"extendable-error@npm:^0.1.5": + version: 0.1.7 + resolution: "extendable-error@npm:0.1.7" + checksum: 80478be7429a1675d2085f701239796bab3230ed6f2fb1b138fbabec24bea6516b7c5ceb6e9c209efcc9c089948d93715703845653535f8e8a49655066a9255e + languageName: node + linkType: hard + "external-editor@npm:^3.1.0": version: 3.1.0 resolution: "external-editor@npm:3.1.0" @@ -7414,7 +7992,7 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^4.1.0": +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" dependencies: @@ -7424,6 +8002,16 @@ __metadata: languageName: node linkType: hard +"find-yarn-workspace-root2@npm:1.2.16": + version: 1.2.16 + resolution: "find-yarn-workspace-root2@npm:1.2.16" + dependencies: + micromatch: ^4.0.2 + pkg-dir: ^4.2.0 + checksum: b4abdd37ab87c2172e2abab69ecbfed365d63232742cd1f0a165020fba1b200478e944ec2035c6aaf0ae142ac4c523cbf08670f45e59b242bcc295731b017825 + languageName: node + linkType: hard + "flat-cache@npm:^3.0.4": version: 3.1.0 resolution: "flat-cache@npm:3.1.0" @@ -7796,7 +8384,7 @@ __metadata: languageName: node linkType: hard -"get-func-name@npm:^2.0.0, get-func-name@npm:^2.0.2": +"get-func-name@npm:^2.0.0, get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": version: 2.0.2 resolution: "get-func-name@npm:2.0.2" checksum: 3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b @@ -8096,7 +8684,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.1.0": +"globby@npm:^11.0.0, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -8128,13 +8716,20 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 languageName: node linkType: hard +"grapheme-splitter@npm:^1.0.4": + version: 1.0.4 + resolution: "grapheme-splitter@npm:1.0.4" + checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 + languageName: node + linkType: hard + "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" @@ -8200,6 +8795,13 @@ __metadata: languageName: node linkType: hard +"hard-rejection@npm:^2.1.0": + version: 2.1.0 + resolution: "hard-rejection@npm:2.1.0" + checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc + languageName: node + linkType: hard + "hardhat-deploy-ethers@npm:^0.4.1": version: 0.4.1 resolution: "hardhat-deploy-ethers@npm:0.4.1" @@ -8481,6 +9083,13 @@ __metadata: languageName: node linkType: hard +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd + languageName: node + linkType: hard + "http-basic@npm:^8.1.1": version: 8.1.3 resolution: "http-basic@npm:8.1.3" @@ -8584,6 +9193,13 @@ __metadata: languageName: node linkType: hard +"human-id@npm:^1.0.2": + version: 1.0.2 + resolution: "human-id@npm:1.0.2" + checksum: 95ee57ffae849f008e2ef3fe6e437be8c999861b4256f18c3b194c8928670a8a149e0576917105d5fd77e5edbb621c5a4736fade20bb7bf130113c1ebc95cb74 + languageName: node + linkType: hard + "human-signals@npm:^1.1.1": version: 1.1.1 resolution: "human-signals@npm:1.1.1" @@ -8849,6 +9465,13 @@ __metadata: languageName: node linkType: hard +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + languageName: node + linkType: hard + "is-async-function@npm:^2.0.0": version: 2.0.0 resolution: "is-async-function@npm:2.0.0" @@ -8900,6 +9523,17 @@ __metadata: languageName: node linkType: hard +"is-ci@npm:^3.0.1": + version: 3.0.1 + resolution: "is-ci@npm:3.0.1" + dependencies: + ci-info: ^3.2.0 + bin: + is-ci: bin.js + checksum: 192c66dc7826d58f803ecae624860dccf1899fc1f3ac5505284c0a5cf5f889046ffeb958fa651e5725d5705c5bcb14f055b79150ea5fcad7456a9569de60260e + languageName: node + linkType: hard + "is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.9.0": version: 2.13.0 resolution: "is-core-module@npm:2.13.0" @@ -9040,6 +9674,13 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 + languageName: node + linkType: hard + "is-plain-obj@npm:^2.1.0": version: 2.1.0 resolution: "is-plain-obj@npm:2.1.0" @@ -9096,6 +9737,15 @@ __metadata: languageName: node linkType: hard +"is-subdir@npm:^1.1.1": + version: 1.2.0 + resolution: "is-subdir@npm:1.2.0" + dependencies: + better-path-resolve: 1.0.0 + checksum: 31029a383972bff4cc4f1bd1463fd04dde017e0a04ae3a6f6e08124a90c6c4656312d593101b0f38805fa3f3c8f6bc4583524bbf72c50784fa5ca0d3e5a76279 + languageName: node + linkType: hard + "is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": version: 1.0.4 resolution: "is-symbol@npm:1.0.4" @@ -9154,6 +9804,13 @@ __metadata: languageName: node linkType: hard +"is-windows@npm:^1.0.0": + version: 1.0.2 + resolution: "is-windows@npm:1.0.2" + checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 + languageName: node + linkType: hard + "is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" @@ -9338,7 +9995,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:3.x": +"js-yaml@npm:3.x, js-yaml@npm:^3.13.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.6.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: @@ -9391,6 +10048,13 @@ __metadata: languageName: node linkType: hard +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f + languageName: node + linkType: hard + "json-rpc-engine@npm:6.1.0, json-rpc-engine@npm:^6.1.0": version: 6.1.0 resolution: "json-rpc-engine@npm:6.1.0" @@ -9574,7 +10238,7 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^6.0.2": +"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b @@ -9593,6 +10257,13 @@ __metadata: languageName: node linkType: hard +"kleur@npm:^4.1.5": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 1dc476e32741acf0b1b5b0627ffd0d722e342c1b0da14de3e8ae97821327ca08f9fb944542fb3c126d90ac5f27f9d804edbe7c585bf7d12ef495d115e0f22c12 + languageName: node + linkType: hard + "language-subtag-registry@npm:~0.3.2": version: 0.3.22 resolution: "language-subtag-registry@npm:0.3.22" @@ -9768,6 +10439,18 @@ __metadata: languageName: node linkType: hard +"load-yaml-file@npm:^0.2.0": + version: 0.2.0 + resolution: "load-yaml-file@npm:0.2.0" + dependencies: + graceful-fs: ^4.1.5 + js-yaml: ^3.13.0 + pify: ^4.0.1 + strip-bom: ^3.0.0 + checksum: d86d7ec7b15a1c35b40fb0d8abe710a7de83e0c1186c1d35a7eaaf8581611828089a3e706f64560c2939762bc73f18a7b85aed9335058c640e033933cf317f11 + languageName: node + linkType: hard + "locate-path@npm:^2.0.0": version: 2.0.0 resolution: "locate-path@npm:2.0.0" @@ -9855,6 +10538,13 @@ __metadata: languageName: node linkType: hard +"lodash.startcase@npm:^4.4.0": + version: 4.4.0 + resolution: "lodash.startcase@npm:4.4.0" + checksum: c03a4a784aca653845fe09d0ef67c902b6e49288dc45f542a4ab345a9c406a6dc194c774423fa313ee7b06283950301c1221dd2a1d8ecb2dac8dfbb9ed5606b5 + languageName: node + linkType: hard + "lodash.truncate@npm:^4.4.2": version: 4.4.2 resolution: "lodash.truncate@npm:4.4.2" @@ -9921,6 +10611,15 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^2.3.6": + version: 2.3.7 + resolution: "loupe@npm:2.3.7" + dependencies: + get-func-name: ^2.0.1 + checksum: 96c058ec7167598e238bb7fb9def2f9339215e97d6685d9c1e3e4bdb33d14600e11fe7a812cf0c003dfb73ca2df374f146280b2287cae9e8d989e9d7a69a203b + languageName: node + linkType: hard + "lru-cache@npm:^10.0.2": version: 10.1.0 resolution: "lru-cache@npm:10.1.0" @@ -9928,6 +10627,16 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^4.0.1": + version: 4.1.5 + resolution: "lru-cache@npm:4.1.5" + dependencies: + pseudomap: ^1.0.2 + yallist: ^2.1.2 + checksum: 4bb4b58a36cd7dc4dcec74cbe6a8f766a38b7426f1ff59d4cf7d82a2aa9b9565cd1cb98f6ff60ce5cd174524868d7bc9b7b1c294371851356066ca9ac4cf135a + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -10006,6 +10715,20 @@ __metadata: languageName: node linkType: hard +"map-obj@npm:^1.0.0": + version: 1.0.1 + resolution: "map-obj@npm:1.0.1" + checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed + languageName: node + linkType: hard + +"map-obj@npm:^4.0.0": + version: 4.3.0 + resolution: "map-obj@npm:4.3.0" + checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e + languageName: node + linkType: hard + "markdown-table@npm:^1.1.3": version: 1.1.3 resolution: "markdown-table@npm:1.1.3" @@ -10065,6 +10788,25 @@ __metadata: languageName: node linkType: hard +"meow@npm:^6.0.0": + version: 6.1.1 + resolution: "meow@npm:6.1.1" + dependencies: + "@types/minimist": ^1.2.0 + camelcase-keys: ^6.2.2 + decamelize-keys: ^1.1.0 + hard-rejection: ^2.1.0 + minimist-options: ^4.0.2 + normalize-package-data: ^2.5.0 + read-pkg-up: ^7.0.1 + redent: ^3.0.0 + trim-newlines: ^3.0.0 + type-fest: ^0.13.1 + yargs-parser: ^18.1.3 + checksum: 77b569781145ad030be77130623d9f74d6eef0af5e0a349419d3df39bcf6d88cc25be046a7757062162a88160fb5d8604e540b5177b371d2bbc2aaf73ec01479 + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -10148,6 +10890,13 @@ __metadata: languageName: node linkType: hard +"min-indent@npm:^1.0.0": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 + languageName: node + linkType: hard + "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" @@ -10198,6 +10947,17 @@ __metadata: languageName: node linkType: hard +"minimist-options@npm:^4.0.2": + version: 4.1.0 + resolution: "minimist-options@npm:4.1.0" + dependencies: + arrify: ^1.0.1 + is-plain-obj: ^1.1.0 + kind-of: ^6.0.3 + checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e + languageName: node + linkType: hard + "minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -10308,6 +11068,13 @@ __metadata: languageName: node linkType: hard +"mixme@npm:^0.5.1": + version: 0.5.10 + resolution: "mixme@npm:0.5.10" + checksum: 51885f19847b98859645a592917f3939d6f262ba3cc1843a3d7858ac894704b054e7a94737a53163bc1e870e3ea23316ba97d3ba20e1dfd292fe74d5a318be98 + languageName: node + linkType: hard + "mkdirp@npm:0.5.5": version: 0.5.5 resolution: "mkdirp@npm:0.5.5" @@ -10718,7 +11485,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7": +"node-fetch@npm:^2.5.0, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -10818,6 +11585,18 @@ __metadata: languageName: node linkType: hard +"normalize-package-data@npm:^2.5.0": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: ^2.1.4 + resolve: ^1.10.0 + semver: 2 || 3 || 4 || 5 + validate-npm-package-license: ^3.0.1 + checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 + languageName: node + linkType: hard + "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" @@ -11145,6 +11924,13 @@ __metadata: languageName: node linkType: hard +"outdent@npm:^0.5.0": + version: 0.5.0 + resolution: "outdent@npm:0.5.0" + checksum: 6e6c63dd09e9890e67ef9a0b4d35df0b0b850b2059ce3f7e19e4cc1a146b26dc5d8c45df238dbf187dfffc8bd82cd07d37c697544015680bcb9f07f29a36c678 + languageName: node + linkType: hard + "outdent@npm:^0.8.0": version: 0.8.0 resolution: "outdent@npm:0.8.0" @@ -11152,6 +11938,15 @@ __metadata: languageName: node linkType: hard +"p-filter@npm:^2.1.0": + version: 2.1.0 + resolution: "p-filter@npm:2.1.0" + dependencies: + p-map: ^2.0.0 + checksum: 76e552ca624ce2233448d68b19eec9de42b695208121998f7e011edce71d1079a83096ee6a2078fb2a59cfa8a5c999f046edf00ebf16a8e780022010b4693234 + languageName: node + linkType: hard + "p-finally@npm:^2.0.0": version: 2.0.1 resolution: "p-finally@npm:2.0.1" @@ -11222,6 +12017,13 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^2.0.0": + version: 2.1.0 + resolution: "p-map@npm:2.1.0" + checksum: 9e3ad3c9f6d75a5b5661bcad78c91f3a63849189737cd75e4f1225bf9ac205194e5c44aac2ef6f09562b1facdb9bd1425584d7ac375bfaa17b3f1a142dab936d + languageName: node + linkType: hard + "p-map@npm:^4.0.0": version: 4.0.0 resolution: "p-map@npm:4.0.0" @@ -11261,6 +12063,18 @@ __metadata: languageName: node linkType: hard +"parse-json@npm:^5.0.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": ^7.0.0 + error-ex: ^1.3.1 + json-parse-even-better-errors: ^2.3.0 + lines-and-columns: ^1.1.6 + checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + languageName: node + linkType: hard + "parse-ms@npm:^2.1.0": version: 2.1.0 resolution: "parse-ms@npm:2.1.0" @@ -11504,6 +12318,15 @@ __metadata: languageName: node linkType: hard +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: ^4.0.0 + checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + languageName: node + linkType: hard + "pkg-types@npm:^1.0.3": version: 1.0.3 resolution: "pkg-types@npm:1.0.3" @@ -11621,6 +12444,18 @@ __metadata: languageName: node linkType: hard +"preferred-pm@npm:^3.0.0": + version: 3.1.3 + resolution: "preferred-pm@npm:3.1.3" + dependencies: + find-up: ^5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: ^4.0.0 + which-pm: 2.0.0 + checksum: 3aa768985487c17d08936670b34939c21b5740e35186312d394c09f2c65fb1938fd4e074d0de5d80091c6a154f4adfa566b614fd4971caf43082c2a119e59d6b + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -11644,7 +12479,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.3.1, prettier@npm:^2.8.4": +"prettier@npm:^2.3.1, prettier@npm:^2.7.1, prettier@npm:^2.8.4": version: 2.8.8 resolution: "prettier@npm:2.8.8" bin: @@ -11727,6 +12562,13 @@ __metadata: languageName: node linkType: hard +"pseudomap@npm:^1.0.2": + version: 1.0.2 + resolution: "pseudomap@npm:1.0.2" + checksum: 856c0aae0ff2ad60881168334448e898ad7a0e45fe7386d114b150084254c01e200c957cf378378025df4e052c7890c5bd933939b0e0d2ecfcc1dc2f0b2991f5 + languageName: node + linkType: hard + "psl@npm:^1.1.28": version: 1.9.0 resolution: "psl@npm:1.9.0" @@ -11828,6 +12670,13 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^4.0.1": + version: 4.0.1 + resolution: "quick-lru@npm:4.0.1" + checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 + languageName: node + linkType: hard + "radix3@npm:^1.1.0": version: 1.1.0 resolution: "radix3@npm:1.1.0" @@ -11981,6 +12830,41 @@ __metadata: languageName: node linkType: hard +"read-pkg-up@npm:^7.0.1": + version: 7.0.1 + resolution: "read-pkg-up@npm:7.0.1" + dependencies: + find-up: ^4.1.0 + read-pkg: ^5.2.0 + type-fest: ^0.8.1 + checksum: e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 + languageName: node + linkType: hard + +"read-pkg@npm:^5.2.0": + version: 5.2.0 + resolution: "read-pkg@npm:5.2.0" + dependencies: + "@types/normalize-package-data": ^2.4.0 + normalize-package-data: ^2.5.0 + parse-json: ^5.0.0 + type-fest: ^0.6.0 + checksum: eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 + languageName: node + linkType: hard + +"read-yaml-file@npm:^1.1.0": + version: 1.1.0 + resolution: "read-yaml-file@npm:1.1.0" + dependencies: + graceful-fs: ^4.1.5 + js-yaml: ^3.6.1 + pify: ^4.0.1 + strip-bom: ^3.0.0 + checksum: 41ee5f075507ef0403328dd54e225a61c3149f915675ce7fd0fd791ddcce2e6c30a9fe0f76ffa7a465c1c157b9b4ad8ded1dcf47dc3b396103eeb013490bbc2e + languageName: node + linkType: hard + "readable-stream@npm:^2.2.2": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" @@ -12059,6 +12943,16 @@ __metadata: languageName: node linkType: hard +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: ^4.0.0 + strip-indent: ^3.0.0 + checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b + languageName: node + linkType: hard + "redis-errors@npm:^1.0.0, redis-errors@npm:^1.2.0": version: 1.2.0 resolution: "redis-errors@npm:1.2.0" @@ -12262,6 +13156,19 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^1.10.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c + languageName: node + linkType: hard + "resolve@npm:^2.0.0-next.4": version: 2.0.0-next.4 resolution: "resolve@npm:2.0.0-next.4" @@ -12304,6 +13211,19 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@^1.10.0#~builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 + languageName: node + linkType: hard + "resolve@patch:resolve@^2.0.0-next.4#~builtin": version: 2.0.0-next.4 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=07638b" @@ -12596,6 +13516,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0, semver@npm:^5.7.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 + languageName: node + linkType: hard + "semver@npm:6.3.1, semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -12616,15 +13545,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^5.5.0, semver@npm:^5.7.0": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 - languageName: node - linkType: hard - "semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" @@ -12636,6 +13556,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.5.3, semver@npm:^7.6.0": + version: 7.6.2 + resolution: "semver@npm:7.6.2" + bin: + semver: bin/semver.js + checksum: 40f6a95101e8d854357a644da1b8dd9d93ce786d5c6a77227bc69dbb17bea83d0d1d1d7c4cd5920a6df909f48e8bd8a5909869535007f90278289f2451d0292d + languageName: node + linkType: hard + "serialize-javascript@npm:6.0.0": version: 6.0.0 resolution: "serialize-javascript@npm:6.0.0" @@ -12727,6 +13656,15 @@ __metadata: languageName: node linkType: hard +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: ^1.0.0 + checksum: 9eed1750301e622961ba5d588af2212505e96770ec376a37ab678f965795e995ade7ed44910f5d3d3cb5e10165a1847f52d3348c64e146b8be922f7707958908 + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -12736,6 +13674,13 @@ __metadata: languageName: node linkType: hard +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: 404c5a752cd40f94591dfd9346da40a735a05139dac890ffc229afba610854d8799aaa52f87f7e0c94c5007f2c6af55bdcaeb584b56691926c5eaf41dc8f1372 + languageName: node + linkType: hard + "shebang-regex@npm:^3.0.0": version: 3.0.0 resolution: "shebang-regex@npm:3.0.0" @@ -12823,6 +13768,22 @@ __metadata: languageName: node linkType: hard +"smartwrap@npm:^2.0.2": + version: 2.0.2 + resolution: "smartwrap@npm:2.0.2" + dependencies: + array.prototype.flat: ^1.2.3 + breakword: ^1.0.5 + grapheme-splitter: ^1.0.4 + strip-ansi: ^6.0.0 + wcwidth: ^1.0.1 + yargs: ^15.1.0 + bin: + smartwrap: src/terminal-adapter.js + checksum: 1a6833eb1c3d8488b036df66dcab37dcdda5270bb9629c471155785c09ee1b591177a9774c588c43f8fa28833204500019265da2ffed28ac7bbf4589b943d2fa + languageName: node + linkType: hard + "socks-proxy-agent@npm:^7.0.0": version: 7.0.0 resolution: "socks-proxy-agent@npm:7.0.0" @@ -12944,6 +13905,50 @@ __metadata: languageName: node linkType: hard +"spawndamnit@npm:^2.0.0": + version: 2.0.0 + resolution: "spawndamnit@npm:2.0.0" + dependencies: + cross-spawn: ^5.1.0 + signal-exit: ^3.0.2 + checksum: c74b5e264ee5bc13d55692fd422d74c282e4607eb04ac64d19d06796718d89b14921620fa4237ec5635e7acdff21461670ff19850f210225410a353cad0d7fed + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: ^3.0.0 + spdx-license-ids: ^3.0.0 + checksum: e9ae98d22f69c88e7aff5b8778dc01c361ef635580e82d29e5c60a6533cc8f4d820803e67d7432581af0cc4fb49973125076ee3b90df191d153e223c004193b2 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: bb127d6e2532de65b912f7c99fc66097cdea7d64c10d3ec9b5e96524dbbd7d20e01cba818a6ddb2ae75e62bb0c63d5e277a7e555a85cbc8ab40044984fa4ae15 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: ^2.1.0 + spdx-license-ids: ^3.0.0 + checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.17 + resolution: "spdx-license-ids@npm:3.0.17" + checksum: 0aba5d16292ff604dd20982200e23b4d425f6ba364765039bdbde2f6c956b9909fce1ad040a897916a5f87388e85e001f90cb64bf706b6e319f3908cfc445a59 + languageName: node + linkType: hard + "split-on-first@npm:^1.0.0": version: 1.1.0 resolution: "split-on-first@npm:1.1.0" @@ -13083,6 +14088,15 @@ __metadata: languageName: node linkType: hard +"stream-transform@npm:^2.1.3": + version: 2.1.3 + resolution: "stream-transform@npm:2.1.3" + dependencies: + mixme: ^0.5.1 + checksum: 26ce872a6812d5c784fa1f042bfd403644bc1c019f64627b5012c4544830a5570bef98b47225b38120c5878b326f3d1a213cd999a2285c98b536e5e202ca5bdf + languageName: node + linkType: hard + "streamsearch@npm:^1.1.0": version: 1.1.0 resolution: "streamsearch@npm:1.1.0" @@ -13288,6 +14302,15 @@ __metadata: languageName: node linkType: hard +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: ^1.0.0 + checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 + languageName: node + linkType: hard + "strip-json-comments@npm:2.0.1": version: 2.0.1 resolution: "strip-json-comments@npm:2.0.1" @@ -13516,6 +14539,13 @@ __metadata: languageName: node linkType: hard +"term-size@npm:^2.1.0": + version: 2.2.1 + resolution: "term-size@npm:2.2.1" + checksum: 1ed981335483babc1e8206f843e06bd2bf89b85f0bf5a9a9d928033a0fcacdba183c03ba7d91814643015543ba002f1339f7112402a21da8f24b6c56b062a5a9 + languageName: node + linkType: hard + "text-encoding-utf-8@npm:^1.0.2": version: 1.0.2 resolution: "text-encoding-utf-8@npm:1.0.2" @@ -13685,6 +14715,13 @@ __metadata: languageName: node linkType: hard +"trim-newlines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-newlines@npm:3.0.1" + checksum: b530f3fadf78e570cf3c761fb74fef655beff6b0f84b29209bac6c9622db75ad1417f4a7b5d54c96605dcd72734ad44526fef9f396807b90839449eb543c6206 + languageName: node + linkType: hard + "ts-api-utils@npm:^1.0.1": version: 1.0.3 resolution: "ts-api-utils@npm:1.0.3" @@ -13830,6 +14867,23 @@ __metadata: languageName: node linkType: hard +"tty-table@npm:^4.1.5": + version: 4.2.3 + resolution: "tty-table@npm:4.2.3" + dependencies: + chalk: ^4.1.2 + csv: ^5.5.3 + kleur: ^4.1.5 + smartwrap: ^2.0.2 + strip-ansi: ^6.0.1 + wcwidth: ^1.0.1 + yargs: ^17.7.1 + bin: + tty-table: adapters/terminal-adapter.js + checksum: 2d6c429dc91c308cd1c8d0f2e102e08bcc10af21bc99b89179fb414dd0edd6a686026ff53111dfd3a814841bbbb44c55cd827e5a7748f35182c62f13fef5a169 + languageName: node + linkType: hard + "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -13878,13 +14932,20 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:^4.0.0, type-detect@npm:^4.0.5": +"type-detect@npm:^4.0.0, type-detect@npm:^4.0.5, type-detect@npm:^4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 languageName: node linkType: hard +"type-fest@npm:^0.13.1": + version: 0.13.1 + resolution: "type-fest@npm:0.13.1" + checksum: e6bf2e3c449f27d4ef5d56faf8b86feafbc3aec3025fc9a5fbe2db0a2587c44714521f9c30d8516a833c8c506d6263f5cc11267522b10c6ccdb6cc55b0a9d1c4 + languageName: node + linkType: hard + "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" @@ -13899,6 +14960,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.6.0": + version: 0.6.0 + resolution: "type-fest@npm:0.6.0" + checksum: b2188e6e4b21557f6e92960ec496d28a51d68658018cba8b597bd3ef757721d1db309f120ae987abeeda874511d14b776157ff809f23c6d1ce8f83b9b2b7d60f + languageName: node + linkType: hard + "type-fest@npm:^0.7.1": version: 0.7.1 resolution: "type-fest@npm:0.7.1" @@ -13906,6 +14974,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.8.1": + version: 0.8.1 + resolution: "type-fest@npm:0.8.1" + checksum: d61c4b2eba24009033ae4500d7d818a94fd6d1b481a8111612ee141400d5f1db46f199c014766b9fa9b31a6a7374d96fc748c6d688a78a3ce5a33123839becb7 + languageName: node + linkType: hard + "type-fest@npm:^1.0.2": version: 1.4.0 resolution: "type-fest@npm:1.4.0" @@ -14425,6 +15500,16 @@ __metadata: languageName: node linkType: hard +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: ^3.0.0 + spdx-expression-parse: ^3.0.0 + checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad + languageName: node + linkType: hard + "valtio@npm:1.11.2": version: 1.11.2 resolution: "valtio@npm:1.11.2" @@ -14652,6 +15737,16 @@ __metadata: languageName: node linkType: hard +"which-pm@npm:2.0.0": + version: 2.0.0 + resolution: "which-pm@npm:2.0.0" + dependencies: + load-yaml-file: ^0.2.0 + path-exists: ^4.0.0 + checksum: e556635eaf237b3a101043a21c2890af045db40eac4df3575161d4fb834c2aa65456f81c60d8ea4db2d51fe5ac549d989eeabd17278767c2e4179361338ac5ce + languageName: node + linkType: hard + "which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": version: 1.1.11 resolution: "which-typed-array@npm:1.1.11" @@ -14665,7 +15760,7 @@ __metadata: languageName: node linkType: hard -"which@npm:1.3.1, which@npm:^1.1.1, which@npm:^1.3.1": +"which@npm:1.3.1, which@npm:^1.1.1, which@npm:^1.2.9, which@npm:^1.3.1": version: 1.3.1 resolution: "which@npm:1.3.1" dependencies: @@ -14908,6 +16003,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^2.1.2": + version: 2.1.2 + resolution: "yallist@npm:2.1.2" + checksum: 9ba99409209f485b6fcb970330908a6d41fa1c933f75e08250316cce19383179a6b70a7e0721b89672ebb6199cc377bf3e432f55100da6a7d6e11902b0a642cb + languageName: node + linkType: hard + "yallist@npm:^3.0.0, yallist@npm:^3.0.2, yallist@npm:^3.1.1": version: 3.1.1 resolution: "yallist@npm:3.1.1" @@ -14953,7 +16055,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^18.1.2": +"yargs-parser@npm:^18.1.2, yargs-parser@npm:^18.1.3": version: 18.1.3 resolution: "yargs-parser@npm:18.1.3" dependencies: @@ -14970,6 +16072,13 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + languageName: node + linkType: hard + "yargs-unparser@npm:1.6.0": version: 1.6.0 resolution: "yargs-unparser@npm:1.6.0" @@ -15026,7 +16135,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^15.3.1": +"yargs@npm:^15.1.0, yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" dependencies: @@ -15045,6 +16154,21 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^17.7.1": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a + languageName: node + linkType: hard + "yauzl-clone@npm:^1.0.4": version: 1.0.4 resolution: "yauzl-clone@npm:1.0.4" From d933fcceecf7e1197362415b886afdd567ef7066 Mon Sep 17 00:00:00 2001 From: TF Date: Tue, 14 May 2024 18:12:10 -0500 Subject: [PATCH 3/5] Andrej Chainlink Office Hours --- .../hardhat/contracts/CeptorCharacterGenerator.sol | 3 ++- packages/hardhat/contracts/readme.md | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 packages/hardhat/contracts/readme.md diff --git a/packages/hardhat/contracts/CeptorCharacterGenerator.sol b/packages/hardhat/contracts/CeptorCharacterGenerator.sol index 0a7cce4..95fadec 100644 --- a/packages/hardhat/contracts/CeptorCharacterGenerator.sol +++ b/packages/hardhat/contracts/CeptorCharacterGenerator.sol @@ -9,6 +9,7 @@ contract DnDCharacterGenerator is VRFConsumerBaseV2, ConfirmedOwner { VRFCoordinatorV2Interface COORDINATOR; uint64 s_subscriptionId; bytes32 keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + // forge-test gas report & gas limit plugin on hardhat uint32 callbackGasLimit = 100000; uint16 requestConfirmations = 3; uint32 numWords = 7; // 6 ability scores + 1 for class @@ -52,7 +53,7 @@ contract DnDCharacterGenerator is VRFConsumerBaseV2, ConfirmedOwner { function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override { address owner = requestToSender[requestId]; uint256[6] memory abilities; - for (uint i = 0; i < 6; i++) { + for (uint i = 0; i < 6; ++i) { // ++i saves 2 gas abilities[i] = (randomWords[i] % 16) + 3; // Score range: 3-18 } characters[owner] = Character({ diff --git a/packages/hardhat/contracts/readme.md b/packages/hardhat/contracts/readme.md new file mode 100644 index 0000000..93eb659 --- /dev/null +++ b/packages/hardhat/contracts/readme.md @@ -0,0 +1,14 @@ +# Games Contracts + +1. [Game World Generator](BuyMeACeptor.sol) - A contract that generates a game world based on a user's vibe and number of players. The world is generated with a visual of the planet, scenarios, locations, descriptions, maps, denizens, secrets, goals, and players. Each world has its own blockchain. Creating a World costs 10 gameTokens. when creating a game, i want to have my own world or play with others. each world should be locked to a blockchain. 10 gT to make a world. 5 gT to join one as a GM, 2 gT to join as player. + +Inside worlds, there are games +inside games there are schedules +inside schedules there are sessions +(and we verify who shows up) + +1. [Character Generator](CeptorCharacterGenerator.sol) - A contract that generates a character for a user in the game world. The character is generated with abilities, class, name, alignment, and background. Each character has its own unique attributes. Creating a Character is only allowed by the owner of the contract. This is a mistake, and will be replaced in upgrade to VRF2.5 + +2. Is the World Generator deploying a World contract? Yes. Is the World contract tracking all its games, or deploying each game as its own contract which tracks the sessions. Verifiable Truth. + +3. NPC Generator - Unlike the PCG which is usable by any Verified Credential having hooty in their hey hey. The NPCG is a contract that generates a non-player character for a user in the game world. The character is generated with abilities, class, name, alignment, hometown, and background. Each character has its own unique attributes. Creating a Character is only allowed by the owner of the contract. VRF2.5 because reusable code choices. \ No newline at end of file From 43b41f2fc766a74a2bde72ad6619c90b6f9d0b90 Mon Sep 17 00:00:00 2001 From: VinceLindsey <98496148+VinceLindsey@users.noreply.github.com> Date: Sun, 19 May 2024 10:47:09 -0500 Subject: [PATCH 4/5] initial skeleton commit --- package.json | 3 +- packages/backend/README.md | 1 + packages/backend/package.json | 17 + packages/backend/src/app.ts | 13 + .../src/controllers/campaignController.ts | 57 ++ .../src/controllers/characterController.ts | 57 ++ .../src/controllers/notificationController.ts | 0 .../src/controllers/sessionController.ts | 57 ++ .../src/controllers/worldController.ts | 57 ++ packages/backend/src/models/Campaign.ts | 18 + packages/backend/src/models/Character.ts | 16 + packages/backend/src/models/Notification.ts | 0 packages/backend/src/models/Session.ts | 11 + packages/backend/src/models/World.ts | 11 + packages/backend/src/routes/campaignRoutes.ts | 12 + .../backend/src/routes/characterRoutes.ts | 12 + .../backend/src/routes/notificationRoutes.ts | 0 packages/backend/src/routes/sessionRoutes.ts | 12 + packages/backend/src/routes/worldRoutes.ts | 12 + packages/backend/src/server.ts | 6 + packages/backend/tsconfig.json | 13 + packages/nextjs/components/CampaignForm.tsx | 0 packages/nextjs/components/CampaignList.tsx | 0 packages/nextjs/components/CharacterForm.tsx | 0 packages/nextjs/components/CharacterList.tsx | 0 packages/nextjs/components/sessionForm.tsx | 0 packages/nextjs/components/sessionList.tsx | 0 packages/nextjs/components/worldForm.tsx | 0 packages/nextjs/components/worldList.tsx | 0 .../pages/campaigns/campaignDetails.tsx | 0 .../nextjs/pages/campaigns/createCampaign.tsx | 0 .../pages/characters/characterDetails.tsx | 0 .../pages/characters/createCharacter.tsx | 0 packages/nextjs/pages/index.tsx | 0 .../nextjs/pages/sessions/createSession.tsx | 0 .../nextjs/pages/sessions/sessionDetails.tsx | 0 packages/nextjs/pages/worlds/createWorld.tsx | 0 packages/nextjs/pages/worlds/worldDetails.tsx | 0 plan.md | 82 ++ yarn.lock | 795 +++++++++++++++++- 40 files changed, 1249 insertions(+), 13 deletions(-) create mode 100644 packages/backend/README.md create mode 100644 packages/backend/package.json create mode 100644 packages/backend/src/app.ts create mode 100644 packages/backend/src/controllers/campaignController.ts create mode 100644 packages/backend/src/controllers/characterController.ts create mode 100644 packages/backend/src/controllers/notificationController.ts create mode 100644 packages/backend/src/controllers/sessionController.ts create mode 100644 packages/backend/src/controllers/worldController.ts create mode 100644 packages/backend/src/models/Campaign.ts create mode 100644 packages/backend/src/models/Character.ts create mode 100644 packages/backend/src/models/Notification.ts create mode 100644 packages/backend/src/models/Session.ts create mode 100644 packages/backend/src/models/World.ts create mode 100644 packages/backend/src/routes/campaignRoutes.ts create mode 100644 packages/backend/src/routes/characterRoutes.ts create mode 100644 packages/backend/src/routes/notificationRoutes.ts create mode 100644 packages/backend/src/routes/sessionRoutes.ts create mode 100644 packages/backend/src/routes/worldRoutes.ts create mode 100644 packages/backend/src/server.ts create mode 100644 packages/backend/tsconfig.json create mode 100644 packages/nextjs/components/CampaignForm.tsx create mode 100644 packages/nextjs/components/CampaignList.tsx create mode 100644 packages/nextjs/components/CharacterForm.tsx create mode 100644 packages/nextjs/components/CharacterList.tsx create mode 100644 packages/nextjs/components/sessionForm.tsx create mode 100644 packages/nextjs/components/sessionList.tsx create mode 100644 packages/nextjs/components/worldForm.tsx create mode 100644 packages/nextjs/components/worldList.tsx create mode 100644 packages/nextjs/pages/campaigns/campaignDetails.tsx create mode 100644 packages/nextjs/pages/campaigns/createCampaign.tsx create mode 100644 packages/nextjs/pages/characters/characterDetails.tsx create mode 100644 packages/nextjs/pages/characters/createCharacter.tsx create mode 100644 packages/nextjs/pages/index.tsx create mode 100644 packages/nextjs/pages/sessions/createSession.tsx create mode 100644 packages/nextjs/pages/sessions/sessionDetails.tsx create mode 100644 packages/nextjs/pages/worlds/createWorld.tsx create mode 100644 packages/nextjs/pages/worlds/worldDetails.tsx create mode 100644 plan.md diff --git a/package.json b/package.json index 3e026f1..b0ba5e0 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "workspaces": { "packages": [ "packages/hardhat", - "packages/nextjs" + "packages/nextjs", + "packages/backend" ] }, "scripts": { diff --git a/packages/backend/README.md b/packages/backend/README.md new file mode 100644 index 0000000..18803d0 --- /dev/null +++ b/packages/backend/README.md @@ -0,0 +1 @@ +# backend diff --git a/packages/backend/package.json b/packages/backend/package.json new file mode 100644 index 0000000..01cd67c --- /dev/null +++ b/packages/backend/package.json @@ -0,0 +1,17 @@ +{ + "name": "backend", + "packageManager": "yarn@3.2.3", + "dependencies": { + "express": "^4.19.2", + "mongoose": "^8.3.5" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "@types/mongoose": "^5.11.97", + "ts-node-dev": "^2.0.0", + "typescript": "^5.4.5" + }, + "scripts": { + "start": "ts-node-dev --respawn --transpile-only src/server.ts" +} +} diff --git a/packages/backend/src/app.ts b/packages/backend/src/app.ts new file mode 100644 index 0000000..d6196ac --- /dev/null +++ b/packages/backend/src/app.ts @@ -0,0 +1,13 @@ +import express from 'express'; +import campaignRoutes from './routes/campaignRoutes'; +import characterRoutes from './routes/characterRoutes'; +import sessionRoutes from './routes/sessionRoutes'; + +const app = express(); + +app.use(express.json()); +app.use('/campaigns', campaignRoutes); +app.use('/characters', characterRoutes); +app.use('/sessions', sessionRoutes); + +export default app; \ No newline at end of file diff --git a/packages/backend/src/controllers/campaignController.ts b/packages/backend/src/controllers/campaignController.ts new file mode 100644 index 0000000..2274c30 --- /dev/null +++ b/packages/backend/src/controllers/campaignController.ts @@ -0,0 +1,57 @@ +import { Request, Response } from 'express'; +import { Campaign } from '../models/Campaign'; + +export const createCampaign = async (req: Request, res: Response) => { + try { + const newCampaign = new Campaign(req.body); + await newCampaign.save(); + res.status(201).json(newCampaign); + } catch (error) { + res.status(400).json({ message: error.message }); + } +}; + +export const getCampaignById = async (req: Request, res: Response) => { + try { + const campaign = await Campaign.findById(req.params.id); + if (!campaign) { + return res.status(404).json({ message: 'Campaign not found' }); + } + res.status(200).json(campaign); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + +export const updateCampaign = async (req: Request, res: Response) => { + try { + const updatedCampaign = await Campaign.findByIdAndUpdate(req.params.id, req.body, { new: true }); + if (!updatedCampaign) { + return res.status(404).json({ message: 'Campaign not found' }); + } + res.status(200).json(updatedCampaign); + } catch (error) { + res.status(400).json({ message: error.message }); + } +}; + +export const deleteCampaign = async (req: Request, res: Response) => { + try { + const deletedCampaign = await Campaign.findByIdAndDelete(req.params.id); + if (!deletedCampaign) { + return res.status(404).json({ message: 'Campaign not found' }); + } + res.status(200).json({ message: 'Campaign deleted successfully' }); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + +export const listCampaigns = async (req: Request, res: Response) => { + try { + const campaigns = await Campaign.find({}); + res.status(200).json(campaigns); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; \ No newline at end of file diff --git a/packages/backend/src/controllers/characterController.ts b/packages/backend/src/controllers/characterController.ts new file mode 100644 index 0000000..79ddfbc --- /dev/null +++ b/packages/backend/src/controllers/characterController.ts @@ -0,0 +1,57 @@ +import { Request, Response } from 'express'; +import { Character } from '../models/Character'; + +export const createCharacter = async (req: Request, res: Response) => { + try { + const newCharacter = new Character(req.body); + await newCharacter.save(); + res.status(201).json(newCharacter); + } catch (error) { + res.status(400).json({ message: error.message }); + } +}; + +export const getCharacterById = async (req: Request, res: Response) => { + try { + const character = await Character.findById(req.params.id); + if (!character) { + return res.status(404).json({ message: 'Character not found' }); + } + res.status(200).json(character); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + +export const updateCharacter = async (req: Request, res: Response) => { + try { + const updatedCharacter = await Character.findByIdAndUpdate(req.params.id, req.body, { new: true }); + if (!updatedCharacter) { + return res.status(404).json({ message: 'Character not found' }); + } + res.status(200).json(updatedCharacter); + } catch (error) { + res.status(400).json({ message: error.message }); + } +}; + +export const deleteCharacter = async (req: Request, res: Response) => { + try { + const deletedCharacter = await Character.findByIdAndDelete(req.params.id); + if (!deletedCharacter) { + return res.status(404).json({ message: 'Character not found' }); + } + res.status(200).json({ message: 'Character deleted successfully' }); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + +export const listCharacters = async (req: Request, res: Response) => { + try { + const characters = await Character.find({}); + res.status(200).json(characters); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; \ No newline at end of file diff --git a/packages/backend/src/controllers/notificationController.ts b/packages/backend/src/controllers/notificationController.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/backend/src/controllers/sessionController.ts b/packages/backend/src/controllers/sessionController.ts new file mode 100644 index 0000000..aca87b5 --- /dev/null +++ b/packages/backend/src/controllers/sessionController.ts @@ -0,0 +1,57 @@ +import { Request, Response } from 'express'; +import { Session } from '../models/Session'; + +export const createSession = async (req: Request, res: Response) => { + try { + const newSession = new Session(req.body); + await newSession.save(); + res.status(201).json(newSession); + } catch (error) { + res.status(400).json({ message: error.message }); + } +}; + +export const getSessionById = async (req: Request, res: Response) => { + try { + const session = await Session.findById(req.params.id); + if (!session) { + return res.status(404).json({ message: 'Session not found' }); + } + res.status(200).json(session); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + +export const updateSession = async (req: Request, res: Response) => { + try { + const updatedSession = await Session.findByIdAndUpdate(req.params.id, req.body, { new: true }); + if (!updatedSession) { + return res.status(404).json({ message: 'Session not found' }); + } + res.status(200).json(updatedSession); + } catch (error) { + res.status(400).json({ message: error.message }); + } +}; + +export const deleteSession = async (req: Request, res: Response) => { + try { + const deletedSession = await Session.findByIdAndDelete(req.params.id); + if (!deletedSession) { + return res.status(404).json({ message: 'Session not found' }); + } + res.status(200).json({ message: 'Session deleted successfully' }); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + +export const listSessions = async (req: Request, res: Response) => { + try { + const sessions = await Session.find({}); + res.status(200).json(sessions); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; \ No newline at end of file diff --git a/packages/backend/src/controllers/worldController.ts b/packages/backend/src/controllers/worldController.ts new file mode 100644 index 0000000..308b8f6 --- /dev/null +++ b/packages/backend/src/controllers/worldController.ts @@ -0,0 +1,57 @@ +import { Request, Response } from 'express'; +import { World } from '../models/World'; + +export const createWorld = async (req: Request, res: Response) => { + try { + const newWorld = new World(req.body); + await newWorld.save(); + res.status(201).json(newWorld); + } catch (error) { + res.status(400).json({ message: error.message }); + } +}; + +export const getWorldById = async (req: Request, res: Response) => { + try { + const world = await World.findById(req.params.id); + if (!world) { + return res.status(404).json({ message: 'World not found' }); + } + res.status(200).json(world); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + +export const updateWorld = async (req: Request, res: Response) => { + try { + const updatedWorld = await World.findByIdAndUpdate(req.params.id, req.body, { new: true }); + if (!updatedWorld) { + return res.status(404).json({ message: 'World not found' }); + } + res.status(200).json(updatedWorld); + } catch (error) { + res.status(400).json({ message: error.message }); + } +}; + +export const deleteWorld = async (req: Request, res: Response) => { + try { + const deletedWorld = await World.findByIdAndDelete(req.params.id); + if (!deletedWorld) { + return res.status(404).json({ message: 'World not found' }); + } + res.status(200).json({ message: 'World deleted successfully' }); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + +export const listWorlds = async (req: Request, res: Response) => { + try { + const worlds = await World.find({}); + res.status(200).json(worlds); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; \ No newline at end of file diff --git a/packages/backend/src/models/Campaign.ts b/packages/backend/src/models/Campaign.ts new file mode 100644 index 0000000..bf42685 --- /dev/null +++ b/packages/backend/src/models/Campaign.ts @@ -0,0 +1,18 @@ +import { Schema, model } from 'mongoose'; + +const campaignSchema = new Schema({ + name: { type: String, required: true }, + description: { type: String, required: true }, + worldId: { type: Schema.Types.ObjectId, ref: 'World', required: true }, + ccId: { type: String, required: true }, + externalId: { type: String, required: true, unique: true, index: true }, + numCharacters: { type: Number, required: true }, + numGmMadeCharacters: { type: Number, required: true }, + numPlayerMadeCharacters: { type: Number, required: true }, + sessionZero: { type: Boolean, required: true }, + frequency: { type: String, enum: ['one_shot', 'regular_cadence', 'custom_cadence'], required: true }, + scheduledSessions: [{ type: Date }], + notifications: [{ type: Schema.Types.ObjectId, ref: 'Notification' }], +}); + +export const Campaign = model('Campaign', campaignSchema); \ No newline at end of file diff --git a/packages/backend/src/models/Character.ts b/packages/backend/src/models/Character.ts new file mode 100644 index 0000000..4506963 --- /dev/null +++ b/packages/backend/src/models/Character.ts @@ -0,0 +1,16 @@ +import { Schema, model } from 'mongoose'; + +const characterSchema = new Schema({ + campaignId: { type: Schema.Types.ObjectId, ref: 'Campaign', required: true }, + ccId: { type: String, required: true }, + externalId: { type: String, required: true, unique: true, index: true }, + name: { type: String, required: true }, + class: { type: String, required: true }, + race: { type: String, required: true }, + description: { type: String, required: true }, + createdBy: { type: String, required: true }, + isGmMade: { type: Boolean, required: true }, + isCampaignLocked: { type: Boolean, required: true }, +}); + +export const Character = model('Character', characterSchema); \ No newline at end of file diff --git a/packages/backend/src/models/Notification.ts b/packages/backend/src/models/Notification.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/backend/src/models/Session.ts b/packages/backend/src/models/Session.ts new file mode 100644 index 0000000..fd43f4d --- /dev/null +++ b/packages/backend/src/models/Session.ts @@ -0,0 +1,11 @@ +import { Schema, model } from 'mongoose'; + +const sessionSchema = new Schema({ + campaignId: { type: Schema.Types.ObjectId, ref: 'Campaign', required: true }, + externalId: { type: String, required: true, unique: true, index: true }, + sessionNumber: { type: Number, required: true }, + date: { type: Date, required: true }, + description: { type: String, required: false }, +}); + +export const Session = model('Session', sessionSchema); \ No newline at end of file diff --git a/packages/backend/src/models/World.ts b/packages/backend/src/models/World.ts new file mode 100644 index 0000000..bf23cef --- /dev/null +++ b/packages/backend/src/models/World.ts @@ -0,0 +1,11 @@ +import { Schema, model } from 'mongoose'; + +const worldSchema = new Schema({ + name: { type: String, required: true }, + description: { type: String, required: true }, + vibe: { type: String, required: true }, + ccId: { type: String, required: true }, + externalId: { type: String, required: true, unique: true, index: true }, +}); + +export const World = model('World', worldSchema); \ No newline at end of file diff --git a/packages/backend/src/routes/campaignRoutes.ts b/packages/backend/src/routes/campaignRoutes.ts new file mode 100644 index 0000000..09e8873 --- /dev/null +++ b/packages/backend/src/routes/campaignRoutes.ts @@ -0,0 +1,12 @@ +import { Router } from 'express'; +import { createCampaign, getCampaignById, updateCampaign, deleteCampaign, listCampaigns } from '../controllers/campaignController'; + +const router = Router(); + +router.post('/', createCampaign); +router.get('/:id', getCampaignById); +router.put('/:id', updateCampaign); +router.delete('/:id', deleteCampaign); +router.get('/', listCampaigns); + +export default router; \ No newline at end of file diff --git a/packages/backend/src/routes/characterRoutes.ts b/packages/backend/src/routes/characterRoutes.ts new file mode 100644 index 0000000..66f810f --- /dev/null +++ b/packages/backend/src/routes/characterRoutes.ts @@ -0,0 +1,12 @@ +import { Router } from 'express'; +import { createCharacter, getCharacterById, updateCharacter, deleteCharacter, listCharacters } from '../controllers/characterController'; + +const router = Router(); + +router.post('/', createCharacter); +router.get('/:id', getCharacterById); +router.put('/:id', updateCharacter); +router.delete('/:id', deleteCharacter); +router.get('/', listCharacters); + +export default router; \ No newline at end of file diff --git a/packages/backend/src/routes/notificationRoutes.ts b/packages/backend/src/routes/notificationRoutes.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/backend/src/routes/sessionRoutes.ts b/packages/backend/src/routes/sessionRoutes.ts new file mode 100644 index 0000000..d63e956 --- /dev/null +++ b/packages/backend/src/routes/sessionRoutes.ts @@ -0,0 +1,12 @@ +import { Router } from 'express'; +import { createSession, getSessionById, updateSession, deleteSession, listSessions } from '../controllers/sessionController'; + +const router = Router(); + +router.post('/', createSession); +router.get('/:id', getSessionById); +router.put('/:id', updateSession); +router.delete('/:id', deleteSession); +router.get('/', listSessions); + +export default router; \ No newline at end of file diff --git a/packages/backend/src/routes/worldRoutes.ts b/packages/backend/src/routes/worldRoutes.ts new file mode 100644 index 0000000..ec67950 --- /dev/null +++ b/packages/backend/src/routes/worldRoutes.ts @@ -0,0 +1,12 @@ +import { Router } from 'express'; +import { createWorld, getWorldById, updateWorld, deleteWorld, listWorlds } from '../controllers/worldController'; + +const router = Router(); + +router.post('/', createWorld); +router.get('/:id', getWorldById); +router.put('/:id', updateWorld); +router.delete('/:id', deleteWorld); +router.get('/', listWorlds); + +export default router; \ No newline at end of file diff --git a/packages/backend/src/server.ts b/packages/backend/src/server.ts new file mode 100644 index 0000000..07fe2ab --- /dev/null +++ b/packages/backend/src/server.ts @@ -0,0 +1,6 @@ +import app from './app'; + +const port = process.env.PORT || 3000; +app.listen(port, () => { + console.log(`Server running on http://localhost:${port}`); +}); \ No newline at end of file diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json new file mode 100644 index 0000000..66c1106 --- /dev/null +++ b/packages/backend/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs", + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true + }, + "include": ["src"], + "exclude": ["node_modules"] +} \ No newline at end of file diff --git a/packages/nextjs/components/CampaignForm.tsx b/packages/nextjs/components/CampaignForm.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/components/CampaignList.tsx b/packages/nextjs/components/CampaignList.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/components/CharacterForm.tsx b/packages/nextjs/components/CharacterForm.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/components/CharacterList.tsx b/packages/nextjs/components/CharacterList.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/components/sessionForm.tsx b/packages/nextjs/components/sessionForm.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/components/sessionList.tsx b/packages/nextjs/components/sessionList.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/components/worldForm.tsx b/packages/nextjs/components/worldForm.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/components/worldList.tsx b/packages/nextjs/components/worldList.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/pages/campaigns/campaignDetails.tsx b/packages/nextjs/pages/campaigns/campaignDetails.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/pages/campaigns/createCampaign.tsx b/packages/nextjs/pages/campaigns/createCampaign.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/pages/characters/characterDetails.tsx b/packages/nextjs/pages/characters/characterDetails.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/pages/characters/createCharacter.tsx b/packages/nextjs/pages/characters/createCharacter.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/pages/index.tsx b/packages/nextjs/pages/index.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/pages/sessions/createSession.tsx b/packages/nextjs/pages/sessions/createSession.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/pages/sessions/sessionDetails.tsx b/packages/nextjs/pages/sessions/sessionDetails.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/pages/worlds/createWorld.tsx b/packages/nextjs/pages/worlds/createWorld.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/nextjs/pages/worlds/worldDetails.tsx b/packages/nextjs/pages/worlds/worldDetails.tsx new file mode 100644 index 0000000..e69de29 diff --git a/plan.md b/plan.md new file mode 100644 index 0000000..269d122 --- /dev/null +++ b/plan.md @@ -0,0 +1,82 @@ +Step 1: Data Model Design +Design the data models for the application's backend. This includes models for World, Campaign, Character, Session, and Notification. +Step 2: Backend API Development +Develop the backend API to handle CRUD operations for campaigns, characters, and sessions. This will involve creating new routes and controllers in the packages/backend directory. +Step 3: Frontend Development +Build the frontend components and pages for GM inputs and player game searches. This includes creating forms for campaign creation and listings for available games in the packages/nextjs/components and packages/nextjs/pages directories. +Step 4: Smart Contracts +Step 5: Testing +Write tests for your frontend components and backend API. Create new test files in the packages/nextjs/__tests__ directory. +Step 6: Deployment +Deploy your backend API and frontend. Use services like Vercel for the frontend and a suitable platform for the backend. +Step 7: Notifications System +Implement a notification system on the backend to inform users about campaign updates and session reminders. +Step 8: Documentation and Cleanup +Document all new code, update README.md and CONTRIBUTING.md with relevant information, and remove any unused code. +Step 9: Final Testing and Review +Conduct thorough testing of the frontend and backend, and ensure integration points with smart contracts are ready for when the contracts are deployed. +Step 10: Submission +Prepare your hackathon submission, ensuring the application meets all functional requirements and is ready for smart contract integration. +By focusing on these steps, you can build a robust frontend and backend system ready to connect with the smart contracts once they are developed by your teammate. + +scaffold-op/ +├── packages/ +│ ├── backend/ +│ │ ├── src/ +│ │ │ ├── models/ +│ │ │ │ ├── World.ts +│ │ │ │ ├── Campaign.ts +│ │ │ │ ├── Character.ts +│ │ │ │ ├── Session.ts +│ │ │ │ ├── Notification.ts +│ │ │ ├── controllers/ +│ │ │ │ ├── worldController.ts +│ │ │ │ ├── campaignController.ts +│ │ │ │ ├── characterController.ts +│ │ │ │ ├── sessionController.ts +│ │ │ │ ├── notificationController.ts +│ │ │ ├── routes/ +│ │ │ │ ├── worldRoutes.ts +│ │ │ │ ├── campaignRoutes.ts +│ │ │ │ ├── characterRoutes.ts +│ │ │ │ ├── sessionRoutes.ts +│ │ │ │ ├── notificationRoutes.ts +│ │ │ ├── app.ts +│ │ │ ├── server.ts +│ ├── nextjs/ +│ │ ├── components/ +│ │ ├── pages/ +│ │ ├── hooks/ +│ │ ├── utils/ +│ │ ├── app/ +│ │ ├── public/ +│ │ ├── styles/ +│ │ ├── scaffold.config.ts +│ ├── hardhat/ +│ │ ├── contracts/ +│ │ ├── scripts/ +│ │ ├── test/ +│ │ ├── deploy/ +│ │ ├── hardhat.config.ts +├── README.md +├── CONTRIBUTING.md +├── package.json +├── yarn.lock + +** Remaining steps ** +3. Implement Form Functionality +Use state management (e.g., React's useState, useReducer or a library like Redux) to handle form inputs and validations. +4. Integrate API Calls +Utilize fetch or a library like axios to make API calls from the frontend to the backend for CRUD operations. +5. Routing and Navigation +Use Next.js's built-in routing to navigate between pages and handle dynamic routes (e.g., viewing a specific campaign). +6. Styling +Apply styles to your components and pages using CSS modules or a CSS-in-JS solution like styled-components. +7. Frontend Testing +Write tests for your components using a library like Jest and React Testing Library. +8. State Management for User Sessions +Implement user authentication and session management to keep track of GMs and players. +9. Error Handling and User Feedback +Provide clear error messages and feedback for user actions (e.g., form submission success or failure). +10. Documentation +Document the usage of your components and pages for future reference and other developers. \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 5a19760..8f3a516 100644 --- a/yarn.lock +++ b/yarn.lock @@ -967,6 +967,15 @@ __metadata: languageName: node linkType: hard +"@mongodb-js/saslprep@npm:^1.1.5": + version: 1.1.7 + resolution: "@mongodb-js/saslprep@npm:1.1.7" + dependencies: + sparse-bitfield: ^3.0.3 + checksum: 27e0ae6d4741b89183f2cf4fe2167756f26c9b9a73804d8e72f33e016cd54abf0a987254870da37b62dbf741be075743a35a0b6cd507ad496f258983c7c3a240 + languageName: node + linkType: hard + "@motionone/animation@npm:^10.15.1, @motionone/animation@npm:^10.16.3": version: 10.16.3 resolution: "@motionone/animation@npm:10.16.3" @@ -2412,6 +2421,16 @@ __metadata: languageName: node linkType: hard +"@types/body-parser@npm:*": + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" + dependencies: + "@types/connect": "*" + "@types/node": "*" + checksum: 1e251118c4b2f61029cc43b0dc028495f2d1957fe8ee49a707fb940f86a9bd2f9754230805598278fe99958b49e9b7e66eec8ef6a50ab5c1f6b93e1ba2aaba82 + languageName: node + linkType: hard + "@types/chai-as-promised@npm:^7.1.3": version: 7.1.6 resolution: "@types/chai-as-promised@npm:7.1.6" @@ -2437,6 +2456,15 @@ __metadata: languageName: node linkType: hard +"@types/connect@npm:*": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" + dependencies: + "@types/node": "*" + checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 + languageName: node + linkType: hard + "@types/connect@npm:^3.4.33": version: 3.4.36 resolution: "@types/connect@npm:3.4.36" @@ -2472,6 +2500,30 @@ __metadata: languageName: node linkType: hard +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.19.0 + resolution: "@types/express-serve-static-core@npm:4.19.0" + dependencies: + "@types/node": "*" + "@types/qs": "*" + "@types/range-parser": "*" + "@types/send": "*" + checksum: 39c09fcb3f61de96ed56d97273874cafe50e6675ac254af4d77014e569e4fdc29d1d0d1dd12e11f008cb9a52785b07c2801c6ba91397965392b20c75ee01fb4e + languageName: node + linkType: hard + +"@types/express@npm:^4.17.21": + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" + dependencies: + "@types/body-parser": "*" + "@types/express-serve-static-core": ^4.17.33 + "@types/qs": "*" + "@types/serve-static": "*" + checksum: fb238298630370a7392c7abdc80f495ae6c716723e114705d7e3fb67e3850b3859bbfd29391463a3fb8c0b32051847935933d99e719c0478710f8098ee7091c5 + languageName: node + linkType: hard + "@types/form-data@npm:0.0.33": version: 0.0.33 resolution: "@types/form-data@npm:0.0.33" @@ -2491,6 +2543,13 @@ __metadata: languageName: node linkType: hard +"@types/http-errors@npm:*": + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 1f3d7c3b32c7524811a45690881736b3ef741bf9849ae03d32ad1ab7062608454b150a4e7f1351f83d26a418b2d65af9bdc06198f1c079d75578282884c4e8e3 + languageName: node + linkType: hard + "@types/inquirer@npm:^9": version: 9.0.7 resolution: "@types/inquirer@npm:9.0.7" @@ -2522,6 +2581,13 @@ __metadata: languageName: node linkType: hard +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: e29a5f9c4776f5229d84e525b7cd7dd960b51c30a0fb9a028c0821790b82fca9f672dab56561e2acd9e8eed51d431bde52eafdfef30f643586c4162f1aecfc78 + languageName: node + linkType: hard + "@types/minimatch@npm:*": version: 5.1.2 resolution: "@types/minimatch@npm:5.1.2" @@ -2536,6 +2602,15 @@ __metadata: languageName: node linkType: hard +"@types/mongoose@npm:^5.11.97": + version: 5.11.97 + resolution: "@types/mongoose@npm:5.11.97" + dependencies: + mongoose: "*" + checksum: 54c896814a92898535eb8965f90308f2661b75f4a53e28405802fbe9f90ba7d37140f151b1e291e08555a1700d3486911104c108ed02a94c6feddeab6bd3bfea + languageName: node + linkType: hard + "@types/ms@npm:*": version: 0.7.32 resolution: "@types/ms@npm:0.7.32" @@ -2631,6 +2706,13 @@ __metadata: languageName: node linkType: hard +"@types/qs@npm:*": + version: 6.9.15 + resolution: "@types/qs@npm:6.9.15" + checksum: 97d8208c2b82013b618e7a9fc14df6bd40a73e1385ac479b6896bafc7949a46201c15f42afd06e86a05e914f146f495f606b6fb65610cc60cf2e0ff743ec38a2 + languageName: node + linkType: hard + "@types/qs@npm:^6.2.31, @types/qs@npm:^6.9.7": version: 6.9.8 resolution: "@types/qs@npm:6.9.8" @@ -2638,6 +2720,13 @@ __metadata: languageName: node linkType: hard +"@types/range-parser@npm:*": + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 95640233b689dfbd85b8c6ee268812a732cf36d5affead89e806fe30da9a430767af8ef2cd661024fd97e19d61f3dec75af2df5e80ec3bea000019ab7028629a + languageName: node + linkType: hard + "@types/react-copy-to-clipboard@npm:^5.0.4": version: 5.0.5 resolution: "@types/react-copy-to-clipboard@npm:5.0.5" @@ -2691,6 +2780,41 @@ __metadata: languageName: node linkType: hard +"@types/send@npm:*": + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" + dependencies: + "@types/mime": ^1 + "@types/node": "*" + checksum: cf4db48251bbb03cd6452b4de6e8e09e2d75390a92fd798eca4a803df06444adc94ed050246c94c7ed46fb97be1f63607f0e1f13c3ce83d71788b3e08640e5e0 + languageName: node + linkType: hard + +"@types/serve-static@npm:*": + version: 1.15.7 + resolution: "@types/serve-static@npm:1.15.7" + dependencies: + "@types/http-errors": "*" + "@types/node": "*" + "@types/send": "*" + checksum: bbbf00dbd84719da2250a462270dc68964006e8d62f41fe3741abd94504ba3688f420a49afb2b7478921a1544d3793183ffa097c5724167da777f4e0c7f1a7d6 + languageName: node + linkType: hard + +"@types/strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "@types/strip-bom@npm:3.0.0" + checksum: cb165d0c2ce6abbef95506ebee25be02bd453600ef1792dc1754236e5d6f9c830d52bdb85978d0b08ea1f36b96a61235ac5ad99e0f4c2767fb4ea004e141d2df + languageName: node + linkType: hard + +"@types/strip-json-comments@npm:0.0.30": + version: 0.0.30 + resolution: "@types/strip-json-comments@npm:0.0.30" + checksum: 829ddd389645073f347c5b1924a8c34b8813af29756576e511c46f40e218193cf93ccbade62661d47fc70f707e98f410331729b8c20edfcb2e807d51df1ad4b7 + languageName: node + linkType: hard + "@types/through@npm:*": version: 0.0.33 resolution: "@types/through@npm:0.0.33" @@ -2707,6 +2831,22 @@ __metadata: languageName: node linkType: hard +"@types/webidl-conversions@npm:*": + version: 7.0.3 + resolution: "@types/webidl-conversions@npm:7.0.3" + checksum: 535ead9de4d3d6c8e4f4fa14e9db780d2a31e8020debc062f337e1420a41c3265e223e4f4b628f97a11ecf3b96390962cd88a9ffe34f44e159dec583ff49aa34 + languageName: node + linkType: hard + +"@types/whatwg-url@npm:^11.0.2": + version: 11.0.4 + resolution: "@types/whatwg-url@npm:11.0.4" + dependencies: + "@types/webidl-conversions": "*" + checksum: 5acd60dbd49df34b9131ea75dc5e24b03e084cc4ed5a273ddd801fdaf21c896abbbb846bb3ba71ffd5c715120bac0454debe569f39b9177887fb7636d65cdae4 + languageName: node + linkType: hard + "@types/ws@npm:^7.4.4": version: 7.4.7 resolution: "@types/ws@npm:7.4.7" @@ -3820,6 +3960,16 @@ __metadata: languageName: node linkType: hard +"accepts@npm:~1.3.8": + version: 1.3.8 + resolution: "accepts@npm:1.3.8" + dependencies: + mime-types: ~2.1.34 + negotiator: 0.6.3 + checksum: 50c43d32e7b50285ebe84b613ee4a3aa426715a7d131b65b786e2ead0fd76b6b60091b9916d3478a75f11f162628a2139991b6c03ab3f1d9ab7c86075dc8eab4 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -4182,6 +4332,13 @@ __metadata: languageName: node linkType: hard +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: a9925bf3512d9dce202112965de90c222cd59a4fbfce68a0951d25d965cf44642931f40aac72309c41f12df19afa010ecadceb07cfff9ccc1621e99d89ab5f3b + languageName: node + linkType: hard + "array-includes@npm:^3.1.6": version: 3.1.7 resolution: "array-includes@npm:3.1.7" @@ -4469,6 +4626,19 @@ __metadata: languageName: node linkType: hard +"backend@workspace:packages/backend": + version: 0.0.0-use.local + resolution: "backend@workspace:packages/backend" + dependencies: + "@types/express": ^4.17.21 + "@types/mongoose": ^5.11.97 + express: ^4.19.2 + mongoose: ^8.3.5 + ts-node-dev: ^2.0.0 + typescript: ^5.4.5 + languageName: unknown + linkType: soft + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -4601,6 +4771,26 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:1.20.2": + version: 1.20.2 + resolution: "body-parser@npm:1.20.2" + dependencies: + bytes: 3.1.2 + content-type: ~1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: ~1.6.18 + unpipe: 1.0.0 + checksum: 14d37ec638ab5c93f6099ecaed7f28f890d222c650c69306872e00b9efa081ff6c596cd9afb9930656aae4d6c4e1c17537bea12bb73c87a217cb3cfea8896737 + languageName: node + linkType: hard + "borsh@npm:^0.7.0": version: 0.7.0 resolution: "borsh@npm:0.7.0" @@ -4714,6 +4904,13 @@ __metadata: languageName: node linkType: hard +"bson@npm:^6.4.0, bson@npm:^6.5.0": + version: 6.7.0 + resolution: "bson@npm:6.7.0" + checksum: f77b7001e2ec603b1058e9f2d99b642be4673e0356adf4fbdc463afd89de434d3be9d81305c1befbcda9bf8616e70a8f7ec0c8ec7a79154ca40ba455b73ea280 + languageName: node + linkType: hard + "buffer-crc32@npm:~0.2.3": version: 0.2.13 resolution: "buffer-crc32@npm:0.2.13" @@ -5030,6 +5227,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^3.5.1": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.2 + glob-parent: ~5.1.2 + is-binary-path: ~2.1.0 + is-glob: ~4.0.1 + normalize-path: ~3.0.0 + readdirp: ~3.6.0 + dependenciesMeta: + fsevents: + optional: true + checksum: d2f29f499705dcd4f6f3bbed79a9ce2388cf530460122eed3b9c48efeab7a4e28739c6551fd15bec9245c6b9eeca7a32baa64694d64d9b6faeb74ddb8c4a413d + languageName: node + linkType: hard + "chownr@npm:^1.1.4": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -5389,6 +5605,15 @@ __metadata: languageName: node linkType: hard +"content-disposition@npm:0.5.4": + version: 0.5.4 + resolution: "content-disposition@npm:0.5.4" + dependencies: + safe-buffer: 5.2.1 + checksum: afb9d545e296a5171d7574fcad634b2fdf698875f4006a9dd04a3e1333880c5c0c98d47b560d01216fb6505a54a2ba6a843ee3a02ec86d7e911e8315255f56c3 + languageName: node + linkType: hard + "content-type@npm:1.0.4": version: 1.0.4 resolution: "content-type@npm:1.0.4" @@ -5396,6 +5621,13 @@ __metadata: languageName: node linkType: hard +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 + languageName: node + linkType: hard + "convert-hrtime@npm:^3.0.0": version: 3.0.0 resolution: "convert-hrtime@npm:3.0.0" @@ -5410,6 +5642,20 @@ __metadata: languageName: node linkType: hard +"cookie-signature@npm:1.0.6": + version: 1.0.6 + resolution: "cookie-signature@npm:1.0.6" + checksum: f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a + languageName: node + linkType: hard + +"cookie@npm:0.6.0": + version: 0.6.0 + resolution: "cookie@npm:0.6.0" + checksum: f56a7d32a07db5458e79c726b77e3c2eff655c36792f2b6c58d351fb5f61531e5b1ab7f46987150136e366c65213cbe31729e02a3eaed630c3bf7334635fb410 + languageName: node + linkType: hard + "cookie@npm:^0.4.1": version: 0.4.2 resolution: "cookie@npm:0.4.2" @@ -5585,6 +5831,15 @@ __metadata: languageName: node linkType: hard +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: 2.0.0 + checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 + languageName: node + linkType: hard + "debug@npm:3.2.6": version: 3.2.6 resolution: "debug@npm:3.2.6" @@ -5594,7 +5849,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:4.3.4, debug@npm:4.x, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -5794,6 +6049,13 @@ __metadata: languageName: node linkType: hard +"destroy@npm:1.2.0": + version: 1.2.0 + resolution: "destroy@npm:1.2.0" + checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 + languageName: node + linkType: hard + "detect-browser@npm:5.3.0, detect-browser@npm:^5.3.0": version: 5.3.0 resolution: "detect-browser@npm:5.3.0" @@ -5934,6 +6196,15 @@ __metadata: languageName: node linkType: hard +"dynamic-dedupe@npm:^0.3.0": + version: 0.3.0 + resolution: "dynamic-dedupe@npm:0.3.0" + dependencies: + xtend: ^4.0.0 + checksum: 5178b99ad30a59234c63b38b453183cfd0a6cb7acbe7b94b7aea9bf0f75376fdaab6e2ea7922931cfc0152390ccb20bd024d8d80b4fc8c3c3255a2fcadf2cafb + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -5970,6 +6241,13 @@ __metadata: languageName: node linkType: hard +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.4.530": version: 1.4.531 resolution: "electron-to-chromium@npm:1.4.531" @@ -6020,6 +6298,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:~1.0.2": + version: 1.0.2 + resolution: "encodeurl@npm:1.0.2" + checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -6447,6 +6732,13 @@ __metadata: languageName: node linkType: hard +"escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 + languageName: node + linkType: hard + "escape-string-regexp@npm:1.0.5, escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" @@ -6816,7 +7108,7 @@ __metadata: languageName: node linkType: hard -"etag@npm:1.8.1": +"etag@npm:1.8.1, etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff @@ -7210,6 +7502,45 @@ __metadata: languageName: node linkType: hard +"express@npm:^4.19.2": + version: 4.19.2 + resolution: "express@npm:4.19.2" + dependencies: + accepts: ~1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: ~1.0.4 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + etag: ~1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: ~1.1.2 + on-finished: 2.4.1 + parseurl: ~1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: ~2.0.7 + qs: 6.11.0 + range-parser: ~1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: ~1.6.18 + utils-merge: 1.0.1 + vary: ~1.1.2 + checksum: 212dbd6c2c222a96a61bc927639c95970a53b06257080bb9e2838adb3bffdb966856551fdad1ab5dd654a217c35db94f987d0aa88d48fb04d306340f5f34dca5 + languageName: node + linkType: hard + "extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -7377,6 +7708,21 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:1.2.0": + version: 1.2.0 + resolution: "finalhandler@npm:1.2.0" + dependencies: + debug: 2.6.9 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + on-finished: 2.4.1 + parseurl: ~1.3.3 + statuses: 2.0.1 + unpipe: ~1.0.0 + checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716 + languageName: node + linkType: hard + "find-replace@npm:^3.0.0": version: 3.0.0 resolution: "find-replace@npm:3.0.0" @@ -7540,6 +7886,13 @@ __metadata: languageName: node linkType: hard +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 + languageName: node + linkType: hard + "fp-ts@npm:1.19.3": version: 1.19.3 resolution: "fp-ts@npm:1.19.3" @@ -7561,6 +7914,13 @@ __metadata: languageName: node linkType: hard +"fresh@npm:0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 + languageName: node + linkType: hard + "fs-extra@npm:11.1.0": version: 11.1.0 resolution: "fs-extra@npm:11.1.0" @@ -8821,6 +9181,13 @@ __metadata: languageName: node linkType: hard +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 + languageName: node + linkType: hard + "iron-webcrypto@npm:^1.0.0": version: 1.0.0 resolution: "iron-webcrypto@npm:1.0.0" @@ -9546,6 +9913,13 @@ __metadata: languageName: node linkType: hard +"kareem@npm:2.6.3": + version: 2.6.3 + resolution: "kareem@npm:2.6.3" + checksum: 4e3a4dc01747de19b345bdbb4a976a30ebeb9f8c2623ccb5bb509cbeebc28de09664355aa43e2ff641d8588c9155b7c2f177f389feb76f1b47224ff94c0fe63b + languageName: node + linkType: hard + "keccak@npm:^3.0.0, keccak@npm:^3.0.1, keccak@npm:^3.0.2": version: 3.0.4 resolution: "keccak@npm:3.0.4" @@ -10047,6 +10421,13 @@ __metadata: languageName: node linkType: hard +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: af1b38516c28ec95d6b0826f6c8f276c58aec391f76be42aa07646b4e39d317723e869700933ca6995b056db4b09a78c92d5440dc23657e6764be5d28874bba1 + languageName: node + linkType: hard + "memory-level@npm:^1.0.0": version: 1.0.0 resolution: "memory-level@npm:1.0.0" @@ -10058,6 +10439,13 @@ __metadata: languageName: node linkType: hard +"memory-pager@npm:^1.0.2": + version: 1.5.0 + resolution: "memory-pager@npm:1.5.0" + checksum: d1a2e684583ef55c61cd3a49101da645b11ad57014dfc565e0b43baa9004b743f7e4ab81493d8fff2ab24e9950987cc3209c94bcc4fc8d7e30a475489a1f15e9 + languageName: node + linkType: hard + "memorystream@npm:^0.3.1": version: 0.3.1 resolution: "memorystream@npm:0.3.1" @@ -10065,6 +10453,13 @@ __metadata: languageName: node linkType: hard +"merge-descriptors@npm:1.0.1": + version: 1.0.1 + resolution: "merge-descriptors@npm:1.0.1" + checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -10079,6 +10474,13 @@ __metadata: languageName: node linkType: hard +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a + languageName: node + linkType: hard + "micro-ftch@npm:^0.3.1": version: 0.3.1 resolution: "micro-ftch@npm:0.3.1" @@ -10116,7 +10518,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19": +"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -10125,6 +10527,15 @@ __metadata: languageName: node linkType: hard +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557 + languageName: node + linkType: hard + "mime@npm:^3.0.0": version: 3.0.0 resolution: "mime@npm:3.0.0" @@ -10441,6 +10852,65 @@ __metadata: languageName: node linkType: hard +"mongodb-connection-string-url@npm:^3.0.0": + version: 3.0.1 + resolution: "mongodb-connection-string-url@npm:3.0.1" + dependencies: + "@types/whatwg-url": ^11.0.2 + whatwg-url: ^13.0.0 + checksum: b0a3b9e619c53ce8c10452c6475dc1eeba4761ae1b293b1b37014acf609f44ab7057f084de8fceead9934dba2aad0a59315eab9371c1287dbaaf5aae48c6d371 + languageName: node + linkType: hard + +"mongodb@npm:6.5.0": + version: 6.5.0 + resolution: "mongodb@npm:6.5.0" + dependencies: + "@mongodb-js/saslprep": ^1.1.5 + bson: ^6.4.0 + mongodb-connection-string-url: ^3.0.0 + peerDependencies: + "@aws-sdk/credential-providers": ^3.188.0 + "@mongodb-js/zstd": ^1.1.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: ">=6.0.0 <7" + snappy: ^7.2.2 + socks: ^2.7.1 + peerDependenciesMeta: + "@aws-sdk/credential-providers": + optional: true + "@mongodb-js/zstd": + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + checksum: 5774dfdd02d8d8e6bb70bf870f19bfad332da612fa6685d182b2e09da4f1306995ddf54f13ae0f6c3936e74444741689c04e7c009e7a847473f08f522ad16542 + languageName: node + linkType: hard + +"mongoose@npm:*, mongoose@npm:^8.3.5": + version: 8.3.5 + resolution: "mongoose@npm:8.3.5" + dependencies: + bson: ^6.5.0 + kareem: 2.6.3 + mongodb: 6.5.0 + mpath: 0.9.0 + mquery: 5.0.0 + ms: 2.1.3 + sift: 17.1.3 + checksum: e6fde246d931d6db28866743ba0f6c979928436a76df6cd93bd67c43af6bf108a39bdd8b410e4e3f7cceec053be5c6c793e371f933658e1f79cadaacc7a59840 + languageName: node + linkType: hard + "motion@npm:10.16.2": version: 10.16.2 resolution: "motion@npm:10.16.2" @@ -10455,6 +10925,22 @@ __metadata: languageName: node linkType: hard +"mpath@npm:0.9.0": + version: 0.9.0 + resolution: "mpath@npm:0.9.0" + checksum: 1052f1f926db04502440f76164ae16ed53aa41f3ce34e7e64e3ed451b7d91ede295c3b600801c5f9eb862f03d9d59b7aa5aaf690c341fc521bef025d0f5cd773 + languageName: node + linkType: hard + +"mquery@npm:5.0.0": + version: 5.0.0 + resolution: "mquery@npm:5.0.0" + dependencies: + debug: 4.x + checksum: 0617ead71e40e3c38ab74a1e46214d578d654bf7916abd8b3fb2ceb433bb6287adfa0960f041f16e2ac41c5ed5d7ce2268582f0a0075fff2561bcd5a3f40b417 + languageName: node + linkType: hard + "mri@npm:1.2.0, mri@npm:^1.2.0": version: 1.2.0 resolution: "mri@npm:1.2.0" @@ -10462,6 +10948,13 @@ __metadata: languageName: node linkType: hard +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 + languageName: node + linkType: hard + "ms@npm:2.1.1": version: 2.1.1 resolution: "ms@npm:2.1.1" @@ -10565,7 +11058,7 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 @@ -11043,6 +11536,15 @@ __metadata: languageName: node linkType: hard +"on-finished@npm:2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: 1.1.1 + checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0 + languageName: node + linkType: hard + "once@npm:1.x, once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -11268,6 +11770,13 @@ __metadata: languageName: node linkType: hard +"parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 + languageName: node + linkType: hard + "path-browserify@npm:^1.0.1": version: 1.0.1 resolution: "path-browserify@npm:1.0.1" @@ -11337,6 +11846,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:0.1.7": + version: 0.1.7 + resolution: "path-to-regexp@npm:0.1.7" + checksum: 69a14ea24db543e8b0f4353305c5eac6907917031340e5a8b37df688e52accd09e3cebfe1660b70d76b6bd89152f52183f28c74813dbf454ba1a01c82a38abce + languageName: node + linkType: hard + "path-to-regexp@npm:6.1.0": version: 6.1.0 resolution: "path-to-regexp@npm:6.1.0" @@ -11720,6 +12236,16 @@ __metadata: languageName: node linkType: hard +"proxy-addr@npm:~2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 + languageName: node + linkType: hard + "proxy-compare@npm:2.5.1": version: 2.5.1 resolution: "proxy-compare@npm:2.5.1" @@ -11751,6 +12277,13 @@ __metadata: languageName: node linkType: hard +"punycode@npm:^2.3.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 + languageName: node + linkType: hard + "qrcode.react@npm:^3.1.0": version: 3.1.0 resolution: "qrcode.react@npm:3.1.0" @@ -11774,6 +12307,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:6.11.0": + version: 6.11.0 + resolution: "qs@npm:6.11.0" + dependencies: + side-channel: ^1.0.4 + checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297 + languageName: node + linkType: hard + "qs@npm:^6.10.3, qs@npm:^6.4.0, qs@npm:^6.9.4": version: 6.11.2 resolution: "qs@npm:6.11.2" @@ -11844,6 +12386,13 @@ __metadata: languageName: node linkType: hard +"range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 + languageName: node + linkType: hard + "raw-body@npm:2.4.1": version: 2.4.1 resolution: "raw-body@npm:2.4.1" @@ -11856,7 +12405,7 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:^2.4.1": +"raw-body@npm:2.5.2, raw-body@npm:^2.4.1": version: 2.5.2 resolution: "raw-body@npm:2.5.2" dependencies: @@ -12249,6 +12798,19 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^1.0.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c + languageName: node + linkType: hard + "resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.22.2, resolve@npm:^1.22.4": version: 1.22.6 resolution: "resolve@npm:1.22.6" @@ -12291,6 +12853,19 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@^1.0.0#~builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 + languageName: node + linkType: hard + "resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.22.2#~builtin, resolve@patch:resolve@^1.22.4#~builtin": version: 1.22.6 resolution: "resolve@patch:resolve@npm%3A1.22.6#~builtin::version=1.22.6&hash=07638b" @@ -12358,7 +12933,7 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^2.2.8": +"rimraf@npm:^2.2.8, rimraf@npm:^2.6.1": version: 2.7.1 resolution: "rimraf@npm:2.7.1" dependencies: @@ -12482,7 +13057,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 @@ -12636,6 +13211,27 @@ __metadata: languageName: node linkType: hard +"send@npm:0.18.0": + version: 0.18.0 + resolution: "send@npm:0.18.0" + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + etag: ~1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: ~1.2.1 + statuses: 2.0.1 + checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 + languageName: node + linkType: hard + "serialize-javascript@npm:6.0.0": version: 6.0.0 resolution: "serialize-javascript@npm:6.0.0" @@ -12645,6 +13241,18 @@ __metadata: languageName: node linkType: hard +"serve-static@npm:1.15.0": + version: 1.15.0 + resolution: "serve-static@npm:1.15.0" + dependencies: + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + parseurl: ~1.3.3 + send: 0.18.0 + checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d + languageName: node + linkType: hard + "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -12767,6 +13375,13 @@ __metadata: languageName: node linkType: hard +"sift@npm:17.1.3": + version: 17.1.3 + resolution: "sift@npm:17.1.3" + checksum: 56d09c72720cd75f757dad31fc13cc84461c06c0416d23c1dc05e64276676fa1fecaddb055f0d2aa714d36a93c2acaad8cb2f2ef6d06d8c8bb1af84657de2046 + languageName: node + linkType: hard + "signal-exit@npm:4.0.2": version: 4.0.2 resolution: "signal-exit@npm:4.0.2" @@ -12911,7 +13526,7 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:^0.5.13, source-map-support@npm:^0.5.16": +"source-map-support@npm:^0.5.12, source-map-support@npm:^0.5.13, source-map-support@npm:^0.5.16": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -12944,6 +13559,15 @@ __metadata: languageName: node linkType: hard +"sparse-bitfield@npm:^3.0.3": + version: 3.0.3 + resolution: "sparse-bitfield@npm:3.0.3" + dependencies: + memory-pager: ^1.0.2 + checksum: 174da88dbbcc783d5dbd26921931cc83830280b8055fb05333786ebe6fc015b9601b24972b3d55920dd2d9f5fb120576fbfa2469b08e5222c9cadf3f05210aab + languageName: node + linkType: hard + "split-on-first@npm:^1.0.0": version: 1.1.0 resolution: "split-on-first@npm:1.1.0" @@ -13288,7 +13912,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:2.0.1": +"strip-json-comments@npm:2.0.1, strip-json-comments@npm:^2.0.0": version: 2.0.1 resolution: "strip-json-comments@npm:2.0.1" checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 @@ -13669,6 +14293,15 @@ __metadata: languageName: node linkType: hard +"tr46@npm:^4.1.1": + version: 4.1.1 + resolution: "tr46@npm:4.1.1" + dependencies: + punycode: ^2.3.0 + checksum: aeeb821ac2cd792e63ec84888b4fd6598ac6ed75d861579e21a5cf9d4ee78b2c6b94e7d45036f2ca2088bc85b9b46560ad23c4482979421063b24137349dbd96 + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -13676,7 +14309,7 @@ __metadata: languageName: node linkType: hard -"tree-kill@npm:1.2.2": +"tree-kill@npm:1.2.2, tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" bin: @@ -13734,6 +14367,33 @@ __metadata: languageName: node linkType: hard +"ts-node-dev@npm:^2.0.0": + version: 2.0.0 + resolution: "ts-node-dev@npm:2.0.0" + dependencies: + chokidar: ^3.5.1 + dynamic-dedupe: ^0.3.0 + minimist: ^1.2.6 + mkdirp: ^1.0.4 + resolve: ^1.0.0 + rimraf: ^2.6.1 + source-map-support: ^0.5.12 + tree-kill: ^1.2.2 + ts-node: ^10.4.0 + tsconfig: ^7.0.0 + peerDependencies: + node-notifier: "*" + typescript: "*" + peerDependenciesMeta: + node-notifier: + optional: true + bin: + ts-node-dev: lib/bin.js + tsnd: lib/bin.js + checksum: d654b401de3d13c167981481be2a375229f6bfd2aeedf43bc0b6816e57676fcbfba3afdcf209c7a06fb6bd8768ca548c2eb0a0c9d38fa42246be3f50df1b28fb + languageName: node + linkType: hard + "ts-node@npm:10.9.1, ts-node@npm:^10.9.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" @@ -13772,6 +14432,44 @@ __metadata: languageName: node linkType: hard +"ts-node@npm:^10.4.0": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": ^0.8.0 + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.2 + acorn: ^8.4.1 + acorn-walk: ^8.1.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + v8-compile-cache-lib: ^3.0.1 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac + languageName: node + linkType: hard + "ts-toolbelt@npm:^6.15.5": version: 6.15.5 resolution: "ts-toolbelt@npm:6.15.5" @@ -13791,6 +14489,18 @@ __metadata: languageName: node linkType: hard +"tsconfig@npm:^7.0.0": + version: 7.0.0 + resolution: "tsconfig@npm:7.0.0" + dependencies: + "@types/strip-bom": ^3.0.0 + "@types/strip-json-comments": 0.0.30 + strip-bom: ^3.0.0 + strip-json-comments: ^2.0.0 + checksum: 8bce05e93c673defd56d93d83d4055e49651d3947c076339c4bc15d47b7eb5029bed194087e568764213a2e4bf45c477ba9f4da16adfd92cd901af7c09e4517e + languageName: node + linkType: hard + "tslib@npm:1.14.1, tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" @@ -13920,6 +14630,16 @@ __metadata: languageName: node linkType: hard +"type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" + dependencies: + media-typer: 0.3.0 + mime-types: ~2.1.24 + checksum: 2c8e47675d55f8b4e404bcf529abdf5036c537a04c2b20177bcf78c9e3c1da69da3942b1346e6edb09e823228c0ee656ef0e033765ec39a70d496ef601a0c657 + languageName: node + linkType: hard + "typechain@npm:^8.1.0": version: 8.3.1 resolution: "typechain@npm:8.3.1" @@ -14025,6 +14745,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.4.5": + version: 5.4.5 + resolution: "typescript@npm:5.4.5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 53c879c6fa1e3bcb194b274d4501ba1985894b2c2692fa079db03c5a5a7140587a1e04e1ba03184605d35f439b40192d9e138eb3279ca8eee313c081c8bcd9b0 + languageName: node + linkType: hard + "typescript@patch:typescript@4.9.5#~builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=a1c5e5" @@ -14045,6 +14775,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@^5.4.5#~builtin": + version: 5.4.5 + resolution: "typescript@patch:typescript@npm%3A5.4.5#~builtin::version=5.4.5&hash=a1c5e5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 2373c693f3b328f3b2387c3efafe6d257b057a142f9a79291854b14ff4d5367d3d730810aee981726b677ae0fd8329b23309da3b6aaab8263dbdccf1da07a3ba + languageName: node + linkType: hard + "typical@npm:^4.0.0": version: 4.0.0 resolution: "typical@npm:4.0.0" @@ -14180,7 +14920,7 @@ __metadata: languageName: node linkType: hard -"unpipe@npm:1.0.0": +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 @@ -14384,6 +15124,13 @@ __metadata: languageName: node linkType: hard +"utils-merge@npm:1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: c81095493225ecfc28add49c106ca4f09cdf56bc66731aa8dabc2edbbccb1e1bfe2de6a115e5c6a380d3ea166d1636410b62ef216bb07b3feb1cfde1d95d5080 + languageName: node + linkType: hard + "uuid@npm:2.0.1": version: 2.0.1 resolution: "uuid@npm:2.0.1" @@ -14443,6 +15190,13 @@ __metadata: languageName: node linkType: hard +"vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b + languageName: node + linkType: hard + "vercel@npm:^32.4.1": version: 32.4.1 resolution: "vercel@npm:32.4.1" @@ -14590,6 +15344,23 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b + languageName: node + linkType: hard + +"whatwg-url@npm:^13.0.0": + version: 13.0.0 + resolution: "whatwg-url@npm:13.0.0" + dependencies: + tr46: ^4.1.1 + webidl-conversions: ^7.0.0 + checksum: 7f69272a1bfd5f0d994988b9e234e35d21071a9bffe0d6fd4477d295552665c566b176ff8e0251a0a79c61c5a67a7a392e248aae5887d7e22bdff0125209e26b + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -14887,7 +15658,7 @@ __metadata: languageName: node linkType: hard -"xtend@npm:^4.0.1": +"xtend@npm:^4.0.0, xtend@npm:^4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a From e5053a7b5b5c1ae7a7df22c3556ff4938c941136 Mon Sep 17 00:00:00 2001 From: VinceLindsey <98496148+VinceLindsey@users.noreply.github.com> Date: Wed, 29 May 2024 19:36:37 -0500 Subject: [PATCH 5/5] Resolve duplicate homepage error and add front and backend components/pages --- package.json | 7 + packages/backend/package.json | 4 +- .../src/controllers/campaignController.ts | 67 ++- .../src/controllers/sessionController.ts | 12 + .../src/controllers/worldController.ts | 55 ++- packages/backend/src/models/Campaign.ts | 1 + packages/backend/src/models/Character.ts | 7 +- packages/backend/src/models/Session.ts | 6 +- packages/backend/src/models/World.ts | 5 +- packages/nextjs/app/page.tsx | 12 +- .../nextjs/contracts/deployedContracts.ts | 427 +++++++++++++++++- packages/nextjs/next-env.d.ts | 1 + .../pages/campaigns/campaignDetails.tsx | 56 +++ .../nextjs/pages/campaigns/createCampaign.tsx | 134 ++++++ .../pages/characters/characterDetails.tsx | 49 ++ packages/nextjs/pages/index.tsx | 0 .../nextjs/pages/sessions/createSession.tsx | 47 ++ .../nextjs/pages/sessions/sessionDetails.tsx | 70 +++ packages/nextjs/pages/worlds/createWorld.tsx | 46 ++ packages/nextjs/pages/worlds/worldDetails.tsx | 70 +++ packages/nextjs/tsconfig.json | 2 +- packages/nextjs/types/types.ts | 56 +++ plan.md | 8 +- yarn.lock | 167 +++++++ 24 files changed, 1288 insertions(+), 21 deletions(-) delete mode 100644 packages/nextjs/pages/index.tsx create mode 100644 packages/nextjs/types/types.ts diff --git a/package.json b/package.json index b0ba5e0..511ebdb 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,14 @@ }, "packageManager": "yarn@3.2.3", "devDependencies": { + "@types/react": "^18", + "@types/react-dom": "^18", "husky": "^8.0.1", "lint-staged": "^13.0.3" + }, + "dependencies": { + "next-auth": "^4.24.7", + "react": "^18.3.1", + "react-dom": "^18.3.1" } } diff --git a/packages/backend/package.json b/packages/backend/package.json index 01cd67c..efdcc4f 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -12,6 +12,6 @@ "typescript": "^5.4.5" }, "scripts": { - "start": "ts-node-dev --respawn --transpile-only src/server.ts" -} + "start": "ts-node-dev --respawn --transpile-only src/server.ts" + } } diff --git a/packages/backend/src/controllers/campaignController.ts b/packages/backend/src/controllers/campaignController.ts index 2274c30..1087227 100644 --- a/packages/backend/src/controllers/campaignController.ts +++ b/packages/backend/src/controllers/campaignController.ts @@ -2,7 +2,15 @@ import { Request, Response } from 'express'; import { Campaign } from '../models/Campaign'; export const createCampaign = async (req: Request, res: Response) => { + const { worldId, ccId } = req.body; try { + const world = await World.findById(worldId); + if (!world) { + return res.status(404).json({ message: 'World not found' }); + } + if (world.ccId !== ccId && !world.permissions.includes(ccId)) { + return res.status(403).json({ message: 'Not authorized to create campaign in this world' }); + } const newCampaign = new Campaign(req.body); await newCampaign.save(); res.status(201).json(newCampaign); @@ -13,7 +21,7 @@ export const createCampaign = async (req: Request, res: Response) => { export const getCampaignById = async (req: Request, res: Response) => { try { - const campaign = await Campaign.findById(req.params.id); + const campaign = await Campaign.findOne({ externalId: req.params.id }); if (!campaign) { return res.status(404).json({ message: 'Campaign not found' }); } @@ -25,7 +33,7 @@ export const getCampaignById = async (req: Request, res: Response) => { export const updateCampaign = async (req: Request, res: Response) => { try { - const updatedCampaign = await Campaign.findByIdAndUpdate(req.params.id, req.body, { new: true }); + const updatedCampaign = await Campaign.findOneAndUpdate({ externalId: req.params.id }, req.body, { new: true }); if (!updatedCampaign) { return res.status(404).json({ message: 'Campaign not found' }); } @@ -33,11 +41,10 @@ export const updateCampaign = async (req: Request, res: Response) => { } catch (error) { res.status(400).json({ message: error.message }); } -}; export const deleteCampaign = async (req: Request, res: Response) => { try { - const deletedCampaign = await Campaign.findByIdAndDelete(req.params.id); + const deletedCampaign = await Campaign.findOneAndDelete({ externalId: req.params.id }); if (!deletedCampaign) { return res.status(404).json({ message: 'Campaign not found' }); } @@ -45,13 +52,61 @@ export const deleteCampaign = async (req: Request, res: Response) => { } catch (error) { res.status(500).json({ message: error.message }); } -}; export const listCampaigns = async (req: Request, res: Response) => { + const { name, worldId, ccId, numCharacters, frequency } = req.query; + try { + const query = {}; + if (name) query.name = name; + if (worldId) query.worldId = worldId; + if (ccId) query.ccId = ccId; + if (numCharacters) query.numCharacters = numCharacters; + if (frequency) query.frequency = frequency; + + const campaigns = await Campaign.find(query); + res.status(200).json(campaigns); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + +export const listCampaignsByWorld = async (req: Request, res: Response) => { + const { worldExternalId } = req.query; + try { - const campaigns = await Campaign.find({}); + // Find the world by its externalId + const world = await World.findOne({ externalId: worldExternalId }); + if (!world) { + return res.status(404).json({ message: 'World not found' }); + } + + // Find campaigns associated with the world's _id + const campaigns = await Campaign.find({ worldId: world._id }); + + // Send the list of campaigns in the response res.status(200).json(campaigns); } catch (error) { + // Handle any errors that occur during the process res.status(500).json({ message: error.message }); } +}; + +// Example mock data for campaigns +const mockCampaigns = [ + { + _id: '1', + name: 'The Quest for the Holy Grail', + description: 'Embark on an epic quest to find the legendary Holy Grail.', + externalId: 'campaign-1', + worldId: '1', + // ... other properties ... + }, + // ... more mock campaigns ... +]; + +// Serve mock data in your API route +export const listCampaigns = async (req: Request, res: Response) => { + const { worldId } = req.query; + const filteredCampaigns = mockCampaigns.filter(campaign => campaign.worldId === worldId); + res.status(200).json(filteredCampaigns); }; \ No newline at end of file diff --git a/packages/backend/src/controllers/sessionController.ts b/packages/backend/src/controllers/sessionController.ts index aca87b5..70b07d8 100644 --- a/packages/backend/src/controllers/sessionController.ts +++ b/packages/backend/src/controllers/sessionController.ts @@ -54,4 +54,16 @@ export const listSessions = async (req: Request, res: Response) => { } catch (error) { res.status(500).json({ message: error.message }); } +}; + +export const getSessionDetails = async (req: Request, res: Response) => { + try { + const session = await Session.findOne({ externalId: req.params.externalId }).populate('characters'); + if (!session) { + return res.status(404).json({ message: 'Session not found' }); + } + res.status(200).json(session); + } catch (error) { + res.status(500).json({ message: error.message }); + } }; \ No newline at end of file diff --git a/packages/backend/src/controllers/worldController.ts b/packages/backend/src/controllers/worldController.ts index 308b8f6..793bc5d 100644 --- a/packages/backend/src/controllers/worldController.ts +++ b/packages/backend/src/controllers/worldController.ts @@ -48,10 +48,61 @@ export const deleteWorld = async (req: Request, res: Response) => { }; export const listWorlds = async (req: Request, res: Response) => { + const { search, ccId, vibe, page = 1, limit = 10 } = req.query; try { - const worlds = await World.find({}); - res.status(200).json(worlds); + let query: any = {}; + if (search) { + query.name = { $regex: search, $options: 'i' }; + } + if (ccId) { + query.ccId = ccId; + } + if (vibe) { + query.vibe = vibe; + } + const worlds = await World.find(query) + .skip((page - 1) * limit) + .limit(limit); + const total = await World.countDocuments(query); + res.status(200).json({ worlds, total, page, limit }); } catch (error) { res.status(500).json({ message: error.message }); } +}; + +// Example mock data for worlds +const mockWorlds = [ + { + _id: '1', + ccid: 'admin01' + name: 'Fantasy Land', + description: 'A world full of magic and dragons.', + vibe: 'chill', + externalId: 'world-1', + // ... other properties ... + }, + { + _id: '42', + ccid: 'admin01' + name: 'Techno Land', + description: 'A world full of technology and gadgets.', + vibe: 'intense', + externalId: 'world-2', + // ... other properties ... + }, + { + _id: '70', + ccid: 'admin01' + name: 'Dimension Travlers Land', + description: 'A world full of things unimaginable.', + vibe: 'unknown', + externalId: 'world-3', + // ... other properties ... + }, + // ... more mock worlds ... +]; + +// Serve mock data in your API route +export const listWorlds = async (req: Request, res: Response) => { + res.status(200).json(mockWorlds); }; \ No newline at end of file diff --git a/packages/backend/src/models/Campaign.ts b/packages/backend/src/models/Campaign.ts index bf42685..9df4430 100644 --- a/packages/backend/src/models/Campaign.ts +++ b/packages/backend/src/models/Campaign.ts @@ -12,6 +12,7 @@ const campaignSchema = new Schema({ sessionZero: { type: Boolean, required: true }, frequency: { type: String, enum: ['one_shot', 'regular_cadence', 'custom_cadence'], required: true }, scheduledSessions: [{ type: Date }], + permissions: [{ type: String }], notifications: [{ type: Schema.Types.ObjectId, ref: 'Notification' }], }); diff --git a/packages/backend/src/models/Character.ts b/packages/backend/src/models/Character.ts index 4506963..3972582 100644 --- a/packages/backend/src/models/Character.ts +++ b/packages/backend/src/models/Character.ts @@ -1,9 +1,9 @@ import { Schema, model } from 'mongoose'; const characterSchema = new Schema({ - campaignId: { type: Schema.Types.ObjectId, ref: 'Campaign', required: true }, - ccId: { type: String, required: true }, - externalId: { type: String, required: true, unique: true, index: true }, + campaignId: { type: Schema.Types.ObjectId, ref: 'Campaign', required: true }, + ccId: { type: String, required: true }, + externalId: { type: String, required: true, unique: true, index: true }, name: { type: String, required: true }, class: { type: String, required: true }, race: { type: String, required: true }, @@ -11,6 +11,7 @@ const characterSchema = new Schema({ createdBy: { type: String, required: true }, isGmMade: { type: Boolean, required: true }, isCampaignLocked: { type: Boolean, required: true }, + permissions: [{ type: String }], }); export const Character = model('Character', characterSchema); \ No newline at end of file diff --git a/packages/backend/src/models/Session.ts b/packages/backend/src/models/Session.ts index fd43f4d..cafeeb4 100644 --- a/packages/backend/src/models/Session.ts +++ b/packages/backend/src/models/Session.ts @@ -1,11 +1,13 @@ import { Schema, model } from 'mongoose'; const sessionSchema = new Schema({ - campaignId: { type: Schema.Types.ObjectId, ref: 'Campaign', required: true }, - externalId: { type: String, required: true, unique: true, index: true }, + campaignId: { type: Schema.Types.ObjectId, ref: 'Campaign', required: true }, + externalId: { type: String, required: true, unique: true, index: true }, sessionNumber: { type: Number, required: true }, date: { type: Date, required: true }, description: { type: String, required: false }, + characters: [{ type: Schema.Types.ObjectId, ref: 'Character' }], + permissions: [{ type: String }], }); export const Session = model('Session', sessionSchema); \ No newline at end of file diff --git a/packages/backend/src/models/World.ts b/packages/backend/src/models/World.ts index bf23cef..c8435b8 100644 --- a/packages/backend/src/models/World.ts +++ b/packages/backend/src/models/World.ts @@ -2,10 +2,11 @@ import { Schema, model } from 'mongoose'; const worldSchema = new Schema({ name: { type: String, required: true }, - description: { type: String, required: true }, + description: { type: String, required: true }, vibe: { type: String, required: true }, - ccId: { type: String, required: true }, + ccId: { type: String, required: true }, externalId: { type: String, required: true, unique: true, index: true }, + permissions: [{ type: String }], }); export const World = model('World', worldSchema); \ No newline at end of file diff --git a/packages/nextjs/app/page.tsx b/packages/nextjs/app/page.tsx index 8243e2f..f2cca4a 100644 --- a/packages/nextjs/app/page.tsx +++ b/packages/nextjs/app/page.tsx @@ -15,7 +15,7 @@ const Home: NextPage = () => {

Welcome to - Scaffold-OP 🏗🔴 + D&D Campaign Scheduler 🐉🗓️

Connected Address:

@@ -39,6 +39,16 @@ const Home: NextPage = () => {

+
+ Create a Campaign +
+
+ View Worlds +
+
+ View Campaigns +
+
diff --git a/packages/nextjs/contracts/deployedContracts.ts b/packages/nextjs/contracts/deployedContracts.ts index 008d4eb..e1437ef 100644 --- a/packages/nextjs/contracts/deployedContracts.ts +++ b/packages/nextjs/contracts/deployedContracts.ts @@ -4,6 +4,431 @@ */ import { GenericContractsDeclaration } from "~~/utils/scaffold-eth/contract"; -const deployedContracts = {} as const; +const deployedContracts = { + 31337: { + BuyMeACoffee: { + address: "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + abi: [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "InsufficientFunds", + type: "error", + }, + { + inputs: [ + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "InvalidArguments", + type: "error", + }, + { + inputs: [], + name: "OnlyOwner", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "buyer", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "price", + type: "uint256", + }, + ], + name: "BuyMeACoffeeEvent", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "userAddress", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "numCoffees", + type: "uint256", + }, + { + indexed: false, + internalType: "string", + name: "userName", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "twitterHandle", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "NewMemo", + type: "event", + }, + { + inputs: [ + { + internalType: "uint256", + name: "numCoffees", + type: "uint256", + }, + { + internalType: "string", + name: "userName", + type: "string", + }, + { + internalType: "string", + name: "twitterHandle", + type: "string", + }, + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "buyCoffee", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "getMemos", + outputs: [ + { + components: [ + { + internalType: "uint256", + name: "numCoffees", + type: "uint256", + }, + { + internalType: "string", + name: "userName", + type: "string", + }, + { + internalType: "string", + name: "twitterHandle", + type: "string", + }, + { + internalType: "string", + name: "message", + type: "string", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "address", + name: "userAddress", + type: "address", + }, + ], + internalType: "struct Memo[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "memos", + outputs: [ + { + internalType: "uint256", + name: "numCoffees", + type: "uint256", + }, + { + internalType: "string", + name: "userName", + type: "string", + }, + { + internalType: "string", + name: "twitterHandle", + type: "string", + }, + { + internalType: "string", + name: "message", + type: "string", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "address", + name: "userAddress", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "modifyMemoMessage", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "price", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + ], + name: "removeMemo", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "withdrawTips", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + stateMutability: "payable", + type: "receive", + }, + ], + inheritedFunctions: {}, + }, + YourContract: { + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "greetingSetter", + type: "address", + }, + { + indexed: false, + internalType: "string", + name: "newGreeting", + type: "string", + }, + { + indexed: false, + internalType: "bool", + name: "premium", + type: "bool", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "GreetingChange", + type: "event", + }, + { + inputs: [], + name: "greeting", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "premium", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "string", + name: "_newGreeting", + type: "string", + }, + ], + name: "setGreeting", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "totalCounter", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "userGreetingCounter", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + stateMutability: "payable", + type: "receive", + }, + ], + inheritedFunctions: {}, + }, + }, +} as const; export default deployedContracts satisfies GenericContractsDeclaration; diff --git a/packages/nextjs/next-env.d.ts b/packages/nextjs/next-env.d.ts index 4f11a03..fd36f94 100644 --- a/packages/nextjs/next-env.d.ts +++ b/packages/nextjs/next-env.d.ts @@ -1,5 +1,6 @@ /// /// +/// // NOTE: This file should not be edited // see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/packages/nextjs/pages/campaigns/campaignDetails.tsx b/packages/nextjs/pages/campaigns/campaignDetails.tsx index e69de29..79f394d 100644 --- a/packages/nextjs/pages/campaigns/campaignDetails.tsx +++ b/packages/nextjs/pages/campaigns/campaignDetails.tsx @@ -0,0 +1,56 @@ +import { useEffect, useState } from "react"; +import { useRouter } from "next/router"; +import { Campaign } from "../../types/types"; + +const CampaignDetails = () => { + const router = useRouter(); + const { externalId } = router.query; + const [campaign, setCampaign] = useState(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + setLoading(true); + const fetchCampaignDetails = async () => { + if (!externalId) { + setLoading(false); + return; + } + try { + const response = await fetch(`/api/campaigns/${externalId}`); + if (!response.ok) { + throw new Error("Failed to fetch campaign details"); + } + const data = await response.json(); + setCampaign(data); + } catch (error) { + if (error instanceof Error) { + setError(error.message); + } else { + setError("An unexpected error occurred"); + } + } finally { + setLoading(false); + } + }; + + fetchCampaignDetails(); + }, [externalId]); + + if (loading) return
Loading...
; + if (error) return
Error: {error}
; + if (!campaign) return
No campaign found
; + + return ( +
+

{campaign.name}

+

{campaign.description}

+

{campaign.worldId}

+

{campaign.numCharacters}

+

{campaign.frequency}

+

{campaign.scheduledSessions.map(session => session.toLocaleString()).join(", ")}

+
+ ); +}; + +export default CampaignDetails; diff --git a/packages/nextjs/pages/campaigns/createCampaign.tsx b/packages/nextjs/pages/campaigns/createCampaign.tsx index e69de29..836e2a2 100644 --- a/packages/nextjs/pages/campaigns/createCampaign.tsx +++ b/packages/nextjs/pages/campaigns/createCampaign.tsx @@ -0,0 +1,134 @@ +import React, { useEffect, useState } from "react"; +import { useRouter } from "next/router"; +import { User, World } from "../../types/types"; +import { useSession } from "next-auth/react"; + +const CreateCampaign = () => { + const { data: sessionData } = useSession(); + const user = sessionData?.user as User | undefined; // Cast session data to your User type + const router = useRouter(); + const [worlds, setWorlds] = useState([]); + + const [formState, setFormState] = useState({ + name: "", + description: "", + worldId: "", + ccId: user?.ccId || "", // Initially empty, will be set when the component mounts and we have the session data + numCharacters: 0, + numGmMadeCharacters: 0, + numPlayerMadeCharacters: 0, + sessionZero: false, + frequency: "one_shot", + scheduledSessions: [], + notifications: [], + }); + + useEffect(() => { + // When the component mounts, set the ccId if the user is authenticated + if (user?.ccId) { + setFormState(prevState => ({ + ...prevState, + ccId: user.ccId || "", // Provide a default empty string if user.ccId is undefined + })); + } + // Fetch worlds and check if the user is the owner or has permissions + fetch("/api/worlds") + .then(response => response.json()) + .then((worldsData: World[]) => { + // Add explicit type annotation here + const userWorlds = worldsData.filter( + (world: World) => world.ccId === user?.ccId || world.permissions?.includes(user?.ccId ?? ""), + ); + setWorlds(userWorlds); + }) + .catch(error => { + // Handle errors more specifically here + console.error("Failed to fetch worlds:", error); + // Consider setting an error state and displaying it to the user + }); + }, [user]); + + useEffect(() => { + // Fetch worlds from the backend and set them in state + fetch("/api/worlds") + .then(response => response.json()) + .then(setWorlds) + .catch(console.error); // Handle errors appropriately + }, []); + + const handleChange = (e: React.ChangeEvent) => { + const { name, value } = e.target; + setFormState(prev => ({ ...prev, [name]: value })); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + try { + const response = await fetch("/api/campaigns", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(formState), + }); + if (!response.ok) throw new Error("Campaign creation failed"); + // Redirect to a success page or the campaign details page + router.push("/campaigns/success"); + } catch (error) { + console.error("Failed to create campaign:", error); + } + }; + + return ( +
+ {worlds.length > 0 ? ( +
+ +