diff --git a/governance/xc_admin/packages/xc_admin_frontend/components/ClusterSwitch.tsx b/governance/xc_admin/packages/xc_admin_frontend/components/ClusterSwitch.tsx index 41001e67..db068eba 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/components/ClusterSwitch.tsx +++ b/governance/xc_admin/packages/xc_admin_frontend/components/ClusterSwitch.tsx @@ -57,7 +57,7 @@ const ClusterSwitch = ({ light }: { light?: boolean | null }) => { ] return ( - + {({ open }) => ( <> + squads?: SquadsMesh +}) => { + const [publisherKey, setPublisherKey] = useState( + 'JTmFx5zX9mM94itfk2nQcJnQQDPjcv4UPD7SYj6xDCV' + ) + const [selectedAssetType, setSelectedAssetType] = useState('All') + const [isModalOpen, setIsModalOpen] = useState(false) + const [isSubmitButtonLoading, setIsSubmitButtonLoading] = useState(false) + const [priceAccounts, setPriceAccounts] = useState([]) + const { cluster } = useContext(ClusterContext) + const { rawConfig, dataIsLoading } = usePythContext() + const { connected } = useWallet() + + // get current input value + + const handleChange = (event: any) => { + setSelectedAssetType(event.target.value) + setIsModalOpen(true) + } + + const closeModal = () => { + setIsModalOpen(false) + } + + const onKeyChange = (event: React.SyntheticEvent) => { + const { + currentTarget: { value }, + } = event + setPublisherKey(value) + } + + const handleSubmitButton = async () => { + if (pythProgramClient && squads) { + const instructions: TransactionInstruction[] = [] + const multisigAuthority = squads.getAuthorityPDA( + PRICE_FEED_MULTISIG[getMultisigCluster(cluster)], + 1 + ) + const isRemote: boolean = isRemoteCluster(cluster) + const multisigCluster: Cluster | 'localnet' = getMultisigCluster(cluster) + const wormholeAddress = WORMHOLE_ADDRESS[multisigCluster] + const fundingAccount = isRemote + ? mapKey(multisigAuthority) + : multisigAuthority + priceAccounts.map((priceAccount) => { + isPermission + ? pythProgramClient.methods + .addPublisher(new PublicKey(publisherKey)) + .accounts({ + fundingAccount, + priceAccount: priceAccount, + }) + .instruction() + .then((instruction) => instructions.push(instruction)) + : pythProgramClient.methods + .delPublisher(new PublicKey(publisherKey)) + .accounts({ + fundingAccount, + priceAccount: priceAccount, + }) + .instruction() + .then((instruction) => instructions.push(instruction)) + }) + setIsSubmitButtonLoading(true) + try { + const proposalPubkey = await proposeInstructions( + squads, + PRICE_FEED_MULTISIG[getMultisigCluster(cluster)], + instructions, + isRemote, + wormholeAddress + ) + toast.success(`Proposal sent! 🚀 Proposal Pubkey: ${proposalPubkey}`) + setIsSubmitButtonLoading(false) + closeModal() + } catch (e: any) { + toast.error(capitalizeFirstLetter(e.message)) + setIsSubmitButtonLoading(false) + } + } + } + + useEffect(() => { + if (!dataIsLoading) { + const res: PublicKey[] = [] + rawConfig.mappingAccounts[0].products.map((product: ProductRawConfig) => { + const publisherExists = + product.priceAccounts[0].publishers.find( + (p) => p.toBase58() === publisherKey + ) !== undefined + if ( + (selectedAssetType === 'All' || + product.metadata.asset_type === selectedAssetType) && + ((isPermission && + product.priceAccounts[0].publishers.length < 32 && + !publisherExists) || + (!isPermission && publisherExists)) + ) { + res.push(product.priceAccounts[0].address) + } + }) + setPriceAccounts(res) + } + }, [rawConfig, dataIsLoading, selectedAssetType, isPermission, publisherKey]) + + return ( + <> + + {({ open }) => ( + <> + + + {isPermission ? 'Permission Key' : 'Depermission Key'} + + + + + + {assetTypes.map((a) => ( + + + + ))} + + + + )} + + + setIsModalOpen(false)} + > + +
+ +
+
+ + + +
+ + {isPermission ? 'Permission' : 'Depermission'} Publisher + Key + +
+
+ Asset Type: {selectedAssetType} +
+
+
+ Key + +
+
+ {!connected ? ( +
+ +
+ ) : ( + + )} +
+
+
+
+
+
+
+
+ + ) +} + +export default PermissionDepermissionKey diff --git a/governance/xc_admin/packages/xc_admin_frontend/components/common/Modal.tsx b/governance/xc_admin/packages/xc_admin_frontend/components/common/Modal.tsx index 1eea474e..6893bb31 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/components/common/Modal.tsx +++ b/governance/xc_admin/packages/xc_admin_frontend/components/common/Modal.tsx @@ -37,12 +37,12 @@ const Modal: React.FC<{ leaveFrom="opacity-100 scale-100" leaveTo="opacity-0 scale-95" > - -
- + Proposed Changes {content} diff --git a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/General.tsx b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/General.tsx index 5e9efcbc..9a1e973e 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/components/tabs/General.tsx +++ b/governance/xc_admin/packages/xc_admin_frontend/components/tabs/General.tsx @@ -22,6 +22,7 @@ import ClusterSwitch from '../ClusterSwitch' import Modal from '../common/Modal' import Spinner from '../common/Spinner' import Loadbar from '../loaders/Loadbar' +import PermissionDepermissionKey from '../PermissionDepermissionKey' const General = () => { const [data, setData] = useState({}) @@ -689,6 +690,18 @@ const General = () => {
+
+ + +
{dataIsLoading ? (
diff --git a/governance/xc_admin/packages/xc_admin_frontend/package.json b/governance/xc_admin/packages/xc_admin_frontend/package.json index c0d5d4fa..1fc91280 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/package.json +++ b/governance/xc_admin/packages/xc_admin_frontend/package.json @@ -12,8 +12,9 @@ "@coral-xyz/anchor": "^0.26.0", "@headlessui/react": "^1.7.7", "@pythnetwork/client": "^2.15.0", - "@solana/spl-token": "^0.3.7", + "@radix-ui/react-label": "^2.0.0", "@radix-ui/react-tooltip": "^1.0.3", + "@solana/spl-token": "^0.3.7", "@solana/wallet-adapter-base": "^0.9.20", "@solana/wallet-adapter-react": "^0.15.28", "@solana/wallet-adapter-react-ui": "^0.9.27", diff --git a/governance/xc_admin/packages/xc_admin_frontend/styles/globals.css b/governance/xc_admin/packages/xc_admin_frontend/styles/globals.css index 08abd3cc..4911a6e3 100644 --- a/governance/xc_admin/packages/xc_admin_frontend/styles/globals.css +++ b/governance/xc_admin/packages/xc_admin_frontend/styles/globals.css @@ -269,16 +269,16 @@ @apply hover:bg-pythPurple; } -.diaglogPanel { - @apply flex h-full min-h-[420px] w-[calc(100%-24px)] max-w-6xl transform items-center justify-center rounded-[40px] bg-[rgba(49,47,71,1)] p-5 px-6 pt-20 pb-8 text-center align-middle shadow-xl transition-all md:mt-[92px] lg:p-10; +.dialogPanel { + @apply flex h-full min-h-[420px] w-[calc(100%-24px)] max-w-6xl transform items-center justify-center rounded-[40px] bg-[rgba(49,47,71,1)] p-5 px-6 pt-20 pb-8 text-center align-middle shadow-xl transition-all md:mt-[92px] lg:p-10; } -.diaglogClose { - @apply absolute right-10 top-8 flex items-center leading-none; +.dialogClose { + @apply absolute right-10 top-8 flex items-center leading-none; } -.diaglogTitle { - @apply mb-8 text-center font-body text-[32px] leading-[1.1] lg:mb-11 lg:text-[44px]; +.dialogTitle { + @apply mb-8 text-center font-body text-[32px] leading-[1.1] lg:mb-11 lg:text-[44px] px-10; } .action-btn { diff --git a/package-lock.json b/package-lock.json index f729bca5..4a533abb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1416,6 +1416,7 @@ "@coral-xyz/anchor": "^0.26.0", "@headlessui/react": "^1.7.7", "@pythnetwork/client": "^2.15.0", + "@radix-ui/react-label": "^2.0.0", "@radix-ui/react-tooltip": "^1.0.3", "@solana/spl-token": "^0.3.7", "@solana/wallet-adapter-base": "^0.9.20", @@ -11064,6 +11065,19 @@ "react": "^16.8 || ^17.0 || ^18.0" } }, + "node_modules/@radix-ui/react-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.0.tgz", + "integrity": "sha512-7qCcZ3j2VQspWjy+gKR4W+V/z0XueQjeiZnlPOtsyiP9HaS8bfSU7ECoI3bvvdYntQj7NElW7OAYsYRW4MQvCg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, "node_modules/@radix-ui/react-popper": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.0.tgz", @@ -56486,6 +56500,15 @@ "@radix-ui/react-use-layout-effect": "1.0.0" } }, + "@radix-ui/react-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.0.tgz", + "integrity": "sha512-7qCcZ3j2VQspWjy+gKR4W+V/z0XueQjeiZnlPOtsyiP9HaS8bfSU7ECoI3bvvdYntQj7NElW7OAYsYRW4MQvCg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, "@radix-ui/react-popper": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.0.tgz", @@ -85666,6 +85689,7 @@ "@coral-xyz/anchor": "^0.26.0", "@headlessui/react": "^1.7.7", "@pythnetwork/client": "^2.15.0", + "@radix-ui/react-label": "^2.0.0", "@radix-ui/react-tooltip": "^1.0.3", "@solana/spl-token": "^0.3.7", "@solana/wallet-adapter-base": "^0.9.20",