Repository: rotki/rotki

Issue:
Add the COMBO token to the airdrops
## Abstract

Furucombo has launched a token and airdropped to their users and donors on January 15th. 
These tokens can be claimed periodically over a vesting period of 8 weeks.

## Motivation

The airdrop ranges with either 350 or 900 COMBO which at the time of writing it worth 560 and 1450 usd. It would be nice have a easy way to track these tokes so the user can claim them.
<!-- Why do you think this feature should be addressed. What is the value added to the users of Rotki and why would they want to have it implemented? -->

## Specification
Add the COMBO token to the airdrop section and update the balance of the COMBO tokens in each vesting cycle.
Each vesting cycle is at every friday for 8 weeks afaik.   
Idk how much will be distributed each cycle but those who had 350 where able to unlock 87.5 today.   

A list of eligible addresses can be found here:
https://docs.google.com/spreadsheets/d/113AiPrGJ-yp7g-Kdo_IofMWiftc7msEoBMmKNKxJ4fo/edit#gid=0
The announcement of the token airdrop can be found here: 
https://medium.com/furucombo/first-furucombo-grant-7b1e48175c99
<!-- If the feature is techical in nature please write as detailed as possible a specification of what needs to be built. -->



Discussion:

Resolving patch:
diff --git a/rotkehlchen/chain/ethereum/airdrops.py b/rotkehlchen/chain/ethereum/airdrops.py
--- a/rotkehlchen/chain/ethereum/airdrops.py
+++ b/rotkehlchen/chain/ethereum/airdrops.py
@@ -1,12 +1,14 @@
-from rotkehlchen.typing import ChecksumEthAddress
-from typing import List, Dict, TextIO, Iterator, Tuple
-from rotkehlchen.constants.assets import A_UNI, A_1INCH, A_TORN, A_CORN, A_GRAIN
 import csv
-import requests
-from pathlib import Path
 from collections import defaultdict
-from rotkehlchen.errors import RemoteError
+from pathlib import Path
+from typing import Dict, Iterator, List, TextIO, Tuple
+
+import requests
+
 from rotkehlchen.chain.ethereum.utils import token_normalized_value_decimals
+from rotkehlchen.constants.assets import A_1INCH, A_COMBO, A_CORN, A_GRAIN, A_LDO, A_TORN, A_UNI
+from rotkehlchen.errors import RemoteError
+from rotkehlchen.typing import ChecksumEthAddress
 
 AIRDROPS = {
     'uniswap': (
@@ -39,6 +41,18 @@
         A_GRAIN,
         'https://claim.harvest.finance/',
     ),
+    'furucombo': (
+        # is checksummed
+        'https://gist.githubusercontent.com/LefterisJP/69612e155e8063fd6b3422d4efbf22a3/raw/b9023960ab1c478ee2620c456e208e5124115c19/furucombo_airdrop.csv',  # noqa: E501
+        A_COMBO,
+        'https://furucombo.app/',
+    ),
+    'lido': (
+        # is checksummed
+        'https://gist.githubusercontent.com/LefterisJP/57a8d65280a482fed6f3e2cc00c0e540/raw/e6ebac56c438cc8a882585c5f5bfba64eb57c424/lido_airdrop.csv',  # noqa: E501
+        A_LDO,
+        'https://lido.fi/',
+    ),
 }
 
 
@@ -77,7 +91,7 @@ def check_airdrops(
         for addr, amount, *_ in data:
             # not doing to_checksum_address() here since the file addresses are checksummed
             # and doing to_checksum_address() so many times hits performance
-            if protocol_name in ('cornichon', 'tornado', 'grain'):
+            if protocol_name in ('cornichon', 'tornado', 'grain', 'lido'):
                 amount = token_normalized_value_decimals(int(amount), 18)
             if addr in addresses:
                 found_data[addr][protocol_name] = {
diff --git a/rotkehlchen/constants/assets.py b/rotkehlchen/constants/assets.py
--- a/rotkehlchen/constants/assets.py
+++ b/rotkehlchen/constants/assets.py
@@ -68,3 +68,5 @@
 A_TORN = EthereumToken('TORN')
 A_CORN = EthereumToken('CORN-2')
 A_GRAIN = EthereumToken('GRAIN')
+A_COMBO = EthereumToken('COMBO')
+A_LDO = EthereumToken('LDO')


Test patch:
diff --git a/rotkehlchen/tests/unit/test_assets.py b/rotkehlchen/tests/unit/test_assets.py
--- a/rotkehlchen/tests/unit/test_assets.py
+++ b/rotkehlchen/tests/unit/test_assets.py
@@ -283,7 +283,7 @@ def test_coingecko_identifiers_are_reachable(data_dir):
 def test_assets_json_meta():
     """Test that all_assets.json md5 matches and that if md5 changes since last
     time then version is also bumped"""
-    last_meta = {'md5': '7969237a9e90ff27d35c29e2ff2fe895', 'version': 47}
+    last_meta = {'md5': '9eae42f09c6c623aaa1e1907d32e6cfd', 'version': 47}
     data_dir = Path(__file__).resolve().parent.parent.parent / 'data'
     data_md5 = file_md5(data_dir / 'all_assets.json')