diff --git a/app/terms/page.tsx b/app/terms/page.tsx
deleted file mode 100644
index ec2753b..0000000
--- a/app/terms/page.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-function PlaceholderParagraph() {
- return (
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lacinia odio vitae vestibulum. Donec magna purus,
- lacinia vel hendrerit vitae, vulputate suscipit leo. Donec sed tincidunt libero. Sed cursus euismod purus, id
- tempus tellus malesuada at. Nulla facilisi. Duis sed eros mollis, tincidunt nibh sit amet, ultricies sapien.
- Pellentesque orci quis hendrerit et cursus. Maecenas lacinia velit vitae est finibus, vitae dictum neque
- hendrerit. Aenean ac eleifend enim. Pellentesque pellentesque erat vel ipsum ultrices, at tempus neque suscipit.
- Pellentesque auctor nisl ut lectus sagittis, vel elementum ligula egestas. Vivamus at hendrerit metus. In
- condimentum massa id nisi aliquet, nec vulputate turpis ultrices. Nullam at libero ultrices, ultrices sapien ac,
- iaculis urna. Nulla venenatis, nisl scelerisque sollicitudin fermentum, neque elit posuere turpis, id mollis eros
- orci vitae felis.
-
- );
-}
-
-export default function Page() {
- return (
-
- );
-}
diff --git a/components/Navbar/ConnectWalletButton.tsx b/components/Navbar/ConnectWalletButton.tsx
index 332ce27..ab29f14 100644
--- a/components/Navbar/ConnectWalletButton.tsx
+++ b/components/Navbar/ConnectWalletButton.tsx
@@ -1,20 +1,65 @@
'use client';
+
import { shortenAddress } from '@/utils';
import { useWeb3Modal } from '@web3modal/wagmi/react';
-import { useAccount, useNetwork } from 'wagmi';
+import { useAccount, useNetwork, useSignMessage } from 'wagmi';
import ClientOnly from '../../utils/ClientOnly';
import { useEffect, useState } from 'react';
import clsx from 'clsx';
import { sepolia } from 'wagmi/chains';
+import { getSignMessageRequest, verifySignature } from '@/lib/server/platform';
export default function ConnectWalletButton() {
+ const notConnectedText = 'Connect Wallet';
+
const { open } = useWeb3Modal();
const { address, isConnected } = useAccount();
+ const { signMessageAsync } = useSignMessage();
const { chain } = useNetwork();
+ const [buttonText, setButtonText] = useState(notConnectedText);
+ const [requireSign, setRequireSign] = useState(false);
const [isCorrectNetwork, setIsCorrectNetwork] = useState(false);
const connectedText = address ? `Connected: ${shortenAddress(address as string)} (${chain ? chain.name : ''})` : '';
- const notConnectedText = 'Connect Wallet';
- const buttonText = isConnected ? (isCorrectNetwork ? connectedText : 'Switch to sepolia') : notConnectedText;
+
+ useEffect(() => {
+ // check if address previously signed
+ const validatedAddress = sessionStorage.getItem('validatedAddress');
+ if (isConnected) {
+ if (isCorrectNetwork) {
+ if (!validatedAddress) {
+ setRequireSign(true);
+ setButtonText('Sign Message');
+ } else {
+ setButtonText(connectedText);
+ }
+ } else {
+ setButtonText('Switch to sepolia');
+ }
+ }
+ }, [connectedText, isConnected, isCorrectNetwork]);
+
+ const signIn = async () => {
+ try {
+ const chainId = chain?.id;
+ if (!address || !chainId) return;
+
+ setButtonText('Signing in...');
+
+ const { signingMessage } = await getSignMessageRequest(address);
+
+ console.log({ signingMessage });
+ const signature = await signMessageAsync({ message: signingMessage });
+ const verifyRes = await verifySignature(signature, address);
+ console.log({ verifyRes });
+
+ sessionStorage.setItem('validatedAddress', address);
+ setRequireSign(false);
+ setButtonText(connectedText);
+ } catch (e) {
+ setRequireSign(true);
+ setButtonText('Sign Message');
+ }
+ };
useEffect(() => {
if (chain?.id === sepolia.id) {
@@ -27,7 +72,7 @@ export default function ConnectWalletButton() {
return (
open()}
+ onClick={requireSign ? signIn : () => open()}
className={clsx({
['py-2 px-4 md:px-6 rounded-3xl text-white text-xs md:text-base font-semibold shadow-sm']: true,
['bg-sp-purple hover:bg-sp-purple-dark']: isCorrectNetwork || !isConnected,
diff --git a/components/Navbar/Sidebar.tsx b/components/Navbar/Sidebar.tsx
index 62daf15..d7b3da4 100644
--- a/components/Navbar/Sidebar.tsx
+++ b/components/Navbar/Sidebar.tsx
@@ -215,7 +215,7 @@ const Sidebar = ({ collapsed, navItems = defaultNavItems, shown, onHide }: Props
-
+
-
+
{collapsed ? (
) : (
diff --git a/components/views/Hook/HookTableComponent.tsx b/components/views/Hook/HookTableComponent.tsx
index 4f307f9..41b3009 100644
--- a/components/views/Hook/HookTableComponent.tsx
+++ b/components/views/Hook/HookTableComponent.tsx
@@ -11,7 +11,7 @@ import BaseDataViewer from '../BaseDataViewer';
const columns: ColumnDef[] = [
{
accessorKey: 'txHash',
- header: 'Txn',
+ header: 'Txn Hash',
cell: ({ row }) => (
{shortenString(row.original.txHash, 20)}
@@ -20,7 +20,7 @@ const columns: ColumnDef[] = [
},
{
accessorKey: 'id',
- header: 'ID',
+ header: 'Hook Address',
cell: ({ row }) => (
{shortenString(row.original.id, 20)}
diff --git a/lib/server/platform.ts b/lib/server/platform.ts
new file mode 100644
index 0000000..0d7306a
--- /dev/null
+++ b/lib/server/platform.ts
@@ -0,0 +1,28 @@
+export async function getSignMessageRequest(walletAddress: `0x${string}`): Promise<{ signingMessage: string }> {
+ try {
+ const res = await fetch(
+ `${process.env.NEXT_PUBLIC_API_BASE_URL}/platform/web3-sign/request?walletAddress=${walletAddress}`,
+ );
+ const data = await res.json();
+ console.log({ data });
+ return data;
+ } catch (e) {
+ throw new Error('Failed to get sign message request');
+ }
+}
+
+export async function verifySignature(signature: string, walletAddress: `0x${string}`) {
+ try {
+ const res = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/platform/web3-sign/verify`, {
+ method: 'POST',
+ body: JSON.stringify({
+ signature,
+ walletAddress,
+ }),
+ });
+ const response = await res.json();
+ return response;
+ } catch (e) {
+ throw new Error('Failed to verify signature');
+ }
+}
diff --git a/public/tos.pdf b/public/tos.pdf
new file mode 100644
index 0000000..1a50cd8
Binary files /dev/null and b/public/tos.pdf differ