Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# EVM Chains
EVM_RPC_URL='https://sepolia.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161'
EVM_WS_URL='wss://sepolia.infura.io/ws/v3/9aa3d95b3bc440fa88ea12eaa4456161'
EVM_RPC_URL='https://ethereum-sepolia-rpc.publicnode.com'
EVM_WS_URL='wss://ethereum-sepolia-rpc.publicnode.com'

# Assets
EVM_COIN_TRANSFER_TEST_IS_ACTIVE=false
Expand Down
3 changes: 2 additions & 1 deletion packages/networks/bitcoin/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@multiplechain/bitcoin",
"version": "0.4.5",
"version": "0.4.6",
"type": "module",
"main": "dist/index.cjs",
"module": "dist/index.es.js",
Expand Down Expand Up @@ -81,6 +81,7 @@
},
"devDependencies": {
"@types/bitcore-lib": "^0.15.6",
"@types/lodash": "^4.17.7",
"@types/ws": "^8.5.10"
}
}
7 changes: 7 additions & 0 deletions packages/networks/bitcoin/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 40 additions & 0 deletions packages/networks/bitcoin/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,48 @@
import lodash from 'lodash'
import { Address, PublicKey, Script } from 'bitcore-lib'

export * from './services/Provider'

export * as bitcore from 'bitcore-lib'

export * as assets from './assets/index'
export * as models from './models/index'
export * as services from './services/index'

export * as utils from './utils'
export * as types from '@multiplechain/types'

declare module 'bitcore-lib' {
interface Address {
_classifyArguments: (data: any, network: any, type: any) => any
}
}

Address.prototype._classifyArguments = function (data: any, network: any, type: any) {
/* jshint maxcomplexity: 10 */
// transform and validate input data
if (
(data instanceof Buffer || data instanceof Uint8Array) &&
(data.length === 20 || data.length === 32)
) {
// @ts-expect-error exists
return Address._transformHash(data, network, type)
} else if ((data instanceof Buffer || data instanceof Uint8Array) && data.length >= 21) {
// @ts-expect-error exists
return Address._transformBuffer(data, network, type)
} else if (data instanceof PublicKey) {
// @ts-expect-error exists
return Address._transformPublicKey(data, network, type)
} else if (data instanceof Script) {
// @ts-expect-error exists
return Address._transformScript(data, network)
} else if (typeof data === 'string') {
// @ts-expect-error exists
return Address._transformString(data, network, type)
} else if (lodash.isObject(data)) {
// @ts-expect-error exists
return Address._transformObject(data)
} else {
throw new TypeError('First argument is an unrecognized data format.')
}
}
14 changes: 10 additions & 4 deletions packages/networks/bitcoin/src/services/Provider.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import axios from 'axios'
import { checkWebSocket } from '@multiplechain/utils'
import { ErrorTypeEnum, type ProviderInterface } from '@multiplechain/types'
import {
ErrorTypeEnum,
type NetworkConfigInterface,
type ProviderInterface
} from '@multiplechain/types'

export interface BitcoinNetworkConfigInterface {
testnet: boolean
export interface BitcoinNetworkConfigInterface extends NetworkConfigInterface {
blockCypherToken?: string
}

Expand Down Expand Up @@ -117,8 +120,9 @@ export class Provider implements ProviderInterface<BitcoinNetworkConfigInterface
update(network: BitcoinNetworkConfigInterface): void {
this.network = network
Provider._instance = this
const testnet = this.network.testnet ?? false
this.blockCypherToken = this.network.blockCypherToken
if (this.network.testnet) {
if (testnet) {
this.api = 'https://blockstream.info/testnet/api/'
this.explorer = 'https://blockstream.info/testnet/'
const token = this.network.blockCypherToken ?? this.defaultBlockCypherToken
Expand All @@ -134,6 +138,8 @@ export class Provider implements ProviderInterface<BitcoinNetworkConfigInterface
this.wsUrl = 'wss://ws.blockchain.info/inv'
}
}
this.network.rpcUrl = this.api
this.network.wsUrl = this.wsUrl
}

/**
Expand Down
2 changes: 1 addition & 1 deletion packages/networks/evm-chains/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@multiplechain/evm-chains",
"version": "0.4.5",
"version": "0.4.6",
"type": "module",
"main": "dist/index.cjs",
"module": "dist/index.es.js",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const MetaMask: WalletAdapterInterface<Provider, EIP1193Provider> = {
downloadLink: 'https://metamask.io/download/',
provider: window.ethereum as unknown as WindowEthereum,
platforms: [WalletPlatformEnum.BROWSER, WalletPlatformEnum.MOBILE],
isDetected: () => Boolean((window?.ethereum as unknown as WindowEthereum).isMetaMask),
isDetected: () => Boolean((window?.ethereum as unknown as WindowEthereum)?.isMetaMask),
createDeepLink: (url: string): string => `https://metamask.app.link/dapp/${url}`,
isConnected: async () => {
return Boolean(
Expand Down
25 changes: 21 additions & 4 deletions packages/networks/evm-chains/src/browser/adapters/Web3Modal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ import { networks } from '../../index'
import type { EIP1193Provider } from './EIP6963'
import type { Provider } from '../../services/Provider'
import type { Chain } from '@web3modal/scaffold-utils/ethers'
import type { CustomWallet, Metadata } from '@web3modal/core'
import { createWeb3Modal, defaultConfig } from '@web3modal/ethers'
import type { Web3Modal as Web3ModalType } from '@web3modal/ethers'
import type { WalletAdapterInterface } from '@multiplechain/types'
import { ErrorTypeEnum, WalletPlatformEnum } from '@multiplechain/types'
import type { CustomWallet, EventsControllerState, Metadata } from '@web3modal/core'

type EventFunction = (newEvent: EventsControllerState, modal?: Web3ModalType) => void

export interface Web3ModalConfig {
projectId: string
Expand All @@ -19,9 +21,15 @@ export interface Web3ModalConfig {
defaultChainId?: number
metadata: Metadata
customWallets?: CustomWallet[]
events?: EventFunction[]
}

export interface Web3ModalAdapterInterface
extends WalletAdapterInterface<Provider, EIP1193Provider> {
modal?: Web3ModalType
}

let modal: Web3ModalType
let modal: Web3ModalType | undefined
let walletProvider: EIP1193Provider | undefined

const chains: Chain[] = networks
Expand Down Expand Up @@ -66,6 +74,14 @@ const web3Modal = (config: Web3ModalConfig): Web3ModalType => {
}
})

if (config.events !== undefined) {
config.events.forEach((event) => {
modal?.subscribeEvents((newEvent: EventsControllerState) => {
event(newEvent, modal)
})
})
}

modal.subscribeEvents(async (event) => {
if (event.data.event === 'SELECT_WALLET') {
clickedAnyWallet = true
Expand All @@ -86,7 +102,7 @@ const web3Modal = (config: Web3ModalConfig): Web3ModalType => {
}

if (currentNetwork.chainId !== chainId) {
await modal.switchNetwork(currentNetwork.chainId).catch(() => {
await modal?.switchNetwork(currentNetwork.chainId).catch(() => {
connectRejectMethod(new Error(ErrorTypeEnum.WALLET_CONNECT_REJECTED))
})
}
Expand All @@ -97,7 +113,8 @@ const web3Modal = (config: Web3ModalConfig): Web3ModalType => {
return modal
}

const Web3Modal: WalletAdapterInterface<Provider, EIP1193Provider> = {
const Web3Modal: Web3ModalAdapterInterface = {
modal,
id: 'web3modal',
name: 'Web3Modal',
icon: icons.web3modal,
Expand Down
2 changes: 2 additions & 0 deletions packages/networks/evm-chains/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export * from './services/Provider'

export * as ethers from 'ethers'

export * as assets from './assets/index'
export * as models from './models/index'
export * as services from './services/index'
Expand Down
13 changes: 4 additions & 9 deletions packages/networks/evm-chains/src/models/Transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,8 @@ export class Transaction implements TransactionInterface<TransactionData> {
const check = async (): Promise<void> => {
try {
const status = await this.getStatus()
if (status === TransactionStatusEnum.CONFIRMED) {
resolve(TransactionStatusEnum.CONFIRMED)
return
} else if (status === TransactionStatusEnum.FAILED) {
reject(TransactionStatusEnum.FAILED)
if (status !== TransactionStatusEnum.PENDING) {
resolve(status)
return
}
setTimeout(check, ms)
Expand Down Expand Up @@ -223,10 +220,8 @@ export class Transaction implements TransactionInterface<TransactionData> {
*/
async getStatus(): Promise<TransactionStatusEnum> {
const data = await this.getData()
if (data === null) {
return TransactionStatusEnum.PENDING
} else if (data.response.blockNumber !== null && data.receipt !== null) {
if (data.receipt.status === 1) {
if (data?.response.blockNumber !== null && data?.receipt !== null) {
if (data?.receipt.status === 1) {
return TransactionStatusEnum.CONFIRMED
} else {
return TransactionStatusEnum.FAILED
Expand Down
2 changes: 1 addition & 1 deletion packages/networks/solana/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@multiplechain/solana",
"version": "0.4.5",
"version": "0.4.6",
"type": "module",
"main": "dist/index.cjs",
"module": "dist/index.es.js",
Expand Down
19 changes: 16 additions & 3 deletions packages/networks/solana/src/browser/adapters/Web3Modal.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Metadata } from '@web3modal/core'
import type { WalletProvider } from '../Wallet'
import type { Provider } from '../../services/Provider'
import { solana, solanaDevnet } from '@web3modal/solana/chains'
import type { EventsControllerState, Metadata } from '@web3modal/core'
import { ErrorTypeEnum, WalletPlatformEnum } from '@multiplechain/types'
import type { ProviderInterface, WalletAdapterInterface } from '@multiplechain/types'
import {
Expand All @@ -14,12 +14,16 @@ import {
const icon =
'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKIHdpZHRoPSI0MDAuMDAwMDAwcHQiIGhlaWdodD0iNDAwLjAwMDAwMHB0IiB2aWV3Qm94PSIwIDAgNDAwLjAwMDAwMCA0MDAuMDAwMDAwIgogcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCI+Cgo8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCw0MDAuMDAwMDAwKSBzY2FsZSgwLjEwMDAwMCwtMC4xMDAwMDApIgpmaWxsPSIjMDAwMDAwIiBzdHJva2U9Im5vbmUiPgo8cGF0aCBkPSJNMCAyMDAwIGwwIC0yMDAwIDIwMDAgMCAyMDAwIDAgMCAyMDAwIDAgMjAwMCAtMjAwMCAwIC0yMDAwIDAgMAotMjAwMHogbTIyNjQgNzM2IGMxMjQgLTMyIDI2MSAtOTggMzYzIC0xNzUgOTEgLTY5IDE3MyAtMTUzIDE3MyAtMTc4IDAgLTE3Ci0xODcgLTIwMiAtMjA1IC0yMDMgLTYgMCAtMzEgMjEgLTU1IDQ2IC0yMjcgMjM0IC01NjkgMjk5IC04NTcgMTY0IC03OSAtMzYKLTEzMSAtNzMgLTIxMyAtMTQ5IC0zNiAtMzMgLTcyIC02MCAtODAgLTYxIC0yMCAwIC0yMDAgMTgxIC0yMDAgMjAyIDAgMjQgNDkKNzggMTM2IDE0OCAxMzYgMTA5IDI4MSAxNzkgNDQxIDIxNSAxMDYgMjMgMTE5IDI0IDI2MyAyMCAxMDQgLTMgMTU4IC0xMCAyMzQKLTI5eiBtLTEyODQgLTYwMyBjMTQgLTkgMTMwIC0xMjAgMjU4IC0yNDYgbDIzMyAtMjMxIDU3IDU1IGMzMSAyOSAxNDUgMTQxCjI1MyAyNDYgMTEwIDEwOSAyMDMgMTkzIDIxMyAxOTMgMjAgMCAzOSAtMTggNTIyIC00OTAgMyAtMiA3OCA2OCAxNjcgMTU2IDI3MAoyNjYgMzQ0IDMzNCAzNjIgMzM0IDEwIDAgNTcgLTM5IDEwNiAtODcgNjcgLTY1IDg5IC05MyA4OSAtMTEzIDAgLTIxIC02NiAtOTAKLTM0MSAtMzYwIC0xODggLTE4NCAtMzUwIC0zMzkgLTM2MCAtMzQ0IC0xMSAtNSAtMjcgLTUgLTM4IDAgLTExIDUgLTEyOCAxMTYKLTI2MSAyNDcgLTEzMyAxMzEgLTI0NSAyMzYgLTI0OCAyMzIgLTEzNiAtMTM4IC00OTAgLTQ3MyAtNTA4IC00NzkgLTI4IC0xMQotMTYgLTIyIC00NTEgNDA2IC0yMDMgMTk5IC0yODMgMjg0IC0yODMgMzAwIDAgMjggMTcxIDE5OCAyMDAgMTk4IDMgMCAxNyAtNwozMCAtMTd6Ii8+CjwvZz4KPC9zdmc+Cg=='

type EventFunction = (newEvent: EventsControllerState, modal?: Web3ModalType) => void

export interface Web3ModalConfig extends Web3ModalOptions {
metadata: Metadata
events?: EventFunction[]
}

export interface Web3ModalAdapterInterface
extends Omit<WalletAdapterInterface<Provider, WalletProvider>, 'connect'> {
modal?: Web3ModalType
connect: (
provider?: ProviderInterface,
config?: Web3ModalConfig | object
Expand All @@ -34,9 +38,9 @@ interface Chain {
chainId: string
}

let modal: Web3ModalType
let currentNetwork: Chain
let clickedAnyWallet = false
let modal: Web3ModalType | undefined
let walletProvider: WalletProvider | undefined
let connectRejectMethod: (reason?: any) => void
let connectResolveMethod: (value: WalletProvider | PromiseLike<WalletProvider>) => void
Expand Down Expand Up @@ -68,6 +72,14 @@ const web3Modal = (config: Web3ModalConfig): Web3ModalType => {
}
})

if (config.events !== undefined) {
config.events.forEach((event) => {
modal?.subscribeEvents((newEvent: EventsControllerState) => {
event(newEvent, modal)
})
})
}

modal.subscribeEvents(async (event) => {
if (event.data.event === 'SELECT_WALLET') {
clickedAnyWallet = true
Expand All @@ -88,7 +100,7 @@ const web3Modal = (config: Web3ModalConfig): Web3ModalType => {

if (`solana:${currentNetwork.chainId}` !== ctx.caipChainId) {
await modal
.switchNetwork({
?.switchNetwork({
id: `solana:${currentNetwork.chainId}`,
name: currentNetwork.name
})
Expand All @@ -112,6 +124,7 @@ const web3Modal = (config: Web3ModalConfig): Web3ModalType => {

const Web3Modal: Web3ModalAdapterInterface = {
icon,
modal,
id: 'web3modal',
name: 'Web3Modal',
provider: walletProvider,
Expand Down
3 changes: 3 additions & 0 deletions packages/networks/solana/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
export * from './services/Provider'

export * as Web3 from '@solana/web3.js'
export * as splToken from '@solana/spl-token'

export * as assets from './assets/index'
export * as models from './models/index'
export * as services from './services/index'
Expand Down
2 changes: 1 addition & 1 deletion packages/networks/solana/tests/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ try {
} catch (e) {
provider = new Provider({
testnet: true,
wsUrl: 'wss://alien-wild-fire.solana-devnet.quiknode.pro/ad7c4490b11cd2134e022052f0b2779acb8998ad/'
wsUrl: 'wss://methodical-greatest-orb.solana-devnet.quiknode.pro/c7b6d81c0b58136705b99397e0f396dcee01f748/'
})
}

Expand Down
2 changes: 2 additions & 0 deletions packages/networks/tron/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export * from './services/Provider'

export * as TronWeb3 from 'tronweb'

export * as assets from './assets/index'
export * as models from './models/index'
export * as services from './services/index'
Expand Down
Loading