@sly-rentals/core 6.0.0 → 6.1.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/api.json +3556 -3373
- package/dist/cjs/doctor/contract.js +106 -66
- package/dist/cjs/doctor/contract.js.map +1 -1
- package/dist/cjs/doctor/contract.test.js +73 -2
- package/dist/cjs/doctor/contract.test.js.map +1 -1
- package/dist/cjs/generated/codama/instructions/closeRental.js +12 -0
- package/dist/cjs/generated/codama/instructions/closeRental.js.map +1 -1
- package/dist/cjs/idl/srsly.json +53 -2
- package/dist/cjs/instructions/closeContract.js +23 -38
- package/dist/cjs/instructions/closeContract.js.map +1 -1
- package/dist/cjs/instructions/closeContract.test.js +88 -0
- package/dist/cjs/instructions/closeContract.test.js.map +1 -1
- package/dist/cjs/instructions/closeRental.js +12 -1
- package/dist/cjs/instructions/closeRental.js.map +1 -1
- package/dist/cjs/legacy/closeContract.test.js +107 -0
- package/dist/cjs/legacy/closeContract.test.js.map +1 -0
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/utils/rpc.js +43 -0
- package/dist/cjs/utils/rpc.js.map +1 -1
- package/dist/cjs/utils/rpc.test.js +60 -0
- package/dist/cjs/utils/rpc.test.js.map +1 -0
- package/dist/cjs/version.js +1 -1
- package/dist/esm/doctor/contract.js +107 -67
- package/dist/esm/doctor/contract.js.map +1 -1
- package/dist/esm/doctor/contract.test.js +73 -2
- package/dist/esm/doctor/contract.test.js.map +1 -1
- package/dist/esm/generated/codama/instructions/closeRental.js +12 -0
- package/dist/esm/generated/codama/instructions/closeRental.js.map +1 -1
- package/dist/esm/idl/srsly.json +53 -2
- package/dist/esm/instructions/closeContract.js +23 -38
- package/dist/esm/instructions/closeContract.js.map +1 -1
- package/dist/esm/instructions/closeContract.test.js +88 -0
- package/dist/esm/instructions/closeContract.test.js.map +1 -1
- package/dist/esm/instructions/closeRental.js +13 -2
- package/dist/esm/instructions/closeRental.js.map +1 -1
- package/dist/esm/legacy/closeContract.test.js +105 -0
- package/dist/esm/legacy/closeContract.test.js.map +1 -0
- package/dist/esm/package.json +1 -1
- package/dist/esm/utils/rpc.js +41 -0
- package/dist/esm/utils/rpc.js.map +1 -1
- package/dist/esm/utils/rpc.test.js +58 -0
- package/dist/esm/utils/rpc.test.js.map +1 -0
- package/dist/esm/version.js +1 -1
- package/dist/idl/srsly.json +53 -2
- package/dist/types/doctor/contract.d.ts +23 -1
- package/dist/types/doctor/contract.d.ts.map +1 -1
- package/dist/types/generated/codama/instructions/closeRental.d.ts +46 -1
- package/dist/types/generated/codama/instructions/closeRental.d.ts.map +1 -1
- package/dist/types/instructions/closeContract.d.ts +6 -3
- package/dist/types/instructions/closeContract.d.ts.map +1 -1
- package/dist/types/instructions/closeRental.d.ts.map +1 -1
- package/dist/types/legacy/closeContract.test.d.ts +2 -0
- package/dist/types/legacy/closeContract.test.d.ts.map +1 -0
- package/dist/types/utils/rpc.d.ts +18 -0
- package/dist/types/utils/rpc.d.ts.map +1 -1
- package/dist/types/utils/rpc.test.d.ts +2 -0
- package/dist/types/utils/rpc.test.d.ts.map +1 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -20,12 +20,15 @@ const thread_2 = require("../pda/thread");
|
|
|
20
20
|
const instructions_2 = require("../utils/instructions");
|
|
21
21
|
const closeRental_1 = require("./closeRental");
|
|
22
22
|
/**
|
|
23
|
-
* Close a rental contract and refund rent to the owner.
|
|
24
|
-
*
|
|
23
|
+
* Close a rental contract and refund rent to the owner. Whenever the close
|
|
24
|
+
* finishes in this transaction, the contract's automation thread is torn down
|
|
25
|
+
* in the same one — the on-chain immediate-close branch refuses to run while
|
|
26
|
+
* `contract.thread` still names a live thread.
|
|
25
27
|
*
|
|
26
28
|
* A live rental cannot be closed out from under its borrower, so the close is
|
|
27
29
|
* latched as `to_close` and completed later by the automation thread, once the
|
|
28
|
-
* rental ends.
|
|
30
|
+
* rental ends. On that path the thread is deliberately left running: it is the
|
|
31
|
+
* only thing that can act on the flag. Antegen execution is permissionless and executors are paid from
|
|
29
32
|
* the thread's own lamport balance, so a drained thread can be revived by
|
|
30
33
|
* anyone with a plain SOL transfer — the owner does not need to come back.
|
|
31
34
|
*
|
|
@@ -181,47 +184,29 @@ async function closeContract(params, config) {
|
|
|
181
184
|
: {}),
|
|
182
185
|
}, { programAddress });
|
|
183
186
|
};
|
|
184
|
-
//
|
|
187
|
+
// Mirrors `has_live_active_rental` (contract_close.rs:292-302): a live rental
|
|
188
|
+
// defers via `to_close`, anything else closes immediately. Keying the thread
|
|
189
|
+
// decision off "is there a rental" instead conflates an empty slot with a
|
|
190
|
+
// live one and gets the live case backwards.
|
|
191
|
+
const willDefer = hasActiveSlot && !activeExpired;
|
|
185
192
|
const ixs = [];
|
|
186
|
-
if (activeExpired
|
|
187
|
-
//
|
|
193
|
+
if (activeExpired) {
|
|
194
|
+
// Settle first: the fee flush, CTF points, SAGE invalidate and discount
|
|
195
|
+
// refund only exist in `rental_close`. Without it `contract_close` sweeps
|
|
196
|
+
// the contract ATA to the owner (contract_close.rs:336-350).
|
|
188
197
|
//
|
|
189
|
-
//
|
|
190
|
-
//
|
|
191
|
-
// would just re-latch `to_close`. Suppress the activation so the rental
|
|
192
|
-
// ends and the slot stays empty (Path A), drop the thread so the
|
|
193
|
-
// immediate-close branch isn't blocked by `ThreadStillExists`, then let a
|
|
194
|
-
// single `closeContract` force-refund the challenger and close for real.
|
|
195
|
-
// 1. Settle the expired active without promoting the queued challenger.
|
|
198
|
+
// `activateQueued` must stay false — Path B would install a new live
|
|
199
|
+
// rental and every close after it could only re-latch `to_close`.
|
|
196
200
|
const closeRentalResult = await (0, closeRental_1.closeRental)({ payer: params.owner, contract: contractAddress, activateQueued: false }, config);
|
|
197
201
|
ixs.push(...closeRentalResult.instructions);
|
|
198
|
-
// 2. closeContractThread (if thread exists)
|
|
199
|
-
if (hasThread) {
|
|
200
|
-
ixs.push(await buildThreadCloseIx());
|
|
201
|
-
}
|
|
202
|
-
// 3. closeContract — force-refunds the queued challenger, then closes.
|
|
203
|
-
ixs.push(await buildCloseContractIx(true));
|
|
204
|
-
}
|
|
205
|
-
else if (activeExpired && !hasQueuedSlot) {
|
|
206
|
-
// Expired active only, no queued — settle then close
|
|
207
|
-
const closeRentalResult = await (0, closeRental_1.closeRental)({ payer: params.owner, contract: contractAddress }, config);
|
|
208
|
-
ixs.push(...closeRentalResult.instructions);
|
|
209
|
-
if (hasThread) {
|
|
210
|
-
ixs.push(await buildThreadCloseIx());
|
|
211
|
-
}
|
|
212
|
-
ixs.push(await buildCloseContractIx(false));
|
|
213
|
-
}
|
|
214
|
-
else if (!activeExpired && hasQueuedSlot) {
|
|
215
|
-
// Non-expired active + queued — deferred close with queued borrower accounts
|
|
216
|
-
ixs.push(await buildCloseContractIx(true));
|
|
217
202
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
ixs.push(await buildCloseContractIx(false));
|
|
203
|
+
// Closing now means the thread must go first (ThreadStillExists); deferring
|
|
204
|
+
// means keeping it, since `contract_process` (:260 → Signal::Close) is the
|
|
205
|
+
// only automated route from `to_close` to a closed contract.
|
|
206
|
+
if (hasThread && !willDefer) {
|
|
207
|
+
ixs.push(await buildThreadCloseIx());
|
|
224
208
|
}
|
|
209
|
+
ixs.push(await buildCloseContractIx(hasQueuedSlot));
|
|
225
210
|
return (0, instructions_2.prepareInstructions)(ixs, {
|
|
226
211
|
computeUnits: params.computeUnits,
|
|
227
212
|
PublicKey: finalConfig.PublicKey,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeContract.js","sourceRoot":"","sources":["../../../src/instructions/closeContract.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;
|
|
1
|
+
{"version":3,"file":"closeContract.js","sourceRoot":"","sources":["../../../src/instructions/closeContract.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAiHH,sCAkLC;AAjSD,qCAAmF;AACnF,mEAG0C;AAC1C,4CAA4E;AAC5E,4CAAuD;AACvD,4CAA4E;AAC5E,+CAA0D;AAC1D,gEAA2F;AAC3F,wCAA4D;AAC5D,wCAA0F;AAC1F,0CAAqD;AACrD,wDAA4D;AAC5D,+CAA4C;AAqD5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACI,KAAK,UAAU,aAAa,CACjC,MAA2B,EAC3B,MAA2B;IAE3B,eAAe;IACf,MAAM,WAAW,GAAG,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;IAExC,2BAA2B;IAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,sCAAsC;IACtC,MAAM,WAAW,GAAG,IAAA,4BAAmB,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEtD,MAAM,SAAS,GAAG,IAAA,qBAAY,EAAC,MAAM,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,IAAA,aAAO,EAAC,SAAS,CAAC,KAAgB,CAAC,CAAC;IAE3D,uCAAuC;IACvC,IAAI,YAAqB,CAAC;IAC1B,IAAI,eAAwB,CAAC;IAE7B,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,4BAA4B;QAC5B,YAAY,GAAG,IAAA,aAAO,EAAC,MAAM,CAAC,KAAgB,CAAC,CAAC;QAChD,eAAe,GAAG,IAAA,aAAO,EAAC,MAAM,CAAC,QAAmB,CAAC,CAAC;IACxD,CAAC;SAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACxB,uDAAuD;QACvD,YAAY,GAAG,IAAA,aAAO,EAAC,MAAM,CAAC,KAAgB,CAAC,CAAC;QAChD,eAAe,GAAG,MAAM,IAAA,sBAAc,EAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IACvE,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3B,uDAAuD;QACvD,eAAe,GAAG,IAAA,aAAO,EAAC,MAAM,CAAC,QAAmB,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,kDAAkD;QAClD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,kEAAkE;IAClE,MAAM,IAAI,GAAG,MAAM,IAAA,0CAAuB,EAAC;QACzC,eAAe;QACf,MAAM,EAAE,WAAW,CAAC,MAAM;QAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;IAC7C,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5C,CAAC;IAED,8CAA8C;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW;QACpC,CAAC,CAAC,IAAA,aAAO,EAAC,MAAM,CAAC,WAAsB,CAAC;QACxC,CAAC,CAAC,IAAA,aAAO,EAAC,SAAS,CAAC,IAAe,CAAC,CAAC;IAEvC,gEAAgE;IAChE,MAAM,oBAAoB,GAAG,MAAM,IAAA,oCAA4B,EAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IAE5F,uBAAuB;IACvB,MAAM,iBAAiB,GAAG,kCAA6C,CAAC;IACxE,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,KAAK,iBAAiB,CAAC;IACpE,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC;IAC9E,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC;IAE9E,oCAAoC;IACpC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,aAAa,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAClD,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,IAAI,mBAAwC,CAAC;IAC7C,IAAI,0BAA+C,CAAC;IACpD,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,cAAuB,CAAC;QAC5B,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,cAAc,GAAG,IAAA,aAAO,EAAC,MAAM,CAAC,cAAyB,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7B,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAC;QACJ,CAAC;QACD,mBAAmB,GAAG,MAAM,IAAA,2BAAmB,EAAC,cAAc,CAAC,CAAC;QAChE,0BAA0B,GAAG,MAAM,IAAA,oCAA4B,EAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC7F,CAAC;IAED,kDAAkD;IAClD,MAAM,kBAAkB,GAAG,KAAK,IAA0B,EAAE;QAC1D,MAAM,eAAe,GAAG,MAAM,IAAA,6BAAqB,GAAE,CAAC;QACtD,MAAM,cAAc,GAAG,MAAM,IAAA,6BAAoB,EAAC,eAAe,EAAE,eAAe,CAAC,CAAC;QACpF,MAAM,aAAa,GAAG,MAAM,IAAA,6BAAoB,EAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAa,CAAC;QAErE,wEAAwE;QACxE,uDAAuD;QACvD,0BAA0B;QAC1B,MAAM,aAAa,GAAG,MAAM,IAAA,6BAAoB,EAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC3E,MAAM,EAAE,GAAG,MAAM,IAAA,qDAAsC,EACrD,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,EACzE,EAAE,cAAc,EAAE,CACnB,CAAC;QACF,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,mFAAmF;IACnF,MAAM,oBAAoB,GAAG,KAAK,EAAE,aAAsB,EAAwB,EAAE;QAClF,0EAA0E;QAC1E,sEAAsE;QACtE,mEAAmE;QACnE,0EAA0E;QAC1E,0EAA0E;QAC1E,IAAI,cAAmC,CAAC;QACxC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,eAAe,GAAG,MAAM,IAAA,6BAAqB,GAAE,CAAC;YACtD,cAAc,GAAG,MAAM,IAAA,6BAAoB,EAAC,eAAe,EAAE,eAAe,CAAC,CAAC;QAChF,CAAC;QAED,OAAO,IAAA,+CAAgC,EACrC;YACE,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,eAAe;YACzB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,YAAa;YACpB,oBAAoB,EAAE,oBAAqB;YAC3C,WAAW;YACX,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,aAAa,IAAI,mBAAmB,IAAI,0BAA0B;gBACpE,CAAC,CAAC,EAAE,mBAAmB,EAAE,0BAA0B,EAAE;gBACrD,CAAC,CAAC,EAAE,CAAC;SACR,EACD,EAAE,cAAc,EAAE,CACnB,CAAC;IACJ,CAAC,CAAC;IAEF,8EAA8E;IAC9E,6EAA6E;IAC7E,0EAA0E;IAC1E,6CAA6C;IAC7C,MAAM,SAAS,GAAG,aAAa,IAAI,CAAC,aAAa,CAAC;IAElD,MAAM,GAAG,GAAkB,EAAE,CAAC;IAE9B,IAAI,aAAa,EAAE,CAAC;QAClB,wEAAwE;QACxE,0EAA0E;QAC1E,6DAA6D;QAC7D,EAAE;QACF,qEAAqE;QACrE,kEAAkE;QAClE,MAAM,iBAAiB,GAAG,MAAM,IAAA,yBAAW,EACzC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,EACzE,MAAM,CACP,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC;IAED,4EAA4E;IAC5E,2EAA2E;IAC3E,6DAA6D;IAC7D,IAAI,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,MAAM,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpD,OAAO,IAAA,kCAAmB,EAAC,GAAG,EAAE;QAC9B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -72,6 +72,42 @@ function mockExpiredActiveWithQueued(thread) {
|
|
|
72
72
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
73
73
|
});
|
|
74
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* A contract in an arbitrary slot state, with a thread. `activeEndTime` is
|
|
77
|
+
* only read when `active` is set: `1n` is long expired, a far-future value is
|
|
78
|
+
* still live.
|
|
79
|
+
*/
|
|
80
|
+
function mockContractState(opts) {
|
|
81
|
+
const thread = opts.thread ?? THREAD_ADDR;
|
|
82
|
+
vitest_1.vi.mocked(contractSnapshot_1.resolveContractSnapshot).mockResolvedValue({
|
|
83
|
+
config: { data: makeConfig(), address: 'CFG' },
|
|
84
|
+
contract: {
|
|
85
|
+
data: makeContract({
|
|
86
|
+
activeRental: opts.active ? ACTIVE_ADDR : SYSTEM,
|
|
87
|
+
queuedRental: opts.queued ? QUEUED_ADDR : SYSTEM,
|
|
88
|
+
thread,
|
|
89
|
+
}),
|
|
90
|
+
address: CONTRACT_ADDR,
|
|
91
|
+
},
|
|
92
|
+
activeRental: opts.active
|
|
93
|
+
? { data: makeRental({ endTime: opts.activeEndTime ?? 1n }), address: ACTIVE_ADDR }
|
|
94
|
+
: null,
|
|
95
|
+
queuedRental: opts.queued ? { data: makeRental(), address: QUEUED_ADDR } : null,
|
|
96
|
+
nowSeconds: 1_700_000_000,
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
98
|
+
});
|
|
99
|
+
vitest_1.vi.mocked(closeRental_1.closeRental).mockResolvedValue({
|
|
100
|
+
instructions: [{ programAddress: CONTRACT_ADDR, accounts: [], data: new Uint8Array() }],
|
|
101
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
102
|
+
});
|
|
103
|
+
vitest_1.vi.mocked(thread_1.fetchThreadByAddress).mockResolvedValue({
|
|
104
|
+
data: { fiberIds: [0, 1] },
|
|
105
|
+
address: thread,
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/** Far enough out that the rental is unambiguously still running. */
|
|
110
|
+
const STILL_LIVE = 9999999999n;
|
|
75
111
|
(0, vitest_1.beforeEach)(() => {
|
|
76
112
|
vitest_1.vi.clearAllMocks();
|
|
77
113
|
});
|
|
@@ -114,4 +150,56 @@ function mockExpiredActiveWithQueued(thread) {
|
|
|
114
150
|
(0, vitest_1.expect)(thread_1.fetchThreadByAddress).not.toHaveBeenCalled();
|
|
115
151
|
});
|
|
116
152
|
});
|
|
153
|
+
(0, vitest_1.describe)('closeContract — the thread survives a deferred close', () => {
|
|
154
|
+
// A live rental latches `to_close` and leaves the contract standing.
|
|
155
|
+
// `contract_process` is the only automated path from that flag to a closed
|
|
156
|
+
// contract, so closing the thread here strands it.
|
|
157
|
+
(0, vitest_1.it)('keeps the thread when a live active rental defers the close', async () => {
|
|
158
|
+
mockContractState({ active: true, queued: false, activeEndTime: STILL_LIVE });
|
|
159
|
+
await (0, closeContract_1.closeContract)({ owner: OWNER_SIGNER, contract: CONTRACT_ADDR });
|
|
160
|
+
(0, vitest_1.expect)(thread_1.fetchThreadByAddress).not.toHaveBeenCalled();
|
|
161
|
+
});
|
|
162
|
+
(0, vitest_1.it)('keeps the thread when a live active rental defers alongside a queued one', async () => {
|
|
163
|
+
mockContractState({ active: true, queued: true, activeEndTime: STILL_LIVE });
|
|
164
|
+
await (0, closeContract_1.closeContract)({ owner: OWNER_SIGNER, contract: CONTRACT_ADDR });
|
|
165
|
+
(0, vitest_1.expect)(thread_1.fetchThreadByAddress).not.toHaveBeenCalled();
|
|
166
|
+
});
|
|
167
|
+
(0, vitest_1.it)('does not settle a rental that is still running', async () => {
|
|
168
|
+
// Only an expired rental gets a `closeRental`. Settling a live one would
|
|
169
|
+
// close it out from under its borrower.
|
|
170
|
+
mockContractState({ active: true, queued: false, activeEndTime: STILL_LIVE });
|
|
171
|
+
await (0, closeContract_1.closeContract)({ owner: OWNER_SIGNER, contract: CONTRACT_ADDR });
|
|
172
|
+
(0, vitest_1.expect)(closeRental_1.closeRental).not.toHaveBeenCalled();
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
(0, vitest_1.describe)('closeContract — the thread goes when the close finishes now', () => {
|
|
176
|
+
// The mirror: the immediate branch requires the thread gone or it fails with
|
|
177
|
+
// ThreadStillExists.
|
|
178
|
+
(0, vitest_1.it)('closes the thread when the slot is empty', async () => {
|
|
179
|
+
mockContractState({ active: false, queued: false });
|
|
180
|
+
await (0, closeContract_1.closeContract)({ owner: OWNER_SIGNER, contract: CONTRACT_ADDR });
|
|
181
|
+
(0, vitest_1.expect)(thread_1.fetchThreadByAddress).toHaveBeenCalledTimes(1);
|
|
182
|
+
(0, vitest_1.expect)(closeRental_1.closeRental).not.toHaveBeenCalled();
|
|
183
|
+
});
|
|
184
|
+
(0, vitest_1.it)('closes the thread when the slot is empty but a reservation is queued', async () => {
|
|
185
|
+
// Previously missed: a queued reservation with no active rental still
|
|
186
|
+
// closes immediately, so it needs the thread gone just as much.
|
|
187
|
+
mockContractState({ active: false, queued: true });
|
|
188
|
+
await (0, closeContract_1.closeContract)({ owner: OWNER_SIGNER, contract: CONTRACT_ADDR });
|
|
189
|
+
(0, vitest_1.expect)(thread_1.fetchThreadByAddress).toHaveBeenCalledTimes(1);
|
|
190
|
+
});
|
|
191
|
+
(0, vitest_1.it)('closes the thread when the active rental has expired', async () => {
|
|
192
|
+
mockContractState({ active: true, queued: false, activeEndTime: 1n });
|
|
193
|
+
await (0, closeContract_1.closeContract)({ owner: OWNER_SIGNER, contract: CONTRACT_ADDR });
|
|
194
|
+
(0, vitest_1.expect)(thread_1.fetchThreadByAddress).toHaveBeenCalledTimes(1);
|
|
195
|
+
});
|
|
196
|
+
(0, vitest_1.it)('settles an expired rental before closing, exactly once', async () => {
|
|
197
|
+
// The settlement carries the fee flush, CTF points, SAGE invalidate and
|
|
198
|
+
// discount refund. `contract_close` has no equivalent — its immediate
|
|
199
|
+
// branch would sweep the escrow to the owner instead.
|
|
200
|
+
mockContractState({ active: true, queued: false, activeEndTime: 1n });
|
|
201
|
+
await (0, closeContract_1.closeContract)({ owner: OWNER_SIGNER, contract: CONTRACT_ADDR });
|
|
202
|
+
(0, vitest_1.expect)(closeRental_1.closeRental).toHaveBeenCalledTimes(1);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
117
205
|
//# sourceMappingURL=closeContract.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeContract.test.js","sourceRoot":"","sources":["../../../src/instructions/closeContract.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"closeContract.test.js","sourceRoot":"","sources":["../../../src/instructions/closeContract.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -142,7 +142,18 @@ async function closeRental(params, config) {
|
|
|
142
142
|
closeRentalFiber: closeRentalFiberAddress,
|
|
143
143
|
sageProgram,
|
|
144
144
|
}, { programAddress });
|
|
145
|
-
|
|
145
|
+
// The program address in an account slot is Anchor's `None` sentinel, but
|
|
146
|
+
// codama stamps it with the role the real account would carry — so
|
|
147
|
+
// `queuedRental` comes back WRITABLE, asking for a write lock on the program
|
|
148
|
+
// being invoked. The runtime demotes it silently; @solana/kit refuses to
|
|
149
|
+
// compile the message at all. Nothing is written through a sentinel.
|
|
150
|
+
const instruction = {
|
|
151
|
+
...kitInstruction,
|
|
152
|
+
accounts: kitInstruction.accounts.map(account => account.address === programAddress && (0, kit_1.isWritableRole)(account.role)
|
|
153
|
+
? { ...account, role: (0, kit_1.downgradeRoleToReadonly)(account.role) }
|
|
154
|
+
: account),
|
|
155
|
+
};
|
|
156
|
+
return (0, instructions_2.prepareInstructions)(instruction, {
|
|
146
157
|
computeUnits: params.computeUnits,
|
|
147
158
|
PublicKey: finalConfig.PublicKey,
|
|
148
159
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeRental.js","sourceRoot":"","sources":["../../../src/instructions/closeRental.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAiFH,
|
|
1
|
+
{"version":3,"file":"closeRental.js","sourceRoot":"","sources":["../../../src/instructions/closeRental.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* The legacy subpath only converts: one instruction in, one out, in order. A
|
|
5
|
+
* duplicate here would be invisible at the call site and land two identical
|
|
6
|
+
* `rental_close` instructions in one transaction.
|
|
7
|
+
*/
|
|
8
|
+
const vitest_1 = require("vitest");
|
|
9
|
+
vitest_1.vi.mock('../utils/contractSnapshot', () => ({
|
|
10
|
+
resolveContractSnapshot: vitest_1.vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
vitest_1.vi.mock('../instructions/closeRental', () => ({
|
|
13
|
+
closeRental: vitest_1.vi.fn(),
|
|
14
|
+
}));
|
|
15
|
+
const contractSnapshot_1 = require("../utils/contractSnapshot");
|
|
16
|
+
const closeRental_1 = require("../instructions/closeRental");
|
|
17
|
+
const index_1 = require("./index");
|
|
18
|
+
const closeContract_1 = require("../generated/codama/instructions/closeContract");
|
|
19
|
+
const SYSTEM = '11111111111111111111111111111111';
|
|
20
|
+
const CONTRACT_ADDR = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
|
|
21
|
+
const ACTIVE_ADDR = 'So11111111111111111111111111111111111111112';
|
|
22
|
+
const OWNER_ADDR = 'BPFLoader2111111111111111111111111111111111';
|
|
23
|
+
const MINT_ADDR = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL';
|
|
24
|
+
/** Minimal stand-in for web3.js PublicKey — `toLegacy` only stringifies. */
|
|
25
|
+
class StubPublicKey {
|
|
26
|
+
value;
|
|
27
|
+
constructor(value) {
|
|
28
|
+
this.value = String(value);
|
|
29
|
+
}
|
|
30
|
+
toString() {
|
|
31
|
+
return this.value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const OWNER_SIGNER = {
|
|
35
|
+
address: OWNER_ADDR,
|
|
36
|
+
signTransactionMessage: vitest_1.vi.fn(),
|
|
37
|
+
};
|
|
38
|
+
/** Marker for the instruction `closeContract` folds in from `closeRental`. */
|
|
39
|
+
const RENTAL_MARKER = new Uint8Array([0xaa, 0xbb, 0xcc, 0xdd]);
|
|
40
|
+
/** Expired active rental, no queued reservation, thread already gone. */
|
|
41
|
+
function mockExpiredActiveNoThread() {
|
|
42
|
+
vitest_1.vi.mocked(contractSnapshot_1.resolveContractSnapshot).mockResolvedValue({
|
|
43
|
+
config: {
|
|
44
|
+
data: { atlasMint: MINT_ADDR, slyvault: MINT_ADDR },
|
|
45
|
+
address: 'CFG',
|
|
46
|
+
},
|
|
47
|
+
contract: {
|
|
48
|
+
data: {
|
|
49
|
+
owner: OWNER_ADDR,
|
|
50
|
+
fleet: MINT_ADDR,
|
|
51
|
+
gameId: MINT_ADDR,
|
|
52
|
+
activeRental: ACTIVE_ADDR,
|
|
53
|
+
queuedRental: SYSTEM,
|
|
54
|
+
thread: SYSTEM,
|
|
55
|
+
managedTokenAccount: MINT_ADDR,
|
|
56
|
+
},
|
|
57
|
+
address: CONTRACT_ADDR,
|
|
58
|
+
},
|
|
59
|
+
activeRental: {
|
|
60
|
+
data: {
|
|
61
|
+
borrower: OWNER_ADDR,
|
|
62
|
+
borrowerProfile: MINT_ADDR,
|
|
63
|
+
endTime: 1n,
|
|
64
|
+
},
|
|
65
|
+
address: ACTIVE_ADDR,
|
|
66
|
+
},
|
|
67
|
+
queuedRental: null,
|
|
68
|
+
nowSeconds: 1_700_000_000,
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
});
|
|
71
|
+
vitest_1.vi.mocked(closeRental_1.closeRental).mockResolvedValue({
|
|
72
|
+
instructions: [{ programAddress: CONTRACT_ADDR, accounts: [], data: RENTAL_MARKER }],
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
(0, vitest_1.beforeEach)(() => {
|
|
77
|
+
vitest_1.vi.clearAllMocks();
|
|
78
|
+
(0, index_1.setSdkConfig)({ PublicKey: StubPublicKey });
|
|
79
|
+
});
|
|
80
|
+
(0, vitest_1.describe)('legacy closeContract — conversion does not duplicate', () => {
|
|
81
|
+
(0, vitest_1.it)('builds the underlying rental close exactly once', async () => {
|
|
82
|
+
mockExpiredActiveNoThread();
|
|
83
|
+
await (0, index_1.closeContract)({ owner: OWNER_SIGNER, contract: CONTRACT_ADDR });
|
|
84
|
+
(0, vitest_1.expect)(closeRental_1.closeRental).toHaveBeenCalledTimes(1);
|
|
85
|
+
});
|
|
86
|
+
(0, vitest_1.it)('returns one legacy instruction per kit instruction, in order', async () => {
|
|
87
|
+
mockExpiredActiveNoThread();
|
|
88
|
+
const ixs = await (0, index_1.closeContract)({ owner: OWNER_SIGNER, contract: CONTRACT_ADDR });
|
|
89
|
+
const startsWith = (data, prefix) => prefix.every((b, i) => data[i] === b);
|
|
90
|
+
(0, vitest_1.expect)(ixs).toHaveLength(2);
|
|
91
|
+
(0, vitest_1.expect)(startsWith(ixs[0].data, RENTAL_MARKER)).toBe(true);
|
|
92
|
+
(0, vitest_1.expect)(startsWith(ixs[1].data, closeContract_1.CLOSE_CONTRACT_DISCRIMINATOR)).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
(0, vitest_1.it)('converts to web3.js shape without cloning entries', async () => {
|
|
95
|
+
mockExpiredActiveNoThread();
|
|
96
|
+
const ixs = await (0, index_1.closeContract)({ owner: OWNER_SIGNER, contract: CONTRACT_ADDR });
|
|
97
|
+
// Every entry carries a PublicKey-shaped programId and a keys array —
|
|
98
|
+
// the legacy contract — and there are no repeats of the same data buffer.
|
|
99
|
+
const seen = ixs.map(ix => String(ix.programId) + ':' + Array.from(ix.data).join());
|
|
100
|
+
(0, vitest_1.expect)(new Set(seen).size).toBe(ixs.length);
|
|
101
|
+
for (const ix of ixs) {
|
|
102
|
+
(0, vitest_1.expect)(ix.programId).toBeInstanceOf(StubPublicKey);
|
|
103
|
+
(0, vitest_1.expect)(Array.isArray(ix.keys)).toBe(true);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=closeContract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"closeContract.test.js","sourceRoot":"","sources":["../../../src/legacy/closeContract.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/package.json
CHANGED
package/dist/cjs/utils/rpc.js
CHANGED
|
@@ -6,9 +6,11 @@
|
|
|
6
6
|
* to add environment-specific configurations or debugging in the future.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MAX_MULTIPLE_ACCOUNTS = void 0;
|
|
9
10
|
exports.setRpcDebug = setRpcDebug;
|
|
10
11
|
exports.isRpcDebugEnabled = isRpcDebugEnabled;
|
|
11
12
|
exports.createRpc = createRpc;
|
|
13
|
+
exports.sendWithRetry = sendWithRetry;
|
|
12
14
|
const kit_1 = require("@solana/kit");
|
|
13
15
|
// Debug flag - can be set via setSdkConfig or environment
|
|
14
16
|
let debugMode = false;
|
|
@@ -54,4 +56,45 @@ function createRpc(rpcUrl) {
|
|
|
54
56
|
}
|
|
55
57
|
return (0, kit_1.createSolanaRpc)(rpcUrl);
|
|
56
58
|
}
|
|
59
|
+
/** Largest account list `getMultipleAccounts` accepts in one request. */
|
|
60
|
+
exports.MAX_MULTIPLE_ACCOUNTS = 100;
|
|
61
|
+
/** Providers signal "slow down" as 429, and the wording varies by host. */
|
|
62
|
+
function isRateLimited(error) {
|
|
63
|
+
const e = error;
|
|
64
|
+
if (e?.statusCode === 429 || e?.status === 429)
|
|
65
|
+
return true;
|
|
66
|
+
const message = String(e?.message ?? error);
|
|
67
|
+
return message.includes('429') || /too many requests/i.test(message);
|
|
68
|
+
}
|
|
69
|
+
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
70
|
+
/**
|
|
71
|
+
* Run an RPC call, backing off and retrying when the provider rate-limits it.
|
|
72
|
+
*
|
|
73
|
+
* A 429 is not a result — it means the question was never asked, so a caller
|
|
74
|
+
* that treats it as one reports on state it never read. Backoff is exponential
|
|
75
|
+
* with jitter so workers that trip the limit together do not retry together.
|
|
76
|
+
*
|
|
77
|
+
* @param send - Performs the call. Invoked again on each retry.
|
|
78
|
+
* @param options.retries - Extra attempts after the first. Defaults to 5.
|
|
79
|
+
* @param options.baseDelayMs - Delay before the first retry. Defaults to 250.
|
|
80
|
+
* @throws The last error, once retries are exhausted or it is not a 429.
|
|
81
|
+
*/
|
|
82
|
+
async function sendWithRetry(send, options = {}) {
|
|
83
|
+
const retries = options.retries ?? 5;
|
|
84
|
+
const baseDelayMs = options.baseDelayMs ?? 250;
|
|
85
|
+
let lastError;
|
|
86
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
87
|
+
try {
|
|
88
|
+
return await send();
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
lastError = error;
|
|
92
|
+
if (!isRateLimited(error) || attempt === retries)
|
|
93
|
+
throw error;
|
|
94
|
+
const backoff = baseDelayMs * 2 ** attempt;
|
|
95
|
+
await delay(backoff + Math.floor(Math.random() * backoff));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
throw lastError;
|
|
99
|
+
}
|
|
57
100
|
//# sourceMappingURL=rpc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/utils/rpc.ts"],"names":[],"mappings":";AAAA;;;;;GAKG
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/utils/rpc.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAWH,kCAEC;AAKD,8CAEC;AAqBD,8BASC;AA2BD,sCAmBC;AA9FD,qCAA2E;AAE3E,0DAA0D;AAC1D,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB;;;GAGG;AACH,SAAgB,WAAW,CAAC,OAAgB;IAC1C,SAAS,GAAG,OAAO,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,SAAS,CAAC,MAAc;IACtC,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE;YACpD,GAAG,EAAE,MAAM;YACX,WAAW,EAAE,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YAC/D,SAAS,EAAE,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;SAC1E,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAA,qBAAe,EAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,yEAAyE;AAC5D,QAAA,qBAAqB,GAAG,GAAG,CAAC;AAEzC,2EAA2E;AAC3E,SAAS,aAAa,CAAC,KAAc;IACnC,MAAM,CAAC,GAAG,KAAoE,CAAC;IAC/E,IAAI,CAAC,EAAE,UAAU,KAAK,GAAG,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAE9E;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,aAAa,CACjC,IAAsB,EACtB,UAAsD,EAAE;IAExD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;IAE/C,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,OAAO;gBAAE,MAAM,KAAK,CAAC;YAC9D,MAAM,OAAO,GAAG,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC;YAC3C,MAAM,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/** A 429 means the question never reached the provider, not that it answered. */
|
|
4
|
+
const vitest_1 = require("vitest");
|
|
5
|
+
const rpc_1 = require("./rpc");
|
|
6
|
+
(0, vitest_1.beforeEach)(() => {
|
|
7
|
+
vitest_1.vi.useFakeTimers();
|
|
8
|
+
});
|
|
9
|
+
(0, vitest_1.afterEach)(() => {
|
|
10
|
+
vitest_1.vi.useRealTimers();
|
|
11
|
+
});
|
|
12
|
+
/** Drives the fake clock until `promise` settles, so backoff sleeps resolve. */
|
|
13
|
+
async function runToCompletion(promise) {
|
|
14
|
+
const settled = promise.then(value => ({ ok: true, value }), error => ({ ok: false, error }));
|
|
15
|
+
await vitest_1.vi.runAllTimersAsync();
|
|
16
|
+
const outcome = await settled;
|
|
17
|
+
if (!outcome.ok)
|
|
18
|
+
throw outcome.error;
|
|
19
|
+
return outcome.value;
|
|
20
|
+
}
|
|
21
|
+
(0, vitest_1.describe)('sendWithRetry', () => {
|
|
22
|
+
(0, vitest_1.it)('returns the first result when nothing is rate limited', async () => {
|
|
23
|
+
const send = vitest_1.vi.fn().mockResolvedValue('ok');
|
|
24
|
+
await (0, vitest_1.expect)(runToCompletion((0, rpc_1.sendWithRetry)(send))).resolves.toBe('ok');
|
|
25
|
+
(0, vitest_1.expect)(send).toHaveBeenCalledTimes(1);
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.it)('retries a 429 and returns the eventual success', async () => {
|
|
28
|
+
const send = vitest_1.vi
|
|
29
|
+
.fn()
|
|
30
|
+
.mockRejectedValueOnce(new Error('HTTP error (429): Too Many Requests'))
|
|
31
|
+
.mockRejectedValueOnce(new Error('HTTP error (429): Too Many Requests'))
|
|
32
|
+
.mockResolvedValue('ok');
|
|
33
|
+
await (0, vitest_1.expect)(runToCompletion((0, rpc_1.sendWithRetry)(send))).resolves.toBe('ok');
|
|
34
|
+
(0, vitest_1.expect)(send).toHaveBeenCalledTimes(3);
|
|
35
|
+
});
|
|
36
|
+
(0, vitest_1.it)('recognises a rate limit from a status code alone', async () => {
|
|
37
|
+
const err = Object.assign(new Error('rejected'), { statusCode: 429 });
|
|
38
|
+
const send = vitest_1.vi.fn().mockRejectedValueOnce(err).mockResolvedValue('ok');
|
|
39
|
+
await (0, vitest_1.expect)(runToCompletion((0, rpc_1.sendWithRetry)(send))).resolves.toBe('ok');
|
|
40
|
+
(0, vitest_1.expect)(send).toHaveBeenCalledTimes(2);
|
|
41
|
+
});
|
|
42
|
+
(0, vitest_1.it)('does not retry an error that is not a rate limit', async () => {
|
|
43
|
+
// Retrying a decode failure or a bad request just multiplies the damage.
|
|
44
|
+
const send = vitest_1.vi.fn().mockRejectedValue(new Error('Invalid param: bad address'));
|
|
45
|
+
await (0, vitest_1.expect)(runToCompletion((0, rpc_1.sendWithRetry)(send))).rejects.toThrow('Invalid param');
|
|
46
|
+
(0, vitest_1.expect)(send).toHaveBeenCalledTimes(1);
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)('gives up after the retry budget and surfaces the rate limit', async () => {
|
|
49
|
+
// The caller has to be able to tell "still limited" from "answered", so the
|
|
50
|
+
// final failure propagates rather than resolving to something empty.
|
|
51
|
+
const send = vitest_1.vi.fn().mockRejectedValue(new Error('HTTP error (429): Too Many Requests'));
|
|
52
|
+
await (0, vitest_1.expect)(runToCompletion((0, rpc_1.sendWithRetry)(send, { retries: 2 }))).rejects.toThrow('429');
|
|
53
|
+
(0, vitest_1.expect)(send).toHaveBeenCalledTimes(3);
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)('batches at the getMultipleAccounts ceiling', () => {
|
|
56
|
+
// Asking for more than this in one call is rejected outright by the RPC.
|
|
57
|
+
(0, vitest_1.expect)(rpc_1.MAX_MULTIPLE_ACCOUNTS).toBe(100);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=rpc.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.test.js","sourceRoot":"","sources":["../../../src/utils/rpc.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/version.js
CHANGED
|
@@ -3,5 +3,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.VERSION = void 0;
|
|
4
4
|
// Auto-generated from package.json - DO NOT EDIT
|
|
5
5
|
// Run "pnpm run generate:version" to update
|
|
6
|
-
exports.VERSION = '6.
|
|
6
|
+
exports.VERSION = '6.1.0';
|
|
7
7
|
//# sourceMappingURL=version.js.map
|