Skip to content

Commit

Permalink
Init Safe deployment script
Browse files Browse the repository at this point in the history
  • Loading branch information
spacesailor24 committed Dec 19, 2024
1 parent 485aff2 commit 17632d8
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 61 deletions.
66 changes: 7 additions & 59 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,66 +1,14 @@
## Foundry
# Commands

**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.**
- Deploy `PKPTools.sol` using existing Safe contract:

Foundry consists of:

- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools).
- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data.
- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network.
- **Chisel**: Fast, utilitarian, and verbose solidity REPL.

## Documentation

https://book.getfoundry.sh/

## Usage

### Build

```shell
$ forge build
```

### Test

```shell
$ forge test
```

### Format

```shell
$ forge fmt
```bash
SAFE_ADDRESS=0x... forge script script/PKPTools.s.sol --rpc-url <your-rpc-url> --private-key <your-private-key>
```

### Gas Snapshots
- Deploy `PKPTools.sol` using new Safe contract:

```shell
$ forge snapshot
```bash
forge script script/PKPTools.s.sol --rpc-url <your-rpc-url> --private-key <your-private-key>
```

### Anvil

```shell
$ anvil
```

### Deploy

```shell
$ forge script script/Counter.s.sol:CounterScript --rpc-url <your_rpc_url> --private-key <your_private_key>
```

### Cast

```shell
$ cast <subcommand>
```

### Help

```shell
$ forge --help
$ anvil --help
$ cast --help
```
16 changes: 14 additions & 2 deletions script/PKPTools.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,29 @@ pragma solidity ^0.8.13;

import {Script, console} from "forge-std/Script.sol";
import {PKPTools} from "../contracts/PKPTools.sol";
import {SafeDeployScript} from "./SafeDeploy.s.sol";

contract PKPToolsScript is Script {
PKPTools public pkt;

function setUp() public {}

function run() public {
vm.startBroadcast();
address safeAddress = vm.envOr("SAFE_ADDRESS", address(0));

// If SAFE_ADDRESS is not set, deploy a new Safe
if (safeAddress == address(0)) {
console.log("No SAFE_ADDRESS provided, deploying new Safe...");
SafeDeployScript safeDeployer = new SafeDeployScript();
safeAddress = safeDeployer.run();
}

pkt = new PKPTools();
console.log("Using Safe address:", safeAddress);

vm.startBroadcast();
pkt = new PKPTools(safeAddress);
vm.stopBroadcast();

console.log("PKPTools deployed at:", address(pkt));
}
}
48 changes: 48 additions & 0 deletions script/SafeDeploy.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, console} from "forge-std/Script.sol";
import {Safe} from "../lib/safe-contracts/contracts/Safe.sol";
import {SafeProxyFactory} from "../lib/safe-contracts/contracts/proxies/SafeProxyFactory.sol";

contract SafeDeployScript is Script {
Safe public safeSingleton;
SafeProxyFactory public safeProxyFactory;
Safe public safeProxy;

function setUp() public {}

function run() public returns (address) {
vm.startBroadcast();

// Deploy Safe singleton and factory
safeSingleton = new Safe();
safeProxyFactory = new SafeProxyFactory();

// Deploy Safe proxy
address[] memory owners = new address[](1);
owners[0] = msg.sender;
bytes memory initializer = abi.encodeWithSelector(
Safe.setup.selector,
owners, // owners
1, // threshold
address(0), // to
bytes(""), // data
address(0), // fallbackHandler
address(0), // paymentToken
0, // payment
address(0) // paymentReceiver
);

address proxyAddress = address(safeProxyFactory.createProxyWithNonce(
address(safeSingleton),
initializer,
block.timestamp
));

vm.stopBroadcast();

console.log("Safe deployed at:", proxyAddress);
return proxyAddress;
}
}

0 comments on commit 17632d8

Please sign in to comment.