From eb99df26aa602e10bad8370fa91ff7e085f4a285 Mon Sep 17 00:00:00 2001 From: samuel Date: Mon, 4 Mar 2024 15:34:09 +0100 Subject: [PATCH] Fix --- apps/devtool/data-store/storage.json | 52 ++++++++ apps/devtool/public/favicon.ico | Bin 15086 -> 1795 bytes apps/devtool/public/narval-wordmark.png | Bin 0 -> 25240 bytes apps/devtool/src/app/api/data-store/route.ts | 26 ++++ apps/devtool/src/app/api/policies/route.ts | 7 -- apps/devtool/src/app/api/signature/route.ts | 14 --- .../src/app/components/EditorComponent.tsx | 114 +++++++++++------- apps/devtool/src/app/components/config.ts | 1 + apps/devtool/src/app/components/data.json | 39 ++++++ apps/devtool/src/app/components/example.json | 25 ---- package-lock.json | 26 ++++ package.json | 1 + 12 files changed, 213 insertions(+), 92 deletions(-) create mode 100644 apps/devtool/data-store/storage.json create mode 100644 apps/devtool/public/narval-wordmark.png create mode 100644 apps/devtool/src/app/api/data-store/route.ts delete mode 100644 apps/devtool/src/app/api/policies/route.ts delete mode 100644 apps/devtool/src/app/api/signature/route.ts create mode 100644 apps/devtool/src/app/components/data.json delete mode 100644 apps/devtool/src/app/components/example.json diff --git a/apps/devtool/data-store/storage.json b/apps/devtool/data-store/storage.json new file mode 100644 index 000000000..c164a17da --- /dev/null +++ b/apps/devtool/data-store/storage.json @@ -0,0 +1,52 @@ +{ + "entity": { + "signature": "0xa72428e25a2b9a90b0cbcd37804baae3f1a932a659f81fe57b311235a53276105f8d6058834ac544a65264d8363a9df2a6c58f3f790f7963af045ce836d8b9a31b", + "data": { + "addressBook": [], + "credentials": [], + "tokens": [], + "userGroupMembers": [], + "userGroups": [], + "userWallets": [], + "users": [], + "walletGroupMembers": [], + "walletGroups": [], + "wallets": [] + } + }, + "policy": { + "signature": "0xc4524c13303b29a302247c2edfa9b9aa34d7c16f3890b297e30c0fa105f74d1c478138e75d03e23ca5e34a70d4d9417034f7b199fb481cba9e86bbb914ffda571b", + "data": [ + { + "id": "a68e8d20-0419-475c-8fcc-b17d4de8c955", + "name": "Authorized any admin to transfer ERC721 or ERC1155 tokens", + "when": [ + { + "criterion": "checkResourceIntegrity", + "args": null + }, + { + "criterion": "checkPrincipalRole", + "args": [ + "admin" + ] + }, + { + "criterion": "checkAction", + "args": [ + "signTransaction" + ] + }, + { + "criterion": "checkIntentType", + "args": [ + "transferErc721", + "transferErc1155" + ] + } + ], + "then": "permit" + } + ] + } +} \ No newline at end of file diff --git a/apps/devtool/public/favicon.ico b/apps/devtool/public/favicon.ico index 317ebcb2336e0833a22dddf0ab287849f26fda57..99940869226efbb2951d52c66e4690fd2ee8e478 100644 GIT binary patch literal 1795 zcmV+e2mJVnP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/apps/devtool/src/app/api/data-store/route.ts b/apps/devtool/src/app/api/data-store/route.ts new file mode 100644 index 000000000..5f0925c09 --- /dev/null +++ b/apps/devtool/src/app/api/data-store/route.ts @@ -0,0 +1,26 @@ +import { JSONFilePreset } from 'lowdb/node' +import type { NextApiRequest, NextApiResponse } from 'next' + +export const GET = async (req: NextApiRequest, res: NextApiResponse) => { + const db = await JSONFilePreset('./data-store/storage.json', { + entity: { signature: '', data: {} }, + policy: { signature: {}, data: [] } + }) + + return new Response(JSON.stringify({ ...db.data })) +} + +export const POST = async (req: NextApiRequest, res: NextApiResponse) => { + const { entity, policy } = await req.json() + + const db = await JSONFilePreset('./data-store/storage.json', { + entity: { signature: '', data: {} }, + policy: { signature: {}, data: [] } + }) + + db.data = { entity, policy } + + await db.write() + + return new Response(JSON.stringify({ ...db.data })) +} diff --git a/apps/devtool/src/app/api/policies/route.ts b/apps/devtool/src/app/api/policies/route.ts deleted file mode 100644 index e8b63ec02..000000000 --- a/apps/devtool/src/app/api/policies/route.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { readFileSync } from 'fs' -import type { NextApiRequest, NextApiResponse } from 'next' - -export const GET = async (req: NextApiRequest, res: NextApiResponse) => { - const policies = JSON.parse(readFileSync('./storage/policies.json', 'utf-8')) - return new Response(JSON.stringify({ ...policies })) -} diff --git a/apps/devtool/src/app/api/signature/route.ts b/apps/devtool/src/app/api/signature/route.ts deleted file mode 100644 index 884ea529a..000000000 --- a/apps/devtool/src/app/api/signature/route.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { readFileSync, writeFileSync } from 'fs' -import type { NextApiRequest, NextApiResponse } from 'next' - -export const GET = async (req: NextApiRequest, res: NextApiResponse) => { - const signature = JSON.parse(readFileSync('./storage/signature.json', 'utf-8')) - return new Response(JSON.stringify({ ...signature })) -} - -export const POST = async (req: NextApiRequest, res: NextApiResponse) => { - const { signature, policies } = await req.json() - writeFileSync('./storage/signature.json', JSON.stringify({ signature })) - writeFileSync('./storage/policies.json', JSON.stringify({ policies })) - return new Response('Success!') -} diff --git a/apps/devtool/src/app/components/EditorComponent.tsx b/apps/devtool/src/app/components/EditorComponent.tsx index f97f31c14..368a2a8b7 100644 --- a/apps/devtool/src/app/components/EditorComponent.tsx +++ b/apps/devtool/src/app/components/EditorComponent.tsx @@ -3,85 +3,107 @@ import Editor from '@monaco-editor/react' import { signMessage } from '@wagmi/core' import axios from 'axios' +import Image from 'next/image' import { useRef, useState } from 'react' import { useAccount, useConnect, useDisconnect } from 'wagmi' import { config } from './config' -import example from './example.json' +import example from './data.json' const EditorComponent = () => { const account = useAccount() const { connectors, connect } = useConnect() const { disconnect } = useDisconnect() - const [policies, setPolicies] = useState(JSON.stringify(example, null, 2)) - const [signature, setSignature] = useState('') + const [data, setData] = useState(JSON.stringify(example, null, 2)) + const [displayLink, setDisplayLink] = useState(false) const editorRef = useRef(null) const monacoRef = useRef(null) const sign = async () => { - if (!policies) return + if (!data) return - const sig = await signMessage(config, { message: policies }) - setSignature(sig) + const { entity, policy } = JSON.parse(data) - await axios.post('/api/signature', { policies: JSON.parse(policies), signature: sig }) + const entitySig = await signMessage(config, { message: JSON.stringify(entity) }) + const policySig = await signMessage(config, { message: JSON.stringify(policy) }) + + await axios.post('/api/data-store', { + entity: { + signature: entitySig, + data: entity + }, + policy: { + signature: policySig, + data: policy + } + }) + + setDisplayLink(true) } return (
-
- {account.status !== 'connected' && ( -
- {connectors.map((connector) => ( +
+ Narval Logo +
+ {!account.isConnected && ( +
+ {connectors.map((connector) => ( + + ))} +
+ )} + {account.isConnected && ( + <> - ))} -
- )} - {account.status === 'connected' && ( - <> - - - - )} + + + )} +
- {signature && ( - - Policies - - )} - {signature && ( - - Signature + {displayLink && ( + + Data Store )}
-
+
setPolicies(value)} + value={data} + onChange={(value) => setData(value)} onMount={(editor, monaco) => { editorRef.current = editor monacoRef.current = monaco diff --git a/apps/devtool/src/app/components/config.ts b/apps/devtool/src/app/components/config.ts index 6841c4083..24978457d 100644 --- a/apps/devtool/src/app/components/config.ts +++ b/apps/devtool/src/app/components/config.ts @@ -3,6 +3,7 @@ import { mainnet, sepolia } from 'wagmi/chains' export const config = createConfig({ chains: [mainnet, sepolia], + ssr: true, transports: { [mainnet.id]: http(), [sepolia.id]: http() diff --git a/apps/devtool/src/app/components/data.json b/apps/devtool/src/app/components/data.json new file mode 100644 index 000000000..5e928499f --- /dev/null +++ b/apps/devtool/src/app/components/data.json @@ -0,0 +1,39 @@ +{ + "entity": { + "addressBook": [], + "credentials": [], + "tokens": [], + "userGroupMembers": [], + "userGroups": [], + "userWallets": [], + "users": [], + "walletGroupMembers": [], + "walletGroups": [], + "wallets": [] + }, + "policy": [ + { + "id": "a68e8d20-0419-475c-8fcc-b17d4de8c955", + "name": "Authorized any admin to transfer ERC721 or ERC1155 tokens", + "when": [ + { + "criterion": "checkResourceIntegrity", + "args": null + }, + { + "criterion": "checkPrincipalRole", + "args": ["admin"] + }, + { + "criterion": "checkAction", + "args": ["signTransaction"] + }, + { + "criterion": "checkIntentType", + "args": ["transferErc721", "transferErc1155"] + } + ], + "then": "permit" + } + ] +} diff --git a/apps/devtool/src/app/components/example.json b/apps/devtool/src/app/components/example.json deleted file mode 100644 index 5de7d359b..000000000 --- a/apps/devtool/src/app/components/example.json +++ /dev/null @@ -1,25 +0,0 @@ -[ - { - "id": "a68e8d20-0419-475c-8fcc-b17d4de8c955", - "name": "Authorized any admin to transfer ERC721 or ERC1155 tokens", - "when": [ - { - "criterion": "checkResourceIntegrity", - "args": null - }, - { - "criterion": "checkPrincipalRole", - "args": ["admin"] - }, - { - "criterion": "checkAction", - "args": ["signTransaction"] - }, - { - "criterion": "checkIntentType", - "args": ["transferErc721", "transferErc1155"] - } - ], - "then": "permit" - } -] diff --git a/package-lock.json b/package-lock.json index 748ae7186..465c56d9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,7 @@ "handlebars": "^4.7.8", "jose": "^5.2.2", "lodash": "^4.17.21", + "lowdb": "^7.0.1", "next": "14.0.4", "prism-react-renderer": "^2.3.1", "react": "18.2.0", @@ -27898,6 +27899,20 @@ "loose-envify": "cli.js" } }, + "node_modules/lowdb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-7.0.1.tgz", + "integrity": "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==", + "dependencies": { + "steno": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -36060,6 +36075,17 @@ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" }, + "node_modules/steno": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/steno/-/steno-4.0.2.tgz", + "integrity": "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", diff --git a/package.json b/package.json index d79a8448b..8499606f1 100644 --- a/package.json +++ b/package.json @@ -102,6 +102,7 @@ "handlebars": "^4.7.8", "jose": "^5.2.2", "lodash": "^4.17.21", + "lowdb": "^7.0.1", "next": "14.0.4", "prism-react-renderer": "^2.3.1", "react": "18.2.0",