@uniswap/token-list-bridge-utils 0.1.1-beta.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +102 -5
  2. package/dist/arbitrum/gateway.d.ts +2 -0
  3. package/dist/{arb-token-lists/src/lib → arbitrum}/instantiate_bridge.d.ts +3 -4
  4. package/dist/constants/types.d.ts +30 -0
  5. package/dist/fixtures/index.d.ts +9 -0
  6. package/dist/providers/ArbitrumMappingProvider.d.ts +7 -6
  7. package/dist/providers/MappingProvider.d.ts +4 -2
  8. package/dist/providers/OptimismMappingProvider.d.ts +5 -4
  9. package/dist/providers/PolygonMappingProvider.d.ts +4 -2
  10. package/dist/providers/index.d.ts +2 -4
  11. package/dist/token-list-bridge-utils.cjs.development.js +327 -906
  12. package/dist/token-list-bridge-utils.cjs.development.js.map +1 -1
  13. package/dist/token-list-bridge-utils.cjs.production.min.js +1 -1
  14. package/dist/token-list-bridge-utils.cjs.production.min.js.map +1 -1
  15. package/dist/token-list-bridge-utils.esm.js +329 -902
  16. package/dist/token-list-bridge-utils.esm.js.map +1 -1
  17. package/dist/utils.d.ts +4 -0
  18. package/package.json +7 -4
  19. package/src/.DS_Store +0 -0
  20. package/src/arbitrum/gateway.ts +25 -0
  21. package/src/{arb-token-lists/src/lib → arbitrum}/instantiate_bridge.ts +11 -15
  22. package/src/constants/types.ts +28 -0
  23. package/src/fixtures/index.ts +40 -5
  24. package/src/index.test.ts +60 -18
  25. package/src/index.ts +5 -7
  26. package/src/providers/ArbitrumMappingProvider.ts +31 -21
  27. package/src/providers/MappingProvider.ts +4 -2
  28. package/src/providers/OptimismMappingProvider.ts +21 -5
  29. package/src/providers/PolygonMappingProvider.ts +22 -114
  30. package/src/providers/index.ts +82 -2
  31. package/src/utils.ts +71 -1
  32. package/dist/arb-token-lists/server/app.d.ts +0 -1
  33. package/dist/arb-token-lists/src/lib/getClargs.d.ts +0 -8
  34. package/dist/arb-token-lists/src/lib/graph.d.ts +0 -2
  35. package/dist/arb-token-lists/src/lib/token_list_gen.d.ts +0 -23
  36. package/dist/arb-token-lists/src/lib/types.d.ts +0 -36
  37. package/dist/arb-token-lists/src/lib/utils.d.ts +0 -18
  38. package/dist/arb-token-lists/src/main.d.ts +0 -1
  39. package/src/arb-token-lists/.env.sample +0 -4
  40. package/src/arb-token-lists/.eslintrc.js +0 -43
  41. package/src/arb-token-lists/.gitignore +0 -4
  42. package/src/arb-token-lists/package.json +0 -40
  43. package/src/arb-token-lists/readme.md +0 -14
  44. package/src/arb-token-lists/server/app.ts +0 -21
  45. package/src/arb-token-lists/src/Assets/coingecko_uris.json +0 -5108
  46. package/src/arb-token-lists/src/Assets/logo_uris.json +0 -44
  47. package/src/arb-token-lists/src/WarningList/warningTokens.json +0 -290
  48. package/src/arb-token-lists/src/lib/getClargs.ts +0 -32
  49. package/src/arb-token-lists/src/lib/graph.ts +0 -116
  50. package/src/arb-token-lists/src/lib/token_list_gen.ts +0 -334
  51. package/src/arb-token-lists/src/lib/types.ts +0 -44
  52. package/src/arb-token-lists/src/lib/utils.ts +0 -285
  53. package/src/arb-token-lists/src/main.ts +0 -54
  54. package/src/arb-token-lists/tsconfig.json +0 -20
  55. package/src/arb-token-lists/update_all +0 -6
  56. package/src/arb-token-lists/yarn.lock +0 -4273
@@ -3,28 +3,16 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var lodash = require('lodash');
6
- var tokenLists = require('@uniswap/token-lists');
7
- var arbTs = require('arb-ts');
8
6
  var ethers = require('ethers');
7
+ var dotenv = require('dotenv');
8
+ var sdk = require('@arbitrum/sdk');
9
+ var L1GatewayRouter__factory = require('@arbitrum/sdk/dist/lib/abi/factories/L1GatewayRouter__factory');
9
10
  var fs = require('fs');
10
- var graphqlRequest = require('graphql-request');
11
- var Ajv = require('ajv');
12
- var addFormats = require('ajv-formats');
13
11
  var axios = require('axios');
14
- var betterAjvErrors = require('better-ajv-errors');
15
- var path = require('path');
16
- var yargs = require('yargs/yargs');
17
- var dotenv = require('dotenv');
18
12
 
19
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
20
14
 
21
- var Ajv__default = /*#__PURE__*/_interopDefaultLegacy(Ajv);
22
- var addFormats__default = /*#__PURE__*/_interopDefaultLegacy(addFormats);
23
15
  var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
24
- var betterAjvErrors__default = /*#__PURE__*/_interopDefaultLegacy(betterAjvErrors);
25
- var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
26
- var yargs__default = /*#__PURE__*/_interopDefaultLegacy(yargs);
27
- var dotenv__default = /*#__PURE__*/_interopDefaultLegacy(dotenv);
28
16
 
29
17
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
30
18
  try {
@@ -80,15 +68,6 @@ function _extends() {
80
68
  return _extends.apply(this, arguments);
81
69
  }
82
70
 
83
- function _taggedTemplateLiteralLoose(strings, raw) {
84
- if (!raw) {
85
- raw = strings.slice(0);
86
- }
87
-
88
- strings.raw = raw;
89
- return strings;
90
- }
91
-
92
71
  function _unsupportedIterableToArray(o, minLen) {
93
72
  if (!o) return;
94
73
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
@@ -900,25 +879,63 @@ var ChainId;
900
879
  ChainId[ChainId["POLYGON_MUMBAI"] = 80001] = "POLYGON_MUMBAI";
901
880
  })(ChainId || (ChainId = {}));
902
881
 
903
- var coinGeckoBuff = /*#__PURE__*/fs.readFileSync( /*#__PURE__*/path__default["default"].resolve(__dirname, '../Assets/coingecko_uris.json'));
904
- var logoURIsBuff = /*#__PURE__*/fs.readFileSync( /*#__PURE__*/path__default["default"].resolve(__dirname, '../Assets/logo_uris.json'));
905
- var coingeckoURIs = /*#__PURE__*/JSON.parse( /*#__PURE__*/coinGeckoBuff.toString());
906
- var logoUris = /*#__PURE__*/JSON.parse( /*#__PURE__*/logoURIsBuff.toString());
882
+ var networkID = 42161;
883
+ dotenv.config();
884
+ var getNetworkConfig = /*#__PURE__*/function () {
885
+ var _ref = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
886
+ var l2Network, l1Network, arbProvider, ethProvider, l1MultiCaller, l2MultiCaller;
887
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
888
+ while (1) {
889
+ switch (_context.prev = _context.next) {
890
+ case 0:
891
+ _context.next = 2;
892
+ return sdk.getL2Network(networkID);
907
893
 
908
- for (var _i = 0, _Object$keys = /*#__PURE__*/Object.keys(logoUris); _i < _Object$keys.length; _i++) {
909
- var address = _Object$keys[_i];
910
- logoUris[/*#__PURE__*/address.toLowerCase()] = logoUris[address];
911
- }
912
- var listNameToArbifiedListName = function listNameToArbifiedListName(name) {
913
- var prefix = 'Arbed ';
914
- var fileName = sanitizeString(name);
894
+ case 2:
895
+ l2Network = _context.sent;
896
+ _context.next = 5;
897
+ return sdk.getL1Network(l2Network.partnerChainID);
915
898
 
916
- if (!fileName.startsWith(prefix)) {
917
- fileName = prefix + fileName;
918
- }
899
+ case 5:
900
+ l1Network = _context.sent;
901
+ arbProvider = new ethers.providers.JsonRpcProvider(l2Network.rpcURL);
902
+ ethProvider = new ethers.providers.JsonRpcProvider(l1Network.rpcURL);
903
+ _context.next = 10;
904
+ return sdk.MultiCaller.fromProvider(ethProvider);
905
+
906
+ case 10:
907
+ l1MultiCaller = _context.sent;
908
+ _context.next = 13;
909
+ return sdk.MultiCaller.fromProvider(arbProvider);
910
+
911
+ case 13:
912
+ l2MultiCaller = _context.sent;
913
+ return _context.abrupt("return", {
914
+ l1: {
915
+ network: l1Network,
916
+ provider: ethProvider,
917
+ multiCaller: l1MultiCaller
918
+ },
919
+ l2: {
920
+ network: l2Network,
921
+ provider: arbProvider,
922
+ multiCaller: l2MultiCaller
923
+ }
924
+ });
925
+
926
+ case 15:
927
+ case "end":
928
+ return _context.stop();
929
+ }
930
+ }
931
+ }, _callee);
932
+ }));
933
+
934
+ return function getNetworkConfig() {
935
+ return _ref.apply(this, arguments);
936
+ };
937
+ }();
919
938
 
