mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-16 17:42:02 +00:00
common/tools: allow tokens to collide with nontokens
if explicitly supported in support.json
This reverts commit 7cf22c5227
.
This commit is contained in:
parent
fe3d67e259
commit
6bd5345021
@ -4,8 +4,5 @@
|
|||||||
"erc20:eth:LINK Platform": true,
|
"erc20:eth:LINK Platform": true,
|
||||||
"erc20:eth:NXX": false,
|
"erc20:eth:NXX": false,
|
||||||
"erc20:eth:Hdp": true,
|
"erc20:eth:Hdp": true,
|
||||||
"erc20:eth:Hdp.ф": true,
|
"erc20:eth:Hdp.ф": true
|
||||||
"erc20:eth:USDT": false,
|
|
||||||
"erc20:eth:BNB": false,
|
|
||||||
"erc20:eth:QTUM": false
|
|
||||||
}
|
}
|
||||||
|
@ -289,6 +289,7 @@
|
|||||||
"erc20:eth:BRD": "1.6.2",
|
"erc20:eth:BRD": "1.6.2",
|
||||||
"erc20:eth:BRLN": "1.8.0",
|
"erc20:eth:BRLN": "1.8.0",
|
||||||
"erc20:eth:BSDC": "1.6.2",
|
"erc20:eth:BSDC": "1.6.2",
|
||||||
|
"erc20:eth:BST": "1.6.2",
|
||||||
"erc20:eth:BTCA": "1.8.0",
|
"erc20:eth:BTCA": "1.8.0",
|
||||||
"erc20:eth:BTCE": "1.6.2",
|
"erc20:eth:BTCE": "1.6.2",
|
||||||
"erc20:eth:BTCL": "1.6.2",
|
"erc20:eth:BTCL": "1.6.2",
|
||||||
@ -1285,7 +1286,6 @@
|
|||||||
"erc20:eth:BNC:ef51": "(AUTO) duplicate key",
|
"erc20:eth:BNC:ef51": "(AUTO) duplicate key",
|
||||||
"erc20:eth:BOX:63f5": "(AUTO) duplicate key",
|
"erc20:eth:BOX:63f5": "(AUTO) duplicate key",
|
||||||
"erc20:eth:BOX:e1a1": "(AUTO) duplicate key",
|
"erc20:eth:BOX:e1a1": "(AUTO) duplicate key",
|
||||||
"erc20:eth:BST": "(AUTO) duplicate key",
|
|
||||||
"erc20:eth:BTL (Battle)": "(AUTO) duplicate key",
|
"erc20:eth:BTL (Battle)": "(AUTO) duplicate key",
|
||||||
"erc20:eth:BTL (Bitlle)": "(AUTO) duplicate key",
|
"erc20:eth:BTL (Bitlle)": "(AUTO) duplicate key",
|
||||||
"erc20:eth:BTR:499a": "(AUTO) duplicate key",
|
"erc20:eth:BTR:499a": "(AUTO) duplicate key",
|
||||||
@ -1637,6 +1637,7 @@
|
|||||||
"erc20:eth:BRD": "2.0.7",
|
"erc20:eth:BRD": "2.0.7",
|
||||||
"erc20:eth:BRLN": "2.0.10",
|
"erc20:eth:BRLN": "2.0.10",
|
||||||
"erc20:eth:BSDC": "2.0.7",
|
"erc20:eth:BSDC": "2.0.7",
|
||||||
|
"erc20:eth:BST": "2.0.7",
|
||||||
"erc20:eth:BTCA": "2.0.10",
|
"erc20:eth:BTCA": "2.0.10",
|
||||||
"erc20:eth:BTCE": "2.0.7",
|
"erc20:eth:BTCE": "2.0.7",
|
||||||
"erc20:eth:BTCL": "2.0.7",
|
"erc20:eth:BTCL": "2.0.7",
|
||||||
@ -2636,7 +2637,6 @@
|
|||||||
"erc20:eth:BNC:ef51": "(AUTO) duplicate key",
|
"erc20:eth:BNC:ef51": "(AUTO) duplicate key",
|
||||||
"erc20:eth:BOX:63f5": "(AUTO) duplicate key",
|
"erc20:eth:BOX:63f5": "(AUTO) duplicate key",
|
||||||
"erc20:eth:BOX:e1a1": "(AUTO) duplicate key",
|
"erc20:eth:BOX:e1a1": "(AUTO) duplicate key",
|
||||||
"erc20:eth:BST": "(AUTO) duplicate key",
|
|
||||||
"erc20:eth:BTL (Battle)": "(AUTO) duplicate key",
|
"erc20:eth:BTL (Battle)": "(AUTO) duplicate key",
|
||||||
"erc20:eth:BTL (Bitlle)": "(AUTO) duplicate key",
|
"erc20:eth:BTL (Bitlle)": "(AUTO) duplicate key",
|
||||||
"erc20:eth:BTR:499a": "(AUTO) duplicate key",
|
"erc20:eth:BTR:499a": "(AUTO) duplicate key",
|
||||||
|
@ -304,16 +304,18 @@ def support_info_single(support_data, coin):
|
|||||||
key = coin["key"]
|
key = coin["key"]
|
||||||
dup = coin.get("duplicate")
|
dup = coin.get("duplicate")
|
||||||
for device, values in support_data.items():
|
for device, values in support_data.items():
|
||||||
if dup and is_token(coin):
|
if key in values["unsupported"]:
|
||||||
support_value = False
|
|
||||||
elif key in values["unsupported"]:
|
|
||||||
support_value = False
|
support_value = False
|
||||||
elif key in values["supported"]:
|
elif key in values["supported"]:
|
||||||
support_value = values["supported"][key]
|
support_value = values["supported"][key]
|
||||||
elif device in MISSING_SUPPORT_MEANS_NO:
|
elif device in MISSING_SUPPORT_MEANS_NO:
|
||||||
support_value = False
|
support_value = False
|
||||||
elif is_token(coin):
|
elif is_token(coin):
|
||||||
# tokens are implicitly supported in next release
|
if dup:
|
||||||
|
# if duplicate token that is not explicitly listed, it's unsupported
|
||||||
|
support_value = False
|
||||||
|
else:
|
||||||
|
# otherwise implicitly supported in next
|
||||||
support_value = "soon"
|
support_value = "soon"
|
||||||
else:
|
else:
|
||||||
support_value = None
|
support_value = None
|
||||||
@ -409,7 +411,7 @@ def deduplicate_erc20(buckets, networks):
|
|||||||
This function works on results of `mark_duplicate_shortcuts`.
|
This function works on results of `mark_duplicate_shortcuts`.
|
||||||
|
|
||||||
Buckets that contain at least one non-token are ignored - symbol collisions
|
Buckets that contain at least one non-token are ignored - symbol collisions
|
||||||
with non-tokens are always fatal.
|
with non-tokens always apply.
|
||||||
|
|
||||||
Otherwise the following rules are applied:
|
Otherwise the following rules are applied:
|
||||||
|
|
||||||
@ -502,8 +504,6 @@ def collect_coin_info():
|
|||||||
`erc20` for ERC20 tokens,
|
`erc20` for ERC20 tokens,
|
||||||
`nem` for NEM mosaics,
|
`nem` for NEM mosaics,
|
||||||
`misc` for other networks.
|
`misc` for other networks.
|
||||||
|
|
||||||
Automatically removes duplicate symbols from the result.
|
|
||||||
"""
|
"""
|
||||||
all_coins = CoinsInfo(
|
all_coins = CoinsInfo(
|
||||||
bitcoin=_load_btc_coins(),
|
bitcoin=_load_btc_coins(),
|
||||||
@ -548,13 +548,14 @@ def coin_info_with_duplicates():
|
|||||||
|
|
||||||
|
|
||||||
def coin_info():
|
def coin_info():
|
||||||
"""Collects coin info, marks and prunes duplicate ERC20 symbols, fills out support
|
"""Collects coin info, fills out support info and returns the result.
|
||||||
info and returns the result.
|
|
||||||
|
Does not auto-delete duplicates. This should now be based on support info.
|
||||||
"""
|
"""
|
||||||
all_coins, _ = coin_info_with_duplicates()
|
all_coins, _ = coin_info_with_duplicates()
|
||||||
all_coins["erc20"] = [
|
# all_coins["erc20"] = [
|
||||||
coin for coin in all_coins["erc20"] if not coin.get("duplicate")
|
# coin for coin in all_coins["erc20"] if not coin.get("duplicate")
|
||||||
]
|
# ]
|
||||||
return all_coins
|
return all_coins
|
||||||
|
|
||||||
|
|
||||||
|
@ -145,6 +145,13 @@ def render_file(src, dst, coins, support_info):
|
|||||||
# ====== validation functions ======
|
# ====== validation functions ======
|
||||||
|
|
||||||
|
|
||||||
|
def mark_unsupported(support_info, coins):
|
||||||
|
for coin in coins:
|
||||||
|
key = coin["key"]
|
||||||
|
# checking for explicit False because None means unknown
|
||||||
|
coin["unsupported"] = all(v is False for v in support_info[key].values())
|
||||||
|
|
||||||
|
|
||||||
def highlight_key(coin, color):
|
def highlight_key(coin, color):
|
||||||
"""Return a colorful string where the SYMBOL part is bold."""
|
"""Return a colorful string where the SYMBOL part is bold."""
|
||||||
keylist = coin["key"].split(":")
|
keylist = coin["key"].split(":")
|
||||||
@ -193,7 +200,6 @@ def check_eth(coins):
|
|||||||
|
|
||||||
def check_btc(coins):
|
def check_btc(coins):
|
||||||
check_passed = True
|
check_passed = True
|
||||||
support_infos = coin_info.support_info(coins)
|
|
||||||
|
|
||||||
# validate individual coin data
|
# validate individual coin data
|
||||||
for coin in coins:
|
for coin in coins:
|
||||||
@ -213,7 +219,7 @@ def check_btc(coins):
|
|||||||
color = "green"
|
color = "green"
|
||||||
elif name == "Bitcoin":
|
elif name == "Bitcoin":
|
||||||
color = "red"
|
color = "red"
|
||||||
elif coin.get("unsupported"):
|
elif coin["unsupported"]:
|
||||||
color = "grey"
|
color = "grey"
|
||||||
prefix = crayon("blue", "(X)", bold=True)
|
prefix = crayon("blue", "(X)", bold=True)
|
||||||
else:
|
else:
|
||||||
@ -239,15 +245,9 @@ def check_btc(coins):
|
|||||||
and not c["name"].endswith("Regtest")
|
and not c["name"].endswith("Regtest")
|
||||||
]
|
]
|
||||||
|
|
||||||
have_bitcoin = False
|
have_bitcoin = any(coin["name"] == "Bitcoin" for coin in mainnets)
|
||||||
for coin in mainnets:
|
supported_mainnets = [c for c in mainnets if not c["unsupported"]]
|
||||||
if coin["name"] == "Bitcoin":
|
supported_networks = [c for c in bucket if not c["unsupported"]]
|
||||||
have_bitcoin = True
|
|
||||||
if all(v is False for k, v in support_infos[coin["key"]].items()):
|
|
||||||
coin["unsupported"] = True
|
|
||||||
|
|
||||||
supported_mainnets = [c for c in mainnets if not c.get("unsupported")]
|
|
||||||
supported_networks = [c for c in bucket if not c.get("unsupported")]
|
|
||||||
|
|
||||||
if len(mainnets) > 1:
|
if len(mainnets) > 1:
|
||||||
if (have_bitcoin or strict) and len(supported_networks) > 1:
|
if (have_bitcoin or strict) and len(supported_networks) > 1:
|
||||||
@ -290,7 +290,7 @@ def check_btc(coins):
|
|||||||
return check_passed
|
return check_passed
|
||||||
|
|
||||||
|
|
||||||
def check_dups(buckets, print_at_level=logging.ERROR):
|
def check_dups(buckets, print_at_level=logging.WARNING):
|
||||||
"""Analyze and pretty-print results of `coin_info.mark_duplicate_shortcuts`.
|
"""Analyze and pretty-print results of `coin_info.mark_duplicate_shortcuts`.
|
||||||
|
|
||||||
`print_at_level` can be one of logging levels.
|
`print_at_level` can be one of logging levels.
|
||||||
@ -305,15 +305,19 @@ def check_dups(buckets, print_at_level=logging.ERROR):
|
|||||||
"""Colorize coins. Tokens are cyan, nontokens are red. Coins that are NOT
|
"""Colorize coins. Tokens are cyan, nontokens are red. Coins that are NOT
|
||||||
marked duplicate get a green asterisk.
|
marked duplicate get a green asterisk.
|
||||||
"""
|
"""
|
||||||
if coin_info.is_token(coin):
|
prefix = ""
|
||||||
|
if coin["unsupported"]:
|
||||||
|
color = "grey"
|
||||||
|
prefix = crayon("blue", "(X)", bold=True)
|
||||||
|
elif coin_info.is_token(coin):
|
||||||
color = "cyan"
|
color = "cyan"
|
||||||
else:
|
else:
|
||||||
color = "red"
|
color = "red"
|
||||||
highlighted = highlight_key(coin, color)
|
|
||||||
if not coin.get("duplicate"):
|
if not coin.get("duplicate"):
|
||||||
prefix = crayon("green", "*", bold=True)
|
prefix = crayon("green", "*", bold=True) + prefix
|
||||||
else:
|
|
||||||
prefix = ""
|
highlighted = highlight_key(coin, color)
|
||||||
return "{}{}".format(prefix, highlighted)
|
return "{}{}".format(prefix, highlighted)
|
||||||
|
|
||||||
check_passed = True
|
check_passed = True
|
||||||
@ -323,17 +327,29 @@ def check_dups(buckets, print_at_level=logging.ERROR):
|
|||||||
if not bucket:
|
if not bucket:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
supported = [coin for coin in bucket if not coin["unsupported"]]
|
||||||
nontokens = [coin for coin in bucket if not coin_info.is_token(coin)]
|
nontokens = [coin for coin in bucket if not coin_info.is_token(coin)]
|
||||||
|
cleared = not any(coin.get("duplicate") for coin in bucket)
|
||||||
|
|
||||||
# string generation
|
# string generation
|
||||||
dup_str = ", ".join(coin_str(coin) for coin in bucket)
|
dup_str = ", ".join(coin_str(coin) for coin in bucket)
|
||||||
if not nontokens:
|
if len(nontokens) > 1:
|
||||||
level = logging.DEBUG
|
# Two or more colliding nontokens. This is always fatal.
|
||||||
elif len(nontokens) == 1:
|
# XXX consider allowing two nontokens as long as only one is supported?
|
||||||
level = logging.INFO
|
|
||||||
else:
|
|
||||||
level = logging.ERROR
|
level = logging.ERROR
|
||||||
check_passed = False
|
check_passed = False
|
||||||
|
elif len(supported) > 1:
|
||||||
|
# more than one supported coin in bucket
|
||||||
|
if cleared:
|
||||||
|
# some previous step has explicitly marked them as non-duplicate
|
||||||
|
level = logging.INFO
|
||||||
|
else:
|
||||||
|
# at most 1 non-token - we tenatively allow token collisions
|
||||||
|
# when explicitly marked as supported
|
||||||
|
level = logging.WARNING
|
||||||
|
else:
|
||||||
|
# At most 1 supported coin, at most 1 non-token. This is informational only.
|
||||||
|
level = logging.DEBUG
|
||||||
|
|
||||||
# deciding whether to print
|
# deciding whether to print
|
||||||
if level < print_at_level:
|
if level < print_at_level:
|
||||||
@ -342,7 +358,7 @@ def check_dups(buckets, print_at_level=logging.ERROR):
|
|||||||
if symbol == "_override":
|
if symbol == "_override":
|
||||||
print_log(level, "force-set duplicates:", dup_str)
|
print_log(level, "force-set duplicates:", dup_str)
|
||||||
else:
|
else:
|
||||||
print_log(level, "duplicate symbol {}:".format(symbol), dup_str)
|
print_log(level, "duplicate symbol {}:".format(symbol.upper()), dup_str)
|
||||||
|
|
||||||
return check_passed
|
return check_passed
|
||||||
|
|
||||||
@ -571,6 +587,8 @@ def check(backend, icons, show_duplicates):
|
|||||||
raise click.ClickException("Missing requirements for icon check")
|
raise click.ClickException("Missing requirements for icon check")
|
||||||
|
|
||||||
defs, buckets = coin_info.coin_info_with_duplicates()
|
defs, buckets = coin_info.coin_info_with_duplicates()
|
||||||
|
support_info = coin_info.support_info(defs)
|
||||||
|
mark_unsupported(support_info, defs.as_list())
|
||||||
all_checks_passed = True
|
all_checks_passed = True
|
||||||
|
|
||||||
print("Checking BTC-like coins...")
|
print("Checking BTC-like coins...")
|
||||||
@ -586,7 +604,7 @@ def check(backend, icons, show_duplicates):
|
|||||||
elif show_duplicates == "nontoken":
|
elif show_duplicates == "nontoken":
|
||||||
dup_level = logging.INFO
|
dup_level = logging.INFO
|
||||||
else:
|
else:
|
||||||
dup_level = logging.ERROR
|
dup_level = logging.WARNING
|
||||||
print("Checking unexpected duplicates...")
|
print("Checking unexpected duplicates...")
|
||||||
if not check_dups(buckets, dup_level):
|
if not check_dups(buckets, dup_level):
|
||||||
all_checks_passed = False
|
all_checks_passed = False
|
||||||
|
@ -72,10 +72,6 @@ def print_support(coin):
|
|||||||
key, name, shortcut = coin["key"], coin["name"], coin["shortcut"]
|
key, name, shortcut = coin["key"], coin["name"], coin["shortcut"]
|
||||||
print(f"{key} - {name} ({shortcut})")
|
print(f"{key} - {name} ({shortcut})")
|
||||||
if coin.get("duplicate"):
|
if coin.get("duplicate"):
|
||||||
if coin_info.is_token(coin):
|
|
||||||
print(" * DUPLICATE SYMBOL (no support)")
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
print(" * DUPLICATE SYMBOL")
|
print(" * DUPLICATE SYMBOL")
|
||||||
for dev, where in SUPPORT_INFO.items():
|
for dev, where in SUPPORT_INFO.items():
|
||||||
missing_means_no = dev in coin_info.MISSING_SUPPORT_MEANS_NO
|
missing_means_no = dev in coin_info.MISSING_SUPPORT_MEANS_NO
|
||||||
@ -131,8 +127,6 @@ def find_unsupported_coins(coins_dict):
|
|||||||
|
|
||||||
result[device] = []
|
result[device] = []
|
||||||
for key, coin in coins_dict.items():
|
for key, coin in coins_dict.items():
|
||||||
if coin.get("duplicate") and coin_info.is_token(coin):
|
|
||||||
continue
|
|
||||||
if key not in support_set:
|
if key not in support_set:
|
||||||
result[device].append(coin)
|
result[device].append(coin)
|
||||||
|
|
||||||
@ -466,12 +460,6 @@ def set_support_value(key, entries, reason):
|
|||||||
(or null, in case of trezor1/2)
|
(or null, in case of trezor1/2)
|
||||||
Setting variable to empty ("trezor1=") will set to null, or clear the entry.
|
Setting variable to empty ("trezor1=") will set to null, or clear the entry.
|
||||||
Setting to "soon", "planned", "2.1.1" etc. will set the literal string.
|
Setting to "soon", "planned", "2.1.1" etc. will set the literal string.
|
||||||
|
|
||||||
Entries that are always present:
|
|
||||||
trezor1 trezor2 webwallet connect
|
|
||||||
|
|
||||||
Entries with other names will be inserted into "others". This is a good place
|
|
||||||
to store links to 3rd party software, such as Electrum forks or claim tools.
|
|
||||||
"""
|
"""
|
||||||
defs, _ = coin_info.coin_info_with_duplicates()
|
defs, _ = coin_info.coin_info_with_duplicates()
|
||||||
coins = defs.as_dict()
|
coins = defs.as_dict()
|
||||||
@ -483,7 +471,6 @@ def set_support_value(key, entries, reason):
|
|||||||
if coins[key].get("duplicate") and coin_info.is_token(coins[key]):
|
if coins[key].get("duplicate") and coin_info.is_token(coins[key]):
|
||||||
shortcut = coins[key]["shortcut"]
|
shortcut = coins[key]["shortcut"]
|
||||||
click.echo(f"Note: shortcut {shortcut} is a duplicate.")
|
click.echo(f"Note: shortcut {shortcut} is a duplicate.")
|
||||||
click.echo(f"Coin will NOT be listed regardless of support.json status.")
|
|
||||||
|
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
try:
|
try:
|
||||||
|
Loading…
Reference in New Issue
Block a user