Commit afcc51a4 authored by Matt Solomon's avatar Matt Solomon Committed by GitHub

test: more blueprint tests (#11782)

* test: more blueprint tests

* address PR feedback
parent ccf9d3e2
...@@ -28,7 +28,7 @@ library Blueprint { ...@@ -28,7 +28,7 @@ library Blueprint {
/// @notice Thrown when parsing a blueprint preamble and the preamble data is not empty. /// @notice Thrown when parsing a blueprint preamble and the preamble data is not empty.
/// We do not use the preamble data, so it's expected to be empty. /// We do not use the preamble data, so it's expected to be empty.
error UnexpectedPreambleData(); error UnexpectedPreambleData(bytes data);
/// @notice Thrown during deployment if the ERC version is not supported. /// @notice Thrown during deployment if the ERC version is not supported.
error UnsupportedERCVersion(uint8 version); error UnsupportedERCVersion(uint8 version);
...@@ -37,6 +37,9 @@ library Blueprint { ...@@ -37,6 +37,9 @@ library Blueprint {
/// which will deploy a corresponding blueprint contract (with no data section). Based on the /// which will deploy a corresponding blueprint contract (with no data section). Based on the
/// reference implementation in https://eips.ethereum.org/EIPS/eip-5202. /// reference implementation in https://eips.ethereum.org/EIPS/eip-5202.
function blueprintDeployerBytecode(bytes memory _initcode) internal pure returns (bytes memory) { function blueprintDeployerBytecode(bytes memory _initcode) internal pure returns (bytes memory) {
// Check that the initcode is not empty.
if (_initcode.length == 0) revert EmptyInitcode();
bytes memory blueprintPreamble = hex"FE7100"; // ERC-5202 preamble. bytes memory blueprintPreamble = hex"FE7100"; // ERC-5202 preamble.
bytes memory blueprintBytecode = bytes.concat(blueprintPreamble, _initcode); bytes memory blueprintBytecode = bytes.concat(blueprintPreamble, _initcode);
...@@ -89,12 +92,18 @@ library Blueprint { ...@@ -89,12 +92,18 @@ library Blueprint {
return Preamble(ercVersion, preambleData, initcode); return Preamble(ercVersion, preambleData, initcode);
} }
/// @notice Parses the code at the given `_target` as a blueprint and deploys the resulting initcode.
/// This version of `deployFrom` is used when the initcode requires no constructor arguments.
function deployFrom(address _target, bytes32 _salt) internal returns (address) {
return deployFrom(_target, _salt, new bytes(0));
}
/// @notice Parses the code at the given `_target` as a blueprint and deploys the resulting initcode /// @notice Parses the code at the given `_target` as a blueprint and deploys the resulting initcode
/// with the given `_data` appended, i.e. `_data` is the ABI-encoded constructor arguments. /// with the given `_data` appended, i.e. `_data` is the ABI-encoded constructor arguments.
function deployFrom(address _target, bytes32 _salt, bytes memory _data) internal returns (address newContract_) { function deployFrom(address _target, bytes32 _salt, bytes memory _data) internal returns (address newContract_) {
Preamble memory preamble = parseBlueprintPreamble(address(_target).code); Preamble memory preamble = parseBlueprintPreamble(address(_target).code);
if (preamble.ercVersion != 0) revert UnsupportedERCVersion(preamble.ercVersion); if (preamble.ercVersion != 0) revert UnsupportedERCVersion(preamble.ercVersion);
if (preamble.preambleData.length != 0) revert UnexpectedPreambleData(); if (preamble.preambleData.length != 0) revert UnexpectedPreambleData(preamble.preambleData);
bytes memory initcode = bytes.concat(preamble.initcode, _data); bytes memory initcode = bytes.concat(preamble.initcode, _data);
assembly ("memory-safe") { assembly ("memory-safe") {
...@@ -103,11 +112,6 @@ library Blueprint { ...@@ -103,11 +112,6 @@ library Blueprint {
if (newContract_ == address(0)) revert DeploymentFailed(); if (newContract_ == address(0)) revert DeploymentFailed();
} }
/// @notice Parses the code at the given `_target` as a blueprint and deploys the resulting initcode.
function deployFrom(address _target, bytes32 _salt) internal returns (address) {
return deployFrom(_target, _salt, new bytes(0));
}
/// @notice Convert a bytes array to a uint256. /// @notice Convert a bytes array to a uint256.
function bytesToUint(bytes memory _b) internal pure returns (uint256) { function bytesToUint(bytes memory _b) internal pure returns (uint256) {
if (_b.length > 32) revert BytesArrayTooLong(); if (_b.length > 32) revert BytesArrayTooLong();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment