@cowprotocol/permit-utils 0.2.0 → 0.3.0-RC.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
@@ -1,4 +1,5 @@
1
1
  import { Wallet } from '@ethersproject/wallet';
2
+
2
3
  export declare const PERMIT_SIGNER: Wallet;
3
4
  export declare const DEFAULT_MIN_GAS_LIMIT = 55000;
4
5
  export declare const DEFAULT_PERMIT_GAS_LIMIT = "80000";
package/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const F=require("@ethersproject/constants"),O=require("@ethersproject/wallet"),p=require("@1inch/permit-signed-approvals-utils"),E=require("@ethersproject/abi"),x=require("@ethersproject/bignumber"),G=require("@ethersproject/contracts"),A=require("@ethersproject/address"),q="0x1b80501ea68b883241ac5b9f92e8635aa3df23c89b7bbb87e762be65b8c6eb75",P=new O.Wallet(q),v=55e3,T="80000",S=F.MaxUint256.toString(),V=157788e6;async function B(r,n,e,a,t,i,{version:o,type:l,name:u}){const c=u||t;if(l==="unsupported")return!1;if(!c)throw new Error(`No token name for ${a}`);const m={chainId:n,tokenName:c,tokenAddress:a,callData:i,version:o};let d;if(i.startsWith(p.EIP_2612_PERMIT_SELECTOR)?d=e.recoverPermitOwnerFromCallData({...m,callData:i.replace(p.EIP_2612_PERMIT_SELECTOR,"0x")}):i.startsWith(p.DAI_PERMIT_SELECTOR)&&(d=e.recoverDaiLikePermitOwnerFromCallData({...m,callData:i.replace(p.DAI_PERMIT_SELECTOR,"0x")})),!!d)try{return(await d).toLowerCase()===r.toLowerCase()}catch(f){return console.debug(`[checkHasValidPendingPermit] Failed to check permit validity for owner ${r} with callData ${i}`,f),!1}}async function L({eip2162Utils:r,callDataParams:n}){const[e,a,t,...i]=n;return(await r.buildPermitCallData(e,a,t,...i)).replace("0x",p.EIP_2612_PERMIT_SELECTOR)}async function R({eip2162Utils:r,callDataParams:n}){return(await r.buildDaiLikePermitCallData(...n)).replace("0x",p.DAI_PERMIT_SELECTOR)}function b(){return Math.ceil((Date.now()+V)/1e3)}function $(r){return!!r&&r.type!=="unsupported"}const y={};async function K(r){const n=Q(r),e=y[n];if(e)try{return await e}catch(t){console.debug("[generatePermitHookWith] cached request failed",t),delete y[n]}const a=W(r).then(t=>(delete y[n],t));return y[n]=a,a}async function W(r){const{inputToken:n,spender:e,chainId:a,permitInfo:t,provider:i,account:o,eip2162Utils:l,nonce:u}=r,c=n.address,m=t.name||n.name;if(!$(t))throw new Error(`Trying to generate permit hook for unsupported token: ${c}`);if(!m)throw new Error(`No token name for token: ${c}`);const d=o||P.address,f=u===void 0?await l.getTokenNonce(c,d):u,s=b(),g=S,w=t.type==="eip-2612"?await L({eip2162Utils:l,callDataParams:[{owner:d,spender:e,value:g,nonce:f,deadline:s},a,m,c,t.version]}):await R({eip2162Utils:l,callDataParams:[{holder:d,spender:e,allowed:!0,value:g,nonce:f,expiry:s},a,m,c,t.version]}),H=await j(w,d,c,i,!!o);return{target:c,callData:w,gasLimit:H}}async function j(r,n,e,a,t){try{const i=await a.estimateGas({data:r,from:n,to:e}),o=t?i:i.add(i.div(10));return o.gt(T)?o.toString():T}catch(i){return console.debug("[calculatePermitGasLimit] Failed to estimateGas, using default",i),T}}function Q(r){const{inputToken:n,chainId:e,account:a}=r;return`${n.address.toLowerCase()}-${e}${a?`-${a.toLowerCase()}`:""}`}function h(r,n,e){return new G.Contract(r,n,e)}class Y{constructor(n,e){this.provider=n,this.walletSigner=e}contractEncodeABI(n,e,a,t){return h(e||"",n,this.provider).interface.encodeFunctionData(a,t)}signTypedData(n,e,a){const t=Object.keys(e.types).reduce((o,l)=>(l!=="EIP712Domain"&&(o[l]=e.types[l]),o),{});return(this.walletSigner||this.provider.getSigner())._signTypedData(e.domain,t,e.message)}ethCall(n,e){return this.provider.call({to:n,data:e})}decodeABIParameter(n,e){return E.defaultAbiCoder.decode([n],e)[0]}decodeABIParameters(n,e){const a=E.defaultAbiCoder.decode(n,e);if(a&&typeof a=="object"){const t={};return Object.keys(a).forEach(i=>{const o=a[i];x.BigNumber.isBigNumber(o)?t[i]=o.toHexString():t[i]=o}),t}return a}}const k=new Map,C=new Map;function M(r,n,e){const a=k.get(r);if(!e&&a)return a;const t=`${r}-${e}`,i=C.get(t);if(i)return i;const o=new Y(n,e?void 0:P),l=new p.Eip2612PermitUtils(o);return e?(console.log(`[getPermitUtilsInstance] Set cached provider utils for chain ${r}-${e}`,l),C.set(t,l)):(console.log(`[getPermitUtilsInstance] Set cached chain utils for chain ${r}`,l),k.set(r,l)),l}const N=[{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 z(r,n,e){const a=A.getAddress(r),i=await h(a,N,e).callStatic.eip712Domain();return J(i,n,r)}async function J(r,n,e){const{extensions:a,...t}=r;if(a.length>0)throw Error("Extensions not implemented");if(t.chainId&&n!==parseInt(t.chainId,16))throw Error(`ChainId mismatch. Received: '${t.chainId}', expected: '${n}'`);if(t.verifyingContract&&e.toLowerCase()!==t.verifyingContract.toLowerCase())throw Error(`Address mismatch. Received: '${t.verifyingContract}', expected: '${e}'`);return Z(t)}const X=["name","version","chainId","verifyingContract","salt"];function Z(r){const n=parseInt(r.fields,16);return X.reduce((e,a,t)=>(n&1<<t&&(e[a]=r[a]),e),{})}async function ee(r,n,e){const a=A.getAddress(r);return h(a,N,e).callStatic.name()}const te=[[{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 U(r,n,e=0){const a=te[e];if(!a)return"1";try{const i=h(r,a,n).interface.encodeFunctionData(a[0].name),o=await n.call({to:r,data:i});return o==="0x"||Number.isNaN(Number(o))?"1":o.startsWith("0x")?E.defaultAbiCoder.decode(["string"],o).toString():o}catch{return U(r,n,e+1)}}const ne={value:S,nonce:0,deadline:b()},re={allowed:!0,nonce:0,expiry:b()},_={},I={type:"unsupported"};async function ae(r){const{tokenAddress:n,chainId:e}=r,a=`${e}-${n.toLowerCase()}`,t=_[a];if(t)return t;const i=ie(r);return _[a]=i,i}async function ie(r){const{spender:n,tokenAddress:e,chainId:a,provider:t,minGasLimit:i}=r,o=M(a,t),l=P.address;let u;try{u=await z(e,a,t)}catch{console.debug(`[checkTokenIsPermittable] Couldn't fetch eip712domain for token ${e}`)}let c=u==null?void 0:u.name;try{c||(c=await ee(e,a,t))}catch(s){if(/ETIMEDOUT/.test(s)&&!c)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 ${e}, using provided '${c}'`,s)}if(!c)return{error:`Token name could not be determined for ${e}`};let m;try{m=await o.getTokenNonce(e,l)}catch(s){return s==="nonce not supported"||s.message==="nonce is NaN"?(console.debug(`[checkTokenIsPermittable] Not a permittable token ${e} - ${c}`,(s==null?void 0:s.message)||s),{...I,name:c}):(console.debug(`[checkTokenIsPermittable] Failed to get nonce for ${e} - ${c}`,s),{error:s.message||s.toString()})}let d=u==null?void 0:u.version;if(d===void 0)try{d=await U(e,t)}catch(s){console.debug(`[checkTokenIsPermittable] Failed to get version for ${e} - ${c}`,s)}const f={chainId:a,eip2612PermitUtils:o,nonce:m,spender:n,tokenAddress:e,tokenName:c,walletAddress:l,version:d,minGasLimit:i};try{return await D({...f,type:"eip-2612",provider:t})}catch(s){try{return await se(e,o)?await D({...f,type:"dai-like",provider:t}):/invalid signature/.test(s)||(s==null?void 0:s.code)==="UNPREDICTABLE_GAS_LIMIT"?(console.debug(`[checkTokenIsPermittable] Token ${e} - ${c} might be permittable, but it's not supported for now. Reason:`,s==null?void 0:s.reason),{...I,name:c}):(console.debug(`[checkTokenIsPermittable] Failed to estimate eip-2612 permit for ${e} - ${c}`,s),{error:s.message||s.toString()})}catch(g){return console.debug(`[checkTokenIsPermittable] Failed to estimate dai-like permit for ${e} - ${c}`,g),{error:g.message||g.toString()}}}}async function D(r){const{provider:n,walletAddress:e,tokenAddress:a,tokenName:t,type:i,version:o,minGasLimit:l=v}=r,c=await(i==="eip-2612"?oe:ce)(r);return c?(await n.estimateGas({data:c,from:e,to:a})).toNumber()>l?{type:i,version:o,name:t}:{...I,name:t}:{...I,name:t}}async function oe(r){const{eip2612PermitUtils:n,walletAddress:e,spender:a,nonce:t,chainId:i,tokenName:o,tokenAddress:l,version:u}=r;return L({eip2162Utils:n,callDataParams:[{...ne,owner:e,spender:a,nonce:t},+i,o,l,u]})}async function se(r,n){return await n.getPermitTypeHash(r)===p.DAI_LIKE_PERMIT_TYPEHASH}async function ce(r){const{eip2612PermitUtils:n,tokenAddress:e,walletAddress:a,spender:t,nonce:i,chainId:o,tokenName:l,version:u}=r;return await n.getPermitTypeHash(e)===p.DAI_LIKE_PERMIT_TYPEHASH?R({eip2162Utils:n,callDataParams:[{...re,holder:a,spender:t,nonce:i},o,l,e,u]}):!1}exports.DEFAULT_MIN_GAS_LIMIT=v;exports.PERMIT_SIGNER=P;exports.checkIsCallDataAValidPermit=B;exports.generatePermitHook=K;exports.getPermitUtilsInstance=M;exports.getTokenPermitInfo=ae;exports.isSupportedPermitInfo=$;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const F=require("@ethersproject/constants"),O=require("@ethersproject/wallet"),p=require("@1inch/permit-signed-approvals-utils"),E=require("@ethersproject/abi"),x=require("@ethersproject/bignumber"),G=require("@ethersproject/contracts"),v=require("@ethersproject/address"),q="0x1b80501ea68b883241ac5b9f92e8635aa3df23c89b7bbb87e762be65b8c6eb75",I=new O.Wallet(q),A=55e3,h="80000",S=F.MaxUint256.toString(),V=157788e6;async function B(r,t,e,a,n,i,{version:o,type:l,name:u}){const c=u||n;if(l==="unsupported")return!1;if(!c)throw new Error(`No token name for ${a}`);const m={chainId:t,tokenName:c,tokenAddress:a,callData:i,version:o};let d;if(i.startsWith(p.EIP_2612_PERMIT_SELECTOR)?d=e.recoverPermitOwnerFromCallData({...m,callData:i.replace(p.EIP_2612_PERMIT_SELECTOR,"0x")}):i.startsWith(p.DAI_PERMIT_SELECTOR)&&(d=e.recoverDaiLikePermitOwnerFromCallData({...m,callData:i.replace(p.DAI_PERMIT_SELECTOR,"0x")})),!!d)try{return(await d).toLowerCase()===r.toLowerCase()}catch(f){return console.debug(`[checkHasValidPendingPermit] Failed to check permit validity for owner ${r} with callData ${i}`,f),!1}}async function L({eip2162Utils:r,callDataParams:t}){const[e,a,n,...i]=t;return(await r.buildPermitCallData(e,a,n,...i)).replace("0x",p.EIP_2612_PERMIT_SELECTOR)}async function R({eip2162Utils:r,callDataParams:t}){return(await r.buildDaiLikePermitCallData(...t)).replace("0x",p.DAI_PERMIT_SELECTOR)}function b(){return Math.ceil((Date.now()+V)/1e3)}function $(r){return!!r&&r.type!=="unsupported"}const T={};async function K(r){const t=Q(r),e=T[t];if(e)return await e;const a=j(r).catch(n=>{console.debug("[generatePermitHook] cached request failed",n)}).finally(()=>{delete T[t]});return T[t]=a,a}async function j(r){const{inputToken:t,spender:e,chainId:a,permitInfo:n,provider:i,account:o,eip2162Utils:l,nonce:u}=r,c=t.address,m=n.name||t.name;if(!$(n))throw new Error(`Trying to generate permit hook for unsupported token: ${c}`);if(!m)throw new Error(`No token name for token: ${c}`);const d=o||I.address,f=u===void 0?await l.getTokenNonce(c,d):u,s=b(),g=S,w=n.type==="eip-2612"?await L({eip2162Utils:l,callDataParams:[{owner:d,spender:e,value:g,nonce:f,deadline:s},a,m,c,n.version]}):await R({eip2162Utils:l,callDataParams:[{holder:d,spender:e,allowed:!0,value:g,nonce:f,expiry:s},a,m,c,n.version]}),H=await W(w,d,c,i,!!o);return{target:c,callData:w,gasLimit:H}}async function W(r,t,e,a,n){try{const i=await a.estimateGas({data:r,from:t,to:e}),o=n?i:i.add(i.div(10));return o.gt(h)?o.toString():h}catch(i){return console.debug("[calculatePermitGasLimit] Failed to estimateGas, using default",i),h}}function Q(r){const{inputToken:t,chainId:e,account:a}=r;return`${t.address.toLowerCase()}-${e}${a?`-${a.toLowerCase()}`:""}`}function P(r,t,e){return new G.Contract(r,t,e)}class Y{constructor(t,e){this.provider=t,this.walletSigner=e}contractEncodeABI(t,e,a,n){return P(e||"",t,this.provider).interface.encodeFunctionData(a,n)}signTypedData(t,e,a){const n=Object.keys(e.types).reduce((o,l)=>(l!=="EIP712Domain"&&(o[l]=e.types[l]),o),{});return(this.walletSigner||this.provider.getSigner())._signTypedData(e.domain,n,e.message)}ethCall(t,e){return this.provider.call({to:t,data:e})}decodeABIParameter(t,e){return E.defaultAbiCoder.decode([t],e)[0]}decodeABIParameters(t,e){const a=E.defaultAbiCoder.decode(t,e);if(a&&typeof a=="object"){const n={};return Object.keys(a).forEach(i=>{const o=a[i];x.BigNumber.isBigNumber(o)?n[i]=o.toHexString():n[i]=o}),n}return a}}const k=new Map,C=new Map;function M(r,t,e){const a=k.get(r);if(!e&&a)return a;const n=`${r}-${e}`,i=C.get(n);if(i)return i;const o=new Y(t,e?void 0:I),l=new p.Eip2612PermitUtils(o);return e?(console.log(`[getPermitUtilsInstance] Set cached provider utils for chain ${r}-${e}`,l),C.set(n,l)):(console.log(`[getPermitUtilsInstance] Set cached chain utils for chain ${r}`,l),k.set(r,l)),l}const N=[{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 z(r,t,e){const a=v.getAddress(r),i=await P(a,N,e).callStatic.eip712Domain();return J(i,t,r)}async function J(r,t,e){const{extensions:a,...n}=r;if(a.length>0)throw Error("Extensions not implemented");if(n.chainId&&t!==parseInt(n.chainId,16))throw Error(`ChainId mismatch. Received: '${n.chainId}', expected: '${t}'`);if(n.verifyingContract&&e.toLowerCase()!==n.verifyingContract.toLowerCase())throw Error(`Address mismatch. Received: '${n.verifyingContract}', expected: '${e}'`);return Z(n)}const X=["name","version","chainId","verifyingContract","salt"];function Z(r){const t=parseInt(r.fields,16);return X.reduce((e,a,n)=>(t&1<<n&&(e[a]=r[a]),e),{})}async function ee(r,t,e){const a=v.getAddress(r);return P(a,N,e).callStatic.name()}const te=[[{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 U(r,t,e=0){const a=te[e];if(!a)return"1";try{const i=P(r,a,t).interface.encodeFunctionData(a[0].name),o=await t.call({to:r,data:i});return o==="0x"||Number.isNaN(Number(o))?"1":o.startsWith("0x")?E.defaultAbiCoder.decode(["string"],o).toString():o}catch{return U(r,t,e+1)}}const ne={value:S,nonce:0,deadline:b()},re={allowed:!0,nonce:0,expiry:b()},_={},y={type:"unsupported"};async function ae(r){const{tokenAddress:t,chainId:e}=r,a=`${e}-${t.toLowerCase()}`,n=_[a];if(n)return n;const i=ie(r);return _[a]=i,i}async function ie(r){const{spender:t,tokenAddress:e,chainId:a,provider:n,minGasLimit:i}=r,o=M(a,n),l=I.address;let u;try{u=await z(e,a,n)}catch{console.debug(`[checkTokenIsPermittable] Couldn't fetch eip712domain for token ${e}`)}let c=u==null?void 0:u.name;try{c||(c=await ee(e,a,n))}catch(s){if(/ETIMEDOUT/.test(s)&&!c)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 ${e}, using provided '${c}'`,s)}if(!c)return{error:`Token name could not be determined for ${e}`};let m;try{m=await o.getTokenNonce(e,l)}catch(s){return s==="nonce not supported"||s.message==="nonce is NaN"?(console.debug(`[checkTokenIsPermittable] Not a permittable token ${e} - ${c}`,(s==null?void 0:s.message)||s),{...y,name:c}):(console.debug(`[checkTokenIsPermittable] Failed to get nonce for ${e} - ${c}`,s),{error:s.message||s.toString()})}let d=u==null?void 0:u.version;if(d===void 0)try{d=await U(e,n)}catch(s){console.debug(`[checkTokenIsPermittable] Failed to get version for ${e} - ${c}`,s)}const f={chainId:a,eip2612PermitUtils:o,nonce:m,spender:t,tokenAddress:e,tokenName:c,walletAddress:l,version:d,minGasLimit:i};try{return await D({...f,type:"eip-2612",provider:n})}catch(s){try{return await se(e,o)?await D({...f,type:"dai-like",provider:n}):/invalid signature/.test(s)||(s==null?void 0:s.code)==="UNPREDICTABLE_GAS_LIMIT"?(console.debug(`[checkTokenIsPermittable] Token ${e} - ${c} might be permittable, but it's not supported for now. Reason:`,s==null?void 0:s.reason),{...y,name:c}):(console.debug(`[checkTokenIsPermittable] Failed to estimate eip-2612 permit for ${e} - ${c}`,s),{error:s.message||s.toString()})}catch(g){return console.debug(`[checkTokenIsPermittable] Failed to estimate dai-like permit for ${e} - ${c}`,g),{error:g.message||g.toString()}}}}async function D(r){const{provider:t,walletAddress:e,tokenAddress:a,tokenName:n,type:i,version:o,minGasLimit:l=A}=r,c=await(i==="eip-2612"?oe:ce)(r);return c?(await t.estimateGas({data:c,from:e,to:a})).toNumber()>l?{type:i,version:o,name:n}:{...y,name:n}:{...y,name:n}}async function oe(r){const{eip2612PermitUtils:t,walletAddress:e,spender:a,nonce:n,chainId:i,tokenName:o,tokenAddress:l,version:u}=r;return L({eip2162Utils:t,callDataParams:[{...ne,owner:e,spender:a,nonce:n},+i,o,l,u]})}async function se(r,t){return await t.getPermitTypeHash(r)===p.DAI_LIKE_PERMIT_TYPEHASH}async function ce(r){const{eip2612PermitUtils:t,tokenAddress:e,walletAddress:a,spender:n,nonce:i,chainId:o,tokenName:l,version:u}=r;return await t.getPermitTypeHash(e)===p.DAI_LIKE_PERMIT_TYPEHASH?R({eip2162Utils:t,callDataParams:[{...re,holder:a,spender:n,nonce:i},o,l,e,u]}):!1}exports.DEFAULT_MIN_GAS_LIMIT=A;exports.PERMIT_SIGNER=I;exports.checkIsCallDataAValidPermit=B;exports.generatePermitHook=K;exports.getPermitUtilsInstance=M;exports.getTokenPermitInfo=ae;exports.isSupportedPermitInfo=$;
package/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- export { PERMIT_SIGNER, DEFAULT_MIN_GAS_LIMIT } from './const';
1
+ export { DEFAULT_MIN_GAS_LIMIT, PERMIT_SIGNER } from './const';
2
2
  export { checkIsCallDataAValidPermit } from './lib/checkIsCallDataAValidPermit';
3
3
  export { generatePermitHook } from './lib/generatePermitHook';
4
4
  export { getPermitUtilsInstance } from './lib/getPermitUtilsInstance';
5
5
  export { getTokenPermitInfo } from './lib/getTokenPermitInfo';
6
6
  export { isSupportedPermitInfo } from './utils/isSupportedPermitInfo';
7
- export type { PermitHookData, PermitHookParams, PermitInfo, PermitType, GetTokenPermitIntoResult } from './types';
7
+ export type { GetTokenPermitIntoResult, PermitHookData, PermitHookParams, PermitInfo, PermitType } from './types';
package/index.js CHANGED
@@ -5,19 +5,19 @@ import { defaultAbiCoder as T } from "@ethersproject/abi";
5
5
  import { BigNumber as O } from "@ethersproject/bignumber";
6
6
  import { Contract as G } from "@ethersproject/contracts";
7
7
  import { getAddress as L } from "@ethersproject/address";
8
- const B = "0x1b80501ea68b883241ac5b9f92e8635aa3df23c89b7bbb87e762be65b8c6eb75", b = new F(B), V = 55e3, P = "80000", $ = H.toString(), K = 157788e6;
9
- async function ye(r, n, e, a, t, o, {
8
+ const B = "0x1b80501ea68b883241ac5b9f92e8635aa3df23c89b7bbb87e762be65b8c6eb75", b = new F(B), V = 55e3, h = "80000", $ = H.toString(), K = 157788e6;
9
+ async function ye(r, t, e, a, n, o, {
10
10
  version: i,
11
11
  type: l,
12
12
  name: u
13
13
  }) {
14
- const c = u || t;
14
+ const c = u || n;
15
15
  if (l === "unsupported")
16
16
  return !1;
17
17
  if (!c)
18
18
  throw new Error(`No token name for ${a}`);
19
19
  const m = {
20
- chainId: n,
20
+ chainId: t,
21
21
  tokenName: c,
22
22
  tokenAddress: a,
23
23
  callData: o,
@@ -43,51 +43,51 @@ async function ye(r, n, e, a, t, o, {
43
43
  }
44
44
  async function S({
45
45
  eip2162Utils: r,
46
- callDataParams: n
46
+ callDataParams: t
47
47
  }) {
48
- const [e, a, t, ...o] = n;
49
- return (await r.buildPermitCallData(e, a, t, ...o)).replace("0x", w);
48
+ const [e, a, n, ...o] = t;
49
+ return (await r.buildPermitCallData(e, a, n, ...o)).replace("0x", w);
50
50
  }
51
51
  async function N({
52
52
  eip2162Utils: r,
53
- callDataParams: n
53
+ callDataParams: t
54
54
  }) {
55
- return (await r.buildDaiLikePermitCallData(...n)).replace("0x", I);
55
+ return (await r.buildDaiLikePermitCallData(...t)).replace("0x", I);
56
56
  }
57
57
  function k() {
58
58
  return Math.ceil((Date.now() + K) / 1e3);
59
59
  }
60
- function W(r) {
60
+ function q(r) {
61
61
  return !!r && r.type !== "unsupported";
62
62
  }
63
- const g = {};
63
+ const P = {};
64
64
  async function he(r) {
65
- const n = Q(r), e = g[n];
65
+ const t = Q(r), e = P[t];
66
66
  if (e)
67
- try {
68
- return await e;
69
- } catch (t) {
70
- console.debug("[generatePermitHookWith] cached request failed", t), delete g[n];
71
- }
72
- const a = q(r).then((t) => (delete g[n], t));
73
- return g[n] = a, a;
67
+ return await e;
68
+ const a = W(r).catch((n) => {
69
+ console.debug("[generatePermitHook] cached request failed", n);
70
+ }).finally(() => {
71
+ delete P[t];
72
+ });
73
+ return P[t] = a, a;
74
74
  }
75
- async function q(r) {
75
+ async function W(r) {
76
76
  const {
77
- inputToken: n,
77
+ inputToken: t,
78
78
  spender: e,
79
79
  chainId: a,
80
- permitInfo: t,
80
+ permitInfo: n,
81
81
  provider: o,
82
82
  account: i,
83
83
  eip2162Utils: l,
84
84
  nonce: u
85
- } = r, c = n.address, m = t.name || n.name;
86
- if (!W(t))
85
+ } = r, c = t.address, m = n.name || t.name;
86
+ if (!q(n))
87
87
  throw new Error(`Trying to generate permit hook for unsupported token: ${c}`);
88
88
  if (!m)
89
89
  throw new Error(`No token name for token: ${c}`);
90
- const d = i || b.address, p = u === void 0 ? await l.getTokenNonce(c, d) : u, s = k(), f = $, E = t.type === "eip-2612" ? await S({
90
+ const d = i || b.address, p = u === void 0 ? await l.getTokenNonce(c, d) : u, s = k(), f = $, E = n.type === "eip-2612" ? await S({
91
91
  eip2162Utils: l,
92
92
  callDataParams: [{
93
93
  owner: d,
@@ -95,7 +95,7 @@ async function q(r) {
95
95
  value: f,
96
96
  nonce: p,
97
97
  deadline: s
98
- }, a, m, c, t.version]
98
+ }, a, m, c, n.version]
99
99
  }) : await N({
100
100
  eip2162Utils: l,
101
101
  callDataParams: [{
@@ -105,7 +105,7 @@ async function q(r) {
105
105
  value: f,
106
106
  nonce: p,
107
107
  expiry: s
108
- }, a, m, c, t.version]
108
+ }, a, m, c, n.version]
109
109
  }), U = await j(E, d, c, o, !!i);
110
110
  return {
111
111
  target: c,
@@ -113,71 +113,71 @@ async function q(r) {
113
113
  gasLimit: U
114
114
  };
115
115
  }
116
- async function j(r, n, e, a, t) {
116
+ async function j(r, t, e, a, n) {
117
117
  try {
118
118
  const o = await a.estimateGas({
119
119
  data: r,
120
- from: n,
120
+ from: t,
121
121
  to: e
122
- }), i = t ? o : o.add(o.div(10));
123
- return i.gt(P) ? i.toString() : P;
122
+ }), i = n ? o : o.add(o.div(10));
123
+ return i.gt(h) ? i.toString() : h;
124
124
  } catch (o) {
125
- return console.debug("[calculatePermitGasLimit] Failed to estimateGas, using default", o), P;
125
+ return console.debug("[calculatePermitGasLimit] Failed to estimateGas, using default", o), h;
126
126
  }
127
127
  }
128
128
  function Q(r) {
129
129
  const {
130
- inputToken: n,
130
+ inputToken: t,
131
131
  chainId: e,
132
132
  account: a
133
133
  } = r;
134
- return `${n.address.toLowerCase()}-${e}${a ? `-${a.toLowerCase()}` : ""}`;
134
+ return `${t.address.toLowerCase()}-${e}${a ? `-${a.toLowerCase()}` : ""}`;
135
135
  }
136
- function h(r, n, e) {
137
- return new G(r, n, e);
136
+ function y(r, t, e) {
137
+ return new G(r, t, e);
138
138
  }
139
139
  class Y {
140
- constructor(n, e) {
141
- this.provider = n, this.walletSigner = e;
140
+ constructor(t, e) {
141
+ this.provider = t, this.walletSigner = e;
142
142
  }
143
- contractEncodeABI(n, e, a, t) {
144
- return h(e || "", n, this.provider).interface.encodeFunctionData(a, t);
143
+ contractEncodeABI(t, e, a, n) {
144
+ return y(e || "", t, this.provider).interface.encodeFunctionData(a, n);
145
145
  }
146
- signTypedData(n, e, a) {
147
- const t = Object.keys(e.types).reduce((i, l) => (l !== "EIP712Domain" && (i[l] = e.types[l]), i), {});
148
- return (this.walletSigner || this.provider.getSigner())._signTypedData(e.domain, t, e.message);
146
+ signTypedData(t, e, a) {
147
+ const n = Object.keys(e.types).reduce((i, l) => (l !== "EIP712Domain" && (i[l] = e.types[l]), i), {});
148
+ return (this.walletSigner || this.provider.getSigner())._signTypedData(e.domain, n, e.message);
149
149
  }
150
- ethCall(n, e) {
150
+ ethCall(t, e) {
151
151
  return this.provider.call({
152
- to: n,
152
+ to: t,
153
153
  data: e
154
154
  });
155
155
  }
156
- decodeABIParameter(n, e) {
157
- return T.decode([n], e)[0];
156
+ decodeABIParameter(t, e) {
157
+ return T.decode([t], e)[0];
158
158
  }
159
- decodeABIParameters(n, e) {
160
- const a = T.decode(n, e);
159
+ decodeABIParameters(t, e) {
160
+ const a = T.decode(t, e);
161
161
  if (a && typeof a == "object") {
162
- const t = {};
162
+ const n = {};
163
163
  return Object.keys(a).forEach((o) => {
164
164
  const i = a[o];
165
- O.isBigNumber(i) ? t[o] = i.toHexString() : t[o] = i;
166
- }), t;
165
+ O.isBigNumber(i) ? n[o] = i.toHexString() : n[o] = i;
166
+ }), n;
167
167
  }
168
168
  return a;
169
169
  }
170
170
  }
171
171
  const C = /* @__PURE__ */ new Map(), v = /* @__PURE__ */ new Map();
172
- function z(r, n, e) {
172
+ function z(r, t, e) {
173
173
  const a = C.get(r);
174
174
  if (!e && a)
175
175
  return a;
176
- const t = `${r}-${e}`, o = v.get(t);
176
+ const n = `${r}-${e}`, o = v.get(n);
177
177
  if (o)
178
178
  return o;
179
- const i = new Y(n, e ? void 0 : b), l = new x(i);
180
- return e ? (console.log(`[getPermitUtilsInstance] Set cached provider utils for chain ${r}-${e}`, l), v.set(t, l)) : (console.log(`[getPermitUtilsInstance] Set cached chain utils for chain ${r}`, l), C.set(r, l)), l;
179
+ const i = new Y(t, e ? void 0 : b), l = new x(i);
180
+ return e ? (console.log(`[getPermitUtilsInstance] Set cached provider utils for chain ${r}-${e}`, l), v.set(n, l)) : (console.log(`[getPermitUtilsInstance] Set cached chain utils for chain ${r}`, l), C.set(r, l)), l;
181
181
  }
182
182
  const R = [
183
183
  {
@@ -238,31 +238,31 @@ const R = [
238
238
  type: "function"
239
239
  }
240
240
  ];
241
- async function J(r, n, e) {
242
- const a = L(r), o = await h(a, R, e).callStatic.eip712Domain();
243
- return X(o, n, r);
241
+ async function J(r, t, e) {
242
+ const a = L(r), o = await y(a, R, e).callStatic.eip712Domain();
243
+ return X(o, t, r);
244
244
  }
245
- async function X(r, n, e) {
245
+ async function X(r, t, e) {
246
246
  const {
247
247
  extensions: a,
248
- ...t
248
+ ...n
249
249
  } = r;
250
250
  if (a.length > 0)
251
251
  throw Error("Extensions not implemented");
252
- if (t.chainId && n !== parseInt(t.chainId, 16))
253
- throw Error(`ChainId mismatch. Received: '${t.chainId}', expected: '${n}'`);
254
- if (t.verifyingContract && e.toLowerCase() !== t.verifyingContract.toLowerCase())
255
- throw Error(`Address mismatch. Received: '${t.verifyingContract}', expected: '${e}'`);
256
- return ee(t);
252
+ if (n.chainId && t !== parseInt(n.chainId, 16))
253
+ throw Error(`ChainId mismatch. Received: '${n.chainId}', expected: '${t}'`);
254
+ if (n.verifyingContract && e.toLowerCase() !== n.verifyingContract.toLowerCase())
255
+ throw Error(`Address mismatch. Received: '${n.verifyingContract}', expected: '${e}'`);
256
+ return ee(n);
257
257
  }
258
258
  const Z = ["name", "version", "chainId", "verifyingContract", "salt"];
259
259
  function ee(r) {
260
- const n = parseInt(r.fields, 16);
261
- return Z.reduce((e, a, t) => (n & 1 << t && (e[a] = r[a]), e), {});
260
+ const t = parseInt(r.fields, 16);
261
+ return Z.reduce((e, a, n) => (t & 1 << n && (e[a] = r[a]), e), {});
262
262
  }
263
- async function te(r, n, e) {
263
+ async function te(r, t, e) {
264
264
  const a = L(r);
265
- return h(a, R, e).callStatic.name();
265
+ return y(a, R, e).callStatic.name();
266
266
  }
267
267
  const ne = [[{
268
268
  constant: !0,
@@ -287,18 +287,18 @@ const ne = [[{
287
287
  stateMutability: "view",
288
288
  type: "function"
289
289
  }]];
290
- async function M(r, n, e = 0) {
290
+ async function M(r, t, e = 0) {
291
291
  const a = ne[e];
292
292
  if (!a)
293
293
  return "1";
294
294
  try {
295
- const o = h(r, a, n).interface.encodeFunctionData(a[0].name), i = await n.call({
295
+ const o = y(r, a, t).interface.encodeFunctionData(a[0].name), i = await t.call({
296
296
  to: r,
297
297
  data: o
298
298
  });
299
299
  return i === "0x" || Number.isNaN(Number(i)) ? "1" : i.startsWith("0x") ? T.decode(["string"], i).toString() : i;
300
300
  } catch {
301
- return M(r, n, e + 1);
301
+ return M(r, t, e + 1);
302
302
  }
303
303
  }
304
304
  const re = {
@@ -309,36 +309,36 @@ const re = {
309
309
  allowed: !0,
310
310
  nonce: 0,
311
311
  expiry: k()
312
- }, D = {}, y = {
312
+ }, D = {}, g = {
313
313
  type: "unsupported"
314
314
  };
315
315
  async function Pe(r) {
316
316
  const {
317
- tokenAddress: n,
317
+ tokenAddress: t,
318
318
  chainId: e
319
- } = r, a = `${e}-${n.toLowerCase()}`, t = D[a];
320
- if (t)
321
- return t;
319
+ } = r, a = `${e}-${t.toLowerCase()}`, n = D[a];
320
+ if (n)
321
+ return n;
322
322
  const o = oe(r);
323
323
  return D[a] = o, o;
324
324
  }
325
325
  async function oe(r) {
326
326
  const {
327
- spender: n,
327
+ spender: t,
328
328
  tokenAddress: e,
329
329
  chainId: a,
330
- provider: t,
330
+ provider: n,
331
331
  minGasLimit: o
332
- } = r, i = z(a, t), l = b.address;
332
+ } = r, i = z(a, n), l = b.address;
333
333
  let u;
334
334
  try {
335
- u = await J(e, a, t);
335
+ u = await J(e, a, n);
336
336
  } catch {
337
337
  console.debug(`[checkTokenIsPermittable] Couldn't fetch eip712domain for token ${e}`);
338
338
  }
339
339
  let c = u == null ? void 0 : u.name;
340
340
  try {
341
- c || (c = await te(e, a, t));
341
+ c || (c = await te(e, a, n));
342
342
  } catch (s) {
343
343
  if (/ETIMEDOUT/.test(s) && !c)
344
344
  return {
@@ -355,7 +355,7 @@ async function oe(r) {
355
355
  m = await i.getTokenNonce(e, l);
356
356
  } catch (s) {
357
357
  return s === "nonce not supported" || s.message === "nonce is NaN" ? (console.debug(`[checkTokenIsPermittable] Not a permittable token ${e} - ${c}`, (s == null ? void 0 : s.message) || s), {
358
- ...y,
358
+ ...g,
359
359
  name: c
360
360
  }) : (console.debug(`[checkTokenIsPermittable] Failed to get nonce for ${e} - ${c}`, s), {
361
361
  error: s.message || s.toString()
@@ -364,7 +364,7 @@ async function oe(r) {
364
364
  let d = u == null ? void 0 : u.version;
365
365
  if (d === void 0)
366
366
  try {
367
- d = await M(e, t);
367
+ d = await M(e, n);
368
368
  } catch (s) {
369
369
  console.debug(`[checkTokenIsPermittable] Failed to get version for ${e} - ${c}`, s);
370
370
  }
@@ -372,7 +372,7 @@ async function oe(r) {
372
372
  chainId: a,
373
373
  eip2612PermitUtils: i,
374
374
  nonce: m,
375
- spender: n,
375
+ spender: t,
376
376
  tokenAddress: e,
377
377
  tokenName: c,
378
378
  walletAddress: l,
@@ -383,16 +383,16 @@ async function oe(r) {
383
383
  return await A({
384
384
  ...p,
385
385
  type: "eip-2612",
386
- provider: t
386
+ provider: n
387
387
  });
388
388
  } catch (s) {
389
389
  try {
390
390
  return await se(e, i) ? await A({
391
391
  ...p,
392
392
  type: "dai-like",
393
- provider: t
393
+ provider: n
394
394
  }) : /invalid signature/.test(s) || (s == null ? void 0 : s.code) === "UNPREDICTABLE_GAS_LIMIT" ? (console.debug(`[checkTokenIsPermittable] Token ${e} - ${c} might be permittable, but it's not supported for now. Reason:`, s == null ? void 0 : s.reason), {
395
- ...y,
395
+ ...g,
396
396
  name: c
397
397
  }) : (console.debug(`[checkTokenIsPermittable] Failed to estimate eip-2612 permit for ${e} - ${c}`, s), {
398
398
  error: s.message || s.toString()
@@ -406,71 +406,71 @@ async function oe(r) {
406
406
  }
407
407
  async function A(r) {
408
408
  const {
409
- provider: n,
409
+ provider: t,
410
410
  walletAddress: e,
411
411
  tokenAddress: a,
412
- tokenName: t,
412
+ tokenName: n,
413
413
  type: o,
414
414
  version: i,
415
415
  minGasLimit: l = V
416
416
  } = r, c = await (o === "eip-2612" ? ie : ce)(r);
417
- return c ? (await n.estimateGas({
417
+ return c ? (await t.estimateGas({
418
418
  data: c,
419
419
  from: e,
420
420
  to: a
421
421
  })).toNumber() > l ? {
422
422
  type: o,
423
423
  version: i,
424
- name: t
424
+ name: n
425
425
  } : {
426
- ...y,
427
- name: t
426
+ ...g,
427
+ name: n
428
428
  } : {
429
- ...y,
430
- name: t
429
+ ...g,
430
+ name: n
431
431
  };
432
432
  }
433
433
  async function ie(r) {
434
434
  const {
435
- eip2612PermitUtils: n,
435
+ eip2612PermitUtils: t,
436
436
  walletAddress: e,
437
437
  spender: a,
438
- nonce: t,
438
+ nonce: n,
439
439
  chainId: o,
440
440
  tokenName: i,
441
441
  tokenAddress: l,
442
442
  version: u
443
443
  } = r;
444
444
  return S({
445
- eip2162Utils: n,
445
+ eip2162Utils: t,
446
446
  callDataParams: [{
447
447
  ...re,
448
448
  owner: e,
449
449
  spender: a,
450
- nonce: t
450
+ nonce: n
451
451
  }, +o, i, l, u]
452
452
  });
453
453
  }
454
- async function se(r, n) {
455
- return await n.getPermitTypeHash(r) === _;
454
+ async function se(r, t) {
455
+ return await t.getPermitTypeHash(r) === _;
456
456
  }
457
457
  async function ce(r) {
458
458
  const {
459
- eip2612PermitUtils: n,
459
+ eip2612PermitUtils: t,
460
460
  tokenAddress: e,
461
461
  walletAddress: a,
462
- spender: t,
462
+ spender: n,
463
463
  nonce: o,
464
464
  chainId: i,
465
465
  tokenName: l,
466
466
  version: u
467
467
  } = r;
468
- return await n.getPermitTypeHash(e) === _ ? N({
469
- eip2162Utils: n,
468
+ return await t.getPermitTypeHash(e) === _ ? N({
469
+ eip2162Utils: t,
470
470
  callDataParams: [{
471
471
  ...ae,
472
472
  holder: a,
473
- spender: t,
473
+ spender: n,
474
474
  nonce: o
475
475
  }, i, l, e, u]
476
476
  }) : !1;
@@ -482,5 +482,5 @@ export {
482
482
  he as generatePermitHook,
483
483
  z as getPermitUtilsInstance,
484
484
  Pe as getTokenPermitInfo,
485
- W as isSupportedPermitInfo
485
+ q as isSupportedPermitInfo
486
486
  };
@@ -1,3 +1,4 @@
1
- import { Eip2612PermitUtils } from '@1inch/permit-signed-approvals-utils';
2
1
  import { PermitInfo } from '../types';
2
+ import { Eip2612PermitUtils } from '@1inch/permit-signed-approvals-utils';
3
+
3
4
  export declare function checkIsCallDataAValidPermit(owner: string, chainId: number, eip2162Utils: Eip2612PermitUtils, tokenAddress: string, _tokenName: string | undefined, callData: string, { version, type, name }: PermitInfo): Promise<boolean | undefined>;
@@ -1,2 +1,3 @@
1
1
  import { PermitHookData, PermitHookParams } from '../types';
2
- export declare function generatePermitHook(params: PermitHookParams): Promise<PermitHookData>;
2
+
3
+ export declare function generatePermitHook(params: PermitHookParams): Promise<PermitHookData | undefined>;
@@ -1,3 +1,4 @@
1
- import type { JsonRpcProvider } from '@ethersproject/providers';
2
1
  import { Eip2612PermitUtils } from '@1inch/permit-signed-approvals-utils';
2
+ import { JsonRpcProvider } from '@ethersproject/providers';
3
+
3
4
  export declare function getPermitUtilsInstance(chainId: number, provider: JsonRpcProvider, account?: string | undefined): Eip2612PermitUtils;
@@ -1,2 +1,3 @@
1
1
  import { GetTokenPermitInfoParams, GetTokenPermitIntoResult } from '../types';
2
+
2
3
  export declare function getTokenPermitInfo(params: GetTokenPermitInfoParams): Promise<GetTokenPermitIntoResult>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cowprotocol/permit-utils",
3
- "version": "0.2.0",
3
+ "version": "0.3.0-RC.0",
4
4
  "type": "module",
5
5
  "dependencies": {
6
6
  "ethers": "^5.7.2",
package/types.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Eip2612PermitUtils } from '@1inch/permit-signed-approvals-utils';
2
- import { latest } from '@cowprotocol/app-data';
3
2
  import { JsonRpcProvider } from '@ethersproject/providers';
3
+ import { latest } from '@cowprotocol/app-data';
4
+
4
5
  export type PermitType = 'dai-like' | 'eip-2612' | 'unsupported';
5
6
  export type PermitInfo = {
6
7
  type: PermitType;
@@ -1,6 +1,7 @@
1
- import type { JsonRpcProvider } from '@ethersproject/providers';
2
1
  import { AbiInput, AbiItem, EIP712TypedData, ProviderConnector } from '@1inch/permit-signed-approvals-utils';
3
2
  import { Wallet } from '@ethersproject/wallet';
3
+ import { JsonRpcProvider } from '@ethersproject/providers';
4
+
4
5
  export declare class PermitProviderConnector implements ProviderConnector {
5
6
  private provider;
6
7
  private walletSigner?;
@@ -1,3 +1,4 @@
1
1
  import { BuildDaiLikePermitCallDataParams, BuildEip2162PermitCallDataParams } from '../types';
2
+
2
3
  export declare function buildEip2162PermitCallData({ eip2162Utils, callDataParams, }: BuildEip2162PermitCallDataParams): Promise<string>;
3
4
  export declare function buildDaiLikePermitCallData({ eip2162Utils, callDataParams, }: BuildDaiLikePermitCallDataParams): Promise<string>;
@@ -1,3 +1,4 @@
1
- import type { JsonRpcProvider } from '@ethersproject/providers';
1
+ import { JsonRpcProvider } from '@ethersproject/providers';
2
2
  import { Contract, ContractInterface } from '@ethersproject/contracts';
3
+
3
4
  export declare function getContract(address: string, abi: ContractInterface, provider: JsonRpcProvider): Contract;
@@ -1,4 +1,5 @@
1
- import type { JsonRpcProvider } from '@ethersproject/providers';
1
+ import { JsonRpcProvider } from '@ethersproject/providers';
2
+
2
3
  export declare function getEip712Domain(tokenAddress: string, chainId: number, provider: JsonRpcProvider): Promise<Eip712Domain>;
3
4
  type Eip5267Return = {
4
5
  fields: string;
@@ -1,2 +1,3 @@
1
- import type { JsonRpcProvider } from '@ethersproject/providers';
1
+ import { JsonRpcProvider } from '@ethersproject/providers';
2
+
2
3
  export declare function getTokenName(tokenAddress: string, chainId: number, provider: JsonRpcProvider): Promise<string>;
@@ -1,2 +1,3 @@
1
- import type { JsonRpcProvider } from '@ethersproject/providers';
1
+ import { JsonRpcProvider } from '@ethersproject/providers';
2
+
2
3
  export declare function getTokenPermitVersion(tokenAddress: string, provider: JsonRpcProvider, index?: number): Promise<string>;
@@ -1,2 +1,3 @@
1
1
  import { PermitInfo } from '../types';
2
+
2
3
  export declare function isSupportedPermitInfo(p: PermitInfo | undefined): p is PermitInfo;