920
- return fileName.split(' ').slice(0, 2).join(' ').slice(0, 20);
921
- };
922
939
  var getL2TokenAddressesFromL1 = /*#__PURE__*/function () {
923
940
  var _ref = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(l1TokenAddresses, multiCaller, l1GatewayRouterAddress) {
924
941
  var iFace;
@@ -926,7 +943,7 @@ var getL2TokenAddressesFromL1 = /*#__PURE__*/function () {
926
943
  while (1) {
927
944
  switch (_context.prev = _context.next) {
928
945
  case 0:
929
- iFace = arbTs.abi.L1GatewayRouter__factory.createInterface();
946
+ iFace = L1GatewayRouter__factory.L1GatewayRouter__factory.createInterface();
930
947
  _context.next = 3;
931
948
  return multiCaller.multiCall(l1TokenAddresses.map(function (addr) {
932
949
  return {
@@ -955,243 +972,218 @@ var getL2TokenAddressesFromL1 = /*#__PURE__*/function () {
955
972
  return _ref.apply(this, arguments);
956
973
  };
957
974
  }();
958
- var getL2TokenAddressesFromL2 = /*#__PURE__*/function () {
959
- var _ref2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(l1TokenAddresses, multiCaller, l2GatewayRouterAddress) {
960
- var iFace;
961
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
962
- while (1) {
963
- switch (_context2.prev = _context2.next) {
964
- case 0:
965
- iFace = arbTs.abi.L2GatewayRouter__factory.createInterface();
966
- _context2.next = 3;
967
- return multiCaller.multiCall(l1TokenAddresses.map(function (addr) {
968
- return {
969
- encoder: function encoder() {
970
- return iFace.encodeFunctionData('calculateL2TokenAddress', [addr]);
971
- },
972
- decoder: function decoder(returnData) {
973
- return iFace.decodeFunctionResult('calculateL2TokenAddress', returnData)[0];
974
- },
975
- targetAddr: l2GatewayRouterAddress
976
- };
977
- }));
978
975
 
979
- case 3:
980
- return _context2.abrupt("return", _context2.sent);
976
+ /**
977
+ * This provider provides the l1->l2(Arbitrum) address mappings using the arbitrum SDK.
978
+ */
981
979
 
982
- case 4:
983
- case "end":
984
- return _context2.stop();
985
- }
986
- }
987
- }, _callee2);
988
- }));
980
+ var ArbitrumMappingProvider = /*#__PURE__*/function () {
981
+ function ArbitrumMappingProvider(l1TokenList) {
982
+ this.l1TokenList = void 0;
983
+ this.l1TokenList = l1TokenList;
984
+ }
989
985
 
990
- return function getL2TokenAddressesFromL2(_x4, _x5, _x6) {
991
- return _ref2.apply(this, arguments);
992
- };
993
- }();
994
- var getLogoUri = /*#__PURE__*/function () {
995
- var _ref3 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(l1TokenAddress) {
996
- var l1TokenAddressLCase, logoUri, coinGeckoURI, trustWalletUri, uris, _iterator, _step, uri, res;
986
+ var _proto = ArbitrumMappingProvider.prototype;
997
987
 
998
- return _regeneratorRuntime.wrap(function _callee3$(_context3) {
999
- while (1) {
1000
- switch (_context3.prev = _context3.next) {
1001
- case 0:
1002
- l1TokenAddressLCase = l1TokenAddress.toLowerCase();
1003
- logoUri = logoUris[l1TokenAddressLCase];
1004
- coinGeckoURI = coingeckoURIs[l1TokenAddressLCase];
1005
- trustWalletUri = "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/" + l1TokenAddress + "/logo.png";
1006
- uris = [logoUri, coinGeckoURI, trustWalletUri].filter(function (x) {
1007
- return !!x;
1008
- });
1009
- _iterator = _createForOfIteratorHelperLoose(uris);
988
+ _proto.provide = /*#__PURE__*/function () {
989
+ var _provide = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
990
+ var tokens, _yield$getNetworkConf, l1, l2, tokenAddresses, l2AddressesFromL1;
1010
991
 
1011
- case 6:
1012
- if ((_step = _iterator()).done) {
1013
- _context3.next = 20;
1014
- break;
1015
- }
992
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
993
+ while (1) {
994
+ switch (_context.prev = _context.next) {
995
+ case 0:
996
+ tokens = {};
997
+ _context.next = 3;
998
+ return getNetworkConfig();
999
+
1000
+ case 3:
1001
+ _yield$getNetworkConf = _context.sent;
1002
+ l1 = _yield$getNetworkConf.l1;
1003
+ l2 = _yield$getNetworkConf.l2;
1004
+ tokenAddresses = this.l1TokenList.tokens.map(function (token) {
1005
+ return token.address.toLowerCase();
1006
+ });
1007
+ _context.next = 9;
1008
+ return getL2TokenAddressesFromL1(tokenAddresses, l1.multiCaller, l2.network.tokenBridge.l1GatewayRouter);
1016
1009
 
1017
- uri = _step.value;
1018
- _context3.prev = 8;
1019
- _context3.next = 11;
1020
- return axios__default["default"].get(uri);
1010
+ case 9:
1011
+ l2AddressesFromL1 = _context.sent;
1012
+ tokens = tokenAddresses.reduce(function (obj, key, index) {
1013
+ var _extends2;
1021
1014
 
1022
- case 11:
1023
- res = _context3.sent;
1015
+ return _extends({}, obj, (_extends2 = {}, _extends2[key] = l2AddressesFromL1[index], _extends2));
1016
+ }, {});
1017
+ return _context.abrupt("return", tokens);
1024
1018
 
1025
- if (!(res.status === 200)) {
1026
- _context3.next = 14;
1027
- break;
1028
- }
1019
+ case 12:
1020
+ case "end":
1021
+ return _context.stop();
1022
+ }
1023
+ }
1024
+ }, _callee, this);
1025
+ }));
1026
+
1027
+ function provide() {
1028
+ return _provide.apply(this, arguments);
1029
+ }
1029
1030
 
1030
- return _context3.abrupt("return", uri);
1031
+ return provide;
1032
+ }();
1033
+
1034
+ return ArbitrumMappingProvider;
1035
+ }();
1036
+
1037
+ function compareTokenInfos(t1, t2) {
1038
+ if (t1.chainId === t2.chainId) {
1039
+ return t1.symbol.toLowerCase() < t2.symbol.toLowerCase() ? -1 : 1;
1040
+ }
1041
+
1042
+ return t1.chainId < t2.chainId ? -1 : 1;
1043
+ } // ref: https://github.com/OffchainLabs/arb-token-lists/blob/master/src/lib/utils.ts
1031
1044
 
1032
- case 14:
1033
- _context3.next = 18;
1034
- break;
1045
+ function getTokenList(_x) {
1046
+ return _getTokenList.apply(this, arguments);
1047
+ }
1035
1048
 
1036
- case 16:
1037
- _context3.prev = 16;
1038
- _context3.t0 = _context3["catch"](8);
1049
+ function _getTokenList() {
1050
+ _getTokenList = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(l1TokenListOrPathOrUrl) {
1051
+ return _regeneratorRuntime.wrap(function _callee5$(_context5) {
1052
+ while (1) {
1053
+ switch (_context5.prev = _context5.next) {
1054
+ case 0:
1055
+ if (!(typeof l1TokenListOrPathOrUrl === 'string')) {
1056
+ _context5.next = 4;
1057
+ break;
1058
+ }
1039
1059
 
1040
- case 18:
1041
- _context3.next = 6;
1042
- break;
1060
+ return _context5.abrupt("return", getTokenListObj(l1TokenListOrPathOrUrl));
1043
1061
 
1044
- case 20:
1045
- return _context3.abrupt("return");
1062
+ case 4:
1063
+ return _context5.abrupt("return", l1TokenListOrPathOrUrl);
1046
1064
 
1047
- case 21:
1065
+ case 5:
1048
1066
  case "end":
1049
- return _context3.stop();
1067
+ return _context5.stop();
1050
1068
  }
1051
1069
  }
1052
- }, _callee3, null, [[8, 16]]);
1070
+ }, _callee5);
1053
1071
  }));
1072
+ return _getTokenList.apply(this, arguments);
1073
+ }
1054
1074
 
1055
- return function getLogoUri(_x7) {
1056
- return _ref3.apply(this, arguments);
1057
- };
1058
- }();
1059
1075
  var getTokenListObjFromUrl = /*#__PURE__*/function () {
1060
- var _ref4 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(url) {
1061
- return _regeneratorRuntime.wrap(function _callee4$(_context4) {
1076
+ var _ref = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(url) {
1077
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
1062
1078
  while (1) {
1063
- switch (_context4.prev = _context4.next) {
1079
+ switch (_context.prev = _context.next) {
1064
1080
  case 0:
1065
- _context4.next = 2;
1081
+ _context.next = 2;
1066
1082
  return axios__default["default"].get(url);
1067
1083
 
1068
1084
  case 2:
1069
- return _context4.abrupt("return", _context4.sent.data);
1085
+ return _context.abrupt("return", _context.sent.data);
1070
1086
 
1071
1087
  case 3:
1072
1088
  case "end":
1073
- return _context4.stop();
1089
+ return _context.stop();
1074
1090
  }
1075
1091
  }
1076
- }, _callee4);
1092
+ }, _callee);
1077
1093
  }));
