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 d3366ca..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 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}; 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 b08e3d6..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},"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}})); -//# 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 bd4022a..0000000 --- a/stablepay-sdk/dist/umd/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sources":["../../src/utils/config.js","../../src/core/Transaction.js","../../src/widget/PayButton.jsx","../../src/widget/Dialog.jsx","../../src/core/TokenSelector.js","../../src/contexts/NetworkContext.jsx","../../src/widget/NetworkDropdown.jsx","../../src/widget/TokenDropdown.jsx","../../src/contexts/chains.js","../../src/contexts/WalletContext.jsx","../../src/widget/TransactionReview.jsx","../../src/widget/Widget.jsx","../../src/index.js","../../src/core/NetworkSelector.js","../../src/core/MerchantConfig.js"],"sourcesContent":["// src/utils/config.js\nexport const networksConfig = {\n 'sepolia': {\n uri: 'https://ethereum-sepolia.publicnode.com/',\n chainId: 11155111,\n djedAddress: '0x624FcD0a1F9B5820c950FefD48087531d38387f4',\n tokens: {\n stablecoin: {\n symbol: 'SOD',\n address: '0x6b930182787F346F18666D167e8d32166dC5eFBD',\n decimals: 18,\n isDirectTransfer: true\n },\n native: {\n symbol: 'ETH',\n decimals: 18,\n isNative: true\n }\n },\n feeUI: 0\n },\n 'milkomeda-mainnet': {\n uri: 'https://rpc-mainnet-cardano-evm.c1.milkomeda.com',\n chainId: 2001,\n djedAddress: '0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76',\n tokens: {\n stablecoin: {\n symbol: 'MOD',\n address: '0xcbA90fB1003b9D1bc6a2b66257D2585011b004e9',\n decimals: 18,\n isDirectTransfer: true\n },\n native: {\n symbol: 'mADA',\n decimals: 18,\n isNative: true\n }\n },\n feeUI: 0\n },\n 'ethereum-classic': { //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 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/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 (