Skip to content

Commit

Permalink
v2.1.0: adds readable to create human-readable numbers from BigInt
Browse files Browse the repository at this point in the history
  • Loading branch information
10xSebastian committed Aug 10, 2021
1 parent db3c0b5 commit 24b132f
Show file tree
Hide file tree
Showing 9 changed files with 271 additions and 9 deletions.
36 changes: 36 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.:
Expand All @@ -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
Expand Down
24 changes: 22 additions & 2 deletions dist/cjs/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -651,14 +651,34 @@ 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 }) => {
let token = new Token({ 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;
24 changes: 22 additions & 2 deletions dist/es/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -647,14 +647,34 @@ 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 }) => {
let token = new Token({ 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 };
24 changes: 22 additions & 2 deletions dist/umd/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -648,15 +648,35 @@
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 }) => {
let token = new Token({ 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;

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
24 changes: 22 additions & 2 deletions src/Token.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,14 +136,34 @@ 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 }) => {
let token = new Token({ 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
65 changes: 65 additions & 0 deletions tests/units/blockchains/bsc/BEP20/readable.spec.js
Original file line number Diff line number Diff line change
@@ -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')
})
});
65 changes: 65 additions & 0 deletions tests/units/blockchains/ethereum/ERC20/readable.spec.js
Original file line number Diff line number Diff line change
@@ -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')
})
});
16 changes: 16 additions & 0 deletions tests/units/standards.spec.js
Original file line number Diff line number Diff line change
@@ -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)
})
})
})

0 comments on commit 24b132f

Please sign in to comment.