From 24b132f138d9541ca3db8d6088352d08128d49c0 Mon Sep 17 00:00:00 2001 From: Sebastian Pape Date: Tue, 10 Aug 2021 11:14:56 +0200 Subject: [PATCH] v2.1.0: adds `readable` to create human-readable numbers from BigInt --- README.md | 36 ++++++++++ dist/cjs/index.js | 24 ++++++- dist/es/index.js | 24 ++++++- dist/umd/index.js | 24 ++++++- package.json | 2 +- src/Token.js | 24 ++++++- .../blockchains/bsc/BEP20/readable.spec.js | 65 +++++++++++++++++++ .../ethereum/ERC20/readable.spec.js | 65 +++++++++++++++++++ tests/units/standards.spec.js | 16 +++++ 9 files changed, 271 insertions(+), 9 deletions(-) create mode 100644 tests/units/blockchains/bsc/BEP20/readable.spec.js create mode 100644 tests/units/blockchains/ethereum/ERC20/readable.spec.js create mode 100644 tests/units/standards.spec.js diff --git a/README.md b/README.md index 20bc12f..311651e 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,31 @@ Token.BigNumber({ }) // BigNumber '1000000000000000000' ``` +### readable + +Provides a human readable amount based on a given BigInt number. + +- Ending zeros will be eliminated `1.30000` -> `1.3` + +- Decimals are dropped if there are none `1.00000` -> `1` + +```javascript +Token.readable({ + amount: '1231211111210000000', + blockchain: 'ethereum', + address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' +}) // "1.23121111121" +``` + +```javascript +let token = new Token({ + blockchain: 'ethereum', + address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' +}) + +token.readable('1231211111210000000') // "1.23121111121" +``` + ### Token Standards `depay-web3-tokens` exports standard token apis, like `ERC20`, `BEP20` etc.: @@ -123,6 +148,17 @@ Token.ethereum.ERC20 // [...] ERC20 ABI Token.bsc.BEP20 // [...] BEP20 ABI ``` +`DEFAULT` references the broad default token standard on the respective blockchain: + +```javascript +import { Token } from 'depay-web3-tokens' + +Token.ethereum.DEFAULT // ERC20 +Token.bsc.DEFAULT // BEP20 + +Token[blockchain].DEFAULT +``` + ## Development ### Get started diff --git a/dist/cjs/index.js b/dist/cjs/index.js index fe34872..1f15755 100644 --- a/dist/cjs/index.js +++ b/dist/cjs/index.js @@ -651,6 +651,14 @@ class Token { let decimals = await this.decimals(); return ethers.ethers.utils.parseUnits(amount.toString(), decimals) } + + async readable(amount) { + let decimals = await this.decimals(); + let readable = ethers.ethers.utils.formatUnits(amount.toString(), decimals); + readable = readable.replace(/0+$/, ''); + readable = readable.replace(/\.$/, ''); + return readable + } } Token.BigNumber = async ({ amount, blockchain, address }) => { @@ -658,7 +666,19 @@ Token.BigNumber = async ({ amount, blockchain, address }) => { return token.BigNumber(amount) }; -Token.ethereum = { ERC20 }; -Token.bsc = { BEP20 }; +Token.readable = async ({ amount, blockchain, address }) => { + let token = new Token({ blockchain, address }); + return token.readable(amount) +}; + +Token.ethereum = { + DEFAULT: ERC20, + ERC20 +}; + +Token.bsc = { + DEFAULT: BEP20, + BEP20 +}; exports.Token = Token; diff --git a/dist/es/index.js b/dist/es/index.js index dccde68..72918c9 100644 --- a/dist/es/index.js +++ b/dist/es/index.js @@ -647,6 +647,14 @@ class Token { let decimals = await this.decimals(); return ethers.utils.parseUnits(amount.toString(), decimals) } + + async readable(amount) { + let decimals = await this.decimals(); + let readable = ethers.utils.formatUnits(amount.toString(), decimals); + readable = readable.replace(/0+$/, ''); + readable = readable.replace(/\.$/, ''); + return readable + } } Token.BigNumber = async ({ amount, blockchain, address }) => { @@ -654,7 +662,19 @@ Token.BigNumber = async ({ amount, blockchain, address }) => { return token.BigNumber(amount) }; -Token.ethereum = { ERC20 }; -Token.bsc = { BEP20 }; +Token.readable = async ({ amount, blockchain, address }) => { + let token = new Token({ blockchain, address }); + return token.readable(amount) +}; + +Token.ethereum = { + DEFAULT: ERC20, + ERC20 +}; + +Token.bsc = { + DEFAULT: BEP20, + BEP20 +}; export { Token }; diff --git a/dist/umd/index.js b/dist/umd/index.js index ddcd542..c528506 100644 --- a/dist/umd/index.js +++ b/dist/umd/index.js @@ -648,6 +648,14 @@ let decimals = await this.decimals(); return ethers.ethers.utils.parseUnits(amount.toString(), decimals) } + + async readable(amount) { + let decimals = await this.decimals(); + let readable = ethers.ethers.utils.formatUnits(amount.toString(), decimals); + readable = readable.replace(/0+$/, ''); + readable = readable.replace(/\.$/, ''); + return readable + } } Token.BigNumber = async ({ amount, blockchain, address }) => { @@ -655,8 +663,20 @@ return token.BigNumber(amount) }; - Token.ethereum = { ERC20 }; - Token.bsc = { BEP20 }; + Token.readable = async ({ amount, blockchain, address }) => { + let token = new Token({ blockchain, address }); + return token.readable(amount) + }; + + Token.ethereum = { + DEFAULT: ERC20, + ERC20 + }; + + Token.bsc = { + DEFAULT: BEP20, + BEP20 + }; exports.Token = Token; diff --git a/package.json b/package.json index 9d62255..64bf377 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "depay-web3-tokens", "moduleName": "Web3Tokens", - "version": "2.0.2", + "version": "2.1.0", "description": "JavaScript library providing basic functionalities to interact with web3 tokens.", "main": "dist/cjs/index.js", "module": "dist/es/index.js", diff --git a/src/Token.js b/src/Token.js index 2c8e8c1..2113a9b 100644 --- a/src/Token.js +++ b/src/Token.js @@ -136,6 +136,14 @@ class Token { let decimals = await this.decimals() return ethers.utils.parseUnits(amount.toString(), decimals) } + + async readable(amount) { + let decimals = await this.decimals() + let readable = ethers.utils.formatUnits(amount.toString(), decimals) + readable = readable.replace(/0+$/, '') + readable = readable.replace(/\.$/, '') + return readable + } } Token.BigNumber = async ({ amount, blockchain, address }) => { @@ -143,7 +151,19 @@ Token.BigNumber = async ({ amount, blockchain, address }) => { return token.BigNumber(amount) } -Token.ethereum = { ERC20 } -Token.bsc = { BEP20 } +Token.readable = async ({ amount, blockchain, address }) => { + let token = new Token({ blockchain, address }) + return token.readable(amount) +} + +Token.ethereum = { + DEFAULT: ERC20, + ERC20 +} + +Token.bsc = { + DEFAULT: BEP20, + BEP20 +} export default Token diff --git a/tests/units/blockchains/bsc/BEP20/readable.spec.js b/tests/units/blockchains/bsc/BEP20/readable.spec.js new file mode 100644 index 0000000..da4c209 --- /dev/null +++ b/tests/units/blockchains/bsc/BEP20/readable.spec.js @@ -0,0 +1,65 @@ +import { Token } from '../../../../../src' +import BEP20 from '../../../../../src/blockchains/bsc/BEP20' +import { mock, resetMocks } from 'depay-web3-mock' + +describe('readable', () => { + + beforeEach(resetMocks) + afterEach(resetMocks) + + let blockchain = 'bsc' + + beforeEach(()=> { + mock({ + blockchain, + call: { + to: '0xa0bEd124a09ac2Bd941b10349d8d224fe3c955eb', + api: BEP20, + method: 'decimals', + return: 18 + } + }) + }) + + it('turns a given BigInt number into a human-readable number', async ()=> { + + expect( + (await Token.readable({ + amount: '1231251211232111000000000', + blockchain, + address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' + })).toString() + ).toEqual('1231251.211232111') + + expect( + await (new Token({ blockchain, address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' })) + .readable('1231251211232111000000000') + ).toEqual('1231251.211232111') + + expect( + (await Token.readable({ + amount: '1231251000000000000000000', + blockchain, + address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' + })).toString() + ).toEqual('1231251') + + expect( + await (new Token({ blockchain, address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' })) + .readable('1231251000000000000000000') + ).toEqual('1231251') + + expect( + (await Token.readable({ + amount: '1231251100000000000000000', + blockchain, + address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' + })).toString() + ).toEqual('1231251.1') + + expect( + await (new Token({ blockchain, address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' })) + .readable('1231251100000000000000000') + ).toEqual('1231251.1') + }) +}); diff --git a/tests/units/blockchains/ethereum/ERC20/readable.spec.js b/tests/units/blockchains/ethereum/ERC20/readable.spec.js new file mode 100644 index 0000000..bc863b5 --- /dev/null +++ b/tests/units/blockchains/ethereum/ERC20/readable.spec.js @@ -0,0 +1,65 @@ +import { Token } from '../../../../../src' +import ERC20 from '../../../../../src/blockchains/ethereum/ERC20' +import { mock, resetMocks } from 'depay-web3-mock' + +describe('readable', () => { + + beforeEach(resetMocks) + afterEach(resetMocks) + + let blockchain = 'ethereum' + + beforeEach(()=> { + mock({ + blockchain, + call: { + to: '0xa0bEd124a09ac2Bd941b10349d8d224fe3c955eb', + api: ERC20, + method: 'decimals', + return: 18 + } + }) + }) + + it('turns a given BigInt number into a human-readable number', async ()=> { + + expect( + (await Token.readable({ + amount: '1231251211232111000000000', + blockchain, + address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' + })).toString() + ).toEqual('1231251.211232111') + + expect( + await (new Token({ blockchain, address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' })) + .readable('1231251211232111000000000') + ).toEqual('1231251.211232111') + + expect( + (await Token.readable({ + amount: '1231251000000000000000000', + blockchain, + address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' + })).toString() + ).toEqual('1231251') + + expect( + await (new Token({ blockchain, address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' })) + .readable('1231251000000000000000000') + ).toEqual('1231251') + + expect( + (await Token.readable({ + amount: '1231251100000000000000000', + blockchain, + address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' + })).toString() + ).toEqual('1231251.1') + + expect( + await (new Token({ blockchain, address: '0xa0bed124a09ac2bd941b10349d8d224fe3c955eb' })) + .readable('1231251100000000000000000') + ).toEqual('1231251.1') + }) +}); diff --git a/tests/units/standards.spec.js b/tests/units/standards.spec.js new file mode 100644 index 0000000..eb1680d --- /dev/null +++ b/tests/units/standards.spec.js @@ -0,0 +1,16 @@ +import { Token } from 'src' + +describe('Token', () => { + describe('standards', () => { + + it('exports the "ethreum" standard token', async ()=> { + expect(typeof(Token.ethereum.DEFAULT) != 'undefined').toEqual(true) + expect(Token.ethereum.DEFAULT).toEqual(Token.ethereum.ERC20) + }) + + it('exports the "bsc" standard token', async ()=> { + expect(typeof(Token.bsc.DEFAULT) != 'undefined').toEqual(true) + expect(Token.bsc.DEFAULT).toEqual(Token.bsc.BEP20) + }) + }) +})