diff --git a/apps/dashboard/src/app/(dashboard)/contracts/deploy/[compiler_uri]/page.tsx b/apps/dashboard/src/app/(dashboard)/contracts/deploy/[compiler_uri]/page.tsx
index 14e56aef9c0..b49bdd73970 100644
--- a/apps/dashboard/src/app/(dashboard)/contracts/deploy/[compiler_uri]/page.tsx
+++ b/apps/dashboard/src/app/(dashboard)/contracts/deploy/[compiler_uri]/page.tsx
@@ -33,6 +33,7 @@ export default async function DirectDeployPage(props: DirectDeployPageProps) {
/>
diff --git a/apps/dashboard/src/app/(dashboard)/published-contract/components/publish-based-deploy.tsx b/apps/dashboard/src/app/(dashboard)/published-contract/components/publish-based-deploy.tsx
index 34c9ff3fd05..68775febebc 100644
--- a/apps/dashboard/src/app/(dashboard)/published-contract/components/publish-based-deploy.tsx
+++ b/apps/dashboard/src/app/(dashboard)/published-contract/components/publish-based-deploy.tsx
@@ -3,6 +3,7 @@ import {
fetchPublishedContractVersion,
fetchPublishedContractVersions,
} from "components/contract-components/fetch-contracts-with-versions";
+import { ZERO_FEE_VERSIONS } from "constants/fee-config";
import { isAddress } from "thirdweb";
import { fetchDeployMetadata } from "thirdweb/contract";
import { resolveAddress } from "thirdweb/extensions/ens";
@@ -46,6 +47,10 @@ export async function DeployFormForPublishInfo(props: PublishBasedDeployProps) {
publishedContractVersions.find((v) => v.version === props.version) ||
publishedContractVersions[0];
+ const publishedContractNoFee = publishedContractVersions.find(
+ (v) => v.version === ZERO_FEE_VERSIONS[v.name],
+ );
+
if (!publishedContract) {
return null;
}
@@ -53,22 +58,30 @@ export async function DeployFormForPublishInfo(props: PublishBasedDeployProps) {
const moduleUris = modules
.filter((m) => m !== null && m !== undefined)
.map((m) => m.publishMetadataUri);
- const [contractMetadata, ...fetchedModules] = await Promise.all([
- fetchDeployMetadata({
- client,
- // force `ipfs://` prefix
- uri: publishedContract.publishMetadataUri.startsWith("ipfs://")
- ? publishedContract.publishMetadataUri
- : `ipfs://${publishedContract.publishMetadataUri}`,
- }).catch(() => null),
- ...(moduleUris || []).map((uri) =>
+ const [contractMetadata, contractMetadataNoFee, ...fetchedModules] =
+ await Promise.all([
fetchDeployMetadata({
client,
// force `ipfs://` prefix
- uri: uri.startsWith("ipfs://") ? uri : `ipfs://${uri}`,
+ uri: publishedContract.publishMetadataUri.startsWith("ipfs://")
+ ? publishedContract.publishMetadataUri
+ : `ipfs://${publishedContract.publishMetadataUri}`,
}).catch(() => null),
- ),
- ]);
+ fetchDeployMetadata({
+ client,
+ // force `ipfs://` prefix
+ uri: publishedContractNoFee?.publishMetadataUri.startsWith("ipfs://")
+ ? publishedContractNoFee.publishMetadataUri
+ : `ipfs://${publishedContractNoFee?.publishMetadataUri}`,
+ }).catch(() => null),
+ ...(moduleUris || []).map((uri) =>
+ fetchDeployMetadata({
+ client,
+ // force `ipfs://` prefix
+ uri: uri.startsWith("ipfs://") ? uri : `ipfs://${uri}`,
+ }).catch(() => null),
+ ),
+ ]);
return (
@@ -79,6 +92,7 @@ export async function DeployFormForPublishInfo(props: PublishBasedDeployProps) {
/>
m !== null)}
pathname={`/${props.publisher}/${props.contract_id}${props.version ? `/${props.version}` : ""}/deploy`}
/>
diff --git a/apps/dashboard/src/app/(dashboard)/published-contract/components/uri-based-deploy.tsx b/apps/dashboard/src/app/(dashboard)/published-contract/components/uri-based-deploy.tsx
index c8c46795bda..c32f45f9da9 100644
--- a/apps/dashboard/src/app/(dashboard)/published-contract/components/uri-based-deploy.tsx
+++ b/apps/dashboard/src/app/(dashboard)/published-contract/components/uri-based-deploy.tsx
@@ -8,12 +8,13 @@ import { loginRedirect } from "../../../login/loginRedirect";
type DeployFormForUriProps = {
contractMetadata: FetchDeployMetadataResult | null;
+ contractMetadataNoFee: FetchDeployMetadataResult | null;
modules: FetchDeployMetadataResult[] | null;
pathname: string;
};
export async function DeployFormForUri(props: DeployFormForUriProps) {
- const { contractMetadata, modules, pathname } = props;
+ const { contractMetadata, contractMetadataNoFee, modules, pathname } = props;
if (!contractMetadata) {
return Could not fetch metadata
;
@@ -46,6 +47,7 @@ export async function DeployFormForUri(props: DeployFormForUriProps) {
m !== null)}
jwt={authToken}
teamsAndProjects={teamsAndProjects}
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 60d494fa0c7..f940f26100a 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
@@ -20,6 +20,7 @@ import {
DEFAULT_FEE_RECIPIENT,
THIRDWEB_PUBLISHER_ADDRESS,
} from "constants/addresses";
+import { ZERO_FEE_CHAINS } from "constants/fee-config";
import { SolidityInput } from "contract-ui/components/solidity-inputs";
import { useTrack } from "hooks/analytics/useTrack";
import { useTxNotifications } from "hooks/useTxNotifications";
@@ -79,6 +80,7 @@ import { TrustedForwardersFieldset } from "./trusted-forwarders-fieldset";
interface CustomContractFormProps {
metadata: FetchDeployMetadataResult;
+ metadataNoFee: FetchDeployMetadataResult | null;
jwt: string;
modules?: FetchDeployMetadataResult[];
teamsAndProjects: MinimalTeamsAndProjects;
@@ -150,6 +152,7 @@ function rewriteTwPublisher(publisher: string | undefined) {
export const CustomContractForm: React.FC = ({
metadata,
+ metadataNoFee,
modules,
jwt,
teamsAndProjects,
@@ -213,7 +216,8 @@ export const CustomContractForm: React.FC = ({
defaultFeeRecipientFunction &&
metadata.publisher === THIRDWEB_PUBLISHER_ADDRESS;
- const isFeeExempt = walletChain?.id === 232 || walletChain?.id === 37111;
+ const isFeeExempt =
+ walletChain?.id && ZERO_FEE_CHAINS.includes(walletChain.id);
const [customFactoryNetwork, customFactoryAddress] = Object.entries(
metadata?.factoryDeploymentData?.customFactoryInput
@@ -514,19 +518,17 @@ export const CustomContractForm: React.FC = ({
name: params.contractMetadata?.name || "",
contractURI: _contractURI,
defaultAdmin: params.deployParams._defaultAdmin as string,
- platformFeeBps:
- metadata.version === "7.0.0" && isFeeExempt
- ? Number(params.deployParams._platformFeeBps)
- : DEFAULT_FEE_BPS_NEW,
- platformFeeRecipient:
- metadata.version === "7.0.0" && isFeeExempt
- ? (params.deployParams._platformFeeRecipient as string)
- : DEFAULT_FEE_RECIPIENT,
+ platformFeeBps: isFeeExempt
+ ? Number(params.deployParams._platformFeeBps)
+ : DEFAULT_FEE_BPS_NEW,
+ platformFeeRecipient: isFeeExempt
+ ? (params.deployParams._platformFeeRecipient as string)
+ : DEFAULT_FEE_RECIPIENT,
trustedForwarders: params.deployParams._trustedForwarders
? JSON.parse(params.deployParams._trustedForwarders as string)
: undefined,
},
- version: metadata.version,
+ version: isFeeExempt ? "7.0.0" : metadata.version,
});
}
@@ -536,15 +538,14 @@ export const CustomContractForm: React.FC = ({
payees,
shares,
_contractURI,
- platformFeeBps: hasInbuiltDefaultFeeConfig
- ? DEFAULT_FEE_BPS_NEW
- : isFeeExempt
- ? Number(params.deployParams._platformFeeBps)
+ platformFeeBps: isFeeExempt
+ ? Number(params.deployParams._platformFeeBps)
+ : hasInbuiltDefaultFeeConfig
+ ? DEFAULT_FEE_BPS_NEW
: DEFAULT_FEE_BPS,
- platformFeeRecipient:
- !hasInbuiltDefaultFeeConfig && isFeeExempt
- ? (params.deployParams._platformFeeRecipient as string)
- : DEFAULT_FEE_RECIPIENT,
+ platformFeeRecipient: isFeeExempt
+ ? (params.deployParams._platformFeeRecipient as string)
+ : DEFAULT_FEE_RECIPIENT,
};
const salt = params.deployDeterministic
@@ -562,7 +563,7 @@ export const CustomContractForm: React.FC = ({
account: activeAccount,
chain: walletChain,
client: thirdwebClient,
- deployMetadata: metadata,
+ deployMetadata: isFeeExempt && metadataNoFee ? metadataNoFee : metadata,
initializeParams,
implementationConstructorParams,
salt,
@@ -782,11 +783,7 @@ export const CustomContractForm: React.FC = ({
)}
diff --git a/apps/dashboard/src/constants/fee-config.ts b/apps/dashboard/src/constants/fee-config.ts
new file mode 100644
index 00000000000..758fa256fd2
--- /dev/null
+++ b/apps/dashboard/src/constants/fee-config.ts
@@ -0,0 +1,13 @@
+export const ZERO_FEE_VERSIONS: Record = {
+ DropERC721: "5.0.5",
+ DropERC1155: "5.0.5",
+ DropERC20: "5.0.3",
+ TokenERC721: "5.0.2",
+ TokenERC1155: "5.0.2",
+ TokenERC20: "5.0.2",
+ LoyaltyCard: "5.0.3",
+ MarketplaceV3: "7.0.0",
+ OpenEditionERC721FlatFee: "1.0.2",
+};
+
+export const ZERO_FEE_CHAINS = [232, 37111];
diff --git a/packages/thirdweb/src/contract/deployment/zksync/implementations.ts b/packages/thirdweb/src/contract/deployment/zksync/implementations.ts
index dd615300150..835e5ced8f0 100644
--- a/packages/thirdweb/src/contract/deployment/zksync/implementations.ts
+++ b/packages/thirdweb/src/contract/deployment/zksync/implementations.ts
@@ -20,6 +20,9 @@ export const ZKSYNC_IMPLEMENTATIONS: Record> = {
[2741]: {
MarketplaceV3: "0x4b14569c7B79DBe686Ac3Ba5996131E7EDaB7a93",
},
+ [232]: {
+ MarketplaceV3: "0x9742f5ac11958cFAd151eBF0Fc31302fA409036E",
+ },
};
export const ZKSYNC_WETH: Record = {
@@ -29,4 +32,5 @@ export const ZKSYNC_WETH: Record = {
[37111]: "0xaA91D645D7a6C1aeaa5988e0547267B77d33fe16",
[555271]: "0xb0b8b267d44c64BA6dD1Daf442949887c85199f6",
[2741]: "0x3439153EB7AF838Ad19d56E1571FBD09333C2809",
+ [232]: "0xE5ecd226b3032910CEaa43ba92EE8232f8237553",
};