# Subgraph Schema
## Product / Business Goals
* Track when a user is created
* Track who has claimed tokens on per Epoch basis
* Track how many tokens have been claimed
* Track when those tokens were claimed
* Save the default wallet of a user
* Track prior preferred wallets of a user
* Track the current preferred wallet of a user
* Track when a user stakes
* Track when a user unstakes
A major business goal is to be able to easily query that a user has staked at the beginning of an epoch (we just need unix timestamp or block) and how much they kept staked for that entire epoch.
## Contract Events
```
//CommonsEasyStake.sol
event Stake(address staker, uint256 amountStaked, uint256 totalStaked);
event unStake(address unstaker, uint256 amountUnstaked, uint256 totalStaked);
// CommonsWhitelist.sol
event AddedToWhitelist(address indexed account, bool employee);
event MassAdd(address[] indexed accounts, bool[] memberTypes);
event RemovedFromWhitelist(address indexed account);
event UpdatedWhitelistAddress(address indexed opolisWallet, address indexed prefWallet);
// MerkleRedeem.sol
event Claimed(address _claimant, uint256 _balance);
// Add epoch to event
event RootAdded(uint256 epoch, uint256 _totalAllocation);
```
## Schemas
* User
* Address defaultWallet
* Address prefWallet
* Address[] pastWallets
* Bool employeeType
* Bool isWhitelisted
* Block.timestamp createdAt
* BigInt stakedBalance
* Claims
* Stakes
* Unstakes
* Claim
* User
* Address claimedFrom
* BigInt epoch
* BigInt Amt
* Stake
* User
* Address stakedFrom
* BigInt Amt
* Block.timestamp stakedAt
* Unstake
* User
* Address stakedFrom
* BigInt Amt
* Block.timestamp unstakedAt