diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/ContractSettingsPage.client.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/ContractSettingsPage.client.tsx index 4a2c438865e..a535a0eb75e 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/ContractSettingsPage.client.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/ContractSettingsPage.client.tsx @@ -25,6 +25,7 @@ export function ContractSettingsPageClient(props: { contract={props.contract} functionSelectors={metadataQuery.data.functionSelectors} twAccount={props.twAccount} + hasDefaultFeeConfig={true} /> ); } diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/ContractSettingsPage.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/ContractSettingsPage.tsx index 72fc27ef0f0..1253b9bcc3e 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/ContractSettingsPage.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/ContractSettingsPage.tsx @@ -79,8 +79,9 @@ export function ContractSettingsPage(props: { contract: ThirdwebContract; functionSelectors: string[]; twAccount: Account | undefined; + hasDefaultFeeConfig: boolean; }) { - const { functionSelectors, contract, twAccount } = props; + const { functionSelectors, contract, twAccount, hasDefaultFeeConfig } = props; return ( ); diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/page.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/page.tsx index 23ccb4cafa7..1d01580c8dc 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/page.tsx @@ -1,5 +1,7 @@ +import { DEFAULT_FEE_RECIPIENT } from "constants/addresses"; import { notFound } from "next/navigation"; import { localhost } from "thirdweb/chains"; +import { getPlatformFeeInfo } from "thirdweb/extensions/common"; import { getRawAccount } from "../../../../../account/settings/getAccount"; import { getContractPageParamsInfo } from "../_utils/getContractFromParams"; import { getContractPageMetadata } from "../_utils/getContractPageMetadata"; @@ -33,11 +35,19 @@ export default async function Page(props: { getContractPageMetadata(info.contract), ]); + let hasDefaultFeeConfig = true; + try { + const feeInfo = await getPlatformFeeInfo({ contract }); + hasDefaultFeeConfig = + feeInfo[0].toLowerCase() === DEFAULT_FEE_RECIPIENT.toLowerCase(); + } catch {} + return ( ); } diff --git a/apps/dashboard/src/components/contract-components/contract-deploy-form/custom-contract.tsx b/apps/dashboard/src/components/contract-components/contract-deploy-form/custom-contract.tsx index ed17bebf8b0..c2569ed9ef8 100644 --- a/apps/dashboard/src/components/contract-components/contract-deploy-form/custom-contract.tsx +++ b/apps/dashboard/src/components/contract-components/contract-deploy-form/custom-contract.tsx @@ -15,6 +15,7 @@ import { Flex, FormControl } from "@chakra-ui/react"; import { useMutation, useQuery } from "@tanstack/react-query"; import { verifyContract } from "app/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/ContractSourcesPage"; import { NetworkSelectorButton } from "components/selects/NetworkSelectorButton"; +import { DEFAULT_FEE_BPS, DEFAULT_FEE_RECIPIENT } from "constants/addresses"; import { SolidityInput } from "contract-ui/components/solidity-inputs"; import { useTrack } from "hooks/analytics/useTrack"; import { useTxNotifications } from "hooks/useTxNotifications"; @@ -190,6 +191,8 @@ export const CustomContractForm: React.FC = ({ !isFactoryDeployment && (metadata?.name.includes("AccountFactory") || false); + const isMarketplace = metadata?.name.includes("MarketplaceV3") || false; + const parsedDeployParams = useMemo( () => ({ ...deployParams.reduce( @@ -445,9 +448,8 @@ export const CustomContractForm: React.FC = ({ name: params.contractMetadata?.name || "", contractURI: _contractURI, defaultAdmin: params.deployParams._defaultAdmin as string, - platformFeeBps: Number(params.deployParams._platformFeeBps), - platformFeeRecipient: params.deployParams - ._platformFeeRecipient as string, + platformFeeBps: DEFAULT_FEE_BPS, + platformFeeRecipient: DEFAULT_FEE_RECIPIENT, trustedForwarders: params.deployParams._trustedForwarders ? JSON.parse(params.deployParams._trustedForwarders as string) : undefined, @@ -462,6 +464,8 @@ export const CustomContractForm: React.FC = ({ payees, shares, _contractURI, + _platformFeeBps: DEFAULT_FEE_BPS, + _platformFeeRecipient: DEFAULT_FEE_RECIPIENT, }; const salt = params.deployDeterministic @@ -707,7 +711,9 @@ export const CustomContractForm: React.FC = ({ /> )} - {hasPlatformFee && } + {hasPlatformFee && ( + + )} {isSplit && } diff --git a/apps/dashboard/src/components/contract-components/contract-deploy-form/platform-fee-fieldset.tsx b/apps/dashboard/src/components/contract-components/contract-deploy-form/platform-fee-fieldset.tsx index 35b33c1aefb..ff6fe32a870 100644 --- a/apps/dashboard/src/components/contract-components/contract-deploy-form/platform-fee-fieldset.tsx +++ b/apps/dashboard/src/components/contract-components/contract-deploy-form/platform-fee-fieldset.tsx @@ -1,64 +1,45 @@ -import { FormFieldSetup } from "@/components/blocks/FormFieldSetup"; -import { BasisPointsInput } from "components/inputs/BasisPointsInput"; -import { SolidityInput } from "contract-ui/components/solidity-inputs"; +import Link from "next/link"; import { Fieldset } from "./common"; -import type { CustomContractDeploymentForm } from "./custom-contract"; interface PlatformFeeFieldsetProps { - form: CustomContractDeploymentForm; + isMarketplace: boolean; } -export const PlatformFeeFieldset: React.FC = ({ - form, -}) => { +export const PlatformFeeFieldset: React.FC = ( + props, +) => { return (
- - For contract with primary sales, get additional fees for all - primary sales that happen on this contract. (This is useful if you - are deploying this contract for a 3rd party and want to take fees - for your service).
If this contract is a marketplace, get a - percentage of all the secondary sales that happen on your - contract. - - } - > - -
- - - - form.setValue("deployParams._platformFeeBps", value.toString(), { - shouldTouch: true, - }) - } - /> - + {props.isMarketplace ? ( +

+ A 2.5% platform fee is deducted from each sale to support ongoing + platform operations and improvements.{" "} + + Read more. + +

+ ) : ( +

+ A 2.5% platform fee is deducted from each primary sale price to + support ongoing platform operations and improvements.{" "} + + Read more. + +

+ )}
); diff --git a/apps/dashboard/src/components/contract-functions/contract-function.tsx b/apps/dashboard/src/components/contract-functions/contract-function.tsx index 2d4b10873b9..790d2e229ea 100644 --- a/apps/dashboard/src/components/contract-functions/contract-function.tsx +++ b/apps/dashboard/src/components/contract-functions/contract-function.tsx @@ -286,7 +286,14 @@ export const ContractFunctionsPanel: React.FC = ({ }) => { // TODO: clean this up const functionsWithExtension = useMemo(() => { - const allFunctions = fnsOrEvents.filter((f) => f.type === "function"); + const allFunctions = fnsOrEvents + .filter((f) => f.type === "function") + .filter( + (f) => + f.name !== "setPlatformFeeInfo" && + f.name !== "setFlatPlatformFeeInfo" && + f.name !== "setPlatformFeeType", + ); const results: ExtensionFunctions[] = []; results.push({ extension: "", diff --git a/apps/dashboard/src/constants/addresses.ts b/apps/dashboard/src/constants/addresses.ts index 71bdad2afea..1ad1fc134e9 100644 --- a/apps/dashboard/src/constants/addresses.ts +++ b/apps/dashboard/src/constants/addresses.ts @@ -1,2 +1,7 @@ export const THIRDWEB_DEPLOYER_ADDRESS = "0xdd99b75f095d0c4d5112aCe938e4e6ed962fb024"; + +export const DEFAULT_FEE_RECIPIENT = + "0x1af20c6b23373350ad464700b5965ce4b0d2ad94"; + +export const DEFAULT_FEE_BPS = 250;