# Week 2
## Exercise 1
### CustomerPoints original contract
```pragma solidity^0.5.0;
contract CustomerPoints {
uint public numCustomers = 0;
uint public totalPoints = 1000000;
struct Customer {
uint customerId;
string name;
string country;
uint points;
}
mapping(uint => Customer) public customers;
constructor() public {
assignPoints('Elon Musk',1000,'Barbados');
}
function assignPoints(string memory _name, uint _amount, string memory _country) public {
totalPoints = totalPoints-_amount;
numCustomers++;
customers[numCustomers] = Customer(numCustomers, _name, _country, _amount);
}
function getCustomer(uint _index) view public returns(string memory, uint, string memory){
return (customers[_index].name, customers[_index].points, customers[_index].country);
}
function setCustomerCountry(uint _index, string memory _newCountry) public{
customers[_index].country = _newCountry;
}
function remainingPoints() view public returns (uint) {
return totalPoints;
}
}
```
### Modified assignPoints function
```
function assignPoints(string memory _name, uint _amount, string memory _country) public {
require(totalPoints > _amount,"Insufficient funds to allow transfer");
totalPoints = totalPoints-_amount;
numCustomers++;
customers[numCustomers] = Customer(numCustomers, _name, _country, _amount);
}
```
### Modified with revert, require, assert and conditions
```
function assignPoints(string memory _name, uint _amount, string memory _country) public {
bytes memory _nameBytes = bytes(_name);
require(_nameBytes.length > 5,"Name is too short");
require(totalPoints > _amount,"Insufficient funds to allow transfer");
if(totalPoints < _amount)
revert("Not enough points available.");
assert(totalPoints > _amount);
totalPoints = totalPoints-_amount;
numCustomers++;
customers[numCustomers] = Customer(numCustomers, _name, _country, _amount);
}
```