diff --git a/tests/test_airdrops.py b/tests/test_airdrops.py index 94e4810..c101038 100644 --- a/tests/test_airdrops.py +++ b/tests/test_airdrops.py @@ -4,8 +4,7 @@ import polars import pytest import requests -from decimal import Decimal -from eth_utils import is_checksum_address +from eth_utils import to_checksum_address from jsonschema import validate from typing import Final @@ -42,12 +41,22 @@ def test_files_and_jsons(): if 'file_hash' in airdrop: with open(airdrop['file_path'], 'br') as f: assert airdrop['file_hash'] == hashlib.sha256(f.read()).hexdigest(), f'Invalid hash for {airdrop["file_path"]}' - df = polars.read_parquet(airdrop['file_path']) - assert df.columns[:2] == ['address', 'amount'], f'{airdrop["file_path"]} does not have address and amount columns' - assert len(df.rows()) > 0, f'{airdrop["file_path"]} is empty' - for i, (address, amount) in enumerate(df.select(polars.selectors.by_index(0, 1)).rows()): - assert is_checksum_address(address), f'{airdrop["file_path"]} address {address} is not checksummed at row {i+1}' - assert Decimal(amount) > 0, f'{airdrop["file_path"]} amount {amount} is negative at row {i+1}' + file_schema = polars.read_parquet_schema(airdrop['file_path']) + assert list(file_schema.keys())[:2] == ['address', 'amount'], f'{airdrop["file_path"]} does not have address and amount columns' + + df = polars.read_parquet(airdrop['file_path'], columns=['address', 'amount']) + assert df.height > 0, f'{airdrop["file_path"]} is empty' + + invalid_amounts = df.select( + ( + polars.col('amount').cast(polars.Float64, strict=False).is_null() | + (polars.col('amount').cast(polars.Float64, strict=False) <= 0) + ).sum() + ).item() + assert invalid_amounts == 0, f'{airdrop["file_path"]} has invalid non-positive amounts' + + for i, address in enumerate(df.get_column('address')): + assert to_checksum_address(address.lower()) == address, f'{airdrop["file_path"]} address {address} is not checksummed at row {i+1}' else: assert TEST_ADDR in airdrop['api_url'].format(address=TEST_ADDR) # check that the format variable is in the url assert 'amount_path' in airdrop diff --git a/updates/info.json b/updates/info.json index 9d317c9..762dd91 100644 --- a/updates/info.json +++ b/updates/info.json @@ -1 +1 @@ -{"spam_assets":{"latest":6},"rpc_nodes":{"latest":11,"limits":{"9":{"min_version":"1.39.0"},"10":{"min_version":"1.41.0"},"11":{"min_version":"1.43.0"}}},"contracts":{"latest":0},"global_addressbook":{"latest":0},"accounting_rules":{"latest":10,"limits":{"4":{"min_version":"1.35.0"},"5":{"min_version":"1.38.0"},"8":{"min_version":"1.41.3"},"9":{"min_version":"1.42.0"},"10":{"min_version":"1.42.1"}}},"location_asset_mappings":{"latest":13,"limits":{"9":{"min_version":"1.38.0"},"10":{"min_version":"1.39.0"},"11":{"min_version":"1.40.0"}}},"counterparty_asset_mappings":{"latest":1},"location_unsupported_assets":{"latest":4,"limits":{"2":{"min_version":"1.38.0"}}}} \ No newline at end of file +{"spam_assets":{"latest":6},"rpc_nodes":{"latest":11,"limits":{"9":{"min_version":"1.39.0"},"10":{"min_version":"1.41.0"},"11":{"min_version":"1.43.0"}}},"contracts":{"latest":0},"global_addressbook":{"latest":0},"accounting_rules":{"latest":10,"limits":{"4":{"min_version":"1.35.0"},"5":{"min_version":"1.38.0"},"8":{"min_version":"1.41.3"},"9":{"min_version":"1.42.0"},"10":{"min_version":"1.42.1"}}},"location_asset_mappings":{"latest":14,"limits":{"9":{"min_version":"1.38.0"},"10":{"min_version":"1.39.0"},"11":{"min_version":"1.40.0"}}},"counterparty_asset_mappings":{"latest":1},"location_unsupported_assets":{"latest":4,"limits":{"2":{"min_version":"1.38.0"}}}} \ No newline at end of file diff --git a/updates/location_asset_mappings/v14.json b/updates/location_asset_mappings/v14.json new file mode 100644 index 0000000..92d729d --- /dev/null +++ b/updates/location_asset_mappings/v14.json @@ -0,0 +1,141 @@ +{ + "location_asset_mappings": { + "additions": [ + { + "asset": "eip155:1/erc20:0x8e4cbbcc33db6c0a18561fde1f6ba35906d4848b", + "location": "kraken", + "location_symbol": "MEZO" + }, + { + "asset": "eip155:1/erc20:0x2aeabde1ab736c59e9a19bed67681869eef39526", + "location": "kraken", + "location_symbol": "DOVU" + }, + { + "asset": "MANTRA", + "location": "kraken", + "location_symbol": "MANTRA" + }, + { + "asset": "PACT", + "location": "kraken", + "location_symbol": "PACT" + }, + { + "asset": "PACK", + "location": "kraken", + "location_symbol": "PACK" + }, + { + "asset": "SHAPE", + "location": "kraken", + "location_symbol": "SHAPE" + }, + { + "asset": "eip155:1/erc20:0x4f2b33840227DDD0e28da8d4185D6fa07ADfed87", + "location": null, + "location_symbol": "BASED" + }, + { + "asset": "eip155:56/erc20:0x7977BF3e7e0c954D12cdcA3E013ADAf57E0B06E0", + "location": null, + "location_symbol": "OPN" + }, + { + "asset": "eip155:56/erc20:0x000008D2175F9AEAdDb2430c26f8A6f73c5A0000", + "location": "kraken", + "location_symbol": "UNITAS" + }, + { + "asset": "eip155:42161/erc20:0x68731d6f14b827bbcffbebb62b19daa18de1d79c", + "location": "kraken", + "location_symbol": "IDOS" + }, + { + "asset": "QUAI", + "location": "kraken", + "location_symbol": "QUAI" + }, + { + "asset": "eip155:1/erc20:0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a", + "location": "kraken", + "location_symbol": "APYUSD" + }, + { + "asset": "eip155:1/erc20:0x6af487beb661ccecd1d045e9561a0dac9aa5c7db", + "location": "kraken", + "location_symbol": "DUAL" + }, + { + "asset": "eip155:1/erc20:0x32b4d049fe4c888d2b92eecaf729f44df6b1f36e", + "location": null, + "location_symbol": "ROBO" + }, + { + "asset": "BONZO", + "location": "kraken", + "location_symbol": "BONZO" + }, + { + "asset": "eip155:8453/erc20:0xa4ff56ef7ef4a2cad03cfa130208c9bc1b45d293", + "location": "kraken", + "location_symbol": "SAUCE" + }, + { + "asset": "eip155:1/erc20:0x8e4cbbcc33db6c0a18561fde1f6ba35906d4848b", + "location": "coinbase", + "location_symbol": "MEZO" + }, + { + "asset": "eip155:1/erc20:0x9cb7a4ef0cae65b07362bc679a0b874041e3da53", + "location": "okx", + "location_symbol": "OFC" + }, + { + "asset": "MANTRA", + "location": "binance", + "location_symbol": "MANTRA" + }, + { + "asset": "eip155:1/erc20:0x32b4d049fe4c888d2b92eecaf729f44df6b1f36e", + "location": "binance", + "location_symbol": "ROBO" + }, + { + "asset": "eip155:1/erc20:0x68749665FF8D2d112Fa859AA293F07A622782F38", + "location": "binance", + "location_symbol": "XAUT" + }, + { + "asset": "eip155:1/erc20:0xfCCD6fBCa272B4cc11069402F4123b070B7838F9", + "location": "poloniex", + "location_symbol": "KIMCHI" + }, + { + "asset": "solana/token:kLqMvUm1p4pRbxU4r8kWCTVAuWMJLtcTJqGb4b5pump", + "location": "poloniex", + "location_symbol": "BRENT" + }, + { + "asset": "solana/token:CpP36fvZmbcDUH9tQihQZTcvH2ApwRzHh2pPojyWpump", + "location": "poloniex", + "location_symbol": "DAPANG" + }, + { + "asset": "eip155:1/erc20:0xdC035D45d973E3EC169d2276DDab16f1e407384F", + "location": "poloniex", + "location_symbol": "USDS" + }, + { + "asset": "solana/token:4fSWEw2wbYEUCcMtitzmeGUfqinoafXxkhqZrA9Gpump", + "location": "poloniex", + "location_symbol": "PIGEON" + }, + { + "asset": "eip155:56/erc20:0x3e17ee3B1895dD1A7CF993A89769C5e029584444", + "location": "poloniex", + "location_symbol": "FREEDOMOFMONEY" + } + ] + } +} \ No newline at end of file