@morpho-dev/router 0.0.17 → 0.0.18
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/index.browser.d.cts +129 -2
- package/dist/index.browser.d.ts +129 -2
- package/dist/index.browser.js +377 -9
- package/dist/index.browser.js.map +1 -1
- package/dist/index.browser.mjs +377 -5
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.node.d.cts +101 -719
- package/dist/index.node.d.ts +101 -719
- package/dist/index.node.js +735 -1215
- package/dist/index.node.js.map +1 -1
- package/dist/index.node.mjs +734 -1204
- package/dist/index.node.mjs.map +1 -1
- package/package.json +3 -12
- package/dist/drizzle/0000_add-offers-table.sql +0 -37
- package/dist/drizzle/0001_create_offer_status_relation.sql +0 -10
- package/dist/drizzle/0002_add_created_at_in_offer_status_relation.sql +0 -3
- package/dist/drizzle/0003_add-cursor-indices-to-offers.sql +0 -6
- package/dist/drizzle/0004_offer-start.sql +0 -1
- package/dist/drizzle/0005_rename-price-token-buy.sql +0 -8
- package/dist/drizzle/0006_rename-buy.sql +0 -3
- package/dist/drizzle/0007_rename-offering.sql +0 -3
- package/dist/drizzle/0008_add-consumed-relation.sql +0 -10
- package/dist/drizzle/meta/0000_snapshot.json +0 -344
- package/dist/drizzle/meta/0001_snapshot.json +0 -426
- package/dist/drizzle/meta/0002_snapshot.json +0 -439
- package/dist/drizzle/meta/0003_snapshot.json +0 -553
- package/dist/drizzle/meta/0004_snapshot.json +0 -559
- package/dist/drizzle/meta/0005_snapshot.json +0 -559
- package/dist/drizzle/meta/0006_snapshot.json +0 -559
- package/dist/drizzle/meta/0007_snapshot.json +0 -559
- package/dist/drizzle/meta/0008_snapshot.json +0 -635
- package/dist/drizzle/meta/_journal.json +0 -69
package/dist/index.browser.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
var mempool = require('@morpho-dev/mempool');
|
|
4
4
|
var chains$1 = require('viem/chains');
|
|
5
|
-
var viem = require('viem');
|
|
6
5
|
var v4 = require('zod/v4');
|
|
7
6
|
var zodOpenapi = require('zod-openapi');
|
|
7
|
+
var viem = require('viem');
|
|
8
8
|
|
|
9
9
|
var __defProp = Object.defineProperty;
|
|
10
10
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
@@ -68,7 +68,7 @@ var chains = {
|
|
|
68
68
|
}
|
|
69
69
|
};
|
|
70
70
|
|
|
71
|
-
// src/core/Client.ts
|
|
71
|
+
// src/core/router/Client.ts
|
|
72
72
|
var Client_exports = {};
|
|
73
73
|
__export(Client_exports, {
|
|
74
74
|
HttpForbiddenError: () => HttpForbiddenError,
|
|
@@ -139,6 +139,18 @@ var InvalidRouterOfferError = class extends mempool.Errors.BaseError {
|
|
|
139
139
|
}
|
|
140
140
|
};
|
|
141
141
|
|
|
142
|
+
// src/utils/index.ts
|
|
143
|
+
var utils_exports = {};
|
|
144
|
+
__export(utils_exports, {
|
|
145
|
+
batch: () => batch,
|
|
146
|
+
decodeCursor: () => decodeCursor,
|
|
147
|
+
encodeCursor: () => encodeCursor,
|
|
148
|
+
poll: () => poll,
|
|
149
|
+
retry: () => retry,
|
|
150
|
+
validateCursor: () => validateCursor,
|
|
151
|
+
wait: () => wait
|
|
152
|
+
});
|
|
153
|
+
|
|
142
154
|
// src/utils/batch.ts
|
|
143
155
|
function* batch(array, batchSize) {
|
|
144
156
|
for (let i = 0; i < array.length; i += batchSize) {
|
|
@@ -249,6 +261,20 @@ function poll(fn, { interval }) {
|
|
|
249
261
|
return unwatch;
|
|
250
262
|
}
|
|
251
263
|
|
|
264
|
+
// src/utils/retry.ts
|
|
265
|
+
var retry = async (fn, attempts = 3, delayMs = 50) => {
|
|
266
|
+
let lastErr;
|
|
267
|
+
for (let i = 0; i < attempts; i++) {
|
|
268
|
+
try {
|
|
269
|
+
return await fn();
|
|
270
|
+
} catch (err) {
|
|
271
|
+
lastErr = err;
|
|
272
|
+
if (i < attempts - 1) await new Promise((r) => setTimeout(r, delayMs));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
throw lastErr;
|
|
276
|
+
};
|
|
277
|
+
|
|
252
278
|
// src/core/apiSchema/requests.ts
|
|
253
279
|
var MAX_LIMIT = 100;
|
|
254
280
|
var DEFAULT_LIMIT = 20;
|
|
@@ -740,7 +766,7 @@ function fromResponse(offerResponse) {
|
|
|
740
766
|
};
|
|
741
767
|
}
|
|
742
768
|
|
|
743
|
-
// src/core/Client.ts
|
|
769
|
+
// src/core/router/Client.ts
|
|
744
770
|
function connect(opts) {
|
|
745
771
|
const u = new URL(opts?.url || "https://router.morpho.dev");
|
|
746
772
|
if (u.protocol !== "http:" && u.protocol !== "https:") {
|
|
@@ -970,6 +996,352 @@ var HttpGetOffersFailedError = class extends mempool.Errors.BaseError {
|
|
|
970
996
|
}
|
|
971
997
|
};
|
|
972
998
|
|
|
999
|
+
// src/OfferStore/index.ts
|
|
1000
|
+
var OfferStore_exports = {};
|
|
1001
|
+
__export(OfferStore_exports, {
|
|
1002
|
+
memory: () => memory
|
|
1003
|
+
});
|
|
1004
|
+
function memory(parameters) {
|
|
1005
|
+
const map = parameters.offers;
|
|
1006
|
+
const filled = parameters.filled;
|
|
1007
|
+
const create = async (parameters2) => {
|
|
1008
|
+
if (map.has(parameters2.offer.hash.toLowerCase())) return parameters2.offer.hash;
|
|
1009
|
+
map.set(parameters2.offer.hash.toLowerCase(), {
|
|
1010
|
+
...parameters2.offer,
|
|
1011
|
+
status: parameters2.status,
|
|
1012
|
+
metadata: parameters2.metadata
|
|
1013
|
+
});
|
|
1014
|
+
const chainId = parameters2.offer.chainId;
|
|
1015
|
+
const address = parameters2.offer.offering.toLowerCase();
|
|
1016
|
+
const nonce = parameters2.offer.nonce;
|
|
1017
|
+
const filledForChain = filled.get(chainId) || /* @__PURE__ */ new Map();
|
|
1018
|
+
const filledForOffering = filledForChain.get(address) || /* @__PURE__ */ new Map();
|
|
1019
|
+
if (!filledForOffering.has(nonce)) filledForOffering.set(nonce, 0n);
|
|
1020
|
+
filledForChain.set(address, filledForOffering);
|
|
1021
|
+
filled.set(chainId, filledForChain);
|
|
1022
|
+
return Promise.resolve(parameters2.offer.hash);
|
|
1023
|
+
};
|
|
1024
|
+
const sort = (sortBy, sortOrder, a, b) => {
|
|
1025
|
+
sortBy = sortBy || "expiry";
|
|
1026
|
+
sortOrder = sortOrder || "desc";
|
|
1027
|
+
const sortKey = sortBy === "amount" ? "assets" : sortBy;
|
|
1028
|
+
if (a[sortKey] === b[sortKey]) {
|
|
1029
|
+
if (a.hash === b.hash) return 0;
|
|
1030
|
+
return sortOrder === "asc" ? a.hash > b.hash ? 1 : -1 : b.hash > a.hash ? 1 : -1;
|
|
1031
|
+
}
|
|
1032
|
+
switch (sortBy) {
|
|
1033
|
+
case "rate":
|
|
1034
|
+
if (a.rate === b.rate) {
|
|
1035
|
+
if (a.hash === b.hash) return 0;
|
|
1036
|
+
return sortOrder === "asc" ? a.hash > b.hash ? 1 : -1 : a.hash > b.hash ? -1 : 1;
|
|
1037
|
+
}
|
|
1038
|
+
return sortOrder === "asc" ? a.rate > b.rate ? 1 : -1 : b.rate > a.rate ? 1 : -1;
|
|
1039
|
+
case "maturity":
|
|
1040
|
+
if (a.maturity === b.maturity) {
|
|
1041
|
+
if (a.hash === b.hash) return 0;
|
|
1042
|
+
return sortOrder === "asc" ? a.hash > b.hash ? 1 : -1 : a.hash > b.hash ? -1 : 1;
|
|
1043
|
+
}
|
|
1044
|
+
return sortOrder === "asc" ? a.maturity > b.maturity ? 1 : -1 : b.maturity > a.maturity ? 1 : -1;
|
|
1045
|
+
case "expiry":
|
|
1046
|
+
if (a.expiry === b.expiry) {
|
|
1047
|
+
if (a.hash === b.hash) return 0;
|
|
1048
|
+
return sortOrder === "asc" ? a.hash > b.hash ? 1 : -1 : a.hash > b.hash ? -1 : 1;
|
|
1049
|
+
}
|
|
1050
|
+
return sortOrder === "asc" ? a.expiry > b.expiry ? 1 : -1 : b.expiry > a.expiry ? 1 : -1;
|
|
1051
|
+
case "amount":
|
|
1052
|
+
if (a.assets === b.assets) {
|
|
1053
|
+
if (a.hash === b.hash) return 0;
|
|
1054
|
+
return sortOrder === "asc" ? a.hash > b.hash ? 1 : -1 : a.hash > b.hash ? -1 : 1;
|
|
1055
|
+
}
|
|
1056
|
+
return sortOrder === "asc" ? a.assets > b.assets ? 1 : -1 : b.assets > a.assets ? 1 : -1;
|
|
1057
|
+
default:
|
|
1058
|
+
if (a.expiry === b.expiry) {
|
|
1059
|
+
if (a.hash === b.hash) return 0;
|
|
1060
|
+
return sortOrder === "asc" ? a.hash > b.hash ? 1 : -1 : a.hash > b.hash ? -1 : 1;
|
|
1061
|
+
}
|
|
1062
|
+
return sortOrder === "asc" ? a.expiry > b.expiry ? 1 : -1 : b.expiry > a.expiry ? 1 : -1;
|
|
1063
|
+
}
|
|
1064
|
+
};
|
|
1065
|
+
return {
|
|
1066
|
+
create,
|
|
1067
|
+
createMany: async (parameters2) => {
|
|
1068
|
+
return Promise.all(
|
|
1069
|
+
parameters2.map((p) => create({ offer: p.offer, status: p.status, metadata: p.metadata }))
|
|
1070
|
+
);
|
|
1071
|
+
},
|
|
1072
|
+
getAll: async (params) => {
|
|
1073
|
+
const { query } = params || {};
|
|
1074
|
+
let {
|
|
1075
|
+
creators,
|
|
1076
|
+
side,
|
|
1077
|
+
chains: chains2,
|
|
1078
|
+
loanTokens,
|
|
1079
|
+
status = ["valid"],
|
|
1080
|
+
callbackAddresses,
|
|
1081
|
+
minAmount,
|
|
1082
|
+
maxAmount,
|
|
1083
|
+
minRate,
|
|
1084
|
+
maxRate,
|
|
1085
|
+
minMaturity,
|
|
1086
|
+
maxMaturity,
|
|
1087
|
+
minExpiry,
|
|
1088
|
+
maxExpiry,
|
|
1089
|
+
collateralAssets,
|
|
1090
|
+
collateralOracles,
|
|
1091
|
+
collateralTuple,
|
|
1092
|
+
minLltv,
|
|
1093
|
+
maxLltv,
|
|
1094
|
+
sortBy = "expiry",
|
|
1095
|
+
sortOrder = "desc",
|
|
1096
|
+
cursor: queryCursor,
|
|
1097
|
+
limit = 20
|
|
1098
|
+
} = query || {};
|
|
1099
|
+
const now = mempool.Time.now();
|
|
1100
|
+
const buy = side === "buy";
|
|
1101
|
+
let offers = Array.from(map.values()).map((o) => ({
|
|
1102
|
+
...o,
|
|
1103
|
+
consumed: filled.get(o.chainId)?.get(o.offering.toLowerCase())?.get(o.nonce) || 0n
|
|
1104
|
+
})).filter((o) => o.consumed < o.assets);
|
|
1105
|
+
const cursor = decodeCursor(queryCursor);
|
|
1106
|
+
if (cursor) {
|
|
1107
|
+
if (cursor.sort !== sortBy || cursor.dir !== sortOrder) {
|
|
1108
|
+
throw new Error("Cursor does not match the current sort parameters");
|
|
1109
|
+
}
|
|
1110
|
+
switch (cursor.sort) {
|
|
1111
|
+
case "rate":
|
|
1112
|
+
offers = offers.filter(
|
|
1113
|
+
(o) => (sortOrder === "asc" ? o.rate >= BigInt(cursor.rate) : o.rate <= BigInt(cursor.rate)) && (o.rate !== BigInt(cursor.rate) || (sortOrder === "asc" ? o.hash > cursor.hash : o.hash < cursor.hash))
|
|
1114
|
+
);
|
|
1115
|
+
break;
|
|
1116
|
+
case "maturity":
|
|
1117
|
+
offers = offers.filter(
|
|
1118
|
+
(o) => (sortOrder === "asc" ? o.maturity >= BigInt(cursor.maturity) : o.maturity <= BigInt(cursor.maturity)) && (o.maturity !== mempool.Maturity.from(cursor.maturity) || (sortOrder === "asc" ? o.hash > cursor.hash : o.hash < cursor.hash))
|
|
1119
|
+
);
|
|
1120
|
+
break;
|
|
1121
|
+
case "expiry":
|
|
1122
|
+
offers = offers.filter(
|
|
1123
|
+
(o) => (sortOrder === "asc" ? o.expiry >= cursor.expiry : o.expiry <= cursor.expiry) && (o.expiry !== cursor.expiry || (sortOrder === "asc" ? o.hash > cursor.hash : o.hash < cursor.hash))
|
|
1124
|
+
);
|
|
1125
|
+
break;
|
|
1126
|
+
case "amount":
|
|
1127
|
+
offers = offers.filter(
|
|
1128
|
+
(o) => (sortOrder === "asc" ? o.assets >= BigInt(cursor.assets) : o.assets <= BigInt(cursor.assets)) && (o.assets !== BigInt(cursor.assets) || (sortOrder === "asc" ? o.hash > cursor.hash : o.hash < cursor.hash))
|
|
1129
|
+
);
|
|
1130
|
+
break;
|
|
1131
|
+
default:
|
|
1132
|
+
throw new Error("Invalid sort parameter");
|
|
1133
|
+
}
|
|
1134
|
+
offers = offers.filter((o) => o.hash !== cursor.hash);
|
|
1135
|
+
}
|
|
1136
|
+
creators && (creators = creators.map((c) => c.toLowerCase()));
|
|
1137
|
+
loanTokens && (loanTokens = loanTokens.map((lt) => lt.toLowerCase()));
|
|
1138
|
+
collateralAssets && (collateralAssets = collateralAssets.map((ca) => ca.toLowerCase()));
|
|
1139
|
+
collateralOracles && (collateralOracles = collateralOracles.map((co) => co.toLowerCase()));
|
|
1140
|
+
collateralTuple && (collateralTuple = collateralTuple.map((ct) => ({
|
|
1141
|
+
asset: ct.asset.toLowerCase(),
|
|
1142
|
+
oracle: ct.oracle?.toLowerCase()
|
|
1143
|
+
})));
|
|
1144
|
+
offers = offers.filter((o) => o.expiry >= now);
|
|
1145
|
+
creators && (offers = offers.filter((o) => creators.includes(o.offering.toLowerCase())));
|
|
1146
|
+
side && (offers = offers.filter((o) => o.buy === buy));
|
|
1147
|
+
chains2 && (offers = offers.filter((o) => chains2.includes(Number(o.chainId))));
|
|
1148
|
+
loanTokens && (offers = offers.filter((o) => loanTokens.includes(o.loanToken.toLowerCase())));
|
|
1149
|
+
status && (offers = offers.filter((o) => status.includes(o.status)));
|
|
1150
|
+
callbackAddresses && (offers = offers.filter(
|
|
1151
|
+
(o) => callbackAddresses.includes(o.callback.address.toLowerCase())
|
|
1152
|
+
));
|
|
1153
|
+
minAmount && (offers = offers.filter((o) => o.assets >= minAmount));
|
|
1154
|
+
maxAmount && (offers = offers.filter((o) => o.assets <= maxAmount));
|
|
1155
|
+
minRate && (offers = offers.filter((o) => o.rate >= minRate));
|
|
1156
|
+
maxRate && (offers = offers.filter((o) => o.rate <= maxRate));
|
|
1157
|
+
minMaturity && (offers = offers.filter((o) => o.maturity >= minMaturity));
|
|
1158
|
+
maxMaturity && (offers = offers.filter((o) => o.maturity <= maxMaturity));
|
|
1159
|
+
minExpiry && (offers = offers.filter((o) => o.expiry >= minExpiry));
|
|
1160
|
+
maxExpiry && (offers = offers.filter((o) => o.expiry <= maxExpiry));
|
|
1161
|
+
collateralAssets && (offers = offers.filter(
|
|
1162
|
+
(o) => o.collaterals.some((c) => collateralAssets.includes(c.asset.toLowerCase()))
|
|
1163
|
+
));
|
|
1164
|
+
collateralOracles && (offers = offers.filter(
|
|
1165
|
+
(o) => o.collaterals.some((c) => collateralOracles.includes(c.oracle.toLowerCase()))
|
|
1166
|
+
));
|
|
1167
|
+
collateralTuple && (offers = offers.filter(
|
|
1168
|
+
(o) => o.collaterals.some(
|
|
1169
|
+
(c) => collateralTuple.some(
|
|
1170
|
+
(ct) => c.asset.toLowerCase() === ct.asset.toLowerCase() && (ct.oracle ? c.oracle.toLowerCase() === ct.oracle.toLowerCase() : true) && (ct.lltv ? c.lltv === mempool.LLTV.from(BigInt(ct.lltv)) : true)
|
|
1171
|
+
)
|
|
1172
|
+
)
|
|
1173
|
+
));
|
|
1174
|
+
minLltv && (offers = offers.filter(
|
|
1175
|
+
(o) => o.collaterals.every((c) => c.lltv >= mempool.LLTV.from(viem.parseUnits(minLltv.toString(), 16)))
|
|
1176
|
+
));
|
|
1177
|
+
maxLltv && (offers = offers.filter(
|
|
1178
|
+
(o) => o.collaterals.every((c) => c.lltv <= mempool.LLTV.from(viem.parseUnits(maxLltv.toString(), 16)))
|
|
1179
|
+
));
|
|
1180
|
+
offers = offers.sort((a, b) => sort(sortBy, sortOrder, a, b));
|
|
1181
|
+
let nextCursor = null;
|
|
1182
|
+
if (offers.length > limit) {
|
|
1183
|
+
const last = offers[limit - 1];
|
|
1184
|
+
const base = {
|
|
1185
|
+
sort: sortBy,
|
|
1186
|
+
dir: sortOrder,
|
|
1187
|
+
hash: last.hash
|
|
1188
|
+
};
|
|
1189
|
+
switch (sortBy) {
|
|
1190
|
+
case "rate":
|
|
1191
|
+
base.rate = last.rate.toString();
|
|
1192
|
+
break;
|
|
1193
|
+
case "amount":
|
|
1194
|
+
base.assets = last.assets.toString();
|
|
1195
|
+
break;
|
|
1196
|
+
case "maturity":
|
|
1197
|
+
base.maturity = last.maturity;
|
|
1198
|
+
break;
|
|
1199
|
+
default:
|
|
1200
|
+
base.expiry = last.expiry;
|
|
1201
|
+
}
|
|
1202
|
+
nextCursor = encodeCursor(base);
|
|
1203
|
+
}
|
|
1204
|
+
offers = offers.slice(0, limit);
|
|
1205
|
+
return {
|
|
1206
|
+
offers,
|
|
1207
|
+
nextCursor
|
|
1208
|
+
};
|
|
1209
|
+
},
|
|
1210
|
+
findMatchingOffers: async (params) => {
|
|
1211
|
+
const {
|
|
1212
|
+
side,
|
|
1213
|
+
chainId,
|
|
1214
|
+
rate,
|
|
1215
|
+
collaterals = [],
|
|
1216
|
+
maturity,
|
|
1217
|
+
minMaturity,
|
|
1218
|
+
maxMaturity,
|
|
1219
|
+
loanToken,
|
|
1220
|
+
creator,
|
|
1221
|
+
status,
|
|
1222
|
+
cursor: queryCursor,
|
|
1223
|
+
limit = 20
|
|
1224
|
+
} = params;
|
|
1225
|
+
const now = mempool.Time.now();
|
|
1226
|
+
const buy = side !== "buy";
|
|
1227
|
+
const sortOrder = buy ? "asc" : "desc";
|
|
1228
|
+
let offers = Array.from(map.values()).map((o) => ({
|
|
1229
|
+
...o,
|
|
1230
|
+
consumed: filled.get(o.chainId)?.get(o.offering.toLowerCase())?.get(o.nonce) || 0n
|
|
1231
|
+
})).filter((o) => o.consumed < o.assets);
|
|
1232
|
+
const cursor = decodeCursor(queryCursor);
|
|
1233
|
+
if (cursor) {
|
|
1234
|
+
if (cursor.sort !== "rate" || cursor.dir !== sortOrder) {
|
|
1235
|
+
throw new Error("Cursor does not match the current sort parameters");
|
|
1236
|
+
}
|
|
1237
|
+
offers = offers.filter(
|
|
1238
|
+
(o) => sortOrder === "asc" ? o.rate >= BigInt(cursor.rate) : o.rate <= BigInt(cursor.rate)
|
|
1239
|
+
);
|
|
1240
|
+
offers = offers.filter((o) => o.hash !== cursor.hash);
|
|
1241
|
+
}
|
|
1242
|
+
offers = offers.filter((o) => o.buy === buy);
|
|
1243
|
+
offers = offers.filter((o) => o.chainId === BigInt(chainId));
|
|
1244
|
+
offers = offers.filter((o) => o.expiry >= now);
|
|
1245
|
+
rate && (offers = offers.filter((o) => buy ? o.rate >= rate : o.rate <= rate));
|
|
1246
|
+
collaterals.length > 0 && (offers = offers.filter(
|
|
1247
|
+
(o) => buy ? collaterals.every((c) => {
|
|
1248
|
+
return o.collaterals.some(
|
|
1249
|
+
(oc) => oc.asset.toLowerCase() === c.asset.toLowerCase() && oc.oracle.toLowerCase() === c.oracle.toLowerCase() && oc.lltv === c.lltv
|
|
1250
|
+
);
|
|
1251
|
+
}) : o.collaterals.every((oc) => {
|
|
1252
|
+
return collaterals.some(
|
|
1253
|
+
(c) => oc.asset.toLowerCase() === c.asset.toLowerCase() && oc.oracle.toLowerCase() === c.oracle.toLowerCase() && oc.lltv === c.lltv
|
|
1254
|
+
);
|
|
1255
|
+
})
|
|
1256
|
+
));
|
|
1257
|
+
maturity && (offers = offers.filter((o) => o.maturity === maturity));
|
|
1258
|
+
minMaturity && (offers = offers.filter((o) => o.maturity >= minMaturity));
|
|
1259
|
+
maxMaturity && (offers = offers.filter((o) => o.maturity <= maxMaturity));
|
|
1260
|
+
loanToken && (offers = offers.filter((o) => o.loanToken.toLowerCase() === loanToken.toLowerCase()));
|
|
1261
|
+
creator && (offers = offers.filter((o) => o.offering.toLowerCase() === creator.toLowerCase()));
|
|
1262
|
+
status && (offers = offers.filter((o) => status.includes(o.status)));
|
|
1263
|
+
const byGroup = /* @__PURE__ */ new Map();
|
|
1264
|
+
for (const offer of offers) {
|
|
1265
|
+
const groupKey = `${offer.chainId}-${offer.offering.toLowerCase()}-${offer.nonce}-${offer.buy}`;
|
|
1266
|
+
const current = byGroup.get(groupKey);
|
|
1267
|
+
if (!current) {
|
|
1268
|
+
byGroup.set(groupKey, offer);
|
|
1269
|
+
continue;
|
|
1270
|
+
}
|
|
1271
|
+
const remainingCandidate = offer.assets - offer.consumed;
|
|
1272
|
+
const remainingCurrent = current.assets - current.consumed;
|
|
1273
|
+
let candidateIsBetter = false;
|
|
1274
|
+
if (offer.buy) {
|
|
1275
|
+
if (offer.rate !== current.rate) candidateIsBetter = offer.rate < current.rate;
|
|
1276
|
+
else if (remainingCandidate !== remainingCurrent)
|
|
1277
|
+
candidateIsBetter = remainingCandidate > remainingCurrent;
|
|
1278
|
+
else if (offer.maturity !== current.maturity)
|
|
1279
|
+
candidateIsBetter = offer.maturity > current.maturity;
|
|
1280
|
+
else candidateIsBetter = offer.hash < current.hash;
|
|
1281
|
+
} else {
|
|
1282
|
+
if (offer.rate !== current.rate) candidateIsBetter = offer.rate > current.rate;
|
|
1283
|
+
else if (remainingCandidate !== remainingCurrent)
|
|
1284
|
+
candidateIsBetter = remainingCandidate > remainingCurrent;
|
|
1285
|
+
else if (offer.maturity !== current.maturity)
|
|
1286
|
+
candidateIsBetter = offer.maturity > current.maturity;
|
|
1287
|
+
else candidateIsBetter = offer.hash < current.hash;
|
|
1288
|
+
}
|
|
1289
|
+
if (candidateIsBetter) byGroup.set(groupKey, offer);
|
|
1290
|
+
}
|
|
1291
|
+
offers = Array.from(byGroup.values());
|
|
1292
|
+
offers = offers.sort((a, b) => sort("rate", sortOrder, a, b));
|
|
1293
|
+
let nextCursor = null;
|
|
1294
|
+
if (offers.length > limit) {
|
|
1295
|
+
const last = offers[limit - 1];
|
|
1296
|
+
nextCursor = encodeCursor({
|
|
1297
|
+
sort: "rate",
|
|
1298
|
+
dir: sortOrder,
|
|
1299
|
+
hash: last.hash,
|
|
1300
|
+
rate: last.rate.toString()
|
|
1301
|
+
});
|
|
1302
|
+
}
|
|
1303
|
+
offers = offers.slice(0, limit);
|
|
1304
|
+
return {
|
|
1305
|
+
offers,
|
|
1306
|
+
nextCursor
|
|
1307
|
+
};
|
|
1308
|
+
},
|
|
1309
|
+
delete: async (hash) => {
|
|
1310
|
+
if (!map.has(hash.toLowerCase())) return false;
|
|
1311
|
+
map.delete(hash.toLowerCase());
|
|
1312
|
+
return true;
|
|
1313
|
+
},
|
|
1314
|
+
deleteMany: async (hashes) => {
|
|
1315
|
+
let deleted = 0;
|
|
1316
|
+
for (const hash of hashes) {
|
|
1317
|
+
if (map.has(hash.toLowerCase())) {
|
|
1318
|
+
map.delete(hash.toLowerCase());
|
|
1319
|
+
deleted++;
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
return deleted;
|
|
1323
|
+
},
|
|
1324
|
+
updateStatus: async (parameters2) => {
|
|
1325
|
+
if (!map.has(parameters2.offerHash.toLowerCase())) return;
|
|
1326
|
+
map.set(parameters2.offerHash.toLowerCase(), {
|
|
1327
|
+
...map.get(parameters2.offerHash.toLowerCase()),
|
|
1328
|
+
status: parameters2.status,
|
|
1329
|
+
metadata: parameters2.metadata
|
|
1330
|
+
});
|
|
1331
|
+
},
|
|
1332
|
+
updateConsumedAmount: async (parameters2) => {
|
|
1333
|
+
const chainId = parameters2.chainId;
|
|
1334
|
+
const address = parameters2.offering.toLowerCase();
|
|
1335
|
+
const nonce = parameters2.nonce;
|
|
1336
|
+
const filledForChain = filled.get(chainId) || /* @__PURE__ */ new Map();
|
|
1337
|
+
const filledForOffering = filledForChain.get(address) || /* @__PURE__ */ new Map();
|
|
1338
|
+
filledForOffering.set(nonce, parameters2.consumed);
|
|
1339
|
+
filledForChain.set(address, filledForOffering);
|
|
1340
|
+
filled.set(chainId, filledForChain);
|
|
1341
|
+
}
|
|
1342
|
+
};
|
|
1343
|
+
}
|
|
1344
|
+
|
|
973
1345
|
// src/RouterEvent.ts
|
|
974
1346
|
var RouterEvent_exports = {};
|
|
975
1347
|
__export(RouterEvent_exports, {
|
|
@@ -1205,17 +1577,13 @@ function morpho(parameters) {
|
|
|
1205
1577
|
}
|
|
1206
1578
|
|
|
1207
1579
|
exports.Chain = Chain_exports;
|
|
1580
|
+
exports.OfferStore = OfferStore_exports;
|
|
1208
1581
|
exports.Router = Client_exports;
|
|
1209
1582
|
exports.RouterEvent = RouterEvent_exports;
|
|
1210
1583
|
exports.RouterOffer = RouterOffer_exports;
|
|
1584
|
+
exports.Utils = utils_exports;
|
|
1211
1585
|
exports.Validation = Validation_exports;
|
|
1212
1586
|
exports.ValidationRule = ValidationRule_exports;
|
|
1213
|
-
exports.batch = batch;
|
|
1214
|
-
exports.decodeCursor = decodeCursor;
|
|
1215
|
-
exports.encodeCursor = encodeCursor;
|
|
1216
|
-
exports.poll = poll;
|
|
1217
|
-
exports.validateCursor = validateCursor;
|
|
1218
|
-
exports.wait = wait;
|
|
1219
1587
|
Object.keys(mempool).forEach(function (k) {
|
|
1220
1588
|
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
1221
1589
|
enumerable: true,
|