Skip to content

Latest commit

 

History

History
85 lines (61 loc) · 3.08 KB

README.md

File metadata and controls

85 lines (61 loc) · 3.08 KB

Foundry x Dasy

License

A foundry library for working with dasy contracts. Take a look at z80's skunkworks to see an example project that uses this library.

Installing

First, install the dasy compiler by running:

pipx install dasy

Then, install this library with forge:

forge install dasylang/foundry-dasy

Usage

The HuffDeployer is a Solidity library that takes a filename and deploys the corresponding Huff contract, returning the address that the bytecode was deployed to. To use it, simply import it into your file by doing:

import {DasyDeployer} from "foundry-dasy/DasyDeployer.sol";

To compile contracts, you can use DasyDeployer.deploy(string fileName), which takes in a single string representing the filename's path relative to the src directory. Note that the file ending, i.e. .dasy, must be omitted. Here is an example deployment (where the contract is located in src/test/contracts/Number.dasy):

// SPDX-License-Identifier: Apache-2.0
pragma solidity >=0.7.0 <0.9.0;

import {DasyDeployer} from "foundry-dasy/DasyDeployer";

interface Number {
  function setNumber(uint256) external;
  function getNumber() external returns (uint256);
}

contract DasyDeployerExample {
  function deploy() public {
    // Deploy a new instance of src/test/contracts/Number.dasy
    address addr = DasyDeployer.deploy("test/contracts/Number");

    // To call a function on the deployed contract, create an interface and wrap the address like so
    Number number = Number(addr);
  }
}

To deploy a Dasy contract with constructor arguments, you can chain commands onto the DasyDeployer.

For example, to deploy the contract src/test/contracts/Constructor.dasy with arguments (uint256(0x420), uint256(0x420)), you are encouraged to follow the logic defined in the deploy function of the DasyDeployerArguments contract below.

// SPDX-License-Identifier: Apache-2.0
pragma solidity >=0.7.0 <0.9.0;

import {DasyDeployer} from "foundry-dasy/DasyDeployer";

interface Constructor {
  function getArgOne() external returns (address);
  function getArgTwo() external returns (uint256);
}

contract DasyDeployerArguments {
  function deploy() public {
    // Deploy the contract with arguments
    address addr = DasyDeployer
      .config()
      .with_args(bytes.concat(abi.encode(uint256(0x420)), abi.encode(uint256(0x420))))
      .deploy("test/contracts/Constructor");

    // To call a function on the deployed contract, create an interface and wrap the address
    Constructor construct = Constructor(addr);

    // Validate we deployed the Constructor with the correct arguments
    assert(construct.getArgOne() == address(0x420));
    assert(construct.getArgTwo() == uint256(0x420));
  }
}