@sly-rentals/core 5.5.2 → 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 +27 -41
- 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/closeContractThread.js +4 -4
- package/dist/cjs/instructions/closeContractThread.js.map +1 -1
- package/dist/cjs/instructions/closeRental.js +12 -1
- package/dist/cjs/instructions/closeRental.js.map +1 -1
- package/dist/cjs/instructions/deleteContractThread.js +4 -4
- package/dist/cjs/instructions/deleteContractThread.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/fibers.js +12 -16
- package/dist/cjs/utils/fibers.js.map +1 -1
- package/dist/cjs/utils/fibers.test.js +21 -28
- package/dist/cjs/utils/fibers.test.js.map +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 +29 -43
- 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/closeContractThread.js +6 -6
- package/dist/esm/instructions/closeContractThread.js.map +1 -1
- package/dist/esm/instructions/closeRental.js +13 -2
- package/dist/esm/instructions/closeRental.js.map +1 -1
- package/dist/esm/instructions/deleteContractThread.js +6 -6
- package/dist/esm/instructions/deleteContractThread.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/fibers.js +11 -15
- package/dist/esm/utils/fibers.js.map +1 -1
- package/dist/esm/utils/fibers.test.js +22 -29
- package/dist/esm/utils/fibers.test.js.map +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/closeContractThread.d.ts.map +1 -1
- package/dist/types/instructions/closeRental.d.ts.map +1 -1
- package/dist/types/instructions/deleteContractThread.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/fibers.d.ts +10 -9
- package/dist/types/utils/fibers.d.ts.map +1 -1
- 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
|
*
|
|
@@ -148,9 +151,10 @@ async function closeContract(params, config) {
|
|
|
148
151
|
const contractThread = await (0, thread_2.deriveContractThread)(contractAddress, rentalAuthority);
|
|
149
152
|
const threadAccount = await (0, thread_1.fetchThreadByAddress)(contractThread, finalConfig.rpcUrl);
|
|
150
153
|
const fiberIds = Array.from(threadAccount.data.fiberIds);
|
|
151
|
-
//
|
|
152
|
-
//
|
|
153
|
-
|
|
154
|
+
// One account per tracked id, existing or not. Which of them still have
|
|
155
|
+
// anything to close is the thread program's call — see
|
|
156
|
+
// `trackedFiberAccounts`.
|
|
157
|
+
const fiberAccounts = await (0, fibers_1.trackedFiberAccounts)(contractThread, fiberIds);
|
|
154
158
|
const ix = await (0, instructions_1.getCloseContractThreadInstructionAsync)({ owner: ownerSigner, contract: contractAddress, thread: contractThread }, { programAddress });
|
|
155
159
|
ix.accounts.push(...fiberAccounts);
|
|
156
160
|
return ix;
|
|
@@ -180,47 +184,29 @@ async function closeContract(params, config) {
|
|
|
180
184
|
: {}),
|
|
181
185
|
}, { programAddress });
|
|
182
186
|
};
|
|
183
|
-
//
|
|
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;
|
|
184
192
|
const ixs = [];
|
|
185
|
-
if (activeExpired
|
|
186
|
-
//
|
|
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).
|
|
187
197
|
//
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
// would just re-latch `to_close`. Suppress the activation so the rental
|
|
191
|
-
// ends and the slot stays empty (Path A), drop the thread so the
|
|
192
|
-
// immediate-close branch isn't blocked by `ThreadStillExists`, then let a
|
|
193
|
-
// single `closeContract` force-refund the challenger and close for real.
|
|
194
|
-
// 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`.
|
|
195
200
|
const closeRentalResult = await (0, closeRental_1.closeRental)({ payer: params.owner, contract: contractAddress, activateQueued: false }, config);
|
|
196
201
|
ixs.push(...closeRentalResult.instructions);
|
|
197
|
-
// 2. closeContractThread (if thread exists)
|
|
198
|
-
if (hasThread) {
|
|
199
|
-
ixs.push(await buildThreadCloseIx());
|
|
200
|
-
}
|
|
201
|
-
// 3. closeContract — force-refunds the queued challenger, then closes.
|
|
202
|
-
ixs.push(await buildCloseContractIx(true));
|
|
203
|
-
}
|
|
204
|
-
else if (activeExpired && !hasQueuedSlot) {
|
|
205
|
-
// Expired active only, no queued — settle then close
|
|
206
|
-
const closeRentalResult = await (0, closeRental_1.closeRental)({ payer: params.owner, contract: contractAddress }, config);
|
|
207
|
-
ixs.push(...closeRentalResult.instructions);
|
|
208
|
-
if (hasThread) {
|
|
209
|
-
ixs.push(await buildThreadCloseIx());
|
|
210
|
-
}
|
|
211
|
-
ixs.push(await buildCloseContractIx(false));
|
|
212
|
-
}
|
|
213
|
-
else if (!activeExpired && hasQueuedSlot) {
|
|
214
|
-
// Non-expired active + queued — deferred close with queued borrower accounts
|
|
215
|
-
ixs.push(await buildCloseContractIx(true));
|
|
216
202
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
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());
|
|
223
208
|
}
|
|
209
|
+
ixs.push(await buildCloseContractIx(hasQueuedSlot));
|
|
224
210
|
return (0, instructions_2.prepareInstructions)(ixs, {
|
|
225
211
|
computeUnits: params.computeUnits,
|
|
226
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":"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"}
|
|
@@ -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":";;AAAA,mCAA8D;AAM9D,WAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,uBAAuB,EAAE,WAAE,CAAC,EAAE,EAAE;CACjC,CAAC,CAAC,CAAC;AACJ,WAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,WAAW,EAAE,WAAE,CAAC,EAAE,EAAE;CACrB,CAAC,CAAC,CAAC;AACJ,WAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,oBAAoB,EAAE,WAAE,CAAC,EAAE,EAAE;CAC9B,CAAC,CAAC,CAAC;AAEJ,gEAAoE;AACpE,+CAA4C;AAC5C,+CAA0D;AAC1D,mDAAgD;AAChD,kFAA8F;AAC9F,8FAA2G;AAE3G,MAAM,MAAM,GAAG,kCAA6C,CAAC;AAC7D,MAAM,aAAa,GAAG,8CAAyD,CAAC;AAChF,MAAM,WAAW,GAAG,6CAAwD,CAAC;AAC7E,MAAM,WAAW,GAAG,6CAAwD,CAAC;AAC7E,MAAM,UAAU,GAAG,6CAAwD,CAAC;AAC5E,MAAM,SAAS,GAAG,8CAAyD,CAAC;AAC5E,MAAM,WAAW,GAAG,6CAAwD,CAAC;AAE7E,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,UAAU;IACnB,sBAAsB,EAAE,WAAE,CAAC,EAAE,EAAE;CAC2B,CAAC;AAE7D,MAAM,UAAU,GAAG,GAAgB,EAAE,CACnC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAA2B,CAAC;AAE5E,MAAM,YAAY,GAAG,CAAC,YAAoC,EAAE,EAAiB,EAAE,CAC7E,CAAC;IACC,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,MAAM;IACpB,YAAY,EAAE,MAAM;IACpB,MAAM,EAAE,MAAM;IACd,mBAAmB,EAAE,SAAS;IAC9B,GAAG,SAAS;CACb,CAA6B,CAAC;AAEjC,MAAM,UAAU,GAAG,CAAC,YAAkC,EAAE,EAAe,EAAE,CACvE,CAAC;IACC,QAAQ,EAAE,UAAU;IACpB,eAAe,EAAE,SAAS;IAC1B,OAAO,EAAE,EAAE;IACX,GAAG,SAAS;CACb,CAA2B,CAAC;AAE/B,8EAA8E;AAC9E,SAAS,2BAA2B,CAAC,MAAe;IAClD,WAAE,CAAC,MAAM,CAAC,0CAAuB,CAAC,CAAC,iBAAiB,CAAC;QACnD,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,KAAgB,EAAE;QACzD,QAAQ,EAAE;YACR,IAAI,EAAE,YAAY,CAAC;gBACjB,YAAY,EAAE,WAAW;gBACzB,YAAY,EAAE,WAAW;gBACzB,MAAM;aACP,CAAC;YACF,OAAO,EAAE,aAAa;SACvB;QACD,4DAA4D;QAC5D,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE;QACzE,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;QAC1D,UAAU,EAAE,aAAa;QACzB,8DAA8D;KACxD,CAAC,CAAC;IAEV,WAAE,CAAC,MAAM,CAAC,yBAAW,CAAC,CAAC,iBAAiB,CAAC;QACvC,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,EAAE,CAAC;QACvF,8DAA8D;KACxD,CAAC,CAAC;IAEV,WAAE,CAAC,MAAM,CAAC,6BAAoB,CAAC,CAAC,iBAAiB,CAAC;QAChD,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QAC1B,OAAO,EAAE,MAAM;QACf,8DAA8D;KACxD,CAAC,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,IAK1B;IACC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC;IAC1C,WAAE,CAAC,MAAM,CAAC,0CAAuB,CAAC,CAAC,iBAAiB,CAAC;QACnD,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,KAAgB,EAAE;QACzD,QAAQ,EAAE;YACR,IAAI,EAAE,YAAY,CAAC;gBACjB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;gBAChD,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;gBAChD,MAAM;aACP,CAAC;YACF,OAAO,EAAE,aAAa;SACvB;QACD,YAAY,EAAE,IAAI,CAAC,MAAM;YACvB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE;YACnF,CAAC,CAAC,IAAI;QACR,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;QAC/E,UAAU,EAAE,aAAa;QACzB,8DAA8D;KACxD,CAAC,CAAC;IAEV,WAAE,CAAC,MAAM,CAAC,yBAAW,CAAC,CAAC,iBAAiB,CAAC;QACvC,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,EAAE,CAAC;QACvF,8DAA8D;KACxD,CAAC,CAAC;IAEV,WAAE,CAAC,MAAM,CAAC,6BAAoB,CAAC,CAAC,iBAAiB,CAAC;QAChD,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QAC1B,OAAO,EAAE,MAAM;QACf,8DAA8D;KACxD,CAAC,CAAC;AACZ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,GAAG,WAAc,CAAC;AAElC,IAAA,mBAAU,EAAC,GAAG,EAAE;IACd,WAAE,CAAC,aAAa,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,qDAAqD,EAAE,GAAG,EAAE;IACnE,IAAA,WAAE,EAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,2EAA2E;QAC3E,uEAAuE;QACvE,2CAA2C;QAC3C,2BAA2B,CAAC,WAAW,CAAC,CAAC;QAEzC,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAEtE,IAAA,eAAM,EAAC,yBAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAA,eAAM,EAAC,WAAE,CAAC,MAAM,CAAC,yBAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC5D,QAAQ,EAAE,aAAa;YACvB,cAAc,EAAE,KAAK;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,yEAAyE;QACzE,sEAAsE;QACtE,oDAAoD;QACpD,2BAA2B,CAAC,WAAW,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAErF,MAAM,UAAU,GAAG,CAAC,IAAa,EAAE,IAAgB,EAAE,EAAE,CACrD,IAAI,YAAY,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAEpE,MAAM,gBAAgB,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CACjD,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,4CAA4B,CAAC,CACxE,CAAC;QACF,IAAA,eAAM,EAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEzC,wDAAwD;QACxD,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAC/C,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,yDAAmC,CAAC,CAC/E,CAAC;QACF,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,0EAA0E;QAC1E,8CAA8C;QAC9C,2BAA2B,CAAC,WAAW,CAAC,CAAC;QAEzC,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAEtE,IAAA,eAAM,EAAC,6BAAoB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,2BAA2B,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAEtE,IAAA,eAAM,EAAC,6BAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,sDAAsD,EAAE,GAAG,EAAE;IACpE,qEAAqE;IACrE,2EAA2E;IAC3E,mDAAmD;IAEnD,IAAA,WAAE,EAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QAE9E,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAEtE,IAAA,eAAM,EAAC,6BAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAEtE,IAAA,eAAM,EAAC,6BAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,yEAAyE;QACzE,wCAAwC;QACxC,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QAE9E,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAEtE,IAAA,eAAM,EAAC,yBAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,6DAA6D,EAAE,GAAG,EAAE;IAC3E,6EAA6E;IAC7E,qBAAqB;IAErB,IAAA,WAAE,EAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,iBAAiB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpD,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAEtE,IAAA,eAAM,EAAC,6BAAoB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACtD,IAAA,eAAM,EAAC,yBAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,sEAAsE;QACtE,gEAAgE;QAChE,iBAAiB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnD,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAEtE,IAAA,eAAM,EAAC,6BAAoB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;QAEtE,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAEtE,IAAA,eAAM,EAAC,6BAAoB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,wEAAwE;QACxE,sEAAsE;QACtE,sDAAsD;QACtD,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;QAEtE,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAEtE,IAAA,eAAM,EAAC,yBAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -42,10 +42,10 @@ async function closeContractThread(params, config) {
|
|
|
42
42
|
// Fetch thread account to read actual fiber_ids
|
|
43
43
|
const threadAccount = await (0, thread_1.fetchThreadByAddress)(contractThread, finalConfig.rpcUrl);
|
|
44
44
|
const fiberIds = Array.from(threadAccount.data.fiberIds);
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
const fiberAccounts = await (0, fibers_1.
|
|
45
|
+
// One account per tracked id, existing or not. Which of them still have
|
|
46
|
+
// anything to close is the thread program's call — see
|
|
47
|
+
// `trackedFiberAccounts`.
|
|
48
|
+
const fiberAccounts = await (0, fibers_1.trackedFiberAccounts)(contractThread, fiberIds);
|
|
49
49
|
const kitInstruction = await (0, instructions_1.getCloseContractThreadInstructionAsync)({
|
|
50
50
|
owner: ownerSigner,
|
|
51
51
|
contract: contractAddress,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeContractThread.js","sourceRoot":"","sources":["../../../src/instructions/closeContractThread.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAwCH,
|
|
1
|
+
{"version":3,"file":"closeContractThread.js","sourceRoot":"","sources":["../../../src/instructions/closeContractThread.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAwCH,kDA+CC;AArFD,qCAAiE;AACjE,mEAA0F;AAC1F,4CAA4E;AAC5E,4CAA4E;AAC5E,wDAA4D;AAC5D,+CAA0D;AAC1D,0CAAqD;AACrD,4CAAuD;AACvD,wCAAqD;AAsBrD;;;;;;;GAOG;AACI,KAAK,UAAU,mBAAmB,CACvC,MAAiC,EACjC,MAA2B;IAE3B,MAAM,WAAW,GAAG,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;IAExC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,4BAAmB,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAA,qBAAY,EAAC,MAAM,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,IAAA,aAAO,EAAC,SAAS,CAAC,KAAgB,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,IAAA,aAAO,EAAC,MAAM,CAAC,QAAmB,CAAC,CAAC;IAE5D,oBAAoB;IACpB,MAAM,eAAe,GAAG,MAAM,IAAA,6BAAqB,GAAE,CAAC;IACtD,MAAM,cAAc,GAAG,MAAM,IAAA,6BAAoB,EAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAEpF,gDAAgD;IAChD,MAAM,aAAa,GAAG,MAAM,IAAA,6BAAoB,EAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAa,CAAC;IAErE,wEAAwE;IACxE,uDAAuD;IACvD,0BAA0B;IAC1B,MAAM,aAAa,GAAG,MAAM,IAAA,6BAAoB,EAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAE3E,MAAM,cAAc,GAAG,MAAM,IAAA,qDAAsC,EACjE;QACE,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,cAAc;KACvB,EACD,EAAE,cAAc,EAAE,CACnB,CAAC;IAEF,8DAA8D;IAC9D,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IAE/C,OAAO,IAAA,kCAAmB,EAAC,cAAc,EAAE;QACzC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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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"}
|
|
@@ -44,10 +44,10 @@ async function deleteContractThread(params, config) {
|
|
|
44
44
|
// Fetch thread account to read actual fiber_ids
|
|
45
45
|
const threadAccount = await (0, thread_1.fetchThreadByAddress)(contractThread, finalConfig.rpcUrl);
|
|
46
46
|
const fiberIds = Array.from(threadAccount.data.fiberIds);
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
const fiberAccounts = await (0, fibers_1.
|
|
47
|
+
// One account per tracked id, existing or not. Which of them still have
|
|
48
|
+
// anything to close is the thread program's call — see
|
|
49
|
+
// `trackedFiberAccounts`.
|
|
50
|
+
const fiberAccounts = await (0, fibers_1.trackedFiberAccounts)(contractThread, fiberIds);
|
|
51
51
|
const kitInstruction = await (0, instructions_1.getDeleteContractThreadInstructionAsync)({
|
|
52
52
|
admin: adminSigner,
|
|
53
53
|
thread: contractThread,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteContractThread.js","sourceRoot":"","sources":["../../../src/instructions/deleteContractThread.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAyCH,
|
|
1
|
+
{"version":3,"file":"deleteContractThread.js","sourceRoot":"","sources":["../../../src/instructions/deleteContractThread.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAyCH,oDA8CC;AArFD,qCAAiE;AACjE,mEAA2F;AAC3F,4CAA4E;AAC5E,4CAA4E;AAC5E,wDAA4D;AAC5D,+CAA0D;AAC1D,0CAAqD;AACrD,4CAAuD;AACvD,wCAAqD;AAsBrD;;;;;;;;GAQG;AACI,KAAK,UAAU,oBAAoB,CACxC,MAAkC,EAClC,MAA2B;IAE3B,MAAM,WAAW,GAAG,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;IAExC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,4BAAmB,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAA,qBAAY,EAAC,MAAM,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,IAAA,aAAO,EAAC,SAAS,CAAC,KAAgB,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,IAAA,aAAO,EAAC,MAAM,CAAC,QAAmB,CAAC,CAAC;IAE5D,oBAAoB;IACpB,MAAM,eAAe,GAAG,MAAM,IAAA,6BAAqB,GAAE,CAAC;IACtD,MAAM,cAAc,GAAG,MAAM,IAAA,6BAAoB,EAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAEpF,gDAAgD;IAChD,MAAM,aAAa,GAAG,MAAM,IAAA,6BAAoB,EAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAa,CAAC;IAErE,wEAAwE;IACxE,uDAAuD;IACvD,0BAA0B;IAC1B,MAAM,aAAa,GAAG,MAAM,IAAA,6BAAoB,EAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAE3E,MAAM,cAAc,GAAG,MAAM,IAAA,sDAAuC,EAClE;QACE,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,cAAc;KACvB,EACD,EAAE,cAAc,EAAE,CACnB,CAAC;IAEF,8DAA8D;IAC9D,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IAE/C,OAAO,IAAA,kCAAmB,EAAC,cAAc,EAAE;QACzC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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":";;AAAA;;;;GAIG;AACH,mCAA8D;AAM9D,WAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,uBAAuB,EAAE,WAAE,CAAC,EAAE,EAAE;CACjC,CAAC,CAAC,CAAC;AACJ,WAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5C,WAAW,EAAE,WAAE,CAAC,EAAE,EAAE;CACrB,CAAC,CAAC,CAAC;AAEJ,gEAAoE;AACpE,6DAA0D;AAC1D,mCAAsD;AACtD,kFAA8F;AAE9F,MAAM,MAAM,GAAG,kCAA6C,CAAC;AAC7D,MAAM,aAAa,GAAG,8CAAyD,CAAC;AAChF,MAAM,WAAW,GAAG,6CAAwD,CAAC;AAC7E,MAAM,UAAU,GAAG,6CAAwD,CAAC;AAC5E,MAAM,SAAS,GAAG,8CAAyD,CAAC;AAE5E,4EAA4E;AAC5E,MAAM,aAAa;IACA,KAAK,CAAS;IAC/B,YAAY,KAAc;QACxB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,UAAU;IACnB,sBAAsB,EAAE,WAAE,CAAC,EAAE,EAAE;CAC2B,CAAC;AAE7D,8EAA8E;AAC9E,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAE/D,yEAAyE;AACzE,SAAS,yBAAyB;IAChC,WAAE,CAAC,MAAM,CAAC,0CAAuB,CAAC,CAAC,iBAAiB,CAAC;QACnD,MAAM,EAAE;YACN,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAA4B;YAC7E,OAAO,EAAE,KAAgB;SAC1B;QACD,QAAQ,EAAE;YACR,IAAI,EAAE;gBACJ,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,WAAW;gBACzB,YAAY,EAAE,MAAM;gBACpB,MAAM,EAAE,MAAM;gBACd,mBAAmB,EAAE,SAAS;aACH;YAC7B,OAAO,EAAE,aAAa;SACvB;QACD,YAAY,EAAE;YACZ,IAAI,EAAE;gBACJ,QAAQ,EAAE,UAAU;gBACpB,eAAe,EAAE,SAAS;gBAC1B,OAAO,EAAE,EAAE;aACc;YAC3B,OAAO,EAAE,WAAW;SACrB;QACD,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,aAAa;QACzB,8DAA8D;KACxD,CAAC,CAAC;IAEV,WAAE,CAAC,MAAM,CAAC,yBAAW,CAAC,CAAC,iBAAiB,CAAC;QACvC,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACpF,8DAA8D;KACxD,CAAC,CAAC;AACZ,CAAC;AAED,IAAA,mBAAU,EAAC,GAAG,EAAE;IACd,WAAE,CAAC,aAAa,EAAE,CAAC;IACnB,IAAA,oBAAY,EAAC,EAAE,SAAS,EAAE,aAAsB,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,sDAAsD,EAAE,GAAG,EAAE;IACpE,IAAA,WAAE,EAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,yBAAyB,EAAE,CAAC;QAE5B,MAAM,IAAA,qBAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAEtE,IAAA,eAAM,EAAC,yBAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,yBAAyB,EAAE,CAAC;QAE5B,MAAM,GAAG,GAAG,MAAM,IAAA,qBAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAElF,MAAM,UAAU,GAAG,CAAC,IAAoC,EAAE,MAAkB,EAAE,EAAE,CAC9E,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAE,IAA0B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAE/D,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAA,eAAM,EAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAkB,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,IAAA,eAAM,EAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAkB,EAAE,4CAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,yBAAyB,EAAE,CAAC;QAE5B,MAAM,GAAG,GAAG,MAAM,IAAA,qBAAa,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAElF,sEAAsE;QACtE,0EAA0E;QAC1E,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAClB,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAkB,CAAC,CAAC,IAAI,EAAE,CAC5E,CAAC;QACF,IAAA,eAAM,EAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5C,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAA,eAAM,EAAC,EAAE,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YACnD,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/cjs/package.json
CHANGED
package/dist/cjs/utils/fibers.js
CHANGED
|
@@ -3,36 +3,32 @@
|
|
|
3
3
|
* Resolving a thread's fiber accounts for instructions that close them.
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.trackedFiberAccounts = trackedFiberAccounts;
|
|
7
7
|
const kit_1 = require("@solana/kit");
|
|
8
8
|
const thread_1 = require("../pda/thread");
|
|
9
|
-
const rpc_1 = require("./rpc");
|
|
10
9
|
/**
|
|
11
10
|
* The fiber accounts a close instruction should carry, given what a thread
|
|
12
|
-
* tracks
|
|
11
|
+
* tracks: one per entry in `fiber_ids`, whether or not the account it names
|
|
12
|
+
* still exists.
|
|
13
13
|
*
|
|
14
14
|
* `fiber_ids` records the indices a thread *tracks*, and nothing on chain
|
|
15
15
|
* keeps that list in agreement with the accounts it names — a fiber account
|
|
16
16
|
* can be closed out from under a thread that still lists it, which is what
|
|
17
17
|
* the 2026-08-26 rent sweep did to 623 of them.
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
19
|
+
* Reconciling the two is the thread program's job, not ours. It is the only
|
|
20
|
+
* participant that can see the list and the accounts *and* edit the list;
|
|
21
|
+
* dropping an index here asserts it needs no accounting for, which is not
|
|
22
|
+
* ours to assert and which `thread_close` rejects — it requires every tracked
|
|
23
|
+
* id to be accounted for and fails with `MissingFiberAccounts` otherwise.
|
|
24
|
+
* Passing the account is how an id whose account is gone gets accounted for.
|
|
24
25
|
*
|
|
25
|
-
*
|
|
26
|
-
* whole remedy. One `getMultipleAccounts` for the batch.
|
|
26
|
+
* Deriving an address is pure computation, so this needs no RPC.
|
|
27
27
|
*/
|
|
28
|
-
async function
|
|
28
|
+
async function trackedFiberAccounts(thread, fiberIds) {
|
|
29
29
|
if (!fiberIds.length)
|
|
30
30
|
return [];
|
|
31
31
|
const addresses = await Promise.all(fiberIds.map(id => (0, thread_1.deriveFiber)(thread, id)));
|
|
32
|
-
|
|
33
|
-
const { value } = await rpc.getMultipleAccounts(addresses, { encoding: 'base64' }).send();
|
|
34
|
-
return addresses
|
|
35
|
-
.filter((_, i) => value[i] !== null)
|
|
36
|
-
.map(address => ({ address, role: kit_1.AccountRole.WRITABLE }));
|
|
32
|
+
return addresses.map(address => ({ address, role: kit_1.AccountRole.WRITABLE }));
|
|
37
33
|
}
|
|
38
34
|
//# sourceMappingURL=fibers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fibers.js","sourceRoot":"","sources":["../../../src/utils/fibers.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAwBH,
|
|
1
|
+
{"version":3,"file":"fibers.js","sourceRoot":"","sources":["../../../src/utils/fibers.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAwBH,oDASC;AA/BD,qCAAwD;AACxD,0CAA4C;AAE5C;;;;;;;;;;;;;;;;;;GAkBG;AACI,KAAK,UAAU,oBAAoB,CACxC,MAAe,EACf,QAAkB;IAElB,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAA,oBAAW,EAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjF,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAW,CAAC,QAAiB,EAAE,CAAC,CAAC,CAAC;AACtF,CAAC"}
|