@trustvc/trustvc 2.4.1 → 2.5.0

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 (44) hide show
  1. package/dist/cjs/token-registry-functions/utils.js +2 -2
  2. package/dist/cjs/utils/analytics/analytics.js +45 -0
  3. package/dist/cjs/utils/analytics/index.js +12 -0
  4. package/dist/cjs/utils/errorMessages/VerificationErrorMessages.js +105 -0
  5. package/dist/cjs/utils/errorMessages/index.js +22 -2
  6. package/dist/cjs/utils/fragment/index.js +49 -12
  7. package/dist/cjs/utils/gasStation/index.js +65 -13
  8. package/dist/cjs/utils/index.js +7 -0
  9. package/dist/cjs/utils/network/index.js +15 -9
  10. package/dist/cjs/utils/static/icons.js +13 -0
  11. package/dist/cjs/utils/supportedChains/index.js +183 -8
  12. package/dist/esm/token-registry-functions/utils.js +1 -1
  13. package/dist/esm/utils/analytics/analytics.js +39 -0
  14. package/dist/esm/utils/analytics/index.js +1 -0
  15. package/dist/esm/utils/errorMessages/VerificationErrorMessages.js +102 -0
  16. package/dist/esm/utils/errorMessages/index.js +1 -1
  17. package/dist/esm/utils/fragment/index.js +48 -10
  18. package/dist/esm/utils/gasStation/index.js +62 -1
  19. package/dist/esm/utils/index.js +1 -0
  20. package/dist/esm/utils/network/index.js +16 -1
  21. package/dist/esm/utils/static/icons.js +7 -0
  22. package/dist/esm/utils/supportedChains/index.js +184 -1
  23. package/dist/types/index.d.ts +5 -4
  24. package/dist/types/token-registry-functions/index.d.ts +3 -1
  25. package/dist/types/token-registry-functions/mint.d.ts +3 -1
  26. package/dist/types/token-registry-functions/ownerOf.d.ts +3 -1
  27. package/dist/types/token-registry-functions/rejectTransfers.d.ts +3 -1
  28. package/dist/types/token-registry-functions/returnToken.d.ts +3 -1
  29. package/dist/types/token-registry-functions/transfer.d.ts +3 -1
  30. package/dist/types/token-registry-functions/types.d.ts +3 -1
  31. package/dist/types/token-registry-functions/utils.d.ts +3 -1
  32. package/dist/types/token-registry-v5/typedContractMethod.d.ts +1 -4
  33. package/dist/types/utils/analytics/analytics.d.ts +17 -0
  34. package/dist/types/utils/analytics/index.d.ts +1 -0
  35. package/dist/types/utils/documents/index.d.ts +4 -1
  36. package/dist/types/utils/errorMessages/VerificationErrorMessages.d.ts +102 -0
  37. package/dist/types/utils/errorMessages/types.d.ts +1 -1
  38. package/dist/types/utils/fragment/index.d.ts +13 -2
  39. package/dist/types/utils/gasStation/index.d.ts +12 -1
  40. package/dist/types/utils/index.d.ts +6 -4
  41. package/dist/types/utils/network/index.d.ts +6 -1
  42. package/dist/types/utils/static/icons.d.ts +7 -0
  43. package/dist/types/utils/supportedChains/index.d.ts +38 -1
  44. package/package.json +5 -2
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
3
  var ethers = require('../utils/ethers');
4
- var tradetrustUtils = require('@tradetrust-tt/tradetrust-utils');
4
+ var utils = require('../utils');
5
5
 
6
6
  var __defProp = Object.defineProperty;
7
7
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
8
  const getTxOptions = /* @__PURE__ */ __name(async (signer, chainId, maxFeePerGas, maxPriorityFeePerGas) => {
9
9
  if (!maxFeePerGas || !maxPriorityFeePerGas) {
10
10
  chainId = chainId ?? await getChainIdSafe(signer);
11
- const gasStation = tradetrustUtils.SUPPORTED_CHAINS[chainId]?.gasStation;
11
+ const gasStation = utils.SUPPORTED_CHAINS[chainId]?.gasStation;
12
12
  if (gasStation) {
13
13
  const gasFees = await gasStation();
14
14
  maxFeePerGas = gasFees?.maxFeePerGas ?? 0;
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
+ const validateGtag = /* @__PURE__ */ __name(() => {
6
+ const isInit = typeof gtag === "function";
7
+ if (!isInit) console.warn("gtag is not initialised");
8
+ return isInit;
9
+ }, "validateGtag");
10
+ const validatePageViewEvent = /* @__PURE__ */ __name((gaEvent2) => {
11
+ const { action } = gaEvent2;
12
+ if (!action) console.error("Action is required");
13
+ if (action && typeof action !== "string") console.error("Action must be a string");
14
+ }, "validatePageViewEvent");
15
+ const gaPageView = /* @__PURE__ */ __name((gaEvent2, gaId) => {
16
+ if (!validateGtag()) return;
17
+ validatePageViewEvent(gaEvent2);
18
+ const { action } = gaEvent2;
19
+ gtag("event", action, {
20
+ send_to: gaId
21
+ });
22
+ }, "gaPageView");
23
+ const validateGaEvent = /* @__PURE__ */ __name((gaEvent2) => {
24
+ const { action, category, label, value } = gaEvent2;
25
+ if (!category) console.error("Category is required");
26
+ if (!action) console.error("Action is required");
27
+ if (label && typeof label !== "string") console.error("Label must be a string");
28
+ if (value && typeof value !== "number") console.error("Value must be a number");
29
+ }, "validateGaEvent");
30
+ const gaEvent = /* @__PURE__ */ __name((gaEvent2) => {
31
+ if (!validateGtag()) return;
32
+ validateGaEvent(gaEvent2);
33
+ const { action, category, label, value } = gaEvent2;
34
+ gtag("event", action, {
35
+ event_category: category,
36
+ event_label: label,
37
+ value
38
+ });
39
+ }, "gaEvent");
40
+
41
+ exports.gaEvent = gaEvent;
42
+ exports.gaPageView = gaPageView;
43
+ exports.validateGaEvent = validateGaEvent;
44
+ exports.validateGtag = validateGtag;
45
+ exports.validatePageViewEvent = validatePageViewEvent;
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var analytics = require('./analytics');
4
+
5
+
6
+
7
+ Object.keys(analytics).forEach(function (k) {
8
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
9
+ enumerable: true,
10
+ get: function () { return analytics[k]; }
11
+ });
12
+ });
@@ -0,0 +1,105 @@
1
+ 'use strict';
2
+
3
+ const TYPES = {
4
+ REVOKED: "REVOKED",
5
+ SUSPENDED: "SUSPENDED",
6
+ ISSUED: "ISSUED",
7
+ HASH: "HASH",
8
+ IDENTITY: "IDENTITY",
9
+ INVALID: "INVALID",
10
+ ADDRESS_INVALID: "ADDRESS_INVALID",
11
+ NETWORK_INVALID: "NETWORK_INVALID",
12
+ NETWORK_MISMATCH_MAINNET: "NETWORK_MISMATCH_MAINNET",
13
+ NETWORK_MISMATCH_TESTNET: "NETWORK_MISMATCH_TESTNET",
14
+ CONTRACT_NOT_FOUND: "CONTRACT_NOT_FOUND",
15
+ INVALID_ARGUMENT: "INVALID_ARGUMENT",
16
+ SERVER_ERROR: "SERVER_ERROR",
17
+ ETHERS_UNHANDLED_ERROR: "ETHERS_UNHANDLED_ERROR",
18
+ CLIENT_NETWORK_ERROR: "CLIENT_NETWORK_ERROR",
19
+ VERIFICATION_ERROR: "VERIFICATION_ERROR"
20
+ };
21
+ const MESSAGES = {
22
+ [TYPES.REVOKED]: {
23
+ failureTitle: "Document revoked",
24
+ successTitle: "Document has not been revoked",
25
+ failureMessage: "This document has been revoked by the issuing authority. Please contact them for more details."
26
+ },
27
+ [TYPES.SUSPENDED]: {
28
+ failureTitle: "Document suspended",
29
+ successTitle: "Document has not been suspended",
30
+ failureMessage: "This document has been suspended by the issuing authority. Please contact them for more details."
31
+ },
32
+ [TYPES.ISSUED]: {
33
+ failureTitle: "Document not issued",
34
+ successTitle: "Document has been issued",
35
+ failureMessage: "This document cannot be found. Please contact your issuing authority for help or issue the document before trying again."
36
+ },
37
+ [TYPES.HASH]: {
38
+ failureTitle: "Document has been tampered with",
39
+ successTitle: "Document has not been tampered with",
40
+ failureMessage: "The contents of this document are inaccurate and have been tampered with."
41
+ },
42
+ [TYPES.IDENTITY]: {
43
+ failureTitle: "Document issuer identity is invalid",
44
+ successTitle: "Document issuer has been identified",
45
+ failureMessage: "This document was issued by an invalid issuer."
46
+ },
47
+ [TYPES.INVALID]: {
48
+ failureTitle: "Document is invalid",
49
+ successTitle: "",
50
+ failureMessage: "This document is not valid. Please upload a valid document."
51
+ },
52
+ [TYPES.ADDRESS_INVALID]: {
53
+ failureTitle: "Document store or Token registry address is invalid",
54
+ successTitle: "",
55
+ failureMessage: "Please inform the issuer of this document that they have misconfigured their Document store or Token registry address."
56
+ },
57
+ [TYPES.NETWORK_INVALID]: {
58
+ failureTitle: "Document's network field is invalid",
59
+ successTitle: "",
60
+ failureMessage: "This document has an invalid network field. Please contact your issuing authority for help or re-issue the document with a valid network field before trying again."
61
+ },
62
+ [TYPES.NETWORK_MISMATCH_MAINNET]: {
63
+ failureTitle: "Document network mismatch on mainnet",
64
+ successTitle: "",
65
+ failureMessage: "This document was issued on the testnet, but you are currently using the mainnet environment. Please switch to the testnet environment to view this document correctly, or contact the issuing authority if you believe this is incorrect."
66
+ },
67
+ [TYPES.NETWORK_MISMATCH_TESTNET]: {
68
+ failureTitle: "Document network mismatch on testnet",
69
+ successTitle: "",
70
+ failureMessage: "This document was issued on the mainnet, but you are currently using the testnet environment. Please switch to the mainnet environment to view this document correctly, or contact the issuing authority if you believe this is incorrect."
71
+ },
72
+ [TYPES.CONTRACT_NOT_FOUND]: {
73
+ failureTitle: "Document store or Token registry address cannot be found",
74
+ successTitle: "",
75
+ failureMessage: "Please inform the issuer of this document that they have misconfigured their Document store or Token registry address."
76
+ },
77
+ [TYPES.INVALID_ARGUMENT]: {
78
+ failureTitle: "Document's merkle root is invalid",
79
+ successTitle: "",
80
+ failureMessage: "Please inform the issuer of this document that the merkle root is invalid, or it may have been tampered with."
81
+ },
82
+ [TYPES.SERVER_ERROR]: {
83
+ failureTitle: "Unable to connect to the blockchain network",
84
+ successTitle: "",
85
+ failureMessage: "We are unable to connect to the blockchain network, please try again later. If this issue persists, contact us using the feedback link below."
86
+ },
87
+ [TYPES.ETHERS_UNHANDLED_ERROR]: {
88
+ failureTitle: "Whoops! It's not you, it's us",
89
+ successTitle: "",
90
+ failureMessage: "We encountered an internal error and cannot determine the cause, please try again later. If this issue persists, contact us using the feedback link below."
91
+ },
92
+ [TYPES.CLIENT_NETWORK_ERROR]: {
93
+ failureTitle: "Whoops! There seems to be an error verifying the document",
94
+ successTitle: "",
95
+ failureMessage: "Please check your network and try again"
96
+ },
97
+ [TYPES.VERIFICATION_ERROR]: {
98
+ failureTitle: "Document Verification Failed",
99
+ successTitle: "",
100
+ failureMessage: "The document could not be verified at the moment. Please try again."
101
+ }
102
+ };
103
+
104
+ exports.MESSAGES = MESSAGES;
105
+ exports.TYPES = TYPES;
@@ -1,9 +1,29 @@
1
1
  'use strict';
2
2
 
3
- var tradetrustUtils = require('@tradetrust-tt/tradetrust-utils');
3
+ var CONSTANTS = require('./VerificationErrorMessages');
4
4
  var types = require('./types');
5
5
 
6
- const errorMessages = tradetrustUtils.CONSTANTS;
6
+ function _interopNamespace(e) {
7
+ if (e && e.__esModule) return e;
8
+ var n = Object.create(null);
9
+ if (e) {
10
+ Object.keys(e).forEach(function (k) {
11
+ if (k !== 'default') {
12
+ var d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: function () { return e[k]; }
16
+ });
17
+ }
18
+ });
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+
24
+ var CONSTANTS__namespace = /*#__PURE__*/_interopNamespace(CONSTANTS);
25
+
26
+ const errorMessages = CONSTANTS__namespace;
7
27
 
8
28
  exports.errorMessages = errorMessages;
9
29
  Object.keys(types).forEach(function (k) {
@@ -1,11 +1,50 @@
1
1
  'use strict';
2
2
 
3
- var tradetrustUtils = require('@tradetrust-tt/tradetrust-utils');
4
3
  var ttVerify = require('@tradetrust-tt/tt-verify');
5
4
  var w3cCredentialStatus = require('../../verify/fragments/document-status/w3cCredentialStatus');
5
+ var VerificationErrorMessages = require('../errorMessages/VerificationErrorMessages');
6
+ var errorMessages = require('../errorMessages');
6
7
 
7
8
  var __defProp = Object.defineProperty;
8
9
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ const certificateRevokedOnDidIdentified = /* @__PURE__ */ __name((fragments) => {
11
+ const didSignedDocumentStatusFragment = ttVerify.utils.getOpenAttestationDidSignedDocumentStatusFragment(fragments);
12
+ return didSignedDocumentStatusFragment?.reason?.code === ttVerify.OpenAttestationEthereumDocumentStoreStatusCode.DOCUMENT_REVOKED;
13
+ }, "certificateRevokedOnDidIdentified");
14
+ const interpretFragments = /* @__PURE__ */ __name((fragments) => {
15
+ const hashValid = ttVerify.isValid(fragments, ["DOCUMENT_INTEGRITY"]);
16
+ const issuedValid = ttVerify.isValid(fragments, ["DOCUMENT_STATUS"]);
17
+ const identityValid = ttVerify.isValid(fragments, ["ISSUER_IDENTITY"]);
18
+ return { hashValid, issuedValid, identityValid };
19
+ }, "interpretFragments");
20
+ const OAErrorMessageHandling = /* @__PURE__ */ __name((fragments) => {
21
+ const { hashValid, issuedValid, identityValid } = interpretFragments(fragments);
22
+ const errors = [];
23
+ if (ttVerify.utils.isDocumentStoreAddressOrTokenRegistryAddressInvalid(fragments)) {
24
+ return [VerificationErrorMessages.TYPES.ADDRESS_INVALID];
25
+ }
26
+ if (ttVerify.utils.contractNotFound(fragments)) {
27
+ return [VerificationErrorMessages.TYPES.CONTRACT_NOT_FOUND];
28
+ }
29
+ if (ttVerify.utils.serverError(fragments)) {
30
+ return [VerificationErrorMessages.TYPES.SERVER_ERROR];
31
+ }
32
+ if (!hashValid) errors.push(VerificationErrorMessages.TYPES.HASH);
33
+ if (!identityValid) errors.push(VerificationErrorMessages.TYPES.IDENTITY);
34
+ if (!issuedValid) {
35
+ if (ttVerify.utils.certificateRevoked(fragments) || certificateRevokedOnDidIdentified(fragments))
36
+ errors.push(VerificationErrorMessages.TYPES.REVOKED);
37
+ else if (ttVerify.utils.invalidArgument(fragments)) {
38
+ errors.push(VerificationErrorMessages.TYPES.INVALID_ARGUMENT);
39
+ } else if (ttVerify.utils.certificateNotIssued(fragments)) errors.push(VerificationErrorMessages.TYPES.ISSUED);
40
+ else if (!hashValid && !identityValid) {
41
+ return [VerificationErrorMessages.TYPES.INVALID];
42
+ } else {
43
+ return [VerificationErrorMessages.TYPES.ETHERS_UNHANDLED_ERROR];
44
+ }
45
+ }
46
+ return errors;
47
+ }, "OAErrorMessageHandling");
9
48
  const getW3CCredentialStatusFragment = ttVerify.utils.getFragmentByName(
10
49
  "W3CCredentialStatus"
11
50
  );
@@ -18,7 +57,7 @@ const w3cCredentialStatusSuspended = /* @__PURE__ */ __name((fragments) => {
18
57
  return issuedFragment?.reason?.code === w3cCredentialStatus.W3CCredentialStatusCode.DOCUMENT_SUSPENDED || issuedFragment?.reason?.code === w3cCredentialStatus.W3CCredentialStatusCode.DOCUMENT_REVOKED_AND_SUSPENDED;
19
58
  }, "w3cCredentialStatusSuspended");
20
59
  const errorMessageHandling = /* @__PURE__ */ __name((fragments) => {
21
- const { hashValid, issuedValid, identityValid } = tradetrustUtils.interpretFragments(fragments);
60
+ const { hashValid, issuedValid, identityValid } = interpretFragments(fragments);
22
61
  const errors = [];
23
62
  const isW3cFragments = fragments.some(
24
63
  (f) => f.name.startsWith("W3C") || f.name === "TransferableRecords"
@@ -26,29 +65,27 @@ const errorMessageHandling = /* @__PURE__ */ __name((fragments) => {
26
65
  if (isW3cFragments) {
27
66
  switch (true) {
28
67
  case w3cCredentialStatusRevoked(fragments):
29
- errors.push(tradetrustUtils.CONSTANTS.TYPES.REVOKED);
68
+ errors.push(errorMessages.errorMessages.TYPES.REVOKED);
30
69
  break;
31
70
  case w3cCredentialStatusSuspended(fragments):
32
- errors.push(tradetrustUtils.CONSTANTS.TYPES.SUSPENDED);
71
+ errors.push(errorMessages.errorMessages.TYPES.SUSPENDED);
33
72
  break;
34
73
  case !hashValid:
35
- errors.push(tradetrustUtils.CONSTANTS.TYPES.HASH);
74
+ errors.push(errorMessages.errorMessages.TYPES.HASH);
36
75
  break;
37
76
  case !identityValid:
38
- errors.push(tradetrustUtils.CONSTANTS.TYPES.IDENTITY);
77
+ errors.push(errorMessages.errorMessages.TYPES.IDENTITY);
39
78
  break;
40
79
  case !issuedValid:
41
- errors.push(tradetrustUtils.CONSTANTS.TYPES.INVALID);
80
+ errors.push(errorMessages.errorMessages.TYPES.INVALID);
42
81
  break;
43
82
  }
44
83
  return errors;
45
- } else return tradetrustUtils.errorMessageHandling(fragments);
84
+ } else return OAErrorMessageHandling(fragments);
46
85
  }, "errorMessageHandling");
47
86
 
48
- Object.defineProperty(exports, "interpretFragments", {
49
- enumerable: true,
50
- get: function () { return tradetrustUtils.interpretFragments; }
51
- });
87
+ exports.OAErrorMessageHandling = OAErrorMessageHandling;
52
88
  exports.errorMessageHandling = errorMessageHandling;
89
+ exports.interpretFragments = interpretFragments;
53
90
  exports.w3cCredentialStatusRevoked = w3cCredentialStatusRevoked;
54
91
  exports.w3cCredentialStatusSuspended = w3cCredentialStatusSuspended;
@@ -1,18 +1,70 @@
1
1
  'use strict';
2
2
 
3
- var tradetrustUtils = require('@tradetrust-tt/tradetrust-utils');
3
+ var ethers = require('ethers');
4
+ var fetch = require('node-fetch');
4
5
 
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
5
7
 
8
+ var fetch__default = /*#__PURE__*/_interopDefault(fetch);
6
9
 
7
- Object.defineProperty(exports, "calculateMaxFee", {
8
- enumerable: true,
9
- get: function () { return tradetrustUtils.calculateMaxFee; }
10
- });
11
- Object.defineProperty(exports, "gasStation", {
12
- enumerable: true,
13
- get: function () { return tradetrustUtils.gasStation; }
14
- });
15
- Object.defineProperty(exports, "scaleBigNumber", {
16
- enumerable: true,
17
- get: function () { return tradetrustUtils.scaleBigNumber; }
18
- });
10
+ var __defProp = Object.defineProperty;
11
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
12
+ const gasStation = /* @__PURE__ */ __name((gasStationUrl) => async () => {
13
+ try {
14
+ if (!gasStationUrl) return void 0;
15
+ const res = await fetch__default.default(gasStationUrl);
16
+ const data = await res.json();
17
+ return {
18
+ maxPriorityFeePerGas: safeParseUnits(data.standard.maxPriorityFee.toString(), 9),
19
+ maxFeePerGas: safeParseUnits(data.standard.maxFee.toString(), 9)
20
+ };
21
+ } catch {
22
+ throw new Error("Failed to fetch gas station");
23
+ }
24
+ }, "gasStation");
25
+ const safeParseUnits = /* @__PURE__ */ __name((_value, decimals) => {
26
+ const value = String(_value);
27
+ if (!value.match(/^[0-9.]+$/)) {
28
+ throw new Error(`invalid gwei value: ${_value}`);
29
+ }
30
+ const comps = value.split(".");
31
+ if (comps.length === 1) {
32
+ comps.push("");
33
+ }
34
+ if (comps.length !== 2) {
35
+ throw new Error(`invalid gwei value: ${_value}`);
36
+ }
37
+ while (comps[1].length < decimals) {
38
+ comps[1] += "0";
39
+ }
40
+ if (comps[1].length > 9 && !comps[1].substring(9).match(/^0+$/)) {
41
+ comps[1] = ethers.BigNumber.from(comps[1].substring(0, 9)).add(ethers.BigNumber.from(1)).toString();
42
+ }
43
+ return ethers.ethers.utils.parseUnits(`${comps[0]}.${comps[1]}`, decimals);
44
+ }, "safeParseUnits");
45
+ const scaleBigNumber = /* @__PURE__ */ __name((wei, multiplier, precision = 2) => {
46
+ if (wei === null || typeof wei === "undefined") {
47
+ throw new Error("Wei not specified");
48
+ }
49
+ const padding = Math.pow(10, precision);
50
+ const newMultiplier = Math.round(padding * multiplier);
51
+ const newWei = wei.mul(newMultiplier).div(padding);
52
+ return newWei;
53
+ }, "scaleBigNumber");
54
+ const calculateMaxFee = /* @__PURE__ */ __name((maxFee, priorityFee, scale) => {
55
+ if (maxFee === null || typeof maxFee === "undefined") {
56
+ throw new Error("Max Fee not specified");
57
+ }
58
+ if (priorityFee === null || typeof priorityFee === "undefined") {
59
+ throw new Error("Priority Fee not specified");
60
+ }
61
+ if (scale === 1) {
62
+ return maxFee;
63
+ }
64
+ const priorityFeeChange = scaleBigNumber(priorityFee, scale).sub(priorityFee);
65
+ return maxFee.add(priorityFeeChange);
66
+ }, "calculateMaxFee");
67
+
68
+ exports.calculateMaxFee = calculateMaxFee;
69
+ exports.gasStation = gasStation;
70
+ exports.scaleBigNumber = scaleBigNumber;
@@ -8,6 +8,7 @@ var errorMessages = require('./errorMessages');
8
8
  var documents = require('./documents');
9
9
  var gasStation = require('./gasStation');
10
10
  var awsKmsSigner = require('./aws-kms-signer');
11
+ var analytics = require('./analytics');
11
12
 
12
13
 
13
14
 
@@ -59,3 +60,9 @@ Object.keys(awsKmsSigner).forEach(function (k) {
59
60
  get: function () { return awsKmsSigner[k]; }
60
61
  });
61
62
  });
63
+ Object.keys(analytics).forEach(function (k) {
64
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
65
+ enumerable: true,
66
+ get: function () { return analytics[k]; }
67
+ });
68
+ });
@@ -1,12 +1,18 @@
1
1
  'use strict';
2
2
 
3
- var network = require('@tradetrust-tt/tradetrust-utils/constants/network');
3
+ const networks = [
4
+ "local",
5
+ "mainnet",
6
+ "matic",
7
+ "maticmum",
8
+ "amoy",
9
+ "sepolia",
10
+ "xdc",
11
+ "xdcapothem",
12
+ "stabilitytestnet",
13
+ "stability",
14
+ "astron",
15
+ "astrontestnet"
16
+ ];
4
17
 
5
-
6
-
7
- Object.keys(network).forEach(function (k) {
8
- if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
9
- enumerable: true,
10
- get: function () { return network[k]; }
11
- });
12
- });
18
+ exports.networks = networks;
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ const iconEthereum = "data:image/octet-stream;base64,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";
4
+ const iconPolygon = "data:image/octet-stream;base64,UklGRuIDAABXRUJQVlA4WAoAAAAgAAAAGwAAGwAASUNDUJACAAAAAAKQbGNtcwQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtkZXNjAAABCAAAADhjcHJ0AAABQAAAAE53dHB0AAABkAAAABRjaGFkAAABpAAAACxyWFlaAAAB0AAAABRiWFlaAAAB5AAAABRnWFlaAAAB+AAAABRyVFJDAAACDAAAACBnVFJDAAACLAAAACBiVFJDAAACTAAAACBjaHJtAAACbAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABwAAAAcAHMAUgBHAEIAIABiAHUAaQBsAHQALQBpAG4AAG1sdWMAAAAAAAAAAQAAAAxlblVTAAAAMgAAABwATgBvACAAYwBvAHAAeQByAGkAZwBoAHQALAAgAHUAcwBlACAAZgByAGUAZQBsAHkAAAAAWFlaIAAAAAAAAPbWAAEAAAAA0y1zZjMyAAAAAAABDEoAAAXj///zKgAAB5sAAP2H///7ov///aMAAAPYAADAlFhZWiAAAAAAAABvlAAAOO4AAAOQWFlaIAAAAAAAACSdAAAPgwAAtr5YWVogAAAAAAAAYqUAALeQAAAY3nBhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAApbcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltwYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKW2Nocm0AAAAAAAMAAAAAo9cAAFR7AABMzQAAmZoAACZmAAAPXFZQOCAsAQAA0AYAnQEqHAAcAD51NJZIJKKiISgIAJAOiWwAnTKEdJbM1CAbylWADni89c4WxZmtFIZBTwVdNi7B/6pMFDSAAP6cndoPasLV/veLzZaSG+2mxKD2fk7/4J3+Z2GPkSYUHZlR0TsNSACB4Ufuttmf2MK9zqJ2TOLvtgN/ffP+c4jf/0JYocrS5HDSjZJ/5w4r7MaPkV5xVL/WKStL3v+f+1/gjVXkgGLN3OFVZlH5GcDKHsuZkryL3BvMdAEjCnkCyYaqZt/X/N4v03hkpt3+vLxOeIYNT3f4r0xR/2pbc/6PPyM+r+pgJDlri+mHxIk9+PsxEW8gi2xTCt42Moyy5KMqf8G9R8HkT4goyfBzf1NC02SSSxrt+Xli8+Ro//H/SzA0fbjp5Dn8gAAA";
5
+ const iconXDC = "data:image/octet-stream;base64,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";
6
+ const iconStability = "data:image/png;base64,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";
7
+ const iconAstron = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABLCAYAAACGGCK3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAJVWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuYTg3MzFiOSwgMjAyMS8wOS8wOS0wMDozNzozOCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMy4wIChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjQtMTEtMDFUMTU6NTk6NDQrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjQtMTEtMDFUMTY6MDA6NDYrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI0LTExLTAxVDE2OjAwOjQ2KzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4MzdjMDRmNi1hYmVlLWNjNGQtYTVjMy0wYWIyNzAyNWY5OGEiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo1ODA4ZmFmMi1iMjEwLTQ4NDYtYTAxZC04MWM0ZTUyYWM4ZDgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplMWFjZDRjMy1iODBmLWIyNGQtODRkZi05ZjFmOGU4ZWVjYzQiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmUxYWNkNGMzLWI4MGYtYjI0ZC04NGRmLTlmMWY4ZThlZWNjNCIgc3RFdnQ6d2hlbj0iMjAyNC0xMS0wMVQxNTo1OTo0NCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIzLjAgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyM2NhNjU0Zi02N2YyLTc1NDUtOTUxMC1lYWQ0NGIyNTAwMzciIHN0RXZ0OndoZW49IjIwMjQtMTEtMDFUMTY6MDA6MTQrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMy4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MGZlNDllMGItMWM5NS1jNTRkLTkxMzMtNmQ1ZjEyMjY2YTgxIiBzdEV2dDp3aGVuPSIyMDI0LTExLTAxVDE2OjAwOjQ2KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjMuMCAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNvbnZlcnRlZCIgc3RFdnQ6cGFyYW1ldGVycz0iZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iZGVyaXZlZCIgc3RFdnQ6cGFyYW1ldGVycz0iY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgzN2MwNGY2LWFiZWUtY2M0ZC1hNWMzLTBhYjI3MDI1Zjk4YSIgc3RFdnQ6d2hlbj0iMjAyNC0xMS0wMVQxNjowMDo0NiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIzLjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowZmU0OWUwYi0xYzk1LWM1NGQtOTEzMy02ZDVmMTIyNjZhODEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6ZTFhY2Q0YzMtYjgwZi1iMjRkLTg0ZGYtOWYxZjhlOGVlY2M0IiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZTFhY2Q0YzMtYjgwZi1iMjRkLTg0ZGYtOWYxZjhlOGVlY2M0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+nXIWZAAACMRJREFUeJztmn90j9cdx19fEroojfwQEj9adNaSlT7EapTWOBqipYrVTupouq4c2p7ObNPnYI+y1El/MHJsmVZsDjaNH21nhklWauZZKTOGNUIiCUFbbWl+fPfHvdf3+T75Joxt7pn7Ouc597m/73Pf937u536TQDAYxKAPTW70AAzhGEE0wwiiGUYQzTCCaIYRRDOMIJphBNEMI4hmGEE0wwiiGUYQzTCCaIYRRDOMIJphBNEMI4hmGEE0wwiiGUYQzTCCaIYRRDOMIJphBNEMI4hmGEF0IxgMhj1+yqemBW7AsG4a/PPf6A45NanXaKCq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";
8
+
9
+ exports.iconAstron = iconAstron;
10
+ exports.iconEthereum = iconEthereum;
11
+ exports.iconPolygon = iconPolygon;
12
+ exports.iconStability = iconStability;
13
+ exports.iconXDC = iconXDC;