1078
1094
 
1079
- return function getTokenListObjFromUrl(_x8) {
1080
- return _ref4.apply(this, arguments);
1095
+ return function getTokenListObjFromUrl(_x2) {
1096
+ return _ref.apply(this, arguments);
1081
1097
  };
1082
1098
  }();
1083
1099
  var getTokenListObjFromLocalPath = /*#__PURE__*/function () {
1084
- var _ref5 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(path) {
1085
- return _regeneratorRuntime.wrap(function _callee5$(_context5) {
1100
+ var _ref2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(path) {
1101
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
1086
1102
  while (1) {
1087
- switch (_context5.prev = _context5.next) {
1103
+ switch (_context2.prev = _context2.next) {
1088
1104
  case 0:
1089
- return _context5.abrupt("return", JSON.parse(fs.readFileSync(path).toString()));
1105
+ return _context2.abrupt("return", JSON.parse(fs.readFileSync(path).toString()));
1090
1106
 
1091
1107
  case 1:
1092
1108
  case "end":
1093
- return _context5.stop();
1109
+ return _context2.stop();
1094
1110
  }
1095
1111
  }
1096
- }, _callee5);
1112
+ }, _callee2);
1097
1113
  }));
1098
1114
 
1099
- return function getTokenListObjFromLocalPath(_x9) {
1100
- return _ref5.apply(this, arguments);
1115
+ return function getTokenListObjFromLocalPath(_x3) {
1116
+ return _ref2.apply(this, arguments);
1101
1117
  };
1102
1118
  }();
