diff --git a/djed-sdk/src/web3.js b/djed-sdk/src/web3.js index 4aa8cd6..c6eacd1 100644 --- a/djed-sdk/src/web3.js +++ b/djed-sdk/src/web3.js @@ -1,15 +1,20 @@ import Web3 from "web3"; -export const getWeb3 = (BLOCKCHAIN_URI) => - new Promise((resolve, reject) => { - if (window.ethereum) { - try { - const web3 = new Web3(BLOCKCHAIN_URI); - resolve(web3); - } catch (error) { - reject(error); - } - } else { - reject("Please install Metamask"); +export const getWeb3 = async (URI) => { + if (typeof window !== "undefined" && window.ethereum) { + try { + const web3 = new Web3(window.ethereum); + + // Request account access (important) + await window.ethereum.request({ method: "eth_requestAccounts" }); + + return web3; + } catch (error) { + console.error("User denied account access", error); + throw error; } - }); + } + + // Fallback to RPC + return new Web3(new Web3.providers.HttpProvider(URI)); +}; \ No newline at end of file diff --git a/stablepay-sdk/.gitignore b/stablepay-sdk/.gitignore index 14e1648..a083f18 100644 --- a/stablepay-sdk/.gitignore +++ b/stablepay-sdk/.gitignore @@ -4,3 +4,4 @@ # macOS specific files .DS_Store +dist/ \ No newline at end of file diff --git a/stablepay-sdk/dist/umd/index.js.map b/stablepay-sdk/dist/umd/index.js.map deleted file mode 100644 index f7c2fad..0000000 --- a/stablepay-sdk/dist/umd/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sources":["../../src/utils/config.js","../../src/core/Transaction.js","../../src/widget/PayButton.jsx","../../src/widget/Dialog.jsx","../../src/core/TokenSelector.js","../../src/contexts/NetworkContext.jsx","../../src/widget/NetworkDropdown.jsx","../../src/widget/TokenDropdown.jsx","../../src/contexts/chains.js","../../src/contexts/WalletContext.jsx","../../src/widget/TransactionReview.jsx","../../src/widget/Widget.jsx","../../src/index.js","../../src/core/NetworkSelector.js","../../src/core/MerchantConfig.js"],"sourcesContent":["// src/utils/config.js\nexport const networksConfig = {\n 'sepolia': {\n uri: 'https://ethereum-sepolia.publicnode.com/',\n chainId: 11155111,\n djedAddress: '0x624FcD0a1F9B5820c950FefD48087531d38387f4',\n tokens: {\n stablecoin: {\n symbol: 'SOD',\n address: '0x6b930182787F346F18666D167e8d32166dC5eFBD',\n decimals: 18,\n isDirectTransfer: true\n },\n native: {\n symbol: 'ETH',\n decimals: 18,\n isNative: true\n }\n },\n feeUI: 0\n },\n 'milkomeda-mainnet': {\n uri: 'https://rpc-mainnet-cardano-evm.c1.milkomeda.com',\n chainId: 2001,\n djedAddress: '0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76',\n tokens: {\n stablecoin: {\n symbol: 'MOD',\n address: '0xcbA90fB1003b9D1bc6a2b66257D2585011b004e9',\n decimals: 18,\n isDirectTransfer: true\n },\n native: {\n symbol: 'mADA',\n decimals: 18,\n isNative: true\n }\n },\n feeUI: 0\n },\n 'ethereum-classic': {\n uri: 'https://etc.rivet.link',\n chainId: 61,\n djedAddress: '0xCc3664d7021FD36B1Fe2b136e2324710c8442cCf',\n tokens: {\n stablecoin: {\n symbol: 'ECSD',\n address: '0x5A7Ca94F6E969C94bef4CE5e2f90ed9d4891918A',\n decimals: 18,\n isDirectTransfer: true\n },\n native: {\n symbol: 'ETC',\n decimals: 18,\n isNative: true\n }\n },\n feeUI: 0\n }\n};","import { getWeb3, getDjedContract, getCoinContracts, getDecimals, getOracleAddress, getOracleContract, tradeDataPriceBuySc, buyScTx } from 'djed-sdk';\n\nexport class Transaction {\n constructor(networkUri, djedAddress) {\n this.networkUri = networkUri;\n this.djedAddress = djedAddress;\n }\n\n async init() {\n if (!this.networkUri || !this.djedAddress) {\n throw new Error('Network URI and DJED address are required');\n }\n\n try {\n this.web3 = await getWeb3(this.networkUri);\n this.djedContract = getDjedContract(this.web3, this.djedAddress);\n \n try {\n const { stableCoin, reserveCoin } = await getCoinContracts(this.djedContract, this.web3);\n const { scDecimals, rcDecimals } = await getDecimals(stableCoin, reserveCoin);\n this.stableCoin = stableCoin;\n this.reserveCoin = reserveCoin;\n this.scDecimals = scDecimals;\n this.rcDecimals = rcDecimals;\n\n this.oracleContract = await getOracleAddress(this.djedContract).then((addr) =>\n getOracleContract(this.web3, addr, this.djedContract._address)\n );\n\n this.oracleAddress = this.oracleContract._address;\n } catch (contractError) {\n console.error('[Transaction] Error fetching contract details:', contractError);\n if (contractError.message && contractError.message.includes('execution reverted')) {\n const getNetworkInfo = (uri) => {\n if (uri.includes('milkomeda')) return { name: 'Milkomeda', chainId: '2001' };\n if (uri.includes('mordor')) return { name: 'Mordor Testnet', chainId: '63' };\n if (uri.includes('sepolia')) return { name: 'Sepolia', chainId: '11155111' };\n if (uri.includes('etc.rivet.link')) return { name: 'Ethereum Classic', chainId: '61' };\n return { name: 'the selected network', chainId: 'unknown' };\n };\n const { name: networkName, chainId } = getNetworkInfo(this.networkUri);\n throw new Error(\n `Failed to interact with Djed contract at ${this.djedAddress} on ${networkName}.\\n\\n` +\n `Possible causes:\\n` +\n `- The contract address may be incorrect\\n` +\n `- The contract may not be deployed on ${networkName}\\n` +\n `- The contract may not be a valid Djed contract\\n\\n` +\n `Please verify the contract address is correct for ${networkName} (Chain ID: ${chainId}).`\n );\n }\n throw contractError;\n }\n } catch (error) {\n console.error('[Transaction] Error initializing transaction:', error);\n if (error.message && (error.message.includes('CONNECTION ERROR') || error.message.includes('ERR_NAME_NOT_RESOLVED'))) {\n const getNetworkName = (uri) => {\n if (uri.includes('milkomeda')) return 'Milkomeda';\n if (uri.includes('mordor')) return 'Mordor';\n if (uri.includes('sepolia')) return 'Sepolia';\n return 'the selected network';\n };\n const networkName = getNetworkName(this.networkUri);\n throw new Error(\n `Failed to connect to ${networkName} RPC endpoint: ${this.networkUri}\\n\\n` +\n `Possible causes:\\n` +\n `- The RPC endpoint may be temporarily unavailable\\n` +\n `- DNS resolution issue (check your internet connection)\\n` +\n `- Network firewall blocking the connection\\n\\n` +\n `Please try again in a few moments or check the network status.`\n );\n }\n throw error;\n }\n }\n\n getBlockchainDetails() {\n return {\n web3Available: !!this.web3,\n djedContractAvailable: !!this.djedContract,\n stableCoinAddress: this.stableCoin ? this.stableCoin._address : 'N/A',\n reserveCoinAddress: this.reserveCoin ? this.reserveCoin._address : 'N/A',\n stableCoinDecimals: this.scDecimals,\n reserveCoinDecimals: this.rcDecimals,\n oracleAddress: this.oracleAddress || 'N/A',\n oracleContractAvailable: !!this.oracleContract,\n };\n }\n\n async handleTradeDataBuySc(amountScaled) {\n if (!this.djedContract) {\n throw new Error(\"DJED contract is not initialized\");\n }\n if (typeof amountScaled !== 'string') {\n throw new Error(\"Amount must be a string\");\n }\n try {\n const result = await tradeDataPriceBuySc(this.djedContract, this.scDecimals, amountScaled);\n return result.totalBCScaled;\n } catch (error) {\n console.error(\"Error fetching trade data for buying stablecoins: \", error);\n throw error;\n }\n }\n\n async buyStablecoins(payer, receiver, value) {\n if (!this.djedContract) {\n throw new Error(\"DJED contract is not initialized\");\n }\n try {\n const UI = '0x0232556C83791b8291E9b23BfEa7d67405Bd9839';\n\n const txData = await buyScTx(this.djedContract, payer, receiver, value, UI, this.djedAddress);\n\n return txData;\n } catch (error) {\n console.error(\"Error executing buyStablecoins transaction: \", error);\n throw error;\n }\n }\n}\n","import React from \"react\";\nimport styles from \"../styles/main.css\";\n\nconst PayButton = ({ onClick, size = \"medium\" }) => {\n const sizeStyles = {\n small: { width: \"200px\", height: \"50px\", fontSize: \"14px\" },\n medium: { width: \"250px\", height: \"60px\", fontSize: \"16px\" },\n large: { width: \"300px\", height: \"70px\", fontSize: \"18px\" },\n };\n\n const logoSizes = {\n small: { width: \"35px\", height: \"33px\" },\n medium: { width: \"40px\", height: \"38px\" },\n large: { width: \"45px\", height: \"43px\" },\n };\n\n const buttonStyle = sizeStyles[size] || sizeStyles.medium;\n const logoStyle = logoSizes[size] || logoSizes.medium;\n\n return (\n \n
\n Pay with StablePay\n \n );\n};\n\nexport default PayButton;\n","import React from 'react';\nimport styles from '../styles/PricingCard.css';\n\n\nconst Dialog = ({ children, onClose, size = 'medium' }) => {\n return (\n
\n
\n \n
\n
\n\n

StablePay

\n
\n
\n {children}\n
\n
\n
\n );\n};\n\nexport default Dialog;","// TokenSelector.js\n\nexport class TokenSelector {\n constructor(networkSelector) {\n this.networkSelector = networkSelector;\n this.selectedToken = null;\n }\n\n selectToken(tokenKey) {\n const networkConfig = this.networkSelector.getSelectedNetworkConfig();\n if (networkConfig && networkConfig.tokens[tokenKey]) {\n this.selectedToken = {\n key: tokenKey,\n ...networkConfig.tokens[tokenKey]\n };\n return true;\n }\n return false;\n }\n\n getSelectedToken() {\n return this.selectedToken;\n }\n\n getAvailableTokens() {\n const networkConfig = this.networkSelector.getSelectedNetworkConfig();\n if (!networkConfig) return [];\n\n return Object.entries(networkConfig.tokens).map(([key, config]) => ({\n key,\n ...config\n }));\n }\n\n resetSelection() {\n this.selectedToken = null;\n }\n}","import React, { createContext, useState, useContext, useEffect } from 'react';\nimport { TokenSelector } from '../core/TokenSelector';\n\nconst NetworkContext = createContext();\n\nexport const NetworkProvider = ({ children, networkSelector }) => {\n const [tokenSelector] = useState(() => new TokenSelector(networkSelector));\n const [selectedNetwork, setSelectedNetwork] = useState(null);\n const [selectedToken, setSelectedToken] = useState(null);\n const [transactionDetails, setTransactionDetails] = useState(null);\n\n const resetState = () => {\n setSelectedToken(null);\n setTransactionDetails(null);\n };\n\n const selectNetwork = (networkKey) => {\n if (networkSelector.selectNetwork(networkKey)) {\n setSelectedNetwork(networkKey);\n resetState(); \n return true;\n }\n return false;\n };\n\n const selectToken = (tokenKey) => {\n if (tokenSelector.selectToken(tokenKey)) {\n const token = tokenSelector.getSelectedToken();\n setSelectedToken(token);\n return true;\n }\n return false;\n };\n\n const resetSelections = () => {\n networkSelector.selectNetwork(null);\n setSelectedNetwork(null);\n resetState();\n };\n\n // Synchronize context state with NetworkSelector\n useEffect(() => {\n setSelectedNetwork(networkSelector.selectedNetwork);\n }, [networkSelector.selectedNetwork]);\n\n return (\n \n {children}\n \n );\n};\n\nexport const useNetwork = () => {\n const context = useContext(NetworkContext);\n if (context === undefined) {\n throw new Error('useNetwork must be used within a NetworkProvider');\n }\n return context;\n};\n\nexport default NetworkContext;","import React from 'react';\nimport { useNetwork } from '../contexts/NetworkContext';\nimport styles from '../styles/PricingCard.css';\n\nconst NetworkDropdown = () => {\n const { networkSelector, selectedNetwork, selectNetwork } = useNetwork();\n\n const handleNetworkChange = (event) => {\n selectNetwork(event.target.value);\n };\n\n return (\n
\n \n \n
\n );\n};\n\nexport default NetworkDropdown;","import React, { useState } from \"react\";\nimport { useNetwork } from \"../contexts/NetworkContext\";\nimport { Transaction } from \"../core/Transaction\";\nimport styles from \"../styles/PricingCard.css\";\n\nconst TokenDropdown = () => {\n const {\n networkSelector,\n tokenSelector,\n selectedNetwork,\n selectedToken,\n selectToken,\n setTransactionDetails,\n } = useNetwork();\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n\n const handleTokenChange = async (event) => {\n const newValue = event.target.value;\n setError(null);\n setLoading(true);\n\n try {\n if (selectToken(newValue)) {\n const networkConfig = networkSelector.getSelectedNetworkConfig();\n const transaction = new Transaction(\n networkConfig.uri,\n networkConfig.djedAddress\n );\n await transaction.init();\n\n const tokenAmount = networkSelector.getTokenAmount(newValue);\n const blockchainDetails = transaction.getBlockchainDetails();\n\n let tradeData = null;\n if (newValue === \"native\") {\n tradeData = await transaction.handleTradeDataBuySc(\n String(tokenAmount)\n );\n }\n\n setTransactionDetails({\n network: selectedNetwork,\n token: newValue,\n tokenSymbol: tokenSelector.getSelectedToken().symbol,\n amount: tokenAmount,\n receivingAddress: networkSelector.getReceivingAddress(),\n djedContractAddress: networkConfig.djedAddress,\n isDirectTransfer:\n tokenSelector.getSelectedToken().isDirectTransfer || false,\n isNativeToken: tokenSelector.getSelectedToken().isNative || false,\n tradeAmount: tradeData ? tradeData.amount : null,\n ...blockchainDetails,\n });\n }\n } catch (err) {\n console.error(\"Error fetching transaction details:\", err);\n setError(\"Failed to fetch transaction details. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n const availableTokens = selectedNetwork\n ? tokenSelector.getAvailableTokens()\n : [];\n\n return (\n
\n \n \n \n {availableTokens.map((token) => (\n \n ))}\n \n {error &&
{error}
}\n
\n );\n};\n\nexport default TokenDropdown;\n","import { defineChain } from 'viem';\nimport { sepolia } from 'viem/chains';\n\nexport const mordor = defineChain({\n id: 63,\n name: 'Mordor Testnet',\n network: 'mordor',\n nativeCurrency: {\n decimals: 18,\n name: 'Mordor Ether',\n symbol: 'METC',\n },\n rpcUrls: {\n default: {\n http: ['https://rpc.mordor.etccooperative.org'],\n webSocket: ['wss://rpc.mordor.etccooperative.org/ws'],\n },\n },\n blockExplorers: {\n default: { name: 'BlockScout', url: 'https://blockscout.com/etc/mordor' },\n },\n testnet: true,\n});\n\nexport const milkomeda = defineChain({\n id: 2001,\n name: 'Milkomeda C1 Mainnet',\n network: 'milkomeda',\n nativeCurrency: {\n decimals: 18,\n name: 'Milkomeda ADA',\n symbol: 'mADA',\n },\n rpcUrls: {\n default: {\n http: ['https://rpc-mainnet-cardano-evm.c1.milkomeda.com'],\n },\n },\n blockExplorers: {\n default: { name: 'Milkomeda Explorer', url: 'https://explorer-mainnet-cardano-evm.c1.milkomeda.com' },\n },\n testnet: false,\n});\n\nexport const etcMainnet = defineChain({\n id: 61,\n name: 'Ethereum Classic',\n network: 'etc',\n nativeCurrency: {\n decimals: 18,\n name: 'Ethereum Classic',\n symbol: 'ETC',\n },\n rpcUrls: {\n default: {\n http: ['https://etc.rivet.link'],\n },\n },\n blockExplorers: {\n default: { name: 'Blockscout', url: 'https://blockscout.com/etc/mainnet' },\n },\n testnet: false,\n});\n\nexport const getChainByNetworkKey = (networkKey) => {\n switch (networkKey) {\n case 'sepolia':\n return sepolia;\n case 'ethereum-classic':\n return etcMainnet;\n case 'milkomeda-mainnet':\n return milkomeda;\n default:\n return null;\n }\n};\n\nexport const getChainConfigForWallet = (networkKey) => {\n switch (networkKey) {\n case 'sepolia':\n return {\n chainId: `0x${sepolia.id.toString(16)}`,\n chainName: 'Sepolia',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: sepolia.rpcUrls.default.http,\n blockExplorerUrls: sepolia.blockExplorers?.default?.url ? [sepolia.blockExplorers.default.url] : [],\n };\n case 'ethereum-classic':\n return {\n chainId: `0x${etcMainnet.id.toString(16)}`,\n chainName: 'Ethereum Classic',\n nativeCurrency: {\n name: 'Ethereum Classic',\n symbol: 'ETC',\n decimals: 18,\n },\n rpcUrls: ['https://etc.rivet.link'],\n blockExplorerUrls: ['https://blockscout.com/etc/mainnet'],\n };\n case 'milkomeda-mainnet':\n return {\n chainId: `0x${milkomeda.id.toString(16)}`,\n chainName: 'Milkomeda C1 Mainnet',\n nativeCurrency: {\n name: 'Milkomeda ADA',\n symbol: 'mADA',\n decimals: 18,\n },\n rpcUrls: ['https://rpc-mainnet-cardano-evm.c1.milkomeda.com'],\n blockExplorerUrls: ['https://explorer-mainnet-cardano-evm.c1.milkomeda.com'],\n };\n default:\n return null;\n }\n};\n","import React, { createContext, useContext, useState, useCallback, useEffect, useRef } from 'react';\nimport { createWalletClient, createPublicClient, custom, http } from 'viem';\nimport { useNetwork } from './NetworkContext';\nimport { getChainByNetworkKey, getChainConfigForWallet } from './chains';\n\nconst WalletContext = createContext(null);\n\nexport const useWallet = () => {\n const context = useContext(WalletContext);\n if (!context) {\n throw new Error('useWallet must be used within a WalletProvider');\n }\n return context;\n};\n\nconst switchToNetwork = async (networkKey) => {\n if (!window.ethereum) {\n throw new Error('MetaMask not installed');\n }\n\n const chainConfig = getChainConfigForWallet(networkKey);\n if (!chainConfig) {\n throw new Error(`Unsupported network: ${networkKey}`);\n }\n\n try {\n await window.ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: chainConfig.chainId }],\n });\n } catch (switchError) {\n if (switchError.code === 4902) {\n try {\n await window.ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [chainConfig],\n });\n } catch (addError) {\n if (addError.code === 4001) {\n throw new Error(`User rejected adding ${chainConfig.chainName} to MetaMask. Please add it manually.`);\n }\n throw new Error(`Failed to add ${chainConfig.chainName} to MetaMask: ${addError.message}`);\n }\n } else if (switchError.code === 4001) {\n throw new Error(`User rejected switching to ${chainConfig.chainName}. Please switch manually in MetaMask.`);\n } else {\n throw new Error(`Failed to switch to ${chainConfig.chainName}: ${switchError.message}`);\n }\n }\n};\n\nexport const WalletProvider = ({ children }) => {\n const { selectedNetwork } = useNetwork();\n const [walletClient, setWalletClient] = useState(null);\n const [publicClient, setPublicClient] = useState(null);\n const [account, setAccount] = useState(null);\n const [chainId, setChainId] = useState(null);\n const [balance, setBalance] = useState(null);\n const [error, setError] = useState(null);\n const [isConnecting, setIsConnecting] = useState(false);\n\n const selectedChain = selectedNetwork ? getChainByNetworkKey(selectedNetwork) : null;\n const expectedChainId = selectedChain ? selectedChain.id : null;\n\n const handleAccountsChangedRef = useRef(null);\n const handleChainChangedRef = useRef(null);\n\n const disconnectWalletInternal = useCallback(() => {\n setWalletClient(null);\n setPublicClient(null);\n setAccount(null);\n setChainId(null);\n setBalance(null);\n setError(null);\n }, []);\n\n const handleChainChanged = useCallback(async (chainIdHex) => {\n const newChainId = parseInt(chainIdHex, 16);\n setChainId(newChainId);\n\n if (selectedChain && newChainId === expectedChainId) {\n setError(null);\n if (window.ethereum && selectedChain) {\n const newWalletClient = createWalletClient({ \n chain: selectedChain, \n transport: custom(window.ethereum) \n });\n setWalletClient(newWalletClient);\n }\n } else if (selectedChain && newChainId !== expectedChainId) {\n const chainName = selectedChain?.name || selectedNetwork || 'selected network';\n setError(`Wrong network detected. Please switch to ${chainName}`);\n }\n }, [selectedChain, expectedChainId, selectedNetwork]);\n\n handleChainChangedRef.current = handleChainChanged;\n\n const handleAccountsChanged = useCallback(async (accounts) => {\n if (accounts.length === 0) {\n disconnectWalletInternal();\n if (window.ethereum) {\n const accountsHandler = handleAccountsChangedRef.current;\n const chainHandler = handleChainChangedRef.current;\n if (accountsHandler) {\n window.ethereum.removeListener('accountsChanged', accountsHandler);\n }\n if (chainHandler) {\n window.ethereum.removeListener('chainChanged', chainHandler);\n }\n }\n } else {\n setAccount(accounts[0]);\n if (selectedChain) {\n try {\n const newPublicClient = createPublicClient({ chain: selectedChain, transport: http() });\n setPublicClient(newPublicClient);\n const balance = await newPublicClient.getBalance({ address: accounts[0] });\n setBalance(parseFloat(balance) / Math.pow(10, 18));\n } catch (error) {\n console.error('Error fetching balance:', error);\n setBalance(null);\n }\n }\n }\n }, [selectedChain, disconnectWalletInternal]);\n\n handleAccountsChangedRef.current = handleAccountsChanged;\n\n const disconnectWallet = useCallback(() => {\n disconnectWalletInternal();\n if (window.ethereum) {\n const accountsHandler = handleAccountsChangedRef.current;\n const chainHandler = handleChainChangedRef.current;\n if (accountsHandler) {\n window.ethereum.removeListener('accountsChanged', accountsHandler);\n }\n if (chainHandler) {\n window.ethereum.removeListener('chainChanged', chainHandler);\n }\n }\n }, [disconnectWalletInternal]);\n\n const connectPublicClient = useCallback(() => {\n if (selectedChain) {\n setPublicClient(createPublicClient({ chain: selectedChain, transport: http() }));\n }\n }, [selectedChain]);\n\n const connectWallet = useCallback(async () => {\n if (!window.ethereum) {\n setError('Please install MetaMask or another Web3 wallet');\n return false;\n }\n\n if (!selectedNetwork || !selectedChain) {\n setError('Please select a network first');\n return false;\n }\n\n setIsConnecting(true);\n setError(null);\n\n try {\n const accounts = await window.ethereum.request({ \n method: 'eth_requestAccounts' \n });\n\n if (accounts.length === 0) {\n throw new Error('No wallet address found. Please unlock your wallet.');\n }\n\n const chainIdHex = await window.ethereum.request({ method: 'eth_chainId' });\n const currentChainId = parseInt(chainIdHex, 16);\n\n if (currentChainId !== expectedChainId) {\n await switchToNetwork(selectedNetwork);\n }\n\n const newWalletClient = createWalletClient({\n chain: selectedChain,\n transport: custom(window.ethereum),\n });\n\n setWalletClient(newWalletClient);\n setAccount(accounts[0]);\n setChainId(expectedChainId);\n\n const newPublicClient = createPublicClient({ chain: selectedChain, transport: http() });\n setPublicClient(newPublicClient);\n try {\n const balance = await newPublicClient.getBalance({ address: accounts[0] });\n setBalance(parseFloat(balance) / Math.pow(10, 18));\n } catch (error) {\n console.error('Error fetching balance:', error);\n setBalance(null);\n }\n\n handleAccountsChangedRef.current = handleAccountsChanged;\n handleChainChangedRef.current = handleChainChanged;\n window.ethereum.on('accountsChanged', handleAccountsChanged);\n window.ethereum.on('chainChanged', handleChainChanged);\n\n return true;\n } catch (err) {\n console.error('Error connecting wallet:', err);\n setError(err.message);\n return false;\n } finally {\n setIsConnecting(false);\n }\n }, [selectedNetwork, selectedChain, expectedChainId, handleAccountsChanged, handleChainChanged]);\n\n const ensureCorrectNetwork = useCallback(async () => {\n if (!window.ethereum || !selectedNetwork || !selectedChain || !account) {\n const errorMsg = 'Wallet not connected or network not selected';\n setError(errorMsg);\n return null;\n }\n\n try {\n const chainIdHex = await window.ethereum.request({ method: 'eth_chainId' });\n const currentChainId = parseInt(chainIdHex, 16);\n\n if (currentChainId !== expectedChainId) {\n setError(null);\n await switchToNetwork(selectedNetwork);\n const NETWORK_SWITCH_DELAY_MS = 500;\n await new Promise(resolve => setTimeout(resolve, NETWORK_SWITCH_DELAY_MS));\n \n const newChainIdHex = await window.ethereum.request({ method: 'eth_chainId' });\n const newChainId = parseInt(newChainIdHex, 16);\n if (newChainId !== expectedChainId) {\n throw new Error(`Failed to switch network. MetaMask is still on chain ${newChainId}, expected ${expectedChainId}`);\n }\n }\n\n const freshWalletClient = createWalletClient({\n chain: selectedChain,\n transport: custom(window.ethereum),\n });\n\n setWalletClient(freshWalletClient);\n setChainId(expectedChainId);\n setError(null);\n return freshWalletClient;\n } catch (err) {\n setError(err.message);\n return null;\n }\n }, [selectedNetwork, selectedChain, expectedChainId, account]);\n\n const prevNetworkRef = useRef(selectedNetwork);\n\n useEffect(() => {\n if (prevNetworkRef.current !== null && \n prevNetworkRef.current !== selectedNetwork && \n account) {\n disconnectWalletInternal();\n if (window.ethereum) {\n const accountsHandler = handleAccountsChangedRef.current;\n const chainHandler = handleChainChangedRef.current;\n if (accountsHandler) {\n window.ethereum.removeListener('accountsChanged', accountsHandler);\n }\n if (chainHandler) {\n window.ethereum.removeListener('chainChanged', chainHandler);\n }\n }\n }\n prevNetworkRef.current = selectedNetwork;\n }, [selectedNetwork, account, disconnectWalletInternal]);\n\n useEffect(() => {\n connectPublicClient();\n }, [connectPublicClient]);\n\n return (\n \n {children}\n \n );\n};","import React, { useState, useEffect } from \"react\";\nimport { useNetwork } from \"../contexts/NetworkContext\";\nimport { useWallet } from \"../contexts/WalletContext\";\nimport { Transaction } from \"../core/Transaction\";\nimport { parseEther, encodeFunctionData, parseUnits } from \"viem\"; \nimport styles from \"../styles/PricingCard.css\"; \n\nconst TransactionReview = ({ onTransactionComplete }) => {\n const {\n networkSelector,\n selectedNetwork,\n selectedToken,\n transactionDetails: contextTransactionDetails,\n setTransactionDetails,\n } = useNetwork();\n\n const {\n connectWallet,\n account,\n walletClient,\n publicClient,\n isConnecting,\n ensureCorrectNetwork,\n expectedChainId,\n } = useWallet();\n\n const [transaction, setTransaction] = useState(null);\n const [tradeDataBuySc, setTradeDataBuySc] = useState(null);\n const [txData, setTxData] = useState(null);\n const [message, setMessage] = useState(\"\");\n const [txHash, setTxHash] = useState(null);\n const [error, setError] = useState(null);\n const [isErrorDetailsVisible, setIsErrorDetailsVisible] = useState(false);\n\n useEffect(() => {\n setTxData(null);\n setTradeDataBuySc(null);\n setMessage(\"\");\n setError(null);\n setTxHash(null);\n }, [selectedNetwork, selectedToken]);\n\n useEffect(() => {\n const initializeTransaction = async () => {\n if (!selectedNetwork || !selectedToken) return;\n\n try {\n const networkConfig = networkSelector.getSelectedNetworkConfig();\n const receivingAddress = networkSelector.getReceivingAddress();\n const tokenAmount = networkSelector.getTokenAmount(selectedToken.key);\n\n const newTransaction = new Transaction(\n networkConfig.uri,\n networkConfig.djedAddress\n );\n await newTransaction.init();\n setTransaction(newTransaction);\n\n let tradeData = null;\n if (selectedToken.key === \"native\") {\n try {\n tradeData = await newTransaction.handleTradeDataBuySc(String(tokenAmount));\n setTradeDataBuySc(tradeData);\n } catch (tradeError) {\n console.error(\"Error fetching trade data:\", tradeError);\n }\n }\n\n setTransactionDetails({\n network: selectedNetwork,\n token: selectedToken.key,\n tokenSymbol: selectedToken.symbol,\n amount: tokenAmount || \"0\",\n receivingAddress,\n djedContractAddress: networkConfig.djedAddress,\n isDirectTransfer: selectedToken.isDirectTransfer || false,\n isNativeToken: selectedToken.isNative || false,\n tradeAmount: tradeData ? tradeData.amount : null,\n ...newTransaction.getBlockchainDetails(),\n });\n } catch (err) {\n console.error(\"Error initializing transaction:\", err);\n }\n };\n\n initializeTransaction();\n }, [selectedNetwork, selectedToken, networkSelector, setTransactionDetails]);\n\n if (!contextTransactionDetails) {\n return
Initializing transaction...
;\n }\n\n const handleConnectWallet = async () => {\n await connectWallet();\n };\n\n const handleSendTransaction = async () => {\n if (!account || !contextTransactionDetails || !transaction) {\n setMessage(\"❌ Wallet not connected or transaction details missing\");\n return;\n }\n\n try {\n setTxData(null);\n setError(null);\n setMessage(\"⏳ Preparing transaction...\");\n\n const receiver = contextTransactionDetails.receivingAddress;\n let builtTx;\n\n if (selectedToken.key === \"native\") {\n const UI = \"0x0232556C83791b8291E9b23BfEa7d67405Bd9839\";\n const amountToSend = tradeDataBuySc || \"0\";\n const valueInWei = parseEther(String(amountToSend));\n\n builtTx = await transaction.buyStablecoins(\n account,\n receiver,\n valueInWei,\n UI\n );\n\n builtTx = {\n ...builtTx,\n value: valueInWei,\n account: account,\n };\n } else {\n const networkConfig = networkSelector.getSelectedNetworkConfig();\n const stablecoinAddress = networkConfig?.tokens?.stablecoin?.address;\n \n if (!stablecoinAddress) {\n throw new Error('Stablecoin address not found in network configuration');\n }\n\n const amountToSend = contextTransactionDetails.amount\n ? parseUnits(\n String(contextTransactionDetails.amount),\n contextTransactionDetails.stableCoinDecimals\n )\n : \"0\";\n\n builtTx = {\n to: stablecoinAddress,\n value: 0n,\n data: encodeFunctionData({\n abi: [\n {\n inputs: [\n { internalType: \"address\", name: \"to\", type: \"address\" },\n { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n ],\n name: \"transfer\",\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n ],\n functionName: \"transfer\",\n args: [receiver, amountToSend],\n }),\n account: account,\n };\n }\n\n setTxData(builtTx);\n setMessage(\"✅ Transaction ready! Click 'Send Transaction' to proceed.\");\n } catch (error) {\n setError(error);\n setMessage(`❌ Transaction preparation failed.`);\n }\n };\n\n const handleBuySc = async () => {\n setError(null);\n \n try {\n if (!account || !txData) {\n setMessage(\"❌ Wallet account or transaction data is missing\");\n return;\n }\n\n if (!selectedNetwork) {\n setMessage(\"❌ Network not selected\");\n return;\n }\n\n const networkConfig = networkSelector.getSelectedNetworkConfig();\n if (!networkConfig) {\n setMessage(\"❌ Network configuration not found\");\n return;\n }\n\n setMessage(\"⏳ Verifying network...\");\n\n const freshWalletClient = await ensureCorrectNetwork();\n if (!freshWalletClient) {\n setMessage(\"❌ Failed to switch to correct network. Please approve the network switch in MetaMask and try again.\");\n return;\n }\n\n if (!window.ethereum) {\n setMessage(\"❌ MetaMask not available\");\n return;\n }\n\n const chainIdHex = await window.ethereum.request({ method: 'eth_chainId' });\n const currentChainId = parseInt(chainIdHex, 16);\n\n if (currentChainId !== networkConfig.chainId) {\n const errorMsg = `Network mismatch. MetaMask is on chain ${currentChainId}, but ${selectedNetwork} requires chain ${networkConfig.chainId}. Please switch networks in MetaMask.`;\n setMessage(`❌ ${errorMsg}`);\n setError(new Error(errorMsg));\n return;\n }\n\n if (freshWalletClient.chain.id !== networkConfig.chainId) {\n const errorMsg = `Wallet client chain mismatch. Wallet client is on chain ${freshWalletClient.chain.id}, but expected ${networkConfig.chainId}.`;\n setMessage(`❌ ${errorMsg}`);\n setError(new Error(errorMsg));\n return;\n }\n\n setMessage(\"⏳ Sending transaction...\");\n\n const txHash = await freshWalletClient.sendTransaction({\n ...txData,\n account: account,\n });\n\n setTxHash(txHash);\n setMessage(`✅ Transaction sent!`);\n \n if (onTransactionComplete) {\n onTransactionComplete({\n txHash,\n network: selectedNetwork,\n token: selectedToken?.key,\n tokenSymbol: selectedToken?.symbol,\n amount: contextTransactionDetails?.amount,\n receivingAddress: contextTransactionDetails?.receivingAddress,\n });\n }\n } catch (error) {\n setError(error);\n setMessage(`❌ Transaction failed.`);\n console.error('Transaction error:', error);\n }\n };\n\n const getExplorerUrl = () => {\n if (!txHash || !selectedNetwork) return null;\n\n const explorerBaseUrls = {\n \"ethereum-classic\": \"https://blockscout.com/etc/mainnet/tx/\",\n \"sepolia\": \"https://sepolia.etherscan.io/tx/\",\n \"milkomeda-mainnet\": \"https://explorer-mainnet-cardano-evm.c1.milkomeda.com/tx/\",\n };\n\n return explorerBaseUrls[selectedNetwork]\n ? `${explorerBaseUrls[selectedNetwork]}${txHash}`\n : null;\n };\n\n return (\n
\n
\n Network:\n {contextTransactionDetails.network}\n
\n\n
\n You Pay:\n \n {selectedToken.key === \"stablecoin\"\n ? `${contextTransactionDetails.amount} ${contextTransactionDetails.tokenSymbol}`\n : `${tradeDataBuySc ? tradeDataBuySc : \"Calculating...\"} ${\n contextTransactionDetails.tokenSymbol\n }`}\n \n
\n\n \n\n {account && !txData && (\n \n )}\n {account && txData && (\n \n)}\n\n\n {message && (\n
\n {message}\n {error && (\n setIsErrorDetailsVisible(!isErrorDetailsVisible)}\n className={styles.detailsButton}\n >\n {isErrorDetailsVisible ? \"Hide Details\" : \"Show Details\"}\n \n )}\n
\n )}\n\n {isErrorDetailsVisible && error && (\n
\n
{error.message}
\n
\n )}\n\n \n {txHash && (\n
\n ✅ Transaction Hash:{\" \"}\n {getExplorerUrl() ? (\n \n {txHash.slice(0, 6)}...{txHash.slice(-6)}\n \n ) : (\n \n {txHash}\n \n )}\n
\n)}\n\n
\n );\n};\n\nexport default TransactionReview;\n","import React, { useState } from \"react\";\nimport PayButton from \"./PayButton\";\nimport Dialog from \"./Dialog\";\nimport NetworkDropdown from \"./NetworkDropdown\";\nimport TokenDropdown from \"./TokenDropdown\";\nimport TransactionReview from \"./TransactionReview\";\nimport { NetworkProvider, useNetwork } from \"../contexts/NetworkContext\";\nimport { WalletProvider } from \"../contexts/WalletContext\";\nimport styles from \"../styles/PricingCard.css\";\n\nconst WidgetContent = ({ onClose, buttonSize, onTransactionComplete }) => {\n const { resetSelections } = useNetwork(); \n\n const handleClose = () => {\n resetSelections(); // Reset selections when closing the widget\n onClose();\n };\n\n return (\n \n \n \n \n \n );\n};\n\nconst WidgetWithProviders = ({ onClose, buttonSize, networkSelector, onTransactionComplete }) => {\n return (\n \n \n \n \n \n );\n};\n\nexport const Widget = ({ networkSelector, buttonSize = \"medium\", onTransactionComplete, onSuccess }) => {\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n\n const handleOpenDialog = () => {\n setIsDialogOpen(true);\n };\n\n const handleCloseDialog = () => {\n setIsDialogOpen(false);\n };\n\n // Support both onTransactionComplete and onSuccess for backwards compatibility\n const handleTransactionComplete = onTransactionComplete || onSuccess;\n\n return (\n
\n {!isDialogOpen && (\n \n )}\n {isDialogOpen && (\n \n )}\n
\n );\n};\n\nexport default Widget;\n","// src/index.js\nimport { NetworkSelector } from './core/NetworkSelector';\nimport { Transaction } from './core/Transaction';\nimport { Config } from './core/MerchantConfig';\nimport Widget from './widget/Widget.jsx';\nimport PayButton from './widget/PayButton.jsx';\nimport Dialog from './widget/Dialog.jsx';\nimport NetworkDropdown from './widget/NetworkDropdown.jsx';\nimport './styles/main.css';\nimport './styles/PricingCard.css';\n\nconst StablePay = {\n NetworkSelector,\n Transaction,\n Config,\n Widget,\n PayButton,\n Dialog,\n NetworkDropdown\n};\n\nexport default StablePay;","import { networksConfig } from \"../utils/config\";\n\nexport class NetworkSelector {\n constructor(merchantConfig) {\n this.merchantConfig = merchantConfig;\n this.blacklist = merchantConfig.getBlacklist();\n this.availableNetworks = this.getAvailableNetworks();\n this.selectedNetwork = null;\n }\n\n getAvailableNetworks() {\n return Object.entries(networksConfig).reduce(\n (acc, [networkKey, networkConfig]) => {\n if (!this.blacklist.includes(networkConfig.chainId)) {\n acc[networkKey] = networkConfig;\n }\n return acc;\n },\n {}\n );\n }\n\n selectNetwork(networkKey) {\n if (networkKey === null) {\n this.selectedNetwork = null;\n console.log(\"Network selection reset\");\n return true;\n }\n if (this.availableNetworks[networkKey]) {\n this.selectedNetwork = networkKey;\n console.log(`Network selected: ${networkKey}`);\n return true;\n }\n console.error(`Invalid network: ${networkKey}`);\n return false;\n }\n\n getSelectedNetworkConfig() {\n return this.selectedNetwork\n ? this.availableNetworks[this.selectedNetwork]\n : null;\n }\n\n getReceivingAddress() {\n return this.merchantConfig.getReceivingAddress();\n }\n\n getTokenAmount(token) {\n return this.merchantConfig.getTokenAmount(this.selectedNetwork, token);\n }\n}\n","import { networksConfig } from \"../utils/config\";\n\nexport class Config {\n constructor(options = {}) {\n this.receivingAddress = options.receivingAddress || \"\";\n this.blacklist = options.blacklist || [];\n this.amounts = options.Amounts || {}; // Note the capital 'A' in Amounts\n this.validateConfig();\n }\n\n validateConfig() {\n if (!this.receivingAddress) {\n throw new Error(\"Receiving address is required\");\n }\n // Validate stablecoin amounts\n for (const [network, tokens] of Object.entries(this.amounts)) {\n if (!networksConfig[network]) {\n throw new Error(`Invalid network: ${network}`);\n }\n if (\n !tokens.stablecoin ||\n typeof tokens.stablecoin !== \"number\" ||\n tokens.stablecoin <= 0\n ) {\n throw new Error(`Invalid stablecoin amount for network ${network}`);\n }\n }\n }\n\n getBlacklist() {\n return this.blacklist;\n }\n\n getReceivingAddress() {\n return this.receivingAddress;\n }\n\n // getTokenAmount(network, token) {\n // const networkConfig = networksConfig[network];\n // if (!networkConfig) return 0;\n\n // const stablecoinSymbol = networkConfig.tokens.stablecoin.symbol;\n\n // if (token === 'stablecoin') {\n // return this.amounts[network]?.stablecoin || 0;\n // }\n // // For native tokens, return 0 as it's not specified in the new structure\n // return 0;\n // }\n getTokenAmount(network) {\n console.log(\"Getting amount for network:\", network);\n console.log(\"Amounts object:\", this.amounts);\n\n // Directly return the stablecoin amount for the network\n const amount = this.amounts[network]?.stablecoin;\n console.log(\"Returning amount:\", amount);\n\n return amount || 0;\n }\n}\n\nexport default Config;\n"],"names":["networksConfig","sepolia","uri","chainId","djedAddress","tokens","stablecoin","symbol","address","decimals","isDirectTransfer","native","isNative","feeUI","Transaction","constructor","networkUri","this","init","Error","web3","getWeb3","djedContract","getDjedContract","stableCoin","reserveCoin","getCoinContracts","scDecimals","rcDecimals","getDecimals","oracleContract","getOracleAddress","then","addr","getOracleContract","_address","oracleAddress","contractError","console","error","message","includes","getNetworkInfo","name","networkName","getNetworkName","getBlockchainDetails","web3Available","djedContractAvailable","stableCoinAddress","reserveCoinAddress","stableCoinDecimals","reserveCoinDecimals","oracleContractAvailable","handleTradeDataBuySc","amountScaled","tradeDataPriceBuySc","totalBCScaled","buyStablecoins","payer","receiver","value","UI","buyScTx","PayButton","onClick","size","sizeStyles","small","width","height","fontSize","medium","large","logoSizes","buttonStyle","logoStyle","React","createElement","className","styles","style","Dialog","children","onClose","dialogOverlay","pricingCard","dialogClose","pricingCardHeader","allianceLogo","stablepayTitle","pricingCardBody","TokenSelector","networkSelector","selectedToken","selectToken","tokenKey","networkConfig","getSelectedNetworkConfig","key","getSelectedToken","getAvailableTokens","Object","entries","map","config","resetSelection","NetworkContext","createContext","NetworkProvider","tokenSelector","useState","selectedNetwork","setSelectedNetwork","setSelectedToken","transactionDetails","setTransactionDetails","resetState","useEffect","Provider","selectNetwork","networkKey","token","resetSelections","useNetwork","context","useContext","undefined","NetworkDropdown","selectField","htmlFor","id","onChange","event","target","disabled","keys","availableNetworks","TokenDropdown","loading","setLoading","setError","availableTokens","async","newValue","transaction","tokenAmount","getTokenAmount","blockchainDetails","tradeData","String","network","tokenSymbol","amount","receivingAddress","getReceivingAddress","djedContractAddress","isNativeToken","tradeAmount","err","defineChain","nativeCurrency","rpcUrls","default","http","webSocket","blockExplorers","url","testnet","milkomeda","etcMainnet","WalletContext","switchToNetwork","window","ethereum","chainConfig","toString","chainName","blockExplorerUrls","getChainConfigForWallet","request","method","params","switchError","code","addError","WalletProvider","walletClient","setWalletClient","publicClient","setPublicClient","account","setAccount","setChainId","balance","setBalance","isConnecting","setIsConnecting","selectedChain","getChainByNetworkKey","expectedChainId","handleAccountsChangedRef","useRef","handleChainChangedRef","disconnectWalletInternal","useCallback","handleChainChanged","newChainId","parseInt","chainIdHex","newWalletClient","createWalletClient","chain","transport","custom","current","handleAccountsChanged","accounts","length","accountsHandler","chainHandler","removeListener","newPublicClient","createPublicClient","getBalance","parseFloat","Math","pow","disconnectWallet","connectPublicClient","connectWallet","on","ensureCorrectNetwork","NETWORK_SWITCH_DELAY_MS","Promise","resolve","setTimeout","newChainIdHex","freshWalletClient","prevNetworkRef","TransactionReview","onTransactionComplete","contextTransactionDetails","useWallet","setTransaction","tradeDataBuySc","setTradeDataBuySc","txData","setTxData","setMessage","txHash","setTxHash","isErrorDetailsVisible","setIsErrorDetailsVisible","newTransaction","tradeError","initializeTransaction","getExplorerUrl","explorerBaseUrls","transactionReview","transactionInfo","transactionLabel","transactionValue","walletButton","builtTx","amountToSend","valueInWei","parseEther","stablecoinAddress","parseUnits","to","data","encodeFunctionData","abi","inputs","internalType","type","outputs","stateMutability","functionName","args","currentChainId","errorMsg","sendTransaction","detailsButton","errorDetails","transactionLink","href","rel","explorerLink","color","textDecoration","fontWeight","cursor","wordBreak","slice","WidgetContent","buttonSize","handleClose","WidgetWithProviders","NetworkSelector","merchantConfig","blacklist","getBlacklist","getAvailableNetworks","reduce","acc","log","Config","options","amounts","Amounts","validateConfig","Widget","onSuccess","isDialogOpen","setIsDialogOpen","handleTransactionComplete","widgetContainer","handleOpenDialog","handleCloseDialog"],"mappings":"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"} \ No newline at end of file diff --git a/stablepay-sdk/dist/umd/test.html b/stablepay-sdk/dist/umd/test.html new file mode 100644 index 0000000..868edd7 --- /dev/null +++ b/stablepay-sdk/dist/umd/test.html @@ -0,0 +1,28 @@ + + + + StablePay Test + + + +

Test Web3 Init

+ + + + + \ No newline at end of file diff --git a/stablepay-sdk/package-lock.json b/stablepay-sdk/package-lock.json index d3d2450..7ddbe21 100644 --- a/stablepay-sdk/package-lock.json +++ b/stablepay-sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "stablepay-sdk", - "version": "1.0.4", + "version": "1.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "stablepay-sdk", - "version": "1.0.4", + "version": "1.0.3", "license": "ISC", "dependencies": { "djed-sdk": "^1.0.2",