Skip to content

Commit

Permalink
Merge pull request #3 from bleu/jean/op-157-schema-for-create_event
Browse files Browse the repository at this point in the history
add CreateEventSchema button
  • Loading branch information
JeanNeiverth authored Aug 27, 2024
2 parents 984d371 + 7d1ce5a commit 1ea5b61
Show file tree
Hide file tree
Showing 8 changed files with 370 additions and 115 deletions.
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"dependencies": {
"@ethereum-attestation-service/eas-contracts": "^1.7.1",
"@ethereum-attestation-service/eas-sdk": "^2.5.0",
"@radix-ui/themes": "^3.1.3",
"@rainbow-me/rainbowkit": "^2.1.5",
"@tanstack/react-query": "^5.52.1",
"class-variance-authority": "^0.7.0",
Expand All @@ -21,6 +22,7 @@
"react": "^18",
"react-dom": "^18",
"react-query": "^3.39.3",
"styled-components": "^6.1.12",
"tailwind-merge": "^2.5.2",
"urql": "^4.1.0",
"viem": "2.x",
Expand Down
8 changes: 1 addition & 7 deletions src/app/providers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,12 @@ import { Provider } from "urql";
import { client } from "../lib/urql-client";

import '@rainbow-me/rainbowkit/styles.css';
import {
getDefaultConfig,
RainbowKitProvider,
type Locale,
} from '@rainbow-me/rainbowkit';
import { useRouter } from 'next/router';
import { RainbowKitProvider} from '@rainbow-me/rainbowkit';

export function Providers(props: {
children: ReactNode;
initialState?: State;
}) {
// const {locale} = useRouter() as {locale:Locale}
const [config] = useState(() => getConfig());
const [queryClient] = useState(() => new QueryClient());

Expand Down
40 changes: 40 additions & 0 deletions src/components/CreateEventSchemaButton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { useRegistrySchema } from "@/hooks/useRegistrySchema";
import { zeroAddress } from "viem";

// const today = new Date();
// const tomorrow = new Date();
// tomorrow.setDate(today.getDate()+1);
// const newEvent = {
// owner:"0xa90914762709441d557De208bAcE1edB1A3968b2",
// name:"test",
// briefDescription:"test description",
// fullDescription:"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate, numquam! Esse officia molestiae illum nihil dolorum rem debitis laborum ab. Quaerat voluptatibus repellendus deserunt porro distinctio laboriosam earum nesciunt laborum?",
// startsAt: today.valueOf(),
// endsAt: tomorrow.valueOf(),
// imageUrl:"https://picsum.photos/id/237/200/300",
// } as EventSchema
// console.log('newEvent', newEvent)

const CREATE_EVENT_SCHEMA =
"string name, string briefDescription, string fullDescription, uint256 startsAt, uint256 endsAt, string imageUrl"

export function CreateEventSchemaButton() {
const registrySchema = useRegistrySchema();

async function handleCreateEventSchema() {
registrySchema({
schema:CREATE_EVENT_SCHEMA,
resolver:zeroAddress,
revocable:true,
})
}

return (
<button
className="bg-white hover:bg-gray-300 text-gray-800 font-semibold mr-4 py-2 px-4 border border-gray-400 rounded-lg shadow"
onClick={handleCreateEventSchema}
>
Create Event Schema
</button>
)
}
86 changes: 2 additions & 84 deletions src/components/Header.tsx
Original file line number Diff line number Diff line change
@@ -1,91 +1,8 @@
// "use client";
// import React from "react";
// import { useAccount, useBalance, useConnect, useDisconnect, useEnsName } from "wagmi";
// import { Button } from "@/components/ui/button";
// import {
// DropdownMenu,
// DropdownMenuContent,
// DropdownMenuItem,
// DropdownMenuTrigger,
// } from "@/components/ui/dropdown-menu";

// function formatAddress(address:string) {
// return address.slice(0, 6) + "..." + address.slice(-4);
// }

// function DisconnectWallet({ balance, connector, ensName, address, disconnect }:any) {
// return (
// <DropdownMenu>
// <div className="flex items-center justify-center">
// <DropdownMenuTrigger asChild>
// <Button className="bg-white text-red-500">
// {ensName ? ensName : formatAddress(address)}
// </Button>
// </DropdownMenuTrigger>
// <p>{connector?.name || ""}</p>
// <p>OPT: {balance?.data ? balance.data.formatted : "Sem balanço"}</p>
// </div>
// <DropdownMenuContent>
// <DropdownMenuItem onClick={() => disconnect()}>
// Disconnect
// </DropdownMenuItem>
// </DropdownMenuContent>
// </DropdownMenu>
// );
// }

// export function Header() {
// const { address, isConnected, connector, chain } = useAccount();
// const { data: ensName } = useEnsName({address,});
// const { connect, connectors } = useConnect();
// const { disconnect } = useDisconnect();
// const balance = useBalance({address,chainId:10})

// function ConnectWallet({ connectors }:any) {
// return (
// <DropdownMenu>
// <DropdownMenuTrigger asChild>
// <Button className="bg-white text-red-500">Connect Wallet</Button>
// </DropdownMenuTrigger>
// <DropdownMenuContent>
// {connectors.map((connector:any) => (
// <DropdownMenuItem
// key={connector.id}
// onClick={() => connect({ connector })}
// >
// {connector.name}
// </DropdownMenuItem>
// ))}
// </DropdownMenuContent>
// </DropdownMenu>
// );
// }

// console.log(balance);

// return (
// <header className="bg-red-500 text-white p-4">
// <div className="container mx-auto flex justify-between items-center">
// <h1 className="text-2xl font-bold">Bacchus: Events and Invitations</h1>
// {isConnected ? (
// <DisconnectWallet
// balance={balance}
// connector={connector}
// ensName={ensName}
// address={address}
// disconnect={disconnect}
// />
// ) : (
// <ConnectWallet connectors={connectors} />
// )}
// </div>
// </header>
// );
// }
"use client"


import { ConnectButton } from '@rainbow-me/rainbowkit';
import { CreateEventSchemaButton } from './CreateEventSchemaButton';

export function Header() {
return (
Expand All @@ -96,6 +13,7 @@ export function Header() {
padding: 12,
}}
>
<CreateEventSchemaButton />
<ConnectButton />
</div>
);
Expand Down
80 changes: 80 additions & 0 deletions src/hooks/useRegistrySchema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { useSigner } from "@/hooks/useSigner";
import { encodePacked, keccak256, zeroAddress } from "viem";
import { EAS, SchemaRegistry } from "@ethereum-attestation-service/eas-sdk";
import { useCallback, useEffect, useState } from "react";
import type {Address} from "viem"

interface RegistrySchemaParms {
schema: string,
resolver:Address,
revocable:boolean,
};

export const useRegistrySchema = () => {

// Addresses only valid for Optimism Sepolia
const EAS_CONTRACT_ADDRESS = "0x4200000000000000000000000000000000000021"
const SCHEMA_REGISTRY_CONTRACT_ADDRESS = "0x4200000000000000000000000000000000000020"

const [schemaRegistry, setSchemaRegistry] = useState<SchemaRegistry | null>(null);
const [eas, setEas] = useState<EAS | null>(null);
const signer = useSigner();

useEffect(() => {
if (signer) {
const newEas = new EAS(EAS_CONTRACT_ADDRESS);
newEas.connect(signer);
setEas(newEas);

const newSchemaRegistry = new SchemaRegistry(SCHEMA_REGISTRY_CONTRACT_ADDRESS);
newSchemaRegistry.connect(signer);
setSchemaRegistry(newSchemaRegistry);
}
}, [signer]);

const registrySchema = useCallback(async ({schema, resolver, revocable}:RegistrySchemaParms) => {
console.log(`
---Called registrySchema. Create Schema:
schema: ${schema}
resolver: ${resolver}
revocable: ${revocable}
---
`)

const SCHEMA_UID = keccak256(
encodePacked(
["string", "address", "bool"],
[schema, resolver, revocable],
),
);
console.log('Schema UID:',SCHEMA_UID)

const isAbleToOperateSchema = (signer && schemaRegistry)
console.log('isAbleToOperateSchema',isAbleToOperateSchema);

if (isAbleToOperateSchema) {
try {
await schemaRegistry.getSchema({ uid: SCHEMA_UID });
console.log('No errors getting schema');
} catch (e) {
// If schemas don't exist, create them
console.log('No existing schema, creating a new one...');
const selfAttestationTx = await schemaRegistry.connect(signer).register({
schema: schema,
resolverAddress: zeroAddress,
revocable: true,
});
await selfAttestationTx.wait();
console.log('Schema should have been created!');
}
} else {
console.log('Not possible to create schema');
console.log('signer',signer)
console.log('schemaRegistry',schemaRegistry)
}
}
,[signer,schemaRegistry]);

return registrySchema;
}
39 changes: 39 additions & 0 deletions src/hooks/useSigner.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// based on https://gist.github.com/slavik0329/2e5b6fc31cb745b65d3d37f7cf1d7b36
import { useEffect, useState } from "react";
import { useWalletClient } from "wagmi";
import { type WalletClient } from "viem";
import { BrowserProvider, JsonRpcSigner } from "ethers";

export async function walletClientToSigner(walletClient: WalletClient) {
const { account, chain, transport } = walletClient;
if (!chain || !account) {
return;
}

const network = {
chainId: chain.id,
name: chain.name,
ensAddress: chain.contracts?.ensRegistry?.address,
};

const provider = new BrowserProvider(transport, network);
const signer = await provider.getSigner(account.address);

return signer;
}

export function useSigner() {
const { data: walletClient } = useWalletClient();

const [signer, setSigner] = useState<JsonRpcSigner | undefined>(undefined);

useEffect(() => {
if (walletClient) {
walletClientToSigner(walletClient).then((signer) => {
setSigner(signer);
});
}
}, [walletClient]);

return signer;
}
9 changes: 4 additions & 5 deletions src/wagmi.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { http, cookieStorage, createConfig, createStorage } from "wagmi";
import { mainnet, optimism, sepolia } from "wagmi/chains";
import { optimism, optimismSepolia } from "wagmi/chains";
import { coinbaseWallet, injected } from "wagmi/connectors";

export function getConfig() {
return createConfig({
chains: [optimism],
chains: [optimismSepolia],
connectors: [
injected(),
coinbaseWallet(),
Expand All @@ -15,9 +15,8 @@ export function getConfig() {
}),
ssr: true,
transports: {
// [mainnet.id]: http(),
// [sepolia.id]: http(),
[optimism.id]: http(),
// [optimism.id]: http(),
[optimismSepolia.id]: http(),
},
});
}
Expand Down
Loading

0 comments on commit 1ea5b61

Please sign in to comment.