---
# System prepended metadata

title: Junior Solidity Test 2
tags: [tests]

---

###### tags: `tests`
# Junior Solidity Test 2

### Task 1 - Contract to save signed blockheaders
The purpose of this contract is to enable a fixed set of trusted validators to submit blockhashes from another blockchain.

1. the contract will hold a mapping of blockhash -> BlockData
2. a mapping of blockhash -> SignedBlock
3. contract will be initialized with a list of validators addresses
```
BlockHeader {
  parent_hash: bytes32
  timestamp: uint256,
  number: uint256,
  author: address,
  transactions_root: bytes32,
  uncles_hash: bytes32,
  extra_data: bytes,
  state_root: bytes32,
  receipts_root: bytes32,
  log_bloom: bytes,
  gas_used: uint256,
  gas_limit: uint256,
  difficulty: uint256,
  mixHash:bytes32,
  nonce:uint256
}

BlockData {
 header: BlockHeader,
 rlpHeader: bytes,
 blockHash: bytes32,
}

SignedBlock {
 signatures:bytes[],
 hasValidatorSigned: mapping<address> -> bool, //to prevent double signatures
}

```
2. add method `addSignedBlock(blockchainid,blockheader,blockhash,signature) onlyValidator`
- onlyValidator modifier check that msg sender is in approved list of validators
- if blockhash doesnt exists yet, create the block rlpHeader from blockheader and verify hash(rlpHeader) = blockhash
- verify signature is of the blockhash and by the msg.sender
- verify msg.sender didnt already submit this block 
- update blockhash -> SignedBlock
- update blockhash -> BlockData
3. write a unit test for the above method using hardhat/waffle


### Task 2 - “thegraph” Integration
1. write a subgraph that process Stake and StakeWithdraw events from these contracts
- https://kovan.etherscan.io/address/0x97336539bF2ab85ED83e63f294af113A7A110Cd3#code
https://github.com/GoodDollar/GoodProtocol/blob/master/contracts/staking/aave/GoodAaveStaking.sol
 - https://kovan.etherscan.io/address/0xbc371c5c98d40de18382e3e0eeb58805d76d3d50#code
https://github.com/GoodDollar/GoodProtocol/blob/master/contracts/staking/compound/GoodCompoundStaking.sol
2. subgraph should have two entities. User and StakeAction
```
User(id:address)
{
 actions: StakeActions[]
}
StakeAction(id: txhash)
{
 action: stake|unstake
 value: number
}
```