diff --git a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/RecentTransfers.tsx b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/RecentTransfers.tsx index 0a52fbc4ef6..c861e72345a 100644 --- a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/RecentTransfers.tsx +++ b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/RecentTransfers.tsx @@ -107,9 +107,16 @@ function RecentTransfersUI(props: { - {formatDistanceToNow(new Date(transfer.block_timestamp), { - addSuffix: true, - })} + {formatDistanceToNow( + new Date( + transfer.block_timestamp.endsWith("Z") + ? transfer.block_timestamp + : `${transfer.block_timestamp}Z`, + ), + { + addSuffix: true, + }, + )} + + + + ); + } + return (
@@ -225,10 +334,12 @@ export function ClaimTokenCardUI(props: { skeletonData={`0.00 ${props.claimConditionCurrency.symbol}`} loadedData={ claimParamsData - ? `${toTokens( - claimParamsData.pricePerTokenWei, - claimParamsData.decimals, - )} ${claimParamsData.symbol}` + ? claimParamsData.pricePerTokenWei === 0n + ? "FREE" + : `${toTokens( + claimParamsData.pricePerTokenWei, + claimParamsData.decimals, + )} ${claimParamsData.symbol}` : undefined } render={(v) => { @@ -251,14 +362,16 @@ export function ClaimTokenCardUI(props: { skeletonData={"0.00 ETH"} loadedData={ claimParamsData - ? `${ - Number( - toTokens( - claimParamsData.pricePerTokenWei, - claimParamsData.decimals, - ), - ) * Number(quantity) - } ${claimParamsData.symbol}` + ? claimParamsData.pricePerTokenWei === 0n + ? "FREE" + : `${ + Number( + toTokens( + claimParamsData.pricePerTokenWei, + claimParamsData.decimals, + ), + ) * Number(quantity) + } ${claimParamsData.symbol}` : undefined } render={(v) => { @@ -353,7 +466,6 @@ function PriceInput(props: { id={props.id} value={String(props.quantity)} onChange={(value) => { - console.log("value", value); props.setQuantity(value); }} className="!text-2xl h-auto truncate bg-muted/50 pr-14 font-bold" diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/create-token-page-impl.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/create-token-page-impl.tsx index f704d2b8a84..9ed0077c31b 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/create-token-page-impl.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/create-token-page-impl.tsx @@ -62,7 +62,10 @@ export function CreateTokenAssetPage(props: { ); trackEvent( - getTokenDeploymentTrackingData("attempt", Number(formValues.chain)), + getTokenDeploymentTrackingData({ + type: "attempt", + chainId: Number(formValues.chain), + }), ); const socialUrls = formValues.socialUrls.reduce( @@ -109,7 +112,10 @@ export function CreateTokenAssetPage(props: { ); trackEvent( - getTokenDeploymentTrackingData("success", Number(formValues.chain)), + getTokenDeploymentTrackingData({ + type: "success", + chainId: Number(formValues.chain), + }), ); // add contract to project in background @@ -133,11 +139,16 @@ export function CreateTokenAssetPage(props: { action: "deploy", chainId: Number(formValues.chain), status: "error", + errorMessage: e instanceof Error ? e.message : "Unknown error", }), ); trackEvent( - getTokenDeploymentTrackingData("error", Number(formValues.chain)), + getTokenDeploymentTrackingData({ + type: "error", + chainId: Number(formValues.chain), + errorMessage: e instanceof Error ? e.message : "Unknown error", + }), ); throw e; } @@ -201,6 +212,7 @@ export function CreateTokenAssetPage(props: { action: "airdrop", chainId: Number(formValues.chain), status: "error", + errorMessage: e instanceof Error ? e.message : "Unknown error", }), ); throw e; @@ -270,6 +282,7 @@ export function CreateTokenAssetPage(props: { action: "mint", chainId: Number(formValues.chain), status: "error", + errorMessage: e instanceof Error ? e.message : "Unknown error", }), ); throw e; @@ -368,6 +381,7 @@ export function CreateTokenAssetPage(props: { action: "claim-conditions", chainId: Number(formValues.chain), status: "error", + errorMessage: e instanceof Error ? e.message : "Unknown error", }), ); throw e; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/launch/launch-token.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/launch/launch-token.tsx index 1a66ac53d2f..ab756374369 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/launch/launch-token.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/launch/launch-token.tsx @@ -46,18 +46,29 @@ export function LaunchTokenStatus(props: { const trackEvent = useTrack(); async function handleSubmitClick() { - function launchTracking(type: "attempt" | "success" | "error") { + function launchTracking( + params: + | { + type: "attempt" | "success"; + } + | { + type: "error"; + errorMessage: string; + }, + ) { trackEvent( getLaunchTrackingData({ chainId: Number(formValues.chain), airdropEnabled: formValues.airdropEnabled, saleEnabled: formValues.saleEnabled, - type, + ...params, }), ); } - launchTracking("attempt"); + launchTracking({ + type: "attempt", + }); function updateStatus(index: number, newStatus: MultiStepState["status"]) { setSteps((prev) => { @@ -84,12 +95,18 @@ export function LaunchTokenStatus(props: { // do not use await next step nextStep.execute(); } else { - launchTracking("success"); + launchTracking({ + type: "success", + }); props.onLaunchSuccess(); } } catch (error) { updateStatus(index, "error"); - launchTracking("error"); + launchTracking({ + type: "error", + errorMessage: + error instanceof Error ? error.message : "Unknown error", + }); console.error(error); } }; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/tracking.ts b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/tracking.ts index 2da4e7e7cbc..412058fa8c3 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/tracking.ts +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/tracking.ts @@ -1,40 +1,72 @@ export function getTokenDeploymentTrackingData( - type: "attempt" | "success" | "error", - chainId: number, + params: { + chainId: number; + } & ( + | { + type: "attempt" | "success"; + } + | { + type: "error"; + errorMessage: string; + } + ), ) { // using "custom-contract" because it has to match the main deployment tracking format return { category: "custom-contract", action: "deploy", - label: type, + label: params.type, publisherAndContractName: "deployer.thirdweb.eth/DropERC20", - chainId: chainId, + chainId: params.chainId, deploymentType: "asset", }; } // example: asset.claim-conditions.attempt -export function getTokenStepTrackingData(params: { - action: "claim-conditions" | "airdrop" | "mint" | "deploy"; - chainId: number; - status: "attempt" | "success" | "error"; -}) { +export function getTokenStepTrackingData( + params: { + action: "claim-conditions" | "airdrop" | "mint" | "deploy"; + chainId: number; + } & ( + | { + status: "attempt" | "success"; + } + | { + status: "error"; + errorMessage: string; + } + ), +) { return { category: "asset", action: params.action, contractType: "DropERC20", label: params.status, chainId: params.chainId, + ...(params.status === "error" + ? { + errorMessage: params.errorMessage, + } + : {}), }; } // example: asset.launch.attempt -export function getLaunchTrackingData(params: { - chainId: number; - airdropEnabled: boolean; - saleEnabled: boolean; - type: "attempt" | "success" | "error"; -}) { +export function getLaunchTrackingData( + params: { + chainId: number; + airdropEnabled: boolean; + saleEnabled: boolean; + } & ( + | { + type: "attempt" | "success"; + } + | { + type: "error"; + errorMessage: string; + } + ), +) { return { category: "asset", action: "launch", @@ -43,6 +75,11 @@ export function getLaunchTrackingData(params: { chainId: params.chainId, airdropEnabled: params.airdropEnabled, saleEnabled: params.saleEnabled, + ...(params.type === "error" + ? { + errorMessage: params.errorMessage, + } + : {}), }; } diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx index 8ce108a67d0..f0393114cf6 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx @@ -75,11 +75,7 @@ export function ProjectSidebarLayout(props: { }, { href: `${layoutPath}/engine`, - label: ( - - Engine New - - ), + label: "Engine", icon: EngineIcon, tracking: tracking("engine"), },