@ring-protocol/permit2-sdk 0.1.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/LICENSE +21 -0
- package/README.md +12 -0
- package/dist/cjs/abis/Permit2.json +830 -0
- package/dist/cjs/src/allowanceTransfer.d.ts +36 -0
- package/dist/cjs/src/allowanceTransfer.js +72 -0
- package/dist/cjs/src/allowanceTransfer.js.map +1 -0
- package/dist/cjs/src/allowanceTransfer.test.d.ts +1 -0
- package/dist/cjs/src/allowanceTransfer.test.js +95 -0
- package/dist/cjs/src/allowanceTransfer.test.js.map +1 -0
- package/dist/cjs/src/constants.d.ts +13 -0
- package/dist/cjs/src/constants.js +29 -0
- package/dist/cjs/src/constants.js.map +1 -0
- package/dist/cjs/src/constants.test.d.ts +1 -0
- package/dist/cjs/src/constants.test.js +19 -0
- package/dist/cjs/src/constants.test.js.map +1 -0
- package/dist/cjs/src/domain.d.ts +7 -0
- package/dist/cjs/src/domain.js +13 -0
- package/dist/cjs/src/domain.js.map +1 -0
- package/dist/cjs/src/index.d.ts +4 -0
- package/dist/cjs/src/index.js +8 -0
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/src/providers/AllowanceProvider.d.ts +17 -0
- package/dist/cjs/src/providers/AllowanceProvider.js +35 -0
- package/dist/cjs/src/providers/AllowanceProvider.js.map +1 -0
- package/dist/cjs/src/providers/SignatureProvider.d.ts +74 -0
- package/dist/cjs/src/providers/SignatureProvider.js +146 -0
- package/dist/cjs/src/providers/SignatureProvider.js.map +1 -0
- package/dist/cjs/src/providers/SignatureProvider.test.d.ts +1 -0
- package/dist/cjs/src/providers/SignatureProvider.test.js +247 -0
- package/dist/cjs/src/providers/SignatureProvider.test.js.map +1 -0
- package/dist/cjs/src/providers/index.d.ts +2 -0
- package/dist/cjs/src/providers/index.js +6 -0
- package/dist/cjs/src/providers/index.js.map +1 -0
- package/dist/cjs/src/signatureTransfer.d.ts +41 -0
- package/dist/cjs/src/signatureTransfer.js +93 -0
- package/dist/cjs/src/signatureTransfer.js.map +1 -0
- package/dist/cjs/src/signatureTransfer.test.d.ts +1 -0
- package/dist/cjs/src/signatureTransfer.test.js +109 -0
- package/dist/cjs/src/signatureTransfer.test.js.map +1 -0
- package/dist/esm/abis/Permit2.json +830 -0
- package/dist/esm/src/allowanceTransfer.d.ts +36 -0
- package/dist/esm/src/allowanceTransfer.js +67 -0
- package/dist/esm/src/allowanceTransfer.js.map +1 -0
- package/dist/esm/src/allowanceTransfer.test.d.ts +1 -0
- package/dist/esm/src/allowanceTransfer.test.js +93 -0
- package/dist/esm/src/allowanceTransfer.test.js.map +1 -0
- package/dist/esm/src/constants.d.ts +13 -0
- package/dist/esm/src/constants.js +25 -0
- package/dist/esm/src/constants.js.map +1 -0
- package/dist/esm/src/constants.test.d.ts +1 -0
- package/dist/esm/src/constants.test.js +17 -0
- package/dist/esm/src/constants.test.js.map +1 -0
- package/dist/esm/src/domain.d.ts +7 -0
- package/dist/esm/src/domain.js +9 -0
- package/dist/esm/src/domain.js.map +1 -0
- package/dist/esm/src/index.d.ts +4 -0
- package/dist/esm/src/index.js +5 -0
- package/dist/esm/src/index.js.map +1 -0
- package/dist/esm/src/providers/AllowanceProvider.d.ts +17 -0
- package/dist/esm/src/providers/AllowanceProvider.js +31 -0
- package/dist/esm/src/providers/AllowanceProvider.js.map +1 -0
- package/dist/esm/src/providers/SignatureProvider.d.ts +74 -0
- package/dist/esm/src/providers/SignatureProvider.js +142 -0
- package/dist/esm/src/providers/SignatureProvider.js.map +1 -0
- package/dist/esm/src/providers/SignatureProvider.test.d.ts +1 -0
- package/dist/esm/src/providers/SignatureProvider.test.js +245 -0
- package/dist/esm/src/providers/SignatureProvider.test.js.map +1 -0
- package/dist/esm/src/providers/index.d.ts +2 -0
- package/dist/esm/src/providers/index.js +3 -0
- package/dist/esm/src/providers/index.js.map +1 -0
- package/dist/esm/src/signatureTransfer.d.ts +41 -0
- package/dist/esm/src/signatureTransfer.js +88 -0
- package/dist/esm/src/signatureTransfer.js.map +1 -0
- package/dist/esm/src/signatureTransfer.test.d.ts +1 -0
- package/dist/esm/src/signatureTransfer.test.js +107 -0
- package/dist/esm/src/signatureTransfer.test.js.map +1 -0
- package/dist/types/src/allowanceTransfer.d.ts +36 -0
- package/dist/types/src/allowanceTransfer.test.d.ts +1 -0
- package/dist/types/src/constants.d.ts +13 -0
- package/dist/types/src/constants.test.d.ts +1 -0
- package/dist/types/src/domain.d.ts +7 -0
- package/dist/types/src/index.d.ts +4 -0
- package/dist/types/src/providers/AllowanceProvider.d.ts +17 -0
- package/dist/types/src/providers/SignatureProvider.d.ts +74 -0
- package/dist/types/src/providers/SignatureProvider.test.d.ts +1 -0
- package/dist/types/src/providers/index.d.ts +2 -0
- package/dist/types/src/signatureTransfer.d.ts +41 -0
- package/dist/types/src/signatureTransfer.test.d.ts +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { TypedDataDomain, TypedDataField } from '@ethersproject/abstract-signer';
|
|
2
|
+
import { BigNumberish } from '@ethersproject/bignumber';
|
|
3
|
+
export interface PermitDetails {
|
|
4
|
+
token: string;
|
|
5
|
+
amount: BigNumberish;
|
|
6
|
+
expiration: BigNumberish;
|
|
7
|
+
nonce: BigNumberish;
|
|
8
|
+
}
|
|
9
|
+
export interface PermitSingle {
|
|
10
|
+
details: PermitDetails;
|
|
11
|
+
spender: string;
|
|
12
|
+
sigDeadline: BigNumberish;
|
|
13
|
+
}
|
|
14
|
+
export interface PermitBatch {
|
|
15
|
+
details: PermitDetails[];
|
|
16
|
+
spender: string;
|
|
17
|
+
sigDeadline: BigNumberish;
|
|
18
|
+
}
|
|
19
|
+
export type PermitSingleData = {
|
|
20
|
+
domain: TypedDataDomain;
|
|
21
|
+
types: Record<string, TypedDataField[]>;
|
|
22
|
+
values: PermitSingle;
|
|
23
|
+
};
|
|
24
|
+
export type PermitBatchData = {
|
|
25
|
+
domain: TypedDataDomain;
|
|
26
|
+
types: Record<string, TypedDataField[]>;
|
|
27
|
+
values: PermitBatch;
|
|
28
|
+
};
|
|
29
|
+
export declare abstract class AllowanceTransfer {
|
|
30
|
+
/**
|
|
31
|
+
* Cannot be constructed.
|
|
32
|
+
*/
|
|
33
|
+
private constructor();
|
|
34
|
+
static getPermitData(permit: PermitSingle | PermitBatch, permit2Address: string, chainId: number): PermitSingleData | PermitBatchData;
|
|
35
|
+
static hash(permit: PermitSingle | PermitBatch, permit2Address: string, chainId: number): string;
|
|
36
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import invariant from 'tiny-invariant';
|
|
2
|
+
import { _TypedDataEncoder } from '@ethersproject/hash';
|
|
3
|
+
import { MaxSigDeadline, MaxOrderedNonce, MaxAllowanceTransferAmount, MaxAllowanceExpiration } from './constants';
|
|
4
|
+
import { permit2Domain } from './domain';
|
|
5
|
+
const PERMIT_DETAILS = [
|
|
6
|
+
{ name: 'token', type: 'address' },
|
|
7
|
+
{ name: 'amount', type: 'uint160' },
|
|
8
|
+
{ name: 'expiration', type: 'uint48' },
|
|
9
|
+
{ name: 'nonce', type: 'uint48' },
|
|
10
|
+
];
|
|
11
|
+
const PERMIT_TYPES = {
|
|
12
|
+
PermitSingle: [
|
|
13
|
+
{ name: 'details', type: 'PermitDetails' },
|
|
14
|
+
{ name: 'spender', type: 'address' },
|
|
15
|
+
{ name: 'sigDeadline', type: 'uint256' },
|
|
16
|
+
],
|
|
17
|
+
PermitDetails: PERMIT_DETAILS,
|
|
18
|
+
};
|
|
19
|
+
const PERMIT_BATCH_TYPES = {
|
|
20
|
+
PermitBatch: [
|
|
21
|
+
{ name: 'details', type: 'PermitDetails[]' },
|
|
22
|
+
{ name: 'spender', type: 'address' },
|
|
23
|
+
{ name: 'sigDeadline', type: 'uint256' },
|
|
24
|
+
],
|
|
25
|
+
PermitDetails: PERMIT_DETAILS,
|
|
26
|
+
};
|
|
27
|
+
function isPermit(permit) {
|
|
28
|
+
return !Array.isArray(permit.details);
|
|
29
|
+
}
|
|
30
|
+
export class AllowanceTransfer {
|
|
31
|
+
/**
|
|
32
|
+
* Cannot be constructed.
|
|
33
|
+
*/
|
|
34
|
+
constructor() { }
|
|
35
|
+
// return the data to be sent in a eth_signTypedData RPC call
|
|
36
|
+
// for signing the given permit data
|
|
37
|
+
static getPermitData(permit, permit2Address, chainId) {
|
|
38
|
+
invariant(MaxSigDeadline.gte(permit.sigDeadline), 'SIG_DEADLINE_OUT_OF_RANGE');
|
|
39
|
+
const domain = permit2Domain(permit2Address, chainId);
|
|
40
|
+
if (isPermit(permit)) {
|
|
41
|
+
validatePermitDetails(permit.details);
|
|
42
|
+
return {
|
|
43
|
+
domain,
|
|
44
|
+
types: PERMIT_TYPES,
|
|
45
|
+
values: permit,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
permit.details.forEach(validatePermitDetails);
|
|
50
|
+
return {
|
|
51
|
+
domain,
|
|
52
|
+
types: PERMIT_BATCH_TYPES,
|
|
53
|
+
values: permit,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
static hash(permit, permit2Address, chainId) {
|
|
58
|
+
const { domain, types, values } = AllowanceTransfer.getPermitData(permit, permit2Address, chainId);
|
|
59
|
+
return _TypedDataEncoder.hash(domain, types, values);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function validatePermitDetails(details) {
|
|
63
|
+
invariant(MaxOrderedNonce.gte(details.nonce), 'NONCE_OUT_OF_RANGE');
|
|
64
|
+
invariant(MaxAllowanceTransferAmount.gte(details.amount), 'AMOUNT_OUT_OF_RANGE');
|
|
65
|
+
invariant(MaxAllowanceExpiration.gte(details.expiration), 'EXPIRATION_OUT_OF_RANGE');
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=allowanceTransfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowanceTransfer.js","sourceRoot":"","sources":["../../../src/allowanceTransfer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { AllowanceTransfer } from './allowanceTransfer';
|
|
2
|
+
import { MaxOrderedNonce, MaxAllowanceTransferAmount, MaxAllowanceExpiration, MaxSigDeadline } from './constants';
|
|
3
|
+
describe('AllowanceTransfer', () => {
|
|
4
|
+
describe('Max values', () => {
|
|
5
|
+
it('max values pass', () => {
|
|
6
|
+
expect(() => AllowanceTransfer.hash({
|
|
7
|
+
details: {
|
|
8
|
+
token: '0x0000000000000000000000000000000000000000',
|
|
9
|
+
amount: MaxAllowanceTransferAmount.toString(),
|
|
10
|
+
expiration: MaxAllowanceExpiration.toString(),
|
|
11
|
+
nonce: MaxOrderedNonce.toString(),
|
|
12
|
+
},
|
|
13
|
+
spender: '0x0000000000000000000000000000000000000000',
|
|
14
|
+
sigDeadline: MaxSigDeadline.toString(),
|
|
15
|
+
}, '0x0000000000000000000000000000000000000000', 1)).not.toThrow();
|
|
16
|
+
});
|
|
17
|
+
it('nonce out of range', () => {
|
|
18
|
+
expect(() => AllowanceTransfer.hash({
|
|
19
|
+
details: {
|
|
20
|
+
token: '0x0000000000000000000000000000000000000000',
|
|
21
|
+
amount: '0',
|
|
22
|
+
expiration: '0',
|
|
23
|
+
nonce: MaxOrderedNonce.add(1).toString(),
|
|
24
|
+
},
|
|
25
|
+
spender: '0x0000000000000000000000000000000000000000',
|
|
26
|
+
sigDeadline: '0',
|
|
27
|
+
}, '0x0000000000000000000000000000000000000000', 1)).toThrow('NONCE_OUT_OF_RANGE');
|
|
28
|
+
});
|
|
29
|
+
it('amount out of range', () => {
|
|
30
|
+
expect(() => AllowanceTransfer.hash({
|
|
31
|
+
details: {
|
|
32
|
+
token: '0x0000000000000000000000000000000000000000',
|
|
33
|
+
amount: MaxAllowanceTransferAmount.add(1).toString(),
|
|
34
|
+
expiration: '0',
|
|
35
|
+
nonce: 0,
|
|
36
|
+
},
|
|
37
|
+
spender: '0x0000000000000000000000000000000000000000',
|
|
38
|
+
sigDeadline: '0',
|
|
39
|
+
}, '0x0000000000000000000000000000000000000000', 1)).toThrow('AMOUNT_OUT_OF_RANGE');
|
|
40
|
+
});
|
|
41
|
+
it('expiration out of range', () => {
|
|
42
|
+
expect(() => AllowanceTransfer.hash({
|
|
43
|
+
details: {
|
|
44
|
+
token: '0x0000000000000000000000000000000000000000',
|
|
45
|
+
amount: '0',
|
|
46
|
+
expiration: MaxAllowanceExpiration.add(1).toString(),
|
|
47
|
+
nonce: 0,
|
|
48
|
+
},
|
|
49
|
+
spender: '0x0000000000000000000000000000000000000000',
|
|
50
|
+
sigDeadline: '0',
|
|
51
|
+
}, '0x0000000000000000000000000000000000000000', 1)).toThrow('EXPIRATION_OUT_OF_RANGE');
|
|
52
|
+
});
|
|
53
|
+
it('sigDeadline out of range', () => {
|
|
54
|
+
expect(() => AllowanceTransfer.hash({
|
|
55
|
+
details: {
|
|
56
|
+
token: '0x0000000000000000000000000000000000000000',
|
|
57
|
+
amount: '0',
|
|
58
|
+
expiration: '0',
|
|
59
|
+
nonce: 0,
|
|
60
|
+
},
|
|
61
|
+
spender: '0x0000000000000000000000000000000000000000',
|
|
62
|
+
sigDeadline: MaxSigDeadline.add(1).toString(),
|
|
63
|
+
}, '0x0000000000000000000000000000000000000000', 1)).toThrow('SIG_DEADLINE_OUT_OF_RANGE');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
it('non-batch', () => {
|
|
67
|
+
expect(AllowanceTransfer.hash({
|
|
68
|
+
details: {
|
|
69
|
+
token: '0x0000000000000000000000000000000000000000',
|
|
70
|
+
amount: '0',
|
|
71
|
+
expiration: '0',
|
|
72
|
+
nonce: 0,
|
|
73
|
+
},
|
|
74
|
+
spender: '0x0000000000000000000000000000000000000000',
|
|
75
|
+
sigDeadline: '0',
|
|
76
|
+
}, '0x0000000000000000000000000000000000000000', 1)).toBe('0xd47437bffdbc4d123a2165feb6ca646b8700c038622ce304f84e9048bc744f36');
|
|
77
|
+
});
|
|
78
|
+
it('batch', () => {
|
|
79
|
+
expect(AllowanceTransfer.hash({
|
|
80
|
+
details: [
|
|
81
|
+
{
|
|
82
|
+
token: '0x0000000000000000000000000000000000000000',
|
|
83
|
+
amount: '0',
|
|
84
|
+
expiration: '0',
|
|
85
|
+
nonce: 0,
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
spender: '0x0000000000000000000000000000000000000000',
|
|
89
|
+
sigDeadline: '0',
|
|
90
|
+
}, '0x0000000000000000000000000000000000000000', 1)).toBe('0x49642ada5f77eb9458f8265eb01fed2684c2f25d50534fea3efdf2cf395deb2f');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=allowanceTransfer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowanceTransfer.test.js","sourceRoot":"","sources":["../../../src/allowanceTransfer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BigNumber } from '@ethersproject/bignumber';
|
|
2
|
+
export declare const PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
|
|
3
|
+
export declare function permit2Address(chainId?: number): string;
|
|
4
|
+
export declare const MaxUint48: BigNumber;
|
|
5
|
+
export declare const MaxUint160: BigNumber;
|
|
6
|
+
export declare const MaxUint256: BigNumber;
|
|
7
|
+
export declare const MaxAllowanceTransferAmount: BigNumber;
|
|
8
|
+
export declare const MaxAllowanceExpiration: BigNumber;
|
|
9
|
+
export declare const MaxOrderedNonce: BigNumber;
|
|
10
|
+
export declare const MaxSignatureTransferAmount: BigNumber;
|
|
11
|
+
export declare const MaxUnorderedNonce: BigNumber;
|
|
12
|
+
export declare const MaxSigDeadline: BigNumber;
|
|
13
|
+
export declare const InstantExpiration: BigNumber;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BigNumber } from '@ethersproject/bignumber';
|
|
2
|
+
// @deprecated please use permit2Address(chainId: number)
|
|
3
|
+
export const PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
|
|
4
|
+
export function permit2Address(chainId) {
|
|
5
|
+
switch (chainId) {
|
|
6
|
+
case 324:
|
|
7
|
+
return '0x0000000000225e31D15943971F47aD3022F714Fa';
|
|
8
|
+
default:
|
|
9
|
+
return PERMIT2_ADDRESS;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export const MaxUint48 = BigNumber.from('0xffffffffffff');
|
|
13
|
+
export const MaxUint160 = BigNumber.from('0xffffffffffffffffffffffffffffffffffffffff');
|
|
14
|
+
export const MaxUint256 = BigNumber.from('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff');
|
|
15
|
+
// alias max types for their usages
|
|
16
|
+
// allowance transfer types
|
|
17
|
+
export const MaxAllowanceTransferAmount = MaxUint160;
|
|
18
|
+
export const MaxAllowanceExpiration = MaxUint48;
|
|
19
|
+
export const MaxOrderedNonce = MaxUint48;
|
|
20
|
+
// signature transfer types
|
|
21
|
+
export const MaxSignatureTransferAmount = MaxUint256;
|
|
22
|
+
export const MaxUnorderedNonce = MaxUint256;
|
|
23
|
+
export const MaxSigDeadline = MaxUint256;
|
|
24
|
+
export const InstantExpiration = BigNumber.from(0);
|
|
25
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,yDAAyD;AACzD,MAAM,CAAC,MAAM,eAAe,GAAG,4CAA4C,CAAA;AAE3E,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,QAAQ,OAAO,EAAE;QACf,KAAK,GAAG;YACN,OAAO,4CAA4C,CAAA;QACrD;YACE,OAAO,eAAe,CAAA;KACzB;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;AACzD,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;AACtF,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;AAE9G,mCAAmC;AACnC,2BAA2B;AAC3B,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAA;AACpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAA;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAA;AAExC,2BAA2B;AAC3B,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAA;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAA;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAA;AAExC,MAAM,CAAC,MAAM,iBAAiB,GAAc,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BigNumber } from '@ethersproject/bignumber';
|
|
2
|
+
import { MaxUint48, MaxUint160, MaxUint256, InstantExpiration } from './constants';
|
|
3
|
+
describe('Constants', () => {
|
|
4
|
+
it('MaxUint256', () => {
|
|
5
|
+
expect(MaxUint256).toEqual(BigNumber.from(2).pow(256).sub(1));
|
|
6
|
+
});
|
|
7
|
+
it('MaxUint160', () => {
|
|
8
|
+
expect(MaxUint160).toEqual(BigNumber.from(2).pow(160).sub(1));
|
|
9
|
+
});
|
|
10
|
+
it('MaxUint48', () => {
|
|
11
|
+
expect(MaxUint48).toEqual(BigNumber.from(2).pow(48).sub(1));
|
|
12
|
+
});
|
|
13
|
+
it('InstantExpiration', () => {
|
|
14
|
+
expect(InstantExpiration).toEqual(BigNumber.from(0));
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=constants.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.test.js","sourceRoot":"","sources":["../../../src/constants.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAElF,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;QACnB,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TypedDataDomain, TypedDataField } from '@ethersproject/abstract-signer';
|
|
2
|
+
export declare function permit2Domain(permit2Address: string, chainId: number): TypedDataDomain;
|
|
3
|
+
export type PermitData = {
|
|
4
|
+
domain: TypedDataDomain;
|
|
5
|
+
types: Record<string, TypedDataField[]>;
|
|
6
|
+
values: any;
|
|
7
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../../../src/domain.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,SAAS,CAAA;AAErC,MAAM,UAAU,aAAa,CAAC,cAAsB,EAAE,OAAe;IACnE,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,OAAO;QACP,iBAAiB,EAAE,cAAc;KAClC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BigNumber } from '@ethersproject/bignumber';
|
|
2
|
+
import { Provider } from '@ethersproject/providers';
|
|
3
|
+
export interface AllowanceData {
|
|
4
|
+
amount: BigNumber;
|
|
5
|
+
nonce: number;
|
|
6
|
+
expiration: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class AllowanceProvider {
|
|
9
|
+
private provider;
|
|
10
|
+
private permit2Address;
|
|
11
|
+
private permit2;
|
|
12
|
+
constructor(provider: Provider, permit2Address: string);
|
|
13
|
+
getAllowanceData(token: string, owner: string, spender: string): Promise<AllowanceData>;
|
|
14
|
+
getAllowance(token: string, owner: string, spender: string): Promise<BigNumber>;
|
|
15
|
+
getNonce(token: string, owner: string, spender: string): Promise<number>;
|
|
16
|
+
getExpiration(token: string, owner: string, spender: string): Promise<number>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import Permit2Abi from '../../abis/Permit2.json';
|
|
3
|
+
import { Contract } from '@ethersproject/contracts';
|
|
4
|
+
export class AllowanceProvider {
|
|
5
|
+
constructor(provider, permit2Address) {
|
|
6
|
+
this.provider = provider;
|
|
7
|
+
this.permit2Address = permit2Address;
|
|
8
|
+
this.permit2 = new Contract(this.permit2Address, Permit2Abi, this.provider);
|
|
9
|
+
}
|
|
10
|
+
getAllowanceData(token, owner, spender) {
|
|
11
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
12
|
+
return yield this.permit2.allowance(owner, token, spender);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
getAllowance(token, owner, spender) {
|
|
16
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17
|
+
return (yield this.getAllowanceData(token, owner, spender)).amount;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
getNonce(token, owner, spender) {
|
|
21
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
return (yield this.getAllowanceData(token, owner, spender)).nonce;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
getExpiration(token, owner, spender) {
|
|
26
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
return (yield this.getAllowanceData(token, owner, spender)).expiration;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=AllowanceProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AllowanceProvider.js","sourceRoot":"","sources":["../../../../src/providers/AllowanceProvider.ts"],"names":[],"mappings":";AAEA,OAAO,UAAU,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAQnD,MAAM,OAAO,iBAAiB;IAG5B,YAAoB,QAAkB,EAAU,cAAsB;QAAlD,aAAQ,GAAR,QAAQ,CAAU;QAAU,mBAAc,GAAd,cAAc,CAAQ;QACpE,IAAI,CAAC,OAAO,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC7E,CAAC;IAEK,gBAAgB,CAAC,KAAa,EAAE,KAAa,EAAE,OAAe;;YAClE,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;QAC5D,CAAC;KAAA;IAEK,YAAY,CAAC,KAAa,EAAE,KAAa,EAAE,OAAe;;YAC9D,OAAO,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;QACpE,CAAC;KAAA;IAEK,QAAQ,CAAC,KAAa,EAAE,KAAa,EAAE,OAAe;;YAC1D,OAAO,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;QACnE,CAAC;KAAA;IAEK,aAAa,CAAC,KAAa,EAAE,KAAa,EAAE,OAAe;;YAC/D,OAAO,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAA;QACxE,CAAC;KAAA;CACF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { BigNumber, BigNumberish } from '@ethersproject/bignumber';
|
|
2
|
+
import { Provider } from '@ethersproject/providers';
|
|
3
|
+
import { PermitTransferFrom, PermitBatchTransferFrom } from '../signatureTransfer';
|
|
4
|
+
export interface NonceValidationResult {
|
|
5
|
+
isUsed: boolean;
|
|
6
|
+
isExpired: boolean;
|
|
7
|
+
isValid: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare class SignatureProvider {
|
|
10
|
+
private provider;
|
|
11
|
+
private permit2Address;
|
|
12
|
+
private permit2;
|
|
13
|
+
constructor(provider: Provider, permit2Address: string);
|
|
14
|
+
/**
|
|
15
|
+
* Check if a nonce has been used for signature transfers
|
|
16
|
+
* @param owner The owner address
|
|
17
|
+
* @param nonce The nonce to check
|
|
18
|
+
* @returns true if the nonce has been used, false otherwise
|
|
19
|
+
*/
|
|
20
|
+
isNonceUsed(owner: string, nonce: BigNumberish): Promise<boolean>;
|
|
21
|
+
/**
|
|
22
|
+
* Check if a permit has expired based on its deadline
|
|
23
|
+
* @param deadline The deadline timestamp
|
|
24
|
+
* @returns true if the permit has expired, false otherwise
|
|
25
|
+
*/
|
|
26
|
+
isExpired(deadline: BigNumberish): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a permit is valid (not expired and nonce not used)
|
|
29
|
+
* @param permit The permit data to validate
|
|
30
|
+
* @returns true if the permit is valid, false otherwise
|
|
31
|
+
*/
|
|
32
|
+
isPermitValid(permit: PermitTransferFrom | PermitBatchTransferFrom): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Get detailed validation results for a permit
|
|
35
|
+
* @param permit The permit data to validate
|
|
36
|
+
* @returns Object containing validation results
|
|
37
|
+
*/
|
|
38
|
+
validatePermit(permit: PermitTransferFrom | PermitBatchTransferFrom): Promise<NonceValidationResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Get the current nonce bitmap for an owner at a specific word position
|
|
41
|
+
* @param owner The owner address
|
|
42
|
+
* @param wordPos The word position in the bitmap
|
|
43
|
+
* @returns The bitmap as a BigNumber
|
|
44
|
+
*/
|
|
45
|
+
getNonceBitmap(owner: string, wordPos: BigNumberish): Promise<BigNumber>;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a specific bit is set in the nonce bitmap
|
|
48
|
+
* @param bitmap The bitmap to check
|
|
49
|
+
* @param bitPos The bit position (0-255)
|
|
50
|
+
* @returns true if the bit is set, false otherwise
|
|
51
|
+
*/
|
|
52
|
+
static isBitSet(bitmap: BigNumber, bitPos: number): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Get the word position and bit position for a given nonce
|
|
55
|
+
* @param nonce The nonce to analyze
|
|
56
|
+
* @returns Object containing wordPos and bitPos
|
|
57
|
+
*/
|
|
58
|
+
static getNoncePositions(nonce: BigNumberish): {
|
|
59
|
+
wordPos: BigNumber;
|
|
60
|
+
bitPos: number;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Batch check multiple nonces for the same owner
|
|
64
|
+
* @param owner The owner address
|
|
65
|
+
* @param nonces Array of nonces to check
|
|
66
|
+
* @returns Array of boolean results indicating if each nonce is used
|
|
67
|
+
*/
|
|
68
|
+
batchCheckNonces(owner: string, nonces: BigNumberish[]): Promise<boolean[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Get the current block timestamp
|
|
71
|
+
* @returns Current block timestamp
|
|
72
|
+
*/
|
|
73
|
+
getCurrentTimestamp(): Promise<number>;
|
|
74
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { BigNumber } from '@ethersproject/bignumber';
|
|
3
|
+
import { Contract } from '@ethersproject/contracts';
|
|
4
|
+
import invariant from 'tiny-invariant';
|
|
5
|
+
import Permit2Abi from '../../abis/Permit2.json';
|
|
6
|
+
export class SignatureProvider {
|
|
7
|
+
constructor(provider, permit2Address) {
|
|
8
|
+
this.provider = provider;
|
|
9
|
+
this.permit2Address = permit2Address;
|
|
10
|
+
this.permit2 = new Contract(this.permit2Address, Permit2Abi, this.provider);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Check if a nonce has been used for signature transfers
|
|
14
|
+
* @param owner The owner address
|
|
15
|
+
* @param nonce The nonce to check
|
|
16
|
+
* @returns true if the nonce has been used, false otherwise
|
|
17
|
+
*/
|
|
18
|
+
isNonceUsed(owner, nonce) {
|
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
const { wordPos, bitPos } = SignatureProvider.getNoncePositions(nonce);
|
|
21
|
+
const bitmap = yield this.permit2.nonceBitmap(owner, wordPos);
|
|
22
|
+
return SignatureProvider.isBitSet(bitmap, bitPos);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if a permit has expired based on its deadline
|
|
27
|
+
* @param deadline The deadline timestamp
|
|
28
|
+
* @returns true if the permit has expired, false otherwise
|
|
29
|
+
*/
|
|
30
|
+
isExpired(deadline) {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
const currentTimestamp = yield this.getCurrentTimestamp();
|
|
33
|
+
return BigNumber.from(deadline).lt(currentTimestamp);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a permit is valid (not expired and nonce not used)
|
|
38
|
+
* @param permit The permit data to validate
|
|
39
|
+
* @returns true if the permit is valid, false otherwise
|
|
40
|
+
*/
|
|
41
|
+
isPermitValid(permit) {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
return (yield this.validatePermit(permit)).isValid;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get detailed validation results for a permit
|
|
48
|
+
* @param permit The permit data to validate
|
|
49
|
+
* @returns Object containing validation results
|
|
50
|
+
*/
|
|
51
|
+
validatePermit(permit) {
|
|
52
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
+
const [isExpiredResult, isNonceUsedResult] = yield Promise.all([
|
|
54
|
+
this.isExpired(permit.deadline),
|
|
55
|
+
this.isNonceUsed(permit.spender, permit.nonce),
|
|
56
|
+
]);
|
|
57
|
+
return {
|
|
58
|
+
isUsed: isNonceUsedResult,
|
|
59
|
+
isExpired: isExpiredResult,
|
|
60
|
+
isValid: !isExpiredResult && !isNonceUsedResult,
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get the current nonce bitmap for an owner at a specific word position
|
|
66
|
+
* @param owner The owner address
|
|
67
|
+
* @param wordPos The word position in the bitmap
|
|
68
|
+
* @returns The bitmap as a BigNumber
|
|
69
|
+
*/
|
|
70
|
+
getNonceBitmap(owner, wordPos) {
|
|
71
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
+
return yield this.permit2.nonceBitmap(owner, wordPos);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if a specific bit is set in the nonce bitmap
|
|
77
|
+
* @param bitmap The bitmap to check
|
|
78
|
+
* @param bitPos The bit position (0-255)
|
|
79
|
+
* @returns true if the bit is set, false otherwise
|
|
80
|
+
*/
|
|
81
|
+
static isBitSet(bitmap, bitPos) {
|
|
82
|
+
invariant(bitPos >= 0 && bitPos <= 255, 'BIT_POSITION_OUT_OF_RANGE');
|
|
83
|
+
const mask = BigNumber.from(1).shl(bitPos);
|
|
84
|
+
return bitmap.and(mask).gt(0);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the word position and bit position for a given nonce
|
|
88
|
+
* @param nonce The nonce to analyze
|
|
89
|
+
* @returns Object containing wordPos and bitPos
|
|
90
|
+
*/
|
|
91
|
+
static getNoncePositions(nonce) {
|
|
92
|
+
const nonceBN = BigNumber.from(nonce);
|
|
93
|
+
return {
|
|
94
|
+
wordPos: nonceBN.shr(8),
|
|
95
|
+
bitPos: nonceBN.and(255).toNumber(),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Batch check multiple nonces for the same owner
|
|
100
|
+
* @param owner The owner address
|
|
101
|
+
* @param nonces Array of nonces to check
|
|
102
|
+
* @returns Array of boolean results indicating if each nonce is used
|
|
103
|
+
*/
|
|
104
|
+
batchCheckNonces(owner, nonces) {
|
|
105
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
+
// Get unique word positions to minimize contract calls
|
|
107
|
+
const wordPositions = new Set();
|
|
108
|
+
nonces.forEach((nonce) => {
|
|
109
|
+
const { wordPos } = SignatureProvider.getNoncePositions(nonce);
|
|
110
|
+
wordPositions.add(wordPos.toString());
|
|
111
|
+
});
|
|
112
|
+
// Fetch all required bitmaps
|
|
113
|
+
const bitmapPromises = Array.from(wordPositions).map((wordPosKey) => __awaiter(this, void 0, void 0, function* () {
|
|
114
|
+
const wordPos = BigNumber.from(wordPosKey);
|
|
115
|
+
const bitmap = yield this.getNonceBitmap(owner, wordPos);
|
|
116
|
+
return { wordPos, bitmap };
|
|
117
|
+
}));
|
|
118
|
+
const bitmaps = yield Promise.all(bitmapPromises);
|
|
119
|
+
const bitmapMap = new Map(bitmaps.map(({ wordPos, bitmap }) => [wordPos.toString(), bitmap]));
|
|
120
|
+
// Check each nonce
|
|
121
|
+
return nonces.map((nonce) => {
|
|
122
|
+
const { wordPos, bitPos } = SignatureProvider.getNoncePositions(nonce);
|
|
123
|
+
const bitmap = bitmapMap.get(wordPos.toString());
|
|
124
|
+
if (!bitmap) {
|
|
125
|
+
throw new Error(`Bitmap not found for word position ${wordPos.toString()}`);
|
|
126
|
+
}
|
|
127
|
+
return SignatureProvider.isBitSet(bitmap, bitPos);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get the current block timestamp
|
|
133
|
+
* @returns Current block timestamp
|
|
134
|
+
*/
|
|
135
|
+
getCurrentTimestamp() {
|
|
136
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
137
|
+
const currentBlock = yield this.provider.getBlock('latest');
|
|
138
|
+
return currentBlock.timestamp;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=SignatureProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignatureProvider.js","sourceRoot":"","sources":["../../../../src/providers/SignatureProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|