Skip to content

Commit c5c3e51

Browse files
committed
activation tx for stylus contracts
1 parent 25b674b commit c5c3e51

File tree

7 files changed

+236
-12
lines changed

7 files changed

+236
-12
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[
2+
"function activateProgram(address program)"
3+
]

packages/thirdweb/src/contract/deployment/deploy-with-abi.ts

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import type { Abi, AbiConstructor } from "abitype";
2+
import { activateStylusContract } from "../../extensions/stylus/write/activateStylusContract.js";
23
import { sendAndConfirmTransaction } from "../../transaction/actions/send-and-confirm-transaction.js";
4+
import { sendTransaction } from "../../transaction/actions/send-transaction.js";
35
import { prepareTransaction } from "../../transaction/prepare-transaction.js";
46
import { encodeAbiParameters } from "../../utils/abi/encodeAbiParameters.js";
57
import { normalizeFunctionParams } from "../../utils/abi/normalizeFunctionParams.js";
@@ -124,6 +126,7 @@ export async function deployContract(
124126
account: Account;
125127
salt?: string;
126128
extraDataWithUri?: Hex;
129+
isStylus?: boolean;
127130
},
128131
) {
129132
if (await isZkSyncChain(options.chain)) {
@@ -138,10 +141,11 @@ export async function deployContract(
138141
});
139142
}
140143

144+
let address: string | null | undefined;
141145
if (options.salt !== undefined) {
142146
// Deploy with CREATE2 if salt is provided
143147
const info = await computeDeploymentInfoFromBytecode(options);
144-
const address = computeDeploymentAddress({
148+
address = computeDeploymentAddress({
145149
bytecode: options.bytecode,
146150
encodedArgs: info.encodedArgs,
147151
create2FactoryAddress: info.create2FactoryAddress,
@@ -167,18 +171,32 @@ export async function deployContract(
167171
data: info.initCalldata,
168172
}),
169173
});
170-
return address;
174+
} else {
175+
const deployTx = prepareDirectDeployTransaction(options);
176+
const receipt = await sendAndConfirmTransaction({
177+
account: options.account,
178+
transaction: deployTx,
179+
});
180+
address = receipt.contractAddress;
181+
if (!address) {
182+
throw new Error(
183+
`Could not find deployed contract address in transaction: ${receipt.transactionHash}`,
184+
);
185+
}
171186
}
172187

173-
const deployTx = prepareDirectDeployTransaction(options);
174-
const receipt = await sendAndConfirmTransaction({
175-
account: options.account,
176-
transaction: deployTx,
177-
});
178-
if (!receipt.contractAddress) {
179-
throw new Error(
180-
`Could not find deployed contract address in transaction: ${receipt.transactionHash}`,
181-
);
188+
if (options.isStylus) {
189+
const activationTransaction = activateStylusContract({
190+
chain: options.chain,
191+
client: options.client,
192+
contractAddress: address,
193+
});
194+
195+
await sendTransaction({
196+
transaction: activationTransaction,
197+
account: options.account,
198+
});
182199
}
183-
return receipt.contractAddress;
200+
201+
return address;
184202
}

packages/thirdweb/src/contract/deployment/utils/bootstrap.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import { activateStylusContract } from "../../../extensions/stylus/write/activateStylusContract.js";
12
import { sendAndConfirmTransaction } from "../../../transaction/actions/send-and-confirm-transaction.js";
3+
import { sendTransaction } from "../../../transaction/actions/send-transaction.js";
24
import {
35
type FetchDeployMetadataResult,
46
fetchBytecodeFromCompilerMetadata,
@@ -255,5 +257,20 @@ export async function getOrDeployInfraContractFromMetadata(
255257
if (!deployedInfraContract) {
256258
throw new Error(`Failed to deploy ${options.contractMetadata.name}`);
257259
}
260+
261+
const isStylus = options.contractMetadata.metadata.language === "rust";
262+
if (isStylus) {
263+
const activationTransaction = activateStylusContract({
264+
chain: options.chain,
265+
client: options.client,
266+
contractAddress: deployedInfraContract.address,
267+
});
268+
269+
await sendTransaction({
270+
transaction: activationTransaction,
271+
account: options.account,
272+
});
273+
}
274+
258275
return deployedInfraContract;
259276
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/**
2+
* Write
3+
*/
4+
export {
5+
activateStylusContract,
6+
type ActivateStylusContractOptions,
7+
} from "../../extensions/stylus/write/activateStylusContract.js";

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ async function directDeploy(options: {
363363
metadataUri: options.metadataUri,
364364
})
365365
: undefined,
366+
isStylus: options.compilerMetadata.metadata.language === "rust",
366367
});
367368
}
368369

packages/thirdweb/src/extensions/stylus/__generated__/IArbWasm/write/activateProgram.ts

Lines changed: 137 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import type { Chain } from "../../../chains/types.js";
2+
import type { ThirdwebClient } from "../../../client/client.js";
3+
import { getContract } from "../../../contract/contract.js";
4+
import { activateProgram } from "../__generated__/IArbWasm/write/activateProgram.js";
5+
6+
const ARB_WASM_ADDRESS = "0000000000000000000000000000000000000071";
7+
8+
export type ActivateStylusContractOptions = {
9+
chain: Chain;
10+
client: ThirdwebClient;
11+
contractAddress: string;
12+
};
13+
14+
/**
15+
* Activate a stylus contract by calling ArbWasm Precompile
16+
* @param options - The options for activating the contract
17+
* @returns A prepared transaction to send
18+
* @example
19+
* ```ts
20+
* import { activateStylusContract } from "thirdweb/stylus";
21+
* const transaction = activateStylusContract({
22+
* client,
23+
* chain,
24+
* contractAddress,
25+
* });
26+
* await sendTransaction({ transaction, account });
27+
* ```
28+
*/
29+
export function activateStylusContract(options: ActivateStylusContractOptions) {
30+
const { chain, client, contractAddress } = options;
31+
const arbWasmPrecompile = getContract({
32+
client,
33+
chain,
34+
address: ARB_WASM_ADDRESS,
35+
});
36+
37+
return activateProgram({
38+
program: contractAddress,
39+
contract: arbWasmPrecompile,
40+
});
41+
}

0 commit comments

Comments
 (0)