From fe3875579779907de758563d66ae0edec4dd0243 Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Wed, 5 Apr 2023 16:46:18 +0300 Subject: [PATCH] Validate splits contract address on Collection Actions > Update Collection Info --- components/collections/actions/Action.tsx | 25 +++++++++++++++++++++++ pages/collections/create.tsx | 8 ++++---- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/components/collections/actions/Action.tsx b/components/collections/actions/Action.tsx index 9cdfad6..40f6dee 100644 --- a/components/collections/actions/Action.tsx +++ b/components/collections/actions/Action.tsx @@ -1,3 +1,4 @@ +import { toUtf8 } from '@cosmjs/encoding' import { AirdropUpload } from 'components/AirdropUpload' import { Button } from 'components/Button' import type { DispatchExecuteArgs } from 'components/collections/actions/actions' @@ -347,6 +348,30 @@ export const CollectionActions = ({ throw new Error('Royalty payment address and share percentage are both required') } + if ( + type === 'update_collection_info' && + royaltyPaymentAddressState.value && + !royaltyPaymentAddressState.value.trim().endsWith('.stars') + ) { + const contractInfoResponse = await wallet.client + ?.queryContractRaw( + royaltyPaymentAddressState.value.trim(), + toUtf8(Buffer.from(Buffer.from('contract_info').toString('hex'), 'hex').toString()), + ) + .catch((e) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + if (e.message.includes('bech32')) throw new Error('Invalid royalty payment address.') + console.log(e.message) + }) + if (contractInfoResponse !== undefined) { + const contractInfo = JSON.parse(new TextDecoder().decode(contractInfoResponse as Uint8Array)) + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + if (contractInfo && !contractInfo.contract.includes('splits')) + throw new Error('The provided royalty payment address does not belong to a splits contract.') + else console.log(contractInfo) + } + } + const txHash = await toast.promise(dispatchExecute(payload), { error: `${type.charAt(0).toUpperCase() + type.slice(1)} execute failed!`, loading: 'Executing message...', diff --git a/pages/collections/create.tsx b/pages/collections/create.tsx index 7d5433a..17e4db7 100644 --- a/pages/collections/create.tsx +++ b/pages/collections/create.tsx @@ -427,7 +427,7 @@ const CollectionCreationPage: NextPage = () => { let royaltyInfo = null if (royaltyDetails?.royaltyType === 'new') { royaltyInfo = { - payment_address: royaltyDetails.paymentAddress, + payment_address: royaltyDetails.paymentAddress.trim(), share: (Number(royaltyDetails.share) / 100).toString(), } } @@ -496,7 +496,7 @@ const CollectionCreationPage: NextPage = () => { let royaltyInfo = null if (royaltyDetails?.royaltyType === 'new') { royaltyInfo = { - payment_address: royaltyDetails.paymentAddress, + payment_address: royaltyDetails.paymentAddress.trim(), share: (Number(royaltyDetails.share) / 100).toString(), } } @@ -887,7 +887,7 @@ const CollectionCreationPage: NextPage = () => { if (royaltyDetails.share === 0) throw new Error('Royalty share percentage is required') if (royaltyDetails.share > 100 || royaltyDetails.share < 0) throw new Error('Invalid royalty share percentage') if (royaltyDetails.paymentAddress === '') throw new Error('Royalty payment address is required') - if (!isValidAddress(royaltyDetails.paymentAddress)) { + if (!isValidAddress(royaltyDetails.paymentAddress.trim())) { if (royaltyDetails.paymentAddress.trim().endsWith('.stars')) { throw new Error('Royalty payment address could not be resolved') } @@ -895,7 +895,7 @@ const CollectionCreationPage: NextPage = () => { } const contractInfoResponse = await wallet.client ?.queryContractRaw( - royaltyDetails.paymentAddress, + royaltyDetails.paymentAddress.trim(), toUtf8(Buffer.from(Buffer.from('contract_info').toString('hex'), 'hex').toString()), ) .catch((e) => {