diff --git a/packages/hardhat/contracts/PixelCanvas.sol b/packages/hardhat/contracts/PixelCanvas.sol index e4b02d6..dc1e968 100644 --- a/packages/hardhat/contracts/PixelCanvas.sol +++ b/packages/hardhat/contracts/PixelCanvas.sol @@ -4,126 +4,215 @@ pragma solidity ^0.8.20; import "@openzeppelin/contracts/access/Ownable.sol"; contract PixelCanvas is Ownable { - // Canvas Dimensions - uint256 public constant CANVAS_WIDTH = 64; - uint256 public constant CANVAS_HEIGHT = 64; - - // Color Palette (Limited Options) - enum Color { - WHITE, - BLACK, - RED, - GREEN, - BLUE, - YELLOW, - PURPLE, - ORANGE - } - - // Pixel Structure - struct Pixel { - address author; - Color color; - uint256 timestamp; - } - - // Mapping to store modified pixels -mapping(uint256 => mapping(uint256 => Pixel)) public canvas; - - - // Events - event PixelPlaced(address indexed author, uint256 x, uint256 y, Color color); - event Withdrawal(address indexed owner, uint256 amount); - - // Constructor to initialize default Buidlguidl Batch11 drawing - constructor() Ownable(msg.sender){ - - // Initial drawing representing Buidlguidl Batch11 logo - initializeBuidlGuidlLogo(); - } - - /** - * @dev Initialize a default Buidlguidl Batch11 inspired pixel art - * This is a simplified representation and can be customized - */ - function initializeBuidlGuidlLogo() private { - for (uint256 x = 10; x < 20; x++) { - for (uint256 y = 10; y < 50; y++) { - canvas[x][y] = Pixel({ - author: msg.sender, - color: Color.BLUE, - timestamp: block.timestamp - }); - } - } - - // 11 representation with some pixels - for (uint256 x = 30; x < 40; x++) { - for (uint256 y = 20; y < 30; y++) { - canvas[x][y] = Pixel({ - author: msg.sender, - color: Color.GREEN, - timestamp: block.timestamp - }); - } - } - - // Add some distinctive pixels to represent Buidlguidl spirit - canvas[32][25] = Pixel({ - author: msg.sender, - color: Color.RED, - timestamp: block.timestamp - }); - } - - /** - * @dev Place a pixel on the canvas - * @param x X-coordinate of the pixel - * @param y Y-coordinate of the pixel - * @param color Color of the pixel - */ - function placePixel(uint256 x, uint256 y, Color color) external { - require(x < CANVAS_WIDTH, "X coordinate out of bounds"); - require(y < CANVAS_HEIGHT, "Y coordinate out of bounds"); - - canvas[x][y] = Pixel({ - author: msg.sender, - color: color, - timestamp: block.timestamp - }); - - emit PixelPlaced(msg.sender, x, y, color); -} - - - /** - * @dev Get pixel information - * @param x X-coordinate of the pixel - * @param y Y-coordinate of the pixel - * @return Pixel details - */ - function getPixel(uint256 x, uint256 y) external view returns (Pixel memory) { - require(x < CANVAS_WIDTH, "X coordinate out of bounds"); - require(y < CANVAS_HEIGHT, "Y coordinate out of bounds"); - return canvas[x][y]; -} - - - - function withdraw() external onlyOwner { - uint256 balance = address(this).balance; - require(balance > 0, "No funds to withdraw"); - - - (bool success, ) = payable(owner()).call{value: balance}(""); - require(success, "Transfer failed"); - - - emit Withdrawal(owner(), balance); -} - - // Fallback and receive functions to accept Ether - fallback() external payable {} - - receive() external payable {} + // Canvas Dimensions + uint256 public constant CANVAS_WIDTH = 64; + uint256 public constant CANVAS_HEIGHT = 64; + + // Color Palette (Limited Options) + enum Color { + WHITE, + BLACK, + RED, + GREEN, + BLUE, + YELLOW, + PURPLE, + ORANGE + } + + // Pixel Structure + struct Pixel { + address author; + Color color; + uint256 timestamp; + } + + // Mapping to store modified pixels + mapping(uint256 => mapping(uint256 => Pixel)) public canvas; + + // Events + event PixelPlaced( + address indexed author, + uint256 x, + uint256 y, + Color color + ); + event Withdrawal(address indexed owner, uint256 amount); + + // Constructor to initialize default Buidlguidl Batch11 drawing + constructor() Ownable(msg.sender) { + // Initial drawing representing Buidlguidl Batch11 logo + initializeBuidlGuidlLogo(); + } + + /** + * @dev Initialize a default Buidlguidl Batch11 inspired pixel art + * This is a simplified representation and can be customized + */ + function initializeBuidlGuidlLogo() private { + uint256 startx = 28; + uint256 starty = 28; + + canvas[startx][starty + 1] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx + 1][starty] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx + 1][starty + 1] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx + 1][starty + 2] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx + 1][starty + 3] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx + 1][starty + 4] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx][starty + 4] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + canvas[startx + 2][starty + 4] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + startx = 32; + + canvas[startx][starty + 1] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx + 1][starty] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx + 1][starty + 1] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx + 1][starty + 2] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx + 1][starty + 3] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx + 1][starty + 4] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + + canvas[startx][starty + 4] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + canvas[startx + 2][starty + 4] = Pixel({ + author: msg.sender, + color: Color.BLACK, + timestamp: block.timestamp + }); + } + + /** + * @dev Place a pixel on the canvas + * @param x X-coordinate of the pixel + * @param y Y-coordinate of the pixel + * @param color Color of the pixel + */ + function placePixel(uint256 x, uint256 y, Color color) external { + require(x < CANVAS_WIDTH, "X coordinate out of bounds"); + require(y < CANVAS_HEIGHT, "Y coordinate out of bounds"); + + canvas[x][y] = Pixel({ + author: msg.sender, + color: color, + timestamp: block.timestamp + }); + + emit PixelPlaced(msg.sender, x, y, color); + } + + /** + * @dev Get pixel information + * @param x X-coordinate of the pixel + * @param y Y-coordinate of the pixel + * @return Pixel details + */ + function getPixel( + uint256 x, + uint256 y + ) external view returns (Pixel memory) { + require(x < CANVAS_WIDTH, "X coordinate out of bounds"); + require(y < CANVAS_HEIGHT, "Y coordinate out of bounds"); + return canvas[x][y]; + } + + /** + * @dev Get the entire canvas as a 2D array of pixels + * @return Array of arrays containing all pixels + */ + function getFullCanvas() external view returns (Pixel[][] memory) { + Pixel[][] memory fullCanvas = new Pixel[][](CANVAS_WIDTH); + + for (uint256 x = 0; x < CANVAS_WIDTH; x++) { + fullCanvas[x] = new Pixel[](CANVAS_HEIGHT); + for (uint256 y = 0; y < CANVAS_HEIGHT; y++) { + fullCanvas[x][y] = canvas[x][y]; + } + } + + return fullCanvas; + } + + function withdraw() external onlyOwner { + uint256 balance = address(this).balance; + require(balance > 0, "No funds to withdraw"); + + (bool success, ) = payable(owner()).call{ value: balance }(""); + require(success, "Transfer failed"); + + emit Withdrawal(owner(), balance); + } + + // Fallback and receive functions to accept Ether + fallback() external payable {} + + receive() external payable {} } diff --git a/packages/nextjs/app/page.tsx b/packages/nextjs/app/page.tsx index f84a9f1..b94b64a 100644 --- a/packages/nextjs/app/page.tsx +++ b/packages/nextjs/app/page.tsx @@ -5,6 +5,7 @@ import type { NextPage } from "next"; import { BugAntIcon, MagnifyingGlassIcon } from "@heroicons/react/24/outline"; import BuildersGrid from "~~/components/batch/BuildersGrid"; import { useScaffoldReadContract } from "~~/hooks/scaffold-eth"; +import PixelCanvas from "~~/components/PixelCanvas"; const Home: NextPage = () => { const { data: checkedInCounter } = useScaffoldReadContract({ @@ -27,6 +28,8 @@ const Home: NextPage = () => {

+ +
diff --git a/packages/nextjs/components/PixelCanvas.tsx b/packages/nextjs/components/PixelCanvas.tsx new file mode 100644 index 0000000..ea29031 --- /dev/null +++ b/packages/nextjs/components/PixelCanvas.tsx @@ -0,0 +1,50 @@ +import { useScaffoldReadContract } from "~~/hooks/scaffold-eth"; + +const ColorMap = { + 0: "#FFFFFF", // WHITE + 1: "#000000", // BLACK + 2: "#FF0000", // RED + 3: "#00FF00", // GREEN + 4: "#0000FF", // BLUE + 5: "#FFFF00", // YELLOW + 6: "#800080", // PURPLE + 7: "#FFA500", // ORANGE +}; + +const PixelCanvas = () => { + const { data: canvasData } = useScaffoldReadContract({ + contractName: "PixelCanvas", + functionName: "getFullCanvas", + watch: true, + }); + + if (!canvasData?.length) { + return
Loading canvas...
; + } + + const width = canvasData.length; + const height = canvasData[0].length; + + return ( +
+ {Array.from({ length: height }, (_, y) => + Array.from({ length: width }, (_, x) => { + const pixel = canvasData[x][y]; + return ( +
+ ); + }), + ).flat()} +
+ ); +}; + +export default PixelCanvas; diff --git a/packages/nextjs/contracts/deployedContracts.ts b/packages/nextjs/contracts/deployedContracts.ts index 008d4eb..3c0b676 100644 --- a/packages/nextjs/contracts/deployedContracts.ts +++ b/packages/nextjs/contracts/deployedContracts.ts @@ -4,6 +4,915 @@ */ import { GenericContractsDeclaration } from "~~/utils/scaffold-eth/contract"; -const deployedContracts = {} as const; +const deployedContracts = { + 10: { + GilCheckin: { + address: "0xF96b0CbbD51513A7FB95960D0ac32e7A07990849", + abi: [ + { + inputs: [ + { + internalType: "address payable", + name: "_batchRegistry", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "OwnableInvalidOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "OwnableUnauthorizedAccount", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + stateMutability: "payable", + type: "fallback", + }, + { + inputs: [], + name: "batchRegistry", + outputs: [ + { + internalType: "contract BatchRegistry", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "checkIn", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + stateMutability: "payable", + type: "receive", + }, + ], + inheritedFunctions: { + owner: "@openzeppelin/contracts/access/Ownable.sol", + renounceOwnership: "@openzeppelin/contracts/access/Ownable.sol", + transferOwnership: "@openzeppelin/contracts/access/Ownable.sol", + }, + }, + }, + 31337: { + BatchRegistry: { + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "initialOwner", + type: "address", + }, + { + internalType: "uint16", + name: "batchNumber", + type: "uint16", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "AlreadyGraduated", + type: "error", + }, + { + inputs: [], + name: "BatchNotOpen", + type: "error", + }, + { + inputs: [], + name: "GraduationClosed", + type: "error", + }, + { + inputs: [], + name: "NotAContract", + type: "error", + }, + { + inputs: [], + name: "NotCheckedIn", + type: "error", + }, + { + inputs: [], + name: "NotInAllowList", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "OwnableInvalidOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "OwnableUnauthorizedAccount", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bool", + name: "first", + type: "bool", + }, + { + indexed: false, + internalType: "address", + name: "builder", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "checkInContract", + type: "address", + }, + ], + name: "CheckedIn", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + inputs: [], + name: "BATCH_NUMBER", + outputs: [ + { + internalType: "uint16", + name: "", + type: "uint16", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "allowList", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "batchGraduationNFT", + outputs: [ + { + internalType: "contract BatchGraduationNFT", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "checkIn", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "checkedInCounter", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "graduate", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "graduatedTokenId", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "graduationOpen", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isOpen", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "toggleBatchOpenStatus", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "toggleGraduationOpenStatus", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address[]", + name: "builders", + type: "address[]", + }, + { + internalType: "bool[]", + name: "statuses", + type: "bool[]", + }, + ], + name: "updateAllowList", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "yourContractAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + stateMutability: "payable", + type: "receive", + }, + ], + inheritedFunctions: { + owner: "@openzeppelin/contracts/access/Ownable.sol", + renounceOwnership: "@openzeppelin/contracts/access/Ownable.sol", + transferOwnership: "@openzeppelin/contracts/access/Ownable.sol", + }, + }, + PixelCanvas: { + address: "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + abi: [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "OwnableInvalidOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "OwnableUnauthorizedAccount", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "author", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "x", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "y", + type: "uint256", + }, + { + indexed: false, + internalType: "enum PixelCanvas.Color", + name: "color", + type: "uint8", + }, + ], + name: "PixelPlaced", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Withdrawal", + type: "event", + }, + { + stateMutability: "payable", + type: "fallback", + }, + { + inputs: [], + name: "CANVAS_HEIGHT", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "CANVAS_WIDTH", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "canvas", + outputs: [ + { + internalType: "address", + name: "author", + type: "address", + }, + { + internalType: "enum PixelCanvas.Color", + name: "color", + type: "uint8", + }, + { + internalType: "uint256", + name: "timestamp", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getFullCanvas", + outputs: [ + { + components: [ + { + internalType: "address", + name: "author", + type: "address", + }, + { + internalType: "enum PixelCanvas.Color", + name: "color", + type: "uint8", + }, + { + internalType: "uint256", + name: "timestamp", + type: "uint256", + }, + ], + internalType: "struct PixelCanvas.Pixel[][]", + name: "", + type: "tuple[][]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "x", + type: "uint256", + }, + { + internalType: "uint256", + name: "y", + type: "uint256", + }, + ], + name: "getPixel", + outputs: [ + { + components: [ + { + internalType: "address", + name: "author", + type: "address", + }, + { + internalType: "enum PixelCanvas.Color", + name: "color", + type: "uint8", + }, + { + internalType: "uint256", + name: "timestamp", + type: "uint256", + }, + ], + internalType: "struct PixelCanvas.Pixel", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "x", + type: "uint256", + }, + { + internalType: "uint256", + name: "y", + type: "uint256", + }, + { + internalType: "enum PixelCanvas.Color", + name: "color", + type: "uint8", + }, + ], + name: "placePixel", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + stateMutability: "payable", + type: "receive", + }, + ], + inheritedFunctions: { + owner: "@openzeppelin/contracts/access/Ownable.sol", + renounceOwnership: "@openzeppelin/contracts/access/Ownable.sol", + transferOwnership: "@openzeppelin/contracts/access/Ownable.sol", + }, + }, + }, + 11155420: { + GilCheckin: { + address: "0xdeBc123Fa83E91B15C27f54A2e7eaeEdAd676f85", + abi: [ + { + inputs: [ + { + internalType: "address payable", + name: "_batchRegistry", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "OwnableInvalidOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "OwnableUnauthorizedAccount", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + stateMutability: "payable", + type: "fallback", + }, + { + inputs: [], + name: "batchRegistry", + outputs: [ + { + internalType: "contract BatchRegistry", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "checkIn", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + stateMutability: "payable", + type: "receive", + }, + ], + inheritedFunctions: { + owner: "@openzeppelin/contracts/access/Ownable.sol", + renounceOwnership: "@openzeppelin/contracts/access/Ownable.sol", + transferOwnership: "@openzeppelin/contracts/access/Ownable.sol", + }, + }, + }, +} as const; export default deployedContracts satisfies GenericContractsDeclaration;