---
description: Returns the creation bytecode for a contract in the project
---

## `getCode`

### Signature

```solidity
function getCode(string calldata artifactPath) external returns (bytes memory creationBytecode);
```

### Description

Returns the **creation** bytecode for a contract in the project given the path to the contract.

The calldata parameter can either be in the form `ContractFile.sol` (if the filename and contract name are the same), `ContractFile.sol:ContractName`, or the path to an artifact, relative to the root of your project.

### Parameters

| Parameter      | Type     | Description                                    |
|----------------|----------|------------------------------------------------|
| `artifactPath` | `string` | Path to the contract artifact (see supported formats below) |

### Returns

| Type    | Description                        |
|---------|------------------------------------|
| `bytes` | The creation bytecode of the contract |

### Examples

```solidity [test/GetCode.t.sol]
MyContract myContract = new MyContract(arg1, arg2);

// Let's do the same thing with `getCode`
bytes memory args = abi.encode(arg1, arg2);
bytes memory bytecode = abi.encodePacked(vm.getCode("MyContract.sol:MyContract"), args);
address anotherAddress;
assembly {
    anotherAddress := create(0, add(bytecode, 0x20), mload(bytecode))
}

assertEq0(address(myContract).code, anotherAddress.code); // [PASS]
```

Deploy a contract to an arbitrary address by combining `getCode` and [`etch`](/reference/cheatcodes/etch):

```solidity [test/DeployToAddress.t.sol]
// Deploy
bytes memory args = abi.encode(arg1, arg2);
bytes memory bytecode = abi.encodePacked(vm.getCode("MyContract.sol:MyContract"), args);
address deployed;
assembly {
    deployed := create(0, add(bytecode, 0x20), mload(bytecode))
}

// Set the bytecode of an arbitrary address
vm.etch(targetAddr, deployed.code);
```

### Supported Formats

You can fetch artifacts by either contract path or contract name. Fetching artifacts for a specific version is also supported. If not provided, cheatcode will default to the version of a test being executed or the only version artifact was compiled with.

```solidity
vm.getCode("MyContract.sol:MyContract");
vm.getCode("MyContract");
vm.getCode("MyContract.sol:0.8.18");
vm.getCode("MyContract:0.8.18");
```

### Gotchas

:::warning
`getCode` requires read permission for the output directory. To grant read access, set `fs_permissions = [{ access = "read", path = "./out"}]` in your `foundry.toml`.
:::

### Related Cheatcodes

- [`getDeployedCode`](/reference/cheatcodes/get-deployed-code) - Returns the runtime bytecode
- [`getSelectors`](/reference/cheatcodes/get-selectors) - Returns function selectors from an artifact ABI
- [`etch`](/reference/cheatcodes/etch) - Sets the bytecode of an address

### See Also

- [`deployCode`](/reference/forge-std/deployCode)
- [`deployCodeTo`](/reference/forge-std/deployCodeTo)
