# Rewarding Uploaders¶

The system smart contract that implements the "lottery" mechanism.

An operation can be initiated by any account, but the network will only accept one attempt every 28 days.

## Pseudocode¶

```
# Find all premium pools where broadcasters pay for traffic
premiumPools = [ pool in system.premiumPools if
pool.broadcasterPaysForTraffic == True
]
# Find all broadcasters with non-empty reward pool
broadcasters = [ broadcaster in premiumPools if
broadcaster.uploadersRewardPool.amount > 0
and len(broadcaster.uploaders) > 0
]
for broadcaster in broadcasters:
# Make lots
lots = []
for uploader in broadcaster.uploaders:
# trafficAmount contains amount of uploaded traffic in megabytes
# Each uploaded gigabyte equals to one lot
numberOfLots = floor(uploader.trafficAmount / 1024)
for i in range(numberOfLots):
lots.append(uploader.account)
# Shuffle
shuffle(lots)
# win factor is stored in pool settings
winFactor = broadcaster.pool.settings.uploaderRewardWinFactor
# Number of winner is based on the win factor.
# For example, if win factor if 100, then each 100th lot is a winner.
numberOfWinners = floor(len(lots) / winFactor)
# If number of lots is less than win factor then one winner gets all reward
if numberOfWinners == 0:
numberOfWinners = 1
# Select winners
winners = []
for i in range(numberOfWinners):
winners.append(lots[i*winFactor])
# Reward pool is distributed equally among the winners
singleReward = broadcaster.uploadersRewardPool.amount / len(winners)
for winner in winners:
addTokens(winner, singleReward)
# reset uploaders
broadcaster.uploaders.clear()
# reset reward pool
broadcaster.uploadersRewardPool.reset()
```

## Description¶

- the smart contract finds all the premium pools where
`uploadersRewardPool`

option enabled - among all the broadcasters included in the found premium pools, the broadcasters with a non-empty reward pool (
`uploadersRewardPool`

) are selected. If the reward pool of a broadcaster is not empty, it means that the content of this broadcaster since the previous launch of the`Reward Uploaders`

smart contract has generated and paid for traffic- the following actions are performed for all found brodcasters
- an array of lots is generated based on the list of candidates (
`uploaders`

) and the winFactor (`winFactor`

) - The list of candidates is an array of public keys of nodes, which gave the traffic of the given broadcaster since the previous launch of the
`Reward Uploaders`

smart contract. For each node, the list stores the number of traffic units given away - win ratio is an integer number stored in the premium pool settings. It sets the ratio of the number of winners to the total number of lots
- each Gbyte of traffic uploaded (1024 Mb) is equal to one lot
- only candidates who have uploaded >= 1 Gb of traffic participate in the lottery
- number of lots for one candidate is unlimited
- the number of winners is determined based on the gaining coefficient (at the coefficient N every N-th element of the lots array is a winner)
- if the number of lots is less than the odds of winning, then one winner is selected
- the smart contract randomly chooses the necessary number of winners from the array of lots
- the content of the bounty pool is distributed equally among the winning lots
- after the drawing the reward pool and the list of candidates will be reset to zero

- an array of lots is generated based on the list of candidates (

- the following actions are performed for all found brodcasters

## Example¶

```
Suppose there is one brodcaster in the network that pays for traffic, and the account of this brodcaster at the time of launching the `Reward Uploaders` smart contract contains the following data:
- rewards pool: 1.1 XAT
- list of candidates who gave >= 1 GB of traffic:
- userA: uploaded 60 GB
- userB: uploaded 70 GB
- userC: uploaded 2 GB
- userD: uploaded 85 GB
Let the win rate be 100, then:
- total number of lots: `60 + 70 + 2 + 85 = 217`
- the number of winning lots: `floor(217 / 2) = 2`.
- winnings per lot: ` 1.1 / 2 = 0.55 XAT`.
The `Reward Uploaders` smart contract randomly selects 2 of the 217 lots and awards 0.55 XAT to the owners of those lots. If both winning lots belong to the same owner, they receives 1.1 XAT.
```