// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;// NOTE: Deploy this contract first
contract B {// NOTE: storage layout must be the same as contract Auint public num;
address public sender;uint public value;
bytes public cdata;
function setVars(uint _num) public payable {
num = _num;
sender = msg.sender;
value = msg.value;
cdata = msg.data;}}
contract A {uint public num;
address public sender;uint public value;
bytes public cdata;
function setVars(address _contract,uint _num) public payable {// A's storage is set, B is not modified.(bool success, bytes memory data)= _contract.delegatecall(
abi.encodeWithSignature("setVars(uint256)", _num));}
function setNum(uint _num) public payable {
num = _num;
cdata = msg.data;
sender = msg.sender;
value = msg.value;}
function setNumIndirect(uint _num) public {setNum(_num);}
function setNumIndirectByCall(uint _num) public {address(this).call(abi.encodeWithSignature("setNum(uint256)", _num));}}