require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../types/ethereum-network.types.cjs`),t=require(`../../types/external-action.types.cjs`),n=require(`../../constants/protocol.constants.cjs`),r=require(`../utils/caseInsensitive.utils.cjs`),i=require(`../../constants/token-data/ERC20Registry.cjs`);require(`../../constants/token-data/index.cjs`);const a=require(`../../constants/addresses.constants.cjs`),o=require(`../../error-handling/logger.cjs`),s=require(`../utils/string.utils.cjs`),c=require(`../utils/getContractAddress.cjs`),l=require(`./emporium.helpers.cjs`),u=require(`../pre-transaction/getExternalSwapAddress.cjs`);let d=require(`ethers`);var f=(e,t,n,r,i,a,o=!1)=>{let s={tokenIn:t,tokenOut:r,fee:BigInt(a),recipient:i,amountIn:n,amountOutMinimum:0,sqrtPriceLimitX96:0};return l.emporiumOp({contract:new d.ethers.Contract(e,[`function exactInputSingle(tuple(address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96)) external payable returns (uint256 amountOut)`]),func:`exactInputSingle`,args:[s],invokeWallet:o})},p=(e,t,n,r,i,a,o=!1)=>l.emporiumOp({contract:n,callDataString:s.replaceAllInstances(r,u.getExternalSwapAddress(e,t).slice(2),i.slice(2)),value:a,invokeWallet:o}),m=(e,t)=>{let n=i.getERC20Registry(t).find(e=>e.symbol===`USDT`);return n?r.caseInsensitiveEqual(e,n.erc20TokenAddress):!1},h=async(e,t,n,r,i,a)=>{if(m(c.getContractAddress(n),e))try{await n.allowance(r,i)>0n&&t.push(l.createApproveEmporiumOp(n,i,0n,a))}catch(e){o.Logger.error(`Error in nullifyUsdtApprovalIfNeeded`,e)}},g=async(t,r,i,o,s,c,u,f)=>{if(i!==n.zeroAddress){let f=a.SWAP_FEE_TAKER_ADDRESSES[r],p=t.getContractWithFetcher(r,e.ContractType.ERC20Contract,i),m=await p.balanceOf(o);await h(r,c,p,o,f,u),c.push(l.createApproveEmporiumOp(p,f,2n**256n-1n,u));let g=new d.ethers.Contract(f,[`function takeSwapFee(address token, uint256 beforeBalance, uint256 variableRate, address relay) external payable`]),_=s;c.push(l.emporiumOp({contract:g,func:`takeSwapFee`,args:[i,m,n.HINKAL_SWAP_VARIABLE_RATE,_],invokeWallet:u}))}else{let e=s;c.push(l.emporiumOp({contract:e,value:f*n.HINKAL_SWAP_VARIABLE_RATE/10000n,invokeWallet:u}))}},_=async(r,i,o,s,c,u,m,_,v,y,b,x,S=!1)=>{let C=m<0n?-1n*m:m,w=[],T=a.NATIVE_TOKEN_WRAPPER_ADDRESSES[i],E=!1,D;if(o===t.ExternalActionId.OneInch||o===t.ExternalActionId.Lifi){if(u!==n.zeroAddress){let t=r.getContractWithFetcher(i,e.ContractType.ERC20Contract,u);w.push(l.createApproveEmporiumOp(t,s,C,S))}let a=0n;return u===n.zeroAddress&&(a+=C),_&&v===n.zeroAddress&&_<0n&&(a+=-1n*_),D=p(i,o,s,c,b,a>0n?a:void 0,S),w.push(D),(o===t.ExternalActionId.OneInch||y&&o===t.ExternalActionId.Lifi)&&v&&_!==void 0&&await g(r,i,v,b,x,w,S,_),w}if(!v||!_)throw Error(`There should be output token for UniSwap and Odos`);if(u===n.zeroAddress){let t=r.getContractWithFetcher(i,e.ContractType.ERC20Contract,T);w.push(l.emporiumOp({contract:t,func:`deposit`,value:C,invokeWallet:S})),u=T}let O=0n;if(v===n.zeroAddress&&(v=T,E=!0,O=await r.getContractWithFetcher(i,e.ContractType.ERC20Contract,T).balanceOf(b)),u!==n.zeroAddress){let t=r.getContractWithFetcher(i,e.ContractType.ERC20Contract,u);await h(i,w,t,b,s,S),w.push(l.createApproveEmporiumOp(t,s,C,S))}if(D=o===t.ExternalActionId.Uniswap?f(s,u,C,v,b,c,S):p(i,o,s,c,b,void 0,S),w.push(D),await g(r,i,v,b,x,w,S,_),E){let t=a.WRAPPER_TOKEN_EXCHANGE_ADDRESSES[i],n=r.getContractWithFetcher(i,e.ContractType.ERC20Contract,T);w.push(l.createApproveEmporiumOp(n,t,2n**256n-1n,S));let o=new d.ethers.Contract(t,[`function withdrawBalanceDifference(uint256 beforeBalance) external`]);w.push(l.emporiumOp({contract:o,func:`withdrawBalanceDifference`,args:[O],invokeWallet:S}))}return w};exports.createSwapToEmporiumOpForUniswap=f,exports.createSwapToEmporiumOps=_;