Summary
This challenge reminds the weird workings of solidity in assembly. Here the challenge contract is supposed to call the setup contract but the challenge contract executes only one opcode at a time and further more. One of the interesting challenges that i have played.Intro to challenge
This is evmvm contract.
enterTheMetametaverse
function takes opcode and bytes32 argument which is used only when
necessary for example in a calldata operations.
To understand this better, let's say we want to add two values. we pass 0x01 as argument in the function. The function pops the top 2 values from the stack variable and adds it and pushes the result back into the stack. You may wonder there's nothing in the stack to pop and we don't have explicit
spush
calling ability. We'll discuss about this in later part.

setup
contract initializes the evmvm
contract in a immutable variable. So,
there is no way to change the address the only way is to make the evmvm
contract call the
setup
contract to solve. To call another contract we can use call
or
delegate call
opcode.


0x00000000

evmvm
contract. There is
something different when it comes to delegate call.
click me
The evmvm
contract calls the fallback function using delegate call but msg.sender is still
the evmvm
contract interesting!. So, that's it?
Make a contract which has fallback calling the
evmvm
contract's solve and push the values
into the stack and call the delegate call opcode. Yes, except one.
We push four 0's first then address and then gas. So, that stack top value is gas and it gets poped as first argument and so on. But that's not the case. Click me! So, we need to push in the reverse order. The contract should look something like this.

evmvm
contract to know the
metametaverse
contract address and calls the gas opcode and then caller opcode to delegate the
function call and followed by self balance which is 0 and finally delegate call opcode which in turn calls
the fallback
function and solved.
My way of pushing values into the stack when i thought of using call opcode was to first call
callvalue
opcode four times to push 0 into the stack. Then I create a contract and fund the
contract with 36 wei and send the balance to evmvm
contract by destroying it. Then call
self balance
opcode to push 36 into the stack and duplicate it. I use the duplicated value to
access the 2nd argument using calldataload opcode by doing that i can load the contract address and swap the
stack to bring back 36 again to the top of the stack so that i can repeat the part again and push the gas
value into the stack. Confusing! LOL
Credits @rage_pit