Skip to content
This repository has been archived by the owner on Dec 16, 2024. It is now read-only.

Commit

Permalink
Merge branch 'main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
tvtduy59 authored Nov 7, 2024
2 parents eb116ea + 6315dda commit d9297f8
Show file tree
Hide file tree
Showing 121 changed files with 4,872 additions and 8,570 deletions.
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v16
v18
9 changes: 7 additions & 2 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
{
"singleQuote": false,
"trailingComma": "es5"
}
"trailingComma": "es5",
"tabWidth": 2,
"semi": true,
"quoteProps": "as-needed",
"printWidth": 120,
"endOfLine": "lf"
}
5 changes: 1 addition & 4 deletions internal/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,7 @@ async function main(): Promise<void> {
},
{
retry(err, attempt): boolean {
console.error(
`fail to run fetcher for ${key}, retry ${attempt}...`,
err
);
console.error(`fail to run fetcher for ${key}, retry ${attempt}...`, err);
return true;
},
numOfAttempts: 3,
Expand Down
12,241 changes: 4,439 additions & 7,802 deletions package-lock.json

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@minswap/market-cap",
"version": "0.1.12",
"version": "0.1.13",
"description": "Transparent and accurate market cap for Cardano native tokens",
"main": "./build/index.js",
"module": "./build/index.es.js",
Expand All @@ -11,8 +11,8 @@
"scripts": {
"build": "rimraf build && rollup -c rollup.config.js",
"test": "jest",
"format": "prettier --write **/*.ts && eslint --fix --ext .ts .",
"check-format": "prettier --check **/*.ts && eslint --ext .ts .",
"format": "prettier --write {src,internal}/**/*.ts && eslint --fix --ext .ts .",
"check-format": "prettier --check {src,internal}/**/*.ts && eslint --ext .ts .",
"run-market-cap": "ts-node internal/main.ts",
"prepare": "husky install"
},
Expand Down Expand Up @@ -61,11 +61,11 @@
"jest": "^29.4.2",
"lint-staged": "^14.0.1",
"logfmt": "^1.3.2",
"prettier": "^2.8.4",
"prettier": "^2.8.8",
"rollup": "^2.70.2",
"rollup-plugin-dts": "^4.2.1",
"rollup-plugin-esbuild": "^4.9.1",
"ts-node": "^10.9.1",
"typescript": "^4.9.5"
}
}
}
377 changes: 127 additions & 250 deletions src/index.ts

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions src/tokens/ady.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const ADY =
"438514ae1beb020d35e5389993447cea29637d6272c918017988ef364164615969656c64";
const ADY = "438514ae1beb020d35e5389993447cea29637d6272c918017988ef364164615969656c64";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
Expand Down
6 changes: 3 additions & 3 deletions src/tokens/agix.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const circulating = await axios(
"https://tokensupply.singularitynet.io/tokensupply?tokensymbol=agix&q=circulatingsupply"
).then((res) => res.data.toString());
const total = await axios(
"https://tokensupply.singularitynet.io/tokensupply?tokensymbol=agix&q=totalsupply"
).then((res) => res.data.toString());
const total = await axios("https://tokensupply.singularitynet.io/tokensupply?tokensymbol=agix&q=totalsupply").then(
(res) => res.data.toString()
);
return {
circulating,
total,
Expand Down
3 changes: 1 addition & 2 deletions src/tokens/angels.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const ANGELS =
"285b65ae63d4fad36321384ec61edfd5187b8194fff89b5abe9876da414e47454c53";
const ANGELS = "285b65ae63d4fad36321384ec61edfd5187b8194fff89b5abe9876da414e47454c53";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
Expand Down
29 changes: 12 additions & 17 deletions src/tokens/ashib.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,22 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const ASHIB =
"afc910d7a306d20c12903979d4935ae4307241d03245743548e767834153484942";
const ASHIB = "afc910d7a306d20c12903979d4935ae4307241d03245743548e767834153484942";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
const total = 1_000_000_000_000;
const treasury_team_and_distributorsRaw = await getAmountInAddresses(
blockFrost,
ASHIB,
[
"addr1q9pyzv7p23c7sqsrd9y50pl9csefm5y9gs74t9zs7zqhxmlvevz8mzgjhfmjv87qdj45l7mfrfnv2v5dgr70uky86txqvfusqz", // community wallet
"addr1qxrlzwkmv826sps9sfjdg3cr8malcr2wmfvhvt0sqpd84xaq4rezcdmnr9f52x0zsgpz3zl8klrwjhmynksx5lhs5scsdqcx9d", // team 1
"addr1qy40nxgx8wk03xn0k0xega3l6fwrekwsyuuj7cyyhsz8fl2zhw8y7c92vew3fqwy7u4yrq66d2yt8wmd0tm3uyhsxapsy4t5ms", // team 2
"addr1qxpeczj2lluh88sa2g3tm0e3fj39c34rlctmvcszjs67g6wjj9djsz0020h68nz3rxknzdh93nryqzhq6h9z0nnzf0rshrectt", // tosidrop distribution
"addr1w9rerwzk0f5v4den9u2c7anv2d4dl88hq9cq0xgcmernsfsak7w6r", // dripdropz distribution
"addr1qyjhg2ge6w6tzwc9gwmddp5ha07zsawpd3pse7v9a0893jufgx9ne2hurkmz7adclf0tpehwdqwuhfejtph98vpfhulscdnlzz", // adalot exchange vending
"addr1q8xhjg9tn29a6vpv9e52xf8zn7hl7nqkv99kk4uac08myjud244wsz2v65xv0jc4tgjyfxrhgnmcav0upfcvcdv2d8qq7fqgh3", // adalot jackpot vending
"addr1qxkmr0m22xeqludcg5rjdmecjxasu9fat0680qehtcsnftaadgykewa9ufvegeuca9yyq03d9v7ea2y2zthgu7hfgjtsddp6gr", // minswap farm distribution
"addr1qx3wvec7uhweerzqaeezzepmrwft8sfpucgk50tsuluz8f8cfhlykwhxy66aazkjmfp4euf0yhpeezx3exncm7e69pvs7jetw6", // starcada distribution
]
);
const treasury_team_and_distributorsRaw = await getAmountInAddresses(blockFrost, ASHIB, [
"addr1q9pyzv7p23c7sqsrd9y50pl9csefm5y9gs74t9zs7zqhxmlvevz8mzgjhfmjv87qdj45l7mfrfnv2v5dgr70uky86txqvfusqz", // community wallet
"addr1qxrlzwkmv826sps9sfjdg3cr8malcr2wmfvhvt0sqpd84xaq4rezcdmnr9f52x0zsgpz3zl8klrwjhmynksx5lhs5scsdqcx9d", // team 1
"addr1qy40nxgx8wk03xn0k0xega3l6fwrekwsyuuj7cyyhsz8fl2zhw8y7c92vew3fqwy7u4yrq66d2yt8wmd0tm3uyhsxapsy4t5ms", // team 2
"addr1qxpeczj2lluh88sa2g3tm0e3fj39c34rlctmvcszjs67g6wjj9djsz0020h68nz3rxknzdh93nryqzhq6h9z0nnzf0rshrectt", // tosidrop distribution
"addr1w9rerwzk0f5v4den9u2c7anv2d4dl88hq9cq0xgcmernsfsak7w6r", // dripdropz distribution
"addr1qyjhg2ge6w6tzwc9gwmddp5ha07zsawpd3pse7v9a0893jufgx9ne2hurkmz7adclf0tpehwdqwuhfejtph98vpfhulscdnlzz", // adalot exchange vending
"addr1q8xhjg9tn29a6vpv9e52xf8zn7hl7nqkv99kk4uac08myjud244wsz2v65xv0jc4tgjyfxrhgnmcav0upfcvcdv2d8qq7fqgh3", // adalot jackpot vending
"addr1qxkmr0m22xeqludcg5rjdmecjxasu9fat0680qehtcsnftaadgykewa9ufvegeuca9yyq03d9v7ea2y2zthgu7hfgjtsddp6gr", // minswap farm distribution
"addr1qx3wvec7uhweerzqaeezzepmrwft8sfpucgk50tsuluz8f8cfhlykwhxy66aazkjmfp4euf0yhpeezx3exncm7e69pvs7jetw6", // starcada distribution
]);

const burnRaw = await getAmountInAddresses(blockFrost, ASHIB, [
"addr1w8qvvu0m5jpkgxn3hwfd829hc5kfp0cuq83tsvgk44752dsea0svn", // burn wallet
Expand Down
8 changes: 2 additions & 6 deletions src/tokens/axo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,8 @@ import { getAxiosInstance } from "../utils";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const axios = getAxiosInstance(options);
const circulating = await axios("https://api.axo.trade/axo/circulating").then(
(res) => res.data.toString()
);
const total = await axios("https://api.axo.trade/axo/total").then((res) =>
res.data.toString()
);
const circulating = await axios("https://api.axo.trade/axo/circulating").then((res) => res.data.toString());
const total = await axios("https://api.axo.trade/axo/total").then((res) => res.data.toString());
return {
circulating,
total,
Expand Down
3 changes: 1 addition & 2 deletions src/tokens/babysnek.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const BABYSNEK =
"7507734918533b3b896241b4704f3d4ce805256b01da6fcede43043642616279534e454b";
const BABYSNEK = "7507734918533b3b896241b4704f3d4ce805256b01da6fcede43043642616279534e454b";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
Expand Down
3 changes: 1 addition & 2 deletions src/tokens/bag.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const BAG =
"548c390391253aff00af9c95ae310f00803fd28035a6ed6f17c1e5e2424147";
const BAG = "548c390391253aff00af9c95ae310f00803fd28035a6ed6f17c1e5e2424147";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
Expand Down
5 changes: 2 additions & 3 deletions src/tokens/bet.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const BET =
"d542ad1dc269ae601125e8259cb8427c6b37c1d3569d10441df0291f4149";
const BET = "d542ad1dc269ae601125e8259cb8427c6b37c1d3569d10441df0291f4149";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
const total = 100_000_000;
const vestingRaw = await getAmountInAddresses(blockFrost, BET, [
"stake1uxxsyr4385z8syr3qs8k8vcpfqgxf8ddskknfyavm0apjcqvht2vw" // Treasury
"stake1uxxsyr4385z8syr3qs8k8vcpfqgxf8ddskknfyavm0apjcqvht2vw", // Treasury
]);

const vesting = Number(vestingRaw);
Expand Down
14 changes: 2 additions & 12 deletions src/tokens/boon.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const BOON =
"1cd92100fc05fce7416b3857a079780164eeaf8f5613f4b814f24e09426f6f6e436f696e";
const BOON = "1cd92100fc05fce7416b3857a079780164eeaf8f5613f4b814f24e09426f6f6e436f696e";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
Expand Down Expand Up @@ -45,16 +44,7 @@ const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const giveaway = Number(giveawayRaw);

return {
circulating: (
total -
donation -
farming -
liquidityPool -
marketing -
presale -
reserve -
giveaway
).toString(),
circulating: (total - donation - farming - liquidityPool - marketing - presale - reserve - giveaway).toString(),
total: total.toString(),
};
};
Expand Down
5 changes: 2 additions & 3 deletions src/tokens/box.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const BOX =
"f9a491442678bb2f90a3be676d1f888ce87330003ab7151f9efb3b68424f58";
const BOX = "f9a491442678bb2f90a3be676d1f888ce87330003ab7151f9efb3b68424f58";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
const total = 1e9;
const treasuryRaw = await getAmountInAddresses(blockFrost, BOX, [
"stake1uytg7kp24lqu4rnq9eyyc7ja2xzwshgrtrtmddr7zzlguqgzjqyyc"
"stake1uytg7kp24lqu4rnq9eyyc7ja2xzwshgrtrtmddr7zzlguqgzjqyyc",
]);
const treasury = Number(treasuryRaw);
return {
Expand Down
8 changes: 2 additions & 6 deletions src/tokens/bubble.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const BUBBLE =
"4fde92c2f6dbcfa2879b44f7453872b31394cfb2f70f1d4c411169ac427562626c65";
const BUBBLE = "4fde92c2f6dbcfa2879b44f7453872b31394cfb2f70f1d4c411169ac427562626c65";
const TEAM_AND_DISTRIBUTORS = [
"addr1qx42lkkh8qhnetve4cmx74mzqx4qkssxz9ltmsn8nmgcxxs6gw4tkslgkhp8m2pgkedxlhtx7e8k5dj5xn7yt88p54kq69nh0h", // team 1
"addr1qxzngvw7el7kj9j0egldcmgeygjh93vy8s0q7llerp0kan6zhw8y7c92vew3fqwy7u4yrq66d2yt8wmd0tm3uyhsxapsxl5pm3", // team 2
Expand All @@ -18,10 +17,7 @@ const TEAM_AND_DISTRIBUTORS = [
const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
const total = 100e6; // 100 million
const treasury =
Number(
await getAmountInAddresses(blockFrost, BUBBLE, TEAM_AND_DISTRIBUTORS)
) / 1e6;
const treasury = Number(await getAmountInAddresses(blockFrost, BUBBLE, TEAM_AND_DISTRIBUTORS)) / 1e6;
return {
circulating: (total - treasury).toString(),
total: total.toString(),
Expand Down
20 changes: 20 additions & 0 deletions src/tokens/burnz.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const TOKEN = "86340a33acf14b5c967584c9a20e984695ab3289696d138048f572be4255524e5a";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
const total = 1_000_000_000;
const treasuryRaw = await getAmountInAddresses(blockFrost, TOKEN, [
"addr1qxc6u2d5ppeuhg7tkj5quf3csxp2022g98az65hpad9m6yreuxes6p3hhg880tegsg95xqwek6srgac5jq04x9rcm2qq6a6md7", // TREASURY
"addr1qxtqu8cvxjxrh035s6f9k698rglpguz4xs8gw5edja2z6fp4x79ct53d3gpl0g3w4eyvnlv09nkjqvrkspfxjza3h0eqy34flk", // team
]);
const treasury = Number(treasuryRaw);
return {
circulating: (total - treasury).toString(),
total: total.toString(),
};
};

export default fetcher;
9 changes: 3 additions & 6 deletions src/tokens/c3.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
import { defaultFetcherOptions,SupplyFetcher } from "../types";
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const C3 =
"8e51398904a5d3fc129fbf4f1589701de23c7824d5c90fdb9490e15a434841524c4933";
const C3 = "8e51398904a5d3fc129fbf4f1589701de23c7824d5c90fdb9490e15a434841524c4933";
const TREASURY_ADDRESSES = [
"addr1q82wf56fmjxgv4xuhmdw5vsl8mkwvh8ag5q0hpm0t70kkj9kexs7kszymxq6f9400u4xkg5n428e92gkhk30x3m6h4ls6ya7lr",
];

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
const treasury =
Number(await getAmountInAddresses(blockFrost, C3, TREASURY_ADDRESSES)) /
1e6;
const treasury = Number(await getAmountInAddresses(blockFrost, C3, TREASURY_ADDRESSES)) / 1e6;
const total = 100_000_000;
return {
circulating: (total - treasury).toString(),
Expand Down
50 changes: 25 additions & 25 deletions src/tokens/catnip.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const CATNIP = "633f2e2c5280417c6b76055eda54fc07de984c122c01573ea4a9e8234361746e6970";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
const total = 900_000_000;
const treasuryRaw = await getAmountInAddresses(blockFrost, CATNIP, [
"stake178lgmc2vgwkvr9dll5keap2fvga7f6sanu0rt0902skr3ms56772e", // Treasury
]);

const burnRaw = await getAmountInAddresses(blockFrost, CATNIP, [
"addr1w8qmxkacjdffxah0l3qg8hq2pmvs58q8lcy42zy9kda2ylc6dy5r4", // burn address
]);

const treasury = Number(treasuryRaw);
const burn = Number(burnRaw);
return {
circulating: (total - treasury - burn).toString(),
total: (total - burn).toString(),
};
};

export default fetcher;
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const CATNIP = "633f2e2c5280417c6b76055eda54fc07de984c122c01573ea4a9e8234361746e6970";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
const total = 900_000_000;
const treasuryRaw = await getAmountInAddresses(blockFrost, CATNIP, [
"stake178lgmc2vgwkvr9dll5keap2fvga7f6sanu0rt0902skr3ms56772e", // Treasury
]);

const burnRaw = await getAmountInAddresses(blockFrost, CATNIP, [
"addr1w8qmxkacjdffxah0l3qg8hq2pmvs58q8lcy42zy9kda2ylc6dy5r4", // burn address
]);

const treasury = Number(treasuryRaw);
const burn = Number(burnRaw);
return {
circulating: (total - treasury - burn).toString(),
total: (total - burn).toString(),
};
};

export default fetcher;
3 changes: 1 addition & 2 deletions src/tokens/catsky.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const CATSKY =
"9b426921a21f54600711da0be1a12b026703a9bd8eb9848d08c9d921434154534b59";
const CATSKY = "9b426921a21f54600711da0be1a12b026703a9bd8eb9848d08c9d921434154534b59";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
Expand Down
4 changes: 2 additions & 2 deletions src/tokens/cerra.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
"stake1u8cja9hqxkm67aeyuw8uqudnmndua4nzpvlzdhrvejl842glyn9r8",
]);

const treasury = Number(treasuryRaw)/1e6;
const treasury = Number(treasuryRaw) / 1e6;
return {
circulating: (total - treasury).toString(),
total: (total).toString(),
total: total.toString(),
};
};

Expand Down
4 changes: 1 addition & 3 deletions src/tokens/cgi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@ const TREASURY_ADDRESSES = [
const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
const total = 5e6; // 5 million
const treasury =
Number(await getAmountInAddresses(blockFrost, CGI, TREASURY_ADDRESSES)) /
1e6;
const treasury = Number(await getAmountInAddresses(blockFrost, CGI, TREASURY_ADDRESSES)) / 1e6;
return {
circulating: (total - treasury).toString(),
total: total.toString(),
Expand Down
3 changes: 1 addition & 2 deletions src/tokens/charly.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { defaultFetcherOptions, SupplyFetcher } from "../types";
import { getAmountInAddresses, getBlockFrostInstance } from "../utils";

const CHARLY =
"89267e9a35153a419e1b8ffa23e511ac39ea4e3b00452e9d500f2982436176616c6965724b696e67436861726c6573";
const CHARLY = "89267e9a35153a419e1b8ffa23e511ac39ea4e3b00452e9d500f2982436176616c6965724b696e67436861726c6573";

const fetcher: SupplyFetcher = async (options = defaultFetcherOptions) => {
const blockFrost = getBlockFrostInstance(options);
Expand Down
Loading

0 comments on commit d9297f8

Please sign in to comment.