@cowprotocol/permit-utils 0.1.1-RC.0 → 0.1.1-RC.1
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 +1 -2
- package/index.cjs +1 -1
- package/index.js +140 -141
- package/package.json +1 -1
package/const.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { SupportedChainId } from '@cowprotocol/cow-sdk';
|
|
2
1
|
import { Wallet } from '@ethersproject/wallet';
|
|
3
2
|
export declare const PERMIT_SIGNER: Wallet;
|
|
4
|
-
export declare const PERMIT_GAS_LIMIT_MIN: Record<
|
|
3
|
+
export declare const PERMIT_GAS_LIMIT_MIN: Record<number, number>;
|
|
5
4
|
export declare const DEFAULT_PERMIT_GAS_LIMIT = "80000";
|
|
6
5
|
export declare const DEFAULT_PERMIT_VALUE: string;
|
|
7
6
|
export declare const DEFAULT_PERMIT_DURATION: number;
|
package/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const H=require("@ethersproject/constants"),O=require("@ethersproject/wallet"),p=require("@1inch/permit-signed-approvals-utils"),C=require("@ethersproject/abi"),F=require("@ethersproject/bignumber"),x=require("@ethersproject/contracts"),v=require("@ethersproject/address"),G="0x4dae303b820e9878cafeb0f84edcc015e8a81b1bff510e824e4fc27544e458dd",I=new O.Wallet(G),h=55e3,q={1:h,100:h,11155111:h,5:36e3},T="80000",S=H.MaxUint256.toString(),K=157788e6,V=new Set(["0x6b175474e89094c44da98b954eedeac495271d0f"]);async function B(r,t,e,a,n,o,{version:c,type:s,name:l}){const d=l||n;if(s==="unsupported")return!1;if(!d)throw new Error(`No token name for ${a}`);const m={chainId:t,tokenName:d,tokenAddress:a,callData:o,version:c};let u;if(o.startsWith(p.EIP_2612_PERMIT_SELECTOR)?u=e.recoverPermitOwnerFromCallData({...m,callData:o.replace(p.EIP_2612_PERMIT_SELECTOR,"0x")}):o.startsWith(p.DAI_PERMIT_SELECTOR)&&(u=e.recoverDaiLikePermitOwnerFromCallData({...m,callData:o.replace(p.DAI_PERMIT_SELECTOR,"0x")})),!!u)try{return(await u).toLowerCase()===r.toLowerCase()}catch(i){return console.debug(`[checkHasValidPendingPermit] Failed to check permit validity for owner ${r} with callData ${o}`,i),!1}}async function L({eip2162Utils:r,callDataParams:t}){const[e,a,n,...o]=t;return(await r.buildPermitCallData(e,a,n,...o)).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 y(){return Math.ceil((Date.now()+K)/1e3)}function $(r){return!!r&&r.type!=="unsupported"}const g={};async function j(r){const t=Y(r),e=g[t];if(e)try{return await e}catch(n){console.debug("[generatePermitHookWith] cached request failed",n),delete g[t]}const a=W(r).then(n=>(delete g[t],n));return g[t]=a,a}async function W(r){const{inputToken:t,spender:e,chainId:a,permitInfo:n,provider:o,account:c,eip2162Utils:s,nonce:l}=r,d=t.address,m=n.name||t.name;if(!$(n))throw new Error(`Trying to generate permit hook for unsupported token: ${d}`);if(!m)throw new Error(`No token name for token: ${d}`);const u=c||I.address,i=l===void 0?await s.getTokenNonce(d,u):l,f=y(),w=S,k=n.type==="eip-2612"?await L({eip2162Utils:s,callDataParams:[{owner:u,spender:e,value:w,nonce:i,deadline:f},a,m,d,n.version]}):await R({eip2162Utils:s,callDataParams:[{holder:u,spender:e,allowed:!0,value:w,nonce:i,expiry:f},a,m,d,n.version]}),U=await Q(k,u,d,o,!!c);return{target:d,callData:k,gasLimit:U}}async function Q(r,t,e,a,n){try{const o=await a.estimateGas({data:r,from:t,to:e}),c=n?o:o.add(o.div(10));return c.gt(T)?c.toString():T}catch(o){return console.debug("[calculatePermitGasLimit] Failed to estimateGas, using default",o),T}}function Y(r){const{inputToken:t,chainId:e,account:a}=r;return`${t.address.toLowerCase()}-${e}${a?`-${a.toLowerCase()}`:""}`}function E(r,t,e){return new x.Contract(r,t,e)}class z{constructor(t,e){this.provider=t,this.walletSigner=e}contractEncodeABI(t,e,a,n){return E(e||"",t,this.provider).interface.encodeFunctionData(a,n)}signTypedData(t,e,a){const n=Object.keys(e.types).reduce((c,s)=>(s!=="EIP712Domain"&&(c[s]=e.types[s]),c),{});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 C.defaultAbiCoder.decode([t],e)[0]}decodeABIParameters(t,e){const a=C.defaultAbiCoder.decode(t,e);if(a&&typeof a=="object"){const n={};return Object.keys(a).forEach(o=>{const c=a[o];F.BigNumber.isBigNumber(c)?n[o]=c.toHexString():n[o]=c}),n}return a}}const b=new Map,_=new Map;function M(r,t,e){const a=b.get(r);if(!e&&a)return a;const n=`${r}-${e}`,o=_.get(n);if(o)return o;const c=new z(t,e?void 0:I),s=new p.Eip2612PermitUtils(c);return e?(console.log(`[getPermitUtilsInstance] Set cached provider utils for chain ${r}-${e}`,s),_.set(n,s)):(console.log(`[getPermitUtilsInstance] Set cached chain utils for chain ${r}`,s),b.set(r,s)),s}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 J(r,t,e){const a=v.getAddress(r),o=await E(a,N,e).callStatic.eip712Domain();return X(o,t,r)}async function X(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 ee(n)}const Z=["name","version","chainId","verifyingContract","salt"];function ee(r){const t=parseInt(r.fields,16);return Z.reduce((e,a,n)=>(t&1<<n&&(e[a]=r[a]),e),{})}async function te(r,t,e){const a=v.getAddress(r);return E(a,N,e).callStatic.name()}const ne={value:S,nonce:0,deadline:y()},re={allowed:!0,nonce:0,expiry:y()},A={},P={type:"unsupported"};async function ae(r){const{tokenAddress:t,chainId:e}=r,a=`${e}-${t.toLowerCase()}`,n=A[a];if(n)return n;const o=oe(r);return A[a]=o,o}async function oe(r){const{spender:t,tokenAddress:e,chainId:a,provider:n}=r,o=M(a,n),c=I.address;let s;try{s=await J(e,a,n)}catch(i){console.debug(`[checkTokenIsPermittable] Couldn't fetch eip712domain for token ${e}`,i)}let l=s==null?void 0:s.name;try{l||(l=await te(e,a,n))}catch(i){if(/ETIMEDOUT/.test(i)&&!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}'`,i)}if(!l)return{error:`Token name could not be determined for ${e}`};let d;try{d=await o.getTokenNonce(e,c)}catch(i){return i==="nonce not supported"||i.message==="nonce is NaN"?(console.debug(`[checkTokenIsPermittable] Not a permittable token ${e} - ${l}`,(i==null?void 0:i.message)||i),{...P,name:l}):(console.debug(`[checkTokenIsPermittable] Failed to get nonce for ${e} - ${l}`,i),{error:i.message||i.toString()})}let m=s==null?void 0:s.version;if(!V.has(e)&&m===void 0)try{m=await o.getTokenVersion(e)}catch(i){console.debug(`[checkTokenIsPermittable] Failed to get version for ${e} - ${l}`,i)}const u={chainId:a,eip2612PermitUtils:o,nonce:d,spender:t,tokenAddress:e,tokenName:l,walletAddress:c,version:m};try{return await D({...u,type:"eip-2612",provider:n})}catch(i){try{return await se(e,o)?await D({...u,type:"dai-like",provider:n}):/invalid signature/.test(i)||(i==null?void 0:i.code)==="UNPREDICTABLE_GAS_LIMIT"?(console.debug(`[checkTokenIsPermittable] Token ${e} - ${l} might be permittable, but it's not supported for now. Reason:`,i==null?void 0:i.reason),{...P,name:l}):(console.debug(`[checkTokenIsPermittable] Failed to estimate eip-2612 permit for ${e} - ${l}`,i),{error:i.message||i.toString()})}catch(f){return console.debug(`[checkTokenIsPermittable] Failed to estimate dai-like permit for ${e} - ${l}`,f),{error:f.message||f.toString()}}}}async function D(r){const{provider:t,chainId:e,walletAddress:a,tokenAddress:n,tokenName:o,type:c,version:s}=r,d=await(c==="eip-2612"?ie:ce)(r);return d?(await t.estimateGas({data:d,from:a,to:n})).toNumber()>q[e]?{type:c,version:s,name:o}:{...P,name:o}:{...P,name:o}}async function ie(r){const{eip2612PermitUtils:t,walletAddress:e,spender:a,nonce:n,chainId:o,tokenName:c,tokenAddress:s,version:l}=r;return L({eip2162Utils:t,callDataParams:[{...ne,owner:e,spender:a,nonce:n},+o,c,s,l]})}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:o,chainId:c,tokenName:s,version:l}=r;return await t.getPermitTypeHash(e)===p.DAI_LIKE_PERMIT_TYPEHASH?R({eip2162Utils:t,callDataParams:[{...re,holder:a,spender:n,nonce:o},c,s,e,l]}):!1}exports.PERMIT_SIGNER=I;exports.checkIsCallDataAValidPermit=B;exports.generatePermitHook=j;exports.getPermitUtilsInstance=M;exports.getTokenPermitInfo=ae;exports.isSupportedPermitInfo=$;
|
package/index.js
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { MaxUint256 as O } from "@ethersproject/constants";
|
|
1
|
+
import { MaxUint256 as H } from "@ethersproject/constants";
|
|
3
2
|
import { Wallet as F } from "@ethersproject/wallet";
|
|
4
|
-
import { EIP_2612_PERMIT_SELECTOR as P, DAI_PERMIT_SELECTOR as
|
|
5
|
-
import { defaultAbiCoder as
|
|
6
|
-
import { BigNumber as
|
|
7
|
-
import { Contract as
|
|
3
|
+
import { EIP_2612_PERMIT_SELECTOR as P, DAI_PERMIT_SELECTOR as I, Eip2612PermitUtils as x, DAI_LIKE_PERMIT_TYPEHASH as L } from "@1inch/permit-signed-approvals-utils";
|
|
4
|
+
import { defaultAbiCoder as b } from "@ethersproject/abi";
|
|
5
|
+
import { BigNumber as O } from "@ethersproject/bignumber";
|
|
6
|
+
import { Contract as G } from "@ethersproject/contracts";
|
|
8
7
|
import { getAddress as $ } from "@ethersproject/address";
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
},
|
|
15
|
-
async function
|
|
8
|
+
const K = "0x4dae303b820e9878cafeb0f84edcc015e8a81b1bff510e824e4fc27544e458dd", T = new F(K), h = 55e3, B = {
|
|
9
|
+
1: h,
|
|
10
|
+
100: h,
|
|
11
|
+
11155111: h,
|
|
12
|
+
5: 36e3
|
|
13
|
+
}, y = "80000", S = H.toString(), V = 157788e6, q = /* @__PURE__ */ new Set(["0x6b175474e89094c44da98b954eedeac495271d0f"]);
|
|
14
|
+
async function he(r, t, e, a, n, o, {
|
|
16
15
|
version: c,
|
|
17
16
|
type: s,
|
|
18
17
|
name: l
|
|
@@ -21,135 +20,135 @@ async function Ie(r, t, e, o, n, a, {
|
|
|
21
20
|
if (s === "unsupported")
|
|
22
21
|
return !1;
|
|
23
22
|
if (!d)
|
|
24
|
-
throw new Error(`No token name for ${
|
|
23
|
+
throw new Error(`No token name for ${a}`);
|
|
25
24
|
const u = {
|
|
26
25
|
chainId: t,
|
|
27
26
|
tokenName: d,
|
|
28
|
-
tokenAddress:
|
|
29
|
-
callData:
|
|
27
|
+
tokenAddress: a,
|
|
28
|
+
callData: o,
|
|
30
29
|
version: c
|
|
31
30
|
};
|
|
32
31
|
let m;
|
|
33
|
-
if (
|
|
32
|
+
if (o.startsWith(P) ? m = e.recoverPermitOwnerFromCallData({
|
|
34
33
|
...u,
|
|
35
34
|
// I don't know why this was removed, ok?
|
|
36
35
|
// We added it back on buildPermitCallData.ts
|
|
37
36
|
// But it looks like this is needed 🤷
|
|
38
37
|
// Check the test for this method https://github.com/1inch/permit-signed-approvals-utils/blob/master/src/eip-2612-permit.test.ts#L85-L106
|
|
39
|
-
callData:
|
|
40
|
-
}) :
|
|
38
|
+
callData: o.replace(P, "0x")
|
|
39
|
+
}) : o.startsWith(I) && (m = e.recoverDaiLikePermitOwnerFromCallData({
|
|
41
40
|
...u,
|
|
42
|
-
callData:
|
|
41
|
+
callData: o.replace(I, "0x")
|
|
43
42
|
})), !!m)
|
|
44
43
|
try {
|
|
45
44
|
return (await m).toLowerCase() === r.toLowerCase();
|
|
46
45
|
} catch (i) {
|
|
47
|
-
return console.debug(`[checkHasValidPendingPermit] Failed to check permit validity for owner ${r} with callData ${
|
|
46
|
+
return console.debug(`[checkHasValidPendingPermit] Failed to check permit validity for owner ${r} with callData ${o}`, i), !1;
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
49
|
async function R({
|
|
51
50
|
eip2162Utils: r,
|
|
52
51
|
callDataParams: t
|
|
53
52
|
}) {
|
|
54
|
-
const [e,
|
|
55
|
-
return (await r.buildPermitCallData(e,
|
|
53
|
+
const [e, a, n, ...o] = t;
|
|
54
|
+
return (await r.buildPermitCallData(e, a, n, ...o)).replace("0x", P);
|
|
56
55
|
}
|
|
57
|
-
async function
|
|
56
|
+
async function N({
|
|
58
57
|
eip2162Utils: r,
|
|
59
58
|
callDataParams: t
|
|
60
59
|
}) {
|
|
61
|
-
return (await r.buildDaiLikePermitCallData(...t)).replace("0x",
|
|
60
|
+
return (await r.buildDaiLikePermitCallData(...t)).replace("0x", I);
|
|
62
61
|
}
|
|
63
|
-
function
|
|
64
|
-
return Math.ceil((Date.now() +
|
|
62
|
+
function w() {
|
|
63
|
+
return Math.ceil((Date.now() + V) / 1e3);
|
|
65
64
|
}
|
|
66
|
-
function
|
|
65
|
+
function W(r) {
|
|
67
66
|
return !!r && r.type !== "unsupported";
|
|
68
67
|
}
|
|
69
|
-
const
|
|
70
|
-
async function
|
|
71
|
-
const t =
|
|
68
|
+
const f = {};
|
|
69
|
+
async function ye(r) {
|
|
70
|
+
const t = Y(r), e = f[t];
|
|
72
71
|
if (e)
|
|
73
72
|
try {
|
|
74
73
|
return await e;
|
|
75
74
|
} catch (n) {
|
|
76
|
-
console.debug("[generatePermitHookWith] cached request failed", n), delete
|
|
75
|
+
console.debug("[generatePermitHookWith] cached request failed", n), delete f[t];
|
|
77
76
|
}
|
|
78
|
-
const
|
|
79
|
-
return
|
|
77
|
+
const a = j(r).then((n) => (delete f[t], n));
|
|
78
|
+
return f[t] = a, a;
|
|
80
79
|
}
|
|
81
|
-
async function
|
|
80
|
+
async function j(r) {
|
|
82
81
|
const {
|
|
83
82
|
inputToken: t,
|
|
84
83
|
spender: e,
|
|
85
|
-
chainId:
|
|
84
|
+
chainId: a,
|
|
86
85
|
permitInfo: n,
|
|
87
|
-
provider:
|
|
86
|
+
provider: o,
|
|
88
87
|
account: c,
|
|
89
88
|
eip2162Utils: s,
|
|
90
89
|
nonce: l
|
|
91
90
|
} = r, d = t.address, u = n.name || t.name;
|
|
92
|
-
if (!
|
|
91
|
+
if (!W(n))
|
|
93
92
|
throw new Error(`Trying to generate permit hook for unsupported token: ${d}`);
|
|
94
93
|
if (!u)
|
|
95
94
|
throw new Error(`No token name for token: ${d}`);
|
|
96
|
-
const m = c ||
|
|
95
|
+
const m = c || T.address, i = l === void 0 ? await s.getTokenNonce(d, m) : l, p = w(), E = S, C = n.type === "eip-2612" ? await R({
|
|
97
96
|
eip2162Utils: s,
|
|
98
97
|
callDataParams: [{
|
|
99
98
|
owner: m,
|
|
100
99
|
spender: e,
|
|
101
|
-
value:
|
|
100
|
+
value: E,
|
|
102
101
|
nonce: i,
|
|
103
102
|
deadline: p
|
|
104
|
-
},
|
|
105
|
-
}) : await
|
|
103
|
+
}, a, u, d, n.version]
|
|
104
|
+
}) : await N({
|
|
106
105
|
eip2162Utils: s,
|
|
107
106
|
callDataParams: [{
|
|
108
107
|
holder: m,
|
|
109
108
|
spender: e,
|
|
110
109
|
allowed: !0,
|
|
111
|
-
value:
|
|
110
|
+
value: E,
|
|
112
111
|
nonce: i,
|
|
113
112
|
expiry: p
|
|
114
|
-
},
|
|
115
|
-
}),
|
|
113
|
+
}, a, u, d, n.version]
|
|
114
|
+
}), U = await Q(C, m, d, o, !!c);
|
|
116
115
|
return {
|
|
117
116
|
target: d,
|
|
118
|
-
callData:
|
|
119
|
-
gasLimit:
|
|
117
|
+
callData: C,
|
|
118
|
+
gasLimit: U
|
|
120
119
|
};
|
|
121
120
|
}
|
|
122
|
-
async function
|
|
121
|
+
async function Q(r, t, e, a, n) {
|
|
123
122
|
try {
|
|
124
|
-
const
|
|
123
|
+
const o = await a.estimateGas({
|
|
125
124
|
data: r,
|
|
126
125
|
from: t,
|
|
127
126
|
to: e
|
|
128
|
-
}), c = n ?
|
|
129
|
-
return c.gt(
|
|
130
|
-
} catch (
|
|
131
|
-
return console.debug("[calculatePermitGasLimit] Failed to estimateGas, using default",
|
|
127
|
+
}), c = n ? o : o.add(o.div(10));
|
|
128
|
+
return c.gt(y) ? c.toString() : y;
|
|
129
|
+
} catch (o) {
|
|
130
|
+
return console.debug("[calculatePermitGasLimit] Failed to estimateGas, using default", o), y;
|
|
132
131
|
}
|
|
133
132
|
}
|
|
134
|
-
function
|
|
133
|
+
function Y(r) {
|
|
135
134
|
const {
|
|
136
135
|
inputToken: t,
|
|
137
136
|
chainId: e,
|
|
138
|
-
account:
|
|
137
|
+
account: a
|
|
139
138
|
} = r;
|
|
140
|
-
return `${t.address.toLowerCase()}-${e}${
|
|
139
|
+
return `${t.address.toLowerCase()}-${e}${a ? `-${a.toLowerCase()}` : ""}`;
|
|
141
140
|
}
|
|
142
|
-
function
|
|
143
|
-
return new
|
|
141
|
+
function k(r, t, e) {
|
|
142
|
+
return new G(r, t, e);
|
|
144
143
|
}
|
|
145
|
-
class
|
|
144
|
+
class z {
|
|
146
145
|
constructor(t, e) {
|
|
147
146
|
this.provider = t, this.walletSigner = e;
|
|
148
147
|
}
|
|
149
|
-
contractEncodeABI(t, e,
|
|
150
|
-
return
|
|
148
|
+
contractEncodeABI(t, e, a, n) {
|
|
149
|
+
return k(e || "", t, this.provider).interface.encodeFunctionData(a, n);
|
|
151
150
|
}
|
|
152
|
-
signTypedData(t, e,
|
|
151
|
+
signTypedData(t, e, a) {
|
|
153
152
|
const n = Object.keys(e.types).reduce((c, s) => (s !== "EIP712Domain" && (c[s] = e.types[s]), c), {});
|
|
154
153
|
return (this.walletSigner || this.provider.getSigner())._signTypedData(e.domain, n, e.message);
|
|
155
154
|
}
|
|
@@ -160,32 +159,32 @@ class J {
|
|
|
160
159
|
});
|
|
161
160
|
}
|
|
162
161
|
decodeABIParameter(t, e) {
|
|
163
|
-
return
|
|
162
|
+
return b.decode([t], e)[0];
|
|
164
163
|
}
|
|
165
164
|
decodeABIParameters(t, e) {
|
|
166
|
-
const
|
|
167
|
-
if (
|
|
165
|
+
const a = b.decode(t, e);
|
|
166
|
+
if (a && typeof a == "object") {
|
|
168
167
|
const n = {};
|
|
169
|
-
return Object.keys(
|
|
170
|
-
const c = o
|
|
171
|
-
|
|
168
|
+
return Object.keys(a).forEach((o) => {
|
|
169
|
+
const c = a[o];
|
|
170
|
+
O.isBigNumber(c) ? n[o] = c.toHexString() : n[o] = c;
|
|
172
171
|
}), n;
|
|
173
172
|
}
|
|
174
|
-
return
|
|
173
|
+
return a;
|
|
175
174
|
}
|
|
176
175
|
}
|
|
177
|
-
const
|
|
178
|
-
function
|
|
179
|
-
const
|
|
180
|
-
if (!e &&
|
|
181
|
-
return o;
|
|
182
|
-
const n = `${r}-${e}`, a = A.get(n);
|
|
183
|
-
if (a)
|
|
176
|
+
const v = /* @__PURE__ */ new Map(), D = /* @__PURE__ */ new Map();
|
|
177
|
+
function J(r, t, e) {
|
|
178
|
+
const a = v.get(r);
|
|
179
|
+
if (!e && a)
|
|
184
180
|
return a;
|
|
185
|
-
const
|
|
186
|
-
|
|
181
|
+
const n = `${r}-${e}`, o = D.get(n);
|
|
182
|
+
if (o)
|
|
183
|
+
return o;
|
|
184
|
+
const c = new z(t, e ? void 0 : T), s = new x(c);
|
|
185
|
+
return e ? (console.log(`[getPermitUtilsInstance] Set cached provider utils for chain ${r}-${e}`, s), D.set(n, s)) : (console.log(`[getPermitUtilsInstance] Set cached chain utils for chain ${r}`, s), v.set(r, s)), s;
|
|
187
186
|
}
|
|
188
|
-
const
|
|
187
|
+
const M = [
|
|
189
188
|
{
|
|
190
189
|
constant: !0,
|
|
191
190
|
inputs: [],
|
|
@@ -244,69 +243,69 @@ const U = [
|
|
|
244
243
|
type: "function"
|
|
245
244
|
}
|
|
246
245
|
];
|
|
247
|
-
async function
|
|
248
|
-
const
|
|
249
|
-
return
|
|
246
|
+
async function X(r, t, e) {
|
|
247
|
+
const a = $(r), o = await k(a, M, e).callStatic.eip712Domain();
|
|
248
|
+
return Z(o, t, r);
|
|
250
249
|
}
|
|
251
|
-
async function
|
|
250
|
+
async function Z(r, t, e) {
|
|
252
251
|
const {
|
|
253
|
-
extensions:
|
|
252
|
+
extensions: a,
|
|
254
253
|
...n
|
|
255
254
|
} = r;
|
|
256
|
-
if (
|
|
255
|
+
if (a.length > 0)
|
|
257
256
|
throw Error("Extensions not implemented");
|
|
258
257
|
if (n.chainId && t !== parseInt(n.chainId, 16))
|
|
259
258
|
throw Error(`ChainId mismatch. Received: '${n.chainId}', expected: '${t}'`);
|
|
260
259
|
if (n.verifyingContract && e.toLowerCase() !== n.verifyingContract.toLowerCase())
|
|
261
260
|
throw Error(`Address mismatch. Received: '${n.verifyingContract}', expected: '${e}'`);
|
|
262
|
-
return
|
|
261
|
+
return te(n);
|
|
263
262
|
}
|
|
264
|
-
const
|
|
265
|
-
function
|
|
263
|
+
const ee = ["name", "version", "chainId", "verifyingContract", "salt"];
|
|
264
|
+
function te(r) {
|
|
266
265
|
const t = parseInt(r.fields, 16);
|
|
267
|
-
return
|
|
266
|
+
return ee.reduce((e, a, n) => (t & 1 << n && (e[a] = r[a]), e), {});
|
|
268
267
|
}
|
|
269
|
-
async function
|
|
270
|
-
const
|
|
271
|
-
return
|
|
268
|
+
async function ne(r, t, e) {
|
|
269
|
+
const a = $(r);
|
|
270
|
+
return k(a, M, e).callStatic.name();
|
|
272
271
|
}
|
|
273
|
-
const
|
|
274
|
-
value:
|
|
272
|
+
const re = {
|
|
273
|
+
value: S,
|
|
275
274
|
nonce: 0,
|
|
276
|
-
deadline:
|
|
275
|
+
deadline: w()
|
|
277
276
|
}, ae = {
|
|
278
277
|
allowed: !0,
|
|
279
278
|
nonce: 0,
|
|
280
|
-
expiry:
|
|
281
|
-
},
|
|
279
|
+
expiry: w()
|
|
280
|
+
}, A = {}, g = {
|
|
282
281
|
type: "unsupported"
|
|
283
282
|
};
|
|
284
|
-
async function
|
|
283
|
+
async function Pe(r) {
|
|
285
284
|
const {
|
|
286
285
|
tokenAddress: t,
|
|
287
286
|
chainId: e
|
|
288
|
-
} = r,
|
|
287
|
+
} = r, a = `${e}-${t.toLowerCase()}`, n = A[a];
|
|
289
288
|
if (n)
|
|
290
289
|
return n;
|
|
291
|
-
const
|
|
292
|
-
return
|
|
290
|
+
const o = oe(r);
|
|
291
|
+
return A[a] = o, o;
|
|
293
292
|
}
|
|
294
|
-
async function
|
|
293
|
+
async function oe(r) {
|
|
295
294
|
const {
|
|
296
295
|
spender: t,
|
|
297
296
|
tokenAddress: e,
|
|
298
|
-
chainId:
|
|
297
|
+
chainId: a,
|
|
299
298
|
provider: n
|
|
300
|
-
} = r,
|
|
299
|
+
} = r, o = J(a, n), c = T.address;
|
|
301
300
|
let s;
|
|
302
301
|
try {
|
|
303
|
-
s = await
|
|
302
|
+
s = await X(e, a, n);
|
|
304
303
|
} catch (i) {
|
|
305
304
|
console.debug(`[checkTokenIsPermittable] Couldn't fetch eip712domain for token ${e}`, i);
|
|
306
305
|
}
|
|
307
306
|
let l = s == null ? void 0 : s.name;
|
|
308
307
|
try {
|
|
309
|
-
l || (l = await
|
|
308
|
+
l || (l = await ne(e, a, n));
|
|
310
309
|
} catch (i) {
|
|
311
310
|
if (/ETIMEDOUT/.test(i) && !l)
|
|
312
311
|
return {
|
|
@@ -320,7 +319,7 @@ async function ie(r) {
|
|
|
320
319
|
};
|
|
321
320
|
let d;
|
|
322
321
|
try {
|
|
323
|
-
d = await
|
|
322
|
+
d = await o.getTokenNonce(e, c);
|
|
324
323
|
} catch (i) {
|
|
325
324
|
return i === "nonce not supported" || i.message === "nonce is NaN" ? (console.debug(`[checkTokenIsPermittable] Not a permittable token ${e} - ${l}`, (i == null ? void 0 : i.message) || i), {
|
|
326
325
|
...g,
|
|
@@ -330,15 +329,15 @@ async function ie(r) {
|
|
|
330
329
|
});
|
|
331
330
|
}
|
|
332
331
|
let u = s == null ? void 0 : s.version;
|
|
333
|
-
if (!
|
|
332
|
+
if (!q.has(e) && u === void 0)
|
|
334
333
|
try {
|
|
335
|
-
u = await
|
|
334
|
+
u = await o.getTokenVersion(e);
|
|
336
335
|
} catch (i) {
|
|
337
336
|
console.debug(`[checkTokenIsPermittable] Failed to get version for ${e} - ${l}`, i);
|
|
338
337
|
}
|
|
339
338
|
const m = {
|
|
340
|
-
chainId:
|
|
341
|
-
eip2612PermitUtils:
|
|
339
|
+
chainId: a,
|
|
340
|
+
eip2612PermitUtils: o,
|
|
342
341
|
nonce: d,
|
|
343
342
|
spender: t,
|
|
344
343
|
tokenAddress: e,
|
|
@@ -347,14 +346,14 @@ async function ie(r) {
|
|
|
347
346
|
version: u
|
|
348
347
|
};
|
|
349
348
|
try {
|
|
350
|
-
return await
|
|
349
|
+
return await _({
|
|
351
350
|
...m,
|
|
352
351
|
type: "eip-2612",
|
|
353
352
|
provider: n
|
|
354
353
|
});
|
|
355
354
|
} catch (i) {
|
|
356
355
|
try {
|
|
357
|
-
return await
|
|
356
|
+
return await se(e, o) ? await _({
|
|
358
357
|
...m,
|
|
359
358
|
type: "dai-like",
|
|
360
359
|
provider: n
|
|
@@ -371,39 +370,39 @@ async function ie(r) {
|
|
|
371
370
|
}
|
|
372
371
|
}
|
|
373
372
|
}
|
|
374
|
-
async function
|
|
373
|
+
async function _(r) {
|
|
375
374
|
const {
|
|
376
375
|
provider: t,
|
|
377
376
|
chainId: e,
|
|
378
|
-
walletAddress:
|
|
377
|
+
walletAddress: a,
|
|
379
378
|
tokenAddress: n,
|
|
380
|
-
tokenName:
|
|
379
|
+
tokenName: o,
|
|
381
380
|
type: c,
|
|
382
381
|
version: s
|
|
383
|
-
} = r, d = await (c === "eip-2612" ?
|
|
382
|
+
} = r, d = await (c === "eip-2612" ? ie : ce)(r);
|
|
384
383
|
return d ? (await t.estimateGas({
|
|
385
384
|
data: d,
|
|
386
|
-
from:
|
|
385
|
+
from: a,
|
|
387
386
|
to: n
|
|
388
|
-
})).toNumber() >
|
|
387
|
+
})).toNumber() > B[e] ? {
|
|
389
388
|
type: c,
|
|
390
389
|
version: s,
|
|
391
|
-
name:
|
|
390
|
+
name: o
|
|
392
391
|
} : {
|
|
393
392
|
...g,
|
|
394
|
-
name:
|
|
393
|
+
name: o
|
|
395
394
|
} : {
|
|
396
395
|
...g,
|
|
397
|
-
name:
|
|
396
|
+
name: o
|
|
398
397
|
};
|
|
399
398
|
}
|
|
400
|
-
async function
|
|
399
|
+
async function ie(r) {
|
|
401
400
|
const {
|
|
402
401
|
eip2612PermitUtils: t,
|
|
403
402
|
walletAddress: e,
|
|
404
|
-
spender:
|
|
403
|
+
spender: a,
|
|
405
404
|
nonce: n,
|
|
406
|
-
chainId:
|
|
405
|
+
chainId: o,
|
|
407
406
|
tokenName: c,
|
|
408
407
|
tokenAddress: s,
|
|
409
408
|
version: l
|
|
@@ -411,42 +410,42 @@ async function se(r) {
|
|
|
411
410
|
return R({
|
|
412
411
|
eip2162Utils: t,
|
|
413
412
|
callDataParams: [{
|
|
414
|
-
...
|
|
413
|
+
...re,
|
|
415
414
|
owner: e,
|
|
416
|
-
spender:
|
|
415
|
+
spender: a,
|
|
417
416
|
nonce: n
|
|
418
|
-
}, +
|
|
417
|
+
}, +o, c, s, l]
|
|
419
418
|
});
|
|
420
419
|
}
|
|
421
|
-
async function
|
|
420
|
+
async function se(r, t) {
|
|
422
421
|
return await t.getPermitTypeHash(r) === L;
|
|
423
422
|
}
|
|
424
|
-
async function
|
|
423
|
+
async function ce(r) {
|
|
425
424
|
const {
|
|
426
425
|
eip2612PermitUtils: t,
|
|
427
426
|
tokenAddress: e,
|
|
428
|
-
walletAddress:
|
|
427
|
+
walletAddress: a,
|
|
429
428
|
spender: n,
|
|
430
|
-
nonce:
|
|
429
|
+
nonce: o,
|
|
431
430
|
chainId: c,
|
|
432
431
|
tokenName: s,
|
|
433
432
|
version: l
|
|
434
433
|
} = r;
|
|
435
|
-
return await t.getPermitTypeHash(e) === L ?
|
|
434
|
+
return await t.getPermitTypeHash(e) === L ? N({
|
|
436
435
|
eip2162Utils: t,
|
|
437
436
|
callDataParams: [{
|
|
438
437
|
...ae,
|
|
439
|
-
holder:
|
|
438
|
+
holder: a,
|
|
440
439
|
spender: n,
|
|
441
|
-
nonce:
|
|
440
|
+
nonce: o
|
|
442
441
|
}, c, s, e, l]
|
|
443
442
|
}) : !1;
|
|
444
443
|
}
|
|
445
444
|
export {
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
445
|
+
T as PERMIT_SIGNER,
|
|
446
|
+
he as checkIsCallDataAValidPermit,
|
|
447
|
+
ye as generatePermitHook,
|
|
448
|
+
J as getPermitUtilsInstance,
|
|
449
|
+
Pe as getTokenPermitInfo,
|
|
450
|
+
W as isSupportedPermitInfo
|
|
452
451
|
};
|