@cowprotocol/permit-utils 3.2.1 → 3.2.3

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/abi/erc20.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ declare const _default: readonly [{
2
+ readonly constant: true;
3
+ readonly inputs: readonly [];
4
+ readonly name: "name";
5
+ readonly outputs: readonly [{
6
+ readonly name: "";
7
+ readonly type: "string";
8
+ }];
9
+ readonly payable: false;
10
+ readonly stateMutability: "view";
11
+ readonly type: "function";
12
+ }, {
13
+ readonly inputs: readonly [];
14
+ readonly name: "eip712Domain";
15
+ readonly outputs: readonly [{
16
+ readonly internalType: "bytes1";
17
+ readonly name: "fields";
18
+ readonly type: "bytes1";
19
+ }, {
20
+ readonly internalType: "string";
21
+ readonly name: "name";
22
+ readonly type: "string";
23
+ }, {
24
+ readonly internalType: "string";
25
+ readonly name: "version";
26
+ readonly type: "string";
27
+ }, {
28
+ readonly internalType: "uint256";
29
+ readonly name: "chainId";
30
+ readonly type: "uint256";
31
+ }, {
32
+ readonly internalType: "address";
33
+ readonly name: "verifyingContract";
34
+ readonly type: "address";
35
+ }, {
36
+ readonly internalType: "bytes32";
37
+ readonly name: "salt";
38
+ readonly type: "bytes32";
39
+ }, {
40
+ readonly internalType: "uint256[]";
41
+ readonly name: "extensions";
42
+ readonly type: "uint256[]";
43
+ }];
44
+ readonly stateMutability: "view";
45
+ readonly type: "function";
46
+ }];
47
+ export default _default;
package/const.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { Wallet } from '@ethersproject/wallet';
2
1
  export declare const PERMIT_ACCOUNT: {
3
- address: import('viem/accounts').Address;
4
- nonceManager?: import('viem/accounts').NonceManager | undefined;
2
+ address: import('viem').Address;
3
+ nonceManager?: import('viem').NonceManager | undefined;
5
4
  sign: (parameters: {
6
5
  hash: import('viem').Hash;
7
6
  }) => Promise<import('viem').Hex>;
@@ -17,8 +16,7 @@ export declare const PERMIT_ACCOUNT: {
17
16
  source: "privateKey";
18
17
  type: "local";
19
18
  };
20
- export declare const PERMIT_SIGNER: Wallet;
21
- export declare const DEFAULT_MIN_GAS_LIMIT = 55000;
22
- export declare const DEFAULT_PERMIT_GAS_LIMIT = "80000";
19
+ export declare const DEFAULT_MIN_GAS_LIMIT = 55000n;
20
+ export declare const DEFAULT_PERMIT_GAS_LIMIT = 80000n;
23
21
  export declare const DEFAULT_PERMIT_VALUE: bigint;
24
22
  export declare const DEFAULT_PERMIT_DURATION: number;
@@ -7,19 +7,75 @@
7
7
  *
8
8
  * You also can use `import type ... from '@1inch/permit-signed-approvals-utils'`
9
9
  */
10
- export declare const DAI_EIP_2612_PERMIT_ABI: {
11
- constant: boolean;
12
- inputs: {
13
- internalType: string;
14
- name: string;
15
- type: string;
16
- }[];
17
- name: string;
18
- outputs: never[];
19
- payable: boolean;
20
- stateMutability: string;
21
- type: string;
22
- }[];
10
+ export declare const DAI_EIP_2612_PERMIT_ABI: readonly [{
11
+ readonly constant: false;
12
+ readonly inputs: readonly [{
13
+ readonly internalType: "address";
14
+ readonly name: "holder";
15
+ readonly type: "address";
16
+ }, {
17
+ readonly internalType: "address";
18
+ readonly name: "spender";
19
+ readonly type: "address";
20
+ }, {
21
+ readonly internalType: "uint256";
22
+ readonly name: "nonce";
23
+ readonly type: "uint256";
24
+ }, {
25
+ readonly internalType: "uint256";
26
+ readonly name: "expiry";
27
+ readonly type: "uint256";
28
+ }, {
29
+ readonly internalType: "bool";
30
+ readonly name: "allowed";
31
+ readonly type: "bool";
32
+ }, {
33
+ readonly internalType: "uint8";
34
+ readonly name: "v";
35
+ readonly type: "uint8";
36
+ }, {
37
+ readonly internalType: "bytes32";
38
+ readonly name: "r";
39
+ readonly type: "bytes32";
40
+ }, {
41
+ readonly internalType: "bytes32";
42
+ readonly name: "s";
43
+ readonly type: "bytes32";
44
+ }];
45
+ readonly name: "permit";
46
+ readonly outputs: readonly [];
47
+ readonly payable: false;
48
+ readonly stateMutability: "nonpayable";
49
+ readonly type: "function";
50
+ }];
51
+ export declare const EIP_2612_PERMIT_ABI: readonly [{
52
+ readonly type: "function";
53
+ readonly name: "permit";
54
+ readonly stateMutability: "nonpayable";
55
+ readonly inputs: readonly [{
56
+ readonly name: "owner";
57
+ readonly type: "address";
58
+ }, {
59
+ readonly name: "spender";
60
+ readonly type: "address";
61
+ }, {
62
+ readonly name: "value";
63
+ readonly type: "uint256";
64
+ }, {
65
+ readonly name: "deadline";
66
+ readonly type: "uint256";
67
+ }, {
68
+ readonly name: "v";
69
+ readonly type: "uint8";
70
+ }, {
71
+ readonly name: "r";
72
+ readonly type: "bytes32";
73
+ }, {
74
+ readonly name: "s";
75
+ readonly type: "bytes32";
76
+ }];
77
+ readonly outputs: readonly [];
78
+ }];
23
79
  export declare const EIP_2612_PERMIT_SELECTOR = "0xd505accf";
24
80
  export declare const DAI_PERMIT_SELECTOR = "0x8fcbaf0c";
25
81
  export declare const DAI_LIKE_PERMIT_TYPEHASH = "0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb";
package/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const G=require("@ethersproject/constants"),q=require("@ethersproject/wallet"),B=require("viem/accounts"),V=require("@cowprotocol/hook-dapp-lib"),k=require("@ethersproject/abi"),K=require("@ethersproject/bignumber"),j=require("@ethersproject/contracts"),W=require("@cowprotocol/cow-sdk"),S=require("@ethersproject/address"),L="0xa50dc0f7fc051309434deb3b1c71e927dbb711759231d8ecbf630c85d94a42fe",Q=B.privateKeyToAccount(L),I=new q.Wallet(L),$=55e3,b="80000",R=G.MaxUint256.toBigInt(),z=157788e6;async function Y(n,r,e,a,t,i,{version:o,type:d,name:u}){const s=u||t;if(d==="unsupported")return!1;if(!s)throw new Error(`No token name for ${a}`);const l={chainId:r,tokenName:s,tokenAddress:a,callData:i,version:o};let m;if(i.startsWith(h)?m=e.recoverPermitOwnerFromCallData({...l,callData:i.replace(h,"0x")}):i.startsWith(P)&&(m=e.recoverDaiLikePermitOwnerFromCallData({...l,callData:i.replace(P,"0x")})),!!m)try{return(await m).toLowerCase()===n.toLowerCase()}catch(p){return console.debug(`[checkHasValidPendingPermit] Failed to check permit validity for owner ${n} with callData ${i}`,p),!1}}async function M({eip2612Utils:n,callDataParams:r}){const[e,a,t,...i]=r;return(await n.buildPermitCallData(e,a,t,...i)).replace("0x",h)}async function N({eip2612Utils:n,callDataParams:r}){return(await n.buildDaiLikePermitCallData(...r)).replace("0x",P)}function E(){return Math.ceil((Date.now()+z)/1e3)}function U(n){return!!n&&n.type!=="unsupported"}const w={};async function J(n){const r=ee(n),e=w[r];if(e)return await e;const a=X(n).catch(t=>{console.debug("[generatePermitHook] cached request failed",t)}).finally(()=>{delete w[r]});return w[r]=a,a}async function X(n){const{inputToken:r,spender:e,chainId:a,permitInfo:t,provider:i,account:o,eip2612Utils:d,nonce:u}=n,s=r.address,l=t.name||r.name;if(!U(t))throw new Error(`Trying to generate permit hook for unsupported token: ${s}`);if(!l)throw new Error(`No token name for token: ${s}`);const m=o||I.address,p=u===void 0?await d.getTokenNonce(s,m):u,y=E(),c=n.amount||R,f=t.type==="eip-2612"?await M({eip2612Utils:d,callDataParams:[{owner:m,spender:e,value:c.toString(),nonce:p,deadline:y},a,l,s,t.version]}):await N({eip2612Utils:d,callDataParams:[{holder:m,spender:e,allowed:!0,value:c.toString(),nonce:p,expiry:y},a,l,s,t.version]}),x=await Z(f,m,s,i,!!o);return{target:s,callData:f,gasLimit:x,dappId:V.PERMIT_HOOK_DAPP_ID}}async function Z(n,r,e,a,t){try{const i=await a.estimateGas({data:n,from:r,to:e}),o=t?i:i.add(i.div(10));return o.gt(b)?o.toString():b}catch(i){return console.debug("[calculatePermitGasLimit] Failed to estimateGas, using default",i),b}}function ee(n){const{inputToken:r,chainId:e,account:a,amount:t}=n;return`${r.address.toLowerCase()}-${e}${a?`-${a.toLowerCase()}`:""}${t?`-${t.toString()}`:""}`}function T(n,r,e){return new j.Contract(n,r,e)}class te{constructor(r,e){this.provider=r,this.walletSigner=e}contractEncodeABI(r,e,a,t){return T(e||"",r,this.provider).interface.encodeFunctionData(a,t)}signTypedData(r,e,a){const t=Object.keys(e.types).reduce((o,d)=>(d!=="EIP712Domain"&&(o[d]=e.types[d]),o),{});return(this.walletSigner||this.provider.getSigner())._signTypedData(e.domain,t,e.message)}ethCall(r,e){return this.provider.call({to:r,data:e})}decodeABIParameter(r,e){return k.defaultAbiCoder.decode([r],e)[0]}decodeABIParameters(r,e){const a=k.defaultAbiCoder.decode(r,e);if(a&&typeof a=="object"){const t={};return Object.keys(a).forEach(i=>{const o=a[i];K.BigNumber.isBigNumber(o)?t[i]=o.toHexString():t[i]=o}),t}return a}}const v=new Map,_=new Map;async function H(n,r,e){const a=v.get(n);if(!e&&a)return a;const t=`${n}-${e}`,i=_.get(t);if(i)return i;const o=new te(r,e?void 0:I),d=await Promise.resolve().then(()=>require("./1inchPermitUtils-BDO_CqjL.cjs")).then(s=>s.Eip2612PermitUtils),u=new d(o,{enabledCheckSalt:!0});return e?(console.log(`[getPermitUtilsInstance] Set cached provider utils for chain ${n}-${e}`,u),_.set(t,u)):(console.log(`[getPermitUtilsInstance] Set cached chain utils for chain ${n}`,u),v.set(n,u)),u}const O=[{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 ne(n,r,e){const a=S.getAddress(n),i=await T(a,O,e).callStatic.eip712Domain();return re(i,r,n)}async function re(n,r,e){const{extensions:a,...t}=n;if(a.length>0)throw Error("Extensions not implemented");if(t.chainId&&r!==parseInt(t.chainId,16))throw Error(`ChainId mismatch. Received: '${t.chainId}', expected: '${r}'`);if(t.verifyingContract&&e.toLowerCase()!==t.verifyingContract.toLowerCase())throw Error(`Address mismatch. Received: '${t.verifyingContract}', expected: '${e}'`);return ie(t)}const ae=["name","version","chainId","verifyingContract","salt"];function ie(n){const r=parseInt(n.fields,16);return ae.reduce((e,a,t)=>(r&1<<t&&(e[a]=n[a]),e),{})}async function oe(n,r,e){const a=S.getAddress(n);return T(a,O,e).callStatic.name()}const se=[[{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 F(n,r,e=0){const a=se[e];if(!a)return"1";try{const i=T(n,a,r).interface.encodeFunctionData(a[0].name),o=await r.call({to:n,data:i});return o==="0x"||Number.isNaN(Number(o))?"1":o.startsWith("0x")?k.defaultAbiCoder.decode(["string"],o).toString():o}catch{return F(n,r,e+1)}}const ce={nonce:0,deadline:E()},le={allowed:!0,nonce:0,expiry:E()},D={},g={type:"unsupported"};async function de(n){const{tokenAddress:r,chainId:e}=n,a=W.getTokenId({address:r,chainId:e}),t=D[a];if(t)return t;const i=ue(n);return D[a]=i,i}async function ue(n){const{spender:r,tokenAddress:e,chainId:a,provider:t,minGasLimit:i,amount:o}=n,d=await H(a,t),u=I.address;let s;try{s=await ne(e,a,t)}catch{console.debug(`[checkTokenIsPermittable] Couldn't fetch eip712domain for token ${e}`)}let l=s?.name;try{l||(l=await oe(e,a,t))}catch(c){if(/ETIMEDOUT/.test(c)&&!l)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 '${l}'`,c)}if(!l)return{error:`Token name could not be determined for ${e}`};let m;try{m=await d.getTokenNonce(e,u)}catch(c){return c==="nonce not supported"||c.message==="nonce is NaN"?(console.debug(`[checkTokenIsPermittable] Not a permittable token ${e} - ${l}`,c?.message||c),{...g,name:l}):(console.debug(`[checkTokenIsPermittable] Failed to get nonce for ${e} - ${l}`,c),{error:c.message||c.toString()})}let p=s?.version;if(p===void 0)try{p=await F(e,t)}catch(c){console.debug(`[checkTokenIsPermittable] Failed to get version for ${e} - ${l}`,c)}const y={chainId:a,eip2612PermitUtils:d,nonce:m,spender:r,tokenAddress:e,tokenName:l,walletAddress:u,version:p,minGasLimit:i,amount:o};try{return await A({...y,type:"eip-2612",provider:t})}catch(c){try{return await pe(e,d)?await A({...y,type:"dai-like",provider:t}):/invalid signature/.test(c)||c?.code==="UNPREDICTABLE_GAS_LIMIT"?(console.debug(`[checkTokenIsPermittable] Token ${e} - ${l} might be permittable, but it's not supported for now. Reason:`,c?.reason),{...g,name:l}):(console.debug(`[checkTokenIsPermittable] Failed to estimate eip-2612 permit for ${e} - ${l}`,c),{error:c.message||c.toString()})}catch(f){return console.debug(`[checkTokenIsPermittable] Failed to estimate dai-like permit for ${e} - ${l}`,f),{error:f.message||f.toString()}}}}async function A(n){const{provider:r,walletAddress:e,tokenAddress:a,tokenName:t,type:i,version:o,minGasLimit:d=$}=n,s=await(i==="eip-2612"?me:fe)(n);return s?(await r.estimateGas({data:s,from:e,to:a})).toNumber()>d?{type:i,version:o,name:t}:{...g,name:t}:{...g,name:t}}async function me(n){const{eip2612PermitUtils:r,walletAddress:e,spender:a,nonce:t,chainId:i,tokenName:o,tokenAddress:d,version:u,amount:s}=n;return M({eip2612Utils:r,callDataParams:[{...ce,owner:e,spender:a,nonce:t,value:s?s.toString():R.toString()},+i,o,d,u]})}async function pe(n,r){return await r.getPermitTypeHash(n)===C}async function fe(n){const{eip2612PermitUtils:r,tokenAddress:e,walletAddress:a,spender:t,nonce:i,chainId:o,tokenName:d,version:u}=n;return await r.getPermitTypeHash(e)===C?N({eip2612Utils:r,callDataParams:[{...le,holder:a,spender:t,nonce:i},o,d,e,u]}):!1}const ye=[{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"}],h="0xd505accf",P="0x8fcbaf0c",C="0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb",ge=Object.freeze(Object.defineProperty({__proto__:null,DAI_EIP_2612_PERMIT_ABI:ye,DAI_LIKE_PERMIT_TYPEHASH:C,DAI_PERMIT_SELECTOR:P,EIP_2612_PERMIT_SELECTOR:h},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MIN_GAS_LIMIT=$;exports.PERMIT_ACCOUNT=Q;exports.PERMIT_SIGNER=I;exports.checkIsCallDataAValidPermit=Y;exports.generatePermitHook=J;exports.getPermitUtilsInstance=H;exports.getTokenPermitInfo=de;exports.isSupportedPermitInfo=U;exports.oneInchPermitUtilsConsts=ge;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("viem"),x=require("viem/accounts"),H=require("@cowprotocol/hook-dapp-lib"),P=require("wagmi/actions"),F=require("@cowprotocol/cow-sdk"),G="0xa50dc0f7fc051309434deb3b1c71e927dbb711759231d8ecbf630c85d94a42fe",w=x.privateKeyToAccount(G),L=55000n,E=80000n,R=p.maxUint256,j=157788e6;async function q(a,n,e,r,t,i,{version:s,type:o,name:d}){const l=d||t;if(o==="unsupported")return!1;if(!l)throw new Error(`No token name for ${r}`);const m={chainId:n,tokenName:l,tokenAddress:r,callData:i,version:s};let c;if(i.startsWith(I)?c=e.recoverPermitOwnerFromCallData({...m,callData:i.replace(I,"0x")}):i.startsWith(b)&&(c=e.recoverDaiLikePermitOwnerFromCallData({...m,callData:i.replace(b,"0x")})),!!c)try{return(await c).toLowerCase()===a.toLowerCase()}catch(y){console.debug(`[checkHasValidPendingPermit] Failed to check permit validity for owner ${a} with callData ${i}`,y);return}}async function N({eip2612Utils:a,callDataParams:n}){const[e,r,t,...i]=n;return(await a.buildPermitCallData(e,r,t,...i)).replace("0x",I)}async function M({eip2612Utils:a,callDataParams:n}){return(await a.buildDaiLikePermitCallData(...n)).replace("0x",b)}function C(){return Math.ceil((Date.now()+j)/1e3)}function U(a){return!!a&&a.type!=="unsupported"}const k={},B=[4001,-32e3],K=["user denied","user rejected","rejected transaction","transaction was rejected"];function V(a){if(!a)return!1;if(B.includes(a.code))return!0;const n=(typeof a=="string"?a:a.message)?.toLowerCase()||"";return K.some(e=>n.includes(e))}async function W(a){const n=Q(a),e=k[n];if(e)return await e;const r=z(a).catch(t=>{if(V(t))throw t;console.debug("[generatePermitHook] cached request failed",t)}).finally(()=>{delete k[n]});return k[n]=r,r}async function z(a){const{inputToken:n,spender:e,chainId:r,permitInfo:t,config:i,account:s,eip2612Utils:o,nonce:d}=a,l=n.address,m=t.name||n.name;if(!U(t))throw new Error(`Trying to generate permit hook for unsupported token: ${l}`);if(!m)throw new Error(`No token name for token: ${l}`);const c=s||w.address,y=d===void 0?await o.getTokenNonce(l,c):d,f=C(),h=a.amount||R,u=t.type==="eip-2612"?await N({eip2612Utils:o,callDataParams:[{owner:c,spender:e,value:h.toString(),nonce:y,deadline:f},r,m,l,t.version]}):await M({eip2612Utils:o,callDataParams:[{holder:c,spender:e,allowed:!0,value:h.toString(),nonce:y,expiry:f},r,m,l,t.version]}),g=await J({data:u,from:c,to:l,config:i,isUserAccount:!!s});return{target:l,callData:u,gasLimit:g.toString(),dappId:H.PERMIT_HOOK_DAPP_ID}}async function J({data:a,from:n,to:e,config:r,isUserAccount:t}){try{const i=await P.estimateGas(r,{account:n,to:e,data:a}),s=t?i:i+i/10n;return s>E?s:E}catch(i){return console.debug("[calculatePermitGasLimit] Failed to estimateGas, using default",i),E}}function Q(a){const{inputToken:n,chainId:e,account:r,amount:t}=a;return`${n.address.toLowerCase()}-${e}${r?`-${r.toLowerCase()}`:""}${t?`-${t.toString()}`:""}`}class Y{constructor(n,e){this.publicClient=n,this.walletClient=e}contractEncodeABI(n,e,r,t){const i=t.map(s=>s instanceof Uint8Array?p.bytesToHex(s):s);return p.encodeFunctionData({abi:n,functionName:r,args:i})}signTypedData(n,e,r){const t=Object.fromEntries(Object.entries(e.types).filter(([s])=>s!=="EIP712Domain")),i=this.walletClient.account??n;return this.walletClient.signTypedData({account:i,domain:e.domain,types:t,primaryType:e.primaryType,message:e.message})}ethCall(n,e){return this.publicClient.call({to:n,data:e}).then(({data:r})=>r||"0x")}decodeABIParameter(n,e){const[r]=p.decodeAbiParameters([{type:n}],e);return r}decodeABIParameters(n,e){const r=p.decodeAbiParameters(n,e),t={};return n.forEach((i,s)=>{const o=r[s],d=typeof o=="bigint"?p.toHex(o):o;t[s]=d,i.name&&(t[i.name]=d)}),t}}const v=new Map,A=new Map;async function $({chainId:a,publicClient:n,account:e,walletClient:r}){const t=v.get(a);if(!e&&t)return t;const i=`${a}-${e}`,s=A.get(i);if(s)return s;let o;if(!e)o=p.createWalletClient({account:w,chain:n.chain,transport:p.http()});else if(r)o=r;else throw new Error("Permit signing needs an active wallet client. Reconnect your wallet or use an injected extension.");const d=new Y(n,o),l=await Promise.resolve().then(()=>require("./1inchPermitUtils-BDO_CqjL.cjs")).then(c=>c.Eip2612PermitUtils),m=new l(d,{enabledCheckSalt:!0});return e?A.set(i,m):v.set(a,m),m}const X=[{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(a,n,e){const[r,t,i,s,o,d,l]=await P.readContract(e,{abi:X,address:a,functionName:"eip712Domain"}),m={fields:r,name:t,version:i,chainId:s.toString(),verifyingContract:o,salt:d,extensions:l.map(c=>String(c))};return ee(m,n,a)}async function ee(a,n,e){const{extensions:r,...t}=a;if(r.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 ne(t)}const te=["name","version","chainId","verifyingContract","salt"];function ne(a){const n=parseInt(a.fields,16);return te.reduce((e,r,t)=>(n&1<<t&&(e[r]=a[r]),e),{})}async function ae(a,n,e){return P.readContract(e,{abi:p.erc20Abi,address:a,functionName:"name"})}const re=[[{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 O(a,n,e=0){const r=re[e];if(!r)return"1";try{const t=await P.readContract(n,{abi:r,address:a,functionName:r[0].name});if(t==="0x"||Number.isNaN(Number(t)))return"1";if(!t.startsWith("0x"))return t;const[i]=p.decodeAbiParameters([{type:"string"}],t);return i}catch{return O(a,n,e+1)}}const ie={nonce:0,deadline:C()},oe={allowed:!0,nonce:0,expiry:C()},D={},T={type:"unsupported"};async function se(a){const{tokenAddress:n,chainId:e}=a,r=F.getTokenId({address:n,chainId:e}),t=D[r];if(t)return t;const i=ce(a);return D[r]=i,i}async function ce(a){const{amount:n,chainId:e,config:r,minGasLimit:t,publicClient:i,spender:s,tokenAddress:o}=a,d=await $({chainId:e,publicClient:i}),l=w.address;let m;try{m=await Z(o,e,r)}catch{console.debug(`[checkTokenIsPermittable] Couldn't fetch eip712domain for token ${o}`)}let c=m?.name;try{c||(c=await ae(o,e,r))}catch(u){if(/ETIMEDOUT/.test(u)&&!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 ${o}, using provided '${c}'`,u)}if(!c)return{error:`Token name could not be determined for ${o}`};let y;try{y=await d.getTokenNonce(o,l)}catch(u){return u==="nonce not supported"||u.message==="nonce is NaN"?(console.debug(`[checkTokenIsPermittable] Not a permittable token ${o} - ${c}`,u?.message||u),{...T,name:c}):(console.debug(`[checkTokenIsPermittable] Failed to get nonce for ${o} - ${c}`,u),{error:u.message||u.toString()})}let f=m?.version;if(f===void 0)try{f=await O(o,r)}catch(u){console.debug(`[checkTokenIsPermittable] Failed to get version for ${o} - ${c}`,u)}const h={chainId:e,eip2612PermitUtils:d,nonce:y,spender:s,tokenAddress:o,tokenName:c,walletAddress:l,version:f,minGasLimit:t,amount:n};try{return await S({...h,type:"eip-2612",config:r})}catch(u){try{return await ue(o,d)?await S({...h,type:"dai-like",config:r}):/invalid signature/.test(u)||u?.code==="UNPREDICTABLE_GAS_LIMIT"?(console.debug(`[checkTokenIsPermittable] Token ${o} - ${c} might be permittable, but it's not supported for now. Reason:`,u?.reason),{...T,name:c}):(console.debug(`[checkTokenIsPermittable] Failed to estimate eip-2612 permit for ${o} - ${c}`,u),{error:u.message||u.toString()})}catch(g){return console.debug(`[checkTokenIsPermittable] Failed to estimate dai-like permit for ${o} - ${c}`,g),{error:g.message||g.toString()}}}}async function S(a){const{config:n,walletAddress:e,tokenAddress:r,tokenName:t,type:i,version:s,minGasLimit:o=L}=a,l=await(i==="eip-2612"?le:de)(a);return l?await P.estimateGas(n,{to:r,account:e,data:l})>o?{type:i,version:s,name:t}:{...T,name:t}:{...T,name:t}}async function le(a){const{eip2612PermitUtils:n,walletAddress:e,spender:r,nonce:t,chainId:i,tokenName:s,tokenAddress:o,version:d,amount:l}=a;return N({eip2612Utils:n,callDataParams:[{...ie,owner:e,spender:r,nonce:t,value:l?l.toString():R.toString()},+i,s,o,d]})}async function ue(a,n){return await n.getPermitTypeHash(a)===_}async function de(a){const{eip2612PermitUtils:n,tokenAddress:e,walletAddress:r,spender:t,nonce:i,chainId:s,tokenName:o,version:d}=a;return await n.getPermitTypeHash(e)===_?M({eip2612Utils:n,callDataParams:[{...oe,holder:r,spender:t,nonce:i},s,o,e,d]}):!1}const me=[{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"}],pe=[{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:[]}],I="0xd505accf",b="0x8fcbaf0c",_="0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb",ye=Object.freeze(Object.defineProperty({__proto__:null,DAI_EIP_2612_PERMIT_ABI:me,DAI_LIKE_PERMIT_TYPEHASH:_,DAI_PERMIT_SELECTOR:b,EIP_2612_PERMIT_ABI:pe,EIP_2612_PERMIT_SELECTOR:I},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MIN_GAS_LIMIT=L;exports.PERMIT_ACCOUNT=w;exports.checkIsCallDataAValidPermit=q;exports.generatePermitHook=W;exports.getPermitUtilsInstance=$;exports.getTokenPermitInfo=se;exports.isSupportedPermitInfo=U;exports.oneInchPermitUtilsConsts=ye;
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { DEFAULT_MIN_GAS_LIMIT, PERMIT_ACCOUNT, PERMIT_SIGNER } from './const';
1
+ export { DEFAULT_MIN_GAS_LIMIT, PERMIT_ACCOUNT } from './const';
2
2
  export { checkIsCallDataAValidPermit } from './lib/checkIsCallDataAValidPermit';
3
3
  export { generatePermitHook } from './lib/generatePermitHook';
4
4
  export { getPermitUtilsInstance } from './lib/getPermitUtilsInstance';