I have three smart contracts:

An abstract one:

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/AccessControl.sol";

 * @title Base contract for state machines
abstract contract StateMachine is AccessControl {
  event Transition(address sender, bytes32 fromState, bytes32 toState);

  struct State {
    // a boolean to check if the state is actually created
    bool hasBeenCreated;
    // a mapping of functions that can be executed when in this state
    mapping(bytes4 => bool) allowedFunctions;
    // a list of all the roles that have been configured for this state
    bytes32[] allowedRoles;
    // a list of all the preconditions that have been configured for this state
    function(bytes32, bytes32) internal view[] preConditions;
    // a list of callbacks to execute before the state transition completes
    function(bytes32, bytes32) internal[] callbacks;
    // a list of states that can be transitioned to
    bytes32[] nextStates;
    // function that executes logic and then does a StateTransition
    bytes4 preFunction;

  struct StateTransition {
    bytes32 fromState;
    bytes32 toState;
    address actor;
    uint256 timestamp;

  StateTransition[] public history;

  mapping(bytes32 => State) internal states;
  bytes32[] internal possibleStates;
  bytes32 internal currentState;

  // a list of selectors that might be allowed functions
  bytes4[] internal knownSelectors;
  mapping(bytes4 => bool) internal knownSelector;

  // a list of allowed functions per state
  bytes4[] internal stateFunctions;
  mapping(bytes32 => bytes4[]) internal stateFunction;

  // To Check if there is a relation between one state and another
  mapping(bytes32 => mapping(bytes32 => bool)) internal nextStateToState;
   * @dev Abstract function to setup the state machine configuration
  function setupStateMachine(address Admin) internal virtual {}

  function createState(bytes32 stateName) internal {
    require(!states[stateName].hasBeenCreated, "this state has already been created");
    states[stateName].hasBeenCreated = true;

   * @notice Configures the initial state of an object
  function setInitialState(bytes32 initialState) internal {
    require(states[initialState].hasBeenCreated, "the initial state has not been created yet");
      currentState == 0,
      "the current state has already been set, so you cannot configure the initial state and override it"
    currentState = initialState;

My implementation (from which I want to create clones):

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "./StateMachine.sol";

contract SupplyChain is StateMachine, Initializable {
  bytes32 public constant STATE_DEMAND_GENERATED = 'DEMAND GENERATED';

  bytes32 public constant ROLE_ADMIN = 'ROLE_ADMIN';

  bytes32[] public _roles = [ROLE_ADMIN];

  function initialize() public virtual initializer {
    address Admin = msg.sender;
    _setupRole(DEFAULT_ADMIN_ROLE, Admin);

  function setupStateMachine(address Admin) internal override {
    //create all states

    // add properties


And then my proxy factory:

pragma solidity 0.8.6;

import "@openzeppelin/contracts/proxy/Clones.sol";
import "./SupplyChain.sol";

contract SupplyChainFactory {
    address immutable proxyImplementation;
    constructor() public {
        proxyImplementation = address(new SupplyChain());
    function createSupplyChain() external returns (address) {
        address clone = Clones.clone(proxyImplementation);
        return clone;

I am currently only testing in Remix but right now when I click createSupplyChain(), it returns : [vm] from: 0x5B3...eddC4 to: SupplyChain.(fallback) 0x1d1...3B8BD value: 0 wei data: 0x4a4...5a1b3 logs: 22 hash: 0xde0...0f27f

but in the decoded output I have nothing, can you guys explain me what I do wrong? or what I don't understand here? Thanks in advance


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.