UNPKG

@nitin-spheron/desub-js

Version:

Typescript library for working with the decentralised subscription contracts in Spheron

149 lines (141 loc) 5.75 kB
import 'mocha' import { assert, expect } from 'chai' import chai from 'chai' import Vendor from '../vendors/ethers' import { Contract } from '../interfaces' import { Provider, getDefaultProvider } from '@ethersproject/providers' import { Signer } from '@ethersproject/abstract-signer' import { Wallet } from '@ethersproject/wallet' import { BigNumber } from '@ethersproject/bignumber' import { DiscountDataClass } from '../vendors/discount-data' import { ethers } from 'ethers' import { metaTransactionType } from '../constants/subscription' // eslint-disable-next-line @typescript-eslint/no-var-requires chai.use(require('chai-bignumber')()) describe('Ethers Provider abstraction', async () => { let vendor: Vendor let signer: Signer let provider: Provider before(() => { provider = getDefaultProvider() signer = Wallet.createRandom().connect(provider) vendor = new Vendor(provider, signer) }) it('constructs', () => { assert.equal(vendor.provider, provider) assert.equal(vendor.signer, signer) }) it('returns a low level contract', () => { const abi = ['function balanceOf(address owner) view returns (uint256)'] const contract: Contract = vendor.contract('0x123', abi) assert.isNotNull(contract) assert.equal(contract.address, '0x123') }) it('returns a big number from string', () => { const number = '10' const result = vendor.convertToBN(number) assert.isNotNull(result) expect(result.toString()).to.be.equal(BigNumber.from(number).toString()) }) it('returns eth value converted to wei', () => { const number = '10.04' const result = vendor.convertToWei(number, 18) const wei = BigNumber.from(1004).mul(BigNumber.from(`10`).pow(16)) assert.isNotNull(result) expect(result.toString()).to.be.equal(wei.toString()) }) it('returns a wei value to eth', () => { const number = '10' const eth = parseFloat( ethers.utils.formatEther(BigNumber.from(number).mul(BigNumber.from('10').pow(18)).toString()), ) const result = vendor.convertWeiToEth(BigNumber.from(number).mul(BigNumber.from('10').pow(18)).toString(), 18) assert.isNotNull(result) assert.deepEqual(result.toString(), eth.toString()) }) it('returns an array of numbers to big numbers', () => { const number = ['10', '20'] const array = [vendor.convertToBN('10'), vendor.convertToBN('20')] const result = vendor.convertStringArrayToBigNumberArray(number) assert.isNotNull(result) assert.deepEqual(result, array) }) it('returns a Discount data object', () => { const data = [ { amount: vendor.convertToBN('10'), percent: vendor.convertToBN('10') }, { amount: vendor.convertToBN('20'), percent: vendor.convertToBN('20') }, ] const convertedData = data.map((a) => new DiscountDataClass(a.amount, a.percent)) const stringifiedData = convertedData.map((a) => a.toString()) const result = vendor.parseDiscountSlabs(data) assert.isNotNull(result) assert.deepEqual(result, stringifiedData) }) it('should sign and verify message', async () => { const message = 'raw message' const signedMessage = await vendor.signMessage(message) const signedDirect = await signer.signMessage(message) assert.deepEqual(signedMessage, signedDirect) const recoveredAddress = vendor.verifySignedMessage(message, signedMessage) assert.deepEqual(await signer.getAddress(), recoveredAddress) }) it('should should abi encode params', async () => { const abi = ['function approve(address spender, uint256 amount) external returns (bool)'] const iface = new ethers.utils.Interface(abi) const func = 'approve' const addr = '0x0B59779C5320B384c9D72457fcd92ABA299ef360' const params = [addr, BigNumber.from(1)] const data = iface.encodeFunctionData(func, params) const encoded = vendor.abiEncodeErc20Functions(func, params) assert.deepEqual(encoded, data) }) it('it should return signed message', async () => { const address = '0x0B59779C5320B384c9D72457fcd92ABA299ef360' const chainId = 1 const nonce = 0 const params = [address, BigNumber.from(1)] const func = 'approve' const abiEncoded = vendor.abiEncodeErc20Functions(func, params) const domainData = { name: 'Test ArGo', version: '1', verifyingContract: address, salt: '0x' + chainId.toString(16).padStart(64, '0'), } const message = { nonce: nonce, from: address, functionSignature: abiEncoded, } const types = { MetaTransaction: metaTransactionType, } const signature = await vendor.signer._signTypedData(domainData, types, message) const data = await vendor.signedMessageForTx(address, nonce, abiEncoded, address, chainId) assert.deepEqual(signature, data) }) it('it should return signature params', async () => { const address = '0x0B59779C5320B384c9D72457fcd92ABA299ef360' const chainId = 1 const nonce = 0 const params = [address, BigNumber.from(1)] const func = 'approve' const abiEncoded = vendor.abiEncodeErc20Functions(func, params) const signature = await vendor.signedMessageForTx(address, nonce, abiEncoded, address, chainId) if (!ethers.utils.isHexString(signature)) { throw new Error('Given value "'.concat(signature, '" is not a valid hex string.')) } const r = signature.slice(0, 66) const s = '0x'.concat(signature.slice(66, 130)) const v = '0x'.concat(signature.slice(130, 132)) let _v = BigNumber.from(v).toNumber() if (![27, 28].includes(_v)) _v += 27 const rsv = { r: r, s: s, v: _v, } const data = vendor.getSignatureParameters(signature) assert.deepEqual(rsv, data) }) })