Storage Exercise
Create a contract that adheres to the following specifications:
Contract
Create a single contract called EmployeeStorage
. It should not inherit from any other contracts. It should have the following functions:
State Variables
The contract should have the following state variables, optimized to minimize storage:
- A private variable
shares
storing the employee's number of shares owned- Employees with more than 5,000 shares count as directors and are stored in another contract
- Public variable
name
which stores the employee's name - A private variable
salary
storing the employee's salary- Salaries range from 0 to 1,000,000 dollars
- A public variable
idNumber
storing the employee's ID number- Employee numbers are not sequential, so this field should allow any number up to 2^256-1
Constructor
When deploying the contract, utilize the constructor
to set:
shares
name
salary
idNumber
For the purposes of the test, you must deploy the contract with the following values:
shares
- 1000name
- Patsalary
- 50000idNumber
- 112358132134
View Salary and View Shares
Write a function called viewSalary
that returns the value in salary
.
Write a function called viewShares
that returns the value in shares
.
Grant Shares
Add a public function called grantShares
that increases the number of shares allocated to an employee by _newShares
. It should:
- Add the provided number of shares to the
shares
- If this would result in more than 5000 shares, revert with a custom error called
TooManyShares
that returns the number of shares the employee would have with the new amount added - If the number of
_newShares
is greater than 5000, revert with a string message, "Too many shares"
- If this would result in more than 5000 shares, revert with a custom error called
Check for Packing and Debug Reset Shares
Add the following function to your contract exactly as written below.
/**
* Do not modify this function. It is used to enable the unit test for this pin
* to check whether or not you have configured your storage variables to make
* use of packing.
*
* If you wish to cheat, simply modify this function to always return `0`
* I'm not your boss ¯\_(ツ)_/¯
*
* Fair warning though, if you do cheat, it will be on the blockchain having been
* deployed by your wallet....FOREVER!
*/
function checkForPacking(uint _slot) public view returns (uint r) {
assembly {
r := sload (_slot)
}
}
/**
* Warning: Anyone can use this function at any time!
*/
function debugResetShares() public {
shares = 1000;
}