1103
- var tokenListIsValid = function tokenListIsValid(tokenList) {
1104
- var ajv = new Ajv__default["default"]();
1105
- addFormats__default["default"](ajv);
1106
- var validate = ajv.compile(tokenLists.schema);
1107
- var res = validate(tokenList);
1108
-
1109
- if (validate.errors) {
1110
- var output = betterAjvErrors__default["default"](tokenLists.schema, tokenList, validate.errors, {
1111
- indent: 2
1112
- });
1113
- console.log(output);
1114
- }
1115
-
1116
- return res;
1117
- };
1118
- var validateTokenListWithErrorThrowing = function validateTokenListWithErrorThrowing(tokenList) {
1119
- try {
1120
- var valid = tokenListIsValid(tokenList);
1121
- if (valid) return true;else throw new Error('Data does not conform to token list schema; not sure why');
1122
- } catch (e) {
1123
- console.log('Invalid token list:');
1124
- throw e;
1125
- }
1126
- };
1127
1119
  var getTokenListObj = /*#__PURE__*/function () {
1128
- var _ref6 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7(pathOrUrl) {
1120
+ var _ref3 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(pathOrUrl) {
1129
1121
  var tokenList;
1130
- return _regeneratorRuntime.wrap(function _callee7$(_context7) {
1122
+ return _regeneratorRuntime.wrap(function _callee4$(_context4) {
1131
1123
  while (1) {
1132
- switch (_context7.prev = _context7.next) {
1124
+ switch (_context4.prev = _context4.next) {
1133
1125
  case 0:
1134
- _context7.next = 2;
1126
+ _context4.next = 2;
1135
1127
  return function () {
1136
- var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6(pathOrUrl) {
1128
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(pathOrUrl) {
1137
1129
  var localFileExists, looksLikeUrl;
1138
- return _regeneratorRuntime.wrap(function _callee6$(_context6) {
1130
+ return _regeneratorRuntime.wrap(function _callee3$(_context3) {
1139
1131
  while (1) {
1140
- switch (_context6.prev = _context6.next) {
1132
+ switch (_context3.prev = _context3.next) {
1141
1133
  case 0:
1142
1134
  localFileExists = fs.existsSync(pathOrUrl);
1143
1135
  looksLikeUrl = isValidHttpUrl(pathOrUrl);
1144
1136
 
1145
1137
  if (!localFileExists) {
1146
- _context6.next = 6;
1138
+ _context3.next = 6;
1147
1139
  break;
1148
1140
  }
1149
1141
 
1150
- return _context6.abrupt("return", getTokenListObjFromLocalPath(pathOrUrl));
1142
+ return _context3.abrupt("return", getTokenListObjFromLocalPath(pathOrUrl));
1151
1143
 
1152
1144
  case 6:
1153
1145
  if (!looksLikeUrl) {
1154
- _context6.next = 12;
1146
+ _context3.next = 12;
1155
1147
  break;
1156
1148
  }
1157
1149
 
1158
- _context6.next = 9;
1150
+ _context3.next = 9;
1159
1151
  return getTokenListObjFromUrl(pathOrUrl);
1160
1152
 
1161
1153
  case 9:
1162
- return _context6.abrupt("return", _context6.sent);
1154
+ return _context3.abrupt("return", _context3.sent);
1163
1155
 
1164
1156
  case 12:
1165
1157
  throw new Error('Could not find token list');
1166
1158
 
1167
1159
  case 13:
1168
1160
  case "end":
1169
- return _context6.stop();
1161
+ return _context3.stop();
1170
1162
  }
1171
1163
  }
1172
- }, _callee6);
1164
+ }, _callee3);
1173
1165
  }));
1174
1166
 
1175
- return function (_x11) {
1176
- return _ref7.apply(this, arguments);
1167
+ return function (_x5) {
1168
+ return _ref4.apply(this, arguments);
1177
1169
  };
1178
1170
  }()(pathOrUrl);
1179
1171
 
1180
1172
  case 2:
1181
- tokenList = _context7.sent;
1173
+ tokenList = _context4.sent;
1182
1174
  isTokenList(tokenList);
1183
- return _context7.abrupt("return", tokenList);
1175
+ return _context4.abrupt("return", tokenList);
1184
1176
 
1185
1177
  case 5:
1186
1178
  case "end":
1187
- return _context7.stop();
1179
+ return _context4.stop();
1188
1180
  }
1189
1181
  }
1190
- }, _callee7);
1182
+ }, _callee4);
1191
1183
  }));
1192
1184
 
1193
- return function getTokenListObj(_x10) {
1194
- return _ref6.apply(this, arguments);
1185
+ return function getTokenListObj(_x4) {
1186
+ return _ref3.apply(this, arguments);
1195
1187
  };
1196
1188
  }(); // https://stackoverflow.com/questions/5717093/check-if-a-javascript-string-is-a-url
1197
1189
 
@@ -1207,6 +1199,7 @@ function isValidHttpUrl(urlString) {
1207
1199
  return url.protocol === 'http:' || url.protocol === 'https:';
1208
1200
  } // typeguard:
1209
1201
 
1202
+
1210
1203
  var isTokenList = function isTokenList(obj) {
1211
1204
  var expectedListKeys = ['name', 'timestamp', 'version', 'tokens'];
1212
1205
  var actualListKeys = new Set(Object.keys(obj));
@@ -1214,7 +1207,7 @@ var isTokenList = function isTokenList(obj) {
1214
1207
  if (!expectedListKeys.every(function (key) {
1215
1208
  return actualListKeys.has(key);
1216
1209
  })) {
1217
- throw new Error("tokenlist typeguard error: requried list key not included");
1210
+ throw new Error('tokenlist typeguard error: required list key not included');
1218
1211
  }
1219
1212
 
1220
1213
  var version = obj.version,
@@ -1223,7 +1216,7 @@ var isTokenList = function isTokenList(obj) {
1223
1216
  if (!['major', 'minor', 'patch'].every(function (key) {
1224
1217
  return typeof version[key] === 'number';
1225
1218
  })) {
1226
- throw new Error("tokenlist typeguard error: invalid version");
1219
+ throw new Error('tokenlist typeguard error: invalid version');
1227
1220
  }
1228
1221
 
1229
1222
  if (!tokens.every(function (token) {
@@ -1232,625 +1225,123 @@ var isTokenList = function isTokenList(obj) {
1232
1225
  return tokenKeys.has(key);
1233
1226
  });
1234
1227
  })) {
1235
- throw new Error("tokenlist typeguard error: token missing required key");
1228
+ throw new Error('tokenlist typeguard error: token missing required key');
1236
1229
  }
1237
1230
  };
1238
- var sanitizeString = function sanitizeString(str) {
1239
- return str.replace(/[^ \w.'+\-%/À-ÖØ-öø-ÿ:&\[\]\(\)]/gi, '');
1240
- };
1241
- var excludeList = /*#__PURE__*/['0x0CE51000d5244F1EAac0B313a792D5a5f96931BF', '0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f', '0xEDA6eFE5556e134Ef52f2F858aa1e81c84CDA84b', '0xe54942077Df7b8EEf8D4e6bCe2f7B58B0082b0cd', '0x282db609e787a132391eb64820ba6129fceb2695', '0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3', '0x106538cc16f938776c7c180186975bca23875287', '0xB4A3B0Faf0Ab53df58001804DdA5Bfc6a3D59008' // spera
1242
- // "0x960b236a07cf122663c4303350609a66a7b288c0", //aragon old
1243
- ].map(function (s) {
1244
- return s.toLowerCase();
1245
- });
1246
1231
 
1247
- var _templateObject, _templateObject2;
1248
- var apolloL2GatewaysRinkebyClient = 'https://api.thegraph.com/subgraphs/name/fredlacs/layer2-token-gateway-rinkeby';
1249
- var apolloL2GatewaysClient = 'https://api.thegraph.com/subgraphs/name/fredlacs/layer2-token-gateway';
1232
+ var optimismTokenListURL = 'https://raw.githubusercontent.com/' + 'ethereum-optimism/ethereum-optimism.github.io/2138386277e4156d159615d1840882cecc398437/optimism.tokenlist.json';
1233
+ /**
1234
+ * The Optimism L2 mapping (linked above) is manually maintained by the Optimism team.
1235
+ *
1236
+ * This provider provides the l1->l2(Optimism) token mappings.
1237
+ */
1250
1238
 
1251
- var chaidIdToGraphClientUrl = function chaidIdToGraphClientUrl(chainID) {
1252
- switch (chainID) {
1253
- case '42161':
1254
- return apolloL2GatewaysClient;
1239
+ var OptimismMappingProvider = /*#__PURE__*/function () {
1240
+ function OptimismMappingProvider() {}
1255
1241
 
1256
- case '421611':
1257
- return apolloL2GatewaysRinkebyClient;
1242
+ var _proto = OptimismMappingProvider.prototype;
1258
1243
 
1259
- default:
1260
- throw new Error('Unsupported chain');
1261
- }
1262
- };
1244
+ _proto.provide = /*#__PURE__*/function () {
1245
+ var _provide = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
1246
+ var tokens, optimismTokens, _iterator, _step, token, _token$extensions;
1263
1247
 
1264
- var isGraphTokenResult = function isGraphTokenResult(obj) {
1265
- if (!obj) {
1266
- throw new Error("Graph result: undefined");
1267
- }
1248
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
1249
+ while (1) {
1250
+ switch (_context.prev = _context.next) {
1251
+ case 0:
1252
+ tokens = {};
1253
+ _context.next = 3;
1254
+ return getTokenList(optimismTokenListURL);
1268
1255
 
1269
- var expectedKeys = ["joinTableEntry", "l1TokenAddr"];
1270
- var actualKeys = new Set(Object.keys(obj));
1256
+ case 3:
1257
+ optimismTokens = _context.sent;
1271
1258
 
1272
- if (!expectedKeys.every(function (key) {
1273
- return actualKeys.has(key);
1274
- })) {
1275
- throw new Error("Graph result: missing top level key");
1276
- }
1259
+ for (_iterator = _createForOfIteratorHelperLoose(optimismTokens.tokens); !(_step = _iterator()).done;) {
1260
+ token = _step.value;
1277
1261
 
1278
- var joinTableEntry = obj.joinTableEntry[0];
1262
+ if (token.chainId === ChainId.MAINNET) {
1263
+ tokens[token.address.toLowerCase()] = token == null ? void 0 : (_token$extensions = token.extensions) == null ? void 0 : _token$extensions.bridgeInfo[ChainId.OPTIMISM].tokenAddress;
1264
+ }
1265
+ }
1279
1266
 
1280
- if (!joinTableEntry) {
1281
- throw new Error("Graph result: no joinTableEntry");
1282
- }
1267
+ return _context.abrupt("return", tokens);
1283
1268
 
1284
- if (!joinTableEntry.gateway.gatewayAddr) {
1285
- throw new Error("Graph result: could not get gateway address");
1286
- }
1287
- };
1269
+ case 6:
1270
+ case "end":
1271
+ return _context.stop();
1272
+ }
1273
+ }
1274
+ }, _callee);
1275
+ }));
1288
1276
 
1289
- var getTokens = /*#__PURE__*/function () {
1290
- var _ref = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(l1TokenAddresses, networkID) {
1291
- var clientUrl, allTokens, allTokenAddresses, formattedAddresses, query, _yield$request, tokens;
1277
+ function provide() {
1278
+ return _provide.apply(this, arguments);
1279
+ }
1292
1280
 
1293
- return _regeneratorRuntime.wrap(function _callee$(_context) {
1294
- while (1) {
1295
- switch (_context.prev = _context.next) {
1296
- case 0:
1297
- clientUrl = chaidIdToGraphClientUrl(networkID); // lazy solution for big lists for now; we'll have to paginate once we have > 500 tokens registed
1281
+ return provide;
1282
+ }();
1298
1283
 
1299
- if (!(l1TokenAddresses.length > 500)) {
1300
- _context.next = 9;
1301
- break;
1302
- }
1284
+ return OptimismMappingProvider;
1285
+ }();
1303
1286
 
1304
- _context.next = 4;
1305
- return getAllTokens(networkID);
1287
+ var url = 'https://tokenmapper.api.matic.today/api/v1/mapping?';
1288
+ var params = 'map_type=[%22POS%22]&chain_id=137&limit=200&offset=';
1289
+ /**
1290
+ * The Polygon team manually maintains the mapping via user submissions at
1291
+ * https://mapper.polygon.technology.
1292
+ *
1293
+ * This provider provides the l1->l2(Polygon) token mappings.
1294
+ */
1306
1295
 
1307
- case 4:
1308
- allTokens = _context.sent;
1309
- allTokenAddresses = new Set(allTokens.map(function (token) {
1310
- return token.l1TokenAddr.toLowerCase();
1311
- }));
1312
- l1TokenAddresses = l1TokenAddresses.filter(function (addr) {
1313
- return allTokenAddresses.has(addr.toLowerCase());
1314
- });
1296
+ var PolygonMappingProvider = /*#__PURE__*/function () {
1297
+ function PolygonMappingProvider() {}
1315
1298
 
1316
- if (!(l1TokenAddresses.length > 500)) {
1317
- _context.next = 9;
1318
- break;
1319
- }
1299
+ var _proto = PolygonMappingProvider.prototype;
1320
1300
 
1321
- throw new Error("Too many tokens for graph query");
1301
+ _proto.provide = /*#__PURE__*/function () {
1302
+ var _provide = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
1303
+ var offset, tokens, response, _iterator, _step, token;
1322
1304
 
1323
- case 9:
1324
- formattedAddresses = l1TokenAddresses.map(function (a) {
1325
- return ("\"" + a + "\"").toLowerCase();
1326
- }).join(',');
1327
- query = graphqlRequest.gql(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["\n {\n tokens(first: 500, skip: 0, where:{\n id_in:[", "]\n }) {\n l1TokenAddr: id\n joinTableEntry: gateway(\n first: 1\n orderBy: blockNum\n orderDirection: desc\n ) {\n id\n blockNum\n token {\n tokenAddr: id\n }\n gateway {\n gatewayAddr: id\n }\n }\n }\n }\n"])), formattedAddresses);
1328
- _context.next = 13;
1329
- return graphqlRequest.request(clientUrl, query);
1305
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
1306
+ while (1) {
1307
+ switch (_context.prev = _context.next) {
1308
+ case 0:
1309
+ offset = 0;
1310
+ tokens = {};
1330
1311
 
1331
- case 13:
1332
- _yield$request = _context.sent;
1333
- tokens = _yield$request.tokens;
1334
- tokens.map(function (token) {
1335
- return isGraphTokenResult(token);
1336
- });
1337
- return _context.abrupt("return", tokens.filter(function (token) {
1338
- return !excludeList.includes(token.l1TokenAddr.toLowerCase());
1339
- }));
1312
+ case 2:
1340
1313
 
1341
- case 17:
1342
- case "end":
1343
- return _context.stop();
1344
- }
1345
- }
1346
- }, _callee);
1347
- }));
1314
+ _context.next = 5;
1315
+ return axios__default["default"].get("" + url + params + offset);
1348
1316
 
1349
- return function getTokens(_x, _x2) {
1350
- return _ref.apply(this, arguments);
1351
- };
1352
- }();
1353
- var getAllTokens = /*#__PURE__*/function () {
1354
- var _ref2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(networkID) {
1355
- var clientUrl, query, _yield$request2, tokens;
1317
+ case 5:
1318
+ response = _context.sent;
1356
1319
 
1357
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
1358
- while (1) {
1359
- switch (_context2.prev = _context2.next) {
1360
- case 0:
1361
- clientUrl = chaidIdToGraphClientUrl(networkID);
1362
- query = graphqlRequest.gql(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["\n {\n tokens(first: 500, skip: 0) {\n l1TokenAddr: id\n joinTableEntry: gateway(\n first: 1\n orderBy: blockNum\n orderDirection: desc\n ) {\n id\n blockNum\n token {\n tokenAddr: id\n }\n gateway {\n gatewayAddr: id\n }\n }\n }\n }\n "])));
1363
- _context2.next = 4;
1364
- return graphqlRequest.request(clientUrl, query);
1365
-
1366
- case 4:
1367
- _yield$request2 = _context2.sent;
1368
- tokens = _yield$request2.tokens;
1369
- tokens.map(function (token) {
1370
- return isGraphTokenResult(token);
1371
- });
1372
- return _context2.abrupt("return", tokens.filter(function (token) {
1373
- return !excludeList.includes(token.l1TokenAddr.toLowerCase());
1374
- }));
1375
-
1376
- case 8:
1377
- case "end":
1378
- return _context2.stop();
1379
- }
1380
- }
1381
- }, _callee2);
1382
- }));
1383
-
1384
- return function getAllTokens(_x3) {
1385
- return _ref2.apply(this, arguments);
1386
- };
1387
- }();
1388
-
1389
- /*
1390
- * Copyright 2021, Offchain Labs, Inc.
1391
- *
1392
- * Licensed under the Apache License, Version 2.0 (the "License");
1393
- * you may not use this file except in compliance with the License.
1394
- * You may obtain a copy of the License at
1395
- *
1396
- * http://www.apache.org/licenses/LICENSE-2.0
1397
- *
1398
- * Unless required by applicable law or agreed to in writing, software
1399
- * distributed under the License is distributed on an "AS IS" BASIS,
1400
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1401
- * See the License for the specific language governing permissions and
1402
- * limitations under the License.
1403
- */
1404
- var argv = /*#__PURE__*/yargs__default["default"](process.argv.slice(2)).options({
1405
- l2NetworkID: {
1406
- type: 'number'
1407
- },
1408
- tokenList: {
1409
- type: 'string'
1410
- }
1411
- }).parseSync();
1412
-
1413
- var _args$l2NetworkID;
1414
- dotenv__default["default"].config();
1415
- var networkID = ((_args$l2NetworkID = argv.l2NetworkID) == null ? void 0 : /*#__PURE__*/_args$l2NetworkID.toString()) || '42161';
1416
- console.log('Using L2 networkID:', networkID);
1417
- var getNetworkConfig = /*#__PURE__*/function () {
1418
- var _ref = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
1419
- var l2Network, l1Network, arbProvider, ethProvider, l1MultiCaller, l2MultiCaller, tokenBridger;
1420
- return _regeneratorRuntime.wrap(function _callee$(_context) {
1421
- while (1) {
1422
- switch (_context.prev = _context.next) {
1423
- case 0:
1424
- _context.next = 2;
1425
- return arbTs.getL2Network(networkID);
1426
-
1427
- case 2:
1428
- l2Network = _context.sent;
1429
- _context.next = 5;
1430
- return arbTs.getL1Network(l2Network.partnerChainID);
1431
-
1432
- case 5:
1433
- l1Network = _context.sent;
1434
- arbProvider = new ethers.providers.JsonRpcProvider(l2Network.rpcURL);
1435
- ethProvider = new ethers.providers.JsonRpcProvider(l1Network.rpcURL);
1436
- _context.next = 10;
1437
- return arbTs.MultiCaller.fromProvider(ethProvider);
1438
-
1439
- case 10:
1440
- l1MultiCaller = _context.sent;
1441
- _context.next = 13;
1442
- return arbTs.MultiCaller.fromProvider(arbProvider);
1443
-
1444
- case 13:
1445
- l2MultiCaller = _context.sent;
1446
- tokenBridger = new arbTs.TokenBridger(l2Network);
1447
- return _context.abrupt("return", {
1448
- l1: {
1449
- network: l1Network,
1450
- provider: ethProvider,
1451
- multiCaller: l1MultiCaller
1452
- },
1453
- l2: {
1454
- network: l2Network,
1455
- provider: arbProvider,
1456
- multiCaller: l2MultiCaller
1457
- },
1458
- tokenBridger: tokenBridger
1459
- });
1460
-
1461
- case 16:
1462
- case "end":
1463
- return _context.stop();
1464
- }
1465
- }
1466
- }, _callee);
1467
- }));
1468
-
1469
- return function getNetworkConfig() {
1470
- return _ref.apply(this, arguments);
1471
- };
1472
- }();
1473
-
1474
- var l2ToL1GatewayAddresses = {
1475
- // L2 ERC20 Gateway mainnet
1476
- '0x09e9222e96e7b4ae2a407b98d48e330053351eee': '0xa3A7B6F88361F48403514059F1F16C8E78d60EeC',
1477
- // L2 Arb-Custom Gateway mainnet
1478
- '0x096760f208390250649e3e8763348e783aef5562': '0xcEe284F754E854890e311e3280b767F80797180d',
1479
- // L2 weth mainnet
1480
- '0x6c411ad3e74de3e7bd422b94a27770f5b86c623b': '0xd92023E9d9911199a6711321D1277285e6d4e2db',
1481
- // L2 dai gateway mainnet
1482
- '0x467194771dae2967aef3ecbedd3bf9a310c76c65': '0xd3b5b60020504bc3489d6949d545893982ba3011',
1483
- // L2 ERC20 Gateway rinkeby
1484
- "0x195c107f3f75c4c93eba7d9a1312f19305d6375f": "0x91169Dbb45e6804743F94609De50D511C437572E",
1485
- // L2 Arb-Custom Gateway rinkeby
1486
- "0x9b014455acc2fe90c52803849d0002aeec184a06": "0x917dc9a69F65dC3082D518192cd3725E1Fa96cA2",
1487
- // L2 Weth Gateway rinkeby
1488
- "0xf94bc045c4e926cc0b34e8d1c41cd7a043304ac9": "0x81d1a19cf7071732D4313c75dE8DD5b8CF697eFD",
1489
- // old L2 weth gateway in rinkeby? we can prob remove this
1490
- "0xf90eb31045d5b924900aff29344deb42eae0b087": "0x81d1a19cf7071732D4313c75dE8DD5b8CF697eFD",
1491
- // livepeer gateway mainnet
1492
- "0x6d2457a4ad276000a615295f7a80f79e48ccd318": "0x6142f1C8bBF02E6A6bd074E8d564c9A5420a0676"
1493
- };
1494
- var generateTokenList = /*#__PURE__*/function () {
1495
- var _ref = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(l1TokenList, prevArbTokenList, options) {
1496
- var name, mainLogoUri, _yield$getNetworkConf, l1, l2, tokens, l1TokenAddresses, l2AddressesFromL1, l2AddressesFromL2, tokenData, logoUris, _iterator, _step, token, uri, arbifiedTokens, arbifiedTokenList, l1ArbedTokenList, l1AddressesOfBridgedTokens, unbridgedTokens, version, arbTokenList, validationTokenList;
1497
-
1498
- return _regeneratorRuntime.wrap(function _callee$(_context) {
1499
- while (1) {
1500
- switch (_context.prev = _context.next) {
1501
- case 0:
1502
- if (!(options != null && options.includeAllL1Tokens && options.includeUnbridgedL1Tokens)) {
1503
- _context.next = 2;
1504
- break;
1505
- }
1506
-
1507
- throw new Error("Cannot include both of AllL1Tokens and UnbridgedL1Tokens since UnbridgedL1Tokens is a subset of AllL1Tokens.");
1508
-
1509
- case 2:
1510
- name = l1TokenList.name;
1511
- mainLogoUri = l1TokenList.logoURI;
1512
- _context.next = 6;
1513
- return getNetworkConfig();
1514
-
1515
- case 6:
1516
- _yield$getNetworkConf = _context.sent;
1517
- l1 = _yield$getNetworkConf.l1;
1518
- l2 = _yield$getNetworkConf.l2;
1519
-
1520
- if (!(options && options.getAllTokensInNetwork)) {
1521
- _context.next = 15;
1522
- break;
1523
- }
1524
-
1525
- _context.next = 12;
1526
- return getAllTokens(l2.network.chainID);
1527
-
1528
- case 12:
1529
- _context.t0 = _context.sent;
1530
- _context.next = 18;
1531
- break;
1532
-
1533
- case 15:
1534
- _context.next = 17;
1535
- return getTokens(l1TokenList.tokens.map(function (token) {
1536
- return token.address.toLowerCase();
1537
- }), l2.network.chainID);
1538
-
1539
- case 17:
1540
- _context.t0 = _context.sent;
1541
-
1542
- case 18:
1543
- tokens = _context.t0;
1544
- l1TokenAddresses = tokens.map(function (token) {
1545
- return token.l1TokenAddr;
1546
- });
1547
- _context.next = 22;
1548
- return getL2TokenAddressesFromL1(l1TokenAddresses, l1.multiCaller, l2.network.tokenBridge.l1GatewayRouter);
1549
-
1550
- case 22:
1551
- l2AddressesFromL1 = _context.sent;
1552
- _context.next = 25;
1553
- return getL2TokenAddressesFromL2(l1TokenAddresses, l2.multiCaller, l2.network.tokenBridge.l2GatewayRouter);
1554
-
1555
- case 25:
1556
- l2AddressesFromL2 = _context.sent;
1557
- // if the l2 route hasn't been updated yet we remove the token from the bridged tokens
1558
- tokens = tokens.filter(function (t, i) {
1559
- return l2AddressesFromL1[i] === l2AddressesFromL2[i];
1560
- });
1561
- _context.next = 29;
1562
- return l2.multiCaller.getTokenData(l2AddressesFromL1.map(function (t) {
1563
- return t || ethers.constants.AddressZero;
1564
- }), {
1565
- name: true,
1566
- decimals: true,
1567
- symbol: true
1568
- });
1569
-
1570
- case 29:
1571
- tokenData = _context.sent;
1572
- logoUris = [];
1573
- _iterator = _createForOfIteratorHelperLoose(tokens);
1574
-
1575
- case 32:
1576
- if ((_step = _iterator()).done) {
1577
- _context.next = 40;
1578
- break;
1579
- }
1580
-
1581
- token = _step.value;
1582
- _context.next = 36;
1583
- return getLogoUri(token.l1TokenAddr);
1584
-
1585
- case 36:
1586
- uri = _context.sent;
1587
- logoUris.push(uri);
1588
-
1589
- case 38:
1590
- _context.next = 32;
1591
- break;
1592
-
1593
- case 40:
1594
- arbifiedTokens = tokens.map(function (t, i) {
1595
- return {
1596
- token: t,
1597
- l2Address: l2AddressesFromL2[i],
1598
- tokenDatum: tokenData[i]
1599
- };
1600
- }) // it's possible that even though l2AddressesFromL1[i] === l2AddressesFromL2[i] these addresses could be the zero address
1601
- // this can happen if the graphql query returns an address that hasnt been bridged
1602
- .filter(function (t) {
1603
- return t.l2Address != undefined && t.l2Address !== ethers.constants.AddressZero;
1604
- }).map(function (token, i) {
1605
- var _bridgeInfo, _bridgeInfo2;
1606
-
1607
- var l2GatewayAddress = token.token.joinTableEntry[0].gateway.gatewayAddr;
1608
- var _token$tokenDatum = token.tokenDatum,
1609
- _name = _token$tokenDatum.name,
1610
- decimals = _token$tokenDatum.decimals,
1611
- _symbol = _token$tokenDatum.symbol;
1612
- if (decimals === undefined) throw new Error("Unexpected undefined token decimals: " + JSON.stringify(token));
1613
-
1614
- _name = function () {
1615
- if (_name === undefined) throw new Error("Unexpected undefined token name: " + JSON.stringify(token)); // if token name is empty, instead set the address as the name
1616
- // we remove the initial 0x since the token list standard only allows up to 40 characters
1617
- else if (_name === "") return token.token.l1TokenAddr.substring(2); // parse null terminated bytes32 strings
1618
- else if (_name.length === 64) return ethers.utils.parseBytes32String("0x" + _name);else return _name;
1619
- }();
1620
-
1621
- _symbol = function () {
1622
- if (_symbol === undefined) throw new Error("Unexpected undefined token symbol: " + JSON.stringify(token)); // schema doesn't allow for empty symbols, and has a max length of 20
1623
- else if (_symbol === "") return _name.substring(0, Math.min(_name.length, 20)); // parse null terminated bytes32 strings
1624
- else if (_symbol.length === 64) return ethers.utils.parseBytes32String("0x" + _symbol);else return _symbol;
1625
- }();
1626
-
1627
- var name = sanitizeString(_name);
1628
- var symbol = sanitizeString(_symbol);
1629
- var arbTokenInfo = {
1630
- chainId: +l2.network.chainID,
1631
- address: token.l2Address,
1632
- name: name,
1633
- symbol: symbol,
1634
- decimals: decimals,
1635
- extensions: {
1636
- bridgeInfo: (_bridgeInfo = {}, _bridgeInfo[l1.network.chainID] = {
1637
- tokenAddress: token.token.l1TokenAddr,
1638
- originBridgeAddress: l2GatewayAddress,
1639
- destBridgeAddress: l2ToL1GatewayAddresses[l2GatewayAddress.toLowerCase()]
1640
- }, _bridgeInfo)
1641
- }
1642
- };
1643
- var l1TokenInfo = {
1644
- chainId: +l1.network.chainID,
1645
- address: token.token.l1TokenAddr,
1646
- name: name,
1647
- symbol: symbol,
1648
- decimals: decimals,
1649
- extensions: {
1650
- bridgeInfo: (_bridgeInfo2 = {}, _bridgeInfo2[l2.network.chainID] = {
1651
- tokenAddress: token.l2Address,
1652
- originBridgeAddress: l2ToL1GatewayAddresses[l2GatewayAddress.toLowerCase()],
1653
- destBridgeAddress: l2GatewayAddress
1654
- }, _bridgeInfo2)
1655
- }
1656
- };
1657
-
1658
- if (logoUris[i]) {
1659
- arbTokenInfo = _extends({}, {
1660
- logoURI: logoUris[i]
1661
- }, arbTokenInfo);
1662
- } else {
1663
- console.log('no logo uri for ', token.token.l1TokenAddr, symbol);
1320
+ if (!(response.data.message === 'success')) {
1321
+ _context.next = 11;
1322
+ break;
1664
1323
  }
1665
1324
 
1666
- return {
1667
- arbTokenInfo: arbTokenInfo,
1668
- l1TokenInfo: l1TokenInfo
1669
- };
1670
- }).filter(function (_ref2) {
1671
- var arbTokenInfo = _ref2.arbTokenInfo;
1672
- return arbTokenInfo.extensions && arbTokenInfo.extensions.bridgeInfo[l1.network.chainID].originBridgeAddress !== arbTs.constants.DISABLED_GATEWAY;
1673
- });
1674
- arbifiedTokenList = arbifiedTokens.map(function (_ref3) {
1675
- var arbTokenInfo = _ref3.arbTokenInfo;
1676
- return arbTokenInfo;
1677
- }).sort(function (a, b) {
1678
- return a.symbol < b.symbol ? -1 : 1;
1679
- });
1680
- l1ArbedTokenList = arbifiedTokens.map(function (_ref4) {
1681
- var l1TokenInfo = _ref4.l1TokenInfo;
1682
- return l1TokenInfo;
1683
- });
1684
- console.log("List has " + arbifiedTokenList.length + " bridged tokens");
1685
-
1686
- if (options != null && options.includeAllL1Tokens) {
1687
- arbifiedTokenList = arbifiedTokenList.concat(l1ArbedTokenList);
1688
- } else if (options != null && options.includeUnbridgedL1Tokens) {
1689
- l1AddressesOfBridgedTokens = new Set(tokens.map(function (token) {
1690
- return token.l1TokenAddr.toLowerCase();
1691
- }));
1692
- unbridgedTokens = l1ArbedTokenList.filter(function (l1TokenInfo) {
1693
- return !l1AddressesOfBridgedTokens.has(l1TokenInfo.address.toLowerCase()) && l1TokenInfo.chainId === +l1.network.chainID;
1694
- }).sort(function (a, b) {
1695
- return a.symbol < b.symbol ? -1 : 1;
1696
- });
1697
- console.log("List has " + unbridgedTokens.length + " unbridged tokens");
1698
- arbifiedTokenList = arbifiedTokenList.concat(unbridgedTokens);
1699
- }
1700
-
1701
- version = function () {
1702
- if (prevArbTokenList) {
1703
- // @ts-ignore
1704
- var versionBump = tokenLists.minVersionBump(prevArbTokenList.tokens, arbifiedTokenList); // tmp: library doesn't nicely handle patches (for extensions object)
1705
-
1706
- if (versionBump === tokenLists.VersionUpgrade.PATCH) {
1707
- versionBump = tokenLists.VersionUpgrade.NONE;
1708
- }
1709
-
1710
- return tokenLists.nextVersion(prevArbTokenList.version, versionBump);
1325
+ for (_iterator = _createForOfIteratorHelperLoose(response.data.data.mapping); !(_step = _iterator()).done;) {
1326
+ token = _step.value;
1327
+ tokens[token.root_token.toLowerCase()] = token;
1711
1328
  }
1712
1329
 
1713
- return {
1714
- major: 1,
1715
- minor: 0,
1716
- patch: 0
1717
- };
1718
- }();
1719
-
1720
- arbTokenList = {
1721
- name: listNameToArbifiedListName(name),
1722
- timestamp: new Date().toISOString(),
1723
- version: version,
1724
- tokens: arbifiedTokenList,
1725
- logoURI: mainLogoUri
1726
- };
1727
- validationTokenList = _extends({}, arbTokenList, {
1728
- tokens: arbTokenList.tokens
1729
- });
1730
- validateTokenListWithErrorThrowing(validationTokenList);
1731
- console.log("Generated list with total " + arbTokenList.tokens.length + " tokens");
1732
- console.log('version:', version);
1733
- return _context.abrupt("return", arbTokenList);
1734
-
1735
- case 52:
1736
- case "end":
1737
- return _context.stop();
1738
- }
1739
- }
1740
- }, _callee);
1741
- }));
1742
-
1743
- return function generateTokenList(_x, _x2, _x3) {
1744
- return _ref.apply(this, arguments);
1745
- };
1746
- }();
1747
-
1748
- function compareTokenInfos(t1, t2) {
1749
- if (t1.chainId === t2.chainId) {
1750
- return t1.symbol.toLowerCase() < t2.symbol.toLowerCase() ? -1 : 1;
1751
- }
1752
-
1753
- return t1.chainId < t2.chainId ? -1 : 1;
1754
- }
1755
- function getTokenList(_x) {
1756
- return _getTokenList.apply(this, arguments);
1757
- }
1758
-
1759
- function _getTokenList() {
1760
- _getTokenList = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(l1TokenListOrPathOrUrl) {
1761
- return _regeneratorRuntime.wrap(function _callee$(_context) {
1762
- while (1) {
1763
- switch (_context.prev = _context.next) {
1764
- case 0:
1765
- if (!(typeof l1TokenListOrPathOrUrl === 'string')) {
1766
- _context.next = 4;
1767
- break;
1768
- }
1769
-
1770
- return _context.abrupt("return", getTokenListObj(l1TokenListOrPathOrUrl));
1771
-
1772
- case 4:
1773
- return _context.abrupt("return", l1TokenListOrPathOrUrl);
1774
-
1775
- case 5:
1776
- case "end":
1777
- return _context.stop();
1778
- }
1779
- }
1780
- }, _callee);
1781
- }));
1782
- return _getTokenList.apply(this, arguments);
1783
- }
1784
-
1785
- /**
1786
- * The Arbitrum team maintains an (unpublished) package to `arbify` an L1
1787
- * token list.
1788
- *
1789
- * The provider simply invokes this package which we host as a submodule.
1790
- */
1791
-
1792
- var ArbitrumMappingProvider = /*#__PURE__*/function () {
1793
- function ArbitrumMappingProvider() {}
1794
-
1795
- var _proto = ArbitrumMappingProvider.prototype;
1796
-
1797
- _proto.provide = /*#__PURE__*/function () {
1798
- var _provide = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(l1TokenList) {
1799
- var arbedTokenList;
1800
- return _regeneratorRuntime.wrap(function _callee$(_context) {
1801
- while (1) {
1802
- switch (_context.prev = _context.next) {
1803
- case 0:
1804
- _context.next = 2;
1805
- return generateTokenList(l1TokenList,
1806
- /*prevArbTokenList=*/
1807
- undefined, {
1808
- includeAllL1Tokens: true
1809
- });
1810
-
1811
- case 2:
1812
- arbedTokenList = _context.sent;
1813
- return _context.abrupt("return", _extends({}, arbedTokenList, {
1814
- tokens: arbedTokenList.tokens.sort(compareTokenInfos)
1815
- }));
1816
-
1817
- case 4:
1818
- case "end":
1819
- return _context.stop();
1820
- }
1821
- }
1822
- }, _callee);
1823
- }));
1330
+ if (!(response.data.data.has_next_page === true)) {
1331
+ _context.next = 11;
1332
+ break;
1333
+ }
1824
1334
 
