Skip to content
This repository was archived by the owner on Jun 27, 2022. It is now read-only.

Commit 52a8a63

Browse files
committed
LL-7902 add polygon tokens
1 parent 7cd9195 commit 52a8a63

File tree

9 files changed

+418
-5
lines changed

9 files changed

+418
-5
lines changed

packages/cryptoassets/data/erc20-signatures.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/cryptoassets/data/erc20.js

Lines changed: 15 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/cryptoassets/data/exchange/erc20.js

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/cryptoassets/data/polygon-erc20.js

Lines changed: 216 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/cryptoassets/src/__snapshots__/currencies.test.ts.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ exports[`all USDT are countervalue enabled 1`] = `
44
Array [
55
"algorand/asa/312769",
66
"ethereum/erc20/usd_tether__erc20_",
7+
"polygon/erc20/(pos)_tether_usd",
78
"tron/trc20/TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
89
]
910
`;

packages/cryptoassets/src/currencies.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1877,7 +1877,7 @@ const cryptocurrenciesById: Record<string, CryptoCurrency> = {
18771877
managerAppName: "Polygon",
18781878
ticker: "MATIC",
18791879
scheme: "polygon",
1880-
color: "#F0B90A",
1880+
color: "#6d29de",
18811881
family: "ethereum",
18821882
ethereumLikeInfo: {
18831883
baseChain: "mainnet",

packages/cryptoassets/src/tokens.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import erc20tokens from "../data/erc20";
44
import trc10tokens from "../data/trc10";
55
import trc20tokens from "../data/trc20";
66
import bep20tokens from "../data/bep20";
7+
import polygonTokens from "../data/polygon-erc20";
78
import asatokens from "../data/asa";
89
const emptyArray = [];
910
const tokensArray: TokenCurrency[] = [];
@@ -15,6 +16,7 @@ const tokensByTicker: Record<string, TokenCurrency> = {};
1516
const tokensByAddress: Record<string, TokenCurrency> = {};
1617
const tokensByCurrencyAddress: Record<string, TokenCurrency> = {};
1718
addTokens(erc20tokens.map(convertERC20));
19+
addTokens(polygonTokens.map(convertERC20));
1820
addTokens(trc10tokens.map(convertTRONTokens("trc10")));
1921
addTokens(trc20tokens.map(convertTRONTokens("trc20")));
2022
addTokens(bep20tokens.map(convertBEP20));
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
const invariant = require("invariant");
2+
const path = require("path");
3+
const { readFileJSON } = require("../utils");
4+
const {
5+
findFiatCurrencyByTicker,
6+
} = require("../../../packages/cryptoassets/lib/fiats");
7+
8+
// TODO in future: if we have diff network for bnb we would have to change
9+
const inferParentCurrency = () => "polygon";
10+
11+
const withoutExtraComma = (str) => {
12+
const m = str.match(/,+$/);
13+
if (!m) return str;
14+
return str.slice(0, str.length - m[0].length);
15+
};
16+
17+
const WARN_IF_COUNTERVALUES = true;
18+
19+
const lenseTicker = (a) => a[9] || a[2];
20+
21+
module.exports = {
22+
// FIXME not yet sure if it's our final path
23+
paths: ["tokens/polygon/erc20"],
24+
output: "data/polygon-erc20.js",
25+
26+
validate: (everything, countervaluesTickers) =>
27+
["polygon"].flatMap((cid) => {
28+
const all = everything.filter((a) => a[0] === cid);
29+
const fiatCollisions = all.filter(
30+
(a) =>
31+
findFiatCurrencyByTicker(lenseTicker(a)) &&
32+
!a[7] &&
33+
(WARN_IF_COUNTERVALUES
34+
? countervaluesTickers.includes(lenseTicker(a))
35+
: true)
36+
);
37+
const contractGroup = {};
38+
all.forEach((a) => {
39+
const matches = all.filter((b) => a[6] && b[6] && a[6] === b[6]);
40+
if (matches.length > 1 && !contractGroup[a[6]]) {
41+
contractGroup[a[6]] = matches;
42+
}
43+
});
44+
const groups = {};
45+
all.forEach((a) => {
46+
if (a[7]) return;
47+
groups[lenseTicker(a)] = (groups[lenseTicker(a)] || []).concat([a]);
48+
});
49+
const dupTickers = Object.keys(groups).filter(
50+
(a) =>
51+
groups[a].length > 1 &&
52+
(WARN_IF_COUNTERVALUES ? countervaluesTickers.includes(a) : true)
53+
);
54+
55+
if (Object.keys(contractGroup).length > 0) {
56+
Object.keys(contractGroup).forEach((key) => {
57+
console.warn(
58+
key +
59+
" contract used in ERC20: " +
60+
contractGroup[key].map((a) => lenseTicker(a)).join(", ")
61+
);
62+
});
63+
}
64+
65+
if (fiatCollisions.length > 0) {
66+
console.warn("\nPolygon ERC20 THAT COLLIDES WITH FIAT TICKERS:\n");
67+
fiatCollisions.forEach((t) => {
68+
console.warn(lenseTicker(t) + " ticker used by bep20: " + t[1]);
69+
});
70+
}
71+
72+
if (dupTickers.length > 0) {
73+
console.warn("\nPolygon ERC20 TICKER COLLISIONS:\n");
74+
dupTickers.forEach((ticker) => {
75+
console.warn(
76+
ticker +
77+
" ticker is used by bep20: " +
78+
groups[ticker].map((a) => a[1]).join(", ")
79+
);
80+
});
81+
}
82+
83+
return all.filter((a) => !contractGroup[a[6]]);
84+
}),
85+
outputTemplate: (data) =>
86+
`module.exports = [
87+
${data
88+
.map(
89+
(item) =>
90+
"[" +
91+
withoutExtraComma(
92+
item
93+
.map((value) => (value === undefined ? "" : JSON.stringify(value)))
94+
.join(",")
95+
) +
96+
"]"
97+
)
98+
.join(",\n")}
99+
];`,
100+
101+
loader: ({ signatureFolder, folder, id }) =>
102+
Promise.all([
103+
readFileJSON(path.join(folder, id, "common.json")),
104+
readFileJSON(path.join(signatureFolder, id, "ledger_signature.json")),
105+
]).then(([common, ledgerSignature]) => {
106+
const name = common.name;
107+
const ticker = common.ticker.toUpperCase();
108+
const magnitude = common.decimals;
109+
const contractAddress = common.contract_address;
110+
const parentCurrency = inferParentCurrency(common);
111+
const disableCountervalue = !!common.disable_countervalue;
112+
const delisted = !!common.delisted;
113+
const countervalueTicker = common.countervalue_ticker;
114+
try {
115+
invariant(
116+
typeof parentCurrency === "string" && parentCurrency,
117+
"parentCurrency is required"
118+
);
119+
invariant(typeof name === "string" && name, "name is required");
120+
invariant(typeof name === "string" && name, "name is required");
121+
invariant(typeof id === "string" && id, "id is required");
122+
invariant(
123+
typeof ledgerSignature === "string" && ledgerSignature,
124+
"ledgerSignature is required"
125+
);
126+
invariant(
127+
ledgerSignature.length % 2 === 0 &&
128+
ledgerSignature.match(/^[0-9a-fA-F]+$/g),
129+
"ledgerSignature is hexa"
130+
);
131+
invariant(
132+
typeof contractAddress === "string" && contractAddress,
133+
"contractAddress is required"
134+
);
135+
invariant(
136+
contractAddress.length === 42 &&
137+
contractAddress.match(/^0x[0-9a-fA-F]+$/g),
138+
"contractAddress is not eth address"
139+
);
140+
invariant(typeof ticker === "string" && ticker, "ticker is required");
141+
invariant(
142+
ticker.match(/^[0-9A-Z+_\-*$]+$/g),
143+
"ticker '%s' alphanum uppercase expected",
144+
ticker
145+
);
146+
invariant(
147+
typeof magnitude === "number" &&
148+
Number.isFinite(magnitude) &&
149+
magnitude >= 0 &&
150+
magnitude % 1 === 0,
151+
"magnitude expected positive integer"
152+
);
153+
} catch (e) {
154+
console.error("Polygon ERC20 " + id + ": " + e);
155+
return null;
156+
}
157+
return [
158+
parentCurrency,
159+
id,
160+
ticker,
161+
magnitude,
162+
name,
163+
ledgerSignature,
164+
contractAddress,
165+
disableCountervalue,
166+
delisted,
167+
countervalueTicker,
168+
];
169+
}),
170+
};

script/crypto-assets-importer/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const importers = [
88
require("./importers/erc20full"),
99
require("./importers/erc20exchange"),
1010
require("./importers/bep20full"),
11+
require("./importers/polygontokensfull"),
1112
require("./importers/currenciesExchange"),
1213
];
1314

0 commit comments

Comments
 (0)