@cowprotocol/permit-utils 3.11.1 → 3.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/const.d.ts CHANGED
@@ -17,6 +17,6 @@ export declare const PERMIT_ACCOUNT: {
17
17
  type: "local";
18
18
  };
19
19
  export declare const DEFAULT_MIN_GAS_LIMIT = 55000n;
20
- export declare const DEFAULT_PERMIT_GAS_LIMIT = 80000n;
20
+ export declare const DEFAULT_PERMIT_GAS_LIMIT = 160000n;
21
21
  export declare const DEFAULT_PERMIT_VALUE: bigint;
22
22
  export declare const DEFAULT_PERMIT_DURATION: number;
package/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("viem"),V=require("viem/accounts"),T=require("wagmi/actions"),E=require("@cowprotocol/cow-sdk"),B=require("@cowprotocol/hook-dapp-lib"),W="0xa50dc0f7fc051309434deb3b1c71e927dbb711759231d8ecbf630c85d94a42fe",b=V.privateKeyToAccount(W),O=55000n,A=80000n,_=f.maxUint256,z=157788e6;async function J(e,n,t,a,r,i,{version:s,type:o,name:l}){const c=l||r;if(o==="unsupported")return!1;if(!c)throw new Error(`No token name for ${a}`);const d={chainId:n,tokenName:c,tokenAddress:a,callData:i,version:s};let m;if(i.startsWith(v)?m=t.recoverPermitOwnerFromCallData({...d,callData:i.replace(v,"0x")}):i.startsWith(C)&&(m=t.recoverDaiLikePermitOwnerFromCallData({...d,callData:i.replace(C,"0x")})),!!m)try{return(await m).toLowerCase()===e.toLowerCase()}catch(y){console.debug(`[checkHasValidPendingPermit] Failed to check permit validity for owner ${e} with callData ${i}`,y);return}}async function H({eip2612Utils:e,callDataParams:n}){return(await e.buildDaiLikePermitCallData(...n)).replace("0x",C)}async function F({eip2612Utils:e,callDataParams:n}){const[t,a,r,...i]=n;return(await e.buildPermitCallData(t,a,r,...i)).replace("0x",v)}function D(){return Math.ceil((Date.now()+z)/1e3)}function G(e){return!!e&&e.type!=="unsupported"}const M=new WeakMap,Q=[4001,-32e3],Y=["user denied","user rejected","rejected transaction","transaction was rejected"];async function X(e){const n=te(e),t=M.get(e.config)??new Map,a=t.get(n);if(a)return await a;const r=ee(e).catch(i=>{const s=j(i);if(re(s)||s instanceof f.ExecutionRevertedError)throw s;console.debug("[generatePermitHook] cached request failed",s)}).finally(()=>{t.delete(n)});return t.set(n,r),M.set(e.config,t),r}async function Z({data:e,from:n,to:t,config:a,isUserAccount:r}){try{const i=await T.estimateGas(a,{account:n,to:t,data:e}),s=r?i:i+i/10n;return s>A?s:A}catch(i){const s=j(i),o=r?ne(s):void 0;if(o)throw o;return console.debug("[calculatePermitGasLimit] Failed to estimateGas, using default",s),A}}async function ee(e){const{inputToken:n,spender:t,chainId:a,permitInfo:r,config:i,account:s,eip2612Utils:o,nonce:l}=e,c=n.address,d=r.name||n.name;if(!G(r))throw new Error(`Trying to generate permit hook for unsupported token: ${c}`);if(!d)throw new Error(`No token name for token: ${c}`);const m=s||b.address,y=l===void 0?await o.getTokenNonce(c,m):l,g=D(),P=e.amount??_,h=r.type==="eip-2612"?await F({eip2612Utils:o,callDataParams:[{owner:m,spender:t,value:P.toString(),nonce:y,deadline:g},a,d,c,r.version]}):await H({eip2612Utils:o,callDataParams:[{holder:m,spender:t,allowed:!0,value:P.toString(),nonce:y,expiry:g},a,d,c,r.version]}),p=await Z({data:h,from:m,to:c,config:i,isUserAccount:!!s});return{target:c,callData:h,gasLimit:p.toString(),dappId:B.PERMIT_HOOK_DAPP_ID}}function te(e){const{inputToken:n,chainId:t,account:a,amount:r,nonce:i,permitInfo:s,spender:o}=e,l=a??b.address,c=s.name||n.name;return JSON.stringify({tokenAddress:E.getAddressKey(n.address),chainId:t,owner:E.getAddressKey(l),spender:E.getAddressKey(o),amount:(r??_).toString(),nonce:i??null,permitType:s.type,tokenName:c??null,permitVersion:s.version??null})}function ne(e){if(!(e instanceof f.BaseError))return;const n=e.walk(t=>t instanceof f.ExecutionRevertedError);return n instanceof f.ExecutionRevertedError?n:void 0}function re(e){if(e.code!==void 0&&Q.includes(e.code))return!0;const n=e.message.toLowerCase();return Y.some(t=>n.includes(t))}function j(e){if(e instanceof Error)return e;const n=typeof e=="object"&&e!==null&&"message"in e&&typeof e.message=="string"?e.message:String(e),t=new Error(n);return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="number"&&(t.code=e.code),t}class ae{constructor(n,t){this.publicClient=n,this.walletClient=t}contractEncodeABI(n,t,a,r){const i=r.map(s=>s instanceof Uint8Array?f.bytesToHex(s):s);return f.encodeFunctionData({abi:n,functionName:a,args:i})}signTypedData(n,t,a){const r=Object.fromEntries(Object.entries(t.types).filter(([s])=>s!=="EIP712Domain")),i=this.walletClient.account??n;return this.walletClient.signTypedData({account:i,domain:t.domain,types:r,primaryType:t.primaryType,message:t.message})}ethCall(n,t){return this.publicClient.call({to:n,data:t}).then(({data:a})=>a||"0x")}decodeABIParameter(n,t){const[a]=f.decodeAbiParameters([{type:n}],t);return a}decodeABIParameters(n,t){const a=f.decodeAbiParameters(n,t),r={};return n.forEach((i,s)=>{const o=a[s],l=typeof o=="bigint"?f.toHex(o):o;r[s]=l,i.name&&(r[i.name]=l)}),r}}const U=new Map,$=new Map;async function K({chainId:e,publicClient:n,account:t,walletClient:a}){const r=U.get(e);if(!t&&r)return r;const i=`${e}-${t}`,s=$.get(i);if(s)return s;let o;if(!t)o=f.createWalletClient({account:b,chain:n.chain,transport:f.http()});else if(a)o=a;else throw new Error("Permit signing needs an active wallet client. Reconnect your wallet or use an injected extension.");const l=new ae(n,o),c=await Promise.resolve().then(()=>require("./1inchPermitUtils-BDO_CqjL.cjs")).then(m=>m.Eip2612PermitUtils),d=new c(l,{enabledCheckSalt:!0});return t?$.set(i,d):U.set(e,d),d}const oe=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{inputs:[],name:"eip712Domain",outputs:[{internalType:"bytes1",name:"fields",type:"bytes1"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"version",type:"string"},{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"address",name:"verifyingContract",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"uint256[]",name:"extensions",type:"uint256[]"}],stateMutability:"view",type:"function"}];async function ie(e,n,t){const[a,r,i,s,o,l,c]=await T.readContract(t,{abi:oe,address:e,functionName:"eip712Domain"}),d={fields:a,name:r,version:i,chainId:s.toString(),verifyingContract:o,salt:l,extensions:c.map(m=>String(m))};return se(d,n,e)}async function se(e,n,t){const{extensions:a,...r}=e;if(a.length>0)throw Error("Extensions not implemented");if(r.chainId&&n!==parseInt(r.chainId,16))throw Error(`ChainId mismatch. Received: '${r.chainId}', expected: '${n}'`);if(r.verifyingContract&&t.toLowerCase()!==r.verifyingContract.toLowerCase())throw Error(`Address mismatch. Received: '${r.verifyingContract}', expected: '${t}'`);return le(r)}const ce=["name","version","chainId","verifyingContract","salt"];function le(e){const n=parseInt(e.fields,16);return ce.reduce((t,a,r)=>(n&1<<r&&(t[a]=e[a]),t),{})}async function de(e,n,t){return T.readContract(t,{abi:f.erc20Abi,address:e,functionName:"name"})}const ue=[[{constant:!0,inputs:[],name:"version",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"}],[{constant:!0,inputs:[],name:"ERC712_VERSION",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"}]];async function q(e,n,t=0){const a=ue[t];if(!a)return"1";try{const r=await T.readContract(n,{abi:a,address:e,functionName:a[0].name});if(r==="0x"||Number.isNaN(Number(r)))return"1";if(!r.startsWith("0x"))return r;const[i]=f.decodeAbiParameters([{type:"string"}],r);return i}catch{return q(e,n,t+1)}}const me={nonce:0,deadline:D()},pe={allowed:!0,nonce:0,expiry:D()},w={},k={type:"unsupported"};async function fe(e){const{tokenAddress:n,chainId:t,spender:a}=e,r=`${E.getTokenId({address:n,chainId:t})}-${E.getAddressKey(a)}`,i=w[r];if(i)return i;const s=ye(e).then(o=>("error"in o&&delete w[r],o)).catch(o=>{throw delete w[r],o});return w[r]=s,s}async function ye(e){const{amount:n,chainId:t,config:a,minGasLimit:r,publicClient:i,spender:s,tokenAddress:o}=e,l=await K({chainId:t,publicClient:i}),c=b.address;let d;try{d=await ie(o,t,a)}catch{console.debug(`[checkTokenIsPermittable] Couldn't fetch eip712domain for token ${o}`)}const m=!d?.name,y=d?.version===void 0,[g,P,h]=await Promise.allSettled([m?de(o,t,a):Promise.resolve(d?.name),l.getTokenNonce(o,c),y?q(o,a):Promise.resolve(d?.version)]);let p=d?.name;if(g.status==="fulfilled")p=g.value;else if(m){const u=g.reason;if(/ETIMEDOUT/.test(u)&&!p)return{error:"Failed to fetch token name from contract. RPC connection error"};console.debug(`[checkTokenIsPermittable] Couldn't fetch token name from the contract for token ${o}, using provided '${p}'`,u)}if(!p)return{error:`Token name could not be determined for ${o}`};let S;if(P.status==="fulfilled")S=P.value;else{const u=P.reason;return u==="nonce not supported"||u.message==="nonce is NaN"?(console.debug(`[checkTokenIsPermittable] Not a permittable token ${o} - ${p}`,u?.message||u),{...k,name:p}):(console.debug(`[checkTokenIsPermittable] Failed to get nonce for ${o} - ${p}`,u),{error:u.message||u.toString()})}let N=d?.version;h.status==="fulfilled"?N=h.value:y&&console.debug(`[checkTokenIsPermittable] Failed to get version for ${o} - ${p}`,h.reason);const L={chainId:t,eip2612PermitUtils:l,nonce:S,spender:s,tokenAddress:o,tokenName:p,walletAddress:c,version:N,minGasLimit:r,amount:n};try{return await x({...L,type:"eip-2612",config:a})}catch(u){try{return await he(o,l)?await x({...L,type:"dai-like",config:a}):/invalid signature/.test(u)||u?.code==="UNPREDICTABLE_GAS_LIMIT"?(console.debug(`[checkTokenIsPermittable] Token ${o} - ${p} might be permittable, but it's not supported for now. Reason:`,u?.reason),{...k,name:p}):(console.debug(`[checkTokenIsPermittable] Failed to estimate eip-2612 permit for ${o} - ${p}`,u),{error:u.message||u.toString()})}catch(I){return console.debug(`[checkTokenIsPermittable] Failed to estimate dai-like permit for ${o} - ${p}`,I),{error:I.message||I.toString()}}}}async function x(e){const{config:n,walletAddress:t,tokenAddress:a,tokenName:r,type:i,version:s,minGasLimit:o=O}=e,c=await(i==="eip-2612"?Pe:ge)(e);return c?await T.estimateGas(n,{to:a,account:t,data:c})>o?{type:i,version:s,name:r}:{...k,name:r}:{...k,name:r}}async function ge(e){const{eip2612PermitUtils:n,tokenAddress:t,walletAddress:a,spender:r,nonce:i,chainId:s,tokenName:o,version:l}=e;return await n.getPermitTypeHash(t)===R?H({eip2612Utils:n,callDataParams:[{...pe,holder:a,spender:r,nonce:i},s,o,t,l]}):!1}async function Pe(e){const{eip2612PermitUtils:n,walletAddress:t,spender:a,nonce:r,chainId:i,tokenName:s,tokenAddress:o,version:l,amount:c}=e;return F({eip2612Utils:n,callDataParams:[{...me,owner:t,spender:a,nonce:r,value:c?c.toString():_.toString()},+i,s,o,l]})}async function he(e,n){return await n.getPermitTypeHash(e)===R}const Ee=[{constant:!1,inputs:[{internalType:"address",name:"holder",type:"address"},{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"uint256",name:"expiry",type:"uint256"},{internalType:"bool",name:"allowed",type:"bool"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"}],name:"permit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"}],Te=[{type:"function",name:"permit",stateMutability:"nonpayable",inputs:[{name:"owner",type:"address"},{name:"spender",type:"address"},{name:"value",type:"uint256"},{name:"deadline",type:"uint256"},{name:"v",type:"uint8"},{name:"r",type:"bytes32"},{name:"s",type:"bytes32"}],outputs:[]}],v="0xd505accf",C="0x8fcbaf0c",R="0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb",be=Object.freeze(Object.defineProperty({__proto__:null,DAI_EIP_2612_PERMIT_ABI:Ee,DAI_LIKE_PERMIT_TYPEHASH:R,DAI_PERMIT_SELECTOR:C,EIP_2612_PERMIT_ABI:Te,EIP_2612_PERMIT_SELECTOR:v},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MIN_GAS_LIMIT=O;exports.DEFAULT_PERMIT_VALUE=_;exports.PERMIT_ACCOUNT=b;exports.checkIsCallDataAValidPermit=J;exports.generatePermitHook=X;exports.getPermitUtilsInstance=K;exports.getTokenPermitInfo=fe;exports.isSupportedPermitInfo=G;exports.oneInchPermitUtilsConsts=be;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("viem"),V=require("viem/accounts"),T=require("wagmi/actions"),E=require("@cowprotocol/cow-sdk"),B=require("@cowprotocol/hook-dapp-lib"),W="0xa50dc0f7fc051309434deb3b1c71e927dbb711759231d8ecbf630c85d94a42fe",b=V.privateKeyToAccount(W),O=55000n,A=160000n,_=f.maxUint256,z=157788e6;async function J(e,n,t,a,r,i,{version:s,type:o,name:l}){const c=l||r;if(o==="unsupported")return!1;if(!c)throw new Error(`No token name for ${a}`);const d={chainId:n,tokenName:c,tokenAddress:a,callData:i,version:s};let m;if(i.startsWith(v)?m=t.recoverPermitOwnerFromCallData({...d,callData:i.replace(v,"0x")}):i.startsWith(C)&&(m=t.recoverDaiLikePermitOwnerFromCallData({...d,callData:i.replace(C,"0x")})),!!m)try{return(await m).toLowerCase()===e.toLowerCase()}catch(y){console.debug(`[checkHasValidPendingPermit] Failed to check permit validity for owner ${e} with callData ${i}`,y);return}}async function H({eip2612Utils:e,callDataParams:n}){return(await e.buildDaiLikePermitCallData(...n)).replace("0x",C)}async function F({eip2612Utils:e,callDataParams:n}){const[t,a,r,...i]=n;return(await e.buildPermitCallData(t,a,r,...i)).replace("0x",v)}function D(){return Math.ceil((Date.now()+z)/1e3)}function G(e){return!!e&&e.type!=="unsupported"}const M=new WeakMap,Q=[4001,-32e3],Y=["user denied","user rejected","rejected transaction","transaction was rejected"];async function X(e){const n=te(e),t=M.get(e.config)??new Map,a=t.get(n);if(a)return await a;const r=ee(e).catch(i=>{const s=j(i);if(re(s)||s instanceof f.ExecutionRevertedError)throw s;console.debug("[generatePermitHook] cached request failed",s)}).finally(()=>{t.delete(n)});return t.set(n,r),M.set(e.config,t),r}async function Z({data:e,from:n,to:t,config:a,isUserAccount:r}){try{const i=await T.estimateGas(a,{account:n,to:t,data:e}),s=r?i:i+i/10n;return s>A?s:A}catch(i){const s=j(i),o=r?ne(s):void 0;if(o)throw o;return console.debug("[calculatePermitGasLimit] Failed to estimateGas, using default",s),A}}async function ee(e){const{inputToken:n,spender:t,chainId:a,permitInfo:r,config:i,account:s,eip2612Utils:o,nonce:l}=e,c=n.address,d=r.name||n.name;if(!G(r))throw new Error(`Trying to generate permit hook for unsupported token: ${c}`);if(!d)throw new Error(`No token name for token: ${c}`);const m=s||b.address,y=l===void 0?await o.getTokenNonce(c,m):l,g=D(),P=e.amount??_,h=r.type==="eip-2612"?await F({eip2612Utils:o,callDataParams:[{owner:m,spender:t,value:P.toString(),nonce:y,deadline:g},a,d,c,r.version]}):await H({eip2612Utils:o,callDataParams:[{holder:m,spender:t,allowed:!0,value:P.toString(),nonce:y,expiry:g},a,d,c,r.version]}),p=await Z({data:h,from:m,to:c,config:i,isUserAccount:!!s});return{target:c,callData:h,gasLimit:p.toString(),dappId:B.PERMIT_HOOK_DAPP_ID}}function te(e){const{inputToken:n,chainId:t,account:a,amount:r,nonce:i,permitInfo:s,spender:o}=e,l=a??b.address,c=s.name||n.name;return JSON.stringify({tokenAddress:E.getAddressKey(n.address),chainId:t,owner:E.getAddressKey(l),spender:E.getAddressKey(o),amount:(r??_).toString(),nonce:i??null,permitType:s.type,tokenName:c??null,permitVersion:s.version??null})}function ne(e){if(!(e instanceof f.BaseError))return;const n=e.walk(t=>t instanceof f.ExecutionRevertedError);return n instanceof f.ExecutionRevertedError?n:void 0}function re(e){if(e.code!==void 0&&Q.includes(e.code))return!0;const n=e.message.toLowerCase();return Y.some(t=>n.includes(t))}function j(e){if(e instanceof Error)return e;const n=typeof e=="object"&&e!==null&&"message"in e&&typeof e.message=="string"?e.message:String(e),t=new Error(n);return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="number"&&(t.code=e.code),t}class ae{constructor(n,t){this.publicClient=n,this.walletClient=t}contractEncodeABI(n,t,a,r){const i=r.map(s=>s instanceof Uint8Array?f.bytesToHex(s):s);return f.encodeFunctionData({abi:n,functionName:a,args:i})}signTypedData(n,t,a){const r=Object.fromEntries(Object.entries(t.types).filter(([s])=>s!=="EIP712Domain")),i=this.walletClient.account??n;return this.walletClient.signTypedData({account:i,domain:t.domain,types:r,primaryType:t.primaryType,message:t.message})}ethCall(n,t){return this.publicClient.call({to:n,data:t}).then(({data:a})=>a||"0x")}decodeABIParameter(n,t){const[a]=f.decodeAbiParameters([{type:n}],t);return a}decodeABIParameters(n,t){const a=f.decodeAbiParameters(n,t),r={};return n.forEach((i,s)=>{const o=a[s],l=typeof o=="bigint"?f.toHex(o):o;r[s]=l,i.name&&(r[i.name]=l)}),r}}const U=new Map,$=new Map;async function K({chainId:e,publicClient:n,account:t,walletClient:a}){const r=U.get(e);if(!t&&r)return r;const i=`${e}-${t}`,s=$.get(i);if(s)return s;let o;if(!t)o=f.createWalletClient({account:b,chain:n.chain,transport:f.http()});else if(a)o=a;else throw new Error("Permit signing needs an active wallet client. Reconnect your wallet or use an injected extension.");const l=new ae(n,o),c=await Promise.resolve().then(()=>require("./1inchPermitUtils-BDO_CqjL.cjs")).then(m=>m.Eip2612PermitUtils),d=new c(l,{enabledCheckSalt:!0});return t?$.set(i,d):U.set(e,d),d}const oe=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{inputs:[],name:"eip712Domain",outputs:[{internalType:"bytes1",name:"fields",type:"bytes1"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"version",type:"string"},{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"address",name:"verifyingContract",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"uint256[]",name:"extensions",type:"uint256[]"}],stateMutability:"view",type:"function"}];async function ie(e,n,t){const[a,r,i,s,o,l,c]=await T.readContract(t,{abi:oe,address:e,functionName:"eip712Domain"}),d={fields:a,name:r,version:i,chainId:s.toString(),verifyingContract:o,salt:l,extensions:c.map(m=>String(m))};return se(d,n,e)}async function se(e,n,t){const{extensions:a,...r}=e;if(a.length>0)throw Error("Extensions not implemented");if(r.chainId&&n!==parseInt(r.chainId,16))throw Error(`ChainId mismatch. Received: '${r.chainId}', expected: '${n}'`);if(r.verifyingContract&&t.toLowerCase()!==r.verifyingContract.toLowerCase())throw Error(`Address mismatch. Received: '${r.verifyingContract}', expected: '${t}'`);return le(r)}const ce=["name","version","chainId","verifyingContract","salt"];function le(e){const n=parseInt(e.fields,16);return ce.reduce((t,a,r)=>(n&1<<r&&(t[a]=e[a]),t),{})}async function de(e,n,t){return T.readContract(t,{abi:f.erc20Abi,address:e,functionName:"name"})}const ue=[[{constant:!0,inputs:[],name:"version",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"}],[{constant:!0,inputs:[],name:"ERC712_VERSION",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"}]];async function q(e,n,t=0){const a=ue[t];if(!a)return"1";try{const r=await T.readContract(n,{abi:a,address:e,functionName:a[0].name});if(r==="0x"||Number.isNaN(Number(r)))return"1";if(!r.startsWith("0x"))return r;const[i]=f.decodeAbiParameters([{type:"string"}],r);return i}catch{return q(e,n,t+1)}}const me={nonce:0,deadline:D()},pe={allowed:!0,nonce:0,expiry:D()},w={},k={type:"unsupported"};async function fe(e){const{tokenAddress:n,chainId:t,spender:a}=e,r=`${E.getTokenId({address:n,chainId:t})}-${E.getAddressKey(a)}`,i=w[r];if(i)return i;const s=ye(e).then(o=>("error"in o&&delete w[r],o)).catch(o=>{throw delete w[r],o});return w[r]=s,s}async function ye(e){const{amount:n,chainId:t,config:a,minGasLimit:r,publicClient:i,spender:s,tokenAddress:o}=e,l=await K({chainId:t,publicClient:i}),c=b.address;let d;try{d=await ie(o,t,a)}catch{console.debug(`[checkTokenIsPermittable] Couldn't fetch eip712domain for token ${o}`)}const m=!d?.name,y=d?.version===void 0,[g,P,h]=await Promise.allSettled([m?de(o,t,a):Promise.resolve(d?.name),l.getTokenNonce(o,c),y?q(o,a):Promise.resolve(d?.version)]);let p=d?.name;if(g.status==="fulfilled")p=g.value;else if(m){const u=g.reason;if(/ETIMEDOUT/.test(u)&&!p)return{error:"Failed to fetch token name from contract. RPC connection error"};console.debug(`[checkTokenIsPermittable] Couldn't fetch token name from the contract for token ${o}, using provided '${p}'`,u)}if(!p)return{error:`Token name could not be determined for ${o}`};let S;if(P.status==="fulfilled")S=P.value;else{const u=P.reason;return u==="nonce not supported"||u.message==="nonce is NaN"?(console.debug(`[checkTokenIsPermittable] Not a permittable token ${o} - ${p}`,u?.message||u),{...k,name:p}):(console.debug(`[checkTokenIsPermittable] Failed to get nonce for ${o} - ${p}`,u),{error:u.message||u.toString()})}let N=d?.version;h.status==="fulfilled"?N=h.value:y&&console.debug(`[checkTokenIsPermittable] Failed to get version for ${o} - ${p}`,h.reason);const L={chainId:t,eip2612PermitUtils:l,nonce:S,spender:s,tokenAddress:o,tokenName:p,walletAddress:c,version:N,minGasLimit:r,amount:n};try{return await x({...L,type:"eip-2612",config:a})}catch(u){try{return await he(o,l)?await x({...L,type:"dai-like",config:a}):/invalid signature/.test(u)||u?.code==="UNPREDICTABLE_GAS_LIMIT"?(console.debug(`[checkTokenIsPermittable] Token ${o} - ${p} might be permittable, but it's not supported for now. Reason:`,u?.reason),{...k,name:p}):(console.debug(`[checkTokenIsPermittable] Failed to estimate eip-2612 permit for ${o} - ${p}`,u),{error:u.message||u.toString()})}catch(I){return console.debug(`[checkTokenIsPermittable] Failed to estimate dai-like permit for ${o} - ${p}`,I),{error:I.message||I.toString()}}}}async function x(e){const{config:n,walletAddress:t,tokenAddress:a,tokenName:r,type:i,version:s,minGasLimit:o=O}=e,c=await(i==="eip-2612"?Pe:ge)(e);return c?await T.estimateGas(n,{to:a,account:t,data:c})>o?{type:i,version:s,name:r}:{...k,name:r}:{...k,name:r}}async function ge(e){const{eip2612PermitUtils:n,tokenAddress:t,walletAddress:a,spender:r,nonce:i,chainId:s,tokenName:o,version:l}=e;return await n.getPermitTypeHash(t)===R?H({eip2612Utils:n,callDataParams:[{...pe,holder:a,spender:r,nonce:i},s,o,t,l]}):!1}async function Pe(e){const{eip2612PermitUtils:n,walletAddress:t,spender:a,nonce:r,chainId:i,tokenName:s,tokenAddress:o,version:l,amount:c}=e;return F({eip2612Utils:n,callDataParams:[{...me,owner:t,spender:a,nonce:r,value:c?c.toString():_.toString()},+i,s,o,l]})}async function he(e,n){return await n.getPermitTypeHash(e)===R}const Ee=[{constant:!1,inputs:[{internalType:"address",name:"holder",type:"address"},{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"uint256",name:"expiry",type:"uint256"},{internalType:"bool",name:"allowed",type:"bool"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"}],name:"permit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"}],Te=[{type:"function",name:"permit",stateMutability:"nonpayable",inputs:[{name:"owner",type:"address"},{name:"spender",type:"address"},{name:"value",type:"uint256"},{name:"deadline",type:"uint256"},{name:"v",type:"uint8"},{name:"r",type:"bytes32"},{name:"s",type:"bytes32"}],outputs:[]}],v="0xd505accf",C="0x8fcbaf0c",R="0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb",be=Object.freeze(Object.defineProperty({__proto__:null,DAI_EIP_2612_PERMIT_ABI:Ee,DAI_LIKE_PERMIT_TYPEHASH:R,DAI_PERMIT_SELECTOR:C,EIP_2612_PERMIT_ABI:Te,EIP_2612_PERMIT_SELECTOR:v},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MIN_GAS_LIMIT=O;exports.DEFAULT_PERMIT_VALUE=_;exports.PERMIT_ACCOUNT=b;exports.checkIsCallDataAValidPermit=J;exports.generatePermitHook=X;exports.getPermitUtilsInstance=K;exports.getTokenPermitInfo=fe;exports.isSupportedPermitInfo=G;exports.oneInchPermitUtilsConsts=be;
package/index.js CHANGED
@@ -3,7 +3,7 @@ import { privateKeyToAccount as X } from "viem/accounts";
3
3
  import { estimateGas as H, readContract as D } from "wagmi/actions";
4
4
  import { getAddressKey as T, getTokenId as Z } from "@cowprotocol/cow-sdk";
5
5
  import { PERMIT_HOOK_DAPP_ID as ee } from "@cowprotocol/hook-dapp-lib";
6
- const te = "0xa50dc0f7fc051309434deb3b1c71e927dbb711759231d8ecbf630c85d94a42fe", k = X(te), ne = 55000n, v = 80000n, A = K, ae = 157788e6;
6
+ const te = "0xa50dc0f7fc051309434deb3b1c71e927dbb711759231d8ecbf630c85d94a42fe", k = X(te), ne = 55000n, v = 160000n, A = K, ae = 157788e6;
7
7
  async function Me(e, n, t, r, a, i, {
8
8
  version: s,
9
9
  type: o,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cowprotocol/permit-utils",
3
- "version": "3.11.1",
3
+ "version": "3.12.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/cowprotocol/cowswap.git",
@@ -16,7 +16,7 @@
16
16
  "dependencies": {
17
17
  "@cowprotocol/cow-sdk": "9.2.22",
18
18
  "@1inch/permit-signed-approvals-utils": "1.5.2",
19
- "@cowprotocol/hook-dapp-lib": "^2.4.1",
19
+ "@cowprotocol/hook-dapp-lib": "^2.5.0",
20
20
  "ms.macro": "2.0.0",
21
21
  "viem": "2.48.8",
22
22
  "wagmi": "3.6.9"