@switch-win/sdk 1.2.8 → 1.3.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/CHANGELOG.md +26 -0
- package/GASLESS.md +407 -0
- package/LIMIT-ORDERS.md +212 -198
- package/README.md +131 -105
- package/ROBINHOOD.md +201 -198
- package/abi/GaslessSwitchV2ABI.json +1095 -0
- package/dist/constants.d.ts +276 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +403 -0
- package/dist/constants.js.map +1 -0
- package/dist/gasless-client.d.ts +81 -0
- package/dist/gasless-client.d.ts.map +1 -0
- package/dist/gasless-client.js +467 -0
- package/dist/gasless-client.js.map +1 -0
- package/dist/gasless-index.d.ts +5 -0
- package/dist/gasless-index.d.ts.map +1 -0
- package/dist/gasless-index.js +5 -0
- package/dist/gasless-index.js.map +1 -0
- package/dist/gasless-operators.d.ts +32 -0
- package/dist/gasless-operators.d.ts.map +1 -0
- package/dist/gasless-operators.js +132 -0
- package/dist/gasless-operators.js.map +1 -0
- package/dist/gasless-store.d.ts +18 -0
- package/dist/gasless-store.d.ts.map +1 -0
- package/dist/gasless-store.js +83 -0
- package/dist/gasless-store.js.map +1 -0
- package/dist/gasless-types.d.ts +218 -0
- package/dist/gasless-types.d.ts.map +1 -0
- package/dist/gasless-types.js +2 -0
- package/dist/gasless-types.js.map +1 -0
- package/dist/gasless.d.ts +135 -0
- package/dist/gasless.d.ts.map +1 -0
- package/dist/gasless.js +513 -0
- package/dist/gasless.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/limit-orders.d.ts +440 -0
- package/dist/limit-orders.d.ts.map +1 -0
- package/dist/limit-orders.js +387 -0
- package/dist/limit-orders.js.map +1 -0
- package/dist/networks/index.d.ts +3 -0
- package/dist/networks/index.d.ts.map +1 -0
- package/dist/networks/index.js +2 -0
- package/dist/networks/index.js.map +1 -0
- package/dist/networks/robinhood.d.ts +536 -0
- package/dist/networks/robinhood.d.ts.map +1 -0
- package/dist/networks/robinhood.js +489 -0
- package/dist/networks/robinhood.js.map +1 -0
- package/dist/types.d.ts +436 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/examples/gasless-nextjs-proxy.ts +87 -0
- package/examples/gasless-operator.ts +76 -0
- package/examples/gasless-swap.ts +170 -0
- package/examples/limit-order-ethers.ts +195 -0
- package/examples/nextjs-proxy.ts +82 -0
- package/examples/react-hooks.tsx +396 -0
- package/examples/swap-ethers.ts +209 -0
- package/examples/swap-web3py.py +267 -0
- package/package.json +53 -12
- package/src/constants.ts +181 -178
- package/src/gasless-client.ts +823 -0
- package/src/gasless-index.ts +4 -0
- package/src/gasless-operators.ts +227 -0
- package/src/gasless-store.ts +137 -0
- package/src/gasless-types.ts +258 -0
- package/src/gasless.ts +756 -0
- package/src/index.ts +69 -63
- package/src/limit-orders.ts +206 -195
- package/src/types.ts +80 -55
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { Contract, Interface, verifyTypedData } from "ethers";
|
|
2
|
+
import { GASLESS_OPERATOR_ROLE, GASLESS_SWITCH_ABI, GaslessError, gaslessAddress, gaslessUint, getGaslessSigningParams, readGaslessChainState, sameAddress, validateGaslessConfig, } from "./gasless.js";
|
|
3
|
+
/** Never infer gasless from a symbol, short deadline, orderType label, or legacy array. */
|
|
4
|
+
export function classifySwitchOrder(order, config, deployment) {
|
|
5
|
+
validateGaslessConfig(config, deployment);
|
|
6
|
+
if (sameAddress(order.limitOrderContract, deployment.contract))
|
|
7
|
+
return "gasless";
|
|
8
|
+
if (sameAddress(order.limitOrderContract, config.limitOrderContract))
|
|
9
|
+
return "limit-order";
|
|
10
|
+
return "unsupported";
|
|
11
|
+
}
|
|
12
|
+
export function selectGaslessPriorityOrders(orders, config, deployment, chainTimestamp) {
|
|
13
|
+
if (!Number.isSafeInteger(chainTimestamp) || chainTimestamp <= 0)
|
|
14
|
+
throw new GaslessError("INVALID_TIMESTAMP", "A chain timestamp is required.");
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
return orders
|
|
17
|
+
.filter((order) => {
|
|
18
|
+
const key = `${order.limitOrderContract?.toLowerCase()}:${order.maker.toLowerCase()}:${order.nonce}`;
|
|
19
|
+
if (classifySwitchOrder(order, config, deployment) !== "gasless" ||
|
|
20
|
+
order.status !== "ACTIVE" ||
|
|
21
|
+
!Number.isSafeInteger(order.deadline) ||
|
|
22
|
+
order.deadline <= chainTimestamp ||
|
|
23
|
+
seen.has(key))
|
|
24
|
+
return false;
|
|
25
|
+
seen.add(key);
|
|
26
|
+
return true;
|
|
27
|
+
})
|
|
28
|
+
.sort((a, b) => a.deadline - b.deadline || a.nonce - b.nonce);
|
|
29
|
+
}
|
|
30
|
+
/** Gasless V2 fixes the excess side from the maker's signed fee mode. */
|
|
31
|
+
export function gaslessExcessOnInput(feeOnOutput) {
|
|
32
|
+
if (typeof feeOnOutput !== "boolean")
|
|
33
|
+
throw new GaslessError("INVALID_FEE_MODE", "The signed fee mode is required.");
|
|
34
|
+
return !feeOnOutput;
|
|
35
|
+
}
|
|
36
|
+
/** Nominal cap before payout transfer tax. Gas is part of this payout, never an add-on. */
|
|
37
|
+
export function cappedGaslessPayout(availableSurplus, afterFeeBase) {
|
|
38
|
+
if (afterFeeBase <= 0n || availableSurplus <= 0n)
|
|
39
|
+
return 0n;
|
|
40
|
+
const cap = (afterFeeBase * 5n) / 10000n;
|
|
41
|
+
return availableSurplus < cap ? availableSurplus : cap;
|
|
42
|
+
}
|
|
43
|
+
/** Use measured after-tax payout valued via an executable payout-token/native route. */
|
|
44
|
+
export function assessGaslessOperatorProfit(payoutNative, gasLimit, gasPrice, minimumNetNative = 0n) {
|
|
45
|
+
if (payoutNative < 0n ||
|
|
46
|
+
gasLimit <= 0n ||
|
|
47
|
+
gasPrice <= 0n ||
|
|
48
|
+
minimumNetNative < 0n)
|
|
49
|
+
throw new GaslessError("INVALID_GAS", "Invalid payout or full gas budget.");
|
|
50
|
+
const gasBudgetNative = gasLimit * gasPrice;
|
|
51
|
+
const netNative = payoutNative - gasBudgetNative;
|
|
52
|
+
return {
|
|
53
|
+
eligible: netNative > 0n && netNative >= minimumNetNative,
|
|
54
|
+
gasBudgetNative,
|
|
55
|
+
netNative,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export async function assertGaslessOperator(provider, deployment, operator) {
|
|
59
|
+
const state = await readGaslessChainState(provider, deployment);
|
|
60
|
+
const c = new Contract(deployment.contract, GASLESS_SWITCH_ABI, provider);
|
|
61
|
+
if (!(await c.hasRole(GASLESS_OPERATOR_ROLE, gaslessAddress(operator), {
|
|
62
|
+
blockTag: state.blockNumber,
|
|
63
|
+
})))
|
|
64
|
+
throw new GaslessError("OPERATOR_NOT_APPROVED", "This operator is not registered on the gasless settlement contract.");
|
|
65
|
+
}
|
|
66
|
+
/** Encode already-built execution routes. This does NOT quote, simulate, or establish profitability. */
|
|
67
|
+
export function encodeGaslessFill(input) {
|
|
68
|
+
const { deployment, order, signature, routes } = input;
|
|
69
|
+
if (!Number.isSafeInteger(order.nonce) ||
|
|
70
|
+
order.nonce < 0 ||
|
|
71
|
+
!Number.isSafeInteger(order.deadline) ||
|
|
72
|
+
!Number.isSafeInteger(input.chainTimestamp) ||
|
|
73
|
+
order.deadline <= input.chainTimestamp ||
|
|
74
|
+
order.deadline === 0 ||
|
|
75
|
+
typeof order.unwrapOutput !== "boolean" ||
|
|
76
|
+
(order.unwrapOutput &&
|
|
77
|
+
!sameAddress(order.tokenOut, deployment.wrappedNative)))
|
|
78
|
+
throw new GaslessError("INVALID_ORDER", "Invalid or expired gasless order.");
|
|
79
|
+
[order.maker, order.tokenIn, order.tokenOut, order.recipient].forEach((a) => gaslessAddress(a));
|
|
80
|
+
gaslessAddress(order.partnerAddress, true);
|
|
81
|
+
gaslessUint(order.minAmountOut);
|
|
82
|
+
if (sameAddress(order.tokenIn, order.tokenOut) ||
|
|
83
|
+
sameAddress(order.recipient, deployment.contract))
|
|
84
|
+
throw new GaslessError("INVALID_ORDER", "Invalid gasless token pair or recipient.");
|
|
85
|
+
const { domain, types } = getGaslessSigningParams(deployment);
|
|
86
|
+
if (!sameAddress(verifyTypedData(domain, types, order, signature), order.maker))
|
|
87
|
+
throw new GaslessError("INVALID_SIGNATURE", "Gasless signature does not match the maker.");
|
|
88
|
+
let total = 0n;
|
|
89
|
+
if (!routes.length || routes.length > 16)
|
|
90
|
+
throw new GaslessError("INVALID_ROUTE", "Execution routes are required.");
|
|
91
|
+
for (const route of routes) {
|
|
92
|
+
const amount = gaslessUint(String(route.amountIn));
|
|
93
|
+
total += amount;
|
|
94
|
+
if (!route.hops.length ||
|
|
95
|
+
route.hops.length > 8 ||
|
|
96
|
+
!sameAddress(route.hops[0].tokenIn, order.tokenIn) ||
|
|
97
|
+
!sameAddress(route.hops[route.hops.length - 1].tokenOut, order.tokenOut))
|
|
98
|
+
throw new GaslessError("INVALID_ROUTE", "Route endpoints do not match the order.");
|
|
99
|
+
let previous = order.tokenIn;
|
|
100
|
+
for (const hop of route.hops) {
|
|
101
|
+
if (!sameAddress(hop.tokenIn, previous) || !hop.legs.length)
|
|
102
|
+
throw new GaslessError("INVALID_ROUTE", "Disconnected execution route.");
|
|
103
|
+
previous = gaslessAddress(hop.tokenOut);
|
|
104
|
+
for (const leg of hop.legs) {
|
|
105
|
+
gaslessAddress(leg.adapter);
|
|
106
|
+
gaslessUint(String(leg.amountIn));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const amountIn = gaslessUint(order.amountIn);
|
|
111
|
+
if (order.feeOnOutput) {
|
|
112
|
+
if (total !== amountIn)
|
|
113
|
+
throw new GaslessError("INVALID_ROUTE", "Output-fee gasless orders route the full signed input.");
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
const received = gaslessUint(input.receivedInput);
|
|
117
|
+
const available = received - (received * 10n) / 10000n;
|
|
118
|
+
if (received > amountIn || total > available)
|
|
119
|
+
throw new GaslessError("INVALID_ROUTE", "Input-fee routes exceed the measured after-fee input.");
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
to: deployment.contract,
|
|
123
|
+
data: new Interface(GASLESS_SWITCH_ABI).encodeFunctionData("fillOrder", [
|
|
124
|
+
order,
|
|
125
|
+
signature,
|
|
126
|
+
routes,
|
|
127
|
+
gaslessExcessOnInput(order.feeOnOutput),
|
|
128
|
+
]),
|
|
129
|
+
value: "0",
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=gasless-operators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gasless-operators.js","sourceRoot":"","sources":["../src/gasless-operators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LimitOrderNetwork } from "./limit-orders.js";
|
|
2
|
+
import type { GaslessPendingStore, PendingGaslessOrder } from "./gasless-types.js";
|
|
3
|
+
export interface GaslessStorage {
|
|
4
|
+
getItem(key: string): string | null;
|
|
5
|
+
setItem(key: string, value: string): void;
|
|
6
|
+
removeItem(key: string): void;
|
|
7
|
+
}
|
|
8
|
+
export interface GaslessLockManager {
|
|
9
|
+
request<T>(name: string, callback: () => T | PromiseLike<T>): Promise<T>;
|
|
10
|
+
}
|
|
11
|
+
/** Invalid storage must block new orders rather than silently discarding a live signature. */
|
|
12
|
+
export declare function parseGaslessPending(value: string, network: LimitOrderNetwork, maker: string): PendingGaslessOrder;
|
|
13
|
+
/** Browser store serializes tabs using Web Locks and persists orders across reloads. */
|
|
14
|
+
export declare function createGaslessBrowserStore(network: LimitOrderNetwork, makerInput: string, options?: {
|
|
15
|
+
storage?: GaslessStorage;
|
|
16
|
+
locks?: GaslessLockManager;
|
|
17
|
+
}): GaslessPendingStore;
|
|
18
|
+
//# sourceMappingURL=gasless-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gasless-store.d.ts","sourceRoot":"","sources":["../src/gasless-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAS5B,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC1E;AAMD,8FAA8F;AAC9F,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,GACZ,mBAAmB,CAmCrB;AAED,wFAAwF;AACxF,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,KAAK,CAAC,EAAE,kBAAkB,CAAC;CACvB,GACL,mBAAmB,CA2DrB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { GASLESS_DEPLOYMENTS, GaslessError, gaslessAddress, gaslessUint, sameAddress, } from "./gasless.js";
|
|
2
|
+
function identity(p) {
|
|
3
|
+
return `${p.chainId}:${p.contract.toLowerCase()}:${p.order.maker.toLowerCase()}:${p.order.nonce}`;
|
|
4
|
+
}
|
|
5
|
+
/** Invalid storage must block new orders rather than silently discarding a live signature. */
|
|
6
|
+
export function parseGaslessPending(value, network, maker) {
|
|
7
|
+
try {
|
|
8
|
+
const p = JSON.parse(value);
|
|
9
|
+
if (p.network !== network ||
|
|
10
|
+
p.chainId !== GASLESS_DEPLOYMENTS[network].chainId ||
|
|
11
|
+
!sameAddress(p.order.maker, maker) ||
|
|
12
|
+
!Number.isSafeInteger(p.order.nonce) ||
|
|
13
|
+
p.order.nonce < 0 ||
|
|
14
|
+
!Number.isSafeInteger(p.order.deadline) ||
|
|
15
|
+
p.order.deadline <= 0 ||
|
|
16
|
+
typeof p.order.feeOnOutput !== "boolean" ||
|
|
17
|
+
typeof p.order.unwrapOutput !== "boolean" ||
|
|
18
|
+
!["signing", "submitting", "submitted", "uncertain"].includes(p.state) ||
|
|
19
|
+
(p.state !== "signing" && !p.signature) ||
|
|
20
|
+
(p.signature !== undefined && !/^0x[\da-f]{130}$/i.test(p.signature)))
|
|
21
|
+
throw Error();
|
|
22
|
+
[
|
|
23
|
+
p.contract,
|
|
24
|
+
p.order.maker,
|
|
25
|
+
p.order.tokenIn,
|
|
26
|
+
p.order.tokenOut,
|
|
27
|
+
p.order.recipient,
|
|
28
|
+
].forEach((a) => gaslessAddress(a));
|
|
29
|
+
gaslessAddress(p.order.partnerAddress, true);
|
|
30
|
+
gaslessUint(p.order.amountIn);
|
|
31
|
+
gaslessUint(p.order.minAmountOut);
|
|
32
|
+
return p;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
throw new GaslessError("PENDING_STORAGE_INVALID", "Saved gasless order data is invalid. Recover its status before starting another swap.");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Browser store serializes tabs using Web Locks and persists orders across reloads. */
|
|
39
|
+
export function createGaslessBrowserStore(network, makerInput, options = {}) {
|
|
40
|
+
const maker = gaslessAddress(makerInput);
|
|
41
|
+
const storage = options.storage ?? globalThis.localStorage;
|
|
42
|
+
const locks = options.locks ?? globalThis.navigator?.locks;
|
|
43
|
+
if (!storage || !locks)
|
|
44
|
+
throw new GaslessError("PENDING_STORAGE_UNAVAILABLE", "Durable storage and Web Locks are required. Supply an atomic application store in this environment.");
|
|
45
|
+
const key = `switch:sdk:gasless-pending:${GASLESS_DEPLOYMENTS[network].chainId}:${maker.toLowerCase()}`;
|
|
46
|
+
const load = () => {
|
|
47
|
+
const value = storage.getItem(key);
|
|
48
|
+
return value === null ? null : parseGaslessPending(value, network, maker);
|
|
49
|
+
};
|
|
50
|
+
const check = (p) => parseGaslessPending(JSON.stringify(p), network, maker);
|
|
51
|
+
return {
|
|
52
|
+
async load() {
|
|
53
|
+
return load();
|
|
54
|
+
},
|
|
55
|
+
async reserve(pending) {
|
|
56
|
+
await locks.request(key, () => {
|
|
57
|
+
if (load())
|
|
58
|
+
throw new GaslessError("ORDER_PENDING", "Another gasless order is pending in this browser.");
|
|
59
|
+
storage.setItem(key, JSON.stringify(check(pending)));
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
async update(pending) {
|
|
63
|
+
await locks.request(key, () => {
|
|
64
|
+
const current = load();
|
|
65
|
+
if (!current || identity(current) !== identity(pending))
|
|
66
|
+
throw new GaslessError("PENDING_ORDER_CHANGED", "Saved pending order changed.");
|
|
67
|
+
if (JSON.stringify(current.order) !== JSON.stringify(pending.order))
|
|
68
|
+
throw new GaslessError("PENDING_ORDER_CHANGED", "Cannot change a pending order's signed fields.");
|
|
69
|
+
if (current.signature && current.signature !== pending.signature)
|
|
70
|
+
throw new GaslessError("PENDING_ORDER_CHANGED", "Cannot replace a saved signature.");
|
|
71
|
+
storage.setItem(key, JSON.stringify(check(pending)));
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
async release(pending) {
|
|
75
|
+
await locks.request(key, () => {
|
|
76
|
+
const current = load();
|
|
77
|
+
if (current && identity(current) === identity(pending))
|
|
78
|
+
storage.removeItem(key);
|
|
79
|
+
});
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=gasless-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gasless-store.js","sourceRoot":"","sources":["../src/gasless-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import type { BestPathResponse, LimitOrderParams, LimitOrderRecord } from "./types.js";
|
|
2
|
+
import type { LimitOrderNetwork } from "./limit-orders.js";
|
|
3
|
+
export interface GaslessDeployment {
|
|
4
|
+
network: LimitOrderNetwork;
|
|
5
|
+
chainId: number;
|
|
6
|
+
contract: string;
|
|
7
|
+
router: string;
|
|
8
|
+
wrappedNative: string;
|
|
9
|
+
explorer: string;
|
|
10
|
+
}
|
|
11
|
+
export type GaslessEligibilityReason = "READY" | "NOT_REQUESTED" | "EXECUTION_UNVERIFIED" | "PAYOUT_UNVALUED" | "GAS_NOT_COVERED" | "INSUFFICIENT_SAFETY_MARGIN" | "OPERATOR_GAS_UNAVAILABLE" | "NO_APPROVED_OPERATOR" | "SLIPPAGE_BUFFER_TOO_SMALL" | "STALE_PREVIEW";
|
|
12
|
+
/** Server recommendation; all native Wei values are decimal strings. */
|
|
13
|
+
export interface GaslessEligibility {
|
|
14
|
+
policyVersion: 1;
|
|
15
|
+
status: "eligible" | "ineligible" | "unavailable" | "not_checked";
|
|
16
|
+
eligible: boolean;
|
|
17
|
+
recommendation: "gasless" | "regular";
|
|
18
|
+
reasonCode: GaslessEligibilityReason;
|
|
19
|
+
reason: string;
|
|
20
|
+
nativeSymbol: "PLS" | "ETH";
|
|
21
|
+
protocolFeeBps: 10;
|
|
22
|
+
maxOperatorPayoutBps: 5;
|
|
23
|
+
requiredGasCoverageBps: 20000;
|
|
24
|
+
payoutValuationHaircutBps: 1000;
|
|
25
|
+
minimumSlippageBps: 50;
|
|
26
|
+
/** Registration and a funded wallet do not prove a worker is online. */
|
|
27
|
+
operatorLivenessVerified: false;
|
|
28
|
+
/** Milliseconds since the Unix epoch. */
|
|
29
|
+
checkedAt: number;
|
|
30
|
+
/** Milliseconds since the Unix epoch. */
|
|
31
|
+
expiresAt: number;
|
|
32
|
+
economics?: {
|
|
33
|
+
estimatedGasUnits: string;
|
|
34
|
+
gasLimit: string;
|
|
35
|
+
gasPriceWei: string;
|
|
36
|
+
estimatedGasCostNativeWei: string;
|
|
37
|
+
estimatedGasCostNative: string;
|
|
38
|
+
operatorPayoutNativeWei: string;
|
|
39
|
+
operatorPayoutNative: string;
|
|
40
|
+
gasBudgetNativeWei: string;
|
|
41
|
+
gasBudgetNative: string;
|
|
42
|
+
conservativeGasBudgetNativeWei: string;
|
|
43
|
+
conservativeGasBudgetNative: string;
|
|
44
|
+
stressedOperatorPayoutNativeWei: string;
|
|
45
|
+
requiredOperatorPayoutNativeWei: string;
|
|
46
|
+
requiredOperatorPayoutNative: string;
|
|
47
|
+
payoutToGasCoverageBps: string;
|
|
48
|
+
/** Signed: negative values mean the payout does not cover the budget. */
|
|
49
|
+
netAfterGasBudgetNativeWei: string;
|
|
50
|
+
shortfallNativeWei: string;
|
|
51
|
+
gasCovered: boolean;
|
|
52
|
+
safetyMarginCovered: boolean;
|
|
53
|
+
};
|
|
54
|
+
operator?: {
|
|
55
|
+
address: string;
|
|
56
|
+
nativeBalanceWei: string;
|
|
57
|
+
gasAvailable: boolean;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Amounts are uint256 decimal strings; timestamps are Unix seconds except checkedAt. */
|
|
61
|
+
export interface GaslessExecutionPreview {
|
|
62
|
+
status: "ready";
|
|
63
|
+
version: 2;
|
|
64
|
+
settlementVersion: 2;
|
|
65
|
+
maker: string;
|
|
66
|
+
chainId: number;
|
|
67
|
+
contract: string;
|
|
68
|
+
tokenIn: string;
|
|
69
|
+
tokenOut: string;
|
|
70
|
+
amountIn: string;
|
|
71
|
+
recipient: string;
|
|
72
|
+
unwrapOutput: boolean;
|
|
73
|
+
feeOnOutput: boolean;
|
|
74
|
+
excessOnInput: boolean;
|
|
75
|
+
payoutToken: string;
|
|
76
|
+
routeHash: string;
|
|
77
|
+
quoteBlockNumber: number;
|
|
78
|
+
/** Milliseconds since the Unix epoch. */
|
|
79
|
+
checkedAt: number;
|
|
80
|
+
slippageBps: number;
|
|
81
|
+
expectedOutputAmount: string;
|
|
82
|
+
minAmountOut: string;
|
|
83
|
+
recipientAmountOut: string;
|
|
84
|
+
/** Actual payout received after any transfer tax. */
|
|
85
|
+
operatorPayout: string;
|
|
86
|
+
nominalOperatorPayout: string;
|
|
87
|
+
payoutCapBase: string;
|
|
88
|
+
operatorPayoutNative: string;
|
|
89
|
+
estimatedGas: string;
|
|
90
|
+
gasLimit: string;
|
|
91
|
+
gasPriceWei: string;
|
|
92
|
+
gasBudgetNative: string;
|
|
93
|
+
gasPriceBoostBps: number;
|
|
94
|
+
gasLimitBps: number;
|
|
95
|
+
headroomBps: number;
|
|
96
|
+
eligible: boolean;
|
|
97
|
+
reason?: string;
|
|
98
|
+
/** Additive API metadata. A ready simulation can still be economically ineligible. */
|
|
99
|
+
eligibility?: GaslessEligibility;
|
|
100
|
+
}
|
|
101
|
+
export type GaslessPreviewResult = GaslessExecutionPreview | {
|
|
102
|
+
status: "unavailable";
|
|
103
|
+
reason: string;
|
|
104
|
+
eligibility?: GaslessEligibility;
|
|
105
|
+
};
|
|
106
|
+
export interface GaslessQuoteResponse extends BestPathResponse {
|
|
107
|
+
protocolFeeBps: number;
|
|
108
|
+
feeOnOutput: boolean;
|
|
109
|
+
quoteGasPrice: string;
|
|
110
|
+
quoteBlockNumber: number;
|
|
111
|
+
gaslessExecution: GaslessPreviewResult;
|
|
112
|
+
}
|
|
113
|
+
export interface GaslessTrade {
|
|
114
|
+
maker: string;
|
|
115
|
+
tokenIn: string;
|
|
116
|
+
/** Native sentinel is supported on output; signed orders use wrapped native. */
|
|
117
|
+
tokenOut: string;
|
|
118
|
+
amountIn: string;
|
|
119
|
+
recipient?: string;
|
|
120
|
+
partnerAddress?: string;
|
|
121
|
+
/** User price tolerance only. It never increases the contract's payout cap. 0–100. */
|
|
122
|
+
slippageBps?: number;
|
|
123
|
+
}
|
|
124
|
+
export interface GaslessTaxInfo {
|
|
125
|
+
isTaxToken: boolean;
|
|
126
|
+
buyTaxBps: number;
|
|
127
|
+
sellTaxBps: number;
|
|
128
|
+
}
|
|
129
|
+
export interface GaslessChainState {
|
|
130
|
+
checkedAt: number;
|
|
131
|
+
blockNumber: number;
|
|
132
|
+
blockTimestamp: number;
|
|
133
|
+
rawGasPriceWei: string;
|
|
134
|
+
}
|
|
135
|
+
export interface PreparedGaslessSwap {
|
|
136
|
+
deployment: GaslessDeployment;
|
|
137
|
+
trade: Required<GaslessTrade>;
|
|
138
|
+
quote: GaslessQuoteResponse;
|
|
139
|
+
preview: GaslessExecutionPreview;
|
|
140
|
+
feeOnOutput: boolean;
|
|
141
|
+
expectedOutput: string;
|
|
142
|
+
minAmountOut: string;
|
|
143
|
+
payoutToken: string;
|
|
144
|
+
operatorPayout: string;
|
|
145
|
+
gasPriceWei: string;
|
|
146
|
+
gasLimit: string;
|
|
147
|
+
gasBudgetNative: string;
|
|
148
|
+
chainState: GaslessChainState;
|
|
149
|
+
}
|
|
150
|
+
export type GaslessUnavailableCode = "NATIVE_INPUT_REQUIRES_WRAP" | "CONFIGURATION_CHANGED" | "TAX_CHECK_UNAVAILABLE" | "QUOTE_UNAVAILABLE" | "PREVIEW_UNAVAILABLE" | "STALE_QUOTE" | "INVALID_PREVIEW" | "SERVER_INELIGIBLE" | "INSUFFICIENT_OPERATOR_PAYOUT";
|
|
151
|
+
export type GaslessQuoteDecision = {
|
|
152
|
+
eligible: true;
|
|
153
|
+
prepared: PreparedGaslessSwap;
|
|
154
|
+
eligibility?: GaslessEligibility;
|
|
155
|
+
} | {
|
|
156
|
+
eligible: false;
|
|
157
|
+
code: GaslessUnavailableCode;
|
|
158
|
+
reason: string;
|
|
159
|
+
retryable: boolean;
|
|
160
|
+
/** Server economics are available even when this swap cannot use gasless. */
|
|
161
|
+
eligibility?: GaslessEligibility;
|
|
162
|
+
};
|
|
163
|
+
/** The API currently stores nonces as safe JSON integers, even though Solidity uses uint256. */
|
|
164
|
+
export interface GaslessOrder extends LimitOrderParams {
|
|
165
|
+
}
|
|
166
|
+
export interface SignedGaslessOrder extends GaslessOrder {
|
|
167
|
+
limitOrderContract: string;
|
|
168
|
+
signature: string;
|
|
169
|
+
}
|
|
170
|
+
export interface PendingGaslessOrder {
|
|
171
|
+
network: LimitOrderNetwork;
|
|
172
|
+
chainId: number;
|
|
173
|
+
contract: string;
|
|
174
|
+
order: GaslessOrder;
|
|
175
|
+
state: "signing" | "submitting" | "submitted" | "uncertain";
|
|
176
|
+
signature?: string;
|
|
177
|
+
}
|
|
178
|
+
/** Implement atomically, scoped to network + maker. Persist before opening the wallet. */
|
|
179
|
+
export interface GaslessPendingStore {
|
|
180
|
+
load(): Promise<PendingGaslessOrder | null>;
|
|
181
|
+
/** Must reject if another pending order already occupies this maker's slot. */
|
|
182
|
+
reserve(pending: PendingGaslessOrder): Promise<void>;
|
|
183
|
+
/** Must update only the same contract + maker + nonce; preserve the signature. */
|
|
184
|
+
update(pending: PendingGaslessOrder): Promise<void>;
|
|
185
|
+
/** Must release only the matching order. Never clear a different tab's order. */
|
|
186
|
+
release(pending: PendingGaslessOrder): Promise<void>;
|
|
187
|
+
}
|
|
188
|
+
export type GaslessOrderOutcome = {
|
|
189
|
+
status: "pending";
|
|
190
|
+
pending: PendingGaslessOrder;
|
|
191
|
+
} | {
|
|
192
|
+
status: "filled";
|
|
193
|
+
pending: PendingGaslessOrder;
|
|
194
|
+
record: LimitOrderRecord;
|
|
195
|
+
settlementTxUrl?: string;
|
|
196
|
+
} | {
|
|
197
|
+
status: "cancelled";
|
|
198
|
+
pending: PendingGaslessOrder;
|
|
199
|
+
record: LimitOrderRecord;
|
|
200
|
+
} | {
|
|
201
|
+
status: "closed";
|
|
202
|
+
pending: PendingGaslessOrder;
|
|
203
|
+
reason: string;
|
|
204
|
+
};
|
|
205
|
+
export interface GaslessRoute {
|
|
206
|
+
amountIn: string | bigint;
|
|
207
|
+
hops: {
|
|
208
|
+
tokenIn: string;
|
|
209
|
+
tokenOut: string;
|
|
210
|
+
legs: {
|
|
211
|
+
adapter: string;
|
|
212
|
+
amountIn: string | bigint;
|
|
213
|
+
fee: number;
|
|
214
|
+
data: string;
|
|
215
|
+
}[];
|
|
216
|
+
}[];
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=gasless-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gasless-types.d.ts","sourceRoot":"","sources":["../src/gasless-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,wBAAwB,GAChC,OAAO,GACP,eAAe,GACf,sBAAsB,GACtB,iBAAiB,GACjB,iBAAiB,GACjB,4BAA4B,GAC5B,0BAA0B,GAC1B,sBAAsB,GACtB,2BAA2B,GAC3B,eAAe,CAAC;AAEpB,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,aAAa,CAAC;IAClE,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,SAAS,GAAG,SAAS,CAAC;IACtC,UAAU,EAAE,wBAAwB,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,KAAK,GAAG,KAAK,CAAC;IAC5B,cAAc,EAAE,EAAE,CAAC;IACnB,oBAAoB,EAAE,CAAC,CAAC;IACxB,sBAAsB,EAAE,KAAK,CAAC;IAC9B,yBAAyB,EAAE,IAAI,CAAC;IAChC,kBAAkB,EAAE,EAAE,CAAC;IACvB,wEAAwE;IACxE,wBAAwB,EAAE,KAAK,CAAC;IAChC,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE;QACV,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,yBAAyB,EAAE,MAAM,CAAC;QAClC,sBAAsB,EAAE,MAAM,CAAC;QAC/B,uBAAuB,EAAE,MAAM,CAAC;QAChC,oBAAoB,EAAE,MAAM,CAAC;QAC7B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC;QACxB,8BAA8B,EAAE,MAAM,CAAC;QACvC,2BAA2B,EAAE,MAAM,CAAC;QACpC,+BAA+B,EAAE,MAAM,CAAC;QACxC,+BAA+B,EAAE,MAAM,CAAC;QACxC,4BAA4B,EAAE,MAAM,CAAC;QACrC,sBAAsB,EAAE,MAAM,CAAC;QAC/B,yEAAyE;QACzE,0BAA0B,EAAE,MAAM,CAAC;QACnC,kBAAkB,EAAE,MAAM,CAAC;QAC3B,UAAU,EAAE,OAAO,CAAC;QACpB,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;CACH;AAED,yFAAyF;AACzF,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,CAAC,CAAC;IACX,iBAAiB,EAAE,CAAC,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,MAAM,MAAM,oBAAoB,GAC5B,uBAAuB,GACvB;IACE,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC,CAAC;AAEN,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,oBAAoB,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC9B,KAAK,EAAE,oBAAoB,CAAC;IAC5B,OAAO,EAAE,uBAAuB,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,iBAAiB,CAAC;CAC/B;AAED,MAAM,MAAM,sBAAsB,GAC9B,4BAA4B,GAC5B,uBAAuB,GACvB,uBAAuB,GACvB,mBAAmB,GACnB,qBAAqB,GACrB,aAAa,GACb,iBAAiB,GACjB,mBAAmB,GACnB,8BAA8B,CAAC;AAEnC,MAAM,MAAM,oBAAoB,GAC5B;IACE,QAAQ,EAAE,IAAI,CAAC;IACf,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC,GACD;IACE,QAAQ,EAAE,KAAK,CAAC;IAChB,IAAI,EAAE,sBAAsB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC,CAAC;AAEN,gGAAgG;AAChG,MAAM,WAAW,YAAa,SAAQ,gBAAgB;CAAG;AAEzD,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0FAA0F;AAC1F,MAAM,WAAW,mBAAmB;IAClC,IAAI,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAC5C,+EAA+E;IAC/E,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,kFAAkF;IAClF,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,iFAAiF;IACjF,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,GACnD;IACE,MAAM,EAAE,QAAQ,CAAC;IACjB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,gBAAgB,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACD;IACE,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,gBAAgB,CAAC;CAC1B,GACD;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE;YACJ,OAAO,EAAE,MAAM,CAAC;YAChB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;YAC1B,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;SACd,EAAE,CAAC;KACL,EAAE,CAAC;CACL"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gasless-types.js","sourceRoot":"","sources":["../src/gasless-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { type Provider } from "ethers";
|
|
2
|
+
import type { LimitOrderConfigResponse } from "./types.js";
|
|
3
|
+
import type { LimitOrderNetwork } from "./limit-orders.js";
|
|
4
|
+
import type { GaslessChainState, GaslessDeployment, GaslessOrder, GaslessQuoteDecision, GaslessQuoteResponse, GaslessTaxInfo, GaslessTrade, PreparedGaslessSwap } from "./gasless-types.js";
|
|
5
|
+
export * from "./gasless-types.js";
|
|
6
|
+
/** Fixed on-chain gasless protocol fee: 10 bps (0.1%), not an integration setting.
|
|
7
|
+
* Integrations that do not want this fee policy should offer regular swaps only. */
|
|
8
|
+
export declare const GASLESS_PROTOCOL_FEE_BPS = 10;
|
|
9
|
+
export declare const GASLESS_MAX_OPERATOR_PAYOUT_BPS = 5;
|
|
10
|
+
export declare const GASLESS_ORDER_LIFETIME_SECONDS = 180;
|
|
11
|
+
export declare const GASLESS_QUOTE_MAX_AGE_MS = 30000;
|
|
12
|
+
export declare const GASLESS_MAX_SLIPPAGE_BPS = 100;
|
|
13
|
+
export declare const GASLESS_GAS_PRICE_BOOST_BPS = 13000;
|
|
14
|
+
export declare const GASLESS_GAS_LIMIT_BPS = 13000;
|
|
15
|
+
export declare const GASLESS_GAS_HEADROOM_BPS = 11000;
|
|
16
|
+
export declare const GASLESS_ORDER_TYPES: {
|
|
17
|
+
readonly LimitOrder: readonly [{
|
|
18
|
+
readonly name: "maker";
|
|
19
|
+
readonly type: "address";
|
|
20
|
+
}, {
|
|
21
|
+
readonly name: "tokenIn";
|
|
22
|
+
readonly type: "address";
|
|
23
|
+
}, {
|
|
24
|
+
readonly name: "tokenOut";
|
|
25
|
+
readonly type: "address";
|
|
26
|
+
}, {
|
|
27
|
+
readonly name: "amountIn";
|
|
28
|
+
readonly type: "uint256";
|
|
29
|
+
}, {
|
|
30
|
+
readonly name: "minAmountOut";
|
|
31
|
+
readonly type: "uint256";
|
|
32
|
+
}, {
|
|
33
|
+
readonly name: "deadline";
|
|
34
|
+
readonly type: "uint256";
|
|
35
|
+
}, {
|
|
36
|
+
readonly name: "nonce";
|
|
37
|
+
readonly type: "uint256";
|
|
38
|
+
}, {
|
|
39
|
+
readonly name: "feeOnOutput";
|
|
40
|
+
readonly type: "bool";
|
|
41
|
+
}, {
|
|
42
|
+
readonly name: "recipient";
|
|
43
|
+
readonly type: "address";
|
|
44
|
+
}, {
|
|
45
|
+
readonly name: "unwrapOutput";
|
|
46
|
+
readonly type: "bool";
|
|
47
|
+
}, {
|
|
48
|
+
readonly name: "partnerAddress";
|
|
49
|
+
readonly type: "address";
|
|
50
|
+
}];
|
|
51
|
+
};
|
|
52
|
+
export declare const GASLESS_ORDER_TUPLE = "(address maker,address tokenIn,address tokenOut,uint256 amountIn,uint256 minAmountOut,uint256 deadline,uint256 nonce,bool feeOnOutput,address recipient,bool unwrapOutput,address partnerAddress)";
|
|
53
|
+
export declare const GASLESS_ROUTES_TUPLE = "(uint256 amountIn,(address tokenIn,address tokenOut,(address adapter,uint256 amountIn,uint24 fee,bytes data)[] legs)[] hops)[]";
|
|
54
|
+
/** V2 only: fillOrder returns maker output, nominal payout, and the realized cap base. */
|
|
55
|
+
export declare const GASLESS_SWITCH_ABI: readonly ["function settlementVersion() pure returns (uint256)", "function SWITCH_ROUTER() view returns (address)", "function WNATIVE() view returns (address)", "function getFee() pure returns (uint256)", "function MAX_OPERATOR_EXCESS_BPS() pure returns (uint256)", "function paused() view returns (bool)", "function operatorGateEnabled() pure returns (bool)", "function hasRole(bytes32,address) view returns (bool)", "function domainSeparator() view returns (bytes32)", "function isNonceUsed(address maker,uint256 nonce) view returns (bool)", "function invalidateNonce(uint256 nonce)", "function invalidateNonces(uint256[] nonces)", "function canFillOrder((address maker,address tokenIn,address tokenOut,uint256 amountIn,uint256 minAmountOut,uint256 deadline,uint256 nonce,bool feeOnOutput,address recipient,bool unwrapOutput,address partnerAddress) order,bytes signature) view returns (bool)", "function fillOrder((address maker,address tokenIn,address tokenOut,uint256 amountIn,uint256 minAmountOut,uint256 deadline,uint256 nonce,bool feeOnOutput,address recipient,bool unwrapOutput,address partnerAddress) order,bytes signature,(uint256 amountIn,(address tokenIn,address tokenOut,(address adapter,uint256 amountIn,uint24 fee,bytes data)[] legs)[] hops)[] routes,bool excessOnInput) returns (uint256 makerOutput,uint256 operatorPayout,uint256 capBase)", "event OrderFilled(address indexed maker,address indexed filler,uint256 indexed nonce,address tokenIn,address tokenOut,uint256 amountIn,uint256 makerAmountOut,uint256 fillerProfit,bool excessOnInput,address partnerAddress,bool directFill)", "event NonceCancelled(address indexed maker,uint256 indexed nonce)", "event GaslessFeePaid(address indexed maker,uint256 indexed nonce,address indexed token,uint256 nominalFee,uint256 protocolReceived,uint256 partnerReceived)", ...string[]];
|
|
56
|
+
/** Pinned V2 deployments. A future migration requires an explicit trusted override. */
|
|
57
|
+
export declare const GASLESS_DEPLOYMENTS: Readonly<Record<LimitOrderNetwork, Readonly<GaslessDeployment>>>;
|
|
58
|
+
/** Historical V1 gasless addresses for indexing/cancellation, never new submissions. */
|
|
59
|
+
export declare const GASLESS_LEGACY_CONTRACTS: Readonly<Record<LimitOrderNetwork, readonly string[]>>;
|
|
60
|
+
export declare class GaslessError extends Error {
|
|
61
|
+
readonly code: string;
|
|
62
|
+
readonly retryable: boolean;
|
|
63
|
+
constructor(code: string, message: string, retryable?: boolean);
|
|
64
|
+
}
|
|
65
|
+
export declare const sameAddress: (a: unknown, b: string) => boolean;
|
|
66
|
+
export declare function gaslessUint(value: unknown, allowZero?: boolean): bigint;
|
|
67
|
+
export declare function gaslessAddress(value: string, allowZero?: boolean): string;
|
|
68
|
+
export declare function normalizeGaslessTrade(trade: GaslessTrade): Required<GaslessTrade>;
|
|
69
|
+
export declare function getGaslessSigningParams(deployment: GaslessDeployment): {
|
|
70
|
+
domain: {
|
|
71
|
+
name: string;
|
|
72
|
+
version: string;
|
|
73
|
+
chainId: number;
|
|
74
|
+
verifyingContract: string;
|
|
75
|
+
};
|
|
76
|
+
types: {
|
|
77
|
+
LimitOrder: ({
|
|
78
|
+
name: "maker";
|
|
79
|
+
type: "address";
|
|
80
|
+
} | {
|
|
81
|
+
name: "tokenIn";
|
|
82
|
+
type: "address";
|
|
83
|
+
} | {
|
|
84
|
+
name: "tokenOut";
|
|
85
|
+
type: "address";
|
|
86
|
+
} | {
|
|
87
|
+
name: "amountIn";
|
|
88
|
+
type: "uint256";
|
|
89
|
+
} | {
|
|
90
|
+
name: "minAmountOut";
|
|
91
|
+
type: "uint256";
|
|
92
|
+
} | {
|
|
93
|
+
name: "deadline";
|
|
94
|
+
type: "uint256";
|
|
95
|
+
} | {
|
|
96
|
+
name: "nonce";
|
|
97
|
+
type: "uint256";
|
|
98
|
+
} | {
|
|
99
|
+
name: "feeOnOutput";
|
|
100
|
+
type: "bool";
|
|
101
|
+
} | {
|
|
102
|
+
name: "recipient";
|
|
103
|
+
type: "address";
|
|
104
|
+
} | {
|
|
105
|
+
name: "unwrapOutput";
|
|
106
|
+
type: "bool";
|
|
107
|
+
} | {
|
|
108
|
+
name: "partnerAddress";
|
|
109
|
+
type: "address";
|
|
110
|
+
})[];
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
export declare function validateGaslessConfig(config: LimitOrderConfigResponse, deployment: GaslessDeployment): void;
|
|
114
|
+
export declare function validateGaslessTaxInfo(tax: GaslessTaxInfo): void;
|
|
115
|
+
/** Same directional tax rules and preferred fee tokens as the Switch frontend. */
|
|
116
|
+
export declare function selectGaslessFeeOnOutput(network: LimitOrderNetwork, tokenIn: string, tokenOut: string, inputTax: GaslessTaxInfo, outputTax: GaslessTaxInfo): boolean;
|
|
117
|
+
export declare const gaslessCeil: (n: bigint, denominator: bigint) => bigint;
|
|
118
|
+
/** gasPrice from the quote is already boosted: take the maximum, never boost it twice. */
|
|
119
|
+
export declare function gaslessGasBudget(estimate: bigint, rawGasPrice: bigint, quoteGasPrice: bigint): {
|
|
120
|
+
gasLimit: bigint;
|
|
121
|
+
gasPrice: bigint;
|
|
122
|
+
gasBudgetNative: bigint;
|
|
123
|
+
};
|
|
124
|
+
/** Current contract state, not just an API-provided address or USD estimate. */
|
|
125
|
+
export declare function readGaslessChainState(provider: Provider, deployment: GaslessDeployment, now?: number): Promise<GaslessChainState>;
|
|
126
|
+
/** Bind every execution check to the exact trade, route bytes, fee side, and chain. */
|
|
127
|
+
export declare function assessGaslessQuote(quote: GaslessQuoteResponse, tradeInput: GaslessTrade, deployment: GaslessDeployment, state: GaslessChainState, now?: number): GaslessQuoteDecision;
|
|
128
|
+
/** Random 48-bit nonce stays exact in the hosted API's safe-integer database. */
|
|
129
|
+
export declare function createGaslessNonce(): number;
|
|
130
|
+
export declare function buildGaslessOrder(prepared: PreparedGaslessSwap, options?: {
|
|
131
|
+
nonce?: number;
|
|
132
|
+
now?: number;
|
|
133
|
+
}): GaslessOrder;
|
|
134
|
+
export declare const GASLESS_OPERATOR_ROLE: string;
|
|
135
|
+
//# sourceMappingURL=gasless.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gasless.d.ts","sourceRoot":"","sources":["../src/gasless.ts"],"names":[],"mappings":"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"}
|