Through a parent contract, I want to be able to originate multiple child contracts. How can I do this in LIGO?

2 Answers 2


Unfortunately, Tezos.create_contract does not work well in practice. It only works if the child contract is extremely simple. The child code must either be written entirely inside the Tezos.create_contract call, or all of the definitions it uses must be [@inline]'d. If not all definitions are inlined, you will get the somewhat cryptic error "Not all free variables could be inlined in Tezos.create_contract usage."

A better alternative should be provided in some future Ligo version. Hopefully soon-ish.

In the meantime there is a workaround: compile your child contract separately, and use inline %Michelson with CREATE_CONTRACT, possibly using #include to include the compiled .tz file. Here is an example in Cameligo:

type child_storage = unit

type create_contract_args =
  (* order matters because we will cross the Michelson boundary *)
  { delegate : key_hash option;
    balance : tez;
    storage : child_storage }

type create_contract_result =
  { operation : operation;
    address : address }

[@inline] let create_contract =
  [%Michelson ({|{ UNPAIR 3;
#include "./child.tz"
                   }|} : create_contract_args -> create_contract_result)]

let main (_ : unit * unit) : operation list * unit =
  let {operation; address = _} =
    create_contract { delegate = (None : key_hash option);
                      balance = Tezos.get_amount ();
                      storage = () } in
  ([operation], ())

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.