@1inch/fusion-sdk 2.4.6 → 2.4.7-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/README.md +174 -25
- package/dist/cjs/api/quoter/quoter.api.spec.js +1 -2
- package/dist/cjs/constants.js +17 -3
- package/dist/cjs/fusion-order/fusion-order.js +94 -0
- package/dist/cjs/fusion-order/fusion-order.spec.js +87 -0
- package/dist/cjs/fusion-order/index.js +1 -0
- package/dist/cjs/fusion-order/permit/constants.js +98 -0
- package/dist/cjs/fusion-order/permit/index.js +34 -0
- package/dist/cjs/fusion-order/permit/permit-transfer-from.js +115 -0
- package/dist/cjs/fusion-order/permit/permit-transfer-from.spec.js +232 -0
- package/dist/cjs/fusion-order/permit/transfer-from-suffix.js +76 -0
- package/dist/cjs/fusion-order/permit/utils.js +35 -0
- package/dist/esm/api/quoter/quoter.api.spec.js +1 -2
- package/dist/esm/constants.js +15 -1
- package/dist/esm/fusion-order/fusion-order.js +95 -1
- package/dist/esm/fusion-order/fusion-order.spec.js +87 -0
- package/dist/esm/fusion-order/index.js +1 -0
- package/dist/esm/fusion-order/permit/constants.js +71 -0
- package/dist/esm/fusion-order/permit/index.js +3 -0
- package/dist/esm/fusion-order/permit/permit-transfer-from.js +105 -0
- package/dist/esm/fusion-order/permit/permit-transfer-from.spec.js +228 -0
- package/dist/esm/fusion-order/permit/transfer-from-suffix.js +53 -0
- package/dist/esm/fusion-order/permit/utils.js +12 -0
- package/dist/esm/package.json +1 -1
- package/dist/types/src/constants.d.ts +1 -1
- package/dist/types/src/fusion-order/fusion-order.d.ts +5 -0
- package/dist/types/src/fusion-order/index.d.ts +1 -0
- package/dist/types/src/fusion-order/permit/constants.d.ts +7 -0
- package/dist/types/src/fusion-order/permit/index.d.ts +3 -0
- package/dist/types/src/fusion-order/permit/permit-transfer-from.d.ts +11 -0
- package/dist/types/src/fusion-order/permit/transfer-from-suffix.d.ts +10 -0
- package/dist/types/src/fusion-order/permit/utils.d.ts +3 -0
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -30,6 +30,13 @@ function _define_property(obj, key, value) {
|
|
|
30
30
|
}
|
|
31
31
|
return obj;
|
|
32
32
|
}
|
|
33
|
+
function _instanceof(left, right) {
|
|
34
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
35
|
+
return !!right[Symbol.hasInstance](left);
|
|
36
|
+
} else {
|
|
37
|
+
return left instanceof right;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
33
40
|
function _object_spread(target) {
|
|
34
41
|
for(var i = 1; i < arguments.length; i++){
|
|
35
42
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
@@ -69,11 +76,15 @@ function _object_spread_props(target, source) {
|
|
|
69
76
|
}
|
|
70
77
|
return target;
|
|
71
78
|
}
|
|
72
|
-
import { Address, Interaction, LimitOrder, MakerTraits } from '@1inch/limit-order-sdk';
|
|
79
|
+
import { Address, Extension, Interaction, LimitOrder, MakerTraits, randBigInt } from '@1inch/limit-order-sdk';
|
|
80
|
+
import { UINT_256_MAX } from '@1inch/byte-utils';
|
|
73
81
|
import assert from 'assert';
|
|
74
82
|
import { FusionExtension } from './fusion-extension.js';
|
|
75
83
|
import { injectTrackCode } from './source-track.js';
|
|
76
84
|
import { SurplusParams } from './surplus-params.js';
|
|
85
|
+
import { PermitTransferFrom } from './permit/permit-transfer-from.js';
|
|
86
|
+
import { getPermit2ProxyAddress } from './permit/utils.js';
|
|
87
|
+
import { decodeTransferFromSuffix } from './permit/transfer-from-suffix.js';
|
|
77
88
|
import { AuctionCalculator } from '../amount-calculator/auction-calculator/index.js';
|
|
78
89
|
import { ZX } from '../constants.js';
|
|
79
90
|
import { calcTakingAmount } from '../utils/amounts.js';
|
|
@@ -162,6 +173,9 @@ export var FusionOrder = /*#__PURE__*/ function() {
|
|
|
162
173
|
{
|
|
163
174
|
key: "makerAsset",
|
|
164
175
|
get: function get() {
|
|
176
|
+
if (this.isTransferPermit()) {
|
|
177
|
+
return this.decodeTransferPermitSuffix().token;
|
|
178
|
+
}
|
|
165
179
|
return this.inner.makerAsset;
|
|
166
180
|
}
|
|
167
181
|
},
|
|
@@ -258,6 +272,48 @@ export var FusionOrder = /*#__PURE__*/ function() {
|
|
|
258
272
|
return this.inner.salt;
|
|
259
273
|
}
|
|
260
274
|
},
|
|
275
|
+
{
|
|
276
|
+
key: "isTransferPermit",
|
|
277
|
+
value: /**
|
|
278
|
+
* Returns true if the order uses a Permit2 transfer permit via Permit2Proxy.
|
|
279
|
+
* Decodes `makerAssetSuffix` and validates the Permit2 ABI structure.
|
|
280
|
+
*
|
|
281
|
+
* @see FusionOrder.withTransferPermit
|
|
282
|
+
* @see FusionOrder.createTransferPermit
|
|
283
|
+
*/ function isTransferPermit() {
|
|
284
|
+
try {
|
|
285
|
+
this.decodeTransferPermitSuffix();
|
|
286
|
+
return true;
|
|
287
|
+
} catch (e) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
key: "withTransferPermit",
|
|
294
|
+
value: function withTransferPermit(permit, signature) {
|
|
295
|
+
var suffix = permit.getTransferFromSuffix(signature);
|
|
296
|
+
var currentExtension = this.inner.extension;
|
|
297
|
+
var newExtension = new Extension(_object_spread_props(_object_spread({}, currentExtension), {
|
|
298
|
+
makerAssetSuffix: suffix
|
|
299
|
+
}));
|
|
300
|
+
this.inner.makerTraits.disablePermit2();
|
|
301
|
+
var baseSalt = this.inner.salt >> 160n;
|
|
302
|
+
var newSalt = LimitOrder.buildSalt(newExtension, baseSalt);
|
|
303
|
+
this.inner = new LimitOrder({
|
|
304
|
+
maker: this.inner.maker,
|
|
305
|
+
makerAsset: permit.spender,
|
|
306
|
+
takerAsset: this.inner.takerAsset,
|
|
307
|
+
makingAmount: this.inner.makingAmount,
|
|
308
|
+
takingAmount: this.inner.takingAmount,
|
|
309
|
+
receiver: this.inner.receiver,
|
|
310
|
+
salt: newSalt
|
|
311
|
+
}, this.inner.makerTraits, newExtension, {
|
|
312
|
+
optimizeReceiverAddress: false
|
|
313
|
+
});
|
|
314
|
+
return this;
|
|
315
|
+
}
|
|
316
|
+
},
|
|
261
317
|
{
|
|
262
318
|
key: "build",
|
|
263
319
|
value: function build() {
|
|
@@ -453,6 +509,44 @@ export var FusionOrder = /*#__PURE__*/ function() {
|
|
|
453
509
|
*/ function nativeSignature(maker) {
|
|
454
510
|
return this.inner.nativeSignature(maker);
|
|
455
511
|
}
|
|
512
|
+
},
|
|
513
|
+
{
|
|
514
|
+
key: "createTransferPermit",
|
|
515
|
+
value: /**
|
|
516
|
+
* Creates a Permit2 `PermitTransferFrom` object for the order's maker asset.
|
|
517
|
+
*
|
|
518
|
+
* Can only be used for orders where `multipleFillsAllowed` is `false`.
|
|
519
|
+
*
|
|
520
|
+
* The returned permit authorizes the `permit2Proxy` address (as spender)
|
|
521
|
+
* to transfer up to `makingAmount` of the `makerAsset` token,
|
|
522
|
+
* with a random 256-bit nonce and the order's deadline.
|
|
523
|
+
*
|
|
524
|
+
* The resulting permit can be signed and then attached to the order
|
|
525
|
+
* via {@link FusionOrder.withTransferPermit}.
|
|
526
|
+
*
|
|
527
|
+
* @param chainId - The chain ID used to resolve the default Permit2Proxy address
|
|
528
|
+
* @param permit2Proxy - Optional address of the Permit2Proxy contract that will act as spender.
|
|
529
|
+
* Defaults to the built-in address for the given `chainId`.
|
|
530
|
+
* @returns A {@link PermitTransferFrom} instance that can be signed and attached to the order
|
|
531
|
+
*
|
|
532
|
+
* @throws If `multipleFillsAllowed` is `true`
|
|
533
|
+
*
|
|
534
|
+
* @see FusionOrder.withTransferPermit
|
|
535
|
+
*/ function createTransferPermit(chainIdOrPermit2Proxy, permit2Proxy) {
|
|
536
|
+
assert(!this.multipleFillsAllowed, 'transfer permit can be used only for orders where multipleFillsAllowed=false');
|
|
537
|
+
var spender = _instanceof(chainIdOrPermit2Proxy, Address) ? chainIdOrPermit2Proxy : permit2Proxy !== null && permit2Proxy !== void 0 ? permit2Proxy : getPermit2ProxyAddress(chainIdOrPermit2Proxy);
|
|
538
|
+
return new PermitTransferFrom(this.makerAsset, this.makingAmount, spender, randBigInt(UINT_256_MAX), this.deadline);
|
|
539
|
+
}
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
key: "decodeTransferPermitSuffix",
|
|
543
|
+
value: function decodeTransferPermitSuffix() {
|
|
544
|
+
var suffix = this.inner.extension.makerAssetSuffix;
|
|
545
|
+
if (suffix === ZX) {
|
|
546
|
+
throw new Error('no makerAssetSuffix');
|
|
547
|
+
}
|
|
548
|
+
return decodeTransferFromSuffix(suffix);
|
|
549
|
+
}
|
|
456
550
|
}
|
|
457
551
|
], [
|
|
458
552
|
{
|
|
@@ -461,4 +461,91 @@ describe('FusionOrder Native', function() {
|
|
|
461
461
|
});
|
|
462
462
|
expect(nativeOrder.build().receiver).toEqual(settlementExt.toString());
|
|
463
463
|
});
|
|
464
|
+
describe('isTransferPermit', function() {
|
|
465
|
+
var extensionContract = new Address('0x8273f37417da37c4a6c3995e82cf442f87a25d9c');
|
|
466
|
+
var permit2Proxy = new Address('0x1234567890abcdef1234567890abcdef12345678');
|
|
467
|
+
var baseOrder = function() {
|
|
468
|
+
return FusionOrder.new(extensionContract, {
|
|
469
|
+
makerAsset: new Address('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'),
|
|
470
|
+
takerAsset: new Address('0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'),
|
|
471
|
+
makingAmount: parseEther('1'),
|
|
472
|
+
takingAmount: parseUnits('1000', 6),
|
|
473
|
+
maker: new Address('0x00000000219ab540356cbb839cbe05303d7705fa')
|
|
474
|
+
}, {
|
|
475
|
+
auction: new AuctionDetails({
|
|
476
|
+
duration: 180n,
|
|
477
|
+
startTime: 1673548149n,
|
|
478
|
+
initialRateBump: 0,
|
|
479
|
+
points: []
|
|
480
|
+
}),
|
|
481
|
+
whitelist: Whitelist.new(1673548139n, [
|
|
482
|
+
{
|
|
483
|
+
address: new Address('0x00000000219ab540356cbb839cbe05303d7705fa'),
|
|
484
|
+
allowFrom: 0n
|
|
485
|
+
}
|
|
486
|
+
]),
|
|
487
|
+
surplus: SurplusParams.NO_FEE
|
|
488
|
+
}, {
|
|
489
|
+
allowPartialFills: false,
|
|
490
|
+
allowMultipleFills: false,
|
|
491
|
+
nonce: 1n
|
|
492
|
+
});
|
|
493
|
+
};
|
|
494
|
+
it('should return false for regular order', function() {
|
|
495
|
+
var order = FusionOrder.new(extensionContract, {
|
|
496
|
+
makerAsset: new Address('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'),
|
|
497
|
+
takerAsset: new Address('0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'),
|
|
498
|
+
makingAmount: parseEther('1'),
|
|
499
|
+
takingAmount: parseUnits('1000', 6),
|
|
500
|
+
maker: new Address('0x00000000219ab540356cbb839cbe05303d7705fa')
|
|
501
|
+
}, {
|
|
502
|
+
auction: new AuctionDetails({
|
|
503
|
+
duration: 180n,
|
|
504
|
+
startTime: 1673548149n,
|
|
505
|
+
initialRateBump: 0,
|
|
506
|
+
points: []
|
|
507
|
+
}),
|
|
508
|
+
whitelist: Whitelist.new(1673548139n, [
|
|
509
|
+
{
|
|
510
|
+
address: new Address('0x00000000219ab540356cbb839cbe05303d7705fa'),
|
|
511
|
+
allowFrom: 0n
|
|
512
|
+
}
|
|
513
|
+
]),
|
|
514
|
+
surplus: SurplusParams.NO_FEE
|
|
515
|
+
});
|
|
516
|
+
expect(order.isTransferPermit()).toBe(false);
|
|
517
|
+
});
|
|
518
|
+
it('should return true after withTransferPermit', function() {
|
|
519
|
+
var order = baseOrder();
|
|
520
|
+
var permit = order.createTransferPermit(permit2Proxy);
|
|
521
|
+
var fakeSignature = '0x' + 'ab'.repeat(65);
|
|
522
|
+
var orderWithPermit = order.withTransferPermit(permit, fakeSignature);
|
|
523
|
+
expect(orderWithPermit.isTransferPermit()).toBe(true);
|
|
524
|
+
});
|
|
525
|
+
it('should return real token as makerAsset after withTransferPermit', function() {
|
|
526
|
+
var weth = new Address('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2');
|
|
527
|
+
var order = baseOrder();
|
|
528
|
+
var permit = order.createTransferPermit(permit2Proxy);
|
|
529
|
+
var fakeSignature = '0x' + 'ab'.repeat(65);
|
|
530
|
+
var orderWithPermit = order.withTransferPermit(permit, fakeSignature);
|
|
531
|
+
expect(orderWithPermit.makerAsset).toEqual(weth);
|
|
532
|
+
});
|
|
533
|
+
it('should return false for non-permit2 suffix data', function() {
|
|
534
|
+
var order = baseOrder();
|
|
535
|
+
var ext = order.extension;
|
|
536
|
+
var tampered = new Extension({
|
|
537
|
+
makerAssetSuffix: '0xdeadbeef',
|
|
538
|
+
takerAssetSuffix: ext.takerAssetSuffix,
|
|
539
|
+
makingAmountData: ext.makingAmountData,
|
|
540
|
+
takingAmountData: ext.takingAmountData,
|
|
541
|
+
predicate: ext.predicate,
|
|
542
|
+
makerPermit: ext.makerPermit,
|
|
543
|
+
preInteraction: ext.preInteraction,
|
|
544
|
+
postInteraction: ext.postInteraction,
|
|
545
|
+
customData: ext.customData
|
|
546
|
+
});
|
|
547
|
+
var rebuilt = FusionOrder.fromDataAndExtension(order.build(), tampered);
|
|
548
|
+
expect(rebuilt.isTransferPermit()).toBe(false);
|
|
549
|
+
});
|
|
550
|
+
});
|
|
464
551
|
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
function _object_spread(target) {
|
|
15
|
+
for(var i = 1; i < arguments.length; i++){
|
|
16
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
17
|
+
var ownKeys = Object.keys(source);
|
|
18
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
19
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
20
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
ownKeys.forEach(function(key) {
|
|
24
|
+
_define_property(target, key, source[key]);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return target;
|
|
28
|
+
}
|
|
29
|
+
import { NetworkEnum } from '../../constants.js';
|
|
30
|
+
var PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
|
|
31
|
+
var PERMIT2_ADDRESS_ZK = '0x0000000000225e31d15943971f47ad3022f714fa';
|
|
32
|
+
var _obj;
|
|
33
|
+
export var PERMIT2_ADDRESSES = (_obj = {}, _define_property(_obj, NetworkEnum.ZKSYNC, PERMIT2_ADDRESS_ZK), _define_property(_obj, NetworkEnum.ARBITRUM, PERMIT2_ADDRESS), _define_property(_obj, NetworkEnum.ETHEREUM, PERMIT2_ADDRESS), _define_property(_obj, NetworkEnum.POLYGON, PERMIT2_ADDRESS), _define_property(_obj, NetworkEnum.BINANCE, PERMIT2_ADDRESS), _define_property(_obj, NetworkEnum.AVALANCHE, PERMIT2_ADDRESS), _define_property(_obj, NetworkEnum.OPTIMISM, PERMIT2_ADDRESS), _define_property(_obj, NetworkEnum.FANTOM, PERMIT2_ADDRESS), _define_property(_obj, NetworkEnum.GNOSIS, PERMIT2_ADDRESS), _define_property(_obj, NetworkEnum.COINBASE, PERMIT2_ADDRESS), _define_property(_obj, NetworkEnum.LINEA, PERMIT2_ADDRESS), _define_property(_obj, NetworkEnum.SONIC, PERMIT2_ADDRESS), _define_property(_obj, NetworkEnum.UNICHAIN, PERMIT2_ADDRESS), _obj);
|
|
34
|
+
// todo: update
|
|
35
|
+
var PERMIT2_PROXY_ADDRESS = '0xcf56da25062c954b252515244dfefb739c254c23';
|
|
36
|
+
var PERMIT2_PROXY_ADDRESS_ZK = '0x0000000000000000000000000000000000000000';
|
|
37
|
+
var _obj1;
|
|
38
|
+
export var PERMIT2_PROXY_ADDRESSES = (_obj1 = {}, _define_property(_obj1, NetworkEnum.ZKSYNC, PERMIT2_PROXY_ADDRESS_ZK), _define_property(_obj1, NetworkEnum.ARBITRUM, PERMIT2_PROXY_ADDRESS), _define_property(_obj1, NetworkEnum.ETHEREUM, PERMIT2_PROXY_ADDRESS), _define_property(_obj1, NetworkEnum.POLYGON, PERMIT2_PROXY_ADDRESS), _define_property(_obj1, NetworkEnum.BINANCE, PERMIT2_PROXY_ADDRESS), _define_property(_obj1, NetworkEnum.AVALANCHE, PERMIT2_PROXY_ADDRESS), _define_property(_obj1, NetworkEnum.OPTIMISM, PERMIT2_PROXY_ADDRESS), _define_property(_obj1, NetworkEnum.FANTOM, PERMIT2_PROXY_ADDRESS), _define_property(_obj1, NetworkEnum.GNOSIS, PERMIT2_PROXY_ADDRESS), _define_property(_obj1, NetworkEnum.COINBASE, PERMIT2_PROXY_ADDRESS), _define_property(_obj1, NetworkEnum.LINEA, PERMIT2_PROXY_ADDRESS), _define_property(_obj1, NetworkEnum.SONIC, PERMIT2_PROXY_ADDRESS), _define_property(_obj1, NetworkEnum.UNICHAIN, PERMIT2_PROXY_ADDRESS), _obj1);
|
|
39
|
+
export var PERMIT2_DOMAIN_NAME = 'Permit2';
|
|
40
|
+
export var TOKEN_PERMISSIONS = {
|
|
41
|
+
TokenPermissions: [
|
|
42
|
+
{
|
|
43
|
+
name: 'token',
|
|
44
|
+
type: 'address'
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'amount',
|
|
48
|
+
type: 'uint256'
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
};
|
|
52
|
+
export var PERMIT_TRANSFER_FROM_TYPES = _object_spread({
|
|
53
|
+
PermitTransferFrom: [
|
|
54
|
+
{
|
|
55
|
+
name: 'permitted',
|
|
56
|
+
type: 'TokenPermissions'
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'spender',
|
|
60
|
+
type: 'address'
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'nonce',
|
|
64
|
+
type: 'uint256'
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'deadline',
|
|
68
|
+
type: 'uint256'
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}, TOKEN_PERMISSIONS);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
function _class_call_check(instance, Constructor) {
|
|
2
|
+
if (!(instance instanceof Constructor)) {
|
|
3
|
+
throw new TypeError("Cannot call a class as a function");
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
function _defineProperties(target, props) {
|
|
7
|
+
for(var i = 0; i < props.length; i++){
|
|
8
|
+
var descriptor = props[i];
|
|
9
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
10
|
+
descriptor.configurable = true;
|
|
11
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
12
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function _create_class(Constructor, protoProps, staticProps) {
|
|
16
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
17
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
18
|
+
return Constructor;
|
|
19
|
+
}
|
|
20
|
+
function _define_property(obj, key, value) {
|
|
21
|
+
if (key in obj) {
|
|
22
|
+
Object.defineProperty(obj, key, {
|
|
23
|
+
value: value,
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true
|
|
27
|
+
});
|
|
28
|
+
} else {
|
|
29
|
+
obj[key] = value;
|
|
30
|
+
}
|
|
31
|
+
return obj;
|
|
32
|
+
}
|
|
33
|
+
function _object_spread(target) {
|
|
34
|
+
for(var i = 1; i < arguments.length; i++){
|
|
35
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
36
|
+
var ownKeys = Object.keys(source);
|
|
37
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
38
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
39
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
ownKeys.forEach(function(key) {
|
|
43
|
+
_define_property(target, key, source[key]);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return target;
|
|
47
|
+
}
|
|
48
|
+
import { PERMIT2_DOMAIN_NAME, PERMIT_TRANSFER_FROM_TYPES } from './constants.js';
|
|
49
|
+
import { getPermit2Address } from './utils.js';
|
|
50
|
+
import { encodeTransferFromSuffix } from './transfer-from-suffix.js';
|
|
51
|
+
export var PermitTransferFrom = /*#__PURE__*/ function() {
|
|
52
|
+
"use strict";
|
|
53
|
+
function PermitTransferFrom(token, maxSpendAmount, spender, nonce, deadline) {
|
|
54
|
+
_class_call_check(this, PermitTransferFrom);
|
|
55
|
+
_define_property(this, "token", void 0);
|
|
56
|
+
_define_property(this, "maxSpendAmount", void 0);
|
|
57
|
+
_define_property(this, "spender", void 0);
|
|
58
|
+
_define_property(this, "nonce", void 0);
|
|
59
|
+
_define_property(this, "deadline", void 0);
|
|
60
|
+
this.token = token;
|
|
61
|
+
this.maxSpendAmount = maxSpendAmount;
|
|
62
|
+
this.spender = spender;
|
|
63
|
+
this.nonce = nonce;
|
|
64
|
+
this.deadline = deadline;
|
|
65
|
+
}
|
|
66
|
+
_create_class(PermitTransferFrom, [
|
|
67
|
+
{
|
|
68
|
+
key: "getTypedData",
|
|
69
|
+
value: function getTypedData(chainId) {
|
|
70
|
+
var permit2Address = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : getPermit2Address(chainId);
|
|
71
|
+
return {
|
|
72
|
+
primaryType: 'PermitTransferFrom',
|
|
73
|
+
types: _object_spread({}, PERMIT_TRANSFER_FROM_TYPES),
|
|
74
|
+
domain: {
|
|
75
|
+
name: PERMIT2_DOMAIN_NAME,
|
|
76
|
+
chainId: chainId,
|
|
77
|
+
verifyingContract: permit2Address
|
|
78
|
+
},
|
|
79
|
+
message: {
|
|
80
|
+
permitted: {
|
|
81
|
+
token: this.token.toString(),
|
|
82
|
+
amount: this.maxSpendAmount
|
|
83
|
+
},
|
|
84
|
+
spender: this.spender.toString(),
|
|
85
|
+
nonce: this.nonce,
|
|
86
|
+
deadline: this.deadline
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
key: "getTransferFromSuffix",
|
|
93
|
+
value: /**
|
|
94
|
+
* ABI-encodes the Permit2 suffix appended to `transferFrom(from,to,amount)` calldata.
|
|
95
|
+
*
|
|
96
|
+
* The limit order protocol calls `_callTransferFromWithSuffix` on the Permit2Proxy,
|
|
97
|
+
* which has `func_nZHTch(address,address,uint256,((address,uint256),uint256,uint256),bytes)`
|
|
98
|
+
* with selector 0x23b872dd (same as transferFrom). The suffix is everything after (from,to,amount).
|
|
99
|
+
*/ function getTransferFromSuffix(signature) {
|
|
100
|
+
return encodeTransferFromSuffix(this.token, this.maxSpendAmount, this.nonce, this.deadline, signature);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
]);
|
|
104
|
+
return PermitTransferFrom;
|
|
105
|
+
}();
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
2
|
+
try {
|
|
3
|
+
var info = gen[key](arg);
|
|
4
|
+
var value = info.value;
|
|
5
|
+
} catch (error) {
|
|
6
|
+
reject(error);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
if (info.done) {
|
|
10
|
+
resolve(value);
|
|
11
|
+
} else {
|
|
12
|
+
Promise.resolve(value).then(_next, _throw);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function _async_to_generator(fn) {
|
|
16
|
+
return function() {
|
|
17
|
+
var self = this, args = arguments;
|
|
18
|
+
return new Promise(function(resolve, reject) {
|
|
19
|
+
var gen = fn.apply(self, args);
|
|
20
|
+
function _next(value) {
|
|
21
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
22
|
+
}
|
|
23
|
+
function _throw(err) {
|
|
24
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
25
|
+
}
|
|
26
|
+
_next(undefined);
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function _define_property(obj, key, value) {
|
|
31
|
+
if (key in obj) {
|
|
32
|
+
Object.defineProperty(obj, key, {
|
|
33
|
+
value: value,
|
|
34
|
+
enumerable: true,
|
|
35
|
+
configurable: true,
|
|
36
|
+
writable: true
|
|
37
|
+
});
|
|
38
|
+
} else {
|
|
39
|
+
obj[key] = value;
|
|
40
|
+
}
|
|
41
|
+
return obj;
|
|
42
|
+
}
|
|
43
|
+
function _object_spread(target) {
|
|
44
|
+
for(var i = 1; i < arguments.length; i++){
|
|
45
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
46
|
+
var ownKeys = Object.keys(source);
|
|
47
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
48
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
49
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
ownKeys.forEach(function(key) {
|
|
53
|
+
_define_property(target, key, source[key]);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return target;
|
|
57
|
+
}
|
|
58
|
+
function _ts_generator(thisArg, body) {
|
|
59
|
+
var f, y, t, g, _ = {
|
|
60
|
+
label: 0,
|
|
61
|
+
sent: function() {
|
|
62
|
+
if (t[0] & 1) throw t[1];
|
|
63
|
+
return t[1];
|
|
64
|
+
},
|
|
65
|
+
trys: [],
|
|
66
|
+
ops: []
|
|
67
|
+
};
|
|
68
|
+
return g = {
|
|
69
|
+
next: verb(0),
|
|
70
|
+
"throw": verb(1),
|
|
71
|
+
"return": verb(2)
|
|
72
|
+
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
73
|
+
return this;
|
|
74
|
+
}), g;
|
|
75
|
+
function verb(n) {
|
|
76
|
+
return function(v) {
|
|
77
|
+
return step([
|
|
78
|
+
n,
|
|
79
|
+
v
|
|
80
|
+
]);
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function step(op) {
|
|
84
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
85
|
+
while(_)try {
|
|
86
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
87
|
+
if (y = 0, t) op = [
|
|
88
|
+
op[0] & 2,
|
|
89
|
+
t.value
|
|
90
|
+
];
|
|
91
|
+
switch(op[0]){
|
|
92
|
+
case 0:
|
|
93
|
+
case 1:
|
|
94
|
+
t = op;
|
|
95
|
+
break;
|
|
96
|
+
case 4:
|
|
97
|
+
_.label++;
|
|
98
|
+
return {
|
|
99
|
+
value: op[1],
|
|
100
|
+
done: false
|
|
101
|
+
};
|
|
102
|
+
case 5:
|
|
103
|
+
_.label++;
|
|
104
|
+
y = op[1];
|
|
105
|
+
op = [
|
|
106
|
+
0
|
|
107
|
+
];
|
|
108
|
+
continue;
|
|
109
|
+
case 7:
|
|
110
|
+
op = _.ops.pop();
|
|
111
|
+
_.trys.pop();
|
|
112
|
+
continue;
|
|
113
|
+
default:
|
|
114
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
115
|
+
_ = 0;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
119
|
+
_.label = op[1];
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
123
|
+
_.label = t[1];
|
|
124
|
+
t = op;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
if (t && _.label < t[2]) {
|
|
128
|
+
_.label = t[2];
|
|
129
|
+
_.ops.push(op);
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
if (t[2]) _.ops.pop();
|
|
133
|
+
_.trys.pop();
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
op = body.call(thisArg, _);
|
|
137
|
+
} catch (e) {
|
|
138
|
+
op = [
|
|
139
|
+
6,
|
|
140
|
+
e
|
|
141
|
+
];
|
|
142
|
+
y = 0;
|
|
143
|
+
} finally{
|
|
144
|
+
f = t = 0;
|
|
145
|
+
}
|
|
146
|
+
if (op[0] & 5) throw op[1];
|
|
147
|
+
return {
|
|
148
|
+
value: op[0] ? op[1] : void 0,
|
|
149
|
+
done: true
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
import { Address } from '@1inch/limit-order-sdk';
|
|
154
|
+
import { verifyTypedData, Wallet } from 'ethers';
|
|
155
|
+
import { PermitTransferFrom } from './permit-transfer-from.js';
|
|
156
|
+
import { PERMIT2_DOMAIN_NAME, PERMIT_TRANSFER_FROM_TYPES } from './constants.js';
|
|
157
|
+
import { getPermit2Address } from './utils.js';
|
|
158
|
+
import { NetworkEnum } from '../../constants.js';
|
|
159
|
+
describe('PermitTransferFrom', function() {
|
|
160
|
+
var token = new Address('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2');
|
|
161
|
+
var spender = new Address('0x1111111254eeb25477b68fb85ed929f73a960582');
|
|
162
|
+
var maxSpendAmount = 1000000000000000000n;
|
|
163
|
+
var nonce = 42n;
|
|
164
|
+
var deadline = 1700000000n;
|
|
165
|
+
it('should return correct typed data for ethereum', function() {
|
|
166
|
+
var permit = new PermitTransferFrom(token, maxSpendAmount, spender, nonce, deadline);
|
|
167
|
+
var typedData = permit.getTypedData(NetworkEnum.ETHEREUM);
|
|
168
|
+
expect(typedData).toStrictEqual({
|
|
169
|
+
primaryType: 'PermitTransferFrom',
|
|
170
|
+
types: PERMIT_TRANSFER_FROM_TYPES,
|
|
171
|
+
domain: {
|
|
172
|
+
name: PERMIT2_DOMAIN_NAME,
|
|
173
|
+
chainId: NetworkEnum.ETHEREUM,
|
|
174
|
+
verifyingContract: getPermit2Address(NetworkEnum.ETHEREUM)
|
|
175
|
+
},
|
|
176
|
+
message: {
|
|
177
|
+
permitted: {
|
|
178
|
+
token: token.toString(),
|
|
179
|
+
amount: maxSpendAmount
|
|
180
|
+
},
|
|
181
|
+
spender: spender.toString(),
|
|
182
|
+
nonce: nonce,
|
|
183
|
+
deadline: deadline
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
it('should use zksync permit2 address for zksync chain', function() {
|
|
188
|
+
var permit = new PermitTransferFrom(token, maxSpendAmount, spender, nonce, deadline);
|
|
189
|
+
var typedData = permit.getTypedData(NetworkEnum.ZKSYNC);
|
|
190
|
+
expect(typedData.domain.verifyingContract).toBe(getPermit2Address(NetworkEnum.ZKSYNC));
|
|
191
|
+
});
|
|
192
|
+
it('should use custom permit2 address when provided', function() {
|
|
193
|
+
var customPermit2 = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
|
|
194
|
+
var permit = new PermitTransferFrom(token, maxSpendAmount, spender, nonce, deadline);
|
|
195
|
+
var typedData = permit.getTypedData(NetworkEnum.ETHEREUM, customPermit2);
|
|
196
|
+
expect(typedData.domain.verifyingContract).toBe(customPermit2);
|
|
197
|
+
});
|
|
198
|
+
it('should throw for unsupported chain id without custom address', function() {
|
|
199
|
+
var permit = new PermitTransferFrom(token, maxSpendAmount, spender, nonce, deadline);
|
|
200
|
+
expect(function() {
|
|
201
|
+
return permit.getTypedData(999);
|
|
202
|
+
}).toThrow('unsupported chainId');
|
|
203
|
+
});
|
|
204
|
+
it('should produce signable typed data that recovers to the signer', /*#__PURE__*/ _async_to_generator(function() {
|
|
205
|
+
var wallet, permit, typedData, types, signature, recovered;
|
|
206
|
+
return _ts_generator(this, function(_state) {
|
|
207
|
+
switch(_state.label){
|
|
208
|
+
case 0:
|
|
209
|
+
wallet = Wallet.createRandom();
|
|
210
|
+
permit = new PermitTransferFrom(token, maxSpendAmount, spender, nonce, deadline);
|
|
211
|
+
typedData = permit.getTypedData(NetworkEnum.ETHEREUM);
|
|
212
|
+
types = _object_spread({}, typedData.types);
|
|
213
|
+
delete types['EIP712Domain'];
|
|
214
|
+
return [
|
|
215
|
+
4,
|
|
216
|
+
wallet.signTypedData(typedData.domain, types, typedData.message)
|
|
217
|
+
];
|
|
218
|
+
case 1:
|
|
219
|
+
signature = _state.sent();
|
|
220
|
+
recovered = verifyTypedData(typedData.domain, types, typedData.message, signature);
|
|
221
|
+
expect(recovered).toBe(wallet.address);
|
|
222
|
+
return [
|
|
223
|
+
2
|
|
224
|
+
];
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}));
|
|
228
|
+
});
|