Skip to content

anhlh-edsolabs/encoding-helper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Encoding & Hashing Helper

Utility libraries for Solidity smart contract


I. Usage

1. Installation

yarn add -D encoding-helper

2. Import the libraries in your script

const { encodingHelper, hashingHelper, txUtils } = require('encoding-helper');

II. Function list

A. EncodingHelper

1. toBytes10Name(name: string): string

Convert a string with maximum 10 characters into a 10-bytes hex string. If the input string length is less than 10 characters, the result will be padded with trailing zeros, while with input string greater than 10 characters, the excess will be truncated before encoding.

  • Example:
encodingHelper.toBytes10Name("Lorem")
==> '0x4c6f72656d0000000000'

encodingHelper.toBytes10Name("LoremIpsumDolorSit")
==> '0x4c6f72656d497073756d'

2. first10(address: string): string

Get the first 10-byte string from an address string.

  • Example:
encodingHelper.first10('0xECEfEf2074f56ced5A5e68De3Aff44ed5798B35E')
==> '0xecefef2074f56ced5a5e'

3. getId(name: string, index: uint16, token: string, product: string): BigNumber

Generate a BigNumber id from a name, an index, a token address, and a product contract address.

  • Example:
encodingHelper.getId('Lorem', 65535, '0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972','0x6846ceF88276D453e38B92F4BFe70D29643571B8')

==> BigNumber {
        _hex: '0x4c6f72656d0000000000ffffdef0e171272f6f9061636846cef88276d453e38b',
        _isBigNumber: true
    }
==> '34572686050035833475315598151429145236062344499814420574865813453149958300555'

4. last10(id: BigNumber): string

Get the last 10-byte string from an id. Usually used for validating the product contract address.

  • Example:
let id = encodingHelper.getId('Lorem', 65535,'0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972','0x6846ceF88276D453e38B92F4BFe70D29643571B8');

encodingHelper.last10(id);
==> '0x6846cef88276d453e38b'

5. decodeId(id: BigNumber | string): string[]

Recover the information used to generate the id.

  • Example:
let id = encodingHelper.getId('Lorem', 65535,'0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972','0x6846ceF88276D453e38B92F4BFe70D29643571B8');
==> BigNumber {
        _hex: '0x4c6f72656d0000000000ffffdef0e171272f6f9061636846cef88276d453e38b',
        _isBigNumber: true
    }
==> '34572686050035833475315598151429145236062344499814420574865813453149958300555'

encodingHelper.decodeId('0x4c6f72656d0000000000ffffdef0e171272f6f9061636846cef88276d453e38b');
==> [
        'Lorem', 65535,
        '0xdef0e171272f6f906163',
        '0x6846cef88276d453e38b'
    ]

encodingHelper.decodeId('34572686050035833475315598151429145236062344499814420574865813453149958300555');
==> [
        'Lorem', 65535,
        '0xdef0e171272f6f906163',
        '0x6846cef88276d453e38b'
    ]

encodingHelper.decodeId(id);
==> [
        'Lorem', 65535,
        '0xdef0e171272f6f906163',
        '0x6846cef88276d453e38b'
    ]

6. getProductId(name: string, token: string, product: string): string

Get the productId generated by combining name, token address, and product address. If the name's length is lesser or equal to 10, it is converted to a bytes10 value. If name is longer than 10 characters, it is hashed using keccak256 function and take the first 10 bytes.

  • Example
// Name <= 10 characters
encodingHelper.getProductId('LoremIpsum', '0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972', '0x6846ceF88276D453e38B92F4BFe70D29643571B8')
==> '0x4c6f72656d497073756d0000def0e171272f6f9061636846cef88276d453e38b'

// Name > 10 characters
encodingHelper.getProductId('LoremIpsumDolorsitAmet', '0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972', '0x6846ceF88276D453e38B92F4BFe70D29643571B8')
==> '0x872b837047e81dd64a950000def0e171272f6f9061636846cef88276d453e38b'

7. getNameHashFromId(hexId: string): string

Return the encoded name (first 10 bytes) from hexId

  • Example
encodingHelper.getNameHashFromId('0x872b837047e81dd64a950000def0e171272f6f9061636846cef88276d453e38b')
==> '0x872b837047e81dd64a95'

8. verifyProductId(id: string, name: string, token: string, product: string): boolean

Return true if the id encoded from 6. can be decoded and matches the value of name, token, and product

  • Example:
// Name <= 10 characters
encodingHelper.verifyProductId('0x4c6f72656d497073756d0000def0e171272f6f9061636846cef88276d453e38b', 'LoremIpsum', '0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972', '0x6846ceF88276D453e38B92F4BFe70D29643571B8')
==> true

// Name > 10 characters
encodingHelper.verifyProductId('0x872b837047e81dd64a950000def0e171272f6f9061636846cef88276d453e38b', 'LoremIpsumDolorsitAmet', '0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972', '0x6846ceF88276D453e38B92F4BFe70D29643571B8')
==> true

// Name > 10 characters and does not match
encodingHelper.verifyProductId('0x872b837047e81dd64a950000def0e171272f6f9061636846cef88276d453e38b', 'LoremIpsumDolorsit', '0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972', '0x6846ceF88276D453e38B92F4BFe70D29643571B8')
==> false

// Name, token, and product don't match
encodingHelper.verifyProductId('0x872b837047e81dd64a950000def0e171272f6f9061636846cef88276d453e38b', 'LoremIpsumDolorsit', '0x6846ceF88276D453e38B92F4BFe70D29643571B8', '0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972')
==> false

9. keccak256(input: string): string

Returns the keccak256 hash of the input string. This function is a shortcut to ethers.utils.keccak256(BytesLike) from ethers.js library.

  • Example:
encodingHelper.keccak256("Lorem");
==> '0x53e60f9a9472b58c06a7620335d85ec3c20c4f93c0ac735d7a6622f2ef5b67c6'

10. pack(types: string[], values: any[]): string

This is a short cut to ethers.utils.solidityPack(string[], any[]).

  • Example:
hashingHelper.pack(["address", "string"], ['0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972', "LoremIpsum"]);
==> '0xdef0e171272f6f906163a2ab4cd82a3ff85a39724c6f72656d497073756d'

11. stringToBytes10orHash(input: string): string

Convert the UTF-8 input string into a 10-bytes hex string. If the input string is lesser than or equal to 10 characters in length, the output is the direct hex-encoding of the input. If the input has more than 10 characters, it is hashed using keccak256 and take the first 10 bytes.

  • Example
// Input <= 10 characters
encodingHelper.stringToBytes10orHash('LoremIpsum')
==> '0x4c6f72656d497073756d'

// Input > 10 characters
encodingHelper.stringToBytes10orHash('LoremIpsumDolorsitAmet')
==> '0x872b837047e81dd64a95'

12. stringToBytes(input: string, length: uint): string

Convert the UTF-8 input string into a hex string representation of a bytes value with specified length. The length must not exceed input's length.

  • Example:
encodingHelper.stringToBytes('Lorem Ipsum dolor sit amet. Consectetur adispicing elit', 10);
==> '0x4c6f72656d2049707375'

13. hexToString(hexString: string): string

Convert a hexString input into UTF-8 string value and remove any null characters (\x00) from the result.

  • Example:
encodingHelper.hexToString('0x4c6f72656d2049707375');
==> 'Lorem Ipsu'

encodingHelper.hexToString('0x4c6f72656d0000000000');
==> 'Lorem'

14. encodeCryptoPayload(name: string, index: uint16, token: address, product: address, autoswap: bool | false): string

Encode a payload data that consists of name, index, token, product, autoswap into a hex string for Crypto currency deposit.

  • name: product name
  • index: account index
  • token: target token address
  • product: target product address
  • autoswap: enable/disable autoswap
encodeCryptoPayload('LOREM', 10, '0x1CBDD079370932F90A19902bA12D20c5D3716833', '0x625384874d83fccfFe55778F72B7C7f4dAb1CdBd', true)
==> '0x4c4f52454d0000000000000a1cbdd079370932f90a19625384874d83fccffe550000000000000000000000001cbdd079370932f90a19902ba12d20c5d3716833000000000000000000000000625384874d83fccffe55778f72b7c7f4dab1cdbd0000000000000000000000000000000000000000000000000000000000000001'

15. decodeCryptoPayload(payloadHex: string): : (string | (string | number)[])[]

Decode a payload hex string to its original values.

decodeCryptoPayload('0x4c4f52454d0000000000000a1cbdd079370932f90a19625384874d83fccffe550000000000000000000000001cbdd079370932f90a19902ba12d20c5d3716833000000000000000000000000625384874d83fccffe55778f72b7c7f4dab1cdbd0000000000000000000000000000000000000000000000000000000000000001')
==> [
        [ 'LOREM', 10, '0x1cbdd079370932f90a19', '0x625384874d83fccffe55' ],
        '0x4c4f52454d0000000000000a1cbdd079370932f90a19625384874d83fccffe55',
        '0x1CBDD079370932F90A19902bA12D20c5D3716833',
        '0x625384874d83fccfFe55778F72B7C7f4dAb1CdBd',
        true
    ]

16. encodeBankPayload(name: string, index: uint16, token: address, product: address, account: address): string

Encode a payload data that consists of name, index, token, product, account into a hex string

  • name: product name

  • index: account index

  • token: target token address

  • product: target product address

  • account: recipient

  • Example:

encodingHelper.encodeBankPayload('Lorem', 65535,'0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972','0x6846ceF88276D453e38B92F4BFe70D29643571B8', '0xB34C74d889177ec905FEB41791936BCce1d7A5df')
==> '0x4c6f72656d0000000000ffffdef0e171272f6f9061636846cef88276d453e38b000000000000000000000000def0e171272f6f906163a2ab4cd82a3ff85a39720000000000000000000000006846cef88276d453e38b92f4bfe70d29643571b8000000000000000000000000b34c74d889177ec905feb41791936bcce1d7a5df'

17. decodeBankPayload(payloadHex: string): (string | (string | number)[])[]

Decode a payload hex string to its original values.

  • Example:
let encodedPayload = encodingHelper.encodePayload('Lorem', 0, '0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972', '0x6846ceF88276D453e38B92F4BFe70D29643571B8', '0xB34C74d889177ec905FEB41791936BCce1d7A5df')
==> '0x4c6f72656d00000000000000def0e171272f6f9061636846cef88276d453e38b000000000000000000000000def0e171272f6f906163a2ab4cd82a3ff85a39720000000000000000000000006846cef88276d453e38b92f4bfe70d29643571b8000000000000000000000000b34c74d889177ec905feb41791936bcce1d7a5df'

encodingHelper.decodePayload(encodedPayload)
==> [
        [ 'Lorem', 0, '0xdef0e171272f6f906163', '0x6846cef88276d453e38b' ],
        '0x4c6f72656d00000000000000def0e171272f6f9061636846cef88276d453e38b',
        '0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972',
        '0x6846ceF88276D453e38B92F4BFe70D29643571B8',
        '0xB34C74d889177ec905FEB41791936BCce1d7A5df'
    ]

B. HashingHelper

1. toRoleHash(address: string, name: string): string

Calculate a Hash based on current account/contract address and a name string.

  • Example:
hashingHelper.toRoleHash('0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972', 'DEFAULT_SETTER_ROLE');
==> '0x6346e2e51a432d68c7d12ad11ff4bdf844f7e26e092c0d9787d0397d116098e1'

3. toBytes32Key(keyString: string): string

Convert keyString string into a 32-bytes Hex string.

  • Example:
hashingHelper.toBytes32Key('Lorem Ipsum dolor sit amet. Cons');
==> '0x4c6f72656d20497073756d20646f6c6f722073697420616d65742e20436f6e73'

If the input string is longer than 32 bytes, only the first 32 bytes will be used to create the bytes32 value.

hashingHelper.toBytes32Key('Lorem Ipsum dolor sit amet. Consectetur adispicing elit')
==> '0x4c6f72656d20497073756d20646f6c6f722073697420616d65742e20436f6e73'

4. toBytes32Value(nameString: string, index: uint16, address: string): string

Pack the first 10 bytes of the nameString, the uint16 representation of index, and the address string into a bytes32 value.

  • Example:
hashingHelper.toBytes32Value('LoremIpsum', 65535, '0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972');
==> '0x4c6f72656d497073756dffffdef0e171272f6f906163a2ab4cd82a3ff85a3972'

5. recoverOriginalValues(bytes32HexValue: hexString): (string | numbere)[]

Recover the data that was packed in the previous function toBytes32Value

  • Example:
hashingHelper.recoverOriginalValues('0x4c6f72656d497073756dffffdef0e171272f6f906163a2ab4cd82a3ff85a3972');
==> [ 
        'LoremIpsum', 
        65535, 
        '0xDEF0e171272f6f906163a2ab4cd82a3fF85a3972' 
    ]

C. TxUtils

1. getRevertReason(provider: Provider | string, txnHash: string): string

Get the revert reason from a failed transaction by the provided txnHash. Note: provider can be a Provider object or an RPC url string

  • Example:
await txUtils.getRevertReason(provider, '0x7e9e75da5aed836d34d961d61d66b3108115c395cff03aa058fd794e800ba68d')
==> Failed to submit transaction: cannot estimate transaction: AccessControl: account 0xdec0da618b4fc8ff14028a5e27ca7e6a6d6b68d7 is missing role 0x0000000000000000000000000000000000000000000000000000000000000000.

2. getImplementationAddress(provider: Provider, proxyAddress: string)

Get the implementation address from a proxy contract with proxyAddress

  • Example:
> await txUtils.getImplementationAddress(provider, '0xc4999A3631c017C45B5Ff3363eda6e8B9d81208E')
==> '0xa2BE51DBc0C901b75C7AD6a96a0BF66947ba20ba'

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published