@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 +1 -0
- package/index.cjs +1 -1
- package/index.d.ts +2 -2
- package/index.js +109 -109
- package/lib/checkIsCallDataAValidPermit.d.ts +2 -1
- package/lib/generatePermitHook.d.ts +2 -1
- package/lib/getPermitUtilsInstance.d.ts +2 -1
- package/lib/getTokenPermitInfo.d.ts +1 -0
- package/package.json +1 -1
- package/types.d.ts +2 -1
- package/utils/PermitProviderConnector.d.ts +2 -1
- package/utils/buildPermitCallData.d.ts +1 -0
- package/utils/getContract.d.ts +2 -1
- package/utils/getEip712Domain.d.ts +2 -1
- package/utils/getTokenName.d.ts +2 -1
- package/utils/getTokenPermitVersion.d.ts +2 -1
- package/utils/isSupportedPermitInfo.d.ts +1 -0
package/const.d.ts
CHANGED
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"),
|
|
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 {
|
|
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
|
|
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,
|
|
9
|
-
async function ye(r,
|
|
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 ||
|
|
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:
|
|
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:
|
|
46
|
+
callDataParams: t
|
|
47
47
|
}) {
|
|
48
|
-
const [e, a,
|
|
49
|
-
return (await r.buildPermitCallData(e, a,
|
|
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:
|
|
53
|
+
callDataParams: t
|
|
54
54
|
}) {
|
|
55
|
-
return (await r.buildDaiLikePermitCallData(...
|
|
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
|
|
60
|
+
function q(r) {
|
|
61
61
|
return !!r && r.type !== "unsupported";
|
|
62
62
|
}
|
|
63
|
-
const
|
|
63
|
+
const P = {};
|
|
64
64
|
async function he(r) {
|
|
65
|
-
const
|
|
65
|
+
const t = Q(r), e = P[t];
|
|
66
66
|
if (e)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
return
|
|
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
|
|
75
|
+
async function W(r) {
|
|
76
76
|
const {
|
|
77
|
-
inputToken:
|
|
77
|
+
inputToken: t,
|
|
78
78
|
spender: e,
|
|
79
79
|
chainId: a,
|
|
80
|
-
permitInfo:
|
|
80
|
+
permitInfo: n,
|
|
81
81
|
provider: o,
|
|
82
82
|
account: i,
|
|
83
83
|
eip2162Utils: l,
|
|
84
84
|
nonce: u
|
|
85
|
-
} = r, c =
|
|
86
|
-
if (!
|
|
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 =
|
|
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,
|
|
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,
|
|
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,
|
|
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:
|
|
120
|
+
from: t,
|
|
121
121
|
to: e
|
|
122
|
-
}), i =
|
|
123
|
-
return i.gt(
|
|
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),
|
|
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:
|
|
130
|
+
inputToken: t,
|
|
131
131
|
chainId: e,
|
|
132
132
|
account: a
|
|
133
133
|
} = r;
|
|
134
|
-
return `${
|
|
134
|
+
return `${t.address.toLowerCase()}-${e}${a ? `-${a.toLowerCase()}` : ""}`;
|
|
135
135
|
}
|
|
136
|
-
function
|
|
137
|
-
return new G(r,
|
|
136
|
+
function y(r, t, e) {
|
|
137
|
+
return new G(r, t, e);
|
|
138
138
|
}
|
|
139
139
|
class Y {
|
|
140
|
-
constructor(
|
|
141
|
-
this.provider =
|
|
140
|
+
constructor(t, e) {
|
|
141
|
+
this.provider = t, this.walletSigner = e;
|
|
142
142
|
}
|
|
143
|
-
contractEncodeABI(
|
|
144
|
-
return
|
|
143
|
+
contractEncodeABI(t, e, a, n) {
|
|
144
|
+
return y(e || "", t, this.provider).interface.encodeFunctionData(a, n);
|
|
145
145
|
}
|
|
146
|
-
signTypedData(
|
|
147
|
-
const
|
|
148
|
-
return (this.walletSigner || this.provider.getSigner())._signTypedData(e.domain,
|
|
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(
|
|
150
|
+
ethCall(t, e) {
|
|
151
151
|
return this.provider.call({
|
|
152
|
-
to:
|
|
152
|
+
to: t,
|
|
153
153
|
data: e
|
|
154
154
|
});
|
|
155
155
|
}
|
|
156
|
-
decodeABIParameter(
|
|
157
|
-
return T.decode([
|
|
156
|
+
decodeABIParameter(t, e) {
|
|
157
|
+
return T.decode([t], e)[0];
|
|
158
158
|
}
|
|
159
|
-
decodeABIParameters(
|
|
160
|
-
const a = T.decode(
|
|
159
|
+
decodeABIParameters(t, e) {
|
|
160
|
+
const a = T.decode(t, e);
|
|
161
161
|
if (a && typeof a == "object") {
|
|
162
|
-
const
|
|
162
|
+
const n = {};
|
|
163
163
|
return Object.keys(a).forEach((o) => {
|
|
164
164
|
const i = a[o];
|
|
165
|
-
O.isBigNumber(i) ?
|
|
166
|
-
}),
|
|
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,
|
|
172
|
+
function z(r, t, e) {
|
|
173
173
|
const a = C.get(r);
|
|
174
174
|
if (!e && a)
|
|
175
175
|
return a;
|
|
176
|
-
const
|
|
176
|
+
const n = `${r}-${e}`, o = v.get(n);
|
|
177
177
|
if (o)
|
|
178
178
|
return o;
|
|
179
|
-
const i = new Y(
|
|
180
|
-
return e ? (console.log(`[getPermitUtilsInstance] Set cached provider utils for chain ${r}-${e}`, l), v.set(
|
|
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,
|
|
242
|
-
const a = L(r), o = await
|
|
243
|
-
return X(o,
|
|
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,
|
|
245
|
+
async function X(r, t, e) {
|
|
246
246
|
const {
|
|
247
247
|
extensions: a,
|
|
248
|
-
...
|
|
248
|
+
...n
|
|
249
249
|
} = r;
|
|
250
250
|
if (a.length > 0)
|
|
251
251
|
throw Error("Extensions not implemented");
|
|
252
|
-
if (
|
|
253
|
-
throw Error(`ChainId mismatch. Received: '${
|
|
254
|
-
if (
|
|
255
|
-
throw Error(`Address mismatch. Received: '${
|
|
256
|
-
return ee(
|
|
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
|
|
261
|
-
return Z.reduce((e, a,
|
|
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,
|
|
263
|
+
async function te(r, t, e) {
|
|
264
264
|
const a = L(r);
|
|
265
|
-
return
|
|
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,
|
|
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 =
|
|
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,
|
|
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 = {},
|
|
312
|
+
}, D = {}, g = {
|
|
313
313
|
type: "unsupported"
|
|
314
314
|
};
|
|
315
315
|
async function Pe(r) {
|
|
316
316
|
const {
|
|
317
|
-
tokenAddress:
|
|
317
|
+
tokenAddress: t,
|
|
318
318
|
chainId: e
|
|
319
|
-
} = r, a = `${e}-${
|
|
320
|
-
if (
|
|
321
|
-
return
|
|
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:
|
|
327
|
+
spender: t,
|
|
328
328
|
tokenAddress: e,
|
|
329
329
|
chainId: a,
|
|
330
|
-
provider:
|
|
330
|
+
provider: n,
|
|
331
331
|
minGasLimit: o
|
|
332
|
-
} = r, i = z(a,
|
|
332
|
+
} = r, i = z(a, n), l = b.address;
|
|
333
333
|
let u;
|
|
334
334
|
try {
|
|
335
|
-
u = await J(e, a,
|
|
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,
|
|
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
|
-
...
|
|
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,
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
...
|
|
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:
|
|
409
|
+
provider: t,
|
|
410
410
|
walletAddress: e,
|
|
411
411
|
tokenAddress: a,
|
|
412
|
-
tokenName:
|
|
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
|
|
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:
|
|
424
|
+
name: n
|
|
425
425
|
} : {
|
|
426
|
-
...
|
|
427
|
-
name:
|
|
426
|
+
...g,
|
|
427
|
+
name: n
|
|
428
428
|
} : {
|
|
429
|
-
...
|
|
430
|
-
name:
|
|
429
|
+
...g,
|
|
430
|
+
name: n
|
|
431
431
|
};
|
|
432
432
|
}
|
|
433
433
|
async function ie(r) {
|
|
434
434
|
const {
|
|
435
|
-
eip2612PermitUtils:
|
|
435
|
+
eip2612PermitUtils: t,
|
|
436
436
|
walletAddress: e,
|
|
437
437
|
spender: a,
|
|
438
|
-
nonce:
|
|
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:
|
|
445
|
+
eip2162Utils: t,
|
|
446
446
|
callDataParams: [{
|
|
447
447
|
...re,
|
|
448
448
|
owner: e,
|
|
449
449
|
spender: a,
|
|
450
|
-
nonce:
|
|
450
|
+
nonce: n
|
|
451
451
|
}, +o, i, l, u]
|
|
452
452
|
});
|
|
453
453
|
}
|
|
454
|
-
async function se(r,
|
|
455
|
-
return await
|
|
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:
|
|
459
|
+
eip2612PermitUtils: t,
|
|
460
460
|
tokenAddress: e,
|
|
461
461
|
walletAddress: a,
|
|
462
|
-
spender:
|
|
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
|
|
469
|
-
eip2162Utils:
|
|
468
|
+
return await t.getPermitTypeHash(e) === _ ? N({
|
|
469
|
+
eip2162Utils: t,
|
|
470
470
|
callDataParams: [{
|
|
471
471
|
...ae,
|
|
472
472
|
holder: a,
|
|
473
|
-
spender:
|
|
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
|
-
|
|
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,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;
|
package/package.json
CHANGED
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>;
|
package/utils/getContract.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import
|
|
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
|
|
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;
|
package/utils/getTokenName.d.ts
CHANGED