diff --git a/package-lock.json b/package-lock.json index 87687a376..febbda2eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "dom-to-image": "^2.6.0", "downloadjs": "^1.4.7", "eslint": "^8.57.0", + "ethers": "^6.12.1", "flowbite": "^2.3.0", "flowbite-react": "^0.4.11", "flowbite-typography": "^1.0.3", @@ -83,6 +84,11 @@ "postcss": "^8.4.38" } }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -2047,6 +2053,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3137,6 +3165,11 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -6134,6 +6167,63 @@ "node": ">=0.10.0" } }, + "node_modules/ethers": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", + "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/ethers/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", diff --git a/package.json b/package.json index 81d3b060e..62a8c35ad 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "dom-to-image": "^2.6.0", "downloadjs": "^1.4.7", "eslint": "^8.57.0", + "ethers": "^6.12.1", "flowbite": "^2.3.0", "flowbite-react": "^0.4.11", "flowbite-typography": "^1.0.3", diff --git a/src/common/enums.ts b/src/common/enums.ts index dd66bea4f..83d5f5c6f 100644 --- a/src/common/enums.ts +++ b/src/common/enums.ts @@ -101,8 +101,17 @@ export enum BulkIssuanceStatus { } export enum DidMethod { - INDY = 'indy', - KEY = 'key', - WEB = 'web', - POLYGON = 'polygon' + INDY = 'did:indy', + KEY = 'did:key', + WEB = 'did:web', + POLYGON = 'did:polygon' +} + +export enum Network { + TESTNET = 'testnet', + MAINNET = 'mainnet' +} + +export enum CommonConstants { + BALANCELIMIT = 0.01 } \ No newline at end of file diff --git a/src/components/organization/configuration-settings/CreateDid.tsx b/src/components/organization/configuration-settings/CreateDid.tsx index d03369974..bf9ede751 100644 --- a/src/components/organization/configuration-settings/CreateDid.tsx +++ b/src/components/organization/configuration-settings/CreateDid.tsx @@ -1,5 +1,5 @@ import * as yup from 'yup'; -import { Button, Modal } from 'flowbite-react'; +import { Button, Checkbox, Label, Modal } from 'flowbite-react'; import { Field, Form, Formik } from 'formik'; import type { FormikHelpers as FormikActions } from 'formik'; import { apiStatusCodes, storageKeys } from '../../../config/CommonConstant'; @@ -7,15 +7,14 @@ import { useEffect, useState } from 'react'; import { AlertComponent } from '../../AlertComponent'; import type { AxiosResponse } from 'axios'; import { createDid, getOrganizationById } from '../../../api/organization'; -import type { EditOrgdetailsModalProps, IFormikValues, Organisation } from '../interfaces'; -import { createPolygonKeyValuePair, getLedgerConfig } from '../../../api/Agent'; +import type { EditOrgdetailsModalProps, IFormikValues } from '../interfaces'; +import { createPolygonKeyValuePair } from '../../../api/Agent'; import { DidMethod } from '../../../common/enums'; import { nanoid } from 'nanoid'; import TokenWarningMessage from '../walletCommonComponents/TokenWarningMessage'; import CopyDid from '../../../commonComponents/CopyDid'; -import GenerateBtnPolygon from '../walletCommonComponents/GenerateBtnPolygon'; import { getFromLocalStorage } from '../../../api/Auth'; - +import { ethers } from 'ethers'; interface IPolygonKeys { privateKey: string; @@ -23,46 +22,23 @@ interface IPolygonKeys { address: string; } -interface ILedgerConfig { - [method: string]: { - [network: string]: string; - }; -} - -interface ILedgerItem { - name: string; - details: { - [network: string]: string; - }; -} - const CreateDIDModal = (props: EditOrgdetailsModalProps) => { const [loading, setLoading] = useState(false); - const [mappedData, setMappedData] = useState({}); - const [erroMsg, setErrMsg] = useState(null); + const [errMsg, setErrMsg] = useState(null); const [successMsg, setSuccessMsg] = useState(null); const [seed, setSeed] = useState(''); - const [selectedMethod, setSelectedMethod] = useState(''); const [generatedKeys, setGeneratedKeys] = useState(null); - const [ledgerName, setLedgerName] = useState(null); - const fetchLedgerConfig = async () => { - try { - const { data } = (await getLedgerConfig()) as AxiosResponse; - if (data?.statusCode === apiStatusCodes.API_STATUS_SUCCESS) { - const ledgerdata: ILedgerConfig = {}; - data.data.forEach((item: ILedgerItem) => { - ledgerdata[item.name.toLowerCase()] = { ...item.details }; - }); - setMappedData(ledgerdata); - } - } catch (err) { - console.error('Error in fetching ledger config:::', err); - } - }; + const [ledgerValue, setLedgerValue] = useState(null); + const [method, setMethod] = useState(null); + const [networkValue, setNetworkValue] = useState(null); + const [completeDidMethodValue, setCompleteDidMethodValue] = useState(null); + const [havePrivateKey, setHavePrivateKey] = useState(false); + const [privateKeyValue, setPrivateKeyValue] = useState(''); + const [walletErrorMessage, setWalletErrorMessage] = useState(null); const fetchOrganizationDetails = async () => { const orgId = await getFromLocalStorage(storageKeys.ORG_ID); - const response = await getOrganizationById(orgId as string); + const response = await getOrganizationById(orgId); const { data } = response as AxiosResponse; setLoading(false); if (data?.statusCode === apiStatusCodes.API_STATUS_SUCCESS) { @@ -70,52 +46,102 @@ const CreateDIDModal = (props: EditOrgdetailsModalProps) => { ?.split(':') .slice(0, 2) .join(':'); - let getLedgerName; - switch (didMethod) { - case 'did:indy': - case 'did:polygon': - getLedgerName = data?.data?.org_agents[0]?.ledgers?.name; - setLedgerName(getLedgerName); - - break; - case 'did:web': - case 'did:key': - getLedgerName = data?.data?.org_agents[0]?.orgDid - ?.split(':') - .slice(1)[0]; - setLedgerName(getLedgerName); - - break; - default: - console.error('Unsupported DID format'); + setMethod(didMethod); + + + let ledgerName; + if (didMethod === DidMethod.INDY || DidMethod.POLYGON) { + ledgerName = data?.data?.org_agents[0]?.orgDid.split(':')[1]; + } else { + ledgerName = 'No Ledger'; + } + setLedgerValue(ledgerName); + + let networkName; + + if (didMethod === DidMethod.INDY) { + networkName = data?.data?.org_agents[0]?.orgDid.split(':').slice(2, 4).join(':'); + } else if (didMethod === DidMethod.POLYGON) { + networkName = data?.data?.org_agents[0]?.orgDid.split(':')[2]; + } else { + networkName = ''; + } + setNetworkValue(networkName); + + + let completeDidMethod; + + if (didMethod === DidMethod.INDY) { + completeDidMethod = data?.data?.org_agents[0]?.orgDid.split(':').slice(0, 4).join(':'); + } else { + completeDidMethod = didMethod; + } + setCompleteDidMethodValue(completeDidMethod); + } else { console.error('Error in fetching organization:::'); } - setLoading(false); }; useEffect(() => { fetchOrganizationDetails(); }, []); + + const checkBalance = async (privateKey: string) => { + try { + const testnetUrl = 'https://rpc-amoy.polygon.technology'; + + const provider = new ethers.JsonRpcProvider(testnetUrl) + + const wallet = new ethers.Wallet(privateKey, provider); + const address = await wallet.getAddress(); + const balance = await provider.getBalance(address); + + const etherBalance = ethers.formatEther(balance); + + if (parseFloat(etherBalance) < 0.01) { + setWalletErrorMessage('You have insufficient funds.'); + } else { + setWalletErrorMessage(null); + } + + + return etherBalance; + } catch (error) { + console.error('Error checking wallet balance:', error); + return null; + } + }; + + useEffect(() => { + if (privateKeyValue && privateKeyValue.length === 64) { + checkBalance(privateKeyValue); + } else { + setWalletErrorMessage(null); + } + + }, [privateKeyValue]); + const createNewDid = async (values: IFormikValues) => { setLoading(true); + let network = ''; + if (values.method === DidMethod.INDY) { + network = values?.network; + } else if (values.method === DidMethod.POLYGON) { + network = `${values.ledger}:${values.network}`; + } const didData = { seed: values.method === DidMethod.POLYGON ? '' : seed, keyType: 'ed25519', - method: values.method, - network: - values.method === DidMethod.POLYGON - ? `${values.method}:${values.network}` - : values.method !== DidMethod.KEY - ? `${values.ledger}:${values.network}` - : '', + method: values.method.split(':')[1], + network: network, domain: values.method === DidMethod.WEB ? values.domain : '', role: values.method === DidMethod.INDY ? 'endorser' : '', privatekey: values.method === DidMethod.POLYGON ? values.privatekey : '', - did: '', + did: values?.did ?? '', endorserDid: values?.endorserDid || '', isPrimaryDid: false, }; @@ -130,10 +156,11 @@ const CreateDIDModal = (props: EditOrgdetailsModalProps) => { props.setOpenModal(false); props.setMessage(data?.message); setSuccessMsg(data?.message); - setLoading(false); + setLoading(true); } else { setErrMsg(response as string); setLoading(false); + props.setOpenModal(true); } } catch (error) { console.error('An error occurred while creating did:', error); @@ -149,84 +176,49 @@ const CreateDIDModal = (props: EditOrgdetailsModalProps) => { if (data?.statusCode === apiStatusCodes.API_STATUS_CREATED) { setGeneratedKeys(data?.data); + const privateKey = data?.data?.privateKey.slice(2) + setPrivateKeyValue( privateKeyValue || privateKey); + await checkBalance(privateKeyValue || privateKey); } } catch (err) { console.error('Generate private key ERROR::::', err); } }; - const showMethod = ( - method: string, - selectedLedger: string, - selectedMethod: string, - selectedNetwork: string, - ): string => { - switch (method) { - case DidMethod.POLYGON: { - return mappedData && selectedNetwork && method - ? mappedData[method][selectedNetwork] || '' - : ''; - } - case DidMethod.INDY: { - return mappedData && selectedLedger && selectedNetwork && method - ? mappedData[method][selectedLedger][selectedNetwork] || '' - : ''; - } - case DidMethod.KEY: - case DidMethod.WEB: { - return mappedData && method ? mappedData[method][method] || '' : ''; - } - default: - return ''; - } - }; - useEffect(() => { - fetchLedgerConfig(); setSeed(nanoid(32)); }, []); + useEffect(() => { + if (havePrivateKey) { + setPrivateKeyValue(''); + setWalletErrorMessage(null); + setGeneratedKeys(null); + } else { + setPrivateKeyValue(''); + setWalletErrorMessage(null); + } + }, [havePrivateKey]); + const validations = { - method: yup.string().required('Method is required').trim(), - ledger: yup.string(), - network: yup.string(), - domain: yup.string(), - privatekey: yup.string(), + ...(DidMethod.WEB === method) && { domain: yup.string().required('Domain is required') }, + ...(DidMethod.POLYGON === method) && { privatekey: yup.string().required('Private key is required').trim().length(64, 'Private key must be exactly 64 characters long') }, }; - if (selectedMethod === DidMethod.WEB) { - validations['domain'] = yup.string().required('Domain is required').trim(); - } - - if (selectedMethod === DidMethod.POLYGON) { - (validations['network'] = yup - .string() - .required('Network is required') - .trim()), - (validations['privatekey'] = yup - .string() - .required('Private key is required') - .trim() - .length(64, 'Private key must be exactly 64 characters long')); - } - - if (selectedMethod === DidMethod.INDY) { - (validations['ledger'] = yup.string().required('Ledger is required')), - (validations['network'] = yup.string().required('Network is required')); - } - return ( { - props.setOpenModal(false); + onClose={() => { setErrMsg(null); + setGeneratedKeys(null); + setHavePrivateKey(false); + props.setOpenModal(false); }} > Create DID { setErrMsg(null); @@ -235,11 +227,11 @@ const CreateDIDModal = (props: EditOrgdetailsModalProps) => { /> { values: IFormikValues, { resetForm }: FormikActions, ) => { - const didMethodValue = showMethod( - values.method, - values.ledger, - values.method, - values.network, - ); - const didMethodName = didMethodValue - .split(':') - .slice(0, 2) - .join(':'); - let selectedLedgerName; - - switch (didMethodName) { - case 'did:indy': - selectedLedgerName = didMethodValue - .split(':') - .slice(-2) - .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' '); - - break; - - case 'did:polygon': - selectedLedgerName = didMethodValue - .split(':') - .slice(1) - .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) - .join(' '); - - break; - - case 'did:web': - case 'did:key': - selectedLedgerName = didMethodValue.split(':')[1]; - - break; - - default: - console.error('Unsupported DID format'); - } - - if (ledgerName !== selectedLedgerName) { - setErrMsg('This ledger is not applicable to create a DID'); - } else { - await createNewDid(values); - setErrMsg(null); - window.location.reload(); - } + await createNewDid(values); + window.location.reload(); + }} > {(formikHandlers): JSX.Element => { return (
+
- - {formikHandlers?.errors?.method && - formikHandlers?.touched?.method && ( - - {formikHandlers?.errors?.method} - - )} +
- {formikHandlers.values.method !== DidMethod.POLYGON && - formikHandlers.values.method !== DidMethod.KEY && - formikHandlers.values.method !== DidMethod.WEB && ( -
- - - {formikHandlers?.errors?.ledger && - formikHandlers?.touched?.ledger && ( - - {formikHandlers?.errors?.ledger} - - )} -
- )} + {formikHandlers.values.method !== DidMethod.KEY && ( + +
+ + { + formikHandlers.handleChange(e); + setMethod(e.target.value); + }} + + id="method" + name="method" + className="bg-gray-50 text-gray-600 text-sm rounded-lg block w-full p-2.5 dark:bg-gray-700 dark:placeholder-gray-400 dark:text-white h-11" + readOnly + > + +
+ )} {formikHandlers.values.method !== DidMethod.WEB && formikHandlers.values.method !== DidMethod.KEY && ( @@ -389,185 +306,222 @@ const CreateDIDModal = (props: EditOrgdetailsModalProps) => { htmlFor="network" className="text-sm font-medium text-gray-900 dark:text-gray-300" > - Network - * + Network * - - {formikHandlers?.errors?.network && - formikHandlers?.touched?.network && ( - - {formikHandlers?.errors?.network} - - )} +
)} - {formikHandlers.values.method === DidMethod.POLYGON && ( -
- {formikHandlers.values.method === DidMethod.POLYGON && ( - - generatePolygonKeyValuePair() - } - /> - )} - {generatedKeys && ( -
-

- - Private Key: - -

- -
-

- -

- - Address: - -

- -
-

-
- )} - - {generatedKeys && - formikHandlers.values.method === DidMethod.POLYGON && ( - - )} - - {formikHandlers.values.method === DidMethod.POLYGON && ( -
-
- - -
- {formikHandlers?.errors?.privatekey && - formikHandlers?.touched?.privatekey && ( - - {formikHandlers?.errors?.privatekey} - - )} -
- )} -
- )} {formikHandlers.values.method === DidMethod.WEB && (
- + Domain * + -
- {formikHandlers?.errors?.domain && - formikHandlers?.touched?.domain && ( - - {formikHandlers?.errors?.domain} + {formikHandlers.errors?.domain && formikHandlers.touched?.domain && ( + + {formikHandlers.errors?.domain} )} + +
)} -
+
+ -
+ + + {formikHandlers.values.method === DidMethod.POLYGON && ( + <> +
+
+ setHavePrivateKey(e.target.checked)} /> + +
+ {!havePrivateKey ? ( + <> +
+
+
+ + +
+ {generatedKeys && ( + <> +
+ + +
+ +
+
+ + + {formikHandlers?.errors?.privatekey && + formikHandlers?.touched?.privatekey && ( + + {formikHandlers?.errors?.privatekey} + + )} + {walletErrorMessage && ( + + {walletErrorMessage} + + )} + +
+

+ + Address: + +

+ +
+

+
+ + )} + + ) : ( + <> + { + formikHandlers.setFieldValue('privatekey', e.target.value); + } + } + placeholder="Enter private key" /> +
+
+ {formikHandlers?.errors?.privatekey && + formikHandlers?.touched?.privatekey && ( + + {formikHandlers?.errors?.privatekey} + + )} + {walletErrorMessage && ( + + {walletErrorMessage} + + )} + + + )} +
+
+ +
    +
  1. + Step 1: +
    Copy the address and get the free tokens for the testnet.
    For eg. use https://faucet.polygon.technology/  + to get free token +
    +
    +
  2. +
  3. + Step 2: +
    Check that you have recieved the tokens.
    +
    For eg. copy the address and check the balance on + +
    +
  4. +
+
+ + )}
); }} +
- ); + + ) }; export default CreateDIDModal; diff --git a/src/components/organization/configuration-settings/DidList.tsx b/src/components/organization/configuration-settings/DidList.tsx index 55abea91a..d0e74f830 100644 --- a/src/components/organization/configuration-settings/DidList.tsx +++ b/src/components/organization/configuration-settings/DidList.tsx @@ -1,20 +1,21 @@ import React, { useEffect, useState } from "react" -import BreadCrumbs from '../../BreadCrumbs' import { Button } from "flowbite-react" import CopyDid from '../../../commonComponents/CopyDid' import CreateDidPopup from "./CreateDid" -import { getDids, updatePrimaryDid } from "../../../api/organization" +import { getDids, getOrganizationById, updatePrimaryDid } from "../../../api/organization" import { getFromLocalStorage } from "../../../api/Auth" import { apiStatusCodes, storageKeys } from "../../../config/CommonConstant" import type { AxiosResponse } from "axios" import { AlertComponent } from "../../AlertComponent" import type { IDidList, IUpdatePrimaryDid } from "../interfaces" +import { Roles } from "../../../utils/enums/roles" const DIDList = () => { const [didList, setDidList] = useState([]); const [showPopup, setShowPopup] = useState(false); const [erroMsg, setErrMsg] = useState(null); const [successMsg, setSuccessMsg] = useState(null); + const [role, setRole] = useState(null); const setPrimaryDid = async (id: string, did: string) => { try { @@ -35,6 +36,23 @@ const DIDList = () => { } } + const fetchOrganizationDetails = async () => { + const orgId = await getFromLocalStorage(storageKeys.ORG_ID); + const response = await getOrganizationById(orgId); + const { data } = response as AxiosResponse; + if (data?.statusCode === apiStatusCodes.API_STATUS_SUCCESS) { + + const ownerRole = data?.data?.userOrgRoles.find(role => role?.orgRole.name === "owner"); + + const ownerRoleName = ownerRole ? ownerRole.orgRole.name : null; + + setRole(ownerRoleName); + + } else { + console.error('Error in fetching organization:::'); + } + }; + const getData = async () => { try { const orgId = await getFromLocalStorage(storageKeys.ORG_ID); @@ -49,12 +67,13 @@ const DIDList = () => { setDidList(sortedDids) } } catch (error) { - console.log("ERROR::::", error); + console.error("ERROR::::", error); } } useEffect(() => { getData(); + fetchOrganizationDetails(); }, []) return ( @@ -72,6 +91,7 @@ const DIDList = () => {

DID Details

- - - )} - - - ) : ( - { - submitSharedWallet( - values, - privateKeyValue, - domainValue, - endPointValue, - ); - }} - > - {(formikHandlers) => ( -
-
-
-
+
+
+
- - {formikHandlers?.errors?.seed && - formikHandlers?.touched?.seed && ( - - {formikHandlers?.errors?.seed} - - )} -
+ + {formikHandlers?.errors?.did && + formikHandlers?.touched?.did && ( + + {formikHandlers?.errors?.did} + + )} +
-
-
-
+
+
+ +
+ {mappedData && + Object.keys(mappedData).map((ledger) => ( +
+ { + formikHandlers.handleChange(e); + handleLedgerChange(e); + setSelectedLedger(ledger); + setSelectedMethod(''); + setSeedVal(seeds); + setSelectedDid(''); + }} + className="mr-2" + /> + +
+ ))}
- - - {formikHandlers?.errors?.did && - formikHandlers?.touched?.did && ( - - {formikHandlers?.errors?.did} - - )} + {formikHandlers.errors.ledger && formikHandlers.touched.ledger && ( + + {formikHandlers.errors.ledger} + + )}
-
+
- - {formikHandlers?.errors?.method && - formikHandlers?.touched?.method && ( - - {formikHandlers?.errors?.method} - - )} +
+ {renderMethodOptions(formikHandlers)} +
+ {formikHandlers.errors.method && formikHandlers.touched.method && ( + + {formikHandlers.errors.method} + + )}
- {formikHandlers.values.method === DidMethod.POLYGON && ( - - generatePolygonKeyValuePair()}/> - + {selectedLedger !== 'noLedger' && ( +
+ +
+ {renderNetworkOptions(formikHandlers)} +
+ {formikHandlers.errors.network && formikHandlers.touched.network && ( + + {formikHandlers.errors.network} + + )} +
)} - {generatedKeys && ( -
-

- - Private Key: - -

- -
-

+ {selectedLedger !== 'noLedger' && ( -

- - Public Key Base58: - -

- -
-

-

- - Address: - -

- -
-

+
+ +
)} - {generatedKeys && - formikHandlers.values.method === DidMethod.POLYGON && ( +
+ + {selectedMethod === DidMethod.WEB && ( + - )} - {formikHandlers.values.method === DidMethod.POLYGON && ( - - setPrivateKeyValue(val)} privateKeyValue={privateKeyValue} formikHandlers={formikHandlers}/> - )} +
+
+
- setDomainValue(val)} domainValue={domainValue} formikHandlers={formikHandlers}/> +
+
+ {selectedMethod === 'did:polygon' && ( + <>
+ +
+
+ +
    +
  1. + Step 1: +
    + Copy the address and get the free tokens for the testnet. +
    For eg. use  + + `https://faucet.polygon.technology/`  + + to get free token +
    +
    +
  2. +
  3. + Step 2: +
    Check that you have recieved the tokens.
    +
    For eg. copy the address and check the balance on + +
    +
  4. +
+
)} +
- {formikHandlers.values.method !== DidMethod.POLYGON && - formikHandlers.values.method !== DidMethod.KEY && - formikHandlers.values.method !== DidMethod.WEB && ( -
- - - {formikHandlers?.errors?.ledger && - formikHandlers?.touched?.ledger && ( - - {formikHandlers?.errors?.ledger} - - )} -
- )} - {formikHandlers.values.method !== DidMethod.WEB && - formikHandlers.values.method !== DidMethod.KEY && ( - - < LedgerLessMethodsComponents formikHandlers={formikHandlers} setSelectedDid={(val: string) => setSelectedDid(val)} selectedDid={selectedDid} mappedData={mappedData} selectedLedger={selectedLedger} selectedNetwork={selectedNetwork} /> - )} - -
- -
- {showMethod(formikHandlers.values.method)} -
-
-
-
-
- -
- - )} - - )} +
+ +
+ + )} +
); + }; export default SharedAgentForm; \ No newline at end of file diff --git a/src/components/organization/walletCommonComponents/TokenWarningMessage.tsx b/src/components/organization/walletCommonComponents/TokenWarningMessage.tsx index 77a01c5cf..2348a51e9 100644 --- a/src/components/organization/walletCommonComponents/TokenWarningMessage.tsx +++ b/src/components/organization/walletCommonComponents/TokenWarningMessage.tsx @@ -1,14 +1,12 @@ -import React from "react"; - const TokenWarningMessage = () => ( - + (false); const [failure, setFailure] = useState(null); const [seeds, setSeeds] = useState(''); - - useEffect(() => { - setSeeds(nanoid(32)); - }, []); + const [maskedSeeds, setMaskedSeeds] = useState(''); + + const maskSeeds = (seed: string) => { + const visiblePart = seed.slice(0, -10); + const maskedPart = seed.slice(-10).replace(/./g, '*'); + return visiblePart + maskedPart; + }; + + useEffect(() => { + const generatedSeeds = nanoid(32); + const masked = maskSeeds(generatedSeeds); + setSeeds(generatedSeeds); + setMaskedSeeds(masked); + }, []); + const onRadioSelect = (type: string) => { setAgentType(type); @@ -84,19 +93,24 @@ const WalletSpinup = (props: { domain: string, ) => { setLoading(true); + const ledgerName = values?.network?.split(":")[2] + const network = values?.network?.split(":").slice(2).join(":"); + const polygonNetwork = values?.network?.split(":").slice(1).join(":"); + const payload = { keyType: values.keyType || 'ed25519', - method: values.method || '', - ledger: values.method === DidMethod.INDY ? values.ledger : '', + method: values.method.split(':')[1] || '', + ledger: values.method === DidMethod.INDY ? ledgerName : '', label: values.label, privatekey: values.method === DidMethod.POLYGON ? privatekey : '', - seed: values.method === DidMethod.POLYGON ? '' : values.seed || seeds, + seed: values.method === DidMethod.POLYGON ? '' : values?.seed || seeds, network: values.method === DidMethod.POLYGON - ? `${values?.method}:${values?.network}` - : `${values?.ledger}:${values?.network}`, + ? polygonNetwork + : network, domain: values.method === DidMethod.WEB ? domain : '', role: values.method === DidMethod.INDY ? values?.role ?? 'endorser' : '', + did: values?.did ?? '', endorserDid: values?.endorserDid ?? '', clientSocketId: SOCKET.id, }; @@ -182,6 +196,7 @@ const WalletSpinup = (props: { if (agentType === AgentType.SHARED) { formComponent = (
-
+
+
{!agentSpinupCall && !loading && ( -
-
    +
    +
    )} +
+ {formComponent}
-
- {agentType === AgentType.DEDICATED ? ( - - ) : ( - - )} -
); diff --git a/src/components/organization/walletCommonComponents/interfaces/index.tsx b/src/components/organization/walletCommonComponents/interfaces/index.tsx index 5dd278085..5cb29647d 100644 --- a/src/components/organization/walletCommonComponents/interfaces/index.tsx +++ b/src/components/organization/walletCommonComponents/interfaces/index.tsx @@ -40,14 +40,14 @@ export interface IPolygonKeys { export interface ISharedAgentForm { seeds: string; + maskedSeeds: string; isCopied: boolean; orgName: string; loading: boolean; submitSharedWallet: ( values: IValuesShared, privatekey: string, - domain: string, - endPoint: string, + domain: string ) => void; } diff --git a/src/config/envConfig.ts b/src/config/envConfig.ts index b979c8036..a8ea0b9b6 100644 --- a/src/config/envConfig.ts +++ b/src/config/envConfig.ts @@ -17,7 +17,7 @@ if (import.meta.env) { } } -const { PUBLIC_BASE_URL, PUBLIC_CRYPTO_PRIVATE_KEY,PUBLIC_SHOW_NAME_AS_LOGO, PUBLIC_PLATFORM_NAME, PUBLIC_PLATFORM_LOGO, PUBLIC_POWERED_BY, PUBLIC_PLATFORM_WEB_URL, PUBLIC_POWERED_BY_URL, PUBLIC_PLATFORM_DOCS_URL, PUBLIC_PLATFORM_GIT, PUBLIC_PLATFORM_SUPPORT_EMAIL, PUBLIC_PLATFORM_TWITTER_URL, PUBLIC_PLATFORM_SUPPORT_INVITE, PUBLIC_PLATFORM_DISCORD_URL, PUBLIC_ALLOW_DOMAIN }: any = envVariables; +const { PUBLIC_BASE_URL, PUBLIC_POLYGON_TESTNET_URL, PUBLIC_POLYGON_MAINNET_URL, PUBLIC_CRYPTO_PRIVATE_KEY,PUBLIC_SHOW_NAME_AS_LOGO, PUBLIC_PLATFORM_NAME, PUBLIC_PLATFORM_LOGO, PUBLIC_POWERED_BY, PUBLIC_PLATFORM_WEB_URL, PUBLIC_POWERED_BY_URL, PUBLIC_PLATFORM_DOCS_URL, PUBLIC_PLATFORM_GIT, PUBLIC_PLATFORM_SUPPORT_EMAIL, PUBLIC_PLATFORM_TWITTER_URL, PUBLIC_PLATFORM_SUPPORT_INVITE, PUBLIC_PLATFORM_DISCORD_URL, PUBLIC_ALLOW_DOMAIN }: any = envVariables; export const envConfig = { PUBLIC_BASE_URL: @@ -28,6 +28,13 @@ export const envConfig = { PLATFORM_DATA: { nameAsLogo: PUBLIC_SHOW_NAME_AS_LOGO || import.meta.env.PUBLIC_SHOW_NAME_AS_LOGO, + + polygonTestnet: + PUBLIC_POLYGON_TESTNET_URL || import.meta.env.PUBLIC_POLYGON_TESTNET_URL, + + polygonMainnet: + PUBLIC_POLYGON_MAINNET_URL || import.meta.env.PUBLIC_POLYGON_MAINNET_URL, + name: PUBLIC_PLATFORM_NAME || import.meta.env.PUBLIC_PLATFORM_NAME, logo: