{"id":22725159,"url":"https://github.com/chase-manning/scaled-number","last_synced_at":"2025-07-06T22:36:40.823Z","repository":{"id":39802131,"uuid":"467892630","full_name":"chase-manning/scaled-number","owner":"chase-manning","description":"A class for managing large numbers with a decimal scale, useful for web3 development","archived":false,"fork":false,"pushed_at":"2023-08-29T11:09:41.000Z","size":417,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-24T01:16:58.329Z","etag":null,"topics":["arithmetic","big","big-number","bigint","bignumber","bignumbers","crypto","int","integer","number","operations","web3"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chase-manning.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-03-09T11:08:06.000Z","updated_at":"2024-11-12T16:27:49.000Z","dependencies_parsed_at":"2022-08-28T02:52:08.388Z","dependency_job_id":null,"html_url":"https://github.com/chase-manning/scaled-number","commit_stats":null,"previous_names":["backdfund/scaled-number"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chase-manning%2Fscaled-number","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chase-manning%2Fscaled-number/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chase-manning%2Fscaled-number/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chase-manning%2Fscaled-number/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chase-manning","download_url":"https://codeload.github.com/chase-manning/scaled-number/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246256188,"owners_count":20748207,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arithmetic","big","big-number","bigint","bignumber","bignumbers","crypto","int","integer","number","operations","web3"],"created_at":"2024-12-10T15:09:49.703Z","updated_at":"2025-03-29T23:22:49.748Z","avatar_url":"https://github.com/chase-manning.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Scaled Number\n\n[![npm package][npm-img]][npm-url]\n[![Build Status][build-img]][build-url]\n[![Downloads][downloads-img]][downloads-url]\n[![Issues][issues-img]][issues-url]\n[![Semantic Release][semantic-release-img]][semantic-release-url]\n\n[build-img]: https://github.com/backdfund/scaled-number/actions/workflows/cd.yml/badge.svg\n[build-url]: https://github.com/backdfund/scaled-number/actions/workflows/cd.yml\n[downloads-img]: https://img.shields.io/npm/dt/scaled-number\n[downloads-url]: https://www.npmtrends.com/scaled-number\n[npm-img]: https://img.shields.io/npm/v/scaled-number\n[npm-url]: https://www.npmjs.com/package/scaled-number\n[issues-img]: https://img.shields.io/github/issues/backdfund/scaled-number\n[issues-url]: https://github.com/backdfund/scaled-number/issues\n[semantic-release-img]: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\n[semantic-release-url]: https://github.com/semantic-release/semantic-release\n\nA class for managing large numbers with a decimal scale, useful for web3 development.\n\n## Install\n\n```bash\nyarn add scaled-number\n```\n\n## Basic Usage\n\n```ts\nimport { ScaledNumber } from 'scaled-number';\n\nconst scaledNumber = ScaledNumber.fromUnscaled(123);\nconsole.log(scaledNumber.mul(10).toString());\n```\n\n## Example Web3 Usage\n\n```ts\nimport { ScaledNumber } from 'scaled-number';\nimport { getTokenDecimals, getContract, getPrice } from \"helpers\";\n\nexport interface Pool {\n\tsymbol: string;\n\ttvl: ScaledNumber;\n\tapy: ScaledNumber;\n}\n\n// Returns some key info about a Pool\nexport const getPoolInfo = async (poolAddress: string): Pool =\u003e {\n  const pool = getContract(poolAddress);\n\n  // Getting Pool info\n  const [\n    underlyingAddress,\n    tvlBN,\n    apyBN\n  ] = await Promise.all([\n    pool.underlyingAddress(),\n    pool.tvl(),\n    pool.apy(),\n  ]);\n\n  // Getting the underlying info\n  const underlying = getContract(underlyingAddress);\n  const [\n    decimals,\n    symbol\n  ] = await Promise.all([\n    underlying.decimals(),\n    underlying.symbol()\n  ]);\n\n  // Getting the TVL as a Scaled Number (using the underlying decimals)\n  const tvl = new ScaledNumber(tvlBN, decimals);\n\n  // Getting the APY as a Scaled Number (uses default 18 decimals)\n  const apy = new ScaledNumber(apyBN);\n\n  return {\n    symbol\n    tvl,\n    apy\n  }\n}\n\n// Logs key information about a pool\nexport const logPoolInfo = async (pool: Pool): void =\u003e {\n  // Getting the price of the underlying\n  const price = await getPrice(pool.symbol);\n\n  console.log(`Underlying Balance: ${pool.tvl.toCryptoString()} ${pool.symbol}`);\n  // Output: `Underlying Balance: 12,456.87 ETH`\n\n  console.log(`TVL: ${pool.tvl.toCompactUsdValue(price)}`);\n  // Output: `TVL: $13.4m`\n\n  console.log(pool.apy.toPercent())\n  // Output: `24.34%`\n}\n```\n\n## Creating Scaled Number\n\n### From bigint\n\n```ts\nnew ScaledNumber(bigInt: bigint, decimals?: number);\n```\n\n```ts\nimport { ScaledNumber } from 'scaled-number';\n\nconst scaledNumber = new ScaledNumber(BigInt(123));\n```\n\n### From BigNumber\n\n```ts\nnew ScaledNumber(bigNumber: BigNumber, decimals?: number);\n```\n\n```ts\nimport { ScaledNumber } from 'scaled-number';\nimport { BigNumber } from '@ethersproject/bignumber';\n\nconst scaledNumber = new ScaledNumber(BigNumber.from(123));\n```\n\n### From Unscaled\n\n```ts\nfromUnscaled(value: number | string = 0, decimals = 18)\n```\n\n```ts\nimport { ScaledNumber } from 'scaled-number';\n\nconst scaledNumber = ScaledNumber.fromUnscaled(123, 8);\n```\n\n### From Plain\n\n```ts\nfromPlain(value: PlainScaledNumber)\n```\n\n```ts\nimport { ScaledNumber } from 'scaled-number';\n\nconst scaledNumber = ScaledNumber.fromPlain({\n  value: '123000000',\n  decimals: 6,\n});\n```\n\n## Manipulate\n\n### Add\n\n```ts\nadd(other: ScaledNumber)\n```\n\n```ts\nconst one = ScaledNumber.fromUnscaled(1);\nconst two = ScaledNumber.fromUnscaled(2);\n\nconst three = one.add(two);\n\nconsole.log(three.toString()); // 3\n```\n\n### Subtract\n\n```ts\nsub(other: ScaledNumber)\n```\n\n```ts\nconst three = ScaledNumber.fromUnscaled(3);\nconst two = ScaledNumber.fromUnscaled(2);\n\nconst one = three.sub(two);\n\nconsole.log(one.toString()); // 1\n```\n\n### Maximum\n\n```ts\nmax(other: ScaledNumber)\n```\n\n```ts\nconst three = ScaledNumber.fromUnscaled(3);\nconst two = ScaledNumber.fromUnscaled(2);\n\nconst max = three.max(two);\n\nconsole.log(max.toString()); // 3\n```\n\n### Mimimum\n\n```ts\nmin(other: ScaledNumber)\n```\n\n```ts\nconst three = ScaledNumber.fromUnscaled(3);\nconst two = ScaledNumber.fromUnscaled(2);\n\nconst min = three.min(two);\n\nconsole.log(min.toString()); // 2\n```\n\n### Multiply\n\n```ts\nmul(value: number | string | ScaledNumber)\n```\n\n```ts\nconst three = ScaledNumber.fromUnscaled(3);\n\nconst six = three.mul(2);\n\nconsole.log(six.toString()); // 6\n```\n\n### Divide\n\n```ts\ndiv(value: number | string | ScaledNumber)\n```\n\n```ts\nconst six = ScaledNumber.fromUnscaled(3);\n\nconst three = three.div(2);\n\nconsole.log(three.toString()); // 3\n```\n\n## Display\n\n### String\n\n```ts\ntoString(): string\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled(1.234);\n\nconsole.log(sn.toString()); // 1.234\n```\n\n### Number\n\n```ts\ntoNumber(): number\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled(1.234);\n\nconsole.log(sn.toNumber()); // 1.234\n```\n\n### Crypto String\n\n```ts\ntoCryptoString(): string\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('12345678.12345678');\n\nconsole.log(sn.toCryptoString()); // 12,345,678\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('12.12345678');\n\nconsole.log(sn.toCryptoString()); // 12.123\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('0.0000000123');\n\nconsole.log(sn.toCryptoString()); // 0.0000000123\n```\n\n### Crypto String\n\n```ts\ntoCryptoString(): string\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('12345678.12345678');\n\nconsole.log(sn.toCryptoString()); // 12,345,678\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('12.12345678');\n\nconsole.log(sn.toCryptoString()); // 12.123\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('0.0000000123');\n\nconsole.log(sn.toCryptoString()); // 0.0000000123\n```\n\n### USD Value\n\n```ts\ntoUsdValue(price: number): string\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('12345678.12345678');\n\nconsole.log(sn.toUsdValue(7)); // $86,419,746.86\n```\n\n### Compact USD Value\n\n```ts\ntoCompactUsdValue(price: number): string\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('12345678.12345678');\n\nconsole.log(sn.toCompactUsdValue(7)); // $86,4m\n```\n\n### Percent\n\n```ts\ntoPercent(): string\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('0.12345678');\n\nconsole.log(sn.toPercent()); // 12.34%\n```\n\n## Query\n\n### Value\n\n```ts\nvalue: bigint;\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('0.123', 5);\n\nconsole.log(sn.value.toString()); // 12300\n```\n\n### Decimals\n\n```ts\ndecimals: number;\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('0.123', 5);\n\nconsole.log(sn.decimals); // 5\n```\n\n### toPlain\n\n```ts\ntoPlain(): PlainScaledNumber\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('0.123', 5);\n\nconsole.log(sn.toPlain()); // { value: \"12300\", decimals: 5 }\n```\n\n### Is Zero\n\n```ts\nisZero(): boolean\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('0.123', 5);\n\nconsole.log(sn.isZero()); // false\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled();\n\nconsole.log(sn.isZero()); // true\n```\n\n### Is Negative\n\n```ts\nisNegative(): boolean\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('0.123', 5);\n\nconsole.log(sn.isNegative()); // false\n```\n\n```ts\nconst sn = ScaledNumber.fromUnscaled('-0.123', 5);\n\nconsole.log(sn.isNegative()); // true\n```\n\n### Equal\n\n```ts\neq(): boolean\n```\n\n```ts\nconst first = ScaledNumber.fromUnscaled(1);\nconst second = ScaledNumber.fromUnscaled(2);\n\nconsole.log(first.eq(second)); // false\n```\n\n```ts\nconst first = ScaledNumber.fromUnscaled(1);\nconst second = ScaledNumber.fromUnscaled(1);\n\nconsole.log(first.eq(second)); // true\n```\n\n### Greater Than\n\n```ts\ngt(): boolean\n```\n\n```ts\nconst first = ScaledNumber.fromUnscaled(1);\nconst second = ScaledNumber.fromUnscaled(2);\n\nconsole.log(first.gt(second)); // false\n```\n\n### Greater Than or Equal\n\n```ts\ngte(): boolean\n```\n\n```ts\nconst first = ScaledNumber.fromUnscaled(1);\nconst second = ScaledNumber.fromUnscaled(1);\n\nconsole.log(first.gte(second)); // true\n```\n\n### Less Than\n\n```ts\nlt(): boolean\n```\n\n```ts\nconst first = ScaledNumber.fromUnscaled(1);\nconst second = ScaledNumber.fromUnscaled(2);\n\nconsole.log(first.lt(second)); // true\n```\n\n### Less Than or Equal\n\n```ts\nlte(): boolean\n```\n\n```ts\nconst first = ScaledNumber.fromUnscaled(1);\nconst second = ScaledNumber.fromUnscaled(1);\n\nconsole.log(first.lte(second)); // true\n```\n\n### Less Than or Equal\n\n```ts\nlte(): boolean\n```\n\n```ts\nconst first = ScaledNumber.fromUnscaled(1);\nconst second = ScaledNumber.fromUnscaled(1);\n\nconsole.log(first.lte(second)); // true\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchase-manning%2Fscaled-number","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchase-manning%2Fscaled-number","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchase-manning%2Fscaled-number/lists"}