Skip to content

Commit 3248212

Browse files
committed
successfully deploys using the initialize data from the event
1 parent 1f74bf6 commit 3248212

File tree

6 files changed

+120
-34
lines changed

6 files changed

+120
-34
lines changed

apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/data-table.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ export function DataTable({
4242
data,
4343
coreMetadata,
4444
modulesMetadata,
45-
initializerCalldata,
45+
initializeData,
4646
}: {
4747
data: CrossChain[];
4848
coreMetadata: FetchDeployMetadataResult;
4949
modulesMetadata: FetchDeployMetadataResult[];
50-
initializerCalldata: `0x${string}`;
50+
initializeData?: `0x${string}`;
5151
}) {
5252
const activeAccount = useActiveAccount();
5353
const switchChain = useSwitchActiveWalletChain();
@@ -116,14 +116,14 @@ export function DataTable({
116116
account: activeAccount,
117117
chain,
118118
client,
119-
deployMetadata: coreMetadata,
120-
initializeParams: coreInitializeParams,
119+
deployMetadata: {
120+
...coreMetadata,
121+
deployType: "crosschain" as const,
122+
},
123+
initializeData,
121124
salt,
122-
modules: modulesMetadata.map((m) => ({
123-
deployMetadata: m,
124-
initializeParams: moduleInitializeParams[m.name],
125-
})),
126125
});
126+
console.log("crosschain contract address", crosschainContractAddress);
127127

128128
await verifyContract({
129129
address: crosschainContractAddress,

apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/page.tsx

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { fetchPublishedContractsFromDeploy } from "components/contract-components/fetchPublishedContractsFromDeploy";
22
import { notFound, redirect } from "next/navigation";
3-
import { readContract } from "thirdweb";
43
import { getContractEvents, prepareEvent } from "thirdweb";
54
import { defineChain, getChainMetadata, localhost } from "thirdweb/chains";
65
import { type FetchDeployMetadataResult, getContract } from "thirdweb/contract";
@@ -109,42 +108,30 @@ export default async function Page(props: {
109108
),
110109
)) as FetchDeployMetadataResult[];
111110

112-
const _erc20InitialData = await Promise.all([
113-
readContract({
114-
contract: contract,
115-
method: "function name() view returns (string)",
116-
}),
117-
readContract({
118-
contract: contract,
119-
method: "function symbol() view returns (string)",
120-
}),
121-
readContract({
122-
contract: contract,
123-
method: "function contractURI() view returns (string)",
124-
}),
125-
readContract({
126-
contract: contract,
127-
method: "function owner() view returns (address)",
128-
}),
129-
]);
130-
131111
const ProxyDeployedEvent = prepareEvent({
132112
signature:
133113
"event ProxyDeployed(address indexed implementation, address proxy, address indexed deployer, bytes data)",
134114
});
135115

116+
const twCloneFactoryContract = getContract({
117+
address: "0xB83db4b940e4796aA1f53DBFC824B9B1865835D5",
118+
chain: contract.chain,
119+
client: contract.client,
120+
});
121+
136122
// TODO: figure out how to fetch the events properly
137-
const [event] = await getContractEvents({
138-
contract,
123+
const events = await getContractEvents({
124+
contract: twCloneFactoryContract,
139125
events: [ProxyDeployedEvent],
140126
blockRange: 123456n,
141127
});
128+
const event = events.find((e) => e.args.proxy === params.contractAddress);
142129

143130
return (
144131
<DataTable
145132
coreMetadata={coreMetadata}
146133
modulesMetadata={modulesMetadata}
147-
initializerCalldata={event?.args.data}
134+
initializeData={event?.args.data}
148135
data={chainsDeployedOn}
149136
/>
150137
);

apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/ModuleForm.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,6 @@ export const InstallModuleForm = (props: InstallModuleFormProps) => {
252252
module: selectedModuleMeta,
253253
isQueryEnabled: !!selectedModule && !!isModuleCompatibleQuery.data,
254254
});
255-
console.log("moduleInstallParams", moduleInstallParams.data);
256255

257256
return (
258257
<FormProvider {...form}>

packages/thirdweb/src/contract/deployment/deploy-via-autofactory.ts

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,13 @@ export function prepareAutoFactoryDeployTransaction(
4747
if (!implementation) {
4848
throw new Error("initializeTransaction must have a 'to' field set");
4949
}
50-
return {
50+
const asd = {
5151
data: await encode(args.initializeTransaction),
5252
implementation,
5353
salt,
5454
} as const;
55+
console.error("core contract deploy params: ", asd);
56+
return asd;
5557
},
5658
});
5759
}
@@ -108,3 +110,61 @@ export async function deployViaAutoFactory(
108110
}
109111
return decodedEvent[0]?.args.proxy;
110112
}
113+
114+
/**
115+
* @internal
116+
*/
117+
export async function deployViaAutoFactoryWithImplementationParams(
118+
options: ClientAndChainAndAccount & {
119+
cloneFactoryContract: ThirdwebContract;
120+
initializeData?: `0x${string}`;
121+
implementationAddress: string;
122+
salt?: string;
123+
},
124+
): Promise<string> {
125+
const {
126+
client,
127+
chain,
128+
account,
129+
cloneFactoryContract,
130+
initializeData,
131+
implementationAddress,
132+
salt,
133+
} = options;
134+
135+
const rpcRequest = getRpcClient({
136+
client,
137+
chain,
138+
});
139+
const blockNumber = await eth_blockNumber(rpcRequest);
140+
const parsedSalt = salt
141+
? salt.startsWith("0x") && salt.length === 66
142+
? (salt as `0x${string}`)
143+
: keccakId(salt)
144+
: toHex(blockNumber, {
145+
size: 32,
146+
});
147+
148+
const asd = {
149+
contract: cloneFactoryContract,
150+
data: initializeData || "0x",
151+
implementation: implementationAddress,
152+
salt: parsedSalt,
153+
};
154+
console.error("cross chain contract deploy params: ", asd);
155+
const tx = deployProxyByImplementation(asd);
156+
const receipt = await sendAndConfirmTransaction({
157+
transaction: tx,
158+
account,
159+
});
160+
const decodedEvent = parseEventLogs({
161+
events: [proxyDeployedEvent()],
162+
logs: receipt.logs,
163+
});
164+
if (decodedEvent.length === 0 || !decodedEvent[0]) {
165+
throw new Error(
166+
`No ProxyDeployed event found in transaction: ${receipt.transactionHash}`,
167+
);
168+
}
169+
return decodedEvent[0]?.args.proxy;
170+
}

packages/thirdweb/src/extensions/prebuilts/deploy-published.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { AbiFunction } from "abitype";
22
import type { Chain } from "../../chains/types.js";
33
import type { ThirdwebClient } from "../../client/client.js";
44
import { type ThirdwebContract, getContract } from "../../contract/contract.js";
5+
import { deployViaAutoFactoryWithImplementationParams } from "../../contract/deployment/deploy-via-autofactory.js";
56
import { fetchPublishedContractMetadata } from "../../contract/deployment/publisher.js";
67
import { getOrDeployInfraContractFromMetadata } from "../../contract/deployment/utils/bootstrap.js";
78
import { sendAndConfirmTransaction } from "../../transaction/actions/send-and-confirm-transaction.js";
@@ -120,6 +121,7 @@ export type DeployContractfromDeployMetadataOptions = {
120121
account: Account;
121122
deployMetadata: FetchDeployMetadataResult;
122123
initializeParams?: Record<string, unknown>;
124+
initializeData?: `0x${string}`;
123125
implementationConstructorParams?: Record<string, unknown>;
124126
modules?: {
125127
deployMetadata: FetchDeployMetadataResult;
@@ -139,6 +141,7 @@ export async function deployContractfromDeployMetadata(
139141
account,
140142
chain,
141143
initializeParams,
144+
initializeData,
142145
deployMetadata,
143146
implementationConstructorParams,
144147
modules,
@@ -205,6 +208,43 @@ export async function deployContractfromDeployMetadata(
205208
salt,
206209
});
207210
}
211+
case "crosschain": {
212+
const { getOrDeployInfraForPublishedContract } = await import(
213+
"../../contract/deployment/utils/bootstrap.js"
214+
);
215+
const { cloneFactoryContract: _, implementationContract } =
216+
await getOrDeployInfraForPublishedContract({
217+
chain,
218+
client,
219+
account,
220+
contractId: deployMetadata.name,
221+
constructorParams:
222+
implementationConstructorParams ||
223+
(await getAllDefaultConstructorParamsForImplementation({
224+
chain,
225+
client,
226+
})),
227+
publisher: deployMetadata.publisher,
228+
});
229+
230+
// TODO: remove this once the modified version of TWCloneFactory
231+
// has been published under the thirdweb wallet
232+
const modifiedCloneFactoryContract = getContract({
233+
client,
234+
address: "0xB83db4b940e4796aA1f53DBFC824B9B1865835D5", // only deployed on OP and zora testnets
235+
chain,
236+
});
237+
238+
return await deployViaAutoFactoryWithImplementationParams({
239+
client,
240+
chain,
241+
account,
242+
cloneFactoryContract: modifiedCloneFactoryContract,
243+
implementationAddress: implementationContract.address,
244+
initializeData,
245+
salt,
246+
});
247+
}
208248
case "customFactory": {
209249
if (!deployMetadata?.factoryDeploymentData?.customFactoryInput) {
210250
throw new Error("No custom factory info found");

packages/thirdweb/src/utils/any-evm/deploy-metadata.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ export type ExtendedMetadata = {
207207
factoryAddresses?: Record<string, string>;
208208
}
209209
| undefined;
210-
deployType?: "standard" | "autoFactory" | "customFactory";
210+
deployType?: "standard" | "autoFactory" | "customFactory" | "crosschain";
211211
routerType?: "none" | "plugin" | "dynamic" | "modular";
212212
networksForDeployment?: {
213213
allNetworks?: boolean;

0 commit comments

Comments
 (0)