@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.
Files changed (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -0
  3. package/dist/cjs/abis/Permit2.json +830 -0
  4. package/dist/cjs/src/allowanceTransfer.d.ts +36 -0
  5. package/dist/cjs/src/allowanceTransfer.js +72 -0
  6. package/dist/cjs/src/allowanceTransfer.js.map +1 -0
  7. package/dist/cjs/src/allowanceTransfer.test.d.ts +1 -0
  8. package/dist/cjs/src/allowanceTransfer.test.js +95 -0
  9. package/dist/cjs/src/allowanceTransfer.test.js.map +1 -0
  10. package/dist/cjs/src/constants.d.ts +13 -0
  11. package/dist/cjs/src/constants.js +29 -0
  12. package/dist/cjs/src/constants.js.map +1 -0
  13. package/dist/cjs/src/constants.test.d.ts +1 -0
  14. package/dist/cjs/src/constants.test.js +19 -0
  15. package/dist/cjs/src/constants.test.js.map +1 -0
  16. package/dist/cjs/src/domain.d.ts +7 -0
  17. package/dist/cjs/src/domain.js +13 -0
  18. package/dist/cjs/src/domain.js.map +1 -0
  19. package/dist/cjs/src/index.d.ts +4 -0
  20. package/dist/cjs/src/index.js +8 -0
  21. package/dist/cjs/src/index.js.map +1 -0
  22. package/dist/cjs/src/providers/AllowanceProvider.d.ts +17 -0
  23. package/dist/cjs/src/providers/AllowanceProvider.js +35 -0
  24. package/dist/cjs/src/providers/AllowanceProvider.js.map +1 -0
  25. package/dist/cjs/src/providers/SignatureProvider.d.ts +74 -0
  26. package/dist/cjs/src/providers/SignatureProvider.js +146 -0
  27. package/dist/cjs/src/providers/SignatureProvider.js.map +1 -0
  28. package/dist/cjs/src/providers/SignatureProvider.test.d.ts +1 -0
  29. package/dist/cjs/src/providers/SignatureProvider.test.js +247 -0
  30. package/dist/cjs/src/providers/SignatureProvider.test.js.map +1 -0
  31. package/dist/cjs/src/providers/index.d.ts +2 -0
  32. package/dist/cjs/src/providers/index.js +6 -0
  33. package/dist/cjs/src/providers/index.js.map +1 -0
  34. package/dist/cjs/src/signatureTransfer.d.ts +41 -0
  35. package/dist/cjs/src/signatureTransfer.js +93 -0
  36. package/dist/cjs/src/signatureTransfer.js.map +1 -0
  37. package/dist/cjs/src/signatureTransfer.test.d.ts +1 -0
  38. package/dist/cjs/src/signatureTransfer.test.js +109 -0
  39. package/dist/cjs/src/signatureTransfer.test.js.map +1 -0
  40. package/dist/esm/abis/Permit2.json +830 -0
  41. package/dist/esm/src/allowanceTransfer.d.ts +36 -0
  42. package/dist/esm/src/allowanceTransfer.js +67 -0
  43. package/dist/esm/src/allowanceTransfer.js.map +1 -0
  44. package/dist/esm/src/allowanceTransfer.test.d.ts +1 -0
  45. package/dist/esm/src/allowanceTransfer.test.js +93 -0
  46. package/dist/esm/src/allowanceTransfer.test.js.map +1 -0
  47. package/dist/esm/src/constants.d.ts +13 -0
  48. package/dist/esm/src/constants.js +25 -0
  49. package/dist/esm/src/constants.js.map +1 -0
  50. package/dist/esm/src/constants.test.d.ts +1 -0
  51. package/dist/esm/src/constants.test.js +17 -0
  52. package/dist/esm/src/constants.test.js.map +1 -0
  53. package/dist/esm/src/domain.d.ts +7 -0
  54. package/dist/esm/src/domain.js +9 -0
  55. package/dist/esm/src/domain.js.map +1 -0
  56. package/dist/esm/src/index.d.ts +4 -0
  57. package/dist/esm/src/index.js +5 -0
  58. package/dist/esm/src/index.js.map +1 -0
  59. package/dist/esm/src/providers/AllowanceProvider.d.ts +17 -0
  60. package/dist/esm/src/providers/AllowanceProvider.js +31 -0
  61. package/dist/esm/src/providers/AllowanceProvider.js.map +1 -0
  62. package/dist/esm/src/providers/SignatureProvider.d.ts +74 -0
  63. package/dist/esm/src/providers/SignatureProvider.js +142 -0
  64. package/dist/esm/src/providers/SignatureProvider.js.map +1 -0
  65. package/dist/esm/src/providers/SignatureProvider.test.d.ts +1 -0
  66. package/dist/esm/src/providers/SignatureProvider.test.js +245 -0
  67. package/dist/esm/src/providers/SignatureProvider.test.js.map +1 -0
  68. package/dist/esm/src/providers/index.d.ts +2 -0
  69. package/dist/esm/src/providers/index.js +3 -0
  70. package/dist/esm/src/providers/index.js.map +1 -0
  71. package/dist/esm/src/signatureTransfer.d.ts +41 -0
  72. package/dist/esm/src/signatureTransfer.js +88 -0
  73. package/dist/esm/src/signatureTransfer.js.map +1 -0
  74. package/dist/esm/src/signatureTransfer.test.d.ts +1 -0
  75. package/dist/esm/src/signatureTransfer.test.js +107 -0
  76. package/dist/esm/src/signatureTransfer.test.js.map +1 -0
  77. package/dist/types/src/allowanceTransfer.d.ts +36 -0
  78. package/dist/types/src/allowanceTransfer.test.d.ts +1 -0
  79. package/dist/types/src/constants.d.ts +13 -0
  80. package/dist/types/src/constants.test.d.ts +1 -0
  81. package/dist/types/src/domain.d.ts +7 -0
  82. package/dist/types/src/index.d.ts +4 -0
  83. package/dist/types/src/providers/AllowanceProvider.d.ts +17 -0
  84. package/dist/types/src/providers/SignatureProvider.d.ts +74 -0
  85. package/dist/types/src/providers/SignatureProvider.test.d.ts +1 -0
  86. package/dist/types/src/providers/index.d.ts +2 -0
  87. package/dist/types/src/signatureTransfer.d.ts +41 -0
  88. package/dist/types/src/signatureTransfer.test.d.ts +1 -0
  89. 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,9 @@
1
+ const PERMIT2_DOMAIN_NAME = 'Permit2';
2
+ export function permit2Domain(permit2Address, chainId) {
3
+ return {
4
+ name: PERMIT2_DOMAIN_NAME,
5
+ chainId,
6
+ verifyingContract: permit2Address,
7
+ };
8
+ }
9
+ //# sourceMappingURL=domain.js.map
@@ -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,4 @@
1
+ export * from './allowanceTransfer';
2
+ export * from './signatureTransfer';
3
+ export * from './providers';
4
+ export * from './constants';
@@ -0,0 +1,5 @@
1
+ export * from './allowanceTransfer';
2
+ export * from './signatureTransfer';
3
+ export * from './providers';
4
+ export * from './constants';
5
+ //# sourceMappingURL=index.js.map
@@ -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 {};