require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../types/ethereum-network.types.cjs`),t=require(`../../../constants/chains.constants.cjs`),n=require(`../../../constants/protocol.constants.cjs`),r=require(`../../../types/token.types.cjs`),i=require(`../../utils/getContractAddress.cjs`),a=require(`../../utils/getSignerFromContract.cjs`),o=require(`./recoverTransactionFromError.cjs`);let s=require(`ethers`);var c=async(e,t,n)=>{let r=a.getSignerFromContract(n);return await n.allowance(await r.getAddress(),t.target)>=e},l=async(e,n,r,o,s)=>{if(t.getNonLocalhostChainId(n)!==t.chainIds.ethMainnet||o.symbol.toLowerCase()!==`usdt`||BigInt(await s.allowance(await a.getSignerFromContract(s).getAddress(),r.target))===0n)return;let c=await s.approve(i.getContractAddress(r),0n);c&&`hash`in c&&await e.waitForTransaction(n,c.hash)},u=async(u,d,f,p,m)=>{let h=u.getContractWithSigner(d,e.ContractType.ERC20Contract,m.erc20TokenAddress),g=m.approvalType??r.ApprovalType.Classic;if(g===r.ApprovalType.Classic||!u.isPermitterAvailable(d)){if(await c(p,f,h))return;await l(u,d,f,m,h);let e=d===t.chainIds.base?2:1;try{let t=await h.approve(i.getContractAddress(f),p);t&&`hash`in t&&await u.waitForTransaction(d,t.hash,e)}catch(t){if(!t?.transactionHash||!await o.recoverTransactionFromError(a.getProviderFromContract(h),t.transactionHash,e))throw t}return}let _=await u.getEthereumAddressByChain(d),v=u.getContract(d,e.ContractType.PermitterContract),y=await u.getContractWithFetcher(d,e.ContractType.ContractWithNonces,m.erc20TokenAddress).nonces(_),b=BigInt(Date.now()+n.permitSignatureValidFor)/1000n,x={owner:_,holder:_,spender:i.getContractAddress(v),value:p,nonce:y,deadline:b,expiry:b,allowed:!0},{v:S,r:C,s:w}=s.ethers.Signature.from(await u.signTypedData({name:await h.name(),chainId:d,version:`1`,verifyingContract:m.erc20TokenAddress},{Permit:g===r.ApprovalType.ERC20Permit?[{name:`owner`,type:`address`},{name:`spender`,type:`address`},{name:`value`,type:`uint256`},{name:`nonce`,type:`uint256`},{name:`deadline`,type:`uint256`}]:[{name:`holder`,type:`address`},{name:`spender`,type:`address`},{name:`nonce`,type:`uint256`},{name:`expiry`,type:`uint256`},{name:`allowed`,type:`bool`}]},x));if(g===r.ApprovalType.ERC20Permit){let e=new s.ethers.Interface([`function permit(address owner,address spender,uint256 value,uint256 deadline,uint8 v,bytes32 r,bytes32 s) external`]);return s.ethers.getBytesCopy(e.encodeFunctionData(`permit`,[x.owner,x.spender,x.value,x.deadline,S,s.ethers.getBytesCopy(C),s.ethers.getBytesCopy(w)])).slice(4)}let T=new s.ethers.Interface([`function permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed,uint8 v,bytes32 r,bytes32 s) external`]);return s.ethers.getBytesCopy(T.encodeFunctionData(`permit`,[x.holder,x.spender,x.nonce,x.expiry,x.allowed,S,s.ethers.getBytesCopy(C),s.ethers.getBytesCopy(w)])).slice(4)};exports.approveTokenToHinkal=u;