From b96e46a7a596f6375ba5b1e0bb471122044c1ca4 Mon Sep 17 00:00:00 2001 From: Gaurav Date: Sun, 14 Dec 2025 09:21:09 +0530 Subject: [PATCH 1/2] feat(stablepay-sdk): add Ethereum Classic mainnet support and rename ETC testnet to Mordor\n\n- Rename ethereum-classic testnet key to mordor-testnet\n- Add ethereum-classic mainnet (chainId 61) with Rivet RPC\n- Set DJED (0xCc3664d7021FD36B1Fe2b136e2324710c8442cCf) and ECSD (0x5A7Ca94F6E969C94bef4CE5e2f90ed9d4891918A)\n- Update explorer links for both networks\n- Add viem chain for ETC mainnet and dynamic wallet switching\n\nFixes #18 --- stablepay-sdk/dist/esm/index.js | 2 +- stablepay-sdk/dist/umd/index.js | 2 +- stablepay-sdk/dist/umd/index.js.map | 2 +- stablepay-sdk/package-lock.json | 274 ++++++++++++++++-- stablepay-sdk/src/contexts/WalletContext.jsx | 43 +-- stablepay-sdk/src/contexts/chains.js | 20 ++ stablepay-sdk/src/utils/config.js | 29 +- .../src/widget/TransactionReview.jsx | 5 +- stablepay-sdk/src/widget/Widget.jsx | 2 + stablepay-sdk/stablepay-sdk-1.0.3.tgz | Bin 0 -> 54229 bytes 10 files changed, 326 insertions(+), 53 deletions(-) create mode 100644 stablepay-sdk/stablepay-sdk-1.0.3.tgz diff --git a/stablepay-sdk/dist/esm/index.js b/stablepay-sdk/dist/esm/index.js index d3366ca..d0c9c66 100644 --- a/stablepay-sdk/dist/esm/index.js +++ b/stablepay-sdk/dist/esm/index.js @@ -1 +1 @@ -import{getWeb3 as e,getDjedContract as t,getCoinContracts as n,getDecimals as r,getOracleAddress as a,getOracleContract as o,tradeDataPriceBuySc as i,buyScTx as s}from"djed-sdk";import l,{useContext as c,createContext as d,useState as m,useEffect as u,useCallback as h}from"react";import{defineChain as w,createWalletClient as g,custom as k,createPublicClient as b,http as C,parseEther as p,parseUnits as v,encodeFunctionData as _}from"viem";const f={sepolia:{uri:"https://ethereum-sepolia.publicnode.com/",chainId:11155111,djedAddress:"0x624FcD0a1F9B5820c950FefD48087531d38387f4",tokens:{stablecoin:{symbol:"SOD",address:"0x6b930182787F346F18666D167e8d32166dC5eFBD",decimals:18,isDirectTransfer:!0},native:{symbol:"ETH",decimals:18,isNative:!0}},feeUI:0},"milkomeda-mainnet":{uri:"https://rpc-mainnet-cardano-evm.c1.milkomeda.com",chainId:2001,djedAddress:"0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76",tokens:{stablecoin:{symbol:"MOD",address:"0xcbA90fB1003b9D1bc6a2b66257D2585011b004e9",decimals:18,isDirectTransfer:!0},native:{symbol:"mADA",decimals:18,isNative:!0}},feeUI:0},"ethereum-classic":{uri:"https://rpc.mordor.etccooperative.org",chainId:63,djedAddress:"0xD4548F4b6d08852B56cdabC6be7Fd90953179d68",tokens:{stablecoin:{symbol:"ECSD",address:"0xffD4505B3452Dc22f8473616d50503bA9E1710Ac",decimals:18,isDirectTransfer:!0},native:{symbol:"ETC",decimals:18,isNative:!0}},feeUI:0}};class y{constructor(e,t){this.networkUri=e,this.djedAddress=t}async init(){if(!this.networkUri||!this.djedAddress)throw new Error("Network URI and DJED address are required");try{this.web3=await e(this.networkUri),this.djedContract=t(this.web3,this.djedAddress);const{stableCoin:i,reserveCoin:s}=await n(this.djedContract,this.web3),{scDecimals:l,rcDecimals:c}=await r(i,s);this.stableCoin=i,this.reserveCoin=s,this.scDecimals=l,this.rcDecimals=c,this.oracleContract=await a(this.djedContract).then((e=>o(this.web3,e,this.djedContract._address))),this.oracleAddress=this.oracleContract._address,console.log("Transaction initialized successfully")}catch(e){throw console.error("Error initializing transaction:",e),e}}getBlockchainDetails(){return{web3Available:!!this.web3,djedContractAvailable:!!this.djedContract,stableCoinAddress:this.stableCoin?this.stableCoin._address:"N/A",reserveCoinAddress:this.reserveCoin?this.reserveCoin._address:"N/A",stableCoinDecimals:this.scDecimals,reserveCoinDecimals:this.rcDecimals,oracleAddress:this.oracleAddress||"N/A",oracleContractAvailable:!!this.oracleContract}}async handleTradeDataBuySc(e){if(!this.djedContract)throw new Error("DJED contract is not initialized");if("string"!=typeof e)throw new Error("Amount must be a string");try{return(await i(this.djedContract,this.scDecimals,e)).totalBCScaled}catch(e){throw console.error("Error fetching trade data for buying stablecoins: ",e),e}}async buyStablecoins(e,t,n){if(!this.djedContract)throw new Error("DJED contract is not initialized");try{console.log(`Building stablecoin purchase transaction from ${e} to ${t} with value ${n}`);const r="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",a=await s(this.djedContract,e,t,n,r,this.djedAddress);return console.log("Transaction built:",a),a}catch(e){throw console.error("Error executing buyStablecoins transaction: ",e),e}}}var E="main_stablePayButton__UA7HC",N="main_logo__ITyEy",T="main_buttonText__N-ewy";const S=({onClick:e,size:t="medium"})=>{const n={small:{width:"200px",height:"50px",fontSize:"14px"},medium:{width:"250px",height:"60px",fontSize:"16px"},large:{width:"300px",height:"70px",fontSize:"18px"}},r={small:{width:"35px",height:"33px"},medium:{width:"40px",height:"38px"},large:{width:"45px",height:"43px"}},a=n[t]||n.medium,o=r[t]||r.medium;return l.createElement("button",{className:E,onClick:e,style:a},l.createElement("div",{className:N,style:o}),l.createElement("span",{className:T},"Pay with StablePay"))};var A={dialogOverlay:"PricingCard_dialogOverlay__0XJrE",pricingCard:"PricingCard_pricingCard__LrWb9",small:"PricingCard_small__J4CHj",medium:"PricingCard_medium__EVmTB",large:"PricingCard_large__A6pnX",dialogClose:"PricingCard_dialogClose__jJ1tM",pricingCardHeader:"PricingCard_pricingCardHeader__wGczA",allianceLogo:"PricingCard_allianceLogo__URa-U",stablepayTitle:"PricingCard_stablepayTitle__4t848",pricingCardBody:"PricingCard_pricingCardBody__0wKQn",selectField:"PricingCard_selectField__LBPoZ",transactionReview:"PricingCard_transactionReview__Ix-eL",transactionInfo:"PricingCard_transactionInfo__Ck-Rc",transactionLabel:"PricingCard_transactionLabel__GDux7",transactionValue:"PricingCard_transactionValue__q-xxp",infoSection:"PricingCard_infoSection__gyjMQ",infoIcon:"PricingCard_infoIcon__rraxD",infoText:"PricingCard_infoText__l4b7A",walletButton:"PricingCard_walletButton__llw4v",loading:"PricingCard_loading__2-tGA",error:"PricingCard_error__m5fK-",networkError:"PricingCard_networkError__zR-36",errorText:"PricingCard_errorText__qZRJt","message-box":"PricingCard_message-box__vkUKy",detailsButton:"PricingCard_detailsButton__jHglL",errorDetails:"PricingCard_errorDetails__CzN-7",loadingContainer:"PricingCard_loadingContainer__6nOVa",spinner:"PricingCard_spinner__9ucQv",spin:"PricingCard_spin__24tni"};const D=({children:e,onClose:t,size:n="medium"})=>l.createElement("div",{className:A.dialogOverlay},l.createElement("div",{className:`${A.pricingCard} ${A[n]}`},l.createElement("button",{className:A.dialogClose,onClick:t},"×"),l.createElement("div",{className:A.pricingCardHeader},l.createElement("div",{className:A.allianceLogo}),l.createElement("h2",{className:A.stablepayTitle},"StablePay")),l.createElement("div",{className:A.pricingCardBody},e)));class P{constructor(e){this.networkSelector=e,this.selectedToken=null}selectToken(e){const t=this.networkSelector.getSelectedNetworkConfig();return!(!t||!t.tokens[e])&&(this.selectedToken={key:e,...t.tokens[e]},!0)}getSelectedToken(){return this.selectedToken}getAvailableTokens(){const e=this.networkSelector.getSelectedNetworkConfig();return e?Object.entries(e.tokens).map((([e,t])=>({key:e,...t}))):[]}resetSelection(){this.selectedToken=null}}const x=d(),B=({children:e,networkSelector:t})=>{const[n]=m((()=>new P(t))),[r,a]=m(null),[o,i]=m(null),[s,c]=m(null),d=()=>{i(null),c(null)};return u((()=>{a(t.selectedNetwork)}),[t.selectedNetwork]),l.createElement(x.Provider,{value:{networkSelector:t,tokenSelector:n,selectedNetwork:r,selectedToken:o,transactionDetails:s,setTransactionDetails:c,selectNetwork:e=>!!t.selectNetwork(e)&&(a(e),d(),!0),selectToken:e=>{if(n.selectToken(e)){const e=n.getSelectedToken();return i(e),!0}return!1},resetSelections:()=>{t.selectNetwork(null),a(null),d()}}},e)},j=()=>{const e=c(x);if(void 0===e)throw new Error("useNetwork must be used within a NetworkProvider");return e},I=()=>{const{networkSelector:e,selectedNetwork:t,selectNetwork:n}=j();return l.createElement("div",{className:A.selectField},l.createElement("label",{htmlFor:"network-select"},"Select Network"),l.createElement("select",{id:"network-select",onChange:e=>{n(e.target.value)},value:t||""},l.createElement("option",{value:"",disabled:!0},"Select a network"),Object.keys(e.availableNetworks).map((e=>l.createElement("option",{key:e,value:e},e)))))},z=()=>{const{networkSelector:e,tokenSelector:t,selectedNetwork:n,selectedToken:r,selectToken:a,setTransactionDetails:o}=j(),[i,s]=m(!1),[c,d]=m(null),u=n?t.getAvailableTokens():[];return l.createElement("div",{className:A.selectField},l.createElement("label",{htmlFor:"token-select"},"Select Token"),l.createElement("select",{id:"token-select",onChange:async r=>{const i=r.target.value;d(null),s(!0);try{if(a(i)){const r=e.getSelectedNetworkConfig(),a=new y(r.uri,r.djedAddress);await a.init();const s=e.getTokenAmount(i),l=a.getBlockchainDetails();let c=null;"native"===i&&(c=await a.handleTradeDataBuySc(String(s))),o({network:n,token:i,tokenSymbol:t.getSelectedToken().symbol,amount:s,receivingAddress:e.getReceivingAddress(),djedContractAddress:r.djedAddress,isDirectTransfer:t.getSelectedToken().isDirectTransfer||!1,isNativeToken:t.getSelectedToken().isNative||!1,tradeAmount:c?c.amount:null,...l})}}catch(e){console.error("Error fetching transaction details:",e),d("Failed to fetch transaction details. Please try again.")}finally{s(!1)}},value:r?r.key:"",disabled:!n||i},l.createElement("option",{value:"",disabled:!0},n?i?"Loading...":"Select a token":"Please select a network first"),u.map((e=>l.createElement("option",{key:e.key,value:e.key},e.symbol," (",e.isDirectTransfer?"Direct Transfer":"Native",")")))),c&&l.createElement("div",{className:A.error},c))},M=w({id:63,name:"Mordor Testnet",network:"mordor",nativeCurrency:{decimals:18,name:"Mordor Ether",symbol:"METC"},rpcUrls:{default:{http:["https://rpc.mordor.etccooperative.org"],webSocket:["wss://rpc.mordor.etccooperative.org/ws"]}},blockExplorers:{default:{name:"BlockScout",url:"https://blockscout.com/etc/mordor"}},testnet:!0}),F=d(null),L=({children:e})=>{const[t,n]=m(null),[r,a]=m(null),[o,i]=m(null),[s,c]=m(null),[d,w]=m(null),[p,v]=m(null),[_,f]=m(!1),y=M.id,E=h((async()=>{if(!window.ethereum)return v("Please install MetaMask or another Web3 wallet"),!1;f(!0),v(null);try{const e=await window.ethereum.request({method:"eth_requestAccounts"});if(0===e.length)throw new Error("No wallet address found. Please unlock your wallet.");const t=await window.ethereum.request({method:"eth_chainId"}),r=parseInt(t,16);if(r!==y)try{await window.ethereum.request({method:"wallet_switchEthereumChain",params:[{chainId:`0x${y.toString(16)}`}]})}catch(e){if(4902!==e.code)throw new Error("Please switch to Mordor Testnet in MetaMask");try{await window.ethereum.request({method:"wallet_addEthereumChain",params:[{chainId:`0x${y.toString(16)}`,chainName:"Mordor Testnet",nativeCurrency:{name:"Mordor ETC",symbol:"METC",decimals:18},rpcUrls:["https://rpc.mordor.etccooperative.org"],blockExplorerUrls:["https://etc-mordor.blockscout.com/"]}]})}catch(e){throw new Error("Failed to add Mordor Testnet to MetaMask")}}const a=g({chain:M,transport:k(window.ethereum)});n(a),i(e[0]),c(r);const o=b({chain:M,transport:C()}),s=await o.getBalance({address:e[0]});return w(parseFloat(s)/Math.pow(10,18)),window.ethereum.on("accountsChanged",S),window.ethereum.on("chainChanged",T),!0}catch(e){return console.error("Error connecting wallet:",e),v(e.message),!1}finally{f(!1)}}),[]),N=h((()=>{a(b({chain:M,transport:C()}))}),[]),T=async e=>{const t=parseInt(e,16);if(c(t),t===y){if(window.ethereum){const e=g({chain:M,transport:k(window.ethereum)});n(e)}}else v("Wrong network detected. Please switch to Mordor Testnet")},S=async e=>{if(0===e.length)A();else{i(e[0]);const t=b({chain:M,transport:C()}),n=await t.getBalance({address:e[0]});w(parseFloat(n)/Math.pow(10,18))}},A=h((()=>{n(null),i(null),c(null),w(null),window.ethereum&&(window.ethereum.removeListener("accountsChanged",S),window.ethereum.removeListener("chainChanged",T))}),[]);return u((()=>{N()}),[N]),l.createElement(F.Provider,{value:{walletClient:t,publicClient:r,account:o,chainId:s,balance:d,error:p,isConnecting:_,connectWallet:E,disconnectWallet:A}},e)},$=({onTransactionComplete:e})=>{const{networkSelector:t,selectedNetwork:n,selectedToken:r,transactionDetails:a,setTransactionDetails:o}=j(),{connectWallet:i,account:s,walletClient:d,publicClient:h,isConnecting:w}=(()=>{const e=c(F);if(!e)throw new Error("useWallet must be used within a WalletProvider");return e})(),[g,k]=m(null),[b,C]=m(null),[f,E]=m(null),[N,T]=m(""),[S,D]=m(null),[P,x]=m(null),[B,I]=m(!1);if(u((()=>{(async()=>{if(n&&r)try{const e=t.getSelectedNetworkConfig(),a=t.getReceivingAddress(),i=t.getTokenAmount(r.key),s=new y(e.uri,e.djedAddress);await s.init(),k(s);let l=null;if("native"===r.key)try{l=await s.handleTradeDataBuySc(String(i)),C(l)}catch(e){console.error("Error fetching trade data:",e)}o({network:n,token:r.key,tokenSymbol:r.symbol,amount:i||"0",receivingAddress:a,djedContractAddress:e.djedAddress,isDirectTransfer:r.isDirectTransfer||!1,isNativeToken:r.isNative||!1,tradeAmount:l?l.amount:null,...s.getBlockchainDetails()})}catch(e){console.error("Error initializing transaction:",e)}})()}),[n,r,t,o]),!a)return l.createElement("div",{className:A.loading},"Initializing transaction...");return l.createElement("div",{className:A.transactionReview},l.createElement("div",{className:A.transactionInfo},l.createElement("span",{className:A.transactionLabel},"Network:"),l.createElement("span",{className:A.transactionValue},a.network)),l.createElement("div",{className:A.transactionInfo},l.createElement("span",{className:A.transactionLabel},"You Pay:"),l.createElement("span",{className:A.transactionValue},"stablecoin"===r.key?`${a.amount} ${a.tokenSymbol}`:`${b||"Calculating..."} ${a.tokenSymbol}`)),l.createElement("button",{className:A.walletButton,onClick:async()=>{await i()&&console.log("Wallet connected:",s)},disabled:w},w?"Connecting...":"Connect Wallet"),s&&!f&&l.createElement("button",{className:A.walletButton,onClick:async()=>{if(s&&a&&g)try{T("⏳ Preparing transaction...");const e=a.receivingAddress;let t;if("native"===r.key){const n="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",r=b||"0";t=await g.buyStablecoins(s,e,p(String(r)),n)}else{const n=a.amount?v(String(a.amount),a.stableCoinDecimals):"0";t={to:"0xdc86935A9597aA3A9008d2f26232233043091284",data:_({abi:[{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}],functionName:"transfer",args:[e,n]}),account:s}}E(t),T("✅ Transaction ready! Click 'Send Transaction' to proceed.")}catch(e){x(e),T("❌ Transaction preparation failed.")}else T("❌ Wallet not connected or transaction details missing")}},"Prepare Transaction"),s&&f&&l.createElement("button",{className:A.walletButton,onClick:async()=>{try{if(!d||!s||!f)return void T("❌ Wallet client, account, or transaction data is missing");T("⏳ Sending transaction...");const t=await d.sendTransaction({...f,account:s});D(t),T("✅ Transaction sent!"),e&&e({txHash:t,network:n,token:r?.key,tokenSymbol:r?.symbol,amount:a?.amount,receivingAddress:a?.receivingAddress})}catch(e){x(e),T("❌ Transaction failed.")}},disabled:null!==S},"Send Transaction"),N&&l.createElement("div",{className:"message-box"},N,P&&l.createElement("button",{onClick:()=>I(!B),className:A.detailsButton},B?"Hide Details":"Show Details")),B&&P&&l.createElement("div",{className:A.errorDetails},l.createElement("pre",null,P.message)),S&&l.createElement("div",{className:A.transactionLink},"✅ Transaction Hash:"," ",l.createElement("a",{href:`https://blockscout.com/etc/mordor/tx/${S}`,target:"_blank",rel:"noopener noreferrer",className:A.explorerLink,style:{color:"#007bff",textDecoration:"underline",fontWeight:"bold",cursor:"pointer",wordBreak:"break-word"}},S.slice(0,6),"...",S.slice(-6))))},R=({onClose:e,buttonSize:t,onTransactionComplete:n})=>{const{resetSelections:r}=j();return l.createElement(D,{onClose:()=>{r(),e()},size:t},l.createElement(I,null),l.createElement(z,null),l.createElement($,{onTransactionComplete:n}))},U=({onClose:e,buttonSize:t,networkSelector:n,onTransactionComplete:r})=>l.createElement(B,{networkSelector:n},l.createElement(L,null,l.createElement(R,{onClose:e,buttonSize:t,onTransactionComplete:r}))),W={NetworkSelector:class{constructor(e){this.merchantConfig=e,this.blacklist=e.getBlacklist(),this.availableNetworks=this.getAvailableNetworks(),this.selectedNetwork=null}getAvailableNetworks(){return Object.entries(f).reduce(((e,[t,n])=>(this.blacklist.includes(n.chainId)||(e[t]=n),e)),{})}selectNetwork(e){return null===e?(this.selectedNetwork=null,console.log("Network selection reset"),!0):this.availableNetworks[e]?(this.selectedNetwork=e,console.log(`Network selected: ${e}`),!0):(console.error(`Invalid network: ${e}`),!1)}getSelectedNetworkConfig(){return this.selectedNetwork?this.availableNetworks[this.selectedNetwork]:null}getReceivingAddress(){return this.merchantConfig.getReceivingAddress()}getTokenAmount(e){return this.merchantConfig.getTokenAmount(this.selectedNetwork,e)}},Transaction:y,Config:class{constructor(e={}){this.receivingAddress=e.receivingAddress||"",this.blacklist=e.blacklist||[],this.amounts=e.Amounts||{},this.validateConfig()}validateConfig(){if(!this.receivingAddress)throw new Error("Receiving address is required");for(const[e,t]of Object.entries(this.amounts)){if(!f[e])throw new Error(`Invalid network: ${e}`);if(!t.stablecoin||"number"!=typeof t.stablecoin||t.stablecoin<=0)throw new Error(`Invalid stablecoin amount for network ${e}`)}}getBlacklist(){return this.blacklist}getReceivingAddress(){return this.receivingAddress}getTokenAmount(e){console.log("Getting amount for network:",e),console.log("Amounts object:",this.amounts);const t=this.amounts[e]?.stablecoin;return console.log("Returning amount:",t),t||0}},Widget:({networkSelector:e,buttonSize:t="medium",onTransactionComplete:n,onSuccess:r})=>{const[a,o]=m(!1),i=n||r;return l.createElement("div",{className:A.widgetContainer},!a&&l.createElement(S,{onClick:()=>{o(!0)},size:t}),a&&l.createElement(U,{onClose:()=>{o(!1)},buttonSize:t,networkSelector:e,onTransactionComplete:i}))},PayButton:S,Dialog:D,NetworkDropdown:I};export{W as default}; +import{getWeb3 as e,getDjedContract as t,getCoinContracts as n,getDecimals as r,getOracleAddress as a,getOracleContract as i,tradeDataPriceBuySc as o,buyScTx as s}from"djed-sdk";import l,{useContext as c,createContext as d,useState as m,useEffect as u,useCallback as h}from"react";import{defineChain as w,createWalletClient as g,custom as k,createPublicClient as C,http as b,parseEther as p,parseUnits as _,encodeFunctionData as E}from"viem";const f={sepolia:{uri:"https://ethereum-sepolia.publicnode.com/",chainId:11155111,djedAddress:"0x624FcD0a1F9B5820c950FefD48087531d38387f4",tokens:{stablecoin:{symbol:"SOD",address:"0x6b930182787F346F18666D167e8d32166dC5eFBD",decimals:18,isDirectTransfer:!0},native:{symbol:"ETH",decimals:18,isNative:!0}},feeUI:0},"milkomeda-mainnet":{uri:"https://rpc-mainnet-cardano-evm.c1.milkomeda.com",chainId:2001,djedAddress:"0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76",tokens:{stablecoin:{symbol:"MOD",address:"0xcbA90fB1003b9D1bc6a2b66257D2585011b004e9",decimals:18,isDirectTransfer:!0},native:{symbol:"mADA",decimals:18,isNative:!0}},feeUI:0},"mordor-testnet":{uri:"https://rpc.mordor.etccooperative.org",chainId:63,djedAddress:"0xD4548F4b6d08852B56cdabC6be7Fd90953179d68",tokens:{stablecoin:{symbol:"ECSD",address:"0xffD4505B3452Dc22f8473616d50503bA9E1710Ac",decimals:18,isDirectTransfer:!0},native:{symbol:"ETC",decimals:18,isNative:!0}},feeUI:0},"ethereum-classic":{uri:"https://etc.rivet.link",chainId:61,djedAddress:"0xCc3664d7021FD36B1Fe2b136e2324710c8442cCf",tokens:{stablecoin:{symbol:"ECSD",address:"0x5A7Ca94F6E969C94bef4CE5e2f90ed9d4891918A",decimals:18,isDirectTransfer:!0},native:{symbol:"ETC",decimals:18,isNative:!0}},feeUI:0}};class v{constructor(e,t){this.networkUri=e,this.djedAddress=t}async init(){if(!this.networkUri||!this.djedAddress)throw new Error("Network URI and DJED address are required");try{this.web3=await e(this.networkUri),this.djedContract=t(this.web3,this.djedAddress);const{stableCoin:o,reserveCoin:s}=await n(this.djedContract,this.web3),{scDecimals:l,rcDecimals:c}=await r(o,s);this.stableCoin=o,this.reserveCoin=s,this.scDecimals=l,this.rcDecimals=c,this.oracleContract=await a(this.djedContract).then((e=>i(this.web3,e,this.djedContract._address))),this.oracleAddress=this.oracleContract._address,console.log("Transaction initialized successfully")}catch(e){throw console.error("Error initializing transaction:",e),e}}getBlockchainDetails(){return{web3Available:!!this.web3,djedContractAvailable:!!this.djedContract,stableCoinAddress:this.stableCoin?this.stableCoin._address:"N/A",reserveCoinAddress:this.reserveCoin?this.reserveCoin._address:"N/A",stableCoinDecimals:this.scDecimals,reserveCoinDecimals:this.rcDecimals,oracleAddress:this.oracleAddress||"N/A",oracleContractAvailable:!!this.oracleContract}}async handleTradeDataBuySc(e){if(!this.djedContract)throw new Error("DJED contract is not initialized");if("string"!=typeof e)throw new Error("Amount must be a string");try{return(await o(this.djedContract,this.scDecimals,e)).totalBCScaled}catch(e){throw console.error("Error fetching trade data for buying stablecoins: ",e),e}}async buyStablecoins(e,t,n){if(!this.djedContract)throw new Error("DJED contract is not initialized");try{console.log(`Building stablecoin purchase transaction from ${e} to ${t} with value ${n}`);const r="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",a=await s(this.djedContract,e,t,n,r,this.djedAddress);return console.log("Transaction built:",a),a}catch(e){throw console.error("Error executing buyStablecoins transaction: ",e),e}}}var y="main_stablePayButton__UA7HC",T="main_logo__ITyEy",N="main_buttonText__N-ewy";const S=({onClick:e,size:t="medium"})=>{const n={small:{width:"200px",height:"50px",fontSize:"14px"},medium:{width:"250px",height:"60px",fontSize:"16px"},large:{width:"300px",height:"70px",fontSize:"18px"}},r={small:{width:"35px",height:"33px"},medium:{width:"40px",height:"38px"},large:{width:"45px",height:"43px"}},a=n[t]||n.medium,i=r[t]||r.medium;return l.createElement("button",{className:y,onClick:e,style:a},l.createElement("div",{className:T,style:i}),l.createElement("span",{className:N},"Pay with StablePay"))};var A={dialogOverlay:"PricingCard_dialogOverlay__0XJrE",pricingCard:"PricingCard_pricingCard__LrWb9",small:"PricingCard_small__J4CHj",medium:"PricingCard_medium__EVmTB",large:"PricingCard_large__A6pnX",dialogClose:"PricingCard_dialogClose__jJ1tM",pricingCardHeader:"PricingCard_pricingCardHeader__wGczA",allianceLogo:"PricingCard_allianceLogo__URa-U",stablepayTitle:"PricingCard_stablepayTitle__4t848",pricingCardBody:"PricingCard_pricingCardBody__0wKQn",selectField:"PricingCard_selectField__LBPoZ",transactionReview:"PricingCard_transactionReview__Ix-eL",transactionInfo:"PricingCard_transactionInfo__Ck-Rc",transactionLabel:"PricingCard_transactionLabel__GDux7",transactionValue:"PricingCard_transactionValue__q-xxp",infoSection:"PricingCard_infoSection__gyjMQ",infoIcon:"PricingCard_infoIcon__rraxD",infoText:"PricingCard_infoText__l4b7A",walletButton:"PricingCard_walletButton__llw4v",loading:"PricingCard_loading__2-tGA",error:"PricingCard_error__m5fK-",networkError:"PricingCard_networkError__zR-36",errorText:"PricingCard_errorText__qZRJt","message-box":"PricingCard_message-box__vkUKy",detailsButton:"PricingCard_detailsButton__jHglL",errorDetails:"PricingCard_errorDetails__CzN-7",loadingContainer:"PricingCard_loadingContainer__6nOVa",spinner:"PricingCard_spinner__9ucQv",spin:"PricingCard_spin__24tni"};const D=({children:e,onClose:t,size:n="medium"})=>l.createElement("div",{className:A.dialogOverlay},l.createElement("div",{className:`${A.pricingCard} ${A[n]}`},l.createElement("button",{className:A.dialogClose,onClick:t},"×"),l.createElement("div",{className:A.pricingCardHeader},l.createElement("div",{className:A.allianceLogo}),l.createElement("h2",{className:A.stablepayTitle},"StablePay")),l.createElement("div",{className:A.pricingCardBody},e)));class x{constructor(e){this.networkSelector=e,this.selectedToken=null}selectToken(e){const t=this.networkSelector.getSelectedNetworkConfig();return!(!t||!t.tokens[e])&&(this.selectedToken={key:e,...t.tokens[e]},!0)}getSelectedToken(){return this.selectedToken}getAvailableTokens(){const e=this.networkSelector.getSelectedNetworkConfig();return e?Object.entries(e.tokens).map((([e,t])=>({key:e,...t}))):[]}resetSelection(){this.selectedToken=null}}const P=d(),B=({children:e,networkSelector:t})=>{const[n]=m((()=>new x(t))),[r,a]=m(null),[i,o]=m(null),[s,c]=m(null),d=()=>{o(null),c(null)};return u((()=>{a(t.selectedNetwork)}),[t.selectedNetwork]),l.createElement(P.Provider,{value:{networkSelector:t,tokenSelector:n,selectedNetwork:r,selectedToken:i,transactionDetails:s,setTransactionDetails:c,selectNetwork:e=>!!t.selectNetwork(e)&&(a(e),d(),!0),selectToken:e=>{if(n.selectToken(e)){const e=n.getSelectedToken();return o(e),!0}return!1},resetSelections:()=>{t.selectNetwork(null),a(null),d()}}},e)},j=()=>{const e=c(P);if(void 0===e)throw new Error("useNetwork must be used within a NetworkProvider");return e},I=()=>{const{networkSelector:e,selectedNetwork:t,selectNetwork:n}=j();return l.createElement("div",{className:A.selectField},l.createElement("label",{htmlFor:"network-select"},"Select Network"),l.createElement("select",{id:"network-select",onChange:e=>{n(e.target.value)},value:t||""},l.createElement("option",{value:"",disabled:!0},"Select a network"),Object.keys(e.availableNetworks).map((e=>l.createElement("option",{key:e,value:e},e)))))},F=()=>{const{networkSelector:e,tokenSelector:t,selectedNetwork:n,selectedToken:r,selectToken:a,setTransactionDetails:i}=j(),[o,s]=m(!1),[c,d]=m(null),u=n?t.getAvailableTokens():[];return l.createElement("div",{className:A.selectField},l.createElement("label",{htmlFor:"token-select"},"Select Token"),l.createElement("select",{id:"token-select",onChange:async r=>{const o=r.target.value;d(null),s(!0);try{if(a(o)){const r=e.getSelectedNetworkConfig(),a=new v(r.uri,r.djedAddress);await a.init();const s=e.getTokenAmount(o),l=a.getBlockchainDetails();let c=null;"native"===o&&(c=await a.handleTradeDataBuySc(String(s))),i({network:n,token:o,tokenSymbol:t.getSelectedToken().symbol,amount:s,receivingAddress:e.getReceivingAddress(),djedContractAddress:r.djedAddress,isDirectTransfer:t.getSelectedToken().isDirectTransfer||!1,isNativeToken:t.getSelectedToken().isNative||!1,tradeAmount:c?c.amount:null,...l})}}catch(e){console.error("Error fetching transaction details:",e),d("Failed to fetch transaction details. Please try again.")}finally{s(!1)}},value:r?r.key:"",disabled:!n||o},l.createElement("option",{value:"",disabled:!0},n?o?"Loading...":"Select a token":"Please select a network first"),u.map((e=>l.createElement("option",{key:e.key,value:e.key},e.symbol," (",e.isDirectTransfer?"Direct Transfer":"Native",")")))),c&&l.createElement("div",{className:A.error},c))},L=w({id:63,name:"Mordor Testnet",network:"mordor",nativeCurrency:{decimals:18,name:"Mordor Ether",symbol:"METC"},rpcUrls:{default:{http:["https://rpc.mordor.etccooperative.org"],webSocket:["wss://rpc.mordor.etccooperative.org/ws"]}},blockExplorers:{default:{name:"BlockScout",url:"https://blockscout.com/etc/mordor"}},testnet:!0}),z=w({id:61,name:"Ethereum Classic",network:"ethereum-classic",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETC"},rpcUrls:{default:{http:["https://etc.rivet.link"]}},blockExplorers:{default:{name:"BlockScout",url:"https://blockscout.com/etc/mainnet"}},testnet:!1}),$=d(null),R=({children:e})=>{const[t,n]=m(null),[r,a]=m(null),[i,o]=m(null),[s,c]=m(null),[d,w]=m(null),[p,_]=m(null),[E,f]=m(!1),v=("ethereum-classic-mainnet"===window.__STABLEPAY_SELECTED_NETWORK__?z:L).id,y=()=>"ethereum-classic-mainnet"===window.__STABLEPAY_SELECTED_NETWORK__?z:L,T=h((async()=>{if(!window.ethereum)return _("Please install MetaMask or another Web3 wallet"),!1;f(!0),_(null);try{const e=await window.ethereum.request({method:"eth_requestAccounts"});if(0===e.length)throw new Error("No wallet address found. Please unlock your wallet.");const t=await window.ethereum.request({method:"eth_chainId"}),r=parseInt(t,16);if(r!==v)try{await window.ethereum.request({method:"wallet_switchEthereumChain",params:[{chainId:`0x${v.toString(16)}`}]})}catch(e){if(4902!==e.code)throw new Error(`Please switch to ${y().name} in MetaMask`);try{const e=y();await window.ethereum.request({method:"wallet_addEthereumChain",params:[{chainId:`0x${e.id.toString(16)}`,chainName:e.name,nativeCurrency:e.nativeCurrency,rpcUrls:e.rpcUrls.default.http,blockExplorerUrls:[e.blockExplorers.default.url]}]})}catch(e){throw new Error("Failed to add chain to MetaMask")}}const a=g({chain:y(),transport:k(window.ethereum)});n(a),o(e[0]),c(r);const i=C({chain:y(),transport:b()}),s=await i.getBalance({address:e[0]});return w(parseFloat(s)/Math.pow(10,18)),window.ethereum.on("accountsChanged",A),window.ethereum.on("chainChanged",S),!0}catch(e){return console.error("Error connecting wallet:",e),_(e.message),!1}finally{f(!1)}}),[]),N=h((()=>{a(C({chain:y(),transport:b()}))}),[]),S=async e=>{const t=parseInt(e,16);c(t);if(t===y().id){if(window.ethereum){const e=g({chain:y(),transport:k(window.ethereum)});n(e)}}else _(`Wrong network detected. Please switch to ${y().name}`)},A=async e=>{if(0===e.length)D();else{o(e[0]);const t=C({chain:y(),transport:b()}),n=await t.getBalance({address:e[0]});w(parseFloat(n)/Math.pow(10,18))}},D=h((()=>{n(null),o(null),c(null),w(null),window.ethereum&&(window.ethereum.removeListener("accountsChanged",A),window.ethereum.removeListener("chainChanged",S))}),[]);return u((()=>{N()}),[N]),l.createElement($.Provider,{value:{walletClient:t,publicClient:r,account:i,chainId:s,balance:d,error:p,isConnecting:E,connectWallet:T,disconnectWallet:D}},e)},U=({onTransactionComplete:e})=>{const{networkSelector:t,selectedNetwork:n,selectedToken:r,transactionDetails:a,setTransactionDetails:i}=j(),{connectWallet:o,account:s,walletClient:d,publicClient:h,isConnecting:w}=(()=>{const e=c($);if(!e)throw new Error("useWallet must be used within a WalletProvider");return e})(),[g,k]=m(null),[C,b]=m(null),[f,y]=m(null),[T,N]=m(""),[S,D]=m(null),[x,P]=m(null),[B,I]=m(!1);if(u((()=>{(async()=>{if(n&&r)try{const e=t.getSelectedNetworkConfig(),a=t.getReceivingAddress(),o=t.getTokenAmount(r.key),s=new v(e.uri,e.djedAddress);await s.init(),k(s);let l=null;if("native"===r.key)try{l=await s.handleTradeDataBuySc(String(o)),b(l)}catch(e){console.error("Error fetching trade data:",e)}i({network:n,token:r.key,tokenSymbol:r.symbol,amount:o||"0",receivingAddress:a,djedContractAddress:e.djedAddress,isDirectTransfer:r.isDirectTransfer||!1,isNativeToken:r.isNative||!1,tradeAmount:l?l.amount:null,...s.getBlockchainDetails()})}catch(e){console.error("Error initializing transaction:",e)}})()}),[n,r,t,i]),!a)return l.createElement("div",{className:A.loading},"Initializing transaction...");return l.createElement("div",{className:A.transactionReview},l.createElement("div",{className:A.transactionInfo},l.createElement("span",{className:A.transactionLabel},"Network:"),l.createElement("span",{className:A.transactionValue},a.network)),l.createElement("div",{className:A.transactionInfo},l.createElement("span",{className:A.transactionLabel},"You Pay:"),l.createElement("span",{className:A.transactionValue},"stablecoin"===r.key?`${a.amount} ${a.tokenSymbol}`:`${C||"Calculating..."} ${a.tokenSymbol}`)),l.createElement("button",{className:A.walletButton,onClick:async()=>{await o()&&console.log("Wallet connected:",s)},disabled:w},w?"Connecting...":"Connect Wallet"),s&&!f&&l.createElement("button",{className:A.walletButton,onClick:async()=>{if(s&&a&&g)try{N("⏳ Preparing transaction...");const e=a.receivingAddress;let t;if("native"===r.key){const n="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",r=C||"0";t=await g.buyStablecoins(s,e,p(String(r)),n)}else{const n=a.amount?_(String(a.amount),a.stableCoinDecimals):"0";t={to:"0xdc86935A9597aA3A9008d2f26232233043091284",data:E({abi:[{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}],functionName:"transfer",args:[e,n]}),account:s}}y(t),N("✅ Transaction ready! Click 'Send Transaction' to proceed.")}catch(e){P(e),N("❌ Transaction preparation failed.")}else N("❌ Wallet not connected or transaction details missing")}},"Prepare Transaction"),s&&f&&l.createElement("button",{className:A.walletButton,onClick:async()=>{try{if(!d||!s||!f)return void N("❌ Wallet client, account, or transaction data is missing");N("⏳ Sending transaction...");const t=await d.sendTransaction({...f,account:s});D(t),N("✅ Transaction sent!"),e&&e({txHash:t,network:n,token:r?.key,tokenSymbol:r?.symbol,amount:a?.amount,receivingAddress:a?.receivingAddress})}catch(e){P(e),N("❌ Transaction failed.")}},disabled:null!==S},"Send Transaction"),T&&l.createElement("div",{className:"message-box"},T,x&&l.createElement("button",{onClick:()=>I(!B),className:A.detailsButton},B?"Hide Details":"Show Details")),B&&x&&l.createElement("div",{className:A.errorDetails},l.createElement("pre",null,x.message)),S&&l.createElement("div",{className:A.transactionLink},"✅ Transaction Hash:"," ",l.createElement("a",{href:(()=>{if(!S||!n)return null;const e={"mordor-testnet":"https://blockscout.com/etc/mordor/tx/","ethereum-classic":"https://blockscout.com/etc/mainnet/tx/",sepolia:"https://sepolia.etherscan.io/tx/","milkomeda-mainnet":"https://explorer-mainnet-cardano-evm.c1.milkomeda.com/tx/"};return e[n]?`${e[n]}${S}`:null})()||"#",target:"_blank",rel:"noopener noreferrer",className:A.explorerLink,style:{color:"#007bff",textDecoration:"underline",fontWeight:"bold",cursor:"pointer",wordBreak:"break-word"}},S.slice(0,6),"...",S.slice(-6))))},W=({onClose:e,buttonSize:t,onTransactionComplete:n})=>{const{resetSelections:r}=j();return l.createElement(D,{onClose:()=>{r(),e()},size:t},l.createElement(I,null),l.createElement(F,null),l.createElement(U,{onTransactionComplete:n}))},M=({onClose:e,buttonSize:t,networkSelector:n,onTransactionComplete:r})=>(window.__STABLEPAY_SELECTED_NETWORK__=n?.selectedNetwork||null,l.createElement(B,{networkSelector:n},l.createElement(R,null,l.createElement(W,{onClose:e,buttonSize:t,onTransactionComplete:r})))),O={NetworkSelector:class{constructor(e){this.merchantConfig=e,this.blacklist=e.getBlacklist(),this.availableNetworks=this.getAvailableNetworks(),this.selectedNetwork=null}getAvailableNetworks(){return Object.entries(f).reduce(((e,[t,n])=>(this.blacklist.includes(n.chainId)||(e[t]=n),e)),{})}selectNetwork(e){return null===e?(this.selectedNetwork=null,console.log("Network selection reset"),!0):this.availableNetworks[e]?(this.selectedNetwork=e,console.log(`Network selected: ${e}`),!0):(console.error(`Invalid network: ${e}`),!1)}getSelectedNetworkConfig(){return this.selectedNetwork?this.availableNetworks[this.selectedNetwork]:null}getReceivingAddress(){return this.merchantConfig.getReceivingAddress()}getTokenAmount(e){return this.merchantConfig.getTokenAmount(this.selectedNetwork,e)}},Transaction:v,Config:class{constructor(e={}){this.receivingAddress=e.receivingAddress||"",this.blacklist=e.blacklist||[],this.amounts=e.Amounts||{},this.validateConfig()}validateConfig(){if(!this.receivingAddress)throw new Error("Receiving address is required");for(const[e,t]of Object.entries(this.amounts)){if(!f[e])throw new Error(`Invalid network: ${e}`);if(!t.stablecoin||"number"!=typeof t.stablecoin||t.stablecoin<=0)throw new Error(`Invalid stablecoin amount for network ${e}`)}}getBlacklist(){return this.blacklist}getReceivingAddress(){return this.receivingAddress}getTokenAmount(e){console.log("Getting amount for network:",e),console.log("Amounts object:",this.amounts);const t=this.amounts[e]?.stablecoin;return console.log("Returning amount:",t),t||0}},Widget:({networkSelector:e,buttonSize:t="medium",onTransactionComplete:n,onSuccess:r})=>{const[a,i]=m(!1),o=n||r;return l.createElement("div",{className:A.widgetContainer},!a&&l.createElement(S,{onClick:()=>{i(!0)},size:t}),a&&l.createElement(M,{onClose:()=>{i(!1)},buttonSize:t,networkSelector:e,onTransactionComplete:o}))},PayButton:S,Dialog:D,NetworkDropdown:I};export{O as default}; diff --git a/stablepay-sdk/dist/umd/index.js b/stablepay-sdk/dist/umd/index.js index b08e3d6..c060fe3 100644 --- a/stablepay-sdk/dist/umd/index.js +++ b/stablepay-sdk/dist/umd/index.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("djed-sdk"),require("react"),require("viem")):"function"==typeof define&&define.amd?define(["djed-sdk","react","viem"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).StablePay=t(e.DjedSdk,e.React,e.viem)}(this,(function(e,t,n){"use strict";const a={sepolia:{uri:"https://ethereum-sepolia.publicnode.com/",chainId:11155111,djedAddress:"0x624FcD0a1F9B5820c950FefD48087531d38387f4",tokens:{stablecoin:{symbol:"SOD",address:"0x6b930182787F346F18666D167e8d32166dC5eFBD",decimals:18,isDirectTransfer:!0},native:{symbol:"ETH",decimals:18,isNative:!0}},feeUI:0},"milkomeda-mainnet":{uri:"https://rpc-mainnet-cardano-evm.c1.milkomeda.com",chainId:2001,djedAddress:"0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76",tokens:{stablecoin:{symbol:"MOD",address:"0xcbA90fB1003b9D1bc6a2b66257D2585011b004e9",decimals:18,isDirectTransfer:!0},native:{symbol:"mADA",decimals:18,isNative:!0}},feeUI:0},"ethereum-classic":{uri:"https://rpc.mordor.etccooperative.org",chainId:63,djedAddress:"0xD4548F4b6d08852B56cdabC6be7Fd90953179d68",tokens:{stablecoin:{symbol:"ECSD",address:"0xffD4505B3452Dc22f8473616d50503bA9E1710Ac",decimals:18,isDirectTransfer:!0},native:{symbol:"ETC",decimals:18,isNative:!0}},feeUI:0}};class r{constructor(e,t){this.networkUri=e,this.djedAddress=t}async init(){if(!this.networkUri||!this.djedAddress)throw new Error("Network URI and DJED address are required");try{this.web3=await e.getWeb3(this.networkUri),this.djedContract=e.getDjedContract(this.web3,this.djedAddress);const{stableCoin:t,reserveCoin:n}=await e.getCoinContracts(this.djedContract,this.web3),{scDecimals:a,rcDecimals:r}=await e.getDecimals(t,n);this.stableCoin=t,this.reserveCoin=n,this.scDecimals=a,this.rcDecimals=r,this.oracleContract=await e.getOracleAddress(this.djedContract).then((t=>e.getOracleContract(this.web3,t,this.djedContract._address))),this.oracleAddress=this.oracleContract._address,console.log("Transaction initialized successfully")}catch(e){throw console.error("Error initializing transaction:",e),e}}getBlockchainDetails(){return{web3Available:!!this.web3,djedContractAvailable:!!this.djedContract,stableCoinAddress:this.stableCoin?this.stableCoin._address:"N/A",reserveCoinAddress:this.reserveCoin?this.reserveCoin._address:"N/A",stableCoinDecimals:this.scDecimals,reserveCoinDecimals:this.rcDecimals,oracleAddress:this.oracleAddress||"N/A",oracleContractAvailable:!!this.oracleContract}}async handleTradeDataBuySc(t){if(!this.djedContract)throw new Error("DJED contract is not initialized");if("string"!=typeof t)throw new Error("Amount must be a string");try{return(await e.tradeDataPriceBuySc(this.djedContract,this.scDecimals,t)).totalBCScaled}catch(e){throw console.error("Error fetching trade data for buying stablecoins: ",e),e}}async buyStablecoins(t,n,a){if(!this.djedContract)throw new Error("DJED contract is not initialized");try{console.log(`Building stablecoin purchase transaction from ${t} to ${n} with value ${a}`);const r="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",o=await e.buyScTx(this.djedContract,t,n,a,r,this.djedAddress);return console.log("Transaction built:",o),o}catch(e){throw console.error("Error executing buyStablecoins transaction: ",e),e}}}var o="main_stablePayButton__UA7HC",i="main_logo__ITyEy",s="main_buttonText__N-ewy";const l=({onClick:e,size:n="medium"})=>{const a={small:{width:"200px",height:"50px",fontSize:"14px"},medium:{width:"250px",height:"60px",fontSize:"16px"},large:{width:"300px",height:"70px",fontSize:"18px"}},r={small:{width:"35px",height:"33px"},medium:{width:"40px",height:"38px"},large:{width:"45px",height:"43px"}},l=a[n]||a.medium,c=r[n]||r.medium;return t.createElement("button",{className:o,onClick:e,style:l},t.createElement("div",{className:i,style:c}),t.createElement("span",{className:s},"Pay with StablePay"))};var c={dialogOverlay:"PricingCard_dialogOverlay__0XJrE",pricingCard:"PricingCard_pricingCard__LrWb9",small:"PricingCard_small__J4CHj",medium:"PricingCard_medium__EVmTB",large:"PricingCard_large__A6pnX",dialogClose:"PricingCard_dialogClose__jJ1tM",pricingCardHeader:"PricingCard_pricingCardHeader__wGczA",allianceLogo:"PricingCard_allianceLogo__URa-U",stablepayTitle:"PricingCard_stablepayTitle__4t848",pricingCardBody:"PricingCard_pricingCardBody__0wKQn",selectField:"PricingCard_selectField__LBPoZ",transactionReview:"PricingCard_transactionReview__Ix-eL",transactionInfo:"PricingCard_transactionInfo__Ck-Rc",transactionLabel:"PricingCard_transactionLabel__GDux7",transactionValue:"PricingCard_transactionValue__q-xxp",infoSection:"PricingCard_infoSection__gyjMQ",infoIcon:"PricingCard_infoIcon__rraxD",infoText:"PricingCard_infoText__l4b7A",walletButton:"PricingCard_walletButton__llw4v",loading:"PricingCard_loading__2-tGA",error:"PricingCard_error__m5fK-",networkError:"PricingCard_networkError__zR-36",errorText:"PricingCard_errorText__qZRJt","message-box":"PricingCard_message-box__vkUKy",detailsButton:"PricingCard_detailsButton__jHglL",errorDetails:"PricingCard_errorDetails__CzN-7",loadingContainer:"PricingCard_loadingContainer__6nOVa",spinner:"PricingCard_spinner__9ucQv",spin:"PricingCard_spin__24tni"};const d=({children:e,onClose:n,size:a="medium"})=>t.createElement("div",{className:c.dialogOverlay},t.createElement("div",{className:`${c.pricingCard} ${c[a]}`},t.createElement("button",{className:c.dialogClose,onClick:n},"×"),t.createElement("div",{className:c.pricingCardHeader},t.createElement("div",{className:c.allianceLogo}),t.createElement("h2",{className:c.stablepayTitle},"StablePay")),t.createElement("div",{className:c.pricingCardBody},e)));class u{constructor(e){this.networkSelector=e,this.selectedToken=null}selectToken(e){const t=this.networkSelector.getSelectedNetworkConfig();return!(!t||!t.tokens[e])&&(this.selectedToken={key:e,...t.tokens[e]},!0)}getSelectedToken(){return this.selectedToken}getAvailableTokens(){const e=this.networkSelector.getSelectedNetworkConfig();return e?Object.entries(e.tokens).map((([e,t])=>({key:e,...t}))):[]}resetSelection(){this.selectedToken=null}}const m=t.createContext(),h=({children:e,networkSelector:n})=>{const[a]=t.useState((()=>new u(n))),[r,o]=t.useState(null),[i,s]=t.useState(null),[l,c]=t.useState(null),d=()=>{s(null),c(null)};return t.useEffect((()=>{o(n.selectedNetwork)}),[n.selectedNetwork]),t.createElement(m.Provider,{value:{networkSelector:n,tokenSelector:a,selectedNetwork:r,selectedToken:i,transactionDetails:l,setTransactionDetails:c,selectNetwork:e=>!!n.selectNetwork(e)&&(o(e),d(),!0),selectToken:e=>{if(a.selectToken(e)){const e=a.getSelectedToken();return s(e),!0}return!1},resetSelections:()=>{n.selectNetwork(null),o(null),d()}}},e)},g=()=>{const e=t.useContext(m);if(void 0===e)throw new Error("useNetwork must be used within a NetworkProvider");return e},w=()=>{const{networkSelector:e,selectedNetwork:n,selectNetwork:a}=g();return t.createElement("div",{className:c.selectField},t.createElement("label",{htmlFor:"network-select"},"Select Network"),t.createElement("select",{id:"network-select",onChange:e=>{a(e.target.value)},value:n||""},t.createElement("option",{value:"",disabled:!0},"Select a network"),Object.keys(e.availableNetworks).map((e=>t.createElement("option",{key:e,value:e},e)))))},k=()=>{const{networkSelector:e,tokenSelector:n,selectedNetwork:a,selectedToken:o,selectToken:i,setTransactionDetails:s}=g(),[l,d]=t.useState(!1),[u,m]=t.useState(null),h=a?n.getAvailableTokens():[];return t.createElement("div",{className:c.selectField},t.createElement("label",{htmlFor:"token-select"},"Select Token"),t.createElement("select",{id:"token-select",onChange:async t=>{const o=t.target.value;m(null),d(!0);try{if(i(o)){const t=e.getSelectedNetworkConfig(),i=new r(t.uri,t.djedAddress);await i.init();const l=e.getTokenAmount(o),c=i.getBlockchainDetails();let d=null;"native"===o&&(d=await i.handleTradeDataBuySc(String(l))),s({network:a,token:o,tokenSymbol:n.getSelectedToken().symbol,amount:l,receivingAddress:e.getReceivingAddress(),djedContractAddress:t.djedAddress,isDirectTransfer:n.getSelectedToken().isDirectTransfer||!1,isNativeToken:n.getSelectedToken().isNative||!1,tradeAmount:d?d.amount:null,...c})}}catch(e){console.error("Error fetching transaction details:",e),m("Failed to fetch transaction details. Please try again.")}finally{d(!1)}},value:o?o.key:"",disabled:!a||l},t.createElement("option",{value:"",disabled:!0},a?l?"Loading...":"Select a token":"Please select a network first"),h.map((e=>t.createElement("option",{key:e.key,value:e.key},e.symbol," (",e.isDirectTransfer?"Direct Transfer":"Native",")")))),u&&t.createElement("div",{className:c.error},u))},C=n.defineChain({id:63,name:"Mordor Testnet",network:"mordor",nativeCurrency:{decimals:18,name:"Mordor Ether",symbol:"METC"},rpcUrls:{default:{http:["https://rpc.mordor.etccooperative.org"],webSocket:["wss://rpc.mordor.etccooperative.org/ws"]}},blockExplorers:{default:{name:"BlockScout",url:"https://blockscout.com/etc/mordor"}},testnet:!0}),b=t.createContext(null),p=({children:e})=>{const[a,r]=t.useState(null),[o,i]=t.useState(null),[s,l]=t.useState(null),[c,d]=t.useState(null),[u,m]=t.useState(null),[h,g]=t.useState(null),[w,k]=t.useState(!1),p=C.id,f=t.useCallback((async()=>{if(!window.ethereum)return g("Please install MetaMask or another Web3 wallet"),!1;k(!0),g(null);try{const e=await window.ethereum.request({method:"eth_requestAccounts"});if(0===e.length)throw new Error("No wallet address found. Please unlock your wallet.");const t=await window.ethereum.request({method:"eth_chainId"}),a=parseInt(t,16);if(a!==p)try{await window.ethereum.request({method:"wallet_switchEthereumChain",params:[{chainId:`0x${p.toString(16)}`}]})}catch(e){if(4902!==e.code)throw new Error("Please switch to Mordor Testnet in MetaMask");try{await window.ethereum.request({method:"wallet_addEthereumChain",params:[{chainId:`0x${p.toString(16)}`,chainName:"Mordor Testnet",nativeCurrency:{name:"Mordor ETC",symbol:"METC",decimals:18},rpcUrls:["https://rpc.mordor.etccooperative.org"],blockExplorerUrls:["https://etc-mordor.blockscout.com/"]}]})}catch(e){throw new Error("Failed to add Mordor Testnet to MetaMask")}}const o=n.createWalletClient({chain:C,transport:n.custom(window.ethereum)});r(o),l(e[0]),d(a);const i=n.createPublicClient({chain:C,transport:n.http()}),s=await i.getBalance({address:e[0]});return m(parseFloat(s)/Math.pow(10,18)),window.ethereum.on("accountsChanged",_),window.ethereum.on("chainChanged",v),!0}catch(e){return console.error("Error connecting wallet:",e),g(e.message),!1}finally{k(!1)}}),[]),y=t.useCallback((()=>{i(n.createPublicClient({chain:C,transport:n.http()}))}),[]),v=async e=>{const t=parseInt(e,16);if(d(t),t===p){if(window.ethereum){const e=n.createWalletClient({chain:C,transport:n.custom(window.ethereum)});r(e)}}else g("Wrong network detected. Please switch to Mordor Testnet")},_=async e=>{if(0===e.length)E();else{l(e[0]);const t=n.createPublicClient({chain:C,transport:n.http()}),a=await t.getBalance({address:e[0]});m(parseFloat(a)/Math.pow(10,18))}},E=t.useCallback((()=>{r(null),l(null),d(null),m(null),window.ethereum&&(window.ethereum.removeListener("accountsChanged",_),window.ethereum.removeListener("chainChanged",v))}),[]);return t.useEffect((()=>{y()}),[y]),t.createElement(b.Provider,{value:{walletClient:a,publicClient:o,account:s,chainId:c,balance:u,error:h,isConnecting:w,connectWallet:f,disconnectWallet:E}},e)},f=({onTransactionComplete:e})=>{const{networkSelector:a,selectedNetwork:o,selectedToken:i,transactionDetails:s,setTransactionDetails:l}=g(),{connectWallet:d,account:u,walletClient:m,publicClient:h,isConnecting:w}=(()=>{const e=t.useContext(b);if(!e)throw new Error("useWallet must be used within a WalletProvider");return e})(),[k,C]=t.useState(null),[p,f]=t.useState(null),[y,v]=t.useState(null),[_,E]=t.useState(""),[S,T]=t.useState(null),[N,A]=t.useState(null),[D,x]=t.useState(!1);if(t.useEffect((()=>{(async()=>{if(o&&i)try{const e=a.getSelectedNetworkConfig(),t=a.getReceivingAddress(),n=a.getTokenAmount(i.key),s=new r(e.uri,e.djedAddress);await s.init(),C(s);let c=null;if("native"===i.key)try{c=await s.handleTradeDataBuySc(String(n)),f(c)}catch(e){console.error("Error fetching trade data:",e)}l({network:o,token:i.key,tokenSymbol:i.symbol,amount:n||"0",receivingAddress:t,djedContractAddress:e.djedAddress,isDirectTransfer:i.isDirectTransfer||!1,isNativeToken:i.isNative||!1,tradeAmount:c?c.amount:null,...s.getBlockchainDetails()})}catch(e){console.error("Error initializing transaction:",e)}})()}),[o,i,a,l]),!s)return t.createElement("div",{className:c.loading},"Initializing transaction...");return t.createElement("div",{className:c.transactionReview},t.createElement("div",{className:c.transactionInfo},t.createElement("span",{className:c.transactionLabel},"Network:"),t.createElement("span",{className:c.transactionValue},s.network)),t.createElement("div",{className:c.transactionInfo},t.createElement("span",{className:c.transactionLabel},"You Pay:"),t.createElement("span",{className:c.transactionValue},"stablecoin"===i.key?`${s.amount} ${s.tokenSymbol}`:`${p||"Calculating..."} ${s.tokenSymbol}`)),t.createElement("button",{className:c.walletButton,onClick:async()=>{await d()&&console.log("Wallet connected:",u)},disabled:w},w?"Connecting...":"Connect Wallet"),u&&!y&&t.createElement("button",{className:c.walletButton,onClick:async()=>{if(u&&s&&k)try{E("⏳ Preparing transaction...");const e=s.receivingAddress;let t;if("native"===i.key){const a="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",r=p||"0";t=await k.buyStablecoins(u,e,n.parseEther(String(r)),a)}else{const a=s.amount?n.parseUnits(String(s.amount),s.stableCoinDecimals):"0";t={to:"0xdc86935A9597aA3A9008d2f26232233043091284",data:n.encodeFunctionData({abi:[{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}],functionName:"transfer",args:[e,a]}),account:u}}v(t),E("✅ Transaction ready! Click 'Send Transaction' to proceed.")}catch(e){A(e),E("❌ Transaction preparation failed.")}else E("❌ Wallet not connected or transaction details missing")}},"Prepare Transaction"),u&&y&&t.createElement("button",{className:c.walletButton,onClick:async()=>{try{if(!m||!u||!y)return void E("❌ Wallet client, account, or transaction data is missing");E("⏳ Sending transaction...");const t=await m.sendTransaction({...y,account:u});T(t),E("✅ Transaction sent!"),e&&e({txHash:t,network:o,token:i?.key,tokenSymbol:i?.symbol,amount:s?.amount,receivingAddress:s?.receivingAddress})}catch(e){A(e),E("❌ Transaction failed.")}},disabled:null!==S},"Send Transaction"),_&&t.createElement("div",{className:"message-box"},_,N&&t.createElement("button",{onClick:()=>x(!D),className:c.detailsButton},D?"Hide Details":"Show Details")),D&&N&&t.createElement("div",{className:c.errorDetails},t.createElement("pre",null,N.message)),S&&t.createElement("div",{className:c.transactionLink},"✅ Transaction Hash:"," ",t.createElement("a",{href:`https://blockscout.com/etc/mordor/tx/${S}`,target:"_blank",rel:"noopener noreferrer",className:c.explorerLink,style:{color:"#007bff",textDecoration:"underline",fontWeight:"bold",cursor:"pointer",wordBreak:"break-word"}},S.slice(0,6),"...",S.slice(-6))))},y=({onClose:e,buttonSize:n,onTransactionComplete:a})=>{const{resetSelections:r}=g();return t.createElement(d,{onClose:()=>{r(),e()},size:n},t.createElement(w,null),t.createElement(k,null),t.createElement(f,{onTransactionComplete:a}))},v=({onClose:e,buttonSize:n,networkSelector:a,onTransactionComplete:r})=>t.createElement(h,{networkSelector:a},t.createElement(p,null,t.createElement(y,{onClose:e,buttonSize:n,onTransactionComplete:r})));return{NetworkSelector:class{constructor(e){this.merchantConfig=e,this.blacklist=e.getBlacklist(),this.availableNetworks=this.getAvailableNetworks(),this.selectedNetwork=null}getAvailableNetworks(){return Object.entries(a).reduce(((e,[t,n])=>(this.blacklist.includes(n.chainId)||(e[t]=n),e)),{})}selectNetwork(e){return null===e?(this.selectedNetwork=null,console.log("Network selection reset"),!0):this.availableNetworks[e]?(this.selectedNetwork=e,console.log(`Network selected: ${e}`),!0):(console.error(`Invalid network: ${e}`),!1)}getSelectedNetworkConfig(){return this.selectedNetwork?this.availableNetworks[this.selectedNetwork]:null}getReceivingAddress(){return this.merchantConfig.getReceivingAddress()}getTokenAmount(e){return this.merchantConfig.getTokenAmount(this.selectedNetwork,e)}},Transaction:r,Config:class{constructor(e={}){this.receivingAddress=e.receivingAddress||"",this.blacklist=e.blacklist||[],this.amounts=e.Amounts||{},this.validateConfig()}validateConfig(){if(!this.receivingAddress)throw new Error("Receiving address is required");for(const[e,t]of Object.entries(this.amounts)){if(!a[e])throw new Error(`Invalid network: ${e}`);if(!t.stablecoin||"number"!=typeof t.stablecoin||t.stablecoin<=0)throw new Error(`Invalid stablecoin amount for network ${e}`)}}getBlacklist(){return this.blacklist}getReceivingAddress(){return this.receivingAddress}getTokenAmount(e){console.log("Getting amount for network:",e),console.log("Amounts object:",this.amounts);const t=this.amounts[e]?.stablecoin;return console.log("Returning amount:",t),t||0}},Widget:({networkSelector:e,buttonSize:n="medium",onTransactionComplete:a,onSuccess:r})=>{const[o,i]=t.useState(!1),s=a||r;return t.createElement("div",{className:c.widgetContainer},!o&&t.createElement(l,{onClick:()=>{i(!0)},size:n}),o&&t.createElement(v,{onClose:()=>{i(!1)},buttonSize:n,networkSelector:e,onTransactionComplete:s}))},PayButton:l,Dialog:d,NetworkDropdown:w}})); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("djed-sdk"),require("react"),require("viem")):"function"==typeof define&&define.amd?define(["djed-sdk","react","viem"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).StablePay=t(e.DjedSdk,e.React,e.viem)}(this,(function(e,t,n){"use strict";const a={sepolia:{uri:"https://ethereum-sepolia.publicnode.com/",chainId:11155111,djedAddress:"0x624FcD0a1F9B5820c950FefD48087531d38387f4",tokens:{stablecoin:{symbol:"SOD",address:"0x6b930182787F346F18666D167e8d32166dC5eFBD",decimals:18,isDirectTransfer:!0},native:{symbol:"ETH",decimals:18,isNative:!0}},feeUI:0},"milkomeda-mainnet":{uri:"https://rpc-mainnet-cardano-evm.c1.milkomeda.com",chainId:2001,djedAddress:"0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76",tokens:{stablecoin:{symbol:"MOD",address:"0xcbA90fB1003b9D1bc6a2b66257D2585011b004e9",decimals:18,isDirectTransfer:!0},native:{symbol:"mADA",decimals:18,isNative:!0}},feeUI:0},"mordor-testnet":{uri:"https://rpc.mordor.etccooperative.org",chainId:63,djedAddress:"0xD4548F4b6d08852B56cdabC6be7Fd90953179d68",tokens:{stablecoin:{symbol:"ECSD",address:"0xffD4505B3452Dc22f8473616d50503bA9E1710Ac",decimals:18,isDirectTransfer:!0},native:{symbol:"ETC",decimals:18,isNative:!0}},feeUI:0},"ethereum-classic":{uri:"https://etc.rivet.link",chainId:61,djedAddress:"0xCc3664d7021FD36B1Fe2b136e2324710c8442cCf",tokens:{stablecoin:{symbol:"ECSD",address:"0x5A7Ca94F6E969C94bef4CE5e2f90ed9d4891918A",decimals:18,isDirectTransfer:!0},native:{symbol:"ETC",decimals:18,isNative:!0}},feeUI:0}};class r{constructor(e,t){this.networkUri=e,this.djedAddress=t}async init(){if(!this.networkUri||!this.djedAddress)throw new Error("Network URI and DJED address are required");try{this.web3=await e.getWeb3(this.networkUri),this.djedContract=e.getDjedContract(this.web3,this.djedAddress);const{stableCoin:t,reserveCoin:n}=await e.getCoinContracts(this.djedContract,this.web3),{scDecimals:a,rcDecimals:r}=await e.getDecimals(t,n);this.stableCoin=t,this.reserveCoin=n,this.scDecimals=a,this.rcDecimals=r,this.oracleContract=await e.getOracleAddress(this.djedContract).then((t=>e.getOracleContract(this.web3,t,this.djedContract._address))),this.oracleAddress=this.oracleContract._address,console.log("Transaction initialized successfully")}catch(e){throw console.error("Error initializing transaction:",e),e}}getBlockchainDetails(){return{web3Available:!!this.web3,djedContractAvailable:!!this.djedContract,stableCoinAddress:this.stableCoin?this.stableCoin._address:"N/A",reserveCoinAddress:this.reserveCoin?this.reserveCoin._address:"N/A",stableCoinDecimals:this.scDecimals,reserveCoinDecimals:this.rcDecimals,oracleAddress:this.oracleAddress||"N/A",oracleContractAvailable:!!this.oracleContract}}async handleTradeDataBuySc(t){if(!this.djedContract)throw new Error("DJED contract is not initialized");if("string"!=typeof t)throw new Error("Amount must be a string");try{return(await e.tradeDataPriceBuySc(this.djedContract,this.scDecimals,t)).totalBCScaled}catch(e){throw console.error("Error fetching trade data for buying stablecoins: ",e),e}}async buyStablecoins(t,n,a){if(!this.djedContract)throw new Error("DJED contract is not initialized");try{console.log(`Building stablecoin purchase transaction from ${t} to ${n} with value ${a}`);const r="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",i=await e.buyScTx(this.djedContract,t,n,a,r,this.djedAddress);return console.log("Transaction built:",i),i}catch(e){throw console.error("Error executing buyStablecoins transaction: ",e),e}}}var i="main_stablePayButton__UA7HC",o="main_logo__ITyEy",s="main_buttonText__N-ewy";const l=({onClick:e,size:n="medium"})=>{const a={small:{width:"200px",height:"50px",fontSize:"14px"},medium:{width:"250px",height:"60px",fontSize:"16px"},large:{width:"300px",height:"70px",fontSize:"18px"}},r={small:{width:"35px",height:"33px"},medium:{width:"40px",height:"38px"},large:{width:"45px",height:"43px"}},l=a[n]||a.medium,c=r[n]||r.medium;return t.createElement("button",{className:i,onClick:e,style:l},t.createElement("div",{className:o,style:c}),t.createElement("span",{className:s},"Pay with StablePay"))};var c={dialogOverlay:"PricingCard_dialogOverlay__0XJrE",pricingCard:"PricingCard_pricingCard__LrWb9",small:"PricingCard_small__J4CHj",medium:"PricingCard_medium__EVmTB",large:"PricingCard_large__A6pnX",dialogClose:"PricingCard_dialogClose__jJ1tM",pricingCardHeader:"PricingCard_pricingCardHeader__wGczA",allianceLogo:"PricingCard_allianceLogo__URa-U",stablepayTitle:"PricingCard_stablepayTitle__4t848",pricingCardBody:"PricingCard_pricingCardBody__0wKQn",selectField:"PricingCard_selectField__LBPoZ",transactionReview:"PricingCard_transactionReview__Ix-eL",transactionInfo:"PricingCard_transactionInfo__Ck-Rc",transactionLabel:"PricingCard_transactionLabel__GDux7",transactionValue:"PricingCard_transactionValue__q-xxp",infoSection:"PricingCard_infoSection__gyjMQ",infoIcon:"PricingCard_infoIcon__rraxD",infoText:"PricingCard_infoText__l4b7A",walletButton:"PricingCard_walletButton__llw4v",loading:"PricingCard_loading__2-tGA",error:"PricingCard_error__m5fK-",networkError:"PricingCard_networkError__zR-36",errorText:"PricingCard_errorText__qZRJt","message-box":"PricingCard_message-box__vkUKy",detailsButton:"PricingCard_detailsButton__jHglL",errorDetails:"PricingCard_errorDetails__CzN-7",loadingContainer:"PricingCard_loadingContainer__6nOVa",spinner:"PricingCard_spinner__9ucQv",spin:"PricingCard_spin__24tni"};const d=({children:e,onClose:n,size:a="medium"})=>t.createElement("div",{className:c.dialogOverlay},t.createElement("div",{className:`${c.pricingCard} ${c[a]}`},t.createElement("button",{className:c.dialogClose,onClick:n},"×"),t.createElement("div",{className:c.pricingCardHeader},t.createElement("div",{className:c.allianceLogo}),t.createElement("h2",{className:c.stablepayTitle},"StablePay")),t.createElement("div",{className:c.pricingCardBody},e)));class u{constructor(e){this.networkSelector=e,this.selectedToken=null}selectToken(e){const t=this.networkSelector.getSelectedNetworkConfig();return!(!t||!t.tokens[e])&&(this.selectedToken={key:e,...t.tokens[e]},!0)}getSelectedToken(){return this.selectedToken}getAvailableTokens(){const e=this.networkSelector.getSelectedNetworkConfig();return e?Object.entries(e.tokens).map((([e,t])=>({key:e,...t}))):[]}resetSelection(){this.selectedToken=null}}const m=t.createContext(),h=({children:e,networkSelector:n})=>{const[a]=t.useState((()=>new u(n))),[r,i]=t.useState(null),[o,s]=t.useState(null),[l,c]=t.useState(null),d=()=>{s(null),c(null)};return t.useEffect((()=>{i(n.selectedNetwork)}),[n.selectedNetwork]),t.createElement(m.Provider,{value:{networkSelector:n,tokenSelector:a,selectedNetwork:r,selectedToken:o,transactionDetails:l,setTransactionDetails:c,selectNetwork:e=>!!n.selectNetwork(e)&&(i(e),d(),!0),selectToken:e=>{if(a.selectToken(e)){const e=a.getSelectedToken();return s(e),!0}return!1},resetSelections:()=>{n.selectNetwork(null),i(null),d()}}},e)},w=()=>{const e=t.useContext(m);if(void 0===e)throw new Error("useNetwork must be used within a NetworkProvider");return e},g=()=>{const{networkSelector:e,selectedNetwork:n,selectNetwork:a}=w();return t.createElement("div",{className:c.selectField},t.createElement("label",{htmlFor:"network-select"},"Select Network"),t.createElement("select",{id:"network-select",onChange:e=>{a(e.target.value)},value:n||""},t.createElement("option",{value:"",disabled:!0},"Select a network"),Object.keys(e.availableNetworks).map((e=>t.createElement("option",{key:e,value:e},e)))))},k=()=>{const{networkSelector:e,tokenSelector:n,selectedNetwork:a,selectedToken:i,selectToken:o,setTransactionDetails:s}=w(),[l,d]=t.useState(!1),[u,m]=t.useState(null),h=a?n.getAvailableTokens():[];return t.createElement("div",{className:c.selectField},t.createElement("label",{htmlFor:"token-select"},"Select Token"),t.createElement("select",{id:"token-select",onChange:async t=>{const i=t.target.value;m(null),d(!0);try{if(o(i)){const t=e.getSelectedNetworkConfig(),o=new r(t.uri,t.djedAddress);await o.init();const l=e.getTokenAmount(i),c=o.getBlockchainDetails();let d=null;"native"===i&&(d=await o.handleTradeDataBuySc(String(l))),s({network:a,token:i,tokenSymbol:n.getSelectedToken().symbol,amount:l,receivingAddress:e.getReceivingAddress(),djedContractAddress:t.djedAddress,isDirectTransfer:n.getSelectedToken().isDirectTransfer||!1,isNativeToken:n.getSelectedToken().isNative||!1,tradeAmount:d?d.amount:null,...c})}}catch(e){console.error("Error fetching transaction details:",e),m("Failed to fetch transaction details. Please try again.")}finally{d(!1)}},value:i?i.key:"",disabled:!a||l},t.createElement("option",{value:"",disabled:!0},a?l?"Loading...":"Select a token":"Please select a network first"),h.map((e=>t.createElement("option",{key:e.key,value:e.key},e.symbol," (",e.isDirectTransfer?"Direct Transfer":"Native",")")))),u&&t.createElement("div",{className:c.error},u))},C=n.defineChain({id:63,name:"Mordor Testnet",network:"mordor",nativeCurrency:{decimals:18,name:"Mordor Ether",symbol:"METC"},rpcUrls:{default:{http:["https://rpc.mordor.etccooperative.org"],webSocket:["wss://rpc.mordor.etccooperative.org/ws"]}},blockExplorers:{default:{name:"BlockScout",url:"https://blockscout.com/etc/mordor"}},testnet:!0}),b=n.defineChain({id:61,name:"Ethereum Classic",network:"ethereum-classic",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETC"},rpcUrls:{default:{http:["https://etc.rivet.link"]}},blockExplorers:{default:{name:"BlockScout",url:"https://blockscout.com/etc/mainnet"}},testnet:!1}),p=t.createContext(null),f=({children:e})=>{const[a,r]=t.useState(null),[i,o]=t.useState(null),[s,l]=t.useState(null),[c,d]=t.useState(null),[u,m]=t.useState(null),[h,w]=t.useState(null),[g,k]=t.useState(!1),f=("ethereum-classic-mainnet"===window.__STABLEPAY_SELECTED_NETWORK__?b:C).id,_=()=>"ethereum-classic-mainnet"===window.__STABLEPAY_SELECTED_NETWORK__?b:C,E=t.useCallback((async()=>{if(!window.ethereum)return w("Please install MetaMask or another Web3 wallet"),!1;k(!0),w(null);try{const e=await window.ethereum.request({method:"eth_requestAccounts"});if(0===e.length)throw new Error("No wallet address found. Please unlock your wallet.");const t=await window.ethereum.request({method:"eth_chainId"}),a=parseInt(t,16);if(a!==f)try{await window.ethereum.request({method:"wallet_switchEthereumChain",params:[{chainId:`0x${f.toString(16)}`}]})}catch(e){if(4902!==e.code)throw new Error(`Please switch to ${_().name} in MetaMask`);try{const e=_();await window.ethereum.request({method:"wallet_addEthereumChain",params:[{chainId:`0x${e.id.toString(16)}`,chainName:e.name,nativeCurrency:e.nativeCurrency,rpcUrls:e.rpcUrls.default.http,blockExplorerUrls:[e.blockExplorers.default.url]}]})}catch(e){throw new Error("Failed to add chain to MetaMask")}}const i=n.createWalletClient({chain:_(),transport:n.custom(window.ethereum)});r(i),l(e[0]),d(a);const o=n.createPublicClient({chain:_(),transport:n.http()}),s=await o.getBalance({address:e[0]});return m(parseFloat(s)/Math.pow(10,18)),window.ethereum.on("accountsChanged",S),window.ethereum.on("chainChanged",y),!0}catch(e){return console.error("Error connecting wallet:",e),w(e.message),!1}finally{k(!1)}}),[]),v=t.useCallback((()=>{o(n.createPublicClient({chain:_(),transport:n.http()}))}),[]),y=async e=>{const t=parseInt(e,16);d(t);if(t===_().id){if(window.ethereum){const e=n.createWalletClient({chain:_(),transport:n.custom(window.ethereum)});r(e)}}else w(`Wrong network detected. Please switch to ${_().name}`)},S=async e=>{if(0===e.length)T();else{l(e[0]);const t=n.createPublicClient({chain:_(),transport:n.http()}),a=await t.getBalance({address:e[0]});m(parseFloat(a)/Math.pow(10,18))}},T=t.useCallback((()=>{r(null),l(null),d(null),m(null),window.ethereum&&(window.ethereum.removeListener("accountsChanged",S),window.ethereum.removeListener("chainChanged",y))}),[]);return t.useEffect((()=>{v()}),[v]),t.createElement(p.Provider,{value:{walletClient:a,publicClient:i,account:s,chainId:c,balance:u,error:h,isConnecting:g,connectWallet:E,disconnectWallet:T}},e)},_=({onTransactionComplete:e})=>{const{networkSelector:a,selectedNetwork:i,selectedToken:o,transactionDetails:s,setTransactionDetails:l}=w(),{connectWallet:d,account:u,walletClient:m,publicClient:h,isConnecting:g}=(()=>{const e=t.useContext(p);if(!e)throw new Error("useWallet must be used within a WalletProvider");return e})(),[k,C]=t.useState(null),[b,f]=t.useState(null),[_,E]=t.useState(null),[v,y]=t.useState(""),[S,T]=t.useState(null),[N,A]=t.useState(null),[D,x]=t.useState(!1);if(t.useEffect((()=>{(async()=>{if(i&&o)try{const e=a.getSelectedNetworkConfig(),t=a.getReceivingAddress(),n=a.getTokenAmount(o.key),s=new r(e.uri,e.djedAddress);await s.init(),C(s);let c=null;if("native"===o.key)try{c=await s.handleTradeDataBuySc(String(n)),f(c)}catch(e){console.error("Error fetching trade data:",e)}l({network:i,token:o.key,tokenSymbol:o.symbol,amount:n||"0",receivingAddress:t,djedContractAddress:e.djedAddress,isDirectTransfer:o.isDirectTransfer||!1,isNativeToken:o.isNative||!1,tradeAmount:c?c.amount:null,...s.getBlockchainDetails()})}catch(e){console.error("Error initializing transaction:",e)}})()}),[i,o,a,l]),!s)return t.createElement("div",{className:c.loading},"Initializing transaction...");return t.createElement("div",{className:c.transactionReview},t.createElement("div",{className:c.transactionInfo},t.createElement("span",{className:c.transactionLabel},"Network:"),t.createElement("span",{className:c.transactionValue},s.network)),t.createElement("div",{className:c.transactionInfo},t.createElement("span",{className:c.transactionLabel},"You Pay:"),t.createElement("span",{className:c.transactionValue},"stablecoin"===o.key?`${s.amount} ${s.tokenSymbol}`:`${b||"Calculating..."} ${s.tokenSymbol}`)),t.createElement("button",{className:c.walletButton,onClick:async()=>{await d()&&console.log("Wallet connected:",u)},disabled:g},g?"Connecting...":"Connect Wallet"),u&&!_&&t.createElement("button",{className:c.walletButton,onClick:async()=>{if(u&&s&&k)try{y("⏳ Preparing transaction...");const e=s.receivingAddress;let t;if("native"===o.key){const a="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",r=b||"0";t=await k.buyStablecoins(u,e,n.parseEther(String(r)),a)}else{const a=s.amount?n.parseUnits(String(s.amount),s.stableCoinDecimals):"0";t={to:"0xdc86935A9597aA3A9008d2f26232233043091284",data:n.encodeFunctionData({abi:[{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}],functionName:"transfer",args:[e,a]}),account:u}}E(t),y("✅ Transaction ready! Click 'Send Transaction' to proceed.")}catch(e){A(e),y("❌ Transaction preparation failed.")}else y("❌ Wallet not connected or transaction details missing")}},"Prepare Transaction"),u&&_&&t.createElement("button",{className:c.walletButton,onClick:async()=>{try{if(!m||!u||!_)return void y("❌ Wallet client, account, or transaction data is missing");y("⏳ Sending transaction...");const t=await m.sendTransaction({..._,account:u});T(t),y("✅ Transaction sent!"),e&&e({txHash:t,network:i,token:o?.key,tokenSymbol:o?.symbol,amount:s?.amount,receivingAddress:s?.receivingAddress})}catch(e){A(e),y("❌ Transaction failed.")}},disabled:null!==S},"Send Transaction"),v&&t.createElement("div",{className:"message-box"},v,N&&t.createElement("button",{onClick:()=>x(!D),className:c.detailsButton},D?"Hide Details":"Show Details")),D&&N&&t.createElement("div",{className:c.errorDetails},t.createElement("pre",null,N.message)),S&&t.createElement("div",{className:c.transactionLink},"✅ Transaction Hash:"," ",t.createElement("a",{href:(()=>{if(!S||!i)return null;const e={"mordor-testnet":"https://blockscout.com/etc/mordor/tx/","ethereum-classic":"https://blockscout.com/etc/mainnet/tx/",sepolia:"https://sepolia.etherscan.io/tx/","milkomeda-mainnet":"https://explorer-mainnet-cardano-evm.c1.milkomeda.com/tx/"};return e[i]?`${e[i]}${S}`:null})()||"#",target:"_blank",rel:"noopener noreferrer",className:c.explorerLink,style:{color:"#007bff",textDecoration:"underline",fontWeight:"bold",cursor:"pointer",wordBreak:"break-word"}},S.slice(0,6),"...",S.slice(-6))))},E=({onClose:e,buttonSize:n,onTransactionComplete:a})=>{const{resetSelections:r}=w();return t.createElement(d,{onClose:()=>{r(),e()},size:n},t.createElement(g,null),t.createElement(k,null),t.createElement(_,{onTransactionComplete:a}))},v=({onClose:e,buttonSize:n,networkSelector:a,onTransactionComplete:r})=>(window.__STABLEPAY_SELECTED_NETWORK__=a?.selectedNetwork||null,t.createElement(h,{networkSelector:a},t.createElement(f,null,t.createElement(E,{onClose:e,buttonSize:n,onTransactionComplete:r}))));return{NetworkSelector:class{constructor(e){this.merchantConfig=e,this.blacklist=e.getBlacklist(),this.availableNetworks=this.getAvailableNetworks(),this.selectedNetwork=null}getAvailableNetworks(){return Object.entries(a).reduce(((e,[t,n])=>(this.blacklist.includes(n.chainId)||(e[t]=n),e)),{})}selectNetwork(e){return null===e?(this.selectedNetwork=null,console.log("Network selection reset"),!0):this.availableNetworks[e]?(this.selectedNetwork=e,console.log(`Network selected: ${e}`),!0):(console.error(`Invalid network: ${e}`),!1)}getSelectedNetworkConfig(){return this.selectedNetwork?this.availableNetworks[this.selectedNetwork]:null}getReceivingAddress(){return this.merchantConfig.getReceivingAddress()}getTokenAmount(e){return this.merchantConfig.getTokenAmount(this.selectedNetwork,e)}},Transaction:r,Config:class{constructor(e={}){this.receivingAddress=e.receivingAddress||"",this.blacklist=e.blacklist||[],this.amounts=e.Amounts||{},this.validateConfig()}validateConfig(){if(!this.receivingAddress)throw new Error("Receiving address is required");for(const[e,t]of Object.entries(this.amounts)){if(!a[e])throw new Error(`Invalid network: ${e}`);if(!t.stablecoin||"number"!=typeof t.stablecoin||t.stablecoin<=0)throw new Error(`Invalid stablecoin amount for network ${e}`)}}getBlacklist(){return this.blacklist}getReceivingAddress(){return this.receivingAddress}getTokenAmount(e){console.log("Getting amount for network:",e),console.log("Amounts object:",this.amounts);const t=this.amounts[e]?.stablecoin;return console.log("Returning amount:",t),t||0}},Widget:({networkSelector:e,buttonSize:n="medium",onTransactionComplete:a,onSuccess:r})=>{const[i,o]=t.useState(!1),s=a||r;return t.createElement("div",{className:c.widgetContainer},!i&&t.createElement(l,{onClick:()=>{o(!0)},size:n}),i&&t.createElement(v,{onClose:()=>{o(!1)},buttonSize:n,networkSelector:e,onTransactionComplete:s}))},PayButton:l,Dialog:d,NetworkDropdown:g}})); //# sourceMappingURL=index.js.map diff --git a/stablepay-sdk/dist/umd/index.js.map b/stablepay-sdk/dist/umd/index.js.map index bd4022a..9da09e5 100644 --- a/stablepay-sdk/dist/umd/index.js.map +++ b/stablepay-sdk/dist/umd/index.js.map @@ -1 +1 @@ -{"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': { //Mordor Testnet details\n uri: 'https://rpc.mordor.etccooperative.org', // Mordor RPC\n chainId: 63, \n djedAddress: '0xD4548F4b6d08852B56cdabC6be7Fd90953179d68', //Mordor DJED contract\n tokens: {\n stablecoin: {\n symbol: 'ECSD',\n address: '0xffD4505B3452Dc22f8473616d50503bA9E1710Ac', // Mordor Stablecoin\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 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 // Get the oracle contract\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\n console.log('Transaction initialized successfully');\n } catch (error) {\n console.error('Error initializing transaction:', error);\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; //converted ETH equivalent\n } catch (error) {\n console.error(\"Error fetching trade data for buying stablecoins: \", error);\n throw error;\n }\n }\n\n // use buyScTx directly\n async buyStablecoins(payer, receiver, value) {\n if (!this.djedContract) {\n throw new Error(\"DJED contract is not initialized\");\n }\n try {\n console.log(`Building stablecoin purchase transaction from ${payer} to ${receiver} with value ${value}`);\n\n //Hardcoded UI address\n const UI = '0x0232556C83791b8291E9b23BfEa7d67405Bd9839';\n\n //buyScTx from djed-sdk\n const txData = await buyScTx(this.djedContract, payer, receiver, value, UI, this.djedAddress);\n\n console.log(\"Transaction built:\", txData);\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';\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","import React, { createContext, useContext, useState, useCallback, useEffect } from 'react';\nimport { createWalletClient, createPublicClient, custom, http } from 'viem';\nimport { mordor } 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\nexport const WalletProvider = ({ children }) => {\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 expectedChainId = mordor.id; // Use Mordor Testnet\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 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 try {\n await window.ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${expectedChainId.toString(16)}` }],\n });\n } catch (switchError) {\n if (switchError.code === 4902) {\n try {\n await window.ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [\n {\n chainId: `0x${expectedChainId.toString(16)}`,\n chainName: 'Mordor Testnet',\n nativeCurrency: {\n name: 'Mordor ETC',\n symbol: 'METC',\n decimals: 18,\n },\n rpcUrls: ['https://rpc.mordor.etccooperative.org'],\n blockExplorerUrls: ['https://etc-mordor.blockscout.com/'],\n },\n ],\n });\n } catch (addError) {\n throw new Error('Failed to add Mordor Testnet to MetaMask');\n }\n } else {\n throw new Error('Please switch to Mordor Testnet in MetaMask');\n }\n }\n }\n\n const walletClient = createWalletClient({\n chain: mordor,\n transport: custom(window.ethereum),\n });\n\n setWalletClient(walletClient);\n setAccount(accounts[0]);\n setChainId(currentChainId);\n\n const publicClient = createPublicClient({ chain: mordor, transport: http() });\n const balance = await publicClient.getBalance({ address: accounts[0] });\n setBalance(parseFloat(balance) / Math.pow(10, 18));\n\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 }, []);\n\n const connectPublicClient = useCallback(() => {\n setPublicClient(createPublicClient({ chain: mordor, transport: http() }));\n }, []);\n\n const handleChainChanged = async (chainIdHex) => {\n const newChainId = parseInt(chainIdHex, 16);\n setChainId(newChainId);\n\n if (newChainId !== expectedChainId) {\n setError(`Wrong network detected. Please switch to Mordor Testnet`);\n return;\n }\n\n if (window.ethereum) {\n const walletClient = createWalletClient({ chain: mordor, transport: custom(window.ethereum) });\n setWalletClient(walletClient);\n }\n };\n\n const handleAccountsChanged = async (accounts) => {\n if (accounts.length === 0) {\n disconnectWallet();\n } else {\n setAccount(accounts[0]);\n\n const publicClient = createPublicClient({ chain: mordor, transport: http() });\n const balance = await publicClient.getBalance({ address: accounts[0] });\n setBalance(parseFloat(balance) / Math.pow(10, 18));\n }\n };\n\n const disconnectWallet = useCallback(() => {\n setWalletClient(null);\n setAccount(null);\n setChainId(null);\n setBalance(null);\n\n if (window.ethereum) {\n window.ethereum.removeListener('accountsChanged', handleAccountsChanged);\n window.ethereum.removeListener('chainChanged', handleChainChanged);\n }\n }, []);\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 STABLECOIN_CONTRACT_ADDRESS = \"0xdc86935A9597aA3A9008d2f26232233043091284\"; \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 } = 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 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 const success = await connectWallet();\n if (success) {\n console.log(\"Wallet connected:\", account);\n }\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 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\n builtTx = await transaction.buyStablecoins(\n account,\n receiver,\n parseEther(String(amountToSend)),\n UI\n );\n } else {\n const amountToSend = contextTransactionDetails.amount\n ? parseUnits(\n String(contextTransactionDetails.amount),\n contextTransactionDetails.stableCoinDecimals\n )\n : \"0\";\n\n builtTx = {\n to: STABLECOIN_CONTRACT_ADDRESS,\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 try {\n if (!walletClient || !account || !txData) {\n setMessage(\"❌ Wallet client, account, or transaction data is missing\");\n return;\n }\n\n setMessage(\"⏳ Sending transaction...\");\n\n const txHash = await walletClient.sendTransaction({\n ...txData,\n account: account,\n });\n\n setTxHash(txHash);\n setMessage(`✅ Transaction sent!`);\n \n // Call the callback with transaction details\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 }\n };\n\n const getExplorerUrl = () => {\n if (!txHash || !selectedNetwork) return null;\n\n const explorerBaseUrls = {\n \"ethereum-classic\": \"https://etc-mordor.blockscout.com/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 \n {txHash.slice(0, 6)}...{txHash.slice(-6)}\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","console","log","error","getBlockchainDetails","web3Available","djedContractAvailable","stableCoinAddress","reserveCoinAddress","stableCoinDecimals","reserveCoinDecimals","oracleContractAvailable","handleTradeDataBuySc","amountScaled","tradeDataPriceBuySc","totalBCScaled","buyStablecoins","payer","receiver","value","UI","txData","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","mordor","defineChain","name","nativeCurrency","rpcUrls","default","http","webSocket","blockExplorers","url","testnet","WalletContext","WalletProvider","walletClient","setWalletClient","publicClient","setPublicClient","account","setAccount","setChainId","balance","setBalance","isConnecting","setIsConnecting","expectedChainId","connectWallet","useCallback","window","ethereum","accounts","request","method","length","chainIdHex","currentChainId","parseInt","params","toString","switchError","code","chainName","blockExplorerUrls","addError","createWalletClient","chain","transport","custom","createPublicClient","getBalance","parseFloat","Math","pow","on","handleAccountsChanged","handleChainChanged","message","connectPublicClient","newChainId","disconnectWallet","removeListener","TransactionReview","onTransactionComplete","contextTransactionDetails","useWallet","setTransaction","tradeDataBuySc","setTradeDataBuySc","setTxData","setMessage","txHash","setTxHash","isErrorDetailsVisible","setIsErrorDetailsVisible","newTransaction","tradeError","initializeTransaction","transactionReview","transactionInfo","transactionLabel","transactionValue","walletButton","builtTx","amountToSend","parseEther","parseUnits","to","data","encodeFunctionData","abi","inputs","internalType","type","outputs","stateMutability","functionName","args","sendTransaction","detailsButton","errorDetails","transactionLink","href","rel","explorerLink","color","textDecoration","fontWeight","cursor","wordBreak","slice","WidgetContent","buttonSize","handleClose","WidgetWithProviders","NetworkSelector","merchantConfig","blacklist","getBlacklist","getAvailableNetworks","reduce","acc","includes","Config","options","amounts","Amounts","validateConfig","Widget","onSuccess","isDialogOpen","setIsDialogOpen","handleTransactionComplete","widgetContainer","handleOpenDialog","handleCloseDialog"],"mappings":"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"} \ No newline at end of file +{"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\r\nexport const networksConfig = {\r\n 'sepolia': {\r\n uri: 'https://ethereum-sepolia.publicnode.com/',\r\n chainId: 11155111,\r\n djedAddress: '0x624FcD0a1F9B5820c950FefD48087531d38387f4',\r\n tokens: {\r\n stablecoin: {\r\n symbol: 'SOD',\r\n address: '0x6b930182787F346F18666D167e8d32166dC5eFBD',\r\n decimals: 18,\r\n isDirectTransfer: true\r\n },\r\n native: {\r\n symbol: 'ETH',\r\n decimals: 18,\r\n isNative: true\r\n }\r\n },\r\n feeUI: 0\r\n },\r\n 'milkomeda-mainnet': {\r\n uri: 'https://rpc-mainnet-cardano-evm.c1.milkomeda.com',\r\n chainId: 2001,\r\n djedAddress: '0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76',\r\n tokens: {\r\n stablecoin: {\r\n symbol: 'MOD',\r\n address: '0xcbA90fB1003b9D1bc6a2b66257D2585011b004e9',\r\n decimals: 18,\r\n isDirectTransfer: true\r\n },\r\n native: {\r\n symbol: 'mADA',\r\n decimals: 18,\r\n isNative: true\r\n }\r\n },\r\n feeUI: 0\r\n },\r\n 'mordor-testnet': { // Mordor Testnet (ETC)\r\n uri: 'https://rpc.mordor.etccooperative.org',\r\n chainId: 63,\r\n djedAddress: '0xD4548F4b6d08852B56cdabC6be7Fd90953179d68',\r\n tokens: {\r\n stablecoin: {\r\n symbol: 'ECSD',\r\n address: '0xffD4505B3452Dc22f8473616d50503bA9E1710Ac',\r\n decimals: 18,\r\n isDirectTransfer: true\r\n },\r\n native: {\r\n symbol: 'ETC',\r\n decimals: 18,\r\n isNative: true\r\n }\r\n },\r\n feeUI: 0\r\n },\r\n 'ethereum-classic': { // ETC Mainnet\r\n uri: 'https://etc.rivet.link',\r\n chainId: 61,\r\n djedAddress: '0xCc3664d7021FD36B1Fe2b136e2324710c8442cCf',\r\n tokens: {\r\n stablecoin: {\r\n symbol: 'ECSD',\r\n address: '0x5A7Ca94F6E969C94bef4CE5e2f90ed9d4891918A',\r\n decimals: 18,\r\n isDirectTransfer: true\r\n },\r\n native: {\r\n symbol: 'ETC',\r\n decimals: 18,\r\n isNative: true\r\n }\r\n },\r\n feeUI: 0\r\n }\r\n};","import { getWeb3, getDjedContract, getCoinContracts, getDecimals, getOracleAddress, getOracleContract, tradeDataPriceBuySc, buyScTx } from 'djed-sdk';\r\n\r\nexport class Transaction {\r\n constructor(networkUri, djedAddress) {\r\n this.networkUri = networkUri;\r\n this.djedAddress = djedAddress;\r\n }\r\n\r\n async init() {\r\n if (!this.networkUri || !this.djedAddress) {\r\n throw new Error('Network URI and DJED address are required');\r\n }\r\n\r\n try {\r\n this.web3 = await getWeb3(this.networkUri);\r\n this.djedContract = getDjedContract(this.web3, this.djedAddress);\r\n const { stableCoin, reserveCoin } = await getCoinContracts(this.djedContract, this.web3);\r\n const { scDecimals, rcDecimals } = await getDecimals(stableCoin, reserveCoin);\r\n this.stableCoin = stableCoin;\r\n this.reserveCoin = reserveCoin;\r\n this.scDecimals = scDecimals;\r\n this.rcDecimals = rcDecimals;\r\n\r\n // Get the oracle contract\r\n this.oracleContract = await getOracleAddress(this.djedContract).then((addr) =>\r\n getOracleContract(this.web3, addr, this.djedContract._address)\r\n );\r\n\r\n this.oracleAddress = this.oracleContract._address;\r\n\r\n console.log('Transaction initialized successfully');\r\n } catch (error) {\r\n console.error('Error initializing transaction:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n getBlockchainDetails() {\r\n return {\r\n web3Available: !!this.web3,\r\n djedContractAvailable: !!this.djedContract,\r\n stableCoinAddress: this.stableCoin ? this.stableCoin._address : 'N/A',\r\n reserveCoinAddress: this.reserveCoin ? this.reserveCoin._address : 'N/A',\r\n stableCoinDecimals: this.scDecimals,\r\n reserveCoinDecimals: this.rcDecimals,\r\n oracleAddress: this.oracleAddress || 'N/A',\r\n oracleContractAvailable: !!this.oracleContract,\r\n };\r\n }\r\n\r\n async handleTradeDataBuySc(amountScaled) {\r\n if (!this.djedContract) {\r\n throw new Error(\"DJED contract is not initialized\");\r\n }\r\n if (typeof amountScaled !== 'string') {\r\n throw new Error(\"Amount must be a string\");\r\n }\r\n try {\r\n const result = await tradeDataPriceBuySc(this.djedContract, this.scDecimals, amountScaled);\r\n return result.totalBCScaled; //converted ETH equivalent\r\n } catch (error) {\r\n console.error(\"Error fetching trade data for buying stablecoins: \", error);\r\n throw error;\r\n }\r\n }\r\n\r\n // use buyScTx directly\r\n async buyStablecoins(payer, receiver, value) {\r\n if (!this.djedContract) {\r\n throw new Error(\"DJED contract is not initialized\");\r\n }\r\n try {\r\n console.log(`Building stablecoin purchase transaction from ${payer} to ${receiver} with value ${value}`);\r\n\r\n //Hardcoded UI address\r\n const UI = '0x0232556C83791b8291E9b23BfEa7d67405Bd9839';\r\n\r\n //buyScTx from djed-sdk\r\n const txData = await buyScTx(this.djedContract, payer, receiver, value, UI, this.djedAddress);\r\n\r\n console.log(\"Transaction built:\", txData);\r\n return txData;\r\n } catch (error) {\r\n console.error(\"Error executing buyStablecoins transaction: \", error);\r\n throw error;\r\n }\r\n }\r\n}\r\n","import React from \"react\";\r\nimport styles from \"../styles/main.css\";\r\n\r\nconst PayButton = ({ onClick, size = \"medium\" }) => {\r\n const sizeStyles = {\r\n small: { width: \"200px\", height: \"50px\", fontSize: \"14px\" },\r\n medium: { width: \"250px\", height: \"60px\", fontSize: \"16px\" },\r\n large: { width: \"300px\", height: \"70px\", fontSize: \"18px\" },\r\n };\r\n\r\n const logoSizes = {\r\n small: { width: \"35px\", height: \"33px\" },\r\n medium: { width: \"40px\", height: \"38px\" },\r\n large: { width: \"45px\", height: \"43px\" },\r\n };\r\n\r\n const buttonStyle = sizeStyles[size] || sizeStyles.medium;\r\n const logoStyle = logoSizes[size] || logoSizes.medium;\r\n\r\n return (\r\n \r\n
\r\n Pay with StablePay\r\n \r\n );\r\n};\r\n\r\nexport default PayButton;\r\n","import React from 'react';\r\nimport styles from '../styles/PricingCard.css';\r\n\r\n\r\nconst Dialog = ({ children, onClose, size = 'medium' }) => {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n

StablePay

\r\n
\r\n
\r\n {children}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Dialog;","// TokenSelector.js\r\n\r\nexport class TokenSelector {\r\n constructor(networkSelector) {\r\n this.networkSelector = networkSelector;\r\n this.selectedToken = null;\r\n }\r\n\r\n selectToken(tokenKey) {\r\n const networkConfig = this.networkSelector.getSelectedNetworkConfig();\r\n if (networkConfig && networkConfig.tokens[tokenKey]) {\r\n this.selectedToken = {\r\n key: tokenKey,\r\n ...networkConfig.tokens[tokenKey]\r\n };\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n getSelectedToken() {\r\n return this.selectedToken;\r\n }\r\n\r\n getAvailableTokens() {\r\n const networkConfig = this.networkSelector.getSelectedNetworkConfig();\r\n if (!networkConfig) return [];\r\n\r\n return Object.entries(networkConfig.tokens).map(([key, config]) => ({\r\n key,\r\n ...config\r\n }));\r\n }\r\n\r\n resetSelection() {\r\n this.selectedToken = null;\r\n }\r\n}","import React, { createContext, useState, useContext, useEffect } from 'react';\r\nimport { TokenSelector } from '../core/TokenSelector';\r\n\r\nconst NetworkContext = createContext();\r\n\r\nexport const NetworkProvider = ({ children, networkSelector }) => {\r\n const [tokenSelector] = useState(() => new TokenSelector(networkSelector));\r\n const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n const [selectedToken, setSelectedToken] = useState(null);\r\n const [transactionDetails, setTransactionDetails] = useState(null);\r\n\r\n const resetState = () => {\r\n setSelectedToken(null);\r\n setTransactionDetails(null);\r\n };\r\n\r\n const selectNetwork = (networkKey) => {\r\n if (networkSelector.selectNetwork(networkKey)) {\r\n setSelectedNetwork(networkKey);\r\n resetState(); \r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const selectToken = (tokenKey) => {\r\n if (tokenSelector.selectToken(tokenKey)) {\r\n const token = tokenSelector.getSelectedToken();\r\n setSelectedToken(token);\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const resetSelections = () => {\r\n networkSelector.selectNetwork(null);\r\n setSelectedNetwork(null);\r\n resetState();\r\n };\r\n\r\n // Synchronize context state with NetworkSelector\r\n useEffect(() => {\r\n setSelectedNetwork(networkSelector.selectedNetwork);\r\n }, [networkSelector.selectedNetwork]);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport const useNetwork = () => {\r\n const context = useContext(NetworkContext);\r\n if (context === undefined) {\r\n throw new Error('useNetwork must be used within a NetworkProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport default NetworkContext;","import React from 'react';\r\nimport { useNetwork } from '../contexts/NetworkContext';\r\nimport styles from '../styles/PricingCard.css';\r\n\r\nconst NetworkDropdown = () => {\r\n const { networkSelector, selectedNetwork, selectNetwork } = useNetwork();\r\n\r\n const handleNetworkChange = (event) => {\r\n selectNetwork(event.target.value);\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default NetworkDropdown;","import React, { useState } from \"react\";\r\nimport { useNetwork } from \"../contexts/NetworkContext\";\r\nimport { Transaction } from \"../core/Transaction\";\r\nimport styles from \"../styles/PricingCard.css\";\r\n\r\nconst TokenDropdown = () => {\r\n const {\r\n networkSelector,\r\n tokenSelector,\r\n selectedNetwork,\r\n selectedToken,\r\n selectToken,\r\n setTransactionDetails,\r\n } = useNetwork();\r\n\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(null);\r\n\r\n const handleTokenChange = async (event) => {\r\n const newValue = event.target.value;\r\n setError(null);\r\n setLoading(true);\r\n\r\n try {\r\n if (selectToken(newValue)) {\r\n const networkConfig = networkSelector.getSelectedNetworkConfig();\r\n const transaction = new Transaction(\r\n networkConfig.uri,\r\n networkConfig.djedAddress\r\n );\r\n await transaction.init();\r\n\r\n const tokenAmount = networkSelector.getTokenAmount(newValue);\r\n const blockchainDetails = transaction.getBlockchainDetails();\r\n\r\n let tradeData = null;\r\n if (newValue === \"native\") {\r\n tradeData = await transaction.handleTradeDataBuySc(\r\n String(tokenAmount)\r\n );\r\n }\r\n\r\n setTransactionDetails({\r\n network: selectedNetwork,\r\n token: newValue,\r\n tokenSymbol: tokenSelector.getSelectedToken().symbol,\r\n amount: tokenAmount,\r\n receivingAddress: networkSelector.getReceivingAddress(),\r\n djedContractAddress: networkConfig.djedAddress,\r\n isDirectTransfer:\r\n tokenSelector.getSelectedToken().isDirectTransfer || false,\r\n isNativeToken: tokenSelector.getSelectedToken().isNative || false,\r\n tradeAmount: tradeData ? tradeData.amount : null,\r\n ...blockchainDetails,\r\n });\r\n }\r\n } catch (err) {\r\n console.error(\"Error fetching transaction details:\", err);\r\n setError(\"Failed to fetch transaction details. Please try again.\");\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const availableTokens = selectedNetwork\r\n ? tokenSelector.getAvailableTokens()\r\n : [];\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {availableTokens.map((token) => (\r\n \r\n ))}\r\n \r\n {error &&
{error}
}\r\n
\r\n );\r\n};\r\n\r\nexport default TokenDropdown;\r\n","import { defineChain } from 'viem';\r\n\r\nexport const mordor = defineChain({\r\n id: 63,\r\n name: 'Mordor Testnet',\r\n network: 'mordor',\r\n nativeCurrency: {\r\n decimals: 18,\r\n name: 'Mordor Ether',\r\n symbol: 'METC',\r\n },\r\n rpcUrls: {\r\n default: {\r\n http: ['https://rpc.mordor.etccooperative.org'],\r\n webSocket: ['wss://rpc.mordor.etccooperative.org/ws'],\r\n },\r\n },\r\n blockExplorers: {\r\n default: { name: 'BlockScout', url: 'https://blockscout.com/etc/mordor' },\r\n },\r\n testnet: true,\r\n});\r\n\r\nexport const etcMainnet = defineChain({\r\n id: 61,\r\n name: 'Ethereum Classic',\r\n network: 'ethereum-classic',\r\n nativeCurrency: {\r\n decimals: 18,\r\n name: 'Ether',\r\n symbol: 'ETC',\r\n },\r\n rpcUrls: {\r\n default: {\r\n http: ['https://etc.rivet.link'],\r\n },\r\n },\r\n blockExplorers: {\r\n default: { name: 'BlockScout', url: 'https://blockscout.com/etc/mainnet' },\r\n },\r\n testnet: false,\r\n});\r\n","import React, { createContext, useContext, useState, useCallback, useEffect } from 'react';\r\nimport { createWalletClient, createPublicClient, custom, http } from 'viem';\r\nimport { mordor, etcMainnet } from './chains';\r\n\r\nconst WalletContext = createContext(null);\r\n\r\nexport const useWallet = () => {\r\n const context = useContext(WalletContext);\r\n if (!context) {\r\n throw new Error('useWallet must be used within a WalletProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport const WalletProvider = ({ children }) => {\r\n const [walletClient, setWalletClient] = useState(null);\r\n const [publicClient, setPublicClient] = useState(null);\r\n const [account, setAccount] = useState(null);\r\n const [chainId, setChainId] = useState(null);\r\n const [balance, setBalance] = useState(null);\r\n const [error, setError] = useState(null);\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n\r\n const expectedChainId = (function(){ return (window.__STABLEPAY_SELECTED_NETWORK__ === 'ethereum-classic-mainnet' ? etcMainnet : mordor).id; })();\r\n const getExpectedChain = () => {\r\n const key = window.__STABLEPAY_SELECTED_NETWORK__;\r\n if (key === 'ethereum-classic-mainnet') return etcMainnet;\r\n return mordor;\r\n };\r\n\r\n const connectWallet = useCallback(async () => {\r\n if (!window.ethereum) {\r\n setError('Please install MetaMask or another Web3 wallet');\r\n return false;\r\n }\r\n\r\n setIsConnecting(true);\r\n setError(null);\r\n\r\n try {\r\n const accounts = await window.ethereum.request({ \r\n method: 'eth_requestAccounts' \r\n });\r\n\r\n if (accounts.length === 0) {\r\n throw new Error('No wallet address found. Please unlock your wallet.');\r\n }\r\n\r\n const chainIdHex = await window.ethereum.request({ method: 'eth_chainId' });\r\n const currentChainId = parseInt(chainIdHex, 16);\r\n\r\n if (currentChainId !== expectedChainId) {\r\n try {\r\n await window.ethereum.request({\r\n method: 'wallet_switchEthereumChain',\r\n params: [{ chainId: `0x${expectedChainId.toString(16)}` }],\r\n });\r\n } catch (switchError) {\r\n if (switchError.code === 4902) {\r\n try {\r\n const expectedChain = getExpectedChain();\r\n await window.ethereum.request({\r\n method: 'wallet_addEthereumChain',\r\n params: [\r\n {\r\n chainId: `0x${expectedChain.id.toString(16)}`,\r\n chainName: expectedChain.name,\r\n nativeCurrency: expectedChain.nativeCurrency,\r\n rpcUrls: expectedChain.rpcUrls.default.http,\r\n blockExplorerUrls: [expectedChain.blockExplorers.default.url],\r\n },\r\n ],\r\n });\r\n } catch (addError) {\r\n throw new Error('Failed to add chain to MetaMask');\r\n }\r\n } else {\r\n throw new Error(`Please switch to ${getExpectedChain().name} in MetaMask`);\r\n }\r\n }\r\n }\r\n\r\n const walletClient = createWalletClient({\r\n chain: getExpectedChain(),\r\n transport: custom(window.ethereum),\r\n });\r\n\r\n setWalletClient(walletClient);\r\n setAccount(accounts[0]);\r\n setChainId(currentChainId);\r\n\r\n const publicClient = createPublicClient({ chain: getExpectedChain(), transport: http() });\r\n const balance = await publicClient.getBalance({ address: accounts[0] });\r\n setBalance(parseFloat(balance) / Math.pow(10, 18));\r\n\r\n window.ethereum.on('accountsChanged', handleAccountsChanged);\r\n window.ethereum.on('chainChanged', handleChainChanged);\r\n\r\n return true;\r\n } catch (err) {\r\n console.error('Error connecting wallet:', err);\r\n setError(err.message);\r\n return false;\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n }, []);\r\n\r\n const connectPublicClient = useCallback(() => {\r\n setPublicClient(createPublicClient({ chain: getExpectedChain(), transport: http() }));\r\n }, []);\r\n\r\n const handleChainChanged = async (chainIdHex) => {\r\n const newChainId = parseInt(chainIdHex, 16);\r\n setChainId(newChainId);\r\n\r\n const expectedId = getExpectedChain().id;\r\n if (newChainId !== expectedId) {\r\n setError(`Wrong network detected. Please switch to ${getExpectedChain().name}`);\r\n return;\r\n }\r\n\r\n if (window.ethereum) {\r\n const walletClient = createWalletClient({ chain: getExpectedChain(), transport: custom(window.ethereum) });\r\n setWalletClient(walletClient);\r\n }\r\n };\r\n\r\n const handleAccountsChanged = async (accounts) => {\r\n if (accounts.length === 0) {\r\n disconnectWallet();\r\n } else {\r\n setAccount(accounts[0]);\r\n\r\n const publicClient = createPublicClient({ chain: getExpectedChain(), transport: http() });\r\n const balance = await publicClient.getBalance({ address: accounts[0] });\r\n setBalance(parseFloat(balance) / Math.pow(10, 18));\r\n }\r\n };\r\n\r\n const disconnectWallet = useCallback(() => {\r\n setWalletClient(null);\r\n setAccount(null);\r\n setChainId(null);\r\n setBalance(null);\r\n\r\n if (window.ethereum) {\r\n window.ethereum.removeListener('accountsChanged', handleAccountsChanged);\r\n window.ethereum.removeListener('chainChanged', handleChainChanged);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n connectPublicClient();\r\n }, [connectPublicClient]);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};","import React, { useState, useEffect } from \"react\";\r\nimport { useNetwork } from \"../contexts/NetworkContext\";\r\nimport { useWallet } from \"../contexts/WalletContext\";\r\nimport { Transaction } from \"../core/Transaction\";\r\nimport { parseEther, encodeFunctionData, parseUnits } from \"viem\"; \r\nimport styles from \"../styles/PricingCard.css\";\r\n\r\nconst STABLECOIN_CONTRACT_ADDRESS = \"0xdc86935A9597aA3A9008d2f26232233043091284\"; \r\n\r\nconst TransactionReview = ({ onTransactionComplete }) => {\r\n const {\r\n networkSelector,\r\n selectedNetwork,\r\n selectedToken,\r\n transactionDetails: contextTransactionDetails,\r\n setTransactionDetails,\r\n } = useNetwork();\r\n\r\n const {\r\n connectWallet,\r\n account,\r\n walletClient,\r\n publicClient,\r\n isConnecting,\r\n } = useWallet();\r\n\r\n const [transaction, setTransaction] = useState(null);\r\n const [tradeDataBuySc, setTradeDataBuySc] = useState(null);\r\n const [txData, setTxData] = useState(null);\r\n const [message, setMessage] = useState(\"\");\r\n const [txHash, setTxHash] = useState(null);\r\n const [error, setError] = useState(null);\r\n const [isErrorDetailsVisible, setIsErrorDetailsVisible] = useState(false);\r\n\r\n useEffect(() => {\r\n const initializeTransaction = async () => {\r\n if (!selectedNetwork || !selectedToken) return;\r\n\r\n try {\r\n const networkConfig = networkSelector.getSelectedNetworkConfig();\r\n const receivingAddress = networkSelector.getReceivingAddress();\r\n const tokenAmount = networkSelector.getTokenAmount(selectedToken.key);\r\n\r\n const newTransaction = new Transaction(\r\n networkConfig.uri,\r\n networkConfig.djedAddress\r\n );\r\n await newTransaction.init();\r\n setTransaction(newTransaction);\r\n\r\n let tradeData = null;\r\n if (selectedToken.key === \"native\") {\r\n try {\r\n tradeData = await newTransaction.handleTradeDataBuySc(String(tokenAmount));\r\n setTradeDataBuySc(tradeData);\r\n } catch (tradeError) {\r\n console.error(\"Error fetching trade data:\", tradeError);\r\n }\r\n }\r\n\r\n setTransactionDetails({\r\n network: selectedNetwork,\r\n token: selectedToken.key,\r\n tokenSymbol: selectedToken.symbol,\r\n amount: tokenAmount || \"0\",\r\n receivingAddress,\r\n djedContractAddress: networkConfig.djedAddress,\r\n isDirectTransfer: selectedToken.isDirectTransfer || false,\r\n isNativeToken: selectedToken.isNative || false,\r\n tradeAmount: tradeData ? tradeData.amount : null,\r\n ...newTransaction.getBlockchainDetails(),\r\n });\r\n } catch (err) {\r\n console.error(\"Error initializing transaction:\", err);\r\n }\r\n };\r\n\r\n initializeTransaction();\r\n }, [selectedNetwork, selectedToken, networkSelector, setTransactionDetails]);\r\n\r\n if (!contextTransactionDetails) {\r\n return
Initializing transaction...
;\r\n }\r\n\r\n const handleConnectWallet = async () => {\r\n const success = await connectWallet();\r\n if (success) {\r\n console.log(\"Wallet connected:\", account);\r\n }\r\n };\r\n\r\n const handleSendTransaction = async () => {\r\n if (!account || !contextTransactionDetails || !transaction) {\r\n setMessage(\"❌ Wallet not connected or transaction details missing\");\r\n return;\r\n }\r\n\r\n try {\r\n setMessage(\"⏳ Preparing transaction...\");\r\n\r\n const receiver = contextTransactionDetails.receivingAddress;\r\n let builtTx;\r\n\r\n if (selectedToken.key === \"native\") {\r\n const UI = \"0x0232556C83791b8291E9b23BfEa7d67405Bd9839\";\r\n const amountToSend = tradeDataBuySc || \"0\";\r\n\r\n builtTx = await transaction.buyStablecoins(\r\n account,\r\n receiver,\r\n parseEther(String(amountToSend)),\r\n UI\r\n );\r\n } else {\r\n const amountToSend = contextTransactionDetails.amount\r\n ? parseUnits(\r\n String(contextTransactionDetails.amount),\r\n contextTransactionDetails.stableCoinDecimals\r\n )\r\n : \"0\";\r\n\r\n builtTx = {\r\n to: STABLECOIN_CONTRACT_ADDRESS,\r\n data: encodeFunctionData({\r\n abi: [\r\n {\r\n inputs: [\r\n { internalType: \"address\", name: \"to\", type: \"address\" },\r\n { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\r\n ],\r\n name: \"transfer\",\r\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\r\n stateMutability: \"nonpayable\",\r\n type: \"function\",\r\n },\r\n ],\r\n functionName: \"transfer\",\r\n args: [receiver, amountToSend],\r\n }),\r\n account: account,\r\n };\r\n }\r\n\r\n setTxData(builtTx);\r\n setMessage(\"✅ Transaction ready! Click 'Send Transaction' to proceed.\");\r\n } catch (error) {\r\n setError(error);\r\n setMessage(`❌ Transaction preparation failed.`);\r\n }\r\n };\r\n\r\n const handleBuySc = async () => {\r\n try {\r\n if (!walletClient || !account || !txData) {\r\n setMessage(\"❌ Wallet client, account, or transaction data is missing\");\r\n return;\r\n }\r\n\r\n setMessage(\"⏳ Sending transaction...\");\r\n\r\n const txHash = await walletClient.sendTransaction({\r\n ...txData,\r\n account: account,\r\n });\r\n\r\n setTxHash(txHash);\r\n setMessage(`✅ Transaction sent!`);\r\n \r\n // Call the callback with transaction details\r\n if (onTransactionComplete) {\r\n onTransactionComplete({\r\n txHash,\r\n network: selectedNetwork,\r\n token: selectedToken?.key,\r\n tokenSymbol: selectedToken?.symbol,\r\n amount: contextTransactionDetails?.amount,\r\n receivingAddress: contextTransactionDetails?.receivingAddress,\r\n });\r\n }\r\n } catch (error) {\r\n setError(error);\r\n setMessage(`❌ Transaction failed.`);\r\n }\r\n };\r\n\r\n const getExplorerUrl = () => {\r\n if (!txHash || !selectedNetwork) return null;\r\n\r\n const explorerBaseUrls = {\r\n \"mordor-testnet\": \"https://blockscout.com/etc/mordor/tx/\",\r\n \"ethereum-classic\": \"https://blockscout.com/etc/mainnet/tx/\",\r\n \"sepolia\": \"https://sepolia.etherscan.io/tx/\",\r\n \"milkomeda-mainnet\": \"https://explorer-mainnet-cardano-evm.c1.milkomeda.com/tx/\",\r\n };\r\n\r\n return explorerBaseUrls[selectedNetwork]\r\n ? `${explorerBaseUrls[selectedNetwork]}${txHash}`\r\n : null;\r\n };\r\n\r\n return (\r\n
\r\n
\r\n Network:\r\n {contextTransactionDetails.network}\r\n
\r\n\r\n
\r\n You Pay:\r\n \r\n {selectedToken.key === \"stablecoin\"\r\n ? `${contextTransactionDetails.amount} ${contextTransactionDetails.tokenSymbol}`\r\n : `${tradeDataBuySc ? tradeDataBuySc : \"Calculating...\"} ${\r\n contextTransactionDetails.tokenSymbol\r\n }`}\r\n \r\n
\r\n\r\n \r\n\r\n {account && !txData && (\r\n \r\n )}\r\n {account && txData && (\r\n \r\n)}\r\n\r\n\r\n {message && (\r\n
\r\n {message}\r\n {error && (\r\n setIsErrorDetailsVisible(!isErrorDetailsVisible)}\r\n className={styles.detailsButton}\r\n >\r\n {isErrorDetailsVisible ? \"Hide Details\" : \"Show Details\"}\r\n \r\n )}\r\n
\r\n )}\r\n\r\n {isErrorDetailsVisible && error && (\r\n
\r\n
{error.message}
\r\n
\r\n )}\r\n\r\n \r\n {txHash && (\r\n
\r\n ✅ Transaction Hash:{\" \"}\r\n \r\n {txHash.slice(0, 6)}...{txHash.slice(-6)}\r\n \r\n
\r\n)}\r\n\r\n
\r\n );\r\n};\r\n\r\nexport default TransactionReview;\r\n","import React, { useState } from \"react\";\r\nimport PayButton from \"./PayButton\";\r\nimport Dialog from \"./Dialog\";\r\nimport NetworkDropdown from \"./NetworkDropdown\";\r\nimport TokenDropdown from \"./TokenDropdown\";\r\nimport TransactionReview from \"./TransactionReview\";\r\nimport { NetworkProvider, useNetwork } from \"../contexts/NetworkContext\";\r\nimport { WalletProvider } from \"../contexts/WalletContext\";\r\nimport styles from \"../styles/PricingCard.css\";\r\n\r\nconst WidgetContent = ({ onClose, buttonSize, onTransactionComplete }) => {\r\n const { resetSelections } = useNetwork(); \r\n\r\n const handleClose = () => {\r\n resetSelections(); // Reset selections when closing the widget\r\n onClose();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst WidgetWithProviders = ({ onClose, buttonSize, networkSelector, onTransactionComplete }) => {\r\n // Keep a global reference of current selection for WalletContext\r\n window.__STABLEPAY_SELECTED_NETWORK__ = networkSelector?.selectedNetwork || null;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const Widget = ({ networkSelector, buttonSize = \"medium\", onTransactionComplete, onSuccess }) => {\r\n const [isDialogOpen, setIsDialogOpen] = useState(false);\r\n\r\n const handleOpenDialog = () => {\r\n setIsDialogOpen(true);\r\n };\r\n\r\n const handleCloseDialog = () => {\r\n setIsDialogOpen(false);\r\n };\r\n\r\n // Support both onTransactionComplete and onSuccess for backwards compatibility\r\n const handleTransactionComplete = onTransactionComplete || onSuccess;\r\n\r\n return (\r\n
\r\n {!isDialogOpen && (\r\n \r\n )}\r\n {isDialogOpen && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default Widget;\r\n","// src/index.js\r\nimport { NetworkSelector } from './core/NetworkSelector';\r\nimport { Transaction } from './core/Transaction';\r\nimport { Config } from './core/MerchantConfig';\r\nimport Widget from './widget/Widget.jsx';\r\nimport PayButton from './widget/PayButton.jsx';\r\nimport Dialog from './widget/Dialog.jsx';\r\nimport NetworkDropdown from './widget/NetworkDropdown.jsx';\r\nimport './styles/main.css';\r\nimport './styles/PricingCard.css';\r\n\r\nconst StablePay = {\r\n NetworkSelector,\r\n Transaction,\r\n Config,\r\n Widget,\r\n PayButton,\r\n Dialog,\r\n NetworkDropdown\r\n};\r\n\r\nexport default StablePay;","import { networksConfig } from \"../utils/config\";\r\n\r\nexport class NetworkSelector {\r\n constructor(merchantConfig) {\r\n this.merchantConfig = merchantConfig;\r\n this.blacklist = merchantConfig.getBlacklist();\r\n this.availableNetworks = this.getAvailableNetworks();\r\n this.selectedNetwork = null;\r\n }\r\n\r\n getAvailableNetworks() {\r\n return Object.entries(networksConfig).reduce(\r\n (acc, [networkKey, networkConfig]) => {\r\n if (!this.blacklist.includes(networkConfig.chainId)) {\r\n acc[networkKey] = networkConfig;\r\n }\r\n return acc;\r\n },\r\n {}\r\n );\r\n }\r\n\r\n selectNetwork(networkKey) {\r\n if (networkKey === null) {\r\n this.selectedNetwork = null;\r\n console.log(\"Network selection reset\");\r\n return true;\r\n }\r\n if (this.availableNetworks[networkKey]) {\r\n this.selectedNetwork = networkKey;\r\n console.log(`Network selected: ${networkKey}`);\r\n return true;\r\n }\r\n console.error(`Invalid network: ${networkKey}`);\r\n return false;\r\n }\r\n\r\n getSelectedNetworkConfig() {\r\n return this.selectedNetwork\r\n ? this.availableNetworks[this.selectedNetwork]\r\n : null;\r\n }\r\n\r\n getReceivingAddress() {\r\n return this.merchantConfig.getReceivingAddress();\r\n }\r\n\r\n getTokenAmount(token) {\r\n return this.merchantConfig.getTokenAmount(this.selectedNetwork, token);\r\n }\r\n}\r\n","import { networksConfig } from \"../utils/config\";\r\n\r\nexport class Config {\r\n constructor(options = {}) {\r\n this.receivingAddress = options.receivingAddress || \"\";\r\n this.blacklist = options.blacklist || [];\r\n this.amounts = options.Amounts || {}; // Note the capital 'A' in Amounts\r\n this.validateConfig();\r\n }\r\n\r\n validateConfig() {\r\n if (!this.receivingAddress) {\r\n throw new Error(\"Receiving address is required\");\r\n }\r\n // Validate stablecoin amounts\r\n for (const [network, tokens] of Object.entries(this.amounts)) {\r\n if (!networksConfig[network]) {\r\n throw new Error(`Invalid network: ${network}`);\r\n }\r\n if (\r\n !tokens.stablecoin ||\r\n typeof tokens.stablecoin !== \"number\" ||\r\n tokens.stablecoin <= 0\r\n ) {\r\n throw new Error(`Invalid stablecoin amount for network ${network}`);\r\n }\r\n }\r\n }\r\n\r\n getBlacklist() {\r\n return this.blacklist;\r\n }\r\n\r\n getReceivingAddress() {\r\n return this.receivingAddress;\r\n }\r\n\r\n // getTokenAmount(network, token) {\r\n // const networkConfig = networksConfig[network];\r\n // if (!networkConfig) return 0;\r\n\r\n // const stablecoinSymbol = networkConfig.tokens.stablecoin.symbol;\r\n\r\n // if (token === 'stablecoin') {\r\n // return this.amounts[network]?.stablecoin || 0;\r\n // }\r\n // // For native tokens, return 0 as it's not specified in the new structure\r\n // return 0;\r\n // }\r\n getTokenAmount(network) {\r\n console.log(\"Getting amount for network:\", network);\r\n console.log(\"Amounts object:\", this.amounts);\r\n\r\n // Directly return the stablecoin amount for the network\r\n const amount = this.amounts[network]?.stablecoin;\r\n console.log(\"Returning amount:\", amount);\r\n\r\n return amount || 0;\r\n }\r\n}\r\n\r\nexport default Config;\r\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","console","log","error","getBlockchainDetails","web3Available","djedContractAvailable","stableCoinAddress","reserveCoinAddress","stableCoinDecimals","reserveCoinDecimals","oracleContractAvailable","handleTradeDataBuySc","amountScaled","tradeDataPriceBuySc","totalBCScaled","buyStablecoins","payer","receiver","value","UI","txData","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","mordor","defineChain","name","nativeCurrency","rpcUrls","default","http","webSocket","blockExplorers","url","testnet","etcMainnet","WalletContext","WalletProvider","walletClient","setWalletClient","publicClient","setPublicClient","account","setAccount","setChainId","balance","setBalance","isConnecting","setIsConnecting","expectedChainId","window","__STABLEPAY_SELECTED_NETWORK__","getExpectedChain","connectWallet","useCallback","ethereum","accounts","request","method","length","chainIdHex","currentChainId","parseInt","params","toString","switchError","code","expectedChain","chainName","blockExplorerUrls","addError","createWalletClient","chain","transport","custom","createPublicClient","getBalance","parseFloat","Math","pow","on","handleAccountsChanged","handleChainChanged","message","connectPublicClient","newChainId","disconnectWallet","removeListener","TransactionReview","onTransactionComplete","contextTransactionDetails","useWallet","setTransaction","tradeDataBuySc","setTradeDataBuySc","setTxData","setMessage","txHash","setTxHash","isErrorDetailsVisible","setIsErrorDetailsVisible","newTransaction","tradeError","initializeTransaction","transactionReview","transactionInfo","transactionLabel","transactionValue","walletButton","builtTx","amountToSend","parseEther","parseUnits","to","data","encodeFunctionData","abi","inputs","internalType","type","outputs","stateMutability","functionName","args","sendTransaction","detailsButton","errorDetails","transactionLink","href","getExplorerUrl","explorerBaseUrls","rel","explorerLink","color","textDecoration","fontWeight","cursor","wordBreak","slice","WidgetContent","buttonSize","handleClose","WidgetWithProviders","NetworkSelector","merchantConfig","blacklist","getBlacklist","getAvailableNetworks","reduce","acc","includes","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/package-lock.json b/stablepay-sdk/package-lock.json index 27f5b5d..4fe5c3f 100644 --- a/stablepay-sdk/package-lock.json +++ b/stablepay-sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "stablepay-sdk", - "version": "1.0.2", + "version": "1.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "stablepay-sdk", - "version": "1.0.2", + "version": "1.0.3", "license": "ISC", "dependencies": { "djed-sdk": "^1.0.2", @@ -54,15 +54,85 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -83,6 +153,24 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -107,6 +195,25 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/helper-plugin-utils": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", @@ -127,9 +234,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -146,15 +253,30 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { + "node_modules/@babel/helpers": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { + "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -278,18 +400,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -320,14 +442,14 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -789,6 +911,18 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -2156,6 +2290,14 @@ "node": ">= 0.6" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", @@ -3142,6 +3284,17 @@ "loader-utils": "^3.2.0" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -3777,6 +3930,20 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -3882,6 +4049,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -4146,6 +4324,26 @@ "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -4547,6 +4745,36 @@ "node": ">= 0.4" } }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/postcss-calc": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", diff --git a/stablepay-sdk/src/contexts/WalletContext.jsx b/stablepay-sdk/src/contexts/WalletContext.jsx index 3eff2b2..6df9c76 100644 --- a/stablepay-sdk/src/contexts/WalletContext.jsx +++ b/stablepay-sdk/src/contexts/WalletContext.jsx @@ -1,6 +1,6 @@ import React, { createContext, useContext, useState, useCallback, useEffect } from 'react'; import { createWalletClient, createPublicClient, custom, http } from 'viem'; -import { mordor } from './chains'; +import { mordor, etcMainnet } from './chains'; const WalletContext = createContext(null); @@ -21,7 +21,12 @@ export const WalletProvider = ({ children }) => { const [error, setError] = useState(null); const [isConnecting, setIsConnecting] = useState(false); - const expectedChainId = mordor.id; // Use Mordor Testnet + const expectedChainId = (function(){ return (window.__STABLEPAY_SELECTED_NETWORK__ === 'ethereum-classic-mainnet' ? etcMainnet : mordor).id; })(); + const getExpectedChain = () => { + const key = window.__STABLEPAY_SELECTED_NETWORK__; + if (key === 'ethereum-classic-mainnet') return etcMainnet; + return mordor; + }; const connectWallet = useCallback(async () => { if (!window.ethereum) { @@ -53,33 +58,30 @@ export const WalletProvider = ({ children }) => { } catch (switchError) { if (switchError.code === 4902) { try { + const expectedChain = getExpectedChain(); await window.ethereum.request({ method: 'wallet_addEthereumChain', params: [ { - chainId: `0x${expectedChainId.toString(16)}`, - chainName: 'Mordor Testnet', - nativeCurrency: { - name: 'Mordor ETC', - symbol: 'METC', - decimals: 18, - }, - rpcUrls: ['https://rpc.mordor.etccooperative.org'], - blockExplorerUrls: ['https://etc-mordor.blockscout.com/'], + chainId: `0x${expectedChain.id.toString(16)}`, + chainName: expectedChain.name, + nativeCurrency: expectedChain.nativeCurrency, + rpcUrls: expectedChain.rpcUrls.default.http, + blockExplorerUrls: [expectedChain.blockExplorers.default.url], }, ], }); } catch (addError) { - throw new Error('Failed to add Mordor Testnet to MetaMask'); + throw new Error('Failed to add chain to MetaMask'); } } else { - throw new Error('Please switch to Mordor Testnet in MetaMask'); + throw new Error(`Please switch to ${getExpectedChain().name} in MetaMask`); } } } const walletClient = createWalletClient({ - chain: mordor, + chain: getExpectedChain(), transport: custom(window.ethereum), }); @@ -87,7 +89,7 @@ export const WalletProvider = ({ children }) => { setAccount(accounts[0]); setChainId(currentChainId); - const publicClient = createPublicClient({ chain: mordor, transport: http() }); + const publicClient = createPublicClient({ chain: getExpectedChain(), transport: http() }); const balance = await publicClient.getBalance({ address: accounts[0] }); setBalance(parseFloat(balance) / Math.pow(10, 18)); @@ -105,20 +107,21 @@ export const WalletProvider = ({ children }) => { }, []); const connectPublicClient = useCallback(() => { - setPublicClient(createPublicClient({ chain: mordor, transport: http() })); + setPublicClient(createPublicClient({ chain: getExpectedChain(), transport: http() })); }, []); const handleChainChanged = async (chainIdHex) => { const newChainId = parseInt(chainIdHex, 16); setChainId(newChainId); - if (newChainId !== expectedChainId) { - setError(`Wrong network detected. Please switch to Mordor Testnet`); + const expectedId = getExpectedChain().id; + if (newChainId !== expectedId) { + setError(`Wrong network detected. Please switch to ${getExpectedChain().name}`); return; } if (window.ethereum) { - const walletClient = createWalletClient({ chain: mordor, transport: custom(window.ethereum) }); + const walletClient = createWalletClient({ chain: getExpectedChain(), transport: custom(window.ethereum) }); setWalletClient(walletClient); } }; @@ -129,7 +132,7 @@ export const WalletProvider = ({ children }) => { } else { setAccount(accounts[0]); - const publicClient = createPublicClient({ chain: mordor, transport: http() }); + const publicClient = createPublicClient({ chain: getExpectedChain(), transport: http() }); const balance = await publicClient.getBalance({ address: accounts[0] }); setBalance(parseFloat(balance) / Math.pow(10, 18)); } diff --git a/stablepay-sdk/src/contexts/chains.js b/stablepay-sdk/src/contexts/chains.js index 5722c56..8ad3207 100644 --- a/stablepay-sdk/src/contexts/chains.js +++ b/stablepay-sdk/src/contexts/chains.js @@ -20,3 +20,23 @@ export const mordor = defineChain({ }, testnet: true, }); + +export const etcMainnet = defineChain({ + id: 61, + name: 'Ethereum Classic', + network: 'ethereum-classic', + nativeCurrency: { + decimals: 18, + name: 'Ether', + symbol: 'ETC', + }, + rpcUrls: { + default: { + http: ['https://etc.rivet.link'], + }, + }, + blockExplorers: { + default: { name: 'BlockScout', url: 'https://blockscout.com/etc/mainnet' }, + }, + testnet: false, +}); diff --git a/stablepay-sdk/src/utils/config.js b/stablepay-sdk/src/utils/config.js index af391f9..936d637 100644 --- a/stablepay-sdk/src/utils/config.js +++ b/stablepay-sdk/src/utils/config.js @@ -38,14 +38,33 @@ export const networksConfig = { }, feeUI: 0 }, - 'ethereum-classic': { //Mordor Testnet details - uri: 'https://rpc.mordor.etccooperative.org', // Mordor RPC - chainId: 63, - djedAddress: '0xD4548F4b6d08852B56cdabC6be7Fd90953179d68', //Mordor DJED contract + 'mordor-testnet': { // Mordor Testnet (ETC) + uri: 'https://rpc.mordor.etccooperative.org', + chainId: 63, + djedAddress: '0xD4548F4b6d08852B56cdabC6be7Fd90953179d68', tokens: { stablecoin: { symbol: 'ECSD', - address: '0xffD4505B3452Dc22f8473616d50503bA9E1710Ac', // Mordor Stablecoin + address: '0xffD4505B3452Dc22f8473616d50503bA9E1710Ac', + decimals: 18, + isDirectTransfer: true + }, + native: { + symbol: 'ETC', + decimals: 18, + isNative: true + } + }, + feeUI: 0 + }, + 'ethereum-classic': { // ETC Mainnet + uri: 'https://etc.rivet.link', + chainId: 61, + djedAddress: '0xCc3664d7021FD36B1Fe2b136e2324710c8442cCf', + tokens: { + stablecoin: { + symbol: 'ECSD', + address: '0x5A7Ca94F6E969C94bef4CE5e2f90ed9d4891918A', decimals: 18, isDirectTransfer: true }, diff --git a/stablepay-sdk/src/widget/TransactionReview.jsx b/stablepay-sdk/src/widget/TransactionReview.jsx index e3ed29c..13c574c 100644 --- a/stablepay-sdk/src/widget/TransactionReview.jsx +++ b/stablepay-sdk/src/widget/TransactionReview.jsx @@ -187,7 +187,8 @@ const TransactionReview = ({ onTransactionComplete }) => { if (!txHash || !selectedNetwork) return null; const explorerBaseUrls = { - "ethereum-classic": "https://etc-mordor.blockscout.com/tx/", + "mordor-testnet": "https://blockscout.com/etc/mordor/tx/", + "ethereum-classic": "https://blockscout.com/etc/mainnet/tx/", "sepolia": "https://sepolia.etherscan.io/tx/", "milkomeda-mainnet": "https://explorer-mainnet-cardano-evm.c1.milkomeda.com/tx/", }; @@ -260,7 +261,7 @@ const TransactionReview = ({ onTransactionComplete }) => {
✅ Transaction Hash:{" "} { }; const WidgetWithProviders = ({ onClose, buttonSize, networkSelector, onTransactionComplete }) => { + // Keep a global reference of current selection for WalletContext + window.__STABLEPAY_SELECTED_NETWORK__ = networkSelector?.selectedNetwork || null; return ( diff --git a/stablepay-sdk/stablepay-sdk-1.0.3.tgz b/stablepay-sdk/stablepay-sdk-1.0.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ecff55cd59430c80c875332f11ca53b2fe405b74 GIT binary patch literal 54229 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 TsqIWc0A>OJAwhvw literal 0 HcmV?d00001 From d8a90482388be365c8ed9c1224a5e0da1b42602a Mon Sep 17 00:00:00 2001 From: Gaurav Date: Sun, 14 Dec 2025 09:23:12 +0530 Subject: [PATCH 2/2] feat(stablepay-sdk): ETC mainnet support + Mordor rename (source only)\n\n- Add ethereum-classic (chainId 61) with Rivet RPC\n- Set DJED and ECSD addresses\n- Rename testnet key to mordor-testnet\n- Update explorers + dynamic wallet switching\n- Ignore dist/ and local tarballs\n\nFixes #18 --- stablepay-sdk/dist/assets/chevron-down-icon.svg | 3 --- stablepay-sdk/dist/assets/stablepay-logo.svg | 9 --------- stablepay-sdk/dist/esm/index.js | 1 - stablepay-sdk/dist/esm/styles.css | 1 - stablepay-sdk/dist/umd/index.js | 2 -- stablepay-sdk/dist/umd/index.js.map | 1 - stablepay-sdk/dist/umd/styles.css | 1 - stablepay-sdk/stablepay-sdk-1.0.3.tgz | Bin 54229 -> 0 bytes 8 files changed, 18 deletions(-) delete mode 100644 stablepay-sdk/dist/assets/chevron-down-icon.svg delete mode 100644 stablepay-sdk/dist/assets/stablepay-logo.svg delete mode 100644 stablepay-sdk/dist/esm/index.js delete mode 100644 stablepay-sdk/dist/esm/styles.css delete mode 100644 stablepay-sdk/dist/umd/index.js delete mode 100644 stablepay-sdk/dist/umd/index.js.map delete mode 100644 stablepay-sdk/dist/umd/styles.css delete mode 100644 stablepay-sdk/stablepay-sdk-1.0.3.tgz diff --git a/stablepay-sdk/dist/assets/chevron-down-icon.svg b/stablepay-sdk/dist/assets/chevron-down-icon.svg deleted file mode 100644 index 4916a82..0000000 --- a/stablepay-sdk/dist/assets/chevron-down-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/stablepay-sdk/dist/assets/stablepay-logo.svg b/stablepay-sdk/dist/assets/stablepay-logo.svg deleted file mode 100644 index 4a93a61..0000000 --- a/stablepay-sdk/dist/assets/stablepay-logo.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/stablepay-sdk/dist/esm/index.js b/stablepay-sdk/dist/esm/index.js deleted file mode 100644 index d0c9c66..0000000 --- a/stablepay-sdk/dist/esm/index.js +++ /dev/null @@ -1 +0,0 @@ -import{getWeb3 as e,getDjedContract as t,getCoinContracts as n,getDecimals as r,getOracleAddress as a,getOracleContract as i,tradeDataPriceBuySc as o,buyScTx as s}from"djed-sdk";import l,{useContext as c,createContext as d,useState as m,useEffect as u,useCallback as h}from"react";import{defineChain as w,createWalletClient as g,custom as k,createPublicClient as C,http as b,parseEther as p,parseUnits as _,encodeFunctionData as E}from"viem";const f={sepolia:{uri:"https://ethereum-sepolia.publicnode.com/",chainId:11155111,djedAddress:"0x624FcD0a1F9B5820c950FefD48087531d38387f4",tokens:{stablecoin:{symbol:"SOD",address:"0x6b930182787F346F18666D167e8d32166dC5eFBD",decimals:18,isDirectTransfer:!0},native:{symbol:"ETH",decimals:18,isNative:!0}},feeUI:0},"milkomeda-mainnet":{uri:"https://rpc-mainnet-cardano-evm.c1.milkomeda.com",chainId:2001,djedAddress:"0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76",tokens:{stablecoin:{symbol:"MOD",address:"0xcbA90fB1003b9D1bc6a2b66257D2585011b004e9",decimals:18,isDirectTransfer:!0},native:{symbol:"mADA",decimals:18,isNative:!0}},feeUI:0},"mordor-testnet":{uri:"https://rpc.mordor.etccooperative.org",chainId:63,djedAddress:"0xD4548F4b6d08852B56cdabC6be7Fd90953179d68",tokens:{stablecoin:{symbol:"ECSD",address:"0xffD4505B3452Dc22f8473616d50503bA9E1710Ac",decimals:18,isDirectTransfer:!0},native:{symbol:"ETC",decimals:18,isNative:!0}},feeUI:0},"ethereum-classic":{uri:"https://etc.rivet.link",chainId:61,djedAddress:"0xCc3664d7021FD36B1Fe2b136e2324710c8442cCf",tokens:{stablecoin:{symbol:"ECSD",address:"0x5A7Ca94F6E969C94bef4CE5e2f90ed9d4891918A",decimals:18,isDirectTransfer:!0},native:{symbol:"ETC",decimals:18,isNative:!0}},feeUI:0}};class v{constructor(e,t){this.networkUri=e,this.djedAddress=t}async init(){if(!this.networkUri||!this.djedAddress)throw new Error("Network URI and DJED address are required");try{this.web3=await e(this.networkUri),this.djedContract=t(this.web3,this.djedAddress);const{stableCoin:o,reserveCoin:s}=await n(this.djedContract,this.web3),{scDecimals:l,rcDecimals:c}=await r(o,s);this.stableCoin=o,this.reserveCoin=s,this.scDecimals=l,this.rcDecimals=c,this.oracleContract=await a(this.djedContract).then((e=>i(this.web3,e,this.djedContract._address))),this.oracleAddress=this.oracleContract._address,console.log("Transaction initialized successfully")}catch(e){throw console.error("Error initializing transaction:",e),e}}getBlockchainDetails(){return{web3Available:!!this.web3,djedContractAvailable:!!this.djedContract,stableCoinAddress:this.stableCoin?this.stableCoin._address:"N/A",reserveCoinAddress:this.reserveCoin?this.reserveCoin._address:"N/A",stableCoinDecimals:this.scDecimals,reserveCoinDecimals:this.rcDecimals,oracleAddress:this.oracleAddress||"N/A",oracleContractAvailable:!!this.oracleContract}}async handleTradeDataBuySc(e){if(!this.djedContract)throw new Error("DJED contract is not initialized");if("string"!=typeof e)throw new Error("Amount must be a string");try{return(await o(this.djedContract,this.scDecimals,e)).totalBCScaled}catch(e){throw console.error("Error fetching trade data for buying stablecoins: ",e),e}}async buyStablecoins(e,t,n){if(!this.djedContract)throw new Error("DJED contract is not initialized");try{console.log(`Building stablecoin purchase transaction from ${e} to ${t} with value ${n}`);const r="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",a=await s(this.djedContract,e,t,n,r,this.djedAddress);return console.log("Transaction built:",a),a}catch(e){throw console.error("Error executing buyStablecoins transaction: ",e),e}}}var y="main_stablePayButton__UA7HC",T="main_logo__ITyEy",N="main_buttonText__N-ewy";const S=({onClick:e,size:t="medium"})=>{const n={small:{width:"200px",height:"50px",fontSize:"14px"},medium:{width:"250px",height:"60px",fontSize:"16px"},large:{width:"300px",height:"70px",fontSize:"18px"}},r={small:{width:"35px",height:"33px"},medium:{width:"40px",height:"38px"},large:{width:"45px",height:"43px"}},a=n[t]||n.medium,i=r[t]||r.medium;return l.createElement("button",{className:y,onClick:e,style:a},l.createElement("div",{className:T,style:i}),l.createElement("span",{className:N},"Pay with StablePay"))};var A={dialogOverlay:"PricingCard_dialogOverlay__0XJrE",pricingCard:"PricingCard_pricingCard__LrWb9",small:"PricingCard_small__J4CHj",medium:"PricingCard_medium__EVmTB",large:"PricingCard_large__A6pnX",dialogClose:"PricingCard_dialogClose__jJ1tM",pricingCardHeader:"PricingCard_pricingCardHeader__wGczA",allianceLogo:"PricingCard_allianceLogo__URa-U",stablepayTitle:"PricingCard_stablepayTitle__4t848",pricingCardBody:"PricingCard_pricingCardBody__0wKQn",selectField:"PricingCard_selectField__LBPoZ",transactionReview:"PricingCard_transactionReview__Ix-eL",transactionInfo:"PricingCard_transactionInfo__Ck-Rc",transactionLabel:"PricingCard_transactionLabel__GDux7",transactionValue:"PricingCard_transactionValue__q-xxp",infoSection:"PricingCard_infoSection__gyjMQ",infoIcon:"PricingCard_infoIcon__rraxD",infoText:"PricingCard_infoText__l4b7A",walletButton:"PricingCard_walletButton__llw4v",loading:"PricingCard_loading__2-tGA",error:"PricingCard_error__m5fK-",networkError:"PricingCard_networkError__zR-36",errorText:"PricingCard_errorText__qZRJt","message-box":"PricingCard_message-box__vkUKy",detailsButton:"PricingCard_detailsButton__jHglL",errorDetails:"PricingCard_errorDetails__CzN-7",loadingContainer:"PricingCard_loadingContainer__6nOVa",spinner:"PricingCard_spinner__9ucQv",spin:"PricingCard_spin__24tni"};const D=({children:e,onClose:t,size:n="medium"})=>l.createElement("div",{className:A.dialogOverlay},l.createElement("div",{className:`${A.pricingCard} ${A[n]}`},l.createElement("button",{className:A.dialogClose,onClick:t},"×"),l.createElement("div",{className:A.pricingCardHeader},l.createElement("div",{className:A.allianceLogo}),l.createElement("h2",{className:A.stablepayTitle},"StablePay")),l.createElement("div",{className:A.pricingCardBody},e)));class x{constructor(e){this.networkSelector=e,this.selectedToken=null}selectToken(e){const t=this.networkSelector.getSelectedNetworkConfig();return!(!t||!t.tokens[e])&&(this.selectedToken={key:e,...t.tokens[e]},!0)}getSelectedToken(){return this.selectedToken}getAvailableTokens(){const e=this.networkSelector.getSelectedNetworkConfig();return e?Object.entries(e.tokens).map((([e,t])=>({key:e,...t}))):[]}resetSelection(){this.selectedToken=null}}const P=d(),B=({children:e,networkSelector:t})=>{const[n]=m((()=>new x(t))),[r,a]=m(null),[i,o]=m(null),[s,c]=m(null),d=()=>{o(null),c(null)};return u((()=>{a(t.selectedNetwork)}),[t.selectedNetwork]),l.createElement(P.Provider,{value:{networkSelector:t,tokenSelector:n,selectedNetwork:r,selectedToken:i,transactionDetails:s,setTransactionDetails:c,selectNetwork:e=>!!t.selectNetwork(e)&&(a(e),d(),!0),selectToken:e=>{if(n.selectToken(e)){const e=n.getSelectedToken();return o(e),!0}return!1},resetSelections:()=>{t.selectNetwork(null),a(null),d()}}},e)},j=()=>{const e=c(P);if(void 0===e)throw new Error("useNetwork must be used within a NetworkProvider");return e},I=()=>{const{networkSelector:e,selectedNetwork:t,selectNetwork:n}=j();return l.createElement("div",{className:A.selectField},l.createElement("label",{htmlFor:"network-select"},"Select Network"),l.createElement("select",{id:"network-select",onChange:e=>{n(e.target.value)},value:t||""},l.createElement("option",{value:"",disabled:!0},"Select a network"),Object.keys(e.availableNetworks).map((e=>l.createElement("option",{key:e,value:e},e)))))},F=()=>{const{networkSelector:e,tokenSelector:t,selectedNetwork:n,selectedToken:r,selectToken:a,setTransactionDetails:i}=j(),[o,s]=m(!1),[c,d]=m(null),u=n?t.getAvailableTokens():[];return l.createElement("div",{className:A.selectField},l.createElement("label",{htmlFor:"token-select"},"Select Token"),l.createElement("select",{id:"token-select",onChange:async r=>{const o=r.target.value;d(null),s(!0);try{if(a(o)){const r=e.getSelectedNetworkConfig(),a=new v(r.uri,r.djedAddress);await a.init();const s=e.getTokenAmount(o),l=a.getBlockchainDetails();let c=null;"native"===o&&(c=await a.handleTradeDataBuySc(String(s))),i({network:n,token:o,tokenSymbol:t.getSelectedToken().symbol,amount:s,receivingAddress:e.getReceivingAddress(),djedContractAddress:r.djedAddress,isDirectTransfer:t.getSelectedToken().isDirectTransfer||!1,isNativeToken:t.getSelectedToken().isNative||!1,tradeAmount:c?c.amount:null,...l})}}catch(e){console.error("Error fetching transaction details:",e),d("Failed to fetch transaction details. Please try again.")}finally{s(!1)}},value:r?r.key:"",disabled:!n||o},l.createElement("option",{value:"",disabled:!0},n?o?"Loading...":"Select a token":"Please select a network first"),u.map((e=>l.createElement("option",{key:e.key,value:e.key},e.symbol," (",e.isDirectTransfer?"Direct Transfer":"Native",")")))),c&&l.createElement("div",{className:A.error},c))},L=w({id:63,name:"Mordor Testnet",network:"mordor",nativeCurrency:{decimals:18,name:"Mordor Ether",symbol:"METC"},rpcUrls:{default:{http:["https://rpc.mordor.etccooperative.org"],webSocket:["wss://rpc.mordor.etccooperative.org/ws"]}},blockExplorers:{default:{name:"BlockScout",url:"https://blockscout.com/etc/mordor"}},testnet:!0}),z=w({id:61,name:"Ethereum Classic",network:"ethereum-classic",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETC"},rpcUrls:{default:{http:["https://etc.rivet.link"]}},blockExplorers:{default:{name:"BlockScout",url:"https://blockscout.com/etc/mainnet"}},testnet:!1}),$=d(null),R=({children:e})=>{const[t,n]=m(null),[r,a]=m(null),[i,o]=m(null),[s,c]=m(null),[d,w]=m(null),[p,_]=m(null),[E,f]=m(!1),v=("ethereum-classic-mainnet"===window.__STABLEPAY_SELECTED_NETWORK__?z:L).id,y=()=>"ethereum-classic-mainnet"===window.__STABLEPAY_SELECTED_NETWORK__?z:L,T=h((async()=>{if(!window.ethereum)return _("Please install MetaMask or another Web3 wallet"),!1;f(!0),_(null);try{const e=await window.ethereum.request({method:"eth_requestAccounts"});if(0===e.length)throw new Error("No wallet address found. Please unlock your wallet.");const t=await window.ethereum.request({method:"eth_chainId"}),r=parseInt(t,16);if(r!==v)try{await window.ethereum.request({method:"wallet_switchEthereumChain",params:[{chainId:`0x${v.toString(16)}`}]})}catch(e){if(4902!==e.code)throw new Error(`Please switch to ${y().name} in MetaMask`);try{const e=y();await window.ethereum.request({method:"wallet_addEthereumChain",params:[{chainId:`0x${e.id.toString(16)}`,chainName:e.name,nativeCurrency:e.nativeCurrency,rpcUrls:e.rpcUrls.default.http,blockExplorerUrls:[e.blockExplorers.default.url]}]})}catch(e){throw new Error("Failed to add chain to MetaMask")}}const a=g({chain:y(),transport:k(window.ethereum)});n(a),o(e[0]),c(r);const i=C({chain:y(),transport:b()}),s=await i.getBalance({address:e[0]});return w(parseFloat(s)/Math.pow(10,18)),window.ethereum.on("accountsChanged",A),window.ethereum.on("chainChanged",S),!0}catch(e){return console.error("Error connecting wallet:",e),_(e.message),!1}finally{f(!1)}}),[]),N=h((()=>{a(C({chain:y(),transport:b()}))}),[]),S=async e=>{const t=parseInt(e,16);c(t);if(t===y().id){if(window.ethereum){const e=g({chain:y(),transport:k(window.ethereum)});n(e)}}else _(`Wrong network detected. Please switch to ${y().name}`)},A=async e=>{if(0===e.length)D();else{o(e[0]);const t=C({chain:y(),transport:b()}),n=await t.getBalance({address:e[0]});w(parseFloat(n)/Math.pow(10,18))}},D=h((()=>{n(null),o(null),c(null),w(null),window.ethereum&&(window.ethereum.removeListener("accountsChanged",A),window.ethereum.removeListener("chainChanged",S))}),[]);return u((()=>{N()}),[N]),l.createElement($.Provider,{value:{walletClient:t,publicClient:r,account:i,chainId:s,balance:d,error:p,isConnecting:E,connectWallet:T,disconnectWallet:D}},e)},U=({onTransactionComplete:e})=>{const{networkSelector:t,selectedNetwork:n,selectedToken:r,transactionDetails:a,setTransactionDetails:i}=j(),{connectWallet:o,account:s,walletClient:d,publicClient:h,isConnecting:w}=(()=>{const e=c($);if(!e)throw new Error("useWallet must be used within a WalletProvider");return e})(),[g,k]=m(null),[C,b]=m(null),[f,y]=m(null),[T,N]=m(""),[S,D]=m(null),[x,P]=m(null),[B,I]=m(!1);if(u((()=>{(async()=>{if(n&&r)try{const e=t.getSelectedNetworkConfig(),a=t.getReceivingAddress(),o=t.getTokenAmount(r.key),s=new v(e.uri,e.djedAddress);await s.init(),k(s);let l=null;if("native"===r.key)try{l=await s.handleTradeDataBuySc(String(o)),b(l)}catch(e){console.error("Error fetching trade data:",e)}i({network:n,token:r.key,tokenSymbol:r.symbol,amount:o||"0",receivingAddress:a,djedContractAddress:e.djedAddress,isDirectTransfer:r.isDirectTransfer||!1,isNativeToken:r.isNative||!1,tradeAmount:l?l.amount:null,...s.getBlockchainDetails()})}catch(e){console.error("Error initializing transaction:",e)}})()}),[n,r,t,i]),!a)return l.createElement("div",{className:A.loading},"Initializing transaction...");return l.createElement("div",{className:A.transactionReview},l.createElement("div",{className:A.transactionInfo},l.createElement("span",{className:A.transactionLabel},"Network:"),l.createElement("span",{className:A.transactionValue},a.network)),l.createElement("div",{className:A.transactionInfo},l.createElement("span",{className:A.transactionLabel},"You Pay:"),l.createElement("span",{className:A.transactionValue},"stablecoin"===r.key?`${a.amount} ${a.tokenSymbol}`:`${C||"Calculating..."} ${a.tokenSymbol}`)),l.createElement("button",{className:A.walletButton,onClick:async()=>{await o()&&console.log("Wallet connected:",s)},disabled:w},w?"Connecting...":"Connect Wallet"),s&&!f&&l.createElement("button",{className:A.walletButton,onClick:async()=>{if(s&&a&&g)try{N("⏳ Preparing transaction...");const e=a.receivingAddress;let t;if("native"===r.key){const n="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",r=C||"0";t=await g.buyStablecoins(s,e,p(String(r)),n)}else{const n=a.amount?_(String(a.amount),a.stableCoinDecimals):"0";t={to:"0xdc86935A9597aA3A9008d2f26232233043091284",data:E({abi:[{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}],functionName:"transfer",args:[e,n]}),account:s}}y(t),N("✅ Transaction ready! Click 'Send Transaction' to proceed.")}catch(e){P(e),N("❌ Transaction preparation failed.")}else N("❌ Wallet not connected or transaction details missing")}},"Prepare Transaction"),s&&f&&l.createElement("button",{className:A.walletButton,onClick:async()=>{try{if(!d||!s||!f)return void N("❌ Wallet client, account, or transaction data is missing");N("⏳ Sending transaction...");const t=await d.sendTransaction({...f,account:s});D(t),N("✅ Transaction sent!"),e&&e({txHash:t,network:n,token:r?.key,tokenSymbol:r?.symbol,amount:a?.amount,receivingAddress:a?.receivingAddress})}catch(e){P(e),N("❌ Transaction failed.")}},disabled:null!==S},"Send Transaction"),T&&l.createElement("div",{className:"message-box"},T,x&&l.createElement("button",{onClick:()=>I(!B),className:A.detailsButton},B?"Hide Details":"Show Details")),B&&x&&l.createElement("div",{className:A.errorDetails},l.createElement("pre",null,x.message)),S&&l.createElement("div",{className:A.transactionLink},"✅ Transaction Hash:"," ",l.createElement("a",{href:(()=>{if(!S||!n)return null;const e={"mordor-testnet":"https://blockscout.com/etc/mordor/tx/","ethereum-classic":"https://blockscout.com/etc/mainnet/tx/",sepolia:"https://sepolia.etherscan.io/tx/","milkomeda-mainnet":"https://explorer-mainnet-cardano-evm.c1.milkomeda.com/tx/"};return e[n]?`${e[n]}${S}`:null})()||"#",target:"_blank",rel:"noopener noreferrer",className:A.explorerLink,style:{color:"#007bff",textDecoration:"underline",fontWeight:"bold",cursor:"pointer",wordBreak:"break-word"}},S.slice(0,6),"...",S.slice(-6))))},W=({onClose:e,buttonSize:t,onTransactionComplete:n})=>{const{resetSelections:r}=j();return l.createElement(D,{onClose:()=>{r(),e()},size:t},l.createElement(I,null),l.createElement(F,null),l.createElement(U,{onTransactionComplete:n}))},M=({onClose:e,buttonSize:t,networkSelector:n,onTransactionComplete:r})=>(window.__STABLEPAY_SELECTED_NETWORK__=n?.selectedNetwork||null,l.createElement(B,{networkSelector:n},l.createElement(R,null,l.createElement(W,{onClose:e,buttonSize:t,onTransactionComplete:r})))),O={NetworkSelector:class{constructor(e){this.merchantConfig=e,this.blacklist=e.getBlacklist(),this.availableNetworks=this.getAvailableNetworks(),this.selectedNetwork=null}getAvailableNetworks(){return Object.entries(f).reduce(((e,[t,n])=>(this.blacklist.includes(n.chainId)||(e[t]=n),e)),{})}selectNetwork(e){return null===e?(this.selectedNetwork=null,console.log("Network selection reset"),!0):this.availableNetworks[e]?(this.selectedNetwork=e,console.log(`Network selected: ${e}`),!0):(console.error(`Invalid network: ${e}`),!1)}getSelectedNetworkConfig(){return this.selectedNetwork?this.availableNetworks[this.selectedNetwork]:null}getReceivingAddress(){return this.merchantConfig.getReceivingAddress()}getTokenAmount(e){return this.merchantConfig.getTokenAmount(this.selectedNetwork,e)}},Transaction:v,Config:class{constructor(e={}){this.receivingAddress=e.receivingAddress||"",this.blacklist=e.blacklist||[],this.amounts=e.Amounts||{},this.validateConfig()}validateConfig(){if(!this.receivingAddress)throw new Error("Receiving address is required");for(const[e,t]of Object.entries(this.amounts)){if(!f[e])throw new Error(`Invalid network: ${e}`);if(!t.stablecoin||"number"!=typeof t.stablecoin||t.stablecoin<=0)throw new Error(`Invalid stablecoin amount for network ${e}`)}}getBlacklist(){return this.blacklist}getReceivingAddress(){return this.receivingAddress}getTokenAmount(e){console.log("Getting amount for network:",e),console.log("Amounts object:",this.amounts);const t=this.amounts[e]?.stablecoin;return console.log("Returning amount:",t),t||0}},Widget:({networkSelector:e,buttonSize:t="medium",onTransactionComplete:n,onSuccess:r})=>{const[a,i]=m(!1),o=n||r;return l.createElement("div",{className:A.widgetContainer},!a&&l.createElement(S,{onClick:()=>{i(!0)},size:t}),a&&l.createElement(M,{onClose:()=>{i(!1)},buttonSize:t,networkSelector:e,onTransactionComplete:o}))},PayButton:S,Dialog:D,NetworkDropdown:I};export{O as default}; diff --git a/stablepay-sdk/dist/esm/styles.css b/stablepay-sdk/dist/esm/styles.css deleted file mode 100644 index a6df6b0..0000000 --- a/stablepay-sdk/dist/esm/styles.css +++ /dev/null @@ -1 +0,0 @@ -.main_stablePayButton__UA7HC{align-items:center;background:linear-gradient(90deg,#000,#f7941d);border:1px solid #bc5f26;border-radius:3px;box-sizing:border-box;color:#fff;cursor:pointer;display:flex;font-size:24px;font-weight:700;height:104px;justify-content:flex-start;overflow:hidden;padding:0 20px;position:relative;width:372px}.main_stablePayButton__UA7HC:hover{opacity:.9}.main_stablePayButton__UA7HC .main_logo__ITyEy{background-image:url(../assets/stablepay-logo.svg);background-position:50%;background-repeat:no-repeat;background-size:contain;flex-shrink:0;height:25px;margin-right:20px;width:25px}.main_stablePayButton__UA7HC .main_buttonText__N-ewy{flex-grow:1;text-align:center}.PricingCard_dialogOverlay__0XJrE{align-items:center;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);background-color:hsla(0,0%,100%,.1);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1000}.PricingCard_pricingCard__LrWb9{align-items:center;background:#2c2c2c;border:1px solid hsla(0,0%,85%,.1);border-radius:8px;box-sizing:border-box;display:flex;flex-direction:column;padding:24px;position:relative}.PricingCard_pricingCard__LrWb9.PricingCard_small__J4CHj{height:600px;width:360px}.PricingCard_pricingCard__LrWb9.PricingCard_medium__EVmTB{height:680px;width:400px}.PricingCard_pricingCard__LrWb9.PricingCard_large__A6pnX{height:760px;width:440px}.PricingCard_dialogClose__jJ1tM{background:none;border:none;color:#fff;cursor:pointer;font-size:20px;position:absolute;right:16px;top:16px;z-index:5}.PricingCard_pricingCardHeader__wGczA{align-items:center;display:flex;gap:12px;margin-bottom:40px;width:100%}.PricingCard_allianceLogo__URa-U{background-image:url(../assets/stablepay-logo.svg);background-position:50%;background-repeat:no-repeat;background-size:contain;height:55px;width:55px}.PricingCard_stablepayTitle__4t848{align-items:center;color:#f6941c;display:flex;font-family:Inter,sans-serif;font-size:29.2px;font-style:normal;font-weight:600;line-height:35px}.PricingCard_pricingCardBody__0wKQn{display:flex;flex-direction:column;gap:30px;width:100%}.PricingCard_selectField__LBPoZ{align-items:flex-start;display:flex;flex-direction:column;gap:8px;margin-bottom:30px;width:100%}.PricingCard_selectField__LBPoZ label{align-self:flex-start;color:#636a77;margin-bottom:6px;text-align:left}.PricingCard_selectField__LBPoZ label,.PricingCard_selectField__LBPoZ select{font-family:Inter,sans-serif;font-size:16px;font-style:normal;font-weight:500;line-height:19px;width:100%}.PricingCard_selectField__LBPoZ select{appearance:none;background:#fff;background-image:url(../assets/chevron-down-icon.svg);background-position:right 18px center;background-repeat:no-repeat;border:1px solid #d9d9d9;border-radius:6px;box-sizing:border-box;color:#000;height:49px;padding:10px 14px}.PricingCard_selectField__LBPoZ select:disabled{background-color:#f5f5f5;cursor:not-allowed}.PricingCard_transactionReview__Ix-eL{padding:20px 0;width:100%}.PricingCard_transactionInfo__Ck-Rc{align-items:center;display:flex;justify-content:space-between;margin:15px 0;padding:0 5px;width:100%}.PricingCard_transactionLabel__GDux7{color:#636a77;font-weight:500}.PricingCard_transactionLabel__GDux7,.PricingCard_transactionValue__q-xxp{font-family:Inter,sans-serif;font-size:16px;font-style:normal;line-height:19px}.PricingCard_transactionValue__q-xxp{color:#fff;font-weight:600;text-align:right}.PricingCard_infoSection__gyjMQ{align-items:flex-start;display:flex;gap:16px;margin-bottom:40px;margin-top:20px;padding:0 26px}.PricingCard_infoIcon__rraxD{align-items:center;background:#d5d6d9;border-radius:50%;color:#434a58;display:flex;font-size:13px;height:21px;justify-content:center;min-width:22px;width:22px}.PricingCard_infoText__l4b7A{color:#636a77;font-family:Inter,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:17px}.PricingCard_walletButton__llw4v{align-items:center;background:#f6941c;border:1px solid #c66c20;border-radius:0;bottom:31px;color:#fde5cb;cursor:pointer;display:flex;font-family:Inter,sans-serif;font-size:18px;font-style:normal;font-weight:600;height:65px;justify-content:center;left:30px;line-height:22px;position:absolute;width:calc(100% - 60px)}.PricingCard_walletButton__llw4v:disabled{background:#ccc;border-color:#bbb;cursor:not-allowed}.PricingCard_loading__2-tGA{color:#636a77;font-family:Inter,sans-serif;padding:20px;text-align:center}.PricingCard_error__m5fK-{color:#ff4d4f;font-family:Inter,sans-serif;padding:10px;text-align:center}.PricingCard_networkError__zR-36{background:rgba(255,77,79,.1);border:1px solid rgba(255,77,79,.2);border-radius:4px;margin:10px 0;padding:10px}.PricingCard_errorText__qZRJt{color:#ff4d4f;font-family:Inter,sans-serif;font-size:14px;line-height:1.5}.PricingCard_message-box__vkUKy{align-items:center;background-color:hsla(0,0%,100%,.1);border-radius:4px;color:#fff;display:flex;font-family:Inter,sans-serif;font-size:14px;justify-content:space-between;margin-top:20px;padding:10px}.PricingCard_detailsButton__jHglL{background:none;border:none;color:#f6941c;cursor:pointer;font-size:12px;margin-left:10px;text-decoration:underline}.PricingCard_errorDetails__CzN-7{background-color:rgba(0,0,0,.2);border:1px solid rgba(255,77,79,.3);border-radius:4px;color:#ff4d4f;font-family:monospace;font-size:12px;line-height:1.4;margin-top:10px;max-height:150px;max-width:100%;overflow:auto;overflow-wrap:break-word;padding:10px;white-space:pre-wrap;word-break:break-word}.PricingCard_errorDetails__CzN-7::-webkit-scrollbar{height:6px;width:6px}.PricingCard_errorDetails__CzN-7::-webkit-scrollbar-track{background:rgba(0,0,0,.1);border-radius:3px}.PricingCard_errorDetails__CzN-7::-webkit-scrollbar-thumb{background:rgba(255,77,79,.5);border-radius:3px}.PricingCard_errorDetails__CzN-7::-webkit-scrollbar-thumb:hover{background:rgba(255,77,79,.7)}@media (max-width:520px){.PricingCard_pricingCard__LrWb9{height:auto;min-height:600px;padding:20px;width:95vw}.PricingCard_selectField__LBPoZ{margin-bottom:20px}.PricingCard_walletButton__llw4v{left:20px;margin-top:20px;position:relative;width:calc(100% - 40px)}.PricingCard_infoSection__gyjMQ{padding:0 20px}.PricingCard_loadingContainer__6nOVa{align-items:center;display:flex;height:100vh;justify-content:center}.PricingCard_spinner__9ucQv{animation:PricingCard_spin__24tni .8s linear infinite;border:4px solid hsla(0,0%,100%,.3);border-radius:50%;border-top-color:#fff;height:40px;width:40px}@keyframes PricingCard_spin__24tni{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}} \ No newline at end of file diff --git a/stablepay-sdk/dist/umd/index.js b/stablepay-sdk/dist/umd/index.js deleted file mode 100644 index c060fe3..0000000 --- a/stablepay-sdk/dist/umd/index.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("djed-sdk"),require("react"),require("viem")):"function"==typeof define&&define.amd?define(["djed-sdk","react","viem"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).StablePay=t(e.DjedSdk,e.React,e.viem)}(this,(function(e,t,n){"use strict";const a={sepolia:{uri:"https://ethereum-sepolia.publicnode.com/",chainId:11155111,djedAddress:"0x624FcD0a1F9B5820c950FefD48087531d38387f4",tokens:{stablecoin:{symbol:"SOD",address:"0x6b930182787F346F18666D167e8d32166dC5eFBD",decimals:18,isDirectTransfer:!0},native:{symbol:"ETH",decimals:18,isNative:!0}},feeUI:0},"milkomeda-mainnet":{uri:"https://rpc-mainnet-cardano-evm.c1.milkomeda.com",chainId:2001,djedAddress:"0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76",tokens:{stablecoin:{symbol:"MOD",address:"0xcbA90fB1003b9D1bc6a2b66257D2585011b004e9",decimals:18,isDirectTransfer:!0},native:{symbol:"mADA",decimals:18,isNative:!0}},feeUI:0},"mordor-testnet":{uri:"https://rpc.mordor.etccooperative.org",chainId:63,djedAddress:"0xD4548F4b6d08852B56cdabC6be7Fd90953179d68",tokens:{stablecoin:{symbol:"ECSD",address:"0xffD4505B3452Dc22f8473616d50503bA9E1710Ac",decimals:18,isDirectTransfer:!0},native:{symbol:"ETC",decimals:18,isNative:!0}},feeUI:0},"ethereum-classic":{uri:"https://etc.rivet.link",chainId:61,djedAddress:"0xCc3664d7021FD36B1Fe2b136e2324710c8442cCf",tokens:{stablecoin:{symbol:"ECSD",address:"0x5A7Ca94F6E969C94bef4CE5e2f90ed9d4891918A",decimals:18,isDirectTransfer:!0},native:{symbol:"ETC",decimals:18,isNative:!0}},feeUI:0}};class r{constructor(e,t){this.networkUri=e,this.djedAddress=t}async init(){if(!this.networkUri||!this.djedAddress)throw new Error("Network URI and DJED address are required");try{this.web3=await e.getWeb3(this.networkUri),this.djedContract=e.getDjedContract(this.web3,this.djedAddress);const{stableCoin:t,reserveCoin:n}=await e.getCoinContracts(this.djedContract,this.web3),{scDecimals:a,rcDecimals:r}=await e.getDecimals(t,n);this.stableCoin=t,this.reserveCoin=n,this.scDecimals=a,this.rcDecimals=r,this.oracleContract=await e.getOracleAddress(this.djedContract).then((t=>e.getOracleContract(this.web3,t,this.djedContract._address))),this.oracleAddress=this.oracleContract._address,console.log("Transaction initialized successfully")}catch(e){throw console.error("Error initializing transaction:",e),e}}getBlockchainDetails(){return{web3Available:!!this.web3,djedContractAvailable:!!this.djedContract,stableCoinAddress:this.stableCoin?this.stableCoin._address:"N/A",reserveCoinAddress:this.reserveCoin?this.reserveCoin._address:"N/A",stableCoinDecimals:this.scDecimals,reserveCoinDecimals:this.rcDecimals,oracleAddress:this.oracleAddress||"N/A",oracleContractAvailable:!!this.oracleContract}}async handleTradeDataBuySc(t){if(!this.djedContract)throw new Error("DJED contract is not initialized");if("string"!=typeof t)throw new Error("Amount must be a string");try{return(await e.tradeDataPriceBuySc(this.djedContract,this.scDecimals,t)).totalBCScaled}catch(e){throw console.error("Error fetching trade data for buying stablecoins: ",e),e}}async buyStablecoins(t,n,a){if(!this.djedContract)throw new Error("DJED contract is not initialized");try{console.log(`Building stablecoin purchase transaction from ${t} to ${n} with value ${a}`);const r="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",i=await e.buyScTx(this.djedContract,t,n,a,r,this.djedAddress);return console.log("Transaction built:",i),i}catch(e){throw console.error("Error executing buyStablecoins transaction: ",e),e}}}var i="main_stablePayButton__UA7HC",o="main_logo__ITyEy",s="main_buttonText__N-ewy";const l=({onClick:e,size:n="medium"})=>{const a={small:{width:"200px",height:"50px",fontSize:"14px"},medium:{width:"250px",height:"60px",fontSize:"16px"},large:{width:"300px",height:"70px",fontSize:"18px"}},r={small:{width:"35px",height:"33px"},medium:{width:"40px",height:"38px"},large:{width:"45px",height:"43px"}},l=a[n]||a.medium,c=r[n]||r.medium;return t.createElement("button",{className:i,onClick:e,style:l},t.createElement("div",{className:o,style:c}),t.createElement("span",{className:s},"Pay with StablePay"))};var c={dialogOverlay:"PricingCard_dialogOverlay__0XJrE",pricingCard:"PricingCard_pricingCard__LrWb9",small:"PricingCard_small__J4CHj",medium:"PricingCard_medium__EVmTB",large:"PricingCard_large__A6pnX",dialogClose:"PricingCard_dialogClose__jJ1tM",pricingCardHeader:"PricingCard_pricingCardHeader__wGczA",allianceLogo:"PricingCard_allianceLogo__URa-U",stablepayTitle:"PricingCard_stablepayTitle__4t848",pricingCardBody:"PricingCard_pricingCardBody__0wKQn",selectField:"PricingCard_selectField__LBPoZ",transactionReview:"PricingCard_transactionReview__Ix-eL",transactionInfo:"PricingCard_transactionInfo__Ck-Rc",transactionLabel:"PricingCard_transactionLabel__GDux7",transactionValue:"PricingCard_transactionValue__q-xxp",infoSection:"PricingCard_infoSection__gyjMQ",infoIcon:"PricingCard_infoIcon__rraxD",infoText:"PricingCard_infoText__l4b7A",walletButton:"PricingCard_walletButton__llw4v",loading:"PricingCard_loading__2-tGA",error:"PricingCard_error__m5fK-",networkError:"PricingCard_networkError__zR-36",errorText:"PricingCard_errorText__qZRJt","message-box":"PricingCard_message-box__vkUKy",detailsButton:"PricingCard_detailsButton__jHglL",errorDetails:"PricingCard_errorDetails__CzN-7",loadingContainer:"PricingCard_loadingContainer__6nOVa",spinner:"PricingCard_spinner__9ucQv",spin:"PricingCard_spin__24tni"};const d=({children:e,onClose:n,size:a="medium"})=>t.createElement("div",{className:c.dialogOverlay},t.createElement("div",{className:`${c.pricingCard} ${c[a]}`},t.createElement("button",{className:c.dialogClose,onClick:n},"×"),t.createElement("div",{className:c.pricingCardHeader},t.createElement("div",{className:c.allianceLogo}),t.createElement("h2",{className:c.stablepayTitle},"StablePay")),t.createElement("div",{className:c.pricingCardBody},e)));class u{constructor(e){this.networkSelector=e,this.selectedToken=null}selectToken(e){const t=this.networkSelector.getSelectedNetworkConfig();return!(!t||!t.tokens[e])&&(this.selectedToken={key:e,...t.tokens[e]},!0)}getSelectedToken(){return this.selectedToken}getAvailableTokens(){const e=this.networkSelector.getSelectedNetworkConfig();return e?Object.entries(e.tokens).map((([e,t])=>({key:e,...t}))):[]}resetSelection(){this.selectedToken=null}}const m=t.createContext(),h=({children:e,networkSelector:n})=>{const[a]=t.useState((()=>new u(n))),[r,i]=t.useState(null),[o,s]=t.useState(null),[l,c]=t.useState(null),d=()=>{s(null),c(null)};return t.useEffect((()=>{i(n.selectedNetwork)}),[n.selectedNetwork]),t.createElement(m.Provider,{value:{networkSelector:n,tokenSelector:a,selectedNetwork:r,selectedToken:o,transactionDetails:l,setTransactionDetails:c,selectNetwork:e=>!!n.selectNetwork(e)&&(i(e),d(),!0),selectToken:e=>{if(a.selectToken(e)){const e=a.getSelectedToken();return s(e),!0}return!1},resetSelections:()=>{n.selectNetwork(null),i(null),d()}}},e)},w=()=>{const e=t.useContext(m);if(void 0===e)throw new Error("useNetwork must be used within a NetworkProvider");return e},g=()=>{const{networkSelector:e,selectedNetwork:n,selectNetwork:a}=w();return t.createElement("div",{className:c.selectField},t.createElement("label",{htmlFor:"network-select"},"Select Network"),t.createElement("select",{id:"network-select",onChange:e=>{a(e.target.value)},value:n||""},t.createElement("option",{value:"",disabled:!0},"Select a network"),Object.keys(e.availableNetworks).map((e=>t.createElement("option",{key:e,value:e},e)))))},k=()=>{const{networkSelector:e,tokenSelector:n,selectedNetwork:a,selectedToken:i,selectToken:o,setTransactionDetails:s}=w(),[l,d]=t.useState(!1),[u,m]=t.useState(null),h=a?n.getAvailableTokens():[];return t.createElement("div",{className:c.selectField},t.createElement("label",{htmlFor:"token-select"},"Select Token"),t.createElement("select",{id:"token-select",onChange:async t=>{const i=t.target.value;m(null),d(!0);try{if(o(i)){const t=e.getSelectedNetworkConfig(),o=new r(t.uri,t.djedAddress);await o.init();const l=e.getTokenAmount(i),c=o.getBlockchainDetails();let d=null;"native"===i&&(d=await o.handleTradeDataBuySc(String(l))),s({network:a,token:i,tokenSymbol:n.getSelectedToken().symbol,amount:l,receivingAddress:e.getReceivingAddress(),djedContractAddress:t.djedAddress,isDirectTransfer:n.getSelectedToken().isDirectTransfer||!1,isNativeToken:n.getSelectedToken().isNative||!1,tradeAmount:d?d.amount:null,...c})}}catch(e){console.error("Error fetching transaction details:",e),m("Failed to fetch transaction details. Please try again.")}finally{d(!1)}},value:i?i.key:"",disabled:!a||l},t.createElement("option",{value:"",disabled:!0},a?l?"Loading...":"Select a token":"Please select a network first"),h.map((e=>t.createElement("option",{key:e.key,value:e.key},e.symbol," (",e.isDirectTransfer?"Direct Transfer":"Native",")")))),u&&t.createElement("div",{className:c.error},u))},C=n.defineChain({id:63,name:"Mordor Testnet",network:"mordor",nativeCurrency:{decimals:18,name:"Mordor Ether",symbol:"METC"},rpcUrls:{default:{http:["https://rpc.mordor.etccooperative.org"],webSocket:["wss://rpc.mordor.etccooperative.org/ws"]}},blockExplorers:{default:{name:"BlockScout",url:"https://blockscout.com/etc/mordor"}},testnet:!0}),b=n.defineChain({id:61,name:"Ethereum Classic",network:"ethereum-classic",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETC"},rpcUrls:{default:{http:["https://etc.rivet.link"]}},blockExplorers:{default:{name:"BlockScout",url:"https://blockscout.com/etc/mainnet"}},testnet:!1}),p=t.createContext(null),f=({children:e})=>{const[a,r]=t.useState(null),[i,o]=t.useState(null),[s,l]=t.useState(null),[c,d]=t.useState(null),[u,m]=t.useState(null),[h,w]=t.useState(null),[g,k]=t.useState(!1),f=("ethereum-classic-mainnet"===window.__STABLEPAY_SELECTED_NETWORK__?b:C).id,_=()=>"ethereum-classic-mainnet"===window.__STABLEPAY_SELECTED_NETWORK__?b:C,E=t.useCallback((async()=>{if(!window.ethereum)return w("Please install MetaMask or another Web3 wallet"),!1;k(!0),w(null);try{const e=await window.ethereum.request({method:"eth_requestAccounts"});if(0===e.length)throw new Error("No wallet address found. Please unlock your wallet.");const t=await window.ethereum.request({method:"eth_chainId"}),a=parseInt(t,16);if(a!==f)try{await window.ethereum.request({method:"wallet_switchEthereumChain",params:[{chainId:`0x${f.toString(16)}`}]})}catch(e){if(4902!==e.code)throw new Error(`Please switch to ${_().name} in MetaMask`);try{const e=_();await window.ethereum.request({method:"wallet_addEthereumChain",params:[{chainId:`0x${e.id.toString(16)}`,chainName:e.name,nativeCurrency:e.nativeCurrency,rpcUrls:e.rpcUrls.default.http,blockExplorerUrls:[e.blockExplorers.default.url]}]})}catch(e){throw new Error("Failed to add chain to MetaMask")}}const i=n.createWalletClient({chain:_(),transport:n.custom(window.ethereum)});r(i),l(e[0]),d(a);const o=n.createPublicClient({chain:_(),transport:n.http()}),s=await o.getBalance({address:e[0]});return m(parseFloat(s)/Math.pow(10,18)),window.ethereum.on("accountsChanged",S),window.ethereum.on("chainChanged",y),!0}catch(e){return console.error("Error connecting wallet:",e),w(e.message),!1}finally{k(!1)}}),[]),v=t.useCallback((()=>{o(n.createPublicClient({chain:_(),transport:n.http()}))}),[]),y=async e=>{const t=parseInt(e,16);d(t);if(t===_().id){if(window.ethereum){const e=n.createWalletClient({chain:_(),transport:n.custom(window.ethereum)});r(e)}}else w(`Wrong network detected. Please switch to ${_().name}`)},S=async e=>{if(0===e.length)T();else{l(e[0]);const t=n.createPublicClient({chain:_(),transport:n.http()}),a=await t.getBalance({address:e[0]});m(parseFloat(a)/Math.pow(10,18))}},T=t.useCallback((()=>{r(null),l(null),d(null),m(null),window.ethereum&&(window.ethereum.removeListener("accountsChanged",S),window.ethereum.removeListener("chainChanged",y))}),[]);return t.useEffect((()=>{v()}),[v]),t.createElement(p.Provider,{value:{walletClient:a,publicClient:i,account:s,chainId:c,balance:u,error:h,isConnecting:g,connectWallet:E,disconnectWallet:T}},e)},_=({onTransactionComplete:e})=>{const{networkSelector:a,selectedNetwork:i,selectedToken:o,transactionDetails:s,setTransactionDetails:l}=w(),{connectWallet:d,account:u,walletClient:m,publicClient:h,isConnecting:g}=(()=>{const e=t.useContext(p);if(!e)throw new Error("useWallet must be used within a WalletProvider");return e})(),[k,C]=t.useState(null),[b,f]=t.useState(null),[_,E]=t.useState(null),[v,y]=t.useState(""),[S,T]=t.useState(null),[N,A]=t.useState(null),[D,x]=t.useState(!1);if(t.useEffect((()=>{(async()=>{if(i&&o)try{const e=a.getSelectedNetworkConfig(),t=a.getReceivingAddress(),n=a.getTokenAmount(o.key),s=new r(e.uri,e.djedAddress);await s.init(),C(s);let c=null;if("native"===o.key)try{c=await s.handleTradeDataBuySc(String(n)),f(c)}catch(e){console.error("Error fetching trade data:",e)}l({network:i,token:o.key,tokenSymbol:o.symbol,amount:n||"0",receivingAddress:t,djedContractAddress:e.djedAddress,isDirectTransfer:o.isDirectTransfer||!1,isNativeToken:o.isNative||!1,tradeAmount:c?c.amount:null,...s.getBlockchainDetails()})}catch(e){console.error("Error initializing transaction:",e)}})()}),[i,o,a,l]),!s)return t.createElement("div",{className:c.loading},"Initializing transaction...");return t.createElement("div",{className:c.transactionReview},t.createElement("div",{className:c.transactionInfo},t.createElement("span",{className:c.transactionLabel},"Network:"),t.createElement("span",{className:c.transactionValue},s.network)),t.createElement("div",{className:c.transactionInfo},t.createElement("span",{className:c.transactionLabel},"You Pay:"),t.createElement("span",{className:c.transactionValue},"stablecoin"===o.key?`${s.amount} ${s.tokenSymbol}`:`${b||"Calculating..."} ${s.tokenSymbol}`)),t.createElement("button",{className:c.walletButton,onClick:async()=>{await d()&&console.log("Wallet connected:",u)},disabled:g},g?"Connecting...":"Connect Wallet"),u&&!_&&t.createElement("button",{className:c.walletButton,onClick:async()=>{if(u&&s&&k)try{y("⏳ Preparing transaction...");const e=s.receivingAddress;let t;if("native"===o.key){const a="0x0232556C83791b8291E9b23BfEa7d67405Bd9839",r=b||"0";t=await k.buyStablecoins(u,e,n.parseEther(String(r)),a)}else{const a=s.amount?n.parseUnits(String(s.amount),s.stableCoinDecimals):"0";t={to:"0xdc86935A9597aA3A9008d2f26232233043091284",data:n.encodeFunctionData({abi:[{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}],functionName:"transfer",args:[e,a]}),account:u}}E(t),y("✅ Transaction ready! Click 'Send Transaction' to proceed.")}catch(e){A(e),y("❌ Transaction preparation failed.")}else y("❌ Wallet not connected or transaction details missing")}},"Prepare Transaction"),u&&_&&t.createElement("button",{className:c.walletButton,onClick:async()=>{try{if(!m||!u||!_)return void y("❌ Wallet client, account, or transaction data is missing");y("⏳ Sending transaction...");const t=await m.sendTransaction({..._,account:u});T(t),y("✅ Transaction sent!"),e&&e({txHash:t,network:i,token:o?.key,tokenSymbol:o?.symbol,amount:s?.amount,receivingAddress:s?.receivingAddress})}catch(e){A(e),y("❌ Transaction failed.")}},disabled:null!==S},"Send Transaction"),v&&t.createElement("div",{className:"message-box"},v,N&&t.createElement("button",{onClick:()=>x(!D),className:c.detailsButton},D?"Hide Details":"Show Details")),D&&N&&t.createElement("div",{className:c.errorDetails},t.createElement("pre",null,N.message)),S&&t.createElement("div",{className:c.transactionLink},"✅ Transaction Hash:"," ",t.createElement("a",{href:(()=>{if(!S||!i)return null;const e={"mordor-testnet":"https://blockscout.com/etc/mordor/tx/","ethereum-classic":"https://blockscout.com/etc/mainnet/tx/",sepolia:"https://sepolia.etherscan.io/tx/","milkomeda-mainnet":"https://explorer-mainnet-cardano-evm.c1.milkomeda.com/tx/"};return e[i]?`${e[i]}${S}`:null})()||"#",target:"_blank",rel:"noopener noreferrer",className:c.explorerLink,style:{color:"#007bff",textDecoration:"underline",fontWeight:"bold",cursor:"pointer",wordBreak:"break-word"}},S.slice(0,6),"...",S.slice(-6))))},E=({onClose:e,buttonSize:n,onTransactionComplete:a})=>{const{resetSelections:r}=w();return t.createElement(d,{onClose:()=>{r(),e()},size:n},t.createElement(g,null),t.createElement(k,null),t.createElement(_,{onTransactionComplete:a}))},v=({onClose:e,buttonSize:n,networkSelector:a,onTransactionComplete:r})=>(window.__STABLEPAY_SELECTED_NETWORK__=a?.selectedNetwork||null,t.createElement(h,{networkSelector:a},t.createElement(f,null,t.createElement(E,{onClose:e,buttonSize:n,onTransactionComplete:r}))));return{NetworkSelector:class{constructor(e){this.merchantConfig=e,this.blacklist=e.getBlacklist(),this.availableNetworks=this.getAvailableNetworks(),this.selectedNetwork=null}getAvailableNetworks(){return Object.entries(a).reduce(((e,[t,n])=>(this.blacklist.includes(n.chainId)||(e[t]=n),e)),{})}selectNetwork(e){return null===e?(this.selectedNetwork=null,console.log("Network selection reset"),!0):this.availableNetworks[e]?(this.selectedNetwork=e,console.log(`Network selected: ${e}`),!0):(console.error(`Invalid network: ${e}`),!1)}getSelectedNetworkConfig(){return this.selectedNetwork?this.availableNetworks[this.selectedNetwork]:null}getReceivingAddress(){return this.merchantConfig.getReceivingAddress()}getTokenAmount(e){return this.merchantConfig.getTokenAmount(this.selectedNetwork,e)}},Transaction:r,Config:class{constructor(e={}){this.receivingAddress=e.receivingAddress||"",this.blacklist=e.blacklist||[],this.amounts=e.Amounts||{},this.validateConfig()}validateConfig(){if(!this.receivingAddress)throw new Error("Receiving address is required");for(const[e,t]of Object.entries(this.amounts)){if(!a[e])throw new Error(`Invalid network: ${e}`);if(!t.stablecoin||"number"!=typeof t.stablecoin||t.stablecoin<=0)throw new Error(`Invalid stablecoin amount for network ${e}`)}}getBlacklist(){return this.blacklist}getReceivingAddress(){return this.receivingAddress}getTokenAmount(e){console.log("Getting amount for network:",e),console.log("Amounts object:",this.amounts);const t=this.amounts[e]?.stablecoin;return console.log("Returning amount:",t),t||0}},Widget:({networkSelector:e,buttonSize:n="medium",onTransactionComplete:a,onSuccess:r})=>{const[i,o]=t.useState(!1),s=a||r;return t.createElement("div",{className:c.widgetContainer},!i&&t.createElement(l,{onClick:()=>{o(!0)},size:n}),i&&t.createElement(v,{onClose:()=>{o(!1)},buttonSize:n,networkSelector:e,onTransactionComplete:s}))},PayButton:l,Dialog:d,NetworkDropdown:g}})); -//# sourceMappingURL=index.js.map diff --git a/stablepay-sdk/dist/umd/index.js.map b/stablepay-sdk/dist/umd/index.js.map deleted file mode 100644 index 9da09e5..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\r\nexport const networksConfig = {\r\n 'sepolia': {\r\n uri: 'https://ethereum-sepolia.publicnode.com/',\r\n chainId: 11155111,\r\n djedAddress: '0x624FcD0a1F9B5820c950FefD48087531d38387f4',\r\n tokens: {\r\n stablecoin: {\r\n symbol: 'SOD',\r\n address: '0x6b930182787F346F18666D167e8d32166dC5eFBD',\r\n decimals: 18,\r\n isDirectTransfer: true\r\n },\r\n native: {\r\n symbol: 'ETH',\r\n decimals: 18,\r\n isNative: true\r\n }\r\n },\r\n feeUI: 0\r\n },\r\n 'milkomeda-mainnet': {\r\n uri: 'https://rpc-mainnet-cardano-evm.c1.milkomeda.com',\r\n chainId: 2001,\r\n djedAddress: '0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76',\r\n tokens: {\r\n stablecoin: {\r\n symbol: 'MOD',\r\n address: '0xcbA90fB1003b9D1bc6a2b66257D2585011b004e9',\r\n decimals: 18,\r\n isDirectTransfer: true\r\n },\r\n native: {\r\n symbol: 'mADA',\r\n decimals: 18,\r\n isNative: true\r\n }\r\n },\r\n feeUI: 0\r\n },\r\n 'mordor-testnet': { // Mordor Testnet (ETC)\r\n uri: 'https://rpc.mordor.etccooperative.org',\r\n chainId: 63,\r\n djedAddress: '0xD4548F4b6d08852B56cdabC6be7Fd90953179d68',\r\n tokens: {\r\n stablecoin: {\r\n symbol: 'ECSD',\r\n address: '0xffD4505B3452Dc22f8473616d50503bA9E1710Ac',\r\n decimals: 18,\r\n isDirectTransfer: true\r\n },\r\n native: {\r\n symbol: 'ETC',\r\n decimals: 18,\r\n isNative: true\r\n }\r\n },\r\n feeUI: 0\r\n },\r\n 'ethereum-classic': { // ETC Mainnet\r\n uri: 'https://etc.rivet.link',\r\n chainId: 61,\r\n djedAddress: '0xCc3664d7021FD36B1Fe2b136e2324710c8442cCf',\r\n tokens: {\r\n stablecoin: {\r\n symbol: 'ECSD',\r\n address: '0x5A7Ca94F6E969C94bef4CE5e2f90ed9d4891918A',\r\n decimals: 18,\r\n isDirectTransfer: true\r\n },\r\n native: {\r\n symbol: 'ETC',\r\n decimals: 18,\r\n isNative: true\r\n }\r\n },\r\n feeUI: 0\r\n }\r\n};","import { getWeb3, getDjedContract, getCoinContracts, getDecimals, getOracleAddress, getOracleContract, tradeDataPriceBuySc, buyScTx } from 'djed-sdk';\r\n\r\nexport class Transaction {\r\n constructor(networkUri, djedAddress) {\r\n this.networkUri = networkUri;\r\n this.djedAddress = djedAddress;\r\n }\r\n\r\n async init() {\r\n if (!this.networkUri || !this.djedAddress) {\r\n throw new Error('Network URI and DJED address are required');\r\n }\r\n\r\n try {\r\n this.web3 = await getWeb3(this.networkUri);\r\n this.djedContract = getDjedContract(this.web3, this.djedAddress);\r\n const { stableCoin, reserveCoin } = await getCoinContracts(this.djedContract, this.web3);\r\n const { scDecimals, rcDecimals } = await getDecimals(stableCoin, reserveCoin);\r\n this.stableCoin = stableCoin;\r\n this.reserveCoin = reserveCoin;\r\n this.scDecimals = scDecimals;\r\n this.rcDecimals = rcDecimals;\r\n\r\n // Get the oracle contract\r\n this.oracleContract = await getOracleAddress(this.djedContract).then((addr) =>\r\n getOracleContract(this.web3, addr, this.djedContract._address)\r\n );\r\n\r\n this.oracleAddress = this.oracleContract._address;\r\n\r\n console.log('Transaction initialized successfully');\r\n } catch (error) {\r\n console.error('Error initializing transaction:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n getBlockchainDetails() {\r\n return {\r\n web3Available: !!this.web3,\r\n djedContractAvailable: !!this.djedContract,\r\n stableCoinAddress: this.stableCoin ? this.stableCoin._address : 'N/A',\r\n reserveCoinAddress: this.reserveCoin ? this.reserveCoin._address : 'N/A',\r\n stableCoinDecimals: this.scDecimals,\r\n reserveCoinDecimals: this.rcDecimals,\r\n oracleAddress: this.oracleAddress || 'N/A',\r\n oracleContractAvailable: !!this.oracleContract,\r\n };\r\n }\r\n\r\n async handleTradeDataBuySc(amountScaled) {\r\n if (!this.djedContract) {\r\n throw new Error(\"DJED contract is not initialized\");\r\n }\r\n if (typeof amountScaled !== 'string') {\r\n throw new Error(\"Amount must be a string\");\r\n }\r\n try {\r\n const result = await tradeDataPriceBuySc(this.djedContract, this.scDecimals, amountScaled);\r\n return result.totalBCScaled; //converted ETH equivalent\r\n } catch (error) {\r\n console.error(\"Error fetching trade data for buying stablecoins: \", error);\r\n throw error;\r\n }\r\n }\r\n\r\n // use buyScTx directly\r\n async buyStablecoins(payer, receiver, value) {\r\n if (!this.djedContract) {\r\n throw new Error(\"DJED contract is not initialized\");\r\n }\r\n try {\r\n console.log(`Building stablecoin purchase transaction from ${payer} to ${receiver} with value ${value}`);\r\n\r\n //Hardcoded UI address\r\n const UI = '0x0232556C83791b8291E9b23BfEa7d67405Bd9839';\r\n\r\n //buyScTx from djed-sdk\r\n const txData = await buyScTx(this.djedContract, payer, receiver, value, UI, this.djedAddress);\r\n\r\n console.log(\"Transaction built:\", txData);\r\n return txData;\r\n } catch (error) {\r\n console.error(\"Error executing buyStablecoins transaction: \", error);\r\n throw error;\r\n }\r\n }\r\n}\r\n","import React from \"react\";\r\nimport styles from \"../styles/main.css\";\r\n\r\nconst PayButton = ({ onClick, size = \"medium\" }) => {\r\n const sizeStyles = {\r\n small: { width: \"200px\", height: \"50px\", fontSize: \"14px\" },\r\n medium: { width: \"250px\", height: \"60px\", fontSize: \"16px\" },\r\n large: { width: \"300px\", height: \"70px\", fontSize: \"18px\" },\r\n };\r\n\r\n const logoSizes = {\r\n small: { width: \"35px\", height: \"33px\" },\r\n medium: { width: \"40px\", height: \"38px\" },\r\n large: { width: \"45px\", height: \"43px\" },\r\n };\r\n\r\n const buttonStyle = sizeStyles[size] || sizeStyles.medium;\r\n const logoStyle = logoSizes[size] || logoSizes.medium;\r\n\r\n return (\r\n \r\n
\r\n Pay with StablePay\r\n \r\n );\r\n};\r\n\r\nexport default PayButton;\r\n","import React from 'react';\r\nimport styles from '../styles/PricingCard.css';\r\n\r\n\r\nconst Dialog = ({ children, onClose, size = 'medium' }) => {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n

StablePay

\r\n
\r\n
\r\n {children}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Dialog;","// TokenSelector.js\r\n\r\nexport class TokenSelector {\r\n constructor(networkSelector) {\r\n this.networkSelector = networkSelector;\r\n this.selectedToken = null;\r\n }\r\n\r\n selectToken(tokenKey) {\r\n const networkConfig = this.networkSelector.getSelectedNetworkConfig();\r\n if (networkConfig && networkConfig.tokens[tokenKey]) {\r\n this.selectedToken = {\r\n key: tokenKey,\r\n ...networkConfig.tokens[tokenKey]\r\n };\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n getSelectedToken() {\r\n return this.selectedToken;\r\n }\r\n\r\n getAvailableTokens() {\r\n const networkConfig = this.networkSelector.getSelectedNetworkConfig();\r\n if (!networkConfig) return [];\r\n\r\n return Object.entries(networkConfig.tokens).map(([key, config]) => ({\r\n key,\r\n ...config\r\n }));\r\n }\r\n\r\n resetSelection() {\r\n this.selectedToken = null;\r\n }\r\n}","import React, { createContext, useState, useContext, useEffect } from 'react';\r\nimport { TokenSelector } from '../core/TokenSelector';\r\n\r\nconst NetworkContext = createContext();\r\n\r\nexport const NetworkProvider = ({ children, networkSelector }) => {\r\n const [tokenSelector] = useState(() => new TokenSelector(networkSelector));\r\n const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n const [selectedToken, setSelectedToken] = useState(null);\r\n const [transactionDetails, setTransactionDetails] = useState(null);\r\n\r\n const resetState = () => {\r\n setSelectedToken(null);\r\n setTransactionDetails(null);\r\n };\r\n\r\n const selectNetwork = (networkKey) => {\r\n if (networkSelector.selectNetwork(networkKey)) {\r\n setSelectedNetwork(networkKey);\r\n resetState(); \r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const selectToken = (tokenKey) => {\r\n if (tokenSelector.selectToken(tokenKey)) {\r\n const token = tokenSelector.getSelectedToken();\r\n setSelectedToken(token);\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const resetSelections = () => {\r\n networkSelector.selectNetwork(null);\r\n setSelectedNetwork(null);\r\n resetState();\r\n };\r\n\r\n // Synchronize context state with NetworkSelector\r\n useEffect(() => {\r\n setSelectedNetwork(networkSelector.selectedNetwork);\r\n }, [networkSelector.selectedNetwork]);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport const useNetwork = () => {\r\n const context = useContext(NetworkContext);\r\n if (context === undefined) {\r\n throw new Error('useNetwork must be used within a NetworkProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport default NetworkContext;","import React from 'react';\r\nimport { useNetwork } from '../contexts/NetworkContext';\r\nimport styles from '../styles/PricingCard.css';\r\n\r\nconst NetworkDropdown = () => {\r\n const { networkSelector, selectedNetwork, selectNetwork } = useNetwork();\r\n\r\n const handleNetworkChange = (event) => {\r\n selectNetwork(event.target.value);\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default NetworkDropdown;","import React, { useState } from \"react\";\r\nimport { useNetwork } from \"../contexts/NetworkContext\";\r\nimport { Transaction } from \"../core/Transaction\";\r\nimport styles from \"../styles/PricingCard.css\";\r\n\r\nconst TokenDropdown = () => {\r\n const {\r\n networkSelector,\r\n tokenSelector,\r\n selectedNetwork,\r\n selectedToken,\r\n selectToken,\r\n setTransactionDetails,\r\n } = useNetwork();\r\n\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(null);\r\n\r\n const handleTokenChange = async (event) => {\r\n const newValue = event.target.value;\r\n setError(null);\r\n setLoading(true);\r\n\r\n try {\r\n if (selectToken(newValue)) {\r\n const networkConfig = networkSelector.getSelectedNetworkConfig();\r\n const transaction = new Transaction(\r\n networkConfig.uri,\r\n networkConfig.djedAddress\r\n );\r\n await transaction.init();\r\n\r\n const tokenAmount = networkSelector.getTokenAmount(newValue);\r\n const blockchainDetails = transaction.getBlockchainDetails();\r\n\r\n let tradeData = null;\r\n if (newValue === \"native\") {\r\n tradeData = await transaction.handleTradeDataBuySc(\r\n String(tokenAmount)\r\n );\r\n }\r\n\r\n setTransactionDetails({\r\n network: selectedNetwork,\r\n token: newValue,\r\n tokenSymbol: tokenSelector.getSelectedToken().symbol,\r\n amount: tokenAmount,\r\n receivingAddress: networkSelector.getReceivingAddress(),\r\n djedContractAddress: networkConfig.djedAddress,\r\n isDirectTransfer:\r\n tokenSelector.getSelectedToken().isDirectTransfer || false,\r\n isNativeToken: tokenSelector.getSelectedToken().isNative || false,\r\n tradeAmount: tradeData ? tradeData.amount : null,\r\n ...blockchainDetails,\r\n });\r\n }\r\n } catch (err) {\r\n console.error(\"Error fetching transaction details:\", err);\r\n setError(\"Failed to fetch transaction details. Please try again.\");\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const availableTokens = selectedNetwork\r\n ? tokenSelector.getAvailableTokens()\r\n : [];\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {availableTokens.map((token) => (\r\n \r\n ))}\r\n \r\n {error &&
{error}
}\r\n
\r\n );\r\n};\r\n\r\nexport default TokenDropdown;\r\n","import { defineChain } from 'viem';\r\n\r\nexport const mordor = defineChain({\r\n id: 63,\r\n name: 'Mordor Testnet',\r\n network: 'mordor',\r\n nativeCurrency: {\r\n decimals: 18,\r\n name: 'Mordor Ether',\r\n symbol: 'METC',\r\n },\r\n rpcUrls: {\r\n default: {\r\n http: ['https://rpc.mordor.etccooperative.org'],\r\n webSocket: ['wss://rpc.mordor.etccooperative.org/ws'],\r\n },\r\n },\r\n blockExplorers: {\r\n default: { name: 'BlockScout', url: 'https://blockscout.com/etc/mordor' },\r\n },\r\n testnet: true,\r\n});\r\n\r\nexport const etcMainnet = defineChain({\r\n id: 61,\r\n name: 'Ethereum Classic',\r\n network: 'ethereum-classic',\r\n nativeCurrency: {\r\n decimals: 18,\r\n name: 'Ether',\r\n symbol: 'ETC',\r\n },\r\n rpcUrls: {\r\n default: {\r\n http: ['https://etc.rivet.link'],\r\n },\r\n },\r\n blockExplorers: {\r\n default: { name: 'BlockScout', url: 'https://blockscout.com/etc/mainnet' },\r\n },\r\n testnet: false,\r\n});\r\n","import React, { createContext, useContext, useState, useCallback, useEffect } from 'react';\r\nimport { createWalletClient, createPublicClient, custom, http } from 'viem';\r\nimport { mordor, etcMainnet } from './chains';\r\n\r\nconst WalletContext = createContext(null);\r\n\r\nexport const useWallet = () => {\r\n const context = useContext(WalletContext);\r\n if (!context) {\r\n throw new Error('useWallet must be used within a WalletProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport const WalletProvider = ({ children }) => {\r\n const [walletClient, setWalletClient] = useState(null);\r\n const [publicClient, setPublicClient] = useState(null);\r\n const [account, setAccount] = useState(null);\r\n const [chainId, setChainId] = useState(null);\r\n const [balance, setBalance] = useState(null);\r\n const [error, setError] = useState(null);\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n\r\n const expectedChainId = (function(){ return (window.__STABLEPAY_SELECTED_NETWORK__ === 'ethereum-classic-mainnet' ? etcMainnet : mordor).id; })();\r\n const getExpectedChain = () => {\r\n const key = window.__STABLEPAY_SELECTED_NETWORK__;\r\n if (key === 'ethereum-classic-mainnet') return etcMainnet;\r\n return mordor;\r\n };\r\n\r\n const connectWallet = useCallback(async () => {\r\n if (!window.ethereum) {\r\n setError('Please install MetaMask or another Web3 wallet');\r\n return false;\r\n }\r\n\r\n setIsConnecting(true);\r\n setError(null);\r\n\r\n try {\r\n const accounts = await window.ethereum.request({ \r\n method: 'eth_requestAccounts' \r\n });\r\n\r\n if (accounts.length === 0) {\r\n throw new Error('No wallet address found. Please unlock your wallet.');\r\n }\r\n\r\n const chainIdHex = await window.ethereum.request({ method: 'eth_chainId' });\r\n const currentChainId = parseInt(chainIdHex, 16);\r\n\r\n if (currentChainId !== expectedChainId) {\r\n try {\r\n await window.ethereum.request({\r\n method: 'wallet_switchEthereumChain',\r\n params: [{ chainId: `0x${expectedChainId.toString(16)}` }],\r\n });\r\n } catch (switchError) {\r\n if (switchError.code === 4902) {\r\n try {\r\n const expectedChain = getExpectedChain();\r\n await window.ethereum.request({\r\n method: 'wallet_addEthereumChain',\r\n params: [\r\n {\r\n chainId: `0x${expectedChain.id.toString(16)}`,\r\n chainName: expectedChain.name,\r\n nativeCurrency: expectedChain.nativeCurrency,\r\n rpcUrls: expectedChain.rpcUrls.default.http,\r\n blockExplorerUrls: [expectedChain.blockExplorers.default.url],\r\n },\r\n ],\r\n });\r\n } catch (addError) {\r\n throw new Error('Failed to add chain to MetaMask');\r\n }\r\n } else {\r\n throw new Error(`Please switch to ${getExpectedChain().name} in MetaMask`);\r\n }\r\n }\r\n }\r\n\r\n const walletClient = createWalletClient({\r\n chain: getExpectedChain(),\r\n transport: custom(window.ethereum),\r\n });\r\n\r\n setWalletClient(walletClient);\r\n setAccount(accounts[0]);\r\n setChainId(currentChainId);\r\n\r\n const publicClient = createPublicClient({ chain: getExpectedChain(), transport: http() });\r\n const balance = await publicClient.getBalance({ address: accounts[0] });\r\n setBalance(parseFloat(balance) / Math.pow(10, 18));\r\n\r\n window.ethereum.on('accountsChanged', handleAccountsChanged);\r\n window.ethereum.on('chainChanged', handleChainChanged);\r\n\r\n return true;\r\n } catch (err) {\r\n console.error('Error connecting wallet:', err);\r\n setError(err.message);\r\n return false;\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n }, []);\r\n\r\n const connectPublicClient = useCallback(() => {\r\n setPublicClient(createPublicClient({ chain: getExpectedChain(), transport: http() }));\r\n }, []);\r\n\r\n const handleChainChanged = async (chainIdHex) => {\r\n const newChainId = parseInt(chainIdHex, 16);\r\n setChainId(newChainId);\r\n\r\n const expectedId = getExpectedChain().id;\r\n if (newChainId !== expectedId) {\r\n setError(`Wrong network detected. Please switch to ${getExpectedChain().name}`);\r\n return;\r\n }\r\n\r\n if (window.ethereum) {\r\n const walletClient = createWalletClient({ chain: getExpectedChain(), transport: custom(window.ethereum) });\r\n setWalletClient(walletClient);\r\n }\r\n };\r\n\r\n const handleAccountsChanged = async (accounts) => {\r\n if (accounts.length === 0) {\r\n disconnectWallet();\r\n } else {\r\n setAccount(accounts[0]);\r\n\r\n const publicClient = createPublicClient({ chain: getExpectedChain(), transport: http() });\r\n const balance = await publicClient.getBalance({ address: accounts[0] });\r\n setBalance(parseFloat(balance) / Math.pow(10, 18));\r\n }\r\n };\r\n\r\n const disconnectWallet = useCallback(() => {\r\n setWalletClient(null);\r\n setAccount(null);\r\n setChainId(null);\r\n setBalance(null);\r\n\r\n if (window.ethereum) {\r\n window.ethereum.removeListener('accountsChanged', handleAccountsChanged);\r\n window.ethereum.removeListener('chainChanged', handleChainChanged);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n connectPublicClient();\r\n }, [connectPublicClient]);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};","import React, { useState, useEffect } from \"react\";\r\nimport { useNetwork } from \"../contexts/NetworkContext\";\r\nimport { useWallet } from \"../contexts/WalletContext\";\r\nimport { Transaction } from \"../core/Transaction\";\r\nimport { parseEther, encodeFunctionData, parseUnits } from \"viem\"; \r\nimport styles from \"../styles/PricingCard.css\";\r\n\r\nconst STABLECOIN_CONTRACT_ADDRESS = \"0xdc86935A9597aA3A9008d2f26232233043091284\"; \r\n\r\nconst TransactionReview = ({ onTransactionComplete }) => {\r\n const {\r\n networkSelector,\r\n selectedNetwork,\r\n selectedToken,\r\n transactionDetails: contextTransactionDetails,\r\n setTransactionDetails,\r\n } = useNetwork();\r\n\r\n const {\r\n connectWallet,\r\n account,\r\n walletClient,\r\n publicClient,\r\n isConnecting,\r\n } = useWallet();\r\n\r\n const [transaction, setTransaction] = useState(null);\r\n const [tradeDataBuySc, setTradeDataBuySc] = useState(null);\r\n const [txData, setTxData] = useState(null);\r\n const [message, setMessage] = useState(\"\");\r\n const [txHash, setTxHash] = useState(null);\r\n const [error, setError] = useState(null);\r\n const [isErrorDetailsVisible, setIsErrorDetailsVisible] = useState(false);\r\n\r\n useEffect(() => {\r\n const initializeTransaction = async () => {\r\n if (!selectedNetwork || !selectedToken) return;\r\n\r\n try {\r\n const networkConfig = networkSelector.getSelectedNetworkConfig();\r\n const receivingAddress = networkSelector.getReceivingAddress();\r\n const tokenAmount = networkSelector.getTokenAmount(selectedToken.key);\r\n\r\n const newTransaction = new Transaction(\r\n networkConfig.uri,\r\n networkConfig.djedAddress\r\n );\r\n await newTransaction.init();\r\n setTransaction(newTransaction);\r\n\r\n let tradeData = null;\r\n if (selectedToken.key === \"native\") {\r\n try {\r\n tradeData = await newTransaction.handleTradeDataBuySc(String(tokenAmount));\r\n setTradeDataBuySc(tradeData);\r\n } catch (tradeError) {\r\n console.error(\"Error fetching trade data:\", tradeError);\r\n }\r\n }\r\n\r\n setTransactionDetails({\r\n network: selectedNetwork,\r\n token: selectedToken.key,\r\n tokenSymbol: selectedToken.symbol,\r\n amount: tokenAmount || \"0\",\r\n receivingAddress,\r\n djedContractAddress: networkConfig.djedAddress,\r\n isDirectTransfer: selectedToken.isDirectTransfer || false,\r\n isNativeToken: selectedToken.isNative || false,\r\n tradeAmount: tradeData ? tradeData.amount : null,\r\n ...newTransaction.getBlockchainDetails(),\r\n });\r\n } catch (err) {\r\n console.error(\"Error initializing transaction:\", err);\r\n }\r\n };\r\n\r\n initializeTransaction();\r\n }, [selectedNetwork, selectedToken, networkSelector, setTransactionDetails]);\r\n\r\n if (!contextTransactionDetails) {\r\n return
Initializing transaction...
;\r\n }\r\n\r\n const handleConnectWallet = async () => {\r\n const success = await connectWallet();\r\n if (success) {\r\n console.log(\"Wallet connected:\", account);\r\n }\r\n };\r\n\r\n const handleSendTransaction = async () => {\r\n if (!account || !contextTransactionDetails || !transaction) {\r\n setMessage(\"❌ Wallet not connected or transaction details missing\");\r\n return;\r\n }\r\n\r\n try {\r\n setMessage(\"⏳ Preparing transaction...\");\r\n\r\n const receiver = contextTransactionDetails.receivingAddress;\r\n let builtTx;\r\n\r\n if (selectedToken.key === \"native\") {\r\n const UI = \"0x0232556C83791b8291E9b23BfEa7d67405Bd9839\";\r\n const amountToSend = tradeDataBuySc || \"0\";\r\n\r\n builtTx = await transaction.buyStablecoins(\r\n account,\r\n receiver,\r\n parseEther(String(amountToSend)),\r\n UI\r\n );\r\n } else {\r\n const amountToSend = contextTransactionDetails.amount\r\n ? parseUnits(\r\n String(contextTransactionDetails.amount),\r\n contextTransactionDetails.stableCoinDecimals\r\n )\r\n : \"0\";\r\n\r\n builtTx = {\r\n to: STABLECOIN_CONTRACT_ADDRESS,\r\n data: encodeFunctionData({\r\n abi: [\r\n {\r\n inputs: [\r\n { internalType: \"address\", name: \"to\", type: \"address\" },\r\n { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\r\n ],\r\n name: \"transfer\",\r\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\r\n stateMutability: \"nonpayable\",\r\n type: \"function\",\r\n },\r\n ],\r\n functionName: \"transfer\",\r\n args: [receiver, amountToSend],\r\n }),\r\n account: account,\r\n };\r\n }\r\n\r\n setTxData(builtTx);\r\n setMessage(\"✅ Transaction ready! Click 'Send Transaction' to proceed.\");\r\n } catch (error) {\r\n setError(error);\r\n setMessage(`❌ Transaction preparation failed.`);\r\n }\r\n };\r\n\r\n const handleBuySc = async () => {\r\n try {\r\n if (!walletClient || !account || !txData) {\r\n setMessage(\"❌ Wallet client, account, or transaction data is missing\");\r\n return;\r\n }\r\n\r\n setMessage(\"⏳ Sending transaction...\");\r\n\r\n const txHash = await walletClient.sendTransaction({\r\n ...txData,\r\n account: account,\r\n });\r\n\r\n setTxHash(txHash);\r\n setMessage(`✅ Transaction sent!`);\r\n \r\n // Call the callback with transaction details\r\n if (onTransactionComplete) {\r\n onTransactionComplete({\r\n txHash,\r\n network: selectedNetwork,\r\n token: selectedToken?.key,\r\n tokenSymbol: selectedToken?.symbol,\r\n amount: contextTransactionDetails?.amount,\r\n receivingAddress: contextTransactionDetails?.receivingAddress,\r\n });\r\n }\r\n } catch (error) {\r\n setError(error);\r\n setMessage(`❌ Transaction failed.`);\r\n }\r\n };\r\n\r\n const getExplorerUrl = () => {\r\n if (!txHash || !selectedNetwork) return null;\r\n\r\n const explorerBaseUrls = {\r\n \"mordor-testnet\": \"https://blockscout.com/etc/mordor/tx/\",\r\n \"ethereum-classic\": \"https://blockscout.com/etc/mainnet/tx/\",\r\n \"sepolia\": \"https://sepolia.etherscan.io/tx/\",\r\n \"milkomeda-mainnet\": \"https://explorer-mainnet-cardano-evm.c1.milkomeda.com/tx/\",\r\n };\r\n\r\n return explorerBaseUrls[selectedNetwork]\r\n ? `${explorerBaseUrls[selectedNetwork]}${txHash}`\r\n : null;\r\n };\r\n\r\n return (\r\n
\r\n
\r\n Network:\r\n {contextTransactionDetails.network}\r\n
\r\n\r\n
\r\n You Pay:\r\n \r\n {selectedToken.key === \"stablecoin\"\r\n ? `${contextTransactionDetails.amount} ${contextTransactionDetails.tokenSymbol}`\r\n : `${tradeDataBuySc ? tradeDataBuySc : \"Calculating...\"} ${\r\n contextTransactionDetails.tokenSymbol\r\n }`}\r\n \r\n
\r\n\r\n \r\n\r\n {account && !txData && (\r\n \r\n )}\r\n {account && txData && (\r\n \r\n)}\r\n\r\n\r\n {message && (\r\n
\r\n {message}\r\n {error && (\r\n setIsErrorDetailsVisible(!isErrorDetailsVisible)}\r\n className={styles.detailsButton}\r\n >\r\n {isErrorDetailsVisible ? \"Hide Details\" : \"Show Details\"}\r\n \r\n )}\r\n
\r\n )}\r\n\r\n {isErrorDetailsVisible && error && (\r\n
\r\n
{error.message}
\r\n
\r\n )}\r\n\r\n \r\n {txHash && (\r\n
\r\n)}\r\n\r\n
\r\n );\r\n};\r\n\r\nexport default TransactionReview;\r\n","import React, { useState } from \"react\";\r\nimport PayButton from \"./PayButton\";\r\nimport Dialog from \"./Dialog\";\r\nimport NetworkDropdown from \"./NetworkDropdown\";\r\nimport TokenDropdown from \"./TokenDropdown\";\r\nimport TransactionReview from \"./TransactionReview\";\r\nimport { NetworkProvider, useNetwork } from \"../contexts/NetworkContext\";\r\nimport { WalletProvider } from \"../contexts/WalletContext\";\r\nimport styles from \"../styles/PricingCard.css\";\r\n\r\nconst WidgetContent = ({ onClose, buttonSize, onTransactionComplete }) => {\r\n const { resetSelections } = useNetwork(); \r\n\r\n const handleClose = () => {\r\n resetSelections(); // Reset selections when closing the widget\r\n onClose();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst WidgetWithProviders = ({ onClose, buttonSize, networkSelector, onTransactionComplete }) => {\r\n // Keep a global reference of current selection for WalletContext\r\n window.__STABLEPAY_SELECTED_NETWORK__ = networkSelector?.selectedNetwork || null;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const Widget = ({ networkSelector, buttonSize = \"medium\", onTransactionComplete, onSuccess }) => {\r\n const [isDialogOpen, setIsDialogOpen] = useState(false);\r\n\r\n const handleOpenDialog = () => {\r\n setIsDialogOpen(true);\r\n };\r\n\r\n const handleCloseDialog = () => {\r\n setIsDialogOpen(false);\r\n };\r\n\r\n // Support both onTransactionComplete and onSuccess for backwards compatibility\r\n const handleTransactionComplete = onTransactionComplete || onSuccess;\r\n\r\n return (\r\n
\r\n {!isDialogOpen && (\r\n \r\n )}\r\n {isDialogOpen && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default Widget;\r\n","// src/index.js\r\nimport { NetworkSelector } from './core/NetworkSelector';\r\nimport { Transaction } from './core/Transaction';\r\nimport { Config } from './core/MerchantConfig';\r\nimport Widget from './widget/Widget.jsx';\r\nimport PayButton from './widget/PayButton.jsx';\r\nimport Dialog from './widget/Dialog.jsx';\r\nimport NetworkDropdown from './widget/NetworkDropdown.jsx';\r\nimport './styles/main.css';\r\nimport './styles/PricingCard.css';\r\n\r\nconst StablePay = {\r\n NetworkSelector,\r\n Transaction,\r\n Config,\r\n Widget,\r\n PayButton,\r\n Dialog,\r\n NetworkDropdown\r\n};\r\n\r\nexport default StablePay;","import { networksConfig } from \"../utils/config\";\r\n\r\nexport class NetworkSelector {\r\n constructor(merchantConfig) {\r\n this.merchantConfig = merchantConfig;\r\n this.blacklist = merchantConfig.getBlacklist();\r\n this.availableNetworks = this.getAvailableNetworks();\r\n this.selectedNetwork = null;\r\n }\r\n\r\n getAvailableNetworks() {\r\n return Object.entries(networksConfig).reduce(\r\n (acc, [networkKey, networkConfig]) => {\r\n if (!this.blacklist.includes(networkConfig.chainId)) {\r\n acc[networkKey] = networkConfig;\r\n }\r\n return acc;\r\n },\r\n {}\r\n );\r\n }\r\n\r\n selectNetwork(networkKey) {\r\n if (networkKey === null) {\r\n this.selectedNetwork = null;\r\n console.log(\"Network selection reset\");\r\n return true;\r\n }\r\n if (this.availableNetworks[networkKey]) {\r\n this.selectedNetwork = networkKey;\r\n console.log(`Network selected: ${networkKey}`);\r\n return true;\r\n }\r\n console.error(`Invalid network: ${networkKey}`);\r\n return false;\r\n }\r\n\r\n getSelectedNetworkConfig() {\r\n return this.selectedNetwork\r\n ? this.availableNetworks[this.selectedNetwork]\r\n : null;\r\n }\r\n\r\n getReceivingAddress() {\r\n return this.merchantConfig.getReceivingAddress();\r\n }\r\n\r\n getTokenAmount(token) {\r\n return this.merchantConfig.getTokenAmount(this.selectedNetwork, token);\r\n }\r\n}\r\n","import { networksConfig } from \"../utils/config\";\r\n\r\nexport class Config {\r\n constructor(options = {}) {\r\n this.receivingAddress = options.receivingAddress || \"\";\r\n this.blacklist = options.blacklist || [];\r\n this.amounts = options.Amounts || {}; // Note the capital 'A' in Amounts\r\n this.validateConfig();\r\n }\r\n\r\n validateConfig() {\r\n if (!this.receivingAddress) {\r\n throw new Error(\"Receiving address is required\");\r\n }\r\n // Validate stablecoin amounts\r\n for (const [network, tokens] of Object.entries(this.amounts)) {\r\n if (!networksConfig[network]) {\r\n throw new Error(`Invalid network: ${network}`);\r\n }\r\n if (\r\n !tokens.stablecoin ||\r\n typeof tokens.stablecoin !== \"number\" ||\r\n tokens.stablecoin <= 0\r\n ) {\r\n throw new Error(`Invalid stablecoin amount for network ${network}`);\r\n }\r\n }\r\n }\r\n\r\n getBlacklist() {\r\n return this.blacklist;\r\n }\r\n\r\n getReceivingAddress() {\r\n return this.receivingAddress;\r\n }\r\n\r\n // getTokenAmount(network, token) {\r\n // const networkConfig = networksConfig[network];\r\n // if (!networkConfig) return 0;\r\n\r\n // const stablecoinSymbol = networkConfig.tokens.stablecoin.symbol;\r\n\r\n // if (token === 'stablecoin') {\r\n // return this.amounts[network]?.stablecoin || 0;\r\n // }\r\n // // For native tokens, return 0 as it's not specified in the new structure\r\n // return 0;\r\n // }\r\n getTokenAmount(network) {\r\n console.log(\"Getting amount for network:\", network);\r\n console.log(\"Amounts object:\", this.amounts);\r\n\r\n // Directly return the stablecoin amount for the network\r\n const amount = this.amounts[network]?.stablecoin;\r\n console.log(\"Returning amount:\", amount);\r\n\r\n return amount || 0;\r\n }\r\n}\r\n\r\nexport default Config;\r\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","console","log","error","getBlockchainDetails","web3Available","djedContractAvailable","stableCoinAddress","reserveCoinAddress","stableCoinDecimals","reserveCoinDecimals","oracleContractAvailable","handleTradeDataBuySc","amountScaled","tradeDataPriceBuySc","totalBCScaled","buyStablecoins","payer","receiver","value","UI","txData","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","mordor","defineChain","name","nativeCurrency","rpcUrls","default","http","webSocket","blockExplorers","url","testnet","etcMainnet","WalletContext","WalletProvider","walletClient","setWalletClient","publicClient","setPublicClient","account","setAccount","setChainId","balance","setBalance","isConnecting","setIsConnecting","expectedChainId","window","__STABLEPAY_SELECTED_NETWORK__","getExpectedChain","connectWallet","useCallback","ethereum","accounts","request","method","length","chainIdHex","currentChainId","parseInt","params","toString","switchError","code","expectedChain","chainName","blockExplorerUrls","addError","createWalletClient","chain","transport","custom","createPublicClient","getBalance","parseFloat","Math","pow","on","handleAccountsChanged","handleChainChanged","message","connectPublicClient","newChainId","disconnectWallet","removeListener","TransactionReview","onTransactionComplete","contextTransactionDetails","useWallet","setTransaction","tradeDataBuySc","setTradeDataBuySc","setTxData","setMessage","txHash","setTxHash","isErrorDetailsVisible","setIsErrorDetailsVisible","newTransaction","tradeError","initializeTransaction","transactionReview","transactionInfo","transactionLabel","transactionValue","walletButton","builtTx","amountToSend","parseEther","parseUnits","to","data","encodeFunctionData","abi","inputs","internalType","type","outputs","stateMutability","functionName","args","sendTransaction","detailsButton","errorDetails","transactionLink","href","getExplorerUrl","explorerBaseUrls","rel","explorerLink","color","textDecoration","fontWeight","cursor","wordBreak","slice","WidgetContent","buttonSize","handleClose","WidgetWithProviders","NetworkSelector","merchantConfig","blacklist","getBlacklist","getAvailableNetworks","reduce","acc","includes","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/styles.css b/stablepay-sdk/dist/umd/styles.css deleted file mode 100644 index a6df6b0..0000000 --- a/stablepay-sdk/dist/umd/styles.css +++ /dev/null @@ -1 +0,0 @@ -.main_stablePayButton__UA7HC{align-items:center;background:linear-gradient(90deg,#000,#f7941d);border:1px solid #bc5f26;border-radius:3px;box-sizing:border-box;color:#fff;cursor:pointer;display:flex;font-size:24px;font-weight:700;height:104px;justify-content:flex-start;overflow:hidden;padding:0 20px;position:relative;width:372px}.main_stablePayButton__UA7HC:hover{opacity:.9}.main_stablePayButton__UA7HC .main_logo__ITyEy{background-image:url(../assets/stablepay-logo.svg);background-position:50%;background-repeat:no-repeat;background-size:contain;flex-shrink:0;height:25px;margin-right:20px;width:25px}.main_stablePayButton__UA7HC .main_buttonText__N-ewy{flex-grow:1;text-align:center}.PricingCard_dialogOverlay__0XJrE{align-items:center;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);background-color:hsla(0,0%,100%,.1);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1000}.PricingCard_pricingCard__LrWb9{align-items:center;background:#2c2c2c;border:1px solid hsla(0,0%,85%,.1);border-radius:8px;box-sizing:border-box;display:flex;flex-direction:column;padding:24px;position:relative}.PricingCard_pricingCard__LrWb9.PricingCard_small__J4CHj{height:600px;width:360px}.PricingCard_pricingCard__LrWb9.PricingCard_medium__EVmTB{height:680px;width:400px}.PricingCard_pricingCard__LrWb9.PricingCard_large__A6pnX{height:760px;width:440px}.PricingCard_dialogClose__jJ1tM{background:none;border:none;color:#fff;cursor:pointer;font-size:20px;position:absolute;right:16px;top:16px;z-index:5}.PricingCard_pricingCardHeader__wGczA{align-items:center;display:flex;gap:12px;margin-bottom:40px;width:100%}.PricingCard_allianceLogo__URa-U{background-image:url(../assets/stablepay-logo.svg);background-position:50%;background-repeat:no-repeat;background-size:contain;height:55px;width:55px}.PricingCard_stablepayTitle__4t848{align-items:center;color:#f6941c;display:flex;font-family:Inter,sans-serif;font-size:29.2px;font-style:normal;font-weight:600;line-height:35px}.PricingCard_pricingCardBody__0wKQn{display:flex;flex-direction:column;gap:30px;width:100%}.PricingCard_selectField__LBPoZ{align-items:flex-start;display:flex;flex-direction:column;gap:8px;margin-bottom:30px;width:100%}.PricingCard_selectField__LBPoZ label{align-self:flex-start;color:#636a77;margin-bottom:6px;text-align:left}.PricingCard_selectField__LBPoZ label,.PricingCard_selectField__LBPoZ select{font-family:Inter,sans-serif;font-size:16px;font-style:normal;font-weight:500;line-height:19px;width:100%}.PricingCard_selectField__LBPoZ select{appearance:none;background:#fff;background-image:url(../assets/chevron-down-icon.svg);background-position:right 18px center;background-repeat:no-repeat;border:1px solid #d9d9d9;border-radius:6px;box-sizing:border-box;color:#000;height:49px;padding:10px 14px}.PricingCard_selectField__LBPoZ select:disabled{background-color:#f5f5f5;cursor:not-allowed}.PricingCard_transactionReview__Ix-eL{padding:20px 0;width:100%}.PricingCard_transactionInfo__Ck-Rc{align-items:center;display:flex;justify-content:space-between;margin:15px 0;padding:0 5px;width:100%}.PricingCard_transactionLabel__GDux7{color:#636a77;font-weight:500}.PricingCard_transactionLabel__GDux7,.PricingCard_transactionValue__q-xxp{font-family:Inter,sans-serif;font-size:16px;font-style:normal;line-height:19px}.PricingCard_transactionValue__q-xxp{color:#fff;font-weight:600;text-align:right}.PricingCard_infoSection__gyjMQ{align-items:flex-start;display:flex;gap:16px;margin-bottom:40px;margin-top:20px;padding:0 26px}.PricingCard_infoIcon__rraxD{align-items:center;background:#d5d6d9;border-radius:50%;color:#434a58;display:flex;font-size:13px;height:21px;justify-content:center;min-width:22px;width:22px}.PricingCard_infoText__l4b7A{color:#636a77;font-family:Inter,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:17px}.PricingCard_walletButton__llw4v{align-items:center;background:#f6941c;border:1px solid #c66c20;border-radius:0;bottom:31px;color:#fde5cb;cursor:pointer;display:flex;font-family:Inter,sans-serif;font-size:18px;font-style:normal;font-weight:600;height:65px;justify-content:center;left:30px;line-height:22px;position:absolute;width:calc(100% - 60px)}.PricingCard_walletButton__llw4v:disabled{background:#ccc;border-color:#bbb;cursor:not-allowed}.PricingCard_loading__2-tGA{color:#636a77;font-family:Inter,sans-serif;padding:20px;text-align:center}.PricingCard_error__m5fK-{color:#ff4d4f;font-family:Inter,sans-serif;padding:10px;text-align:center}.PricingCard_networkError__zR-36{background:rgba(255,77,79,.1);border:1px solid rgba(255,77,79,.2);border-radius:4px;margin:10px 0;padding:10px}.PricingCard_errorText__qZRJt{color:#ff4d4f;font-family:Inter,sans-serif;font-size:14px;line-height:1.5}.PricingCard_message-box__vkUKy{align-items:center;background-color:hsla(0,0%,100%,.1);border-radius:4px;color:#fff;display:flex;font-family:Inter,sans-serif;font-size:14px;justify-content:space-between;margin-top:20px;padding:10px}.PricingCard_detailsButton__jHglL{background:none;border:none;color:#f6941c;cursor:pointer;font-size:12px;margin-left:10px;text-decoration:underline}.PricingCard_errorDetails__CzN-7{background-color:rgba(0,0,0,.2);border:1px solid rgba(255,77,79,.3);border-radius:4px;color:#ff4d4f;font-family:monospace;font-size:12px;line-height:1.4;margin-top:10px;max-height:150px;max-width:100%;overflow:auto;overflow-wrap:break-word;padding:10px;white-space:pre-wrap;word-break:break-word}.PricingCard_errorDetails__CzN-7::-webkit-scrollbar{height:6px;width:6px}.PricingCard_errorDetails__CzN-7::-webkit-scrollbar-track{background:rgba(0,0,0,.1);border-radius:3px}.PricingCard_errorDetails__CzN-7::-webkit-scrollbar-thumb{background:rgba(255,77,79,.5);border-radius:3px}.PricingCard_errorDetails__CzN-7::-webkit-scrollbar-thumb:hover{background:rgba(255,77,79,.7)}@media (max-width:520px){.PricingCard_pricingCard__LrWb9{height:auto;min-height:600px;padding:20px;width:95vw}.PricingCard_selectField__LBPoZ{margin-bottom:20px}.PricingCard_walletButton__llw4v{left:20px;margin-top:20px;position:relative;width:calc(100% - 40px)}.PricingCard_infoSection__gyjMQ{padding:0 20px}.PricingCard_loadingContainer__6nOVa{align-items:center;display:flex;height:100vh;justify-content:center}.PricingCard_spinner__9ucQv{animation:PricingCard_spin__24tni .8s linear infinite;border:4px solid hsla(0,0%,100%,.3);border-radius:50%;border-top-color:#fff;height:40px;width:40px}@keyframes PricingCard_spin__24tni{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}} \ No newline at end of file diff --git a/stablepay-sdk/stablepay-sdk-1.0.3.tgz b/stablepay-sdk/stablepay-sdk-1.0.3.tgz deleted file mode 100644 index ecff55cd59430c80c875332f11ca53b2fe405b74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54229 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 TsqIWc0A>OJAwhvw