// A contract consists of a single object with sub-objects representing // the code to be deployed or other contracts it can create. // The single "code" node is the executable code of the object. // Every (other) named object or data section is serialized and // made accessible to the special built-in functions datacopy / dataoffset / datasize // The current object, sub-objects and data items inside the current object // are in scope. object "Contract1" { // This is the constructor code of the contract. code { function allocate(size) -> ptr { ptr := mload(0x40) if iszero(ptr) { ptr := 0x60 } mstore(0x40, add(ptr, size)) } // first create "Contract2" let size := datasize("Contract2") let offset := allocate(size) // This will turn into codecopy for EVM datacopy(offset, dataoffset("Contract2"), size) // constructor parameter is a single number 0x1234 mstore(add(offset, size), 0x1234) pop(create(offset, add(size, 32), 0)) // now return the runtime object (the currently // executing code is the constructor code) size := datasize("runtime") offset := allocate(size) // This will turn into a memory->memory copy for eWASM and // a codecopy for EVM datacopy(offset, dataoffset("runtime"), size) return(offset, size) } data "Table2" hex"4123" object "runtime" { code { function allocate(size) -> ptr { ptr := mload(0x40) if iszero(ptr) { ptr := 0x60 } mstore(0x40, add(ptr, size)) } // runtime code mstore(0, "Hello, World!") return(0, 0x20) } } // Embedded object. Use case is that the outside is a factory contract, // and Contract2 is the code to be created by the factory object "Contract2" { code { // code here ... } object "runtime" { code { // code here ... } } data "Table1" hex"4123" } }