From bbe282ba58a2b0d1cc41c1ac51a9e7b643af8b24 Mon Sep 17 00:00:00 2001 From: Zishan Date: Mon, 4 Dec 2023 01:12:40 +0530 Subject: [PATCH] feat(updates): check for keyholder --- assets/key.png | Bin 0 -> 59673 bytes package.json | 1 + src/components/connectWallet.tsx | 55 ++-------- src/lib/hooks/useConnect.ts | 177 +++++++++++++++++++++++++++++++ src/main.tsx | 33 ++++-- src/pages/BuyFirstKey.tsx | 79 ++++++++++++++ src/pages/Home.tsx | 1 - src/pages/Login.tsx | 40 +++++++ tests/keys.test.ts | 22 ++++ yarn.lock | 62 ++++++++++- 10 files changed, 412 insertions(+), 58 deletions(-) create mode 100644 assets/key.png create mode 100644 src/lib/hooks/useConnect.ts create mode 100644 src/pages/BuyFirstKey.tsx create mode 100644 src/pages/Login.tsx diff --git a/assets/key.png b/assets/key.png new file mode 100644 index 0000000000000000000000000000000000000000..536fb125c086ab10987ff3359d1849b9fe5cb10a GIT binary patch literal 59673 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

`3Lw{K*) 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 p`1J4dZwvg}0{@E^IREpKtpdbJM literal 0 HcmV?d00001 diff --git a/package.json b/package.json index b8ec22f..669a7e3 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@hirosystems/clarinet-sdk": "^1.1.0", + "@micro-stacks/react": "^1.0.9", "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-icons": "^1.3.0", diff --git a/src/components/connectWallet.tsx b/src/components/connectWallet.tsx index da34b4d..f813b1b 100644 --- a/src/components/connectWallet.tsx +++ b/src/components/connectWallet.tsx @@ -21,58 +21,23 @@ import { ExternalLink } from '../external-link'; import { ArrowRight } from 'lucide-react'; import { truncateAddress, fetchSTXBalance } from '../lib/utils'; import { SVGComponent } from './stacksSvg'; +import useConnect from '@/lib/hooks/useConnect'; function ConnectWallet(): ReactElement { + const { + user, + connectWallet, + disconnectWallet, + network, + userSession, + balance + } = useConnect(); const [address, setAddress] = useState(''); - const [balance, setBalance] = useState(0); + const [isSignatureVerified, setIsSignatureVerified] = useState(false); const [hasFetchedReadOnly, setHasFetchedReadOnly] = useState(false); - // Initialize your app configuration and user session here - const appConfig = new AppConfig(['store_write', 'publish_data']); - const userSession = new UserSession({ appConfig }); - const message = 'Hello, Hiro Hacks!'; - const network = new StacksTestnet(); - - // Define your authentication options here - const authOptions = { - userSession, - appDetails: { - name: 'My App', - icon: 'src/favicon.svg' - }, - onFinish: async (data: FinishedAuthData) => { - // Handle successful authentication here - const userData = data.userSession.loadUserData(); - console.log(userData); - setAddress(userData.profile.stxAddress.testnet); // or .testnet for testnet - const fetchedSTXBalance = await fetchSTXBalance( - userData.profile.stxAddress.testnet - ) - .then((data) => { - console.log(data); - setBalance(data.balance / 1000000); - }) - .catch((error) => console.error(error)); - console.log('BALANCE', fetchedSTXBalance); - }, - onCancel: () => { - // Handle authentication cancellation here - }, - redirectTo: '/' - }; - - const connectWallet = () => { - showConnect(authOptions); - }; - - const disconnectWallet = () => { - if (userSession.isUserSignedIn()) { - userSession.signUserOut('/home'); - setAddress(''); - } - }; const fetchReadOnly = async (senderAddress: string) => { // Define your contract details here diff --git a/src/lib/hooks/useConnect.ts b/src/lib/hooks/useConnect.ts new file mode 100644 index 0000000..453e55a --- /dev/null +++ b/src/lib/hooks/useConnect.ts @@ -0,0 +1,177 @@ +import { + AppConfig, + FinishedAuthData, + UserData, + UserSession, + openSignatureRequestPopup, + showConnect +} from '@stacks/connect'; +import { verifyMessageSignatureRsv } from '@stacks/encryption'; +import { StacksDevnet } from '@stacks/network'; +import { + callReadOnlyFunction, + cvToValue, + getAddressFromPublicKey, + standardPrincipalCV +} from '@stacks/transactions'; +import { useAtom } from 'jotai'; +import { atomWithStorage } from 'jotai/utils'; +import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { fetchSTXBalance } from '../utils'; + +const initialValue = { + email: '', + decentralizedID: '', + identityAddress: '', + appPrivateKey: '', + hubUrl: '', + coreNode: '', + authResponseToken: '', + coreSessionToken: '', + gaiaAssociationToken: '', + profile: '', + gaiaHubConfig: '', + appPrivateKeyFromWalletSalt: '' +}; +const userWalletAtom = atomWithStorage('userWallet', initialValue); + +// Initialize your app configuration and user session here +const appConfig = new AppConfig(['store_write', 'publish_data']); +const userSession = new UserSession({ appConfig }); + +const message = 'Check if i am a keyholder ;)'; +const network = new StacksDevnet(); + +// Define your authentication options here + +function useConnect() { + const navigate = useNavigate(); + const [user, setUser] = useAtom(userWalletAtom); + const [balance, setBalance] = useState(0); + + const senderAddress = userSession.loadUserData().profile.stxAddress.testnet; + const contractAddress = 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'; + const contractName = 'cooperative-orange-gamefowl'; + const functionName = 'is-keyholder'; + + async function checkIsKeyHolder(principal: string) { + const functionArgs = [ + standardPrincipalCV(principal), + standardPrincipalCV(principal) + ]; + const result = await callReadOnlyFunction({ + network, + contractAddress, + contractName, + functionName, + functionArgs, + senderAddress + }); + + console.log('Result:', cvToValue(result)); + + return cvToValue(result); + } + + async function handleInitialLogin() { + if (userSession.isUserSignedIn()) { + await openSignatureRequestPopup({ + message, + network, + onFinish: async ({ publicKey, signature }) => { + const verified = verifyMessageSignatureRsv({ + message, + publicKey, + signature + }); + if (verified) { + // The signature is verified, so now we can check if the user is a keyholder + + const address = getAddressFromPublicKey(publicKey, network.version); + const isKeyHolder = await checkIsKeyHolder(address); + if (isKeyHolder) { + console.log('The user is a keyholder'); + navigate('/home'); + // The user is a keyholder, so they are authorized to access the chatroom + } else { + console.log('The user is not a keyholder'); + navigate('/buy-first-key'); + // The user is not a keyholder, so they are not authorized to access the chatroom + } + } + } + }); + } + } + + const authOptions = { + userSession, + appDetails: { + name: 'My App', + icon: 'src/favicon.svg' + }, + onFinish: async (data: FinishedAuthData) => { + // Handle successful authentication here + const userData = data.userSession.loadUserData(); + console.log(userData); + setUser(userData); // or .testnet for testnet + const fetchedSTXBalance = await fetchSTXBalance( + userData.profile.stxAddress.testnet + ) + .then((data) => { + console.log(data); + setBalance(data.balance / 1000000); + handleInitialLogin(); + }) + .catch((error) => console.error(error)); + console.log('BALANCE', fetchedSTXBalance); + }, + onCancel: () => { + // Handle authentication cancellation here + } + }; + + const fetchBalance = async () => { + if (userSession.isUserSignedIn()) { + const userData = userSession.loadUserData(); + try { + const fetchedSTXBalance = await fetchSTXBalance( + userData.profile.stxAddress.testnet + ); + setBalance(fetchedSTXBalance.balance / 1000000); + console.log('Fetched balance:', fetchedSTXBalance); + } catch (error) { + console.error('Failed to fetch balance:', error); + } + } + }; + + React.useEffect(() => { + fetchBalance(); + }, []); // The empty array causes this effect to only run on mount + + const connectWallet = () => { + showConnect(authOptions); + }; + + const disconnectWallet = () => { + if (userSession.isUserSignedIn()) { + userSession.signUserOut('/home'); + setUser(initialValue); + } + }; + + return { + connectWallet, + disconnectWallet, + user, + balance, + network, + userSession, + contractAddress, + contractName + }; +} + +export default useConnect; diff --git a/src/main.tsx b/src/main.tsx index 5a1d067..60d818d 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,23 +2,34 @@ import React from 'react'; import App from './App'; import { BrowserRouter, Link, Route, Routes } from 'react-router-dom'; import { createRoot } from 'react-dom/client'; +import * as MicroStacks from '@micro-stacks/react'; import './index.css'; import Home from './pages/Home'; import Profile from './pages/Profile'; import Explore from './pages/Explore'; import Chats from './pages/Chats'; +import Login from './pages/Login'; +import BuyFirstKey from './pages/BuyFirstKey'; createRoot(document.getElementById('root') as HTMLElement).render( - - - - } /> - } /> - } /> - } /> - } /> - - - + + + + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + ); diff --git a/src/pages/BuyFirstKey.tsx b/src/pages/BuyFirstKey.tsx new file mode 100644 index 0000000..4176b76 --- /dev/null +++ b/src/pages/BuyFirstKey.tsx @@ -0,0 +1,79 @@ +import useConnect from '@/lib/hooks/useConnect'; +import { useOpenContractCall } from '@micro-stacks/react'; +import { standardPrincipalCV, uintCV } from 'micro-stacks/clarity'; +import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; + +const BuyFirstKey: React.FC = () => { + const navigate = useNavigate(); + const { userSession, contractAddress, contractName } = useConnect(); + const { openContractCall, isRequestPending } = useOpenContractCall(); + + const [response, setResponse] = useState(null); + + const functionArgs = [ + standardPrincipalCV( + userSession?.loadUserData().profile?.stxAddress.testnet + ), + uintCV(1) + ]; + + const handleOpenContractCall = async () => { + await openContractCall({ + contractAddress: contractAddress, + contractName: contractName, + functionName: 'buy-keys', + functionArgs, + postConditions: [], + + onFinish: async (data: any) => { + console.log('finished contract call!', data); + setResponse(data); + navigate('/home'); + }, + onCancel: () => { + console.log('popup closed!'); + } + }); + }; + return ( +

+
+
+
+ +
+
+

Buy your first key

+ +

+ Everyone of sFriend.tech has a chat unlocked by their keys.These keys + can be bought and sold on a person's profile and their price goes up + and down based on how many are circulating. +

+ +

+ You'll earn trading fee everytime your keys are bought and sold by + anyone +

+ +

+ To create your profile, buy the first key to buy your own room for + free! +

+ +
+
+ ); +}; + +export default BuyFirstKey; diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 680497b..1dacf80 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -1,6 +1,5 @@ import ConnectWallet from '@/components/connectWallet'; import LeftMenu from '@/components/leftMenu'; -import React from 'react'; const Home = () => { return ( diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx new file mode 100644 index 0000000..f81beca --- /dev/null +++ b/src/pages/Login.tsx @@ -0,0 +1,40 @@ +import { SVGComponent } from '@/components/stacksSvg'; +import useConnect from '@/lib/hooks/useConnect'; +import { + callReadOnlyFunction, + standardPrincipalCV +} from '@stacks/transactions'; +import React from 'react'; + +const LoginPage: React.FC = () => { + const { connectWallet } = useConnect(); + return ( +
+
+
+
+ +

+ sFriend.tech +

+
+
+ +

The marketplace for your friends

+ + +
+
+ ); +}; + +export default LoginPage; diff --git a/tests/keys.test.ts b/tests/keys.test.ts index a315143..e21a051 100644 --- a/tests/keys.test.ts +++ b/tests/keys.test.ts @@ -146,6 +146,17 @@ describe('Core trade functionality', () => { }); it('buy & sell flow', () => { + const getKeyHolderResponse = simnet.callReadOnlyFn( + 'keys', + 'is-keyholder', + [Cl.standardPrincipal(subject1), Cl.standardPrincipal(subject1)], + subject1 + ); + + console.log(Cl.prettyPrint(getKeyHolderResponse.result)); + //@ts-ignore + expect(getKeyHolderResponse.result).toBeBool(false); + const setProtocolFeeDestination = simnet.callPublicFn( 'keys', 'set-protocol-fee-destination', @@ -176,6 +187,17 @@ describe('Core trade functionality', () => { //@ts-ignore expect(getSupplyResponse.result).toBeUint(1); + const getKeyHolderCheckResponse = simnet.callReadOnlyFn( + 'keys', + 'is-keyholder', + [Cl.standardPrincipal(subject1), Cl.standardPrincipal(subject1)], + subject1 + ); + + console.log(Cl.prettyPrint(getKeyHolderCheckResponse.result)); + //@ts-ignore + expect(getKeyHolderCheckResponse.result).toBeBool(true); + const buySubjectTwoShareResponse = simnet.callPublicFn( 'keys', 'buy-keys', diff --git a/yarn.lock b/yarn.lock index b8bf268..5b5fa23 100644 --- a/yarn.lock +++ b/yarn.lock @@ -760,6 +760,31 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@micro-stacks/client@1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@micro-stacks/client/-/client-1.2.1.tgz#9c1d71d9c03bdfc9a4e8df0079630944c2c76f93" + integrity sha512-/A8h6XPEPqF+Fo2ljYhH2i9I5BnnjrBIK8/xWF09Jr88vKn+mBK7kXCOSlO3qCU/RSZiB9w3zX6KGnv0SRoKDQ== + dependencies: + fast-deep-equal "3.1.3" + micro-stacks "1.2.1" + tiny-invariant ">=1.2.0" + zustand "4.1.1" + +"@micro-stacks/react@^1.0.9": + version "1.0.9" + resolved "https://registry.npmjs.org/@micro-stacks/react/-/react-1.0.9.tgz#ca6340f2efdd8f61eb42df77d856c0f343a15668" + integrity sha512-K9Xm6r5JIX1J1ijYJv/AaaiC2EgtNjeKkXhl7D0YM9lk0J9haN2Sxav9pI5nR7r6KYKcqUeAx71d9vBW9VxXsA== + dependencies: + "@micro-stacks/client" "1.2.1" + micro-stacks "1.2.1" + react-async-hook "^4.0.0" + use-sync-external-store "^1.2.0" + +"@noble/hashes@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + "@noble/hashes@1.1.5", "@noble/hashes@~1.1.1": version "1.1.5" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11" @@ -770,6 +795,11 @@ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== +"@noble/secp256k1@1.6.3": + version "1.6.3" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" + integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@^1.6.3": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -2510,7 +2540,7 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: +fast-deep-equal@3.1.3, fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -3414,6 +3444,14 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +micro-stacks@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/micro-stacks/-/micro-stacks-1.2.1.tgz#58ef75728635c77bf9522353b47f39aaf03896ce" + integrity sha512-CmFAH34GfgW9vMwnINflxH1COUWUg2kSYnPVfToZXPEJwHMGo8b3syte7s5zJ2rR/RSjpquQduiDNRAgF2Hh0w== + dependencies: + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.6.3" + micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -3858,6 +3896,11 @@ quick-lru@^4.0.1: resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +react-async-hook@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/react-async-hook/-/react-async-hook-4.0.0.tgz#1f0467586654e1f33b7433bd98c300a0c5f9b3d0" + integrity sha512-97lgjFkOcHCTYSrsKBpsXg3iVWM0LnzedB749iP76sb3/8Ouu4nHIkCLEOrQWHVYqrYxjF05NN6GHoXWFkB3Kw== + react-dom@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -4426,6 +4469,11 @@ through2@^4.0.0: resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tiny-invariant@>=1.2.0: + version "1.3.1" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + tinybench@^2.5.0: version "2.5.1" resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz#3408f6552125e53a5a48adee31261686fd71587e" @@ -4650,6 +4698,11 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" +use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -4870,3 +4923,10 @@ zone-file@^2.0.0-beta.3: version "2.0.0-beta.3" resolved "https://registry.npmjs.org/zone-file/-/zone-file-2.0.0-beta.3.tgz#fad3eb8c624ad8ae746b4547e9947804283048a1" integrity sha512-6tE3PSRcpN5lbTTLlkLez40WkNPc9vw/u1J2j6DBiy0jcVX48nCkWrx2EC+bWHqC2SLp069Xw4AdnYn/qp/W5g== + +zustand@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/zustand/-/zustand-4.1.1.tgz#5a61cc755a002df5f041840a414ae6e9a99ee22b" + integrity sha512-h4F3WMqsZgvvaE0n3lThx4MM81Ls9xebjvrABNzf5+jb3/03YjNTSgZXeyrvXDArMeV9untvWXRw1tY+ntPYbA== + dependencies: + use-sync-external-store "1.2.0"