@stryke-xyz/premarket-sdk 1.0.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/dist/abi/AggregationRouterV6.abi.json +1186 -0
- package/dist/abi/NativeOrderFactory.abi.json +291 -0
- package/dist/abi/NativeOrderImpl.abi.json +381 -0
- package/dist/abi/limitOrderProtocol.json +63 -0
- package/dist/address.d.ts +13 -0
- package/dist/address.js +32 -0
- package/dist/api/filler.d.ts +109 -0
- package/dist/api/filler.js +289 -0
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.js +3 -0
- package/dist/api/order-helper.d.ts +59 -0
- package/dist/api/order-helper.js +112 -0
- package/dist/api/orderbook-api.d.ts +36 -0
- package/dist/api/orderbook-api.js +69 -0
- package/dist/bps.d.ts +35 -0
- package/dist/bps.js +52 -0
- package/dist/config/chains.d.ts +50 -0
- package/dist/config/chains.js +21 -0
- package/dist/config/index.d.ts +25 -0
- package/dist/config/index.js +103 -0
- package/dist/config/markets.d.ts +53 -0
- package/dist/config/markets.js +125 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.js +30 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +21 -0
- package/dist/limit-order/amounts.d.ts +14 -0
- package/dist/limit-order/amounts.js +19 -0
- package/dist/limit-order/eip712/domain.d.ts +10 -0
- package/dist/limit-order/eip712/domain.js +18 -0
- package/dist/limit-order/eip712/eip712.types.d.ts +23 -0
- package/dist/limit-order/eip712/eip712.types.js +1 -0
- package/dist/limit-order/eip712/index.d.ts +3 -0
- package/dist/limit-order/eip712/index.js +3 -0
- package/dist/limit-order/eip712/order-typed-data-builder.d.ts +6 -0
- package/dist/limit-order/eip712/order-typed-data-builder.js +25 -0
- package/dist/limit-order/extensions/extension-builder.d.ts +35 -0
- package/dist/limit-order/extensions/extension-builder.js +83 -0
- package/dist/limit-order/extensions/extension.d.ts +45 -0
- package/dist/limit-order/extensions/extension.js +108 -0
- package/dist/limit-order/extensions/extension.spec.d.ts +1 -0
- package/dist/limit-order/extensions/extension.spec.js +17 -0
- package/dist/limit-order/extensions/fee-taker/errors.d.ts +2 -0
- package/dist/limit-order/extensions/fee-taker/errors.js +2 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.d.ts +40 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.js +83 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.spec.d.ts +1 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.spec.js +14 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.d.ts +130 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.js +249 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.spec.d.ts +1 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.spec.js +72 -0
- package/dist/limit-order/extensions/fee-taker/fees.d.ts +19 -0
- package/dist/limit-order/extensions/fee-taker/fees.js +36 -0
- package/dist/limit-order/extensions/fee-taker/index.d.ts +7 -0
- package/dist/limit-order/extensions/fee-taker/index.js +7 -0
- package/dist/limit-order/extensions/fee-taker/integrator-fee.d.ts +13 -0
- package/dist/limit-order/extensions/fee-taker/integrator-fee.js +28 -0
- package/dist/limit-order/extensions/fee-taker/resolver-fee.d.ts +19 -0
- package/dist/limit-order/extensions/fee-taker/resolver-fee.js +28 -0
- package/dist/limit-order/extensions/fee-taker/types.d.ts +4 -0
- package/dist/limit-order/extensions/fee-taker/types.js +1 -0
- package/dist/limit-order/extensions/fee-taker/whitelist-half-address.d.ts +18 -0
- package/dist/limit-order/extensions/fee-taker/whitelist-half-address.js +26 -0
- package/dist/limit-order/extensions/index.d.ts +3 -0
- package/dist/limit-order/extensions/index.js +3 -0
- package/dist/limit-order/index.d.ts +10 -0
- package/dist/limit-order/index.js +10 -0
- package/dist/limit-order/interaction.d.ts +16 -0
- package/dist/limit-order/interaction.js +25 -0
- package/dist/limit-order/interaction.spec.d.ts +1 -0
- package/dist/limit-order/interaction.spec.js +8 -0
- package/dist/limit-order/limit-order-with-fee.d.ts +59 -0
- package/dist/limit-order/limit-order-with-fee.js +94 -0
- package/dist/limit-order/limit-order-with-fee.spec.d.ts +1 -0
- package/dist/limit-order/limit-order-with-fee.spec.js +31 -0
- package/dist/limit-order/limit-order.d.ts +63 -0
- package/dist/limit-order/limit-order.js +211 -0
- package/dist/limit-order/limit-order.spec.d.ts +1 -0
- package/dist/limit-order/limit-order.spec.js +103 -0
- package/dist/limit-order/maker-traits.d.ts +200 -0
- package/dist/limit-order/maker-traits.js +309 -0
- package/dist/limit-order/maker-traits.spec.d.ts +1 -0
- package/dist/limit-order/maker-traits.spec.js +102 -0
- package/dist/limit-order/source-track.d.ts +1 -0
- package/dist/limit-order/source-track.js +22 -0
- package/dist/limit-order/taker-traits.d.ts +141 -0
- package/dist/limit-order/taker-traits.js +207 -0
- package/dist/limit-order/types.d.ts +24 -0
- package/dist/limit-order/types.js +1 -0
- package/dist/limit-order/verification.d.ts +16 -0
- package/dist/limit-order/verification.js +108 -0
- package/dist/limit-order-contract/index.d.ts +4 -0
- package/dist/limit-order-contract/index.js +4 -0
- package/dist/limit-order-contract/limit-order-contract.d.ts +34 -0
- package/dist/limit-order-contract/limit-order-contract.js +79 -0
- package/dist/limit-order-contract/native-order-factory.d.ts +10 -0
- package/dist/limit-order-contract/native-order-factory.js +22 -0
- package/dist/limit-order-contract/native-order-impl.d.ts +10 -0
- package/dist/limit-order-contract/native-order-impl.js +24 -0
- package/dist/limit-order-contract/proxy-factory.d.ts +20 -0
- package/dist/limit-order-contract/proxy-factory.js +32 -0
- package/dist/limit-order-contract/proxy-factory.spec.d.ts +1 -0
- package/dist/limit-order-contract/proxy-factory.spec.js +16 -0
- package/dist/limit-order-contract/types.d.ts +6 -0
- package/dist/limit-order-contract/types.js +1 -0
- package/dist/ponder/client/index.d.ts +23 -0
- package/dist/ponder/client/index.js +44 -0
- package/dist/ponder/client/queries/markets.d.ts +30 -0
- package/dist/ponder/client/queries/markets.js +200 -0
- package/dist/ponder/client/queries/positions.d.ts +13 -0
- package/dist/ponder/client/queries/positions.js +406 -0
- package/dist/ponder/client/types/history.d.ts +94 -0
- package/dist/ponder/client/types/history.js +1 -0
- package/dist/ponder/client/types/index.d.ts +5 -0
- package/dist/ponder/client/types/index.js +5 -0
- package/dist/ponder/client/types/market.d.ts +45 -0
- package/dist/ponder/client/types/market.js +1 -0
- package/dist/ponder/client/types/position.d.ts +32 -0
- package/dist/ponder/client/types/position.js +1 -0
- package/dist/ponder/client/types/serializers.d.ts +57 -0
- package/dist/ponder/client/types/serializers.js +248 -0
- package/dist/ponder/client/types/user.d.ts +5 -0
- package/dist/ponder/client/types/user.js +1 -0
- package/dist/ponder/client/utils.d.ts +1 -0
- package/dist/ponder/client/utils.js +32 -0
- package/dist/ponder/generated/index.d.ts +18 -0
- package/dist/ponder/generated/index.js +20 -0
- package/dist/ponder/generated/runtime/batcher.d.ts +105 -0
- package/dist/ponder/generated/runtime/batcher.js +188 -0
- package/dist/ponder/generated/runtime/createClient.d.ts +17 -0
- package/dist/ponder/generated/runtime/createClient.js +24 -0
- package/dist/ponder/generated/runtime/error.d.ts +18 -0
- package/dist/ponder/generated/runtime/error.js +15 -0
- package/dist/ponder/generated/runtime/fetcher.d.ts +10 -0
- package/dist/ponder/generated/runtime/fetcher.js +67 -0
- package/dist/ponder/generated/runtime/generateGraphqlOperation.d.ts +30 -0
- package/dist/ponder/generated/runtime/generateGraphqlOperation.js +128 -0
- package/dist/ponder/generated/runtime/index.d.ts +11 -0
- package/dist/ponder/generated/runtime/index.js +10 -0
- package/dist/ponder/generated/runtime/linkTypeMap.d.ts +9 -0
- package/dist/ponder/generated/runtime/linkTypeMap.js +83 -0
- package/dist/ponder/generated/runtime/typeSelection.d.ts +28 -0
- package/dist/ponder/generated/runtime/typeSelection.js +3 -0
- package/dist/ponder/generated/runtime/types.d.ts +55 -0
- package/dist/ponder/generated/runtime/types.js +2 -0
- package/dist/ponder/generated/schema.d.ts +3026 -0
- package/dist/ponder/generated/schema.js +222 -0
- package/dist/ponder/generated/types.d.ts +2393 -0
- package/dist/ponder/generated/types.js +6915 -0
- package/dist/ponder/index.d.ts +2 -0
- package/dist/ponder/index.js +2 -0
- package/dist/ponder/types.d.ts +3 -0
- package/dist/ponder/types.js +1 -0
- package/dist/rfq-order/index.d.ts +1 -0
- package/dist/rfq-order/index.js +1 -0
- package/dist/rfq-order/rfq-order.d.ts +21 -0
- package/dist/rfq-order/rfq-order.js +22 -0
- package/dist/rfq-order/rfq-order.spec.d.ts +1 -0
- package/dist/rfq-order/rfq-order.spec.js +27 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/types.d.ts +79 -0
- package/dist/shared/types.js +12 -0
- package/dist/shared/utils.d.ts +7 -0
- package/dist/shared/utils.js +19 -0
- package/dist/sync/clients/balance-client.d.ts +41 -0
- package/dist/sync/clients/balance-client.js +139 -0
- package/dist/sync/clients/base-client.d.ts +47 -0
- package/dist/sync/clients/base-client.js +154 -0
- package/dist/sync/clients/order-client.d.ts +18 -0
- package/dist/sync/clients/order-client.js +151 -0
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +3 -0
- package/dist/sync/redis-ws-client.d.ts +18 -0
- package/dist/sync/redis-ws-client.js +88 -0
- package/dist/sync/types.d.ts +20 -0
- package/dist/sync/types.js +1 -0
- package/dist/utils/mul-div.d.ts +5 -0
- package/dist/utils/mul-div.js +13 -0
- package/dist/utils/orderUtils.d.ts +19 -0
- package/dist/utils/orderUtils.js +51 -0
- package/dist/utils/rand-bigint.d.ts +1 -0
- package/dist/utils/rand-bigint.js +13 -0
- package/dist/utils/rand-bigint.spec.d.ts +1 -0
- package/dist/utils/rand-bigint.spec.js +11 -0
- package/dist/validations.d.ts +1 -0
- package/dist/validations.js +3 -0
- package/package.json +60 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export class WhitelistHalfAddress {
|
|
2
|
+
constructor(
|
|
3
|
+
/**
|
|
4
|
+
* Last 10 bytes of addresses
|
|
5
|
+
*/
|
|
6
|
+
addresses) {
|
|
7
|
+
this.addresses = addresses;
|
|
8
|
+
}
|
|
9
|
+
get length() {
|
|
10
|
+
return this.addresses.length;
|
|
11
|
+
}
|
|
12
|
+
static new(addresses) {
|
|
13
|
+
return new WhitelistHalfAddress(addresses?.map((w) => w.lastHalf()) || []);
|
|
14
|
+
}
|
|
15
|
+
isWhitelisted(address) {
|
|
16
|
+
const half = address.lastHalf();
|
|
17
|
+
return this.addresses.some((w) => w === half);
|
|
18
|
+
}
|
|
19
|
+
encodeTo(builder) {
|
|
20
|
+
builder.addUint8(BigInt(this.addresses.length));
|
|
21
|
+
for (const halfAddress of this.addresses) {
|
|
22
|
+
builder.addBytes(halfAddress);
|
|
23
|
+
}
|
|
24
|
+
return builder;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './eip712/index.js';
|
|
2
|
+
export * from './limit-order.js';
|
|
3
|
+
export * from './limit-order-with-fee.js';
|
|
4
|
+
export * from './maker-traits.js';
|
|
5
|
+
export * from './taker-traits.js';
|
|
6
|
+
export * from './extensions/index.js';
|
|
7
|
+
export * from './interaction.js';
|
|
8
|
+
export * from './types.js';
|
|
9
|
+
export * from './amounts.js';
|
|
10
|
+
export * from './verification.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './eip712/index.js';
|
|
2
|
+
export * from './limit-order.js';
|
|
3
|
+
export * from './limit-order-with-fee.js';
|
|
4
|
+
export * from './maker-traits.js';
|
|
5
|
+
export * from './taker-traits.js';
|
|
6
|
+
export * from './extensions/index.js';
|
|
7
|
+
export * from './interaction.js';
|
|
8
|
+
export * from './types.js';
|
|
9
|
+
export * from './amounts.js';
|
|
10
|
+
export * from './verification.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Address } from '../address.js';
|
|
2
|
+
export declare class Interaction {
|
|
3
|
+
readonly target: Address;
|
|
4
|
+
readonly data: string;
|
|
5
|
+
constructor(target: Address, data: string);
|
|
6
|
+
/**
|
|
7
|
+
* Create `Interaction` from bytes
|
|
8
|
+
*
|
|
9
|
+
* @param bytes Hex string with 0x. First 20 bytes are target, then data
|
|
10
|
+
*/
|
|
11
|
+
static decode(bytes: string): Interaction;
|
|
12
|
+
/**
|
|
13
|
+
* Hex string with 0x. First 20 bytes are target, then data
|
|
14
|
+
*/
|
|
15
|
+
encode(): string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BytesIter, isHexBytes, trim0x } from '@1inch/byte-utils';
|
|
2
|
+
import assert from 'assert';
|
|
3
|
+
import { Address } from '../address.js';
|
|
4
|
+
export class Interaction {
|
|
5
|
+
constructor(target, data) {
|
|
6
|
+
this.target = target;
|
|
7
|
+
this.data = data;
|
|
8
|
+
assert(isHexBytes(data), 'Interaction data must be valid hex bytes');
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create `Interaction` from bytes
|
|
12
|
+
*
|
|
13
|
+
* @param bytes Hex string with 0x. First 20 bytes are target, then data
|
|
14
|
+
*/
|
|
15
|
+
static decode(bytes) {
|
|
16
|
+
const iter = BytesIter.HexString(bytes);
|
|
17
|
+
return new Interaction(new Address(iter.nextUint160()), iter.rest());
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Hex string with 0x. First 20 bytes are target, then data
|
|
21
|
+
*/
|
|
22
|
+
encode() {
|
|
23
|
+
return this.target.toString() + trim0x(this.data);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Interaction } from './interaction.js';
|
|
2
|
+
import { Address } from '../address.js';
|
|
3
|
+
describe('Interaction', () => {
|
|
4
|
+
it('should encode/decode', () => {
|
|
5
|
+
const interaction = new Interaction(Address.fromBigInt(1337n), '0xdeadbeef');
|
|
6
|
+
expect(Interaction.decode(interaction.encode())).toStrictEqual(interaction);
|
|
7
|
+
});
|
|
8
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { FeeTakerExtension } from './extensions/fee-taker/fee-taker.extension.js';
|
|
2
|
+
import { LimitOrder } from './limit-order.js';
|
|
3
|
+
import { LimitOrderV4Struct, OrderInfoData } from './types.js';
|
|
4
|
+
import { MakerTraits } from './maker-traits.js';
|
|
5
|
+
import { Extension } from './extensions/extension.js';
|
|
6
|
+
import { Address } from '../address.js';
|
|
7
|
+
export declare class LimitOrderWithFee extends LimitOrder {
|
|
8
|
+
readonly feeExtension: FeeTakerExtension;
|
|
9
|
+
constructor(
|
|
10
|
+
/**
|
|
11
|
+
* Use `FeeTakerExtension.customReceiver` to set custom receiver
|
|
12
|
+
*/
|
|
13
|
+
orderInfo: Omit<OrderInfoData, 'receiver'>, makerTraits: MakerTraits | undefined, feeExtension: FeeTakerExtension);
|
|
14
|
+
/**
|
|
15
|
+
* Set random nonce to `makerTraits` and creates `LimitOrderWithFee`
|
|
16
|
+
*/
|
|
17
|
+
static withRandomNonce(
|
|
18
|
+
/**
|
|
19
|
+
* Use `FeeTakerExtension.recipients.tokensRecipient` to set custom receiver
|
|
20
|
+
*/
|
|
21
|
+
orderInfo: Omit<OrderInfoData, 'receiver'>, feeExtension: FeeTakerExtension, makerTraits?: MakerTraits): LimitOrderWithFee;
|
|
22
|
+
static fromDataAndExtension(data: LimitOrderV4Struct, extension: Extension): LimitOrderWithFee;
|
|
23
|
+
/**
|
|
24
|
+
* Calculates the `takingAmount` required from the taker in exchange for the `makingAmount`
|
|
25
|
+
*
|
|
26
|
+
* @param taker
|
|
27
|
+
* @param makingAmount amount to be filled
|
|
28
|
+
*/
|
|
29
|
+
getTakingAmount(taker: Address, makingAmount?: bigint): bigint;
|
|
30
|
+
/**
|
|
31
|
+
* Calculates the `makingAmount` that the taker receives in exchange for the `takingAmount`
|
|
32
|
+
*
|
|
33
|
+
* @param taker
|
|
34
|
+
* @param takingAmount amount to be filled
|
|
35
|
+
*/
|
|
36
|
+
getMakingAmount(taker: Address, takingAmount?: bigint): bigint;
|
|
37
|
+
/**
|
|
38
|
+
* Fee in `takerAsset` which resolver pays to resolver fee receiver
|
|
39
|
+
*
|
|
40
|
+
* @param taker who will fill order
|
|
41
|
+
* @param makingAmount amount wanted to fill
|
|
42
|
+
*/
|
|
43
|
+
getResolverFee(taker: Address, makingAmount?: bigint): bigint;
|
|
44
|
+
/**
|
|
45
|
+
* Fee in `takerAsset` which integrator gets to integrator wallet
|
|
46
|
+
*
|
|
47
|
+
* @param taker who will fill order
|
|
48
|
+
* @param makingAmount amount wanted to fill
|
|
49
|
+
*/
|
|
50
|
+
getIntegratorFee(taker: Address, makingAmount?: bigint): bigint;
|
|
51
|
+
/**
|
|
52
|
+
* Fee in `takerAsset` which protocol gets
|
|
53
|
+
* It equals to `share from integrator fee plus resolver fee`
|
|
54
|
+
*
|
|
55
|
+
* @param taker who will fill order
|
|
56
|
+
* @param makingAmount amount wanted to fill
|
|
57
|
+
*/
|
|
58
|
+
getProtocolFee(taker: Address, makingAmount?: bigint): bigint;
|
|
59
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { UINT_40_MAX } from '@1inch/byte-utils';
|
|
2
|
+
import assert from 'assert';
|
|
3
|
+
import { FeeTakerExtension } from './extensions/fee-taker/fee-taker.extension.js';
|
|
4
|
+
import { LimitOrder } from './limit-order.js';
|
|
5
|
+
import { MakerTraits } from './maker-traits.js';
|
|
6
|
+
import { calcMakingAmount, calcTakingAmount } from './amounts.js';
|
|
7
|
+
import { Address } from '../address.js';
|
|
8
|
+
import { randBigInt } from '../utils/rand-bigint.js';
|
|
9
|
+
export class LimitOrderWithFee extends LimitOrder {
|
|
10
|
+
constructor(
|
|
11
|
+
/**
|
|
12
|
+
* Use `FeeTakerExtension.customReceiver` to set custom receiver
|
|
13
|
+
*/
|
|
14
|
+
orderInfo, makerTraits = MakerTraits.default(), feeExtension) {
|
|
15
|
+
makerTraits.enablePostInteraction(); // to execute extension
|
|
16
|
+
super({ ...orderInfo, receiver: feeExtension.address }, makerTraits, feeExtension.build());
|
|
17
|
+
this.feeExtension = feeExtension;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Set random nonce to `makerTraits` and creates `LimitOrderWithFee`
|
|
21
|
+
*/
|
|
22
|
+
static withRandomNonce(
|
|
23
|
+
/**
|
|
24
|
+
* Use `FeeTakerExtension.recipients.tokensRecipient` to set custom receiver
|
|
25
|
+
*/
|
|
26
|
+
orderInfo, feeExtension, makerTraits = MakerTraits.default()) {
|
|
27
|
+
makerTraits.withNonce(randBigInt(UINT_40_MAX));
|
|
28
|
+
return new LimitOrderWithFee(orderInfo, makerTraits, feeExtension);
|
|
29
|
+
}
|
|
30
|
+
static fromDataAndExtension(data, extension) {
|
|
31
|
+
const makerTraits = new MakerTraits(BigInt(data.makerTraits));
|
|
32
|
+
const feeExt = FeeTakerExtension.fromExtension(extension);
|
|
33
|
+
assert(feeExt.address.equal(new Address(data.receiver)), `invalid order: receiver must be FeeTaker extension address`);
|
|
34
|
+
return new LimitOrderWithFee({
|
|
35
|
+
salt: BigInt(data.salt),
|
|
36
|
+
maker: new Address(data.maker),
|
|
37
|
+
makerAsset: new Address(data.makerAsset),
|
|
38
|
+
takerAsset: new Address(data.takerAsset),
|
|
39
|
+
makingAmount: BigInt(data.makingAmount),
|
|
40
|
+
takingAmount: BigInt(data.takingAmount)
|
|
41
|
+
}, makerTraits, feeExt);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Calculates the `takingAmount` required from the taker in exchange for the `makingAmount`
|
|
45
|
+
*
|
|
46
|
+
* @param taker
|
|
47
|
+
* @param makingAmount amount to be filled
|
|
48
|
+
*/
|
|
49
|
+
getTakingAmount(taker, makingAmount = this.makingAmount) {
|
|
50
|
+
const takingAmount = calcTakingAmount(makingAmount, this.makingAmount, this.takingAmount);
|
|
51
|
+
return this.feeExtension.getTakingAmount(taker, takingAmount);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Calculates the `makingAmount` that the taker receives in exchange for the `takingAmount`
|
|
55
|
+
*
|
|
56
|
+
* @param taker
|
|
57
|
+
* @param takingAmount amount to be filled
|
|
58
|
+
*/
|
|
59
|
+
getMakingAmount(taker, takingAmount = this.takingAmount) {
|
|
60
|
+
const makingAmount = calcMakingAmount(takingAmount, this.makingAmount, this.takingAmount);
|
|
61
|
+
return this.feeExtension.getMakingAmount(taker, makingAmount);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Fee in `takerAsset` which resolver pays to resolver fee receiver
|
|
65
|
+
*
|
|
66
|
+
* @param taker who will fill order
|
|
67
|
+
* @param makingAmount amount wanted to fill
|
|
68
|
+
*/
|
|
69
|
+
getResolverFee(taker, makingAmount = this.makingAmount) {
|
|
70
|
+
const takingAmount = calcTakingAmount(makingAmount, this.makingAmount, this.takingAmount);
|
|
71
|
+
return this.feeExtension.getResolverFee(taker, takingAmount);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Fee in `takerAsset` which integrator gets to integrator wallet
|
|
75
|
+
*
|
|
76
|
+
* @param taker who will fill order
|
|
77
|
+
* @param makingAmount amount wanted to fill
|
|
78
|
+
*/
|
|
79
|
+
getIntegratorFee(taker, makingAmount = this.makingAmount) {
|
|
80
|
+
const takingAmount = calcTakingAmount(makingAmount, this.makingAmount, this.takingAmount);
|
|
81
|
+
return this.feeExtension.getIntegratorFee(taker, takingAmount);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Fee in `takerAsset` which protocol gets
|
|
85
|
+
* It equals to `share from integrator fee plus resolver fee`
|
|
86
|
+
*
|
|
87
|
+
* @param taker who will fill order
|
|
88
|
+
* @param makingAmount amount wanted to fill
|
|
89
|
+
*/
|
|
90
|
+
getProtocolFee(taker, makingAmount = this.makingAmount) {
|
|
91
|
+
const takingAmount = calcTakingAmount(makingAmount, this.makingAmount, this.takingAmount);
|
|
92
|
+
return this.feeExtension.getProtocolFee(taker, takingAmount);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { LimitOrderWithFee } from './limit-order-with-fee.js';
|
|
2
|
+
import { FeeTakerExtension } from './extensions/fee-taker/fee-taker.extension.js';
|
|
3
|
+
import { Fees } from './extensions/fee-taker/fees.js';
|
|
4
|
+
import { ResolverFee } from './extensions/fee-taker/resolver-fee.js';
|
|
5
|
+
import { IntegratorFee } from './extensions/fee-taker/integrator-fee.js';
|
|
6
|
+
import { Interaction } from './interaction.js';
|
|
7
|
+
import { MakerTraits } from './maker-traits.js';
|
|
8
|
+
import { Address } from '../address.js';
|
|
9
|
+
import { Bps } from '../bps.js';
|
|
10
|
+
describe('LimitOrderWithFee', () => {
|
|
11
|
+
it('should create fromDataAndExtension', () => {
|
|
12
|
+
const recipients = {
|
|
13
|
+
integratorFeeRecipient: Address.fromBigInt(2n),
|
|
14
|
+
protocolFeeRecipient: Address.fromBigInt(3n),
|
|
15
|
+
tokensRecipient: Address.fromBigInt(4n)
|
|
16
|
+
};
|
|
17
|
+
const extension = FeeTakerExtension.new(Address.fromBigInt(1n), new Fees(new ResolverFee(recipients.protocolFeeRecipient, Bps.fromPercent(2)), new IntegratorFee(recipients.integratorFeeRecipient, recipients.protocolFeeRecipient, Bps.fromFraction(0.0001), Bps.fromPercent(5))), [Address.fromBigInt(100n)], {
|
|
18
|
+
makerPermit: new Interaction(Address.fromBigInt(1n), '0xdeadbeef'),
|
|
19
|
+
extraInteraction: new Interaction(Address.fromBigInt(99n), '0xdeadbeefdeadbeef'),
|
|
20
|
+
customReceiver: recipients.tokensRecipient
|
|
21
|
+
});
|
|
22
|
+
const order = new LimitOrderWithFee({
|
|
23
|
+
makerAsset: new Address('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'),
|
|
24
|
+
takerAsset: new Address('0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'),
|
|
25
|
+
makingAmount: 1000000000000000000n,
|
|
26
|
+
takingAmount: 1420000000n,
|
|
27
|
+
maker: new Address('0x00000000219ab540356cbb839cbe05303d7705fa')
|
|
28
|
+
}, MakerTraits.default(), extension);
|
|
29
|
+
expect(LimitOrderWithFee.fromDataAndExtension(order.build(), order.extension)).toEqual(order);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { EIP712TypedData } from './eip712/index.js';
|
|
2
|
+
import { LimitOrderV4Struct, OrderInfoData } from './types.js';
|
|
3
|
+
import { MakerTraits } from './maker-traits.js';
|
|
4
|
+
import { Extension } from './extensions/extension.js';
|
|
5
|
+
import { Address } from '../address.js';
|
|
6
|
+
import { ProxyFactory } from '../limit-order-contract/index.js';
|
|
7
|
+
export declare class LimitOrder {
|
|
8
|
+
readonly extension: Extension;
|
|
9
|
+
static readonly CHAIN_TO_WRAPPER: Record<number, Address>;
|
|
10
|
+
private static readonly Web3Type;
|
|
11
|
+
readonly maker: Address;
|
|
12
|
+
receiver: Address;
|
|
13
|
+
readonly makerAsset: Address;
|
|
14
|
+
readonly takerAsset: Address;
|
|
15
|
+
readonly makingAmount: bigint;
|
|
16
|
+
readonly takingAmount: bigint;
|
|
17
|
+
readonly makerTraits: MakerTraits;
|
|
18
|
+
private _salt;
|
|
19
|
+
constructor(orderInfo: OrderInfoData, makerTraits?: MakerTraits, extension?: Extension, config?: {
|
|
20
|
+
optimizeReceiverAddress: boolean;
|
|
21
|
+
});
|
|
22
|
+
get salt(): bigint;
|
|
23
|
+
/**
|
|
24
|
+
* Build correct salt for order
|
|
25
|
+
*
|
|
26
|
+
* If order has extension - it is crucial to build correct salt
|
|
27
|
+
* otherwise order won't be ever filled
|
|
28
|
+
*
|
|
29
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/7bc5129ae19832338169ca21e4cf6331e8ff44f6/contracts/OrderLib.sol#L153
|
|
30
|
+
*
|
|
31
|
+
*/
|
|
32
|
+
static buildSalt(extension: Extension, baseSalt?: bigint): bigint;
|
|
33
|
+
static verifySalt(salt: bigint, extension: Extension): bigint;
|
|
34
|
+
static fromNative(chainId: number, nativeOrderFactory: ProxyFactory, orderInfo: Omit<OrderInfoData, 'makerAsset'>, makerTraits: MakerTraits, extension: Extension): LimitOrder;
|
|
35
|
+
static isNativeOrder(chainId: number, nativeOrderFactory: ProxyFactory, order: LimitOrderV4Struct, signature: string): boolean;
|
|
36
|
+
static fromCalldata(bytes: string): LimitOrder;
|
|
37
|
+
static fromDataAndExtension(data: LimitOrderV4Struct, extension: Extension): LimitOrder;
|
|
38
|
+
isNative(chainId: number, nativeOrderFactory: ProxyFactory, signature: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Returns signature for submitting native order on-chain
|
|
41
|
+
* Only valid if order is native
|
|
42
|
+
*
|
|
43
|
+
* @see FusionOrder.isNative
|
|
44
|
+
* @see FusionOrder.fromNative
|
|
45
|
+
*/
|
|
46
|
+
nativeSignature(maker: Address): string;
|
|
47
|
+
/**
|
|
48
|
+
* Injects source info to order `salt` [224, 255] bits
|
|
49
|
+
* check `getTrackCodeForSource` implementation for exact injected data
|
|
50
|
+
*
|
|
51
|
+
* @param source order source identifier
|
|
52
|
+
* @see getTrackCodeForSource
|
|
53
|
+
*/
|
|
54
|
+
setSource(source: string): this;
|
|
55
|
+
toCalldata(): string;
|
|
56
|
+
build(): LimitOrderV4Struct;
|
|
57
|
+
getTypedData(chainId: number): EIP712TypedData;
|
|
58
|
+
getOrderHash(chainId: number): string;
|
|
59
|
+
/**
|
|
60
|
+
* Returns true if only a specific address can fill order
|
|
61
|
+
*/
|
|
62
|
+
isPrivate(): boolean;
|
|
63
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { AbiCoder } from 'ethers';
|
|
2
|
+
import { isHexString, UINT_160_MAX, UINT_256_MAX } from '@1inch/byte-utils';
|
|
3
|
+
import assert from 'assert';
|
|
4
|
+
import { buildOrderTypedData, getLimitOrderV4Domain, getOrderHash } from './eip712/index.js';
|
|
5
|
+
import { MakerTraits } from './maker-traits.js';
|
|
6
|
+
import { Extension } from './extensions/extension.js';
|
|
7
|
+
import { injectTrackCode } from './source-track.js';
|
|
8
|
+
import { Address } from '../address.js';
|
|
9
|
+
import { randBigInt } from '../utils/rand-bigint.js';
|
|
10
|
+
export class LimitOrder {
|
|
11
|
+
constructor(orderInfo, makerTraits = new MakerTraits(0n), extension = Extension.default(), config = {
|
|
12
|
+
/**
|
|
13
|
+
* When enabled, orders where maker == receiver will have ZERO_ADDRESS set
|
|
14
|
+
* Used to save calldata costs
|
|
15
|
+
*/
|
|
16
|
+
optimizeReceiverAddress: true
|
|
17
|
+
}) {
|
|
18
|
+
this.extension = extension;
|
|
19
|
+
assert(!orderInfo.takerAsset.isNative(), `${orderInfo.takerAsset} can not be 'takerAsset'. Use wrapper address as 'takerAsset' and 'makerTraits.enableNativeUnwrap' to swap to NATIVE currency`);
|
|
20
|
+
assert(!orderInfo.makerAsset.isNative(), 'Maker asset can not be NATIVE, use wrapper');
|
|
21
|
+
this.makerAsset = orderInfo.makerAsset;
|
|
22
|
+
this.takerAsset = orderInfo.takerAsset;
|
|
23
|
+
this.makingAmount = orderInfo.makingAmount;
|
|
24
|
+
this.takingAmount = orderInfo.takingAmount;
|
|
25
|
+
this._salt = LimitOrder.verifySalt(orderInfo.salt || LimitOrder.buildSalt(extension), extension);
|
|
26
|
+
this.maker = orderInfo.maker;
|
|
27
|
+
if (config.optimizeReceiverAddress) {
|
|
28
|
+
this.receiver = orderInfo.receiver?.equal(orderInfo.maker)
|
|
29
|
+
? Address.ZERO_ADDRESS
|
|
30
|
+
: orderInfo.receiver || Address.ZERO_ADDRESS;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.receiver = orderInfo.receiver || orderInfo.maker;
|
|
34
|
+
}
|
|
35
|
+
this.makerTraits = makerTraits;
|
|
36
|
+
assert(this.makingAmount <= UINT_256_MAX, 'makingAmount too big');
|
|
37
|
+
assert(this.takingAmount <= UINT_256_MAX, 'takingAmount too big');
|
|
38
|
+
if (!extension.isEmpty()) {
|
|
39
|
+
this.makerTraits.withExtension();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
get salt() {
|
|
43
|
+
return this._salt;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build correct salt for order
|
|
47
|
+
*
|
|
48
|
+
* If order has extension - it is crucial to build correct salt
|
|
49
|
+
* otherwise order won't be ever filled
|
|
50
|
+
*
|
|
51
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/7bc5129ae19832338169ca21e4cf6331e8ff44f6/contracts/OrderLib.sol#L153
|
|
52
|
+
*
|
|
53
|
+
*/
|
|
54
|
+
static buildSalt(extension, baseSalt = randBigInt((1n << 96n) - 1n)) {
|
|
55
|
+
if (extension.isEmpty()) {
|
|
56
|
+
return baseSalt;
|
|
57
|
+
}
|
|
58
|
+
return (baseSalt << 160n) | (extension.keccak256() & UINT_160_MAX);
|
|
59
|
+
}
|
|
60
|
+
static verifySalt(salt, extension) {
|
|
61
|
+
assert(salt <= UINT_256_MAX, 'salt too big');
|
|
62
|
+
if (extension.isEmpty()) {
|
|
63
|
+
return salt;
|
|
64
|
+
}
|
|
65
|
+
const hash = salt & UINT_160_MAX;
|
|
66
|
+
const expectedHash = extension.keccak256() & UINT_160_MAX;
|
|
67
|
+
assert(hash === expectedHash, 'invalid salt: lowest 160 bits should be extension hash');
|
|
68
|
+
return salt;
|
|
69
|
+
}
|
|
70
|
+
static fromNative(chainId, nativeOrderFactory, orderInfo, makerTraits, extension) {
|
|
71
|
+
const _orderInfo = {
|
|
72
|
+
...orderInfo,
|
|
73
|
+
makerAsset: LimitOrder.CHAIN_TO_WRAPPER[chainId],
|
|
74
|
+
receiver: orderInfo.receiver && !orderInfo.receiver.isZero()
|
|
75
|
+
? orderInfo.receiver
|
|
76
|
+
: orderInfo.maker
|
|
77
|
+
};
|
|
78
|
+
// create temp order to calc order hash
|
|
79
|
+
const _order = new LimitOrder(_orderInfo, makerTraits, extension, {
|
|
80
|
+
optimizeReceiverAddress: false
|
|
81
|
+
});
|
|
82
|
+
const finalOrderInfo = {
|
|
83
|
+
..._orderInfo,
|
|
84
|
+
salt: _order.salt,
|
|
85
|
+
maker: nativeOrderFactory.getProxyAddress(_order.getOrderHash(chainId))
|
|
86
|
+
};
|
|
87
|
+
return new LimitOrder(finalOrderInfo, makerTraits, extension, {
|
|
88
|
+
optimizeReceiverAddress: false
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
static isNativeOrder(chainId, nativeOrderFactory, order, signature) {
|
|
92
|
+
try {
|
|
93
|
+
const orderWithRealMaker = LimitOrder.fromCalldata(signature);
|
|
94
|
+
const expectedAddress = nativeOrderFactory.getProxyAddress(orderWithRealMaker.getOrderHash(chainId));
|
|
95
|
+
return expectedAddress.equal(new Address(order.maker));
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
static fromCalldata(bytes) {
|
|
102
|
+
assert(isHexString(bytes), 'Bytes should be valid hex string with 0x prefix');
|
|
103
|
+
const info = AbiCoder.defaultAbiCoder().decode([LimitOrder.Web3Type], bytes);
|
|
104
|
+
const order = info[0];
|
|
105
|
+
return new LimitOrder({
|
|
106
|
+
salt: order.salt ? BigInt(order.salt) : undefined,
|
|
107
|
+
maker: new Address(order.maker),
|
|
108
|
+
receiver: new Address(order.receiver),
|
|
109
|
+
takingAmount: BigInt(order.takingAmount),
|
|
110
|
+
makingAmount: BigInt(order.makingAmount),
|
|
111
|
+
takerAsset: new Address(order.takerAsset),
|
|
112
|
+
makerAsset: new Address(order.makerAsset)
|
|
113
|
+
}, new MakerTraits(BigInt(order.makerTraits)), undefined, { optimizeReceiverAddress: false });
|
|
114
|
+
}
|
|
115
|
+
static fromDataAndExtension(data, extension) {
|
|
116
|
+
return new LimitOrder({
|
|
117
|
+
salt: BigInt(data.salt),
|
|
118
|
+
maker: new Address(data.maker),
|
|
119
|
+
receiver: new Address(data.receiver),
|
|
120
|
+
takingAmount: BigInt(data.takingAmount),
|
|
121
|
+
makingAmount: BigInt(data.makingAmount),
|
|
122
|
+
takerAsset: new Address(data.takerAsset),
|
|
123
|
+
makerAsset: new Address(data.makerAsset)
|
|
124
|
+
}, new MakerTraits(BigInt(data.makerTraits)), extension, { optimizeReceiverAddress: false });
|
|
125
|
+
}
|
|
126
|
+
isNative(chainId, nativeOrderFactory, signature) {
|
|
127
|
+
return LimitOrder.isNativeOrder(chainId, nativeOrderFactory, this.build(), signature);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Returns signature for submitting native order on-chain
|
|
131
|
+
* Only valid if order is native
|
|
132
|
+
*
|
|
133
|
+
* @see FusionOrder.isNative
|
|
134
|
+
* @see FusionOrder.fromNative
|
|
135
|
+
*/
|
|
136
|
+
nativeSignature(maker) {
|
|
137
|
+
return new LimitOrder({
|
|
138
|
+
maker,
|
|
139
|
+
makerAsset: this.makerAsset,
|
|
140
|
+
makingAmount: this.makingAmount,
|
|
141
|
+
takingAmount: this.takingAmount,
|
|
142
|
+
takerAsset: this.takerAsset,
|
|
143
|
+
receiver: this.receiver,
|
|
144
|
+
salt: this.salt
|
|
145
|
+
}, this.makerTraits, undefined, { optimizeReceiverAddress: false }).toCalldata();
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Injects source info to order `salt` [224, 255] bits
|
|
149
|
+
* check `getTrackCodeForSource` implementation for exact injected data
|
|
150
|
+
*
|
|
151
|
+
* @param source order source identifier
|
|
152
|
+
* @see getTrackCodeForSource
|
|
153
|
+
*/
|
|
154
|
+
setSource(source) {
|
|
155
|
+
this._salt = injectTrackCode(this.salt, source);
|
|
156
|
+
return this;
|
|
157
|
+
}
|
|
158
|
+
toCalldata() {
|
|
159
|
+
return AbiCoder.defaultAbiCoder().encode([LimitOrder.Web3Type], [this.build()]);
|
|
160
|
+
}
|
|
161
|
+
build() {
|
|
162
|
+
return {
|
|
163
|
+
maker: this.maker.toString(),
|
|
164
|
+
makerAsset: this.makerAsset.toString(),
|
|
165
|
+
takerAsset: this.takerAsset.toString(),
|
|
166
|
+
makerTraits: (this.makerTraits?.asBigInt() || 0n).toString(),
|
|
167
|
+
salt: this.salt.toString(),
|
|
168
|
+
makingAmount: this.makingAmount.toString(),
|
|
169
|
+
takingAmount: this.takingAmount.toString(),
|
|
170
|
+
receiver: this.receiver.toString()
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
getTypedData(chainId) {
|
|
174
|
+
const domain = getLimitOrderV4Domain(chainId);
|
|
175
|
+
return buildOrderTypedData(domain.chainId, domain.verifyingContract, domain.name, domain.version, this.build());
|
|
176
|
+
}
|
|
177
|
+
getOrderHash(chainId) {
|
|
178
|
+
return getOrderHash(this.getTypedData(chainId));
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Returns true if only a specific address can fill order
|
|
182
|
+
*/
|
|
183
|
+
isPrivate() {
|
|
184
|
+
return this.makerTraits.isPrivate();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
LimitOrder.CHAIN_TO_WRAPPER = {
|
|
188
|
+
[1]: new Address('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'),
|
|
189
|
+
[56]: new Address('0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c'),
|
|
190
|
+
[137]: new Address('0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270'),
|
|
191
|
+
[42161]: new Address('0x82af49447d8a07e3bd95bd0d56f35241523fbab1'),
|
|
192
|
+
[43114]: new Address('0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7'),
|
|
193
|
+
[100]: new Address('0xe91d153e0b41518a2ce8dd3d7944fa863463a97d'),
|
|
194
|
+
[8453]: new Address('0x4200000000000000000000000000000000000006'),
|
|
195
|
+
[10]: new Address('0x4200000000000000000000000000000000000006'),
|
|
196
|
+
[250]: new Address('0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83'),
|
|
197
|
+
[324]: new Address('0x5aea5775959fbc2557cc8789bc1bf90a239d9a91'),
|
|
198
|
+
[59144]: new Address('0xe5d7c2a44ffddf6b295a15c148167daaaf5cf34f'),
|
|
199
|
+
[130]: new Address('0x4200000000000000000000000000000000000006'),
|
|
200
|
+
[146]: new Address('0x039e2fb66102314ce7b64ce5ce3e5183bc94ad38')
|
|
201
|
+
};
|
|
202
|
+
LimitOrder.Web3Type = `tuple(${[
|
|
203
|
+
'uint256 salt',
|
|
204
|
+
'address maker',
|
|
205
|
+
'address receiver',
|
|
206
|
+
'address makerAsset',
|
|
207
|
+
'address takerAsset',
|
|
208
|
+
'uint256 makingAmount',
|
|
209
|
+
'uint256 takingAmount',
|
|
210
|
+
'uint256 makerTraits'
|
|
211
|
+
]})`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|