@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,130 @@
|
|
|
1
|
+
import { Fees } from './fees.js';
|
|
2
|
+
import { WhitelistHalfAddress } from './whitelist-half-address.js';
|
|
3
|
+
import { FeeCalculator } from './fee-calculator.js';
|
|
4
|
+
import { Address } from '../../../address.js';
|
|
5
|
+
import { Interaction } from '../../interaction.js';
|
|
6
|
+
import { Extension } from '../extension.js';
|
|
7
|
+
/**
|
|
8
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/master/contracts/extensions/FeeTaker.sol
|
|
9
|
+
*/
|
|
10
|
+
export declare class FeeTakerExtension {
|
|
11
|
+
readonly address: Address;
|
|
12
|
+
readonly fees: Fees;
|
|
13
|
+
readonly whitelist: WhitelistHalfAddress;
|
|
14
|
+
readonly makerPermit?: Interaction | undefined;
|
|
15
|
+
readonly extraInteraction?: Interaction | undefined;
|
|
16
|
+
readonly customReceiver?: Address | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Flags for post-interaction data
|
|
19
|
+
* @private
|
|
20
|
+
*/
|
|
21
|
+
private static CUSTOM_RECEIVER_FLAG_BIT;
|
|
22
|
+
private constructor();
|
|
23
|
+
static new(
|
|
24
|
+
/**
|
|
25
|
+
* Address of extension
|
|
26
|
+
*/
|
|
27
|
+
address: Address,
|
|
28
|
+
/**
|
|
29
|
+
* @see ResolverFee
|
|
30
|
+
* @see IntegratorFee
|
|
31
|
+
*/
|
|
32
|
+
fees: Fees,
|
|
33
|
+
/**
|
|
34
|
+
* If empty, then KYC token is required to fill order
|
|
35
|
+
*/
|
|
36
|
+
whitelist?: Address[], extra?: {
|
|
37
|
+
makerPermit?: Interaction;
|
|
38
|
+
/**
|
|
39
|
+
* In case receiver of taker tokens is not maker
|
|
40
|
+
*/
|
|
41
|
+
customReceiver?: Address;
|
|
42
|
+
/**
|
|
43
|
+
* Will be called after FeeTaker.postInteraction
|
|
44
|
+
*/
|
|
45
|
+
extraInteraction?: Interaction;
|
|
46
|
+
}): FeeTakerExtension;
|
|
47
|
+
/**
|
|
48
|
+
* Create `FeeTakerExtension` from bytes
|
|
49
|
+
*
|
|
50
|
+
* @param bytes 0x prefixed bytes
|
|
51
|
+
*/
|
|
52
|
+
static decode(bytes: string): FeeTakerExtension;
|
|
53
|
+
/**
|
|
54
|
+
* Create `FeeTakerExtension` from `Extension`
|
|
55
|
+
*/
|
|
56
|
+
static fromExtension(extension: Extension): FeeTakerExtension;
|
|
57
|
+
getFeeCalculator(): FeeCalculator;
|
|
58
|
+
build(): Extension;
|
|
59
|
+
/**
|
|
60
|
+
* Returns takingAmount with applied fees to it
|
|
61
|
+
*
|
|
62
|
+
* @param taker address which fill order
|
|
63
|
+
* @param takingAmount amount to apply fee to
|
|
64
|
+
*/
|
|
65
|
+
getTakingAmount(taker: Address, takingAmount: bigint): bigint;
|
|
66
|
+
/**
|
|
67
|
+
* Returns makingAmount with applied fees to it
|
|
68
|
+
*
|
|
69
|
+
* @param taker address which fill order
|
|
70
|
+
* @param makingAmount amount to apply fee to
|
|
71
|
+
*/
|
|
72
|
+
getMakingAmount(taker: Address, makingAmount: bigint): bigint;
|
|
73
|
+
/**
|
|
74
|
+
* Fee in `takerAsset` which resolver pays to resolver fee receiver
|
|
75
|
+
*
|
|
76
|
+
* @param taker who will fill order
|
|
77
|
+
* @param takingAmount taking amount to apply fee to
|
|
78
|
+
*/
|
|
79
|
+
getResolverFee(taker: Address, takingAmount: bigint): bigint;
|
|
80
|
+
/**
|
|
81
|
+
* Fee in `takerAsset` which integrator gets to integrator wallet
|
|
82
|
+
*
|
|
83
|
+
* @param taker who will fill order
|
|
84
|
+
* @param takingAmount taking amount to calculate fee from
|
|
85
|
+
*/
|
|
86
|
+
getIntegratorFee(taker: Address, takingAmount: bigint): bigint;
|
|
87
|
+
/**
|
|
88
|
+
* Fee in `takerAsset` which protocol gets as share from integrator fee
|
|
89
|
+
*
|
|
90
|
+
* @param taker who will fill order
|
|
91
|
+
* @param takingAmount taking amount to calculate fee from
|
|
92
|
+
*/
|
|
93
|
+
getProtocolShareOfIntegratorFee(taker: Address, takingAmount: bigint): bigint;
|
|
94
|
+
/**
|
|
95
|
+
* Fee in `takerAsset` which protocol gets
|
|
96
|
+
* It equals to `share from integrator fee plus resolver fee`
|
|
97
|
+
*
|
|
98
|
+
* @param taker who will fill order
|
|
99
|
+
* @param takingAmount taking amount to calculate fee from
|
|
100
|
+
*/
|
|
101
|
+
getProtocolFee(taker: Address, takingAmount: bigint): bigint;
|
|
102
|
+
/**
|
|
103
|
+
* Build data for AmountGetterWithFee
|
|
104
|
+
*
|
|
105
|
+
* 2 bytes — integrator fee percentage (in 1e5)
|
|
106
|
+
* 1 byte - integrator share percentage (in 1e2)
|
|
107
|
+
* 2 bytes — resolver fee percentage (in 1e5)
|
|
108
|
+
* 1 byte - whitelist discount numerator (in 1e2)
|
|
109
|
+
* 1 byte - size of the whitelist
|
|
110
|
+
* (bytes10)[N] whitelisted addresses;
|
|
111
|
+
*
|
|
112
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/22a18f7f20acfec69d4f50ce1880e8e662477710/contracts/extensions/AmountGetterWithFee.sol#L56
|
|
113
|
+
*/
|
|
114
|
+
private buildAmountGetterData;
|
|
115
|
+
/**
|
|
116
|
+
* Build data for `FeeTaker.postInteraction`
|
|
117
|
+
*
|
|
118
|
+
*
|
|
119
|
+
* 1 byte - flags:
|
|
120
|
+
* 01 bit `CUSTOM_RECEIVER_FLAG` - set to 1 if order has custom receiver
|
|
121
|
+
* 20 bytes — integrator fee recipient
|
|
122
|
+
* 20 bytes - protocol fee recipient
|
|
123
|
+
* [20 bytes] — receiver of taking tokens (optional, if not set, maker is used). See `CUSTOM_RECEIVER_FLAG` flag
|
|
124
|
+
* Same as in `buildAmountGetterData`
|
|
125
|
+
* [bytes20, bytes] - optional extra interaction
|
|
126
|
+
* @see buildAmountGetterData
|
|
127
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/22a18f7f20acfec69d4f50ce1880e8e662477710/contracts/extensions/FeeTaker.sol#L114
|
|
128
|
+
*/
|
|
129
|
+
private buildInteractionData;
|
|
130
|
+
}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { BN, BytesBuilder, BytesIter } from '@1inch/byte-utils';
|
|
2
|
+
import assert from 'assert';
|
|
3
|
+
import { Fees } from './fees.js';
|
|
4
|
+
import { ResolverFee } from './resolver-fee.js';
|
|
5
|
+
import { IntegratorFee } from './integrator-fee.js';
|
|
6
|
+
import { WhitelistHalfAddress } from './whitelist-half-address.js';
|
|
7
|
+
import { FeeCalculator } from './fee-calculator.js';
|
|
8
|
+
import { ExtensionBuilder } from '../extension-builder.js';
|
|
9
|
+
import { Address } from '../../../address.js';
|
|
10
|
+
import { Interaction } from '../../interaction.js';
|
|
11
|
+
import { Extension } from '../extension.js';
|
|
12
|
+
import { Bps } from '../../../bps.js';
|
|
13
|
+
/**
|
|
14
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/master/contracts/extensions/FeeTaker.sol
|
|
15
|
+
*/
|
|
16
|
+
export class FeeTakerExtension {
|
|
17
|
+
constructor(address, fees, whitelist, makerPermit, extraInteraction, customReceiver) {
|
|
18
|
+
this.address = address;
|
|
19
|
+
this.fees = fees;
|
|
20
|
+
this.whitelist = whitelist;
|
|
21
|
+
this.makerPermit = makerPermit;
|
|
22
|
+
this.extraInteraction = extraInteraction;
|
|
23
|
+
this.customReceiver = customReceiver;
|
|
24
|
+
}
|
|
25
|
+
static new(
|
|
26
|
+
/**
|
|
27
|
+
* Address of extension
|
|
28
|
+
*/
|
|
29
|
+
address,
|
|
30
|
+
/**
|
|
31
|
+
* @see ResolverFee
|
|
32
|
+
* @see IntegratorFee
|
|
33
|
+
*/
|
|
34
|
+
fees,
|
|
35
|
+
/**
|
|
36
|
+
* If empty, then KYC token is required to fill order
|
|
37
|
+
*/
|
|
38
|
+
whitelist, extra) {
|
|
39
|
+
return new FeeTakerExtension(address, fees, WhitelistHalfAddress.new(whitelist || []), extra?.makerPermit, extra?.extraInteraction, extra?.customReceiver);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create `FeeTakerExtension` from bytes
|
|
43
|
+
*
|
|
44
|
+
* @param bytes 0x prefixed bytes
|
|
45
|
+
*/
|
|
46
|
+
static decode(bytes) {
|
|
47
|
+
const extension = Extension.decode(bytes);
|
|
48
|
+
return FeeTakerExtension.fromExtension(extension);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create `FeeTakerExtension` from `Extension`
|
|
52
|
+
*/
|
|
53
|
+
static fromExtension(extension) {
|
|
54
|
+
const extensionAddress = Address.fromFirstBytes(extension.makingAmountData);
|
|
55
|
+
assert(Address.fromFirstBytes(extension.takingAmountData).equal(extensionAddress) &&
|
|
56
|
+
Address.fromFirstBytes(extension.postInteraction).equal(extensionAddress), 'Invalid extension, all calls should be to the same address');
|
|
57
|
+
assert(extension.takingAmountData == extension.makingAmountData, 'Invalid extension, taking amount data must be equal to making amount data');
|
|
58
|
+
// region Parse postInteraction data
|
|
59
|
+
const interactionBytes = BytesIter.HexString(extension.postInteraction);
|
|
60
|
+
interactionBytes.nextUint160(); // skip address of extension
|
|
61
|
+
const flags = BN.fromHex(interactionBytes.nextUint8());
|
|
62
|
+
const integratorFeeRecipient = new Address(interactionBytes.nextUint160());
|
|
63
|
+
const protocolFeeRecipient = new Address(interactionBytes.nextUint160());
|
|
64
|
+
const customTokensRecipient = flags.getBit(FeeTakerExtension.CUSTOM_RECEIVER_FLAG_BIT)
|
|
65
|
+
? new Address(interactionBytes.nextUint160())
|
|
66
|
+
: undefined;
|
|
67
|
+
const interactionData = parseAmountData(interactionBytes);
|
|
68
|
+
const extraInteraction = interactionBytes.isEmpty()
|
|
69
|
+
? undefined
|
|
70
|
+
: Interaction.decode(interactionBytes.rest());
|
|
71
|
+
//endregion Parse postInteraction data
|
|
72
|
+
//region Parse amount data
|
|
73
|
+
const amountBytes = BytesIter.HexString(extension.makingAmountData);
|
|
74
|
+
amountBytes.nextUint160(); // skip address of extension
|
|
75
|
+
const amountData = parseAmountData(amountBytes);
|
|
76
|
+
//endregion Parse amount data
|
|
77
|
+
const permit = extension.hasMakerPermit
|
|
78
|
+
? Interaction.decode(extension.makerPermit)
|
|
79
|
+
: undefined;
|
|
80
|
+
assert(amountData.fees.integratorFee.value ===
|
|
81
|
+
interactionData.fees.integratorFee.value, `invalid extension: integrator fee must be same in interaction data and in amount data`);
|
|
82
|
+
assert(amountData.fees.resolverFee.value ===
|
|
83
|
+
interactionData.fees.resolverFee.value, `invalid extension: resolver fee must be same in interaction data and in amount data`);
|
|
84
|
+
assert(amountData.whitelist.discount.value ===
|
|
85
|
+
interactionData.whitelist.discount.value, `invalid extension: whitelist discount fee must be same in interaction data and in amount data`);
|
|
86
|
+
assert(amountData.fees.integratorShare.value ===
|
|
87
|
+
interactionData.fees.integratorShare.value, `invalid extension: integrator share must be same in interaction data and in amount data`);
|
|
88
|
+
assert(interactionData.whitelist.addresses.length ===
|
|
89
|
+
amountData.whitelist.addresses.length, 'whitelist must be same in interaction data and in amount data');
|
|
90
|
+
assert(interactionData.whitelist.addresses.every((val, i) => amountData.whitelist.addresses[i] === val), 'whitelist must be same in interaction data and in amount data');
|
|
91
|
+
return new FeeTakerExtension(extensionAddress, new Fees(amountData.fees.resolverFee.isZero()
|
|
92
|
+
? ResolverFee.ZERO
|
|
93
|
+
: new ResolverFee(protocolFeeRecipient, amountData.fees.resolverFee, amountData.whitelist.discount), amountData.fees.integratorFee.isZero()
|
|
94
|
+
? IntegratorFee.ZERO
|
|
95
|
+
: new IntegratorFee(integratorFeeRecipient, protocolFeeRecipient, amountData.fees.integratorFee, amountData.fees.integratorShare)), new WhitelistHalfAddress(amountData.whitelist.addresses), permit, extraInteraction, customTokensRecipient);
|
|
96
|
+
}
|
|
97
|
+
getFeeCalculator() {
|
|
98
|
+
return new FeeCalculator(this.fees, this.whitelist);
|
|
99
|
+
}
|
|
100
|
+
build() {
|
|
101
|
+
const amountGetterData = this.buildAmountGetterData();
|
|
102
|
+
const builder = new ExtensionBuilder()
|
|
103
|
+
.withMakingAmountData(this.address, amountGetterData)
|
|
104
|
+
.withTakingAmountData(this.address, amountGetterData)
|
|
105
|
+
.withPostInteraction(new Interaction(this.address, this.buildInteractionData()));
|
|
106
|
+
if (this.makerPermit) {
|
|
107
|
+
builder.withMakerPermit(this.makerPermit.target, this.makerPermit.data);
|
|
108
|
+
}
|
|
109
|
+
return builder.build();
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Returns takingAmount with applied fees to it
|
|
113
|
+
*
|
|
114
|
+
* @param taker address which fill order
|
|
115
|
+
* @param takingAmount amount to apply fee to
|
|
116
|
+
*/
|
|
117
|
+
getTakingAmount(taker, takingAmount) {
|
|
118
|
+
return this.getFeeCalculator().getTakingAmount(taker, takingAmount);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Returns makingAmount with applied fees to it
|
|
122
|
+
*
|
|
123
|
+
* @param taker address which fill order
|
|
124
|
+
* @param makingAmount amount to apply fee to
|
|
125
|
+
*/
|
|
126
|
+
getMakingAmount(taker, makingAmount) {
|
|
127
|
+
return this.getFeeCalculator().getMakingAmount(taker, makingAmount);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Fee in `takerAsset` which resolver pays to resolver fee receiver
|
|
131
|
+
*
|
|
132
|
+
* @param taker who will fill order
|
|
133
|
+
* @param takingAmount taking amount to apply fee to
|
|
134
|
+
*/
|
|
135
|
+
getResolverFee(taker, takingAmount) {
|
|
136
|
+
return this.getFeeCalculator().getResolverFee(taker, takingAmount);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Fee in `takerAsset` which integrator gets to integrator wallet
|
|
140
|
+
*
|
|
141
|
+
* @param taker who will fill order
|
|
142
|
+
* @param takingAmount taking amount to calculate fee from
|
|
143
|
+
*/
|
|
144
|
+
getIntegratorFee(taker, takingAmount) {
|
|
145
|
+
return this.getFeeCalculator().getIntegratorFee(taker, takingAmount);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Fee in `takerAsset` which protocol gets as share from integrator fee
|
|
149
|
+
*
|
|
150
|
+
* @param taker who will fill order
|
|
151
|
+
* @param takingAmount taking amount to calculate fee from
|
|
152
|
+
*/
|
|
153
|
+
getProtocolShareOfIntegratorFee(taker, takingAmount) {
|
|
154
|
+
return this.getFeeCalculator().getProtocolShareOfIntegratorFee(taker, takingAmount);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Fee in `takerAsset` which protocol gets
|
|
158
|
+
* It equals to `share from integrator fee plus resolver fee`
|
|
159
|
+
*
|
|
160
|
+
* @param taker who will fill order
|
|
161
|
+
* @param takingAmount taking amount to calculate fee from
|
|
162
|
+
*/
|
|
163
|
+
getProtocolFee(taker, takingAmount) {
|
|
164
|
+
return this.getFeeCalculator().getProtocolFee(taker, takingAmount);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Build data for AmountGetterWithFee
|
|
168
|
+
*
|
|
169
|
+
* 2 bytes — integrator fee percentage (in 1e5)
|
|
170
|
+
* 1 byte - integrator share percentage (in 1e2)
|
|
171
|
+
* 2 bytes — resolver fee percentage (in 1e5)
|
|
172
|
+
* 1 byte - whitelist discount numerator (in 1e2)
|
|
173
|
+
* 1 byte - size of the whitelist
|
|
174
|
+
* (bytes10)[N] whitelisted addresses;
|
|
175
|
+
*
|
|
176
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/22a18f7f20acfec69d4f50ce1880e8e662477710/contracts/extensions/AmountGetterWithFee.sol#L56
|
|
177
|
+
*/
|
|
178
|
+
buildAmountGetterData() {
|
|
179
|
+
const integrator = {
|
|
180
|
+
fee: this.fees.integrator.fee.toFraction(Fees.BASE_1E5),
|
|
181
|
+
share: this.fees.integrator.share.toFraction(Fees.BASE_1E2)
|
|
182
|
+
};
|
|
183
|
+
const resolverFee = this.fees.resolver.fee.toFraction(Fees.BASE_1E5);
|
|
184
|
+
const builder = new BytesBuilder()
|
|
185
|
+
.addUint16(BigInt(integrator.fee))
|
|
186
|
+
.addUint8(BigInt(integrator.share))
|
|
187
|
+
.addUint16(BigInt(resolverFee))
|
|
188
|
+
.addUint8(BigInt(
|
|
189
|
+
// contract expects discount numerator, but class contain discount
|
|
190
|
+
Number(Fees.BASE_1E2) -
|
|
191
|
+
this.fees.resolver.whitelistDiscount.toFraction(Fees.BASE_1E2)));
|
|
192
|
+
this.whitelist.encodeTo(builder);
|
|
193
|
+
return builder.asHex();
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Build data for `FeeTaker.postInteraction`
|
|
197
|
+
*
|
|
198
|
+
*
|
|
199
|
+
* 1 byte - flags:
|
|
200
|
+
* 01 bit `CUSTOM_RECEIVER_FLAG` - set to 1 if order has custom receiver
|
|
201
|
+
* 20 bytes — integrator fee recipient
|
|
202
|
+
* 20 bytes - protocol fee recipient
|
|
203
|
+
* [20 bytes] — receiver of taking tokens (optional, if not set, maker is used). See `CUSTOM_RECEIVER_FLAG` flag
|
|
204
|
+
* Same as in `buildAmountGetterData`
|
|
205
|
+
* [bytes20, bytes] - optional extra interaction
|
|
206
|
+
* @see buildAmountGetterData
|
|
207
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/22a18f7f20acfec69d4f50ce1880e8e662477710/contracts/extensions/FeeTaker.sol#L114
|
|
208
|
+
*/
|
|
209
|
+
buildInteractionData() {
|
|
210
|
+
const flags = new BN(0n).setBit(FeeTakerExtension.CUSTOM_RECEIVER_FLAG_BIT, Boolean(this.customReceiver));
|
|
211
|
+
const builder = new BytesBuilder()
|
|
212
|
+
.addUint8(flags)
|
|
213
|
+
.addAddress(this.fees.integrator.integrator.toString())
|
|
214
|
+
.addAddress(this.fees.protocol.toString());
|
|
215
|
+
if (this.customReceiver) {
|
|
216
|
+
builder.addAddress(this.customReceiver.toString());
|
|
217
|
+
}
|
|
218
|
+
builder.addBytes(this.buildAmountGetterData());
|
|
219
|
+
if (this.extraInteraction) {
|
|
220
|
+
builder
|
|
221
|
+
.addAddress(this.extraInteraction.target.toString())
|
|
222
|
+
.addBytes(this.extraInteraction.data);
|
|
223
|
+
}
|
|
224
|
+
return builder.asHex();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Flags for post-interaction data
|
|
229
|
+
* @private
|
|
230
|
+
*/
|
|
231
|
+
FeeTakerExtension.CUSTOM_RECEIVER_FLAG_BIT = 0n;
|
|
232
|
+
function parseAmountData(iter) {
|
|
233
|
+
const fees = {
|
|
234
|
+
integratorFee: Bps.fromFraction(Number(iter.nextUint16()), Fees.BASE_1E5),
|
|
235
|
+
integratorShare: Bps.fromFraction(Number(iter.nextUint8()), Fees.BASE_1E2),
|
|
236
|
+
resolverFee: Bps.fromFraction(Number(iter.nextUint16()), Fees.BASE_1E5)
|
|
237
|
+
};
|
|
238
|
+
const whitelistDiscount = Bps.fromFraction(Number(Fees.BASE_1E2) - Number(iter.nextUint8()), // contract uses 1 - discount
|
|
239
|
+
Fees.BASE_1E2);
|
|
240
|
+
const whitelistAddresses = [];
|
|
241
|
+
const whitelistFromAmountSize = Number(iter.nextUint8());
|
|
242
|
+
for (let i = 0; i < whitelistFromAmountSize; i++) {
|
|
243
|
+
whitelistAddresses.push(iter.nextBytes(10));
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
fees,
|
|
247
|
+
whitelist: { discount: whitelistDiscount, addresses: whitelistAddresses }
|
|
248
|
+
};
|
|
249
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { FeeTakerExtension } from './fee-taker.extension.js';
|
|
2
|
+
import { Fees } from './fees.js';
|
|
3
|
+
import { ResolverFee } from './resolver-fee.js';
|
|
4
|
+
import { IntegratorFee } from './integrator-fee.js';
|
|
5
|
+
import { Address } from '../../../address.js';
|
|
6
|
+
import { Bps } from '../../../bps.js';
|
|
7
|
+
import { Interaction } from '../../interaction.js';
|
|
8
|
+
describe('FeeTakerExtension', () => {
|
|
9
|
+
describe('serialize/deserialize', () => {
|
|
10
|
+
it('all data', () => {
|
|
11
|
+
const recipients = {
|
|
12
|
+
integratorFeeRecipient: Address.fromBigInt(2n),
|
|
13
|
+
protocolFeeRecipient: Address.fromBigInt(3n),
|
|
14
|
+
tokensRecipient: Address.fromBigInt(4n)
|
|
15
|
+
};
|
|
16
|
+
const extension = FeeTakerExtension.new(Address.fromBigInt(1n), new Fees(new ResolverFee(recipients.protocolFeeRecipient, Bps.fromPercent(2), Bps.fromPercent(1)), new IntegratorFee(recipients.integratorFeeRecipient, recipients.protocolFeeRecipient, Bps.fromFraction(0.0001), Bps.fromPercent(5))), [Address.fromBigInt(100n)], {
|
|
17
|
+
makerPermit: new Interaction(Address.fromBigInt(1n), '0xdeadbeef'),
|
|
18
|
+
extraInteraction: new Interaction(Address.fromBigInt(99n), '0xdeadbeefdeadbeef'),
|
|
19
|
+
customReceiver: recipients.tokensRecipient
|
|
20
|
+
});
|
|
21
|
+
expect(FeeTakerExtension.fromExtension(extension.build())).toEqual(extension);
|
|
22
|
+
});
|
|
23
|
+
it('only resolver data', () => {
|
|
24
|
+
const recipients = {
|
|
25
|
+
protocolFeeRecipient: Address.fromBigInt(3n)
|
|
26
|
+
};
|
|
27
|
+
const extension = FeeTakerExtension.new(Address.fromBigInt(1n), Fees.resolverFee(new ResolverFee(recipients.protocolFeeRecipient, Bps.fromPercent(2))), [Address.fromBigInt(100n)]);
|
|
28
|
+
expect(FeeTakerExtension.fromExtension(extension.build())).toEqual(extension);
|
|
29
|
+
});
|
|
30
|
+
it('only integrator data', () => {
|
|
31
|
+
const recipients = {
|
|
32
|
+
integratorFeeRecipient: Address.fromBigInt(2n),
|
|
33
|
+
protocolFeeRecipient: Address.fromBigInt(3n)
|
|
34
|
+
};
|
|
35
|
+
const extension = FeeTakerExtension.new(Address.fromBigInt(1n), Fees.integratorFee(new IntegratorFee(recipients.integratorFeeRecipient, recipients.protocolFeeRecipient, Bps.fromFraction(0.0001), Bps.fromPercent(5))), [Address.fromBigInt(100n)]);
|
|
36
|
+
expect(FeeTakerExtension.fromExtension(extension.build())).toEqual(extension);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
it('should calculate taking amount', () => {
|
|
40
|
+
const takerAddress = Address.fromBigInt(100n);
|
|
41
|
+
const ext = FeeTakerExtension.new(Address.fromBigInt(1n), Fees.resolverFee(new ResolverFee(Address.fromBigInt(2n), Bps.fromPercent(1))), [takerAddress] // mark taker as whitelisted resolver
|
|
42
|
+
);
|
|
43
|
+
const takingAmount = ext.getTakingAmount(takerAddress, 100000000n);
|
|
44
|
+
expect(takingAmount).toEqual(101000000n);
|
|
45
|
+
});
|
|
46
|
+
it('should calculate resolver fee', () => {
|
|
47
|
+
const takerAddress = Address.fromBigInt(100n);
|
|
48
|
+
const ext = FeeTakerExtension.new(Address.fromBigInt(1n), Fees.resolverFee(new ResolverFee(Address.fromBigInt(2n), Bps.fromPercent(1))), [takerAddress] // mark taker as whitelisted resolver
|
|
49
|
+
);
|
|
50
|
+
const resolverFee = ext.getResolverFee(takerAddress, 100000000n);
|
|
51
|
+
expect(resolverFee).toEqual(1000000n);
|
|
52
|
+
});
|
|
53
|
+
it('should calculate integrator fee', () => {
|
|
54
|
+
const takerAddress = Address.fromBigInt(100n);
|
|
55
|
+
const ext = FeeTakerExtension.new(Address.fromBigInt(1n), Fees.integratorFee(new IntegratorFee(Address.fromBigInt(2n), Address.fromBigInt(3n), Bps.fromPercent(5), // fee
|
|
56
|
+
Bps.fromPercent(10) // share
|
|
57
|
+
)), [takerAddress] // mark taker as whitelisted resolver
|
|
58
|
+
);
|
|
59
|
+
const integratorFee = ext.getIntegratorFee(takerAddress, 100000000n);
|
|
60
|
+
expect(integratorFee).toEqual(500000n); // 10% from 5% = 0.5%
|
|
61
|
+
});
|
|
62
|
+
it('should calculate protocol fee', () => {
|
|
63
|
+
const protocolAddress = Address.fromBigInt(111n);
|
|
64
|
+
const takerAddress = Address.fromBigInt(100n);
|
|
65
|
+
const ext = FeeTakerExtension.new(Address.fromBigInt(1n), new Fees(new ResolverFee(protocolAddress, Bps.fromPercent(1)), new IntegratorFee(Address.fromBigInt(2n), protocolAddress, Bps.fromPercent(5), // fee
|
|
66
|
+
Bps.fromPercent(10) // share
|
|
67
|
+
)), [takerAddress] // mark taker as whitelisted resolver
|
|
68
|
+
);
|
|
69
|
+
const protocolFee = ext.getProtocolFee(takerAddress, 100000000n);
|
|
70
|
+
expect(protocolFee).toEqual(1000000n + 4500000n); // 90% from 5% (integrator fee share)+ 1% (resolver fee) = 5.5%
|
|
71
|
+
});
|
|
72
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ResolverFee } from './resolver-fee.js';
|
|
2
|
+
import { IntegratorFee } from './integrator-fee.js';
|
|
3
|
+
import { Address } from '../../../address.js';
|
|
4
|
+
export declare class Fees {
|
|
5
|
+
readonly resolver: ResolverFee;
|
|
6
|
+
readonly integrator: IntegratorFee;
|
|
7
|
+
/**
|
|
8
|
+
* 100% = 100000
|
|
9
|
+
*/
|
|
10
|
+
static BASE_1E5: bigint;
|
|
11
|
+
/**
|
|
12
|
+
* 100% = 100
|
|
13
|
+
*/
|
|
14
|
+
static BASE_1E2: bigint;
|
|
15
|
+
constructor(resolver: ResolverFee, integrator: IntegratorFee);
|
|
16
|
+
get protocol(): Address;
|
|
17
|
+
static resolverFee(fee: ResolverFee): Fees;
|
|
18
|
+
static integratorFee(fee: IntegratorFee): Fees;
|
|
19
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { ResolverFee } from './resolver-fee.js';
|
|
3
|
+
import { IntegratorFee } from './integrator-fee.js';
|
|
4
|
+
export class Fees {
|
|
5
|
+
constructor(resolver, integrator) {
|
|
6
|
+
this.resolver = resolver;
|
|
7
|
+
this.integrator = integrator;
|
|
8
|
+
if (!resolver.fee.isZero() && !integrator.fee.isZero()) {
|
|
9
|
+
assert(resolver.receiver.equal(integrator.protocol), 'resolver fee receiver address and integrator fee protocol address must be same');
|
|
10
|
+
}
|
|
11
|
+
assert(!(resolver.fee.isZero() && integrator.fee.isZero()), 'at least one fee must be set');
|
|
12
|
+
assert(this.integrator.fee.toFraction() < 0.6553, 'max fee is 65.53%' // 2bytes
|
|
13
|
+
);
|
|
14
|
+
assert(this.resolver.fee.toFraction() < 0.6553, 'max fee is 65.53%' // 2bytes
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
get protocol() {
|
|
18
|
+
return this.integrator.fee.isZero()
|
|
19
|
+
? this.resolver.receiver
|
|
20
|
+
: this.integrator.protocol;
|
|
21
|
+
}
|
|
22
|
+
static resolverFee(fee) {
|
|
23
|
+
return new Fees(fee, IntegratorFee.ZERO);
|
|
24
|
+
}
|
|
25
|
+
static integratorFee(fee) {
|
|
26
|
+
return new Fees(ResolverFee.ZERO, fee);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 100% = 100000
|
|
31
|
+
*/
|
|
32
|
+
Fees.BASE_1E5 = 100000n;
|
|
33
|
+
/**
|
|
34
|
+
* 100% = 100
|
|
35
|
+
*/
|
|
36
|
+
Fees.BASE_1E2 = 100n;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Address } from '../../../address.js';
|
|
2
|
+
import { Bps } from '../../../bps.js';
|
|
3
|
+
/**
|
|
4
|
+
* Integrator gets `share` of `fee` to `integrator` and the rest goes to `protocol`
|
|
5
|
+
*/
|
|
6
|
+
export declare class IntegratorFee {
|
|
7
|
+
readonly integrator: Address;
|
|
8
|
+
readonly protocol: Address;
|
|
9
|
+
readonly fee: Bps;
|
|
10
|
+
readonly share: Bps;
|
|
11
|
+
static ZERO: IntegratorFee;
|
|
12
|
+
constructor(integrator: Address, protocol: Address, fee: Bps, share: Bps);
|
|
13
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Address } from '../../../address.js';
|
|
2
|
+
import { Bps } from '../../../bps.js';
|
|
3
|
+
/**
|
|
4
|
+
* Integrator gets `share` of `fee` to `integrator` and the rest goes to `protocol`
|
|
5
|
+
*/
|
|
6
|
+
export class IntegratorFee {
|
|
7
|
+
constructor(integrator, protocol, fee, share) {
|
|
8
|
+
this.integrator = integrator;
|
|
9
|
+
this.protocol = protocol;
|
|
10
|
+
this.fee = fee;
|
|
11
|
+
this.share = share;
|
|
12
|
+
if (fee.isZero()) {
|
|
13
|
+
if (!share.isZero()) {
|
|
14
|
+
throw new Error('integrator share must be zero if fee is zero');
|
|
15
|
+
}
|
|
16
|
+
if (!integrator.isZero()) {
|
|
17
|
+
throw new Error('integrator address must be zero if fee is zero');
|
|
18
|
+
}
|
|
19
|
+
if (!protocol.isZero()) {
|
|
20
|
+
throw new Error('protocol address must be zero if fee is zero');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if ((integrator.isZero() || protocol.isZero()) && !fee.isZero()) {
|
|
24
|
+
throw new Error('fee must be zero if integrator or protocol is zero address');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
IntegratorFee.ZERO = new IntegratorFee(Address.ZERO_ADDRESS, Address.ZERO_ADDRESS, Bps.ZERO, Bps.ZERO);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Address } from '../../../address.js';
|
|
2
|
+
import { Bps } from '../../../bps.js';
|
|
3
|
+
/**
|
|
4
|
+
* Fee paid by resolver to `receiver`
|
|
5
|
+
*/
|
|
6
|
+
export declare class ResolverFee {
|
|
7
|
+
readonly receiver: Address;
|
|
8
|
+
readonly fee: Bps;
|
|
9
|
+
/**
|
|
10
|
+
* whitelisted resolvers have discount on fee
|
|
11
|
+
*/
|
|
12
|
+
readonly whitelistDiscount: Bps;
|
|
13
|
+
static ZERO: ResolverFee;
|
|
14
|
+
constructor(receiver: Address, fee: Bps,
|
|
15
|
+
/**
|
|
16
|
+
* whitelisted resolvers have discount on fee
|
|
17
|
+
*/
|
|
18
|
+
whitelistDiscount?: Bps);
|
|
19
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { Address } from '../../../address.js';
|
|
3
|
+
import { Bps } from '../../../bps.js';
|
|
4
|
+
/**
|
|
5
|
+
* Fee paid by resolver to `receiver`
|
|
6
|
+
*/
|
|
7
|
+
export class ResolverFee {
|
|
8
|
+
constructor(receiver, fee,
|
|
9
|
+
/**
|
|
10
|
+
* whitelisted resolvers have discount on fee
|
|
11
|
+
*/
|
|
12
|
+
whitelistDiscount = Bps.ZERO) {
|
|
13
|
+
this.receiver = receiver;
|
|
14
|
+
this.fee = fee;
|
|
15
|
+
this.whitelistDiscount = whitelistDiscount;
|
|
16
|
+
if (receiver.isZero() && !fee.isZero()) {
|
|
17
|
+
throw new Error('fee must be zero if receiver is zero address');
|
|
18
|
+
}
|
|
19
|
+
if (!receiver.isZero() && fee.isZero()) {
|
|
20
|
+
throw new Error('receiver must be zero address if fee is zero');
|
|
21
|
+
}
|
|
22
|
+
if (fee.isZero() && !whitelistDiscount.isZero()) {
|
|
23
|
+
throw new Error('whitelist discount must be zero if fee is zero');
|
|
24
|
+
}
|
|
25
|
+
assert(this.whitelistDiscount.value % 100n === 0n, `whitelist discount must have percent precision: 1%, 2% and so on`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
ResolverFee.ZERO = new ResolverFee(Address.ZERO_ADDRESS, Bps.ZERO);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BytesBuilder } from "@1inch/byte-utils";
|
|
2
|
+
import { Whitelist } from "./types.js";
|
|
3
|
+
import { Address } from "../../../address.js";
|
|
4
|
+
export declare class WhitelistHalfAddress implements Whitelist {
|
|
5
|
+
/**
|
|
6
|
+
* Last 10 bytes of addresses
|
|
7
|
+
*/
|
|
8
|
+
private readonly addresses;
|
|
9
|
+
constructor(
|
|
10
|
+
/**
|
|
11
|
+
* Last 10 bytes of addresses
|
|
12
|
+
*/
|
|
13
|
+
addresses: string[]);
|
|
14
|
+
get length(): number;
|
|
15
|
+
static new(addresses: Address[]): WhitelistHalfAddress;
|
|
16
|
+
isWhitelisted(address: Address): boolean;
|
|
17
|
+
encodeTo(builder: BytesBuilder): BytesBuilder;
|
|
18
|
+
}
|