1825
- function provide(_x) {
1826
- return _provide.apply(this, arguments);
1827
- }
1335
+ offset += 200;
1336
+ return _context.abrupt("continue", 2);
1828
1337
 
1829
- return provide;
1830
- }();
1338
+ case 11:
1339
+ return _context.abrupt("break", 14);
1831
1340
 
1832
- return ArbitrumMappingProvider;
1833
- }();
1341
+ case 14:
1342
+ return _context.abrupt("return", tokens);
1834
1343
 
1835
- /**
1836
- * The Optimism L2 mapping is manually maintained by the Optimism team.
1837
- *
1838
- * This provider mostly no-ops, i.e. grabs the list and returns it.
1839
- */
1840
- var OptimismMappingProvider = /*#__PURE__*/function () {
1841
- function OptimismMappingProvider() {}
1842
-
1843
- var _proto = OptimismMappingProvider.prototype;
1844
-
1845
- _proto.provide = /*#__PURE__*/function () {
1846
- var _provide = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(l1TokenList) {
1847
- return _regeneratorRuntime.wrap(function _callee$(_context) {
1848
- while (1) {
1849
- switch (_context.prev = _context.next) {
1850
- case 0:
1851
- return _context.abrupt("return", l1TokenList);
1852
-
1853
- case 1:
1344
+ case 15:
1854
1345
  case "end":
1855
1346
  return _context.stop();
1856
1347
  }
@@ -1858,160 +1349,92 @@ var OptimismMappingProvider = /*#__PURE__*/function () {
1858
1349
  }, _callee);
1859
1350
  }));
1860
1351
 
1861
- function provide(_x) {
1352
+ function provide() {
1862
1353
  return _provide.apply(this, arguments);
1863
1354
  }
1864
1355
 
1865
1356
  return provide;
1866
1357
  }();
1867
1358
 
1868
- return OptimismMappingProvider;
1359
+ return PolygonMappingProvider;
1869
1360
  }();
1870
1361
 
1871
- /**
1872
- * The Polygon team manually maintains the mapping via user submissions at
1873
- * https://mapper.polygon.technology.
1874
- */
1875
-
1876
- var PolygonMappingProvider = /*#__PURE__*/function () {
1877
- function PolygonMappingProvider() {}
1878
-
1879
- var _proto = PolygonMappingProvider.prototype;
1362
+ function buildList(_x, _x2) {
1363
+ return _buildList.apply(this, arguments);
1364
+ }
1880
1365
 
1881
- _proto.provide = /*#__PURE__*/function () {
1882
- var _provide = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(l1TokenList) {
1883
- var polygonTokens, mappedTokens, _iterator, _step, _bridgeInfo, _bridgeInfo2, _childToken$name, _childToken$symbol, rootToken, childToken, childTokenValid, toRootExtensions, toChildExtensions, rootTokenInfo, childTokenInfo, tokenList;
1366
+ function _buildList() {
1367
+ _buildList = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(chainId, l1TokenList) {
1368
+ var tokenAddressMap, mappedTokens, _iterator, _step, rootToken, childToken, childTokenValid, _bridgeInfo, _bridgeInfo2, toRootExtensions, toChildExtensions, rootTokenInfo, childTokenInfo, tokenList;
1884
1369
 
1885
- return _regeneratorRuntime.wrap(function _callee$(_context) {
1886
- while (1) {
1887
- switch (_context.prev = _context.next) {
1888
- case 0:
1889
- _context.next = 2;
1890
- return fetchPolygonMappedTokens();
1370
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
1371
+ while (1) {
1372
+ switch (_context.prev = _context.next) {
1373
+ case 0:
1374
+ _context.next = 2;
1375
+ return getMappingProvider(chainId, l1TokenList).provide();
1891
1376
 
1892
- case 2:
1893
- polygonTokens = _context.sent;
1894
- mappedTokens = [];
1377
+ case 2:
1378
+ tokenAddressMap = _context.sent;
1379
+ mappedTokens = [];
1895
1380
 
1896
- for (_iterator = _createForOfIteratorHelperLoose(l1TokenList.tokens); !(_step = _iterator()).done;) {
1897
- rootToken = _step.value;
1898
- childToken = polygonTokens[rootToken.address.toLowerCase()];
1899
- childTokenValid = Boolean(childToken && !childToken.deleted); // build extension info if available
1381
+ for (_iterator = _createForOfIteratorHelperLoose(l1TokenList.tokens); !(_step = _iterator()).done;) {
1382
+ rootToken = _step.value;
1383
+ childToken = tokenAddressMap[rootToken.address.toLowerCase()];
1384
+ childTokenValid = Boolean(childToken && (typeof childToken === 'object' ? !childToken.deleted : true));
1900
1385
 
1386
+ if (rootToken.chainId === ChainId.MAINNET) {
1387
+ // build extension info if available
1901
1388
  toRootExtensions = childTokenValid ? {
1902
1389
  extensions: {
1903
1390
  bridgeInfo: (_bridgeInfo = {}, _bridgeInfo[rootToken.chainId] = {
1904
- tokenAddress: childToken.root_token
1391
+ tokenAddress: ethers.ethers.utils.getAddress(rootToken.address)
1905
1392
  }, _bridgeInfo)
1906
1393
  }
1907
1394
  } : {};
1908
1395
  toChildExtensions = childTokenValid ? {
1909
1396
  extensions: {
1910
- bridgeInfo: (_bridgeInfo2 = {}, _bridgeInfo2[childToken.chainId] = {
1911
- tokenAddress: childToken.child_token
1397
+ bridgeInfo: (_bridgeInfo2 = {}, _bridgeInfo2[chainId] = {
1398
+ tokenAddress: ethers.ethers.utils.getAddress(typeof childToken === 'object' ? childToken.child_token : childToken)
1912
1399
  }, _bridgeInfo2)
1913
1400
  }
1914
1401
  } : {};
1915
1402
  rootTokenInfo = _extends({}, rootToken, toChildExtensions);
1916
- childTokenInfo = _extends({}, rootToken, {
1917
- chainId: childToken.chainId,
1918
- name: (_childToken$name = childToken.name) != null ? _childToken$name : rootToken.name,
1919
- symbol: (_childToken$symbol = childToken.symbol) != null ? _childToken$symbol : rootToken.symbol,
1920
- address: childToken.child_token
1921
- }, toRootExtensions);
1922
- mappedTokens.push(rootTokenInfo);
1923
- mappedTokens.push(childTokenInfo);
1924
- }
1925
-
1926
- tokenList = {
1927
- name: "Polygon " + l1TokenList.name,
1928
- timestamp: new Date().toISOString(),
1929
- version: l1TokenList.version,
1930
- tokens: mappedTokens.sort(compareTokenInfos)
1931
- };
1932
- return _context.abrupt("return", tokenList);
1933
-
1934
- case 7:
1935
- case "end":
1936
- return _context.stop();
1937
- }
1938
- }
1939
- }, _callee);
1940
- }));
1941
-
1942
- function provide(_x) {
1943
- return _provide.apply(this, arguments);
1944
- }
1945
-
1946
- return provide;
1947
- }();
1948
-
1949
- return PolygonMappingProvider;
1950
- }();
1951
- var url = 'https://tokenmapper.api.matic.today/api/v1/mapping?';
1952
- var params = 'map_type=[%22POS%22]&chain_id=137&limit=200&offset=';
1953
-
1954
- function fetchPolygonMappedTokens() {
1955
- return _fetchPolygonMappedTokens.apply(this, arguments);
1956
- }
1957
-
1958
- function _fetchPolygonMappedTokens() {
1959
- _fetchPolygonMappedTokens = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
1960
- var offset, tokens, response, _iterator2, _step2, token;
1961
1403
 
1962
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
1963
- while (1) {
1964
- switch (_context2.prev = _context2.next) {
1965
- case 0:
1966
- offset = 0;
1967
- tokens = {};
1968
-
1969
- case 2:
1970
-
1971
- _context2.next = 5;
1972
- return axios__default["default"].get("" + url + params + offset);
1973
-
1974
- case 5:
1975
- response = _context2.sent;
1976
-
1977
- if (!(response.data.message === 'success')) {
1978
- _context2.next = 11;
1979
- break;
1980
- }
1981
-
1982
- for (_iterator2 = _createForOfIteratorHelperLoose(response.data.data.mapping); !(_step2 = _iterator2()).done;) {
1983
- token = _step2.value;
1984
- tokens[token.root_token.toLowerCase()] = token;
1985
- }
1404
+ if (childTokenValid) {
1405
+ childTokenInfo = _extends({}, rootToken, {
1406
+ chainId: chainId,
1407
+ address: ethers.ethers.utils.getAddress(typeof childToken === 'object' ? childToken.child_token : childToken)
1408
+ }, toRootExtensions);
1409
+ mappedTokens.push(childTokenInfo);
1410
+ }
1986
1411
 
1987
- if (!(response.data.data.has_next_page === true)) {
1988
- _context2.next = 11;
1989
- break;
1412
+ mappedTokens.push(rootTokenInfo);
1413
+ }
1990
1414
  }
1991
1415
 
1992
- offset += 200;
1993
- return _context2.abrupt("continue", 2);
1994
-
1995
- case 11:
1996
- return _context2.abrupt("break", 14);
1997
-
1998
- case 14:
1999
- return _context2.abrupt("return", tokens);
1416
+ tokenList = {
1417
+ name: "(ChainId: " + chainId + ") " + l1TokenList.name,
1418
+ timestamp: new Date().toISOString(),
1419
+ version: l1TokenList.version,
1420
+ tokens: mappedTokens.sort(compareTokenInfos)
1421
+ };
1422
+ return _context.abrupt("return", tokenList);
2000
1423
 
2001
- case 15:
1424
+ case 7:
2002
1425
  case "end":
2003
- return _context2.stop();
1426
+ return _context.stop();
2004
1427
  }
2005
1428
  }
2006
- }, _callee2);
1429
+ }, _callee);
2007
1430
  }));
2008
- return _fetchPolygonMappedTokens.apply(this, arguments);
1431
+ return _buildList.apply(this, arguments);
2009
1432
  }
2010
1433
 
2011
- function getMappingProvider(chainId) {
1434
+ function getMappingProvider(chainId, l1TokenList) {
2012
1435
  switch (chainId) {
2013
1436
  case ChainId.ARBITRUM_ONE:
2014
- return new ArbitrumMappingProvider();
1437
+ return new ArbitrumMappingProvider(l1TokenList);
2015
1438
 
2016
1439
  case ChainId.OPTIMISM:
2017
1440
  return new OptimismMappingProvider();
@@ -2149,36 +1572,35 @@ function chainifyTokenList(_x2, _x3) {
2149
1572
 
2150
1573
  function _chainifyTokenList() {
2151
1574
  _chainifyTokenList = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(chainId, l1TokenListOrPathOrUrl) {
2152
- var tokenList;
1575
+ var l1TokenList, tokenList;
2153
1576
  return _regeneratorRuntime.wrap(function _callee2$(_context2) {
2154
1577
  while (1) {
2155
1578
  switch (_context2.prev = _context2.next) {
2156
1579
  case 0:
2157
1580
  _context2.prev = 0;
2158
- _context2.t0 = getMappingProvider(chainId);
2159
- _context2.next = 4;
1581
+ _context2.next = 3;
2160
1582
  return getTokenList(l1TokenListOrPathOrUrl);
2161
1583
 
2162
- case 4:
2163
- _context2.t1 = _context2.sent;
2164
- _context2.next = 7;
2165
- return _context2.t0.provide.call(_context2.t0, _context2.t1);
1584
+ case 3:
1585
+ l1TokenList = _context2.sent;
1586
+ _context2.next = 6;
1587
+ return buildList(chainId, l1TokenList);
2166
1588
 
2167
- case 7:
1589
+ case 6:
2168
1590
  tokenList = _context2.sent;
2169
1591
  return _context2.abrupt("return", verifyExtensions(tokenList));
2170
1592
 
2171
- case 11:
2172
- _context2.prev = 11;
2173
- _context2.t2 = _context2["catch"](0);
2174
- throw new Error("An error occured: " + _context2.t2);
1593
+ case 10:
1594
+ _context2.prev = 10;
1595
+ _context2.t0 = _context2["catch"](0);
1596
+ throw new Error("An error occured: " + _context2.t0);
2175
1597
 
2176
- case 14:
1598
+ case 13:
2177
1599
  case "end":
2178
1600
  return _context2.stop();
2179
1601
  }
2180
1602
  }
2181
- }, _callee2, null, [[0, 11]]);
1603
+ }, _callee2, null, [[0, 10]]);
2182
1604
  }));
2183
1605
  return _chainifyTokenList.apply(this, arguments);
2184
1606
  }
@@ -2200,7 +1622,6 @@ function mergeTokenLists(primary, secondary) {
2200
1622
 
2201
1623
  if ((_merged$extensions = merged.extensions) != null && _merged$extensions.bridgeInfo) {
2202
1624
  // remove reference to self-chain from merge
2203
- // @ts-expect-error TokenList schema doesn't yet define objects
2204
1625
  delete merged.extensions.bridgeInfo[merged.chainId];
2205
1626
  }
2206
1627