diff --git a/packages/networks/evm-chains/tests/assets.spec.ts b/packages/networks/evm-chains/tests/assets.spec.ts index 975ec35..f88b749 100644 --- a/packages/networks/evm-chains/tests/assets.spec.ts +++ b/packages/networks/evm-chains/tests/assets.spec.ts @@ -73,8 +73,6 @@ describe('Coin', () => { }) it('Transfer', async () => { - if (!coinTransferTestIsActive) return - const signer = await coin.transfer( senderTestAddress, receiverTestAddress, @@ -83,6 +81,8 @@ describe('Coin', () => { await checkSigner(signer) + if (!coinTransferTestIsActive) return + const beforeBalance = await coin.getBalance(receiverTestAddress) await checkTx(await signer.send()) @@ -115,10 +115,6 @@ describe('Token', () => { }) it('Transfer', async () => { - if (!tokenTransferTestIsActive) return - - await waitSecondsBeforeThanNewTx(5) - const signer = await token.transfer( senderTestAddress, receiverTestAddress, @@ -127,6 +123,10 @@ describe('Token', () => { await checkSigner(signer) + if (!tokenTransferTestIsActive) return + + await waitSecondsBeforeThanNewTx(5) + const beforeBalance = await token.getBalance(receiverTestAddress) await checkTx(await signer.send()) @@ -136,10 +136,6 @@ describe('Token', () => { }) it('Approve and Allowance', async () => { - if (!tokenApproveTestIsActive) return - - await waitSecondsBeforeThanNewTx(5) - const signer = await token.approve( senderTestAddress, receiverTestAddress, @@ -148,6 +144,10 @@ describe('Token', () => { await checkSigner(signer) + if (!tokenApproveTestIsActive) return + + await waitSecondsBeforeThanNewTx(5) + await checkTx(await signer.send()) expect(await token.getAllowance(senderTestAddress, receiverTestAddress)).toBe( @@ -156,10 +156,6 @@ describe('Token', () => { }) it('Transfer from', async () => { - if (!tokenTransferFromTestIsActive) return - - await waitSecondsBeforeThanNewTx(5) - const signer = await token.transferFrom( receiverTestAddress, senderTestAddress, @@ -169,6 +165,10 @@ describe('Token', () => { await checkSigner(signer, receiverPrivateKey) + if (!tokenTransferFromTestIsActive) return + + await waitSecondsBeforeThanNewTx(5) + const beforeBalance = await token.getBalance(receiverTestAddress) await checkTx(await signer.send()) @@ -204,27 +204,31 @@ describe('Nft', () => { }) it('Transfer', async () => { - if (!nftTransactionTestIsActive) return - - await waitSecondsBeforeThanNewTx(5) - const signer = await nft.transfer(senderTestAddress, receiverTestAddress, nftTransferId) await checkSigner(signer) + if (!nftTransactionTestIsActive) return + + await waitSecondsBeforeThanNewTx(5) + await checkTx(await signer.send()) expect(await nft.getOwner(nftTransferId)).toBe(receiverTestAddress) }) it('Approve', async () => { - if (!nftTransactionTestIsActive) return + const customOwner = nftTransactionTestIsActive ? receiverTestAddress : senderTestAddress + const customSpender = nftTransactionTestIsActive ? senderTestAddress : receiverTestAddress + const customPrivateKey = nftTransactionTestIsActive ? receiverPrivateKey : senderPrivateKey - await waitSecondsBeforeThanNewTx(5) + const signer = await nft.approve(customOwner, customSpender, nftTransferId) - const signer = await nft.approve(receiverTestAddress, senderTestAddress, nftTransferId) + await checkSigner(signer, customPrivateKey) - await checkSigner(signer, receiverPrivateKey) + if (!nftTransactionTestIsActive) return + + await waitSecondsBeforeThanNewTx(5) await checkTx(await signer.send()) diff --git a/packages/networks/evm-chains/tests/models.spec.ts b/packages/networks/evm-chains/tests/models.spec.ts index 9f3e7b4..860feab 100644 --- a/packages/networks/evm-chains/tests/models.spec.ts +++ b/packages/networks/evm-chains/tests/models.spec.ts @@ -33,6 +33,10 @@ describe('Transaction', () => { expect(await tx.getData()).toBeTypeOf('object') }) + it('Wait', async () => { + expect(await tx.wait()).toBe(TransactionStatusEnum.CONFIRMED) + }) + it('URL', async () => { expect(tx.getUrl()).toBe( 'https://sepolia.etherscan.io/tx/0x566002399664e92f82ed654c181095bdd7ff3d3f1921d963257585891f622251' diff --git a/packages/networks/evm-chains/tests/services.spec.ts b/packages/networks/evm-chains/tests/services.spec.ts index 9898238..0b848cb 100644 --- a/packages/networks/evm-chains/tests/services.spec.ts +++ b/packages/networks/evm-chains/tests/services.spec.ts @@ -1,7 +1,8 @@ import { describe, it, expect } from 'vitest' import { provider } from './setup.ts' -import { Provider } from '../src/services/Provider.ts' +import networks from '../src/services/Networks.ts' +import { Provider, type EvmNetworkConfigInterface } from '../src/services/Provider.ts' import { TransactionListener } from '../src/services/TransactionListener.ts' import { TransactionTypeEnum } from '@multiplechain/types' import { Coin } from '../src/assets/Coin.ts' @@ -12,6 +13,9 @@ import { Transaction } from '../src/models/Transaction.ts' import { TokenTransaction } from '../src/models/TokenTransaction.ts' import { NftTransaction } from '../src/models/NftTransaction.ts' import { NFT } from '../src/assets/NFT.ts' +import ERC20 from '../resources/erc20.json' +import type { InterfaceAbi } from 'ethers' +import { ContractFactory, WebSocketProvider } from 'ethers' const senderPrivateKey = String(process.env.EVM_SENDER_PRIVATE_KEY) const receiverPrivateKey = String(process.env.EVM_RECEIVER_PRIVATE_KEY) @@ -52,6 +56,85 @@ describe('Provider', () => { }) }) +describe('Networks', () => { + it('Ethereum', () => { + // @ts-expect-error ethereum is defined + expect(networks.ethereum).toBeDefined() + }) + + it('findById', () => { + // @ts-expect-error ethereum is defined + expect(networks.findById(1)).toBe(networks.ethereum) + }) + + it('findByKey', () => { + // @ts-expect-error ethereum is defined + expect(networks.findByKey('ethereum')).toBe(networks.ethereum) + }) + + it('findByName', () => { + // @ts-expect-error classic is defined + expect(networks.findByName('Ethereum Classic')).toBe(networks.classic) + }) + + it('findBySymbol', () => { + // @ts-expect-error arbitrum is defined + expect(networks.findBySymbol('ETH')).toBe(networks.arbitrum) + }) + + it('findByHexId', () => { + // @ts-expect-error ethereum is defined + expect(networks.findByHexId('0x1')).toBe(networks.ethereum) + }) + + it('Mainnets', () => { + expect(networks.getMainnets()).toBeInstanceOf(Array) + }) + + it('Testnets', () => { + expect(networks.getTestnets()).toBeInstanceOf(Array) + }) + + it('All', () => { + expect(networks.getAll()).toBeInstanceOf(Array) + }) + + it('Add', () => { + // @ts-expect-error ethereum is defined + networks.add('test', networks.ethereum as EvmNetworkConfigInterface) + // @ts-expect-error ethereum is defined + expect(networks.findByKey('test')).toBe(networks.ethereum) + }) +}) + +describe('Ethers', () => { + it('Connect websocket', async () => { + expect(await provider.ethers.connectWebSocket()).toBeInstanceOf(WebSocketProvider) + }) + + it('Websocket', async () => { + expect(provider.ethers.webSocket).toBeInstanceOf(Object) + }) + + it('getByteCode', async () => { + expect(await provider.ethers.getByteCode(tokenTestAddress)).toBeTypeOf('string') + }) + + it('getLastTransactions', async () => { + expect(await provider.ethers.getLastTransactions(senderTestAddress)).toBeInstanceOf(Array) + }) + + it('getLastTransaction', async () => { + expect(await provider.ethers.getLastTransaction(senderTestAddress)).toBe(null) + }) + + it('contractFactory', async () => { + expect(provider.ethers.contractFactory(ERC20 as InterfaceAbi, '')).toBeInstanceOf( + ContractFactory + ) + }) +}) + describe('Transaction Listener', () => { if (!transactionListenerTestIsActive) { it('No test is active', () => { diff --git a/packages/networks/tron/tests/assets.spec.ts b/packages/networks/tron/tests/assets.spec.ts index 721192e..c508375 100644 --- a/packages/networks/tron/tests/assets.spec.ts +++ b/packages/networks/tron/tests/assets.spec.ts @@ -75,8 +75,6 @@ describe('Coin', () => { }) it('Transfer', async () => { - if (!coinTransferTestIsActive) return - const signer = await coin.transfer( senderTestAddress, receiverTestAddress, @@ -85,6 +83,8 @@ describe('Coin', () => { await checkSigner(signer) + if (!coinTransferTestIsActive) return + const beforeBalance = await coin.getBalance(receiverTestAddress) await checkTx(await signer.send()) @@ -117,10 +117,6 @@ describe('Token', () => { }) it('Transfer', async () => { - if (!tokenTransferTestIsActive) return - - await waitSecondsBeforeThanNewTx(5) - const signer = await token.transfer( senderTestAddress, receiverTestAddress, @@ -129,6 +125,10 @@ describe('Token', () => { await checkSigner(signer) + if (!tokenTransferTestIsActive) return + + await waitSecondsBeforeThanNewTx(5) + const beforeBalance = await token.getBalance(receiverTestAddress) await checkTx(await signer.send()) @@ -138,10 +138,6 @@ describe('Token', () => { }) it('Approve and Allowance', async () => { - if (!tokenApproveTestIsActive) return - - await waitSecondsBeforeThanNewTx(5) - const signer = await token.approve( senderTestAddress, receiverTestAddress, @@ -150,6 +146,10 @@ describe('Token', () => { await checkSigner(signer) + if (!tokenApproveTestIsActive) return + + await waitSecondsBeforeThanNewTx(5) + await checkTx(await signer.send()) expect(await token.getAllowance(senderTestAddress, receiverTestAddress)).toBe( @@ -158,10 +158,6 @@ describe('Token', () => { }) it('Transfer from', async () => { - if (!tokenTransferFromTestIsActive) return - - await waitSecondsBeforeThanNewTx(5) - const signer = await token.transferFrom( receiverTestAddress, senderTestAddress, @@ -171,6 +167,10 @@ describe('Token', () => { await checkSigner(signer, receiverPrivateKey) + if (!tokenTransferFromTestIsActive) return + + await waitSecondsBeforeThanNewTx(5) + const beforeBalance = await token.getBalance(receiverTestAddress) await checkTx(await signer.send()) @@ -206,27 +206,31 @@ describe('Nft', () => { }) it('Transfer', async () => { - if (!nftTransactionTestIsActive) return - - await waitSecondsBeforeThanNewTx(5) - const signer = await nft.transfer(senderTestAddress, receiverTestAddress, nftTransferId) await checkSigner(signer) + if (!nftTransactionTestIsActive) return + + await waitSecondsBeforeThanNewTx(5) + await checkTx(await signer.send()) expect(await nft.getOwner(nftTransferId)).toBe(receiverTestAddress) }) it('Approve', async () => { - if (!nftTransactionTestIsActive) return + const customOwner = nftTransactionTestIsActive ? receiverTestAddress : senderTestAddress + const customSpender = nftTransactionTestIsActive ? senderTestAddress : receiverTestAddress + const customPrivateKey = nftTransactionTestIsActive ? receiverPrivateKey : senderPrivateKey - await waitSecondsBeforeThanNewTx(5) + const signer = await nft.approve(customOwner, customSpender, nftTransferId) - const signer = await nft.approve(receiverTestAddress, senderTestAddress, nftTransferId) + await checkSigner(signer, customPrivateKey) - await checkSigner(signer, receiverPrivateKey) + if (!nftTransactionTestIsActive) return + + await waitSecondsBeforeThanNewTx(5) await checkTx(await signer.send()) diff --git a/packages/networks/tron/tests/models.spec.ts b/packages/networks/tron/tests/models.spec.ts index 896157b..ad76580 100644 --- a/packages/networks/tron/tests/models.spec.ts +++ b/packages/networks/tron/tests/models.spec.ts @@ -27,6 +27,10 @@ describe('Transaction', () => { expect(await tx.getData()).toBeTypeOf('object') }) + it('Wait', async () => { + expect(await tx.wait()).toBe(TransactionStatusEnum.CONFIRMED) + }) + it('URL', async () => { expect(tx.getUrl()).toBe( 'https://nile.tronscan.org/#/transaction/8697ad2c4e1713227c16a65a5845636458df2d3db3adf526e07e17699bc6b3c4' diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 2a8e452..95b7f63 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -89,34 +89,6 @@ export const isNumeric = (value: string | number): boolean => { return !isNaN(Number(value)) } -/** - * Get the number of decimal places - */ -export const getDecimalPlaces = (num: number): number => { - const match = ('' + num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/) - if (match === null) { - return num - } else { - return Math.max( - 0, - // Number of digits right of decimal point. - (match[1] !== undefined && match[1] !== null ? match[1].length : 0) - - // Adjust for scientific notation. - (match[2] !== undefined && match[2] !== null ? +match[2] : 0) - ) - } -} - -/** - * Fix the float number - * @param {number} num - * @returns number - * @example 1.0000000000000001 => 1 - */ -export const fixFloat = (num: number): number => { - return parseFloat(num.toFixed(getDecimalPlaces(num))) -} - /** * Sleeps the given milliseconds * @param {number} ms @@ -208,6 +180,9 @@ declare global { } export const isMobile = (): boolean => { + if (typeof window === 'undefined') { + return false + } /* eslint-disable */ return (function (a) { return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test( diff --git a/packages/utils/tests/index.spec.ts b/packages/utils/tests/index.spec.ts index 094b5bc..108c212 100644 --- a/packages/utils/tests/index.spec.ts +++ b/packages/utils/tests/index.spec.ts @@ -7,6 +7,12 @@ import { base58Decode, bufferToString, stringToBuffer, + checkWebSocket, + isNumeric, + objectsEqual, + isMobile, + isWebview, + sleep, math } from '../src/index.js' @@ -44,6 +50,34 @@ describe('Helper methods', () => { Buffer.from([101, 120, 97, 109, 112, 108, 101]) ) }) + + it('Sleep', async () => { + const start = Date.now() + await sleep(1000) + expect(Date.now() - start).toBeGreaterThanOrEqual(1000) + }) + + it('Check websocket', async () => { + expect( + await checkWebSocket('wss://sepolia.infura.io/ws/v3/9aa3d95b3bc440fa88ea12eaa4456161') + ).toBe(true) + }) + + it('Is numeric', () => { + expect(isNumeric('10')).toBe(true) + }) + + it('Objects equal', () => { + expect(objectsEqual({ a: 1, b: 2 }, { a: 1, b: 2 })).toBe(true) + }) + + it('Is mobile', () => { + expect(isMobile()).toBe(false) + }) + + it('Is webview', () => { + expect(isWebview()).toBe(false) + }) }) describe('Math', () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f5233e..ccc1e0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3091,7 +3091,7 @@ packages: engines: {node: '>=10'} dependencies: '@babel/core': 7.24.5 - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.0 diff --git a/vitest.config.ts b/vitest.config.ts index d37749b..a2e156a 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -8,7 +8,14 @@ export default mergeConfig( test: { coverage: { provider: 'istanbul', - exclude: ['**/boilerplate/**'] + include: ['**/packages/**/src/**', '**/packages/networks/**/src/**'], + exclude: [ + '**/boilerplate/**', + '**/types/**', + '**/browser/**', + '**/index.ts/**', + '**/tron/src/services/TransactionListener.ts' + ] }, watch: false, testTimeout: 180000,