@sly-rentals/core 5.5.1 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.json +1656 -1656
- package/dist/cjs/instructions/closeContract.js +5 -22
- package/dist/cjs/instructions/closeContract.js.map +1 -1
- package/dist/cjs/instructions/closeContractThread.js +5 -5
- package/dist/cjs/instructions/closeContractThread.js.map +1 -1
- package/dist/cjs/instructions/deleteContractThread.js +5 -5
- package/dist/cjs/instructions/deleteContractThread.js.map +1 -1
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/utils/fibers.js +34 -0
- package/dist/cjs/utils/fibers.js.map +1 -0
- package/dist/cjs/utils/fibers.test.js +44 -0
- package/dist/cjs/utils/fibers.test.js.map +1 -0
- package/dist/cjs/version.js +1 -1
- package/dist/esm/instructions/closeContract.js +8 -25
- package/dist/esm/instructions/closeContract.js.map +1 -1
- package/dist/esm/instructions/closeContractThread.js +7 -7
- package/dist/esm/instructions/closeContractThread.js.map +1 -1
- package/dist/esm/instructions/deleteContractThread.js +7 -7
- package/dist/esm/instructions/deleteContractThread.js.map +1 -1
- package/dist/esm/package.json +1 -1
- package/dist/esm/utils/fibers.js +31 -0
- package/dist/esm/utils/fibers.js.map +1 -0
- package/dist/esm/utils/fibers.test.js +42 -0
- package/dist/esm/utils/fibers.test.js.map +1 -0
- package/dist/esm/version.js +1 -1
- package/dist/types/instructions/closeContract.d.ts.map +1 -1
- package/dist/types/instructions/closeContractThread.d.ts.map +1 -1
- package/dist/types/instructions/deleteContractThread.d.ts.map +1 -1
- package/dist/types/utils/fibers.d.ts +28 -0
- package/dist/types/utils/fibers.d.ts.map +1 -0
- package/dist/types/utils/fibers.test.d.ts +2 -0
- package/dist/types/utils/fibers.test.d.ts.map +1 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -10,7 +10,7 @@ exports.closeContract = closeContract;
|
|
|
10
10
|
const kit_1 = require("@solana/kit");
|
|
11
11
|
const instructions_1 = require("../generated/codama/instructions");
|
|
12
12
|
const config_1 = require("../utils/config");
|
|
13
|
-
const
|
|
13
|
+
const fibers_1 = require("../utils/fibers");
|
|
14
14
|
const signer_1 = require("../utils/signer");
|
|
15
15
|
const thread_1 = require("../accounts/thread");
|
|
16
16
|
const contractSnapshot_1 = require("../utils/contractSnapshot");
|
|
@@ -148,27 +148,10 @@ async function closeContract(params, config) {
|
|
|
148
148
|
const contractThread = await (0, thread_2.deriveContractThread)(contractAddress, rentalAuthority);
|
|
149
149
|
const threadAccount = await (0, thread_1.fetchThreadByAddress)(contractThread, finalConfig.rpcUrl);
|
|
150
150
|
const fiberIds = Array.from(threadAccount.data.fiberIds);
|
|
151
|
-
//
|
|
152
|
-
//
|
|
153
|
-
//
|
|
154
|
-
|
|
155
|
-
// an id whose account is gone makes the fiber program deserialize an empty
|
|
156
|
-
// buffer and fail with `InvalidFiberData`, so a contract that tracks a
|
|
157
|
-
// destroyed fiber could never be closed at all.
|
|
158
|
-
//
|
|
159
|
-
// A tracked-but-absent fiber needs nothing closed; dropping it from the
|
|
160
|
-
// list is the whole remedy.
|
|
161
|
-
const fiberAddresses = await Promise.all(fiberIds.map(id => (0, thread_2.deriveFiber)(contractThread, id)));
|
|
162
|
-
const rpc = (0, rpc_1.createRpc)(finalConfig.rpcUrl || (0, config_1.getRpcUrl)(config));
|
|
163
|
-
const probed = fiberAddresses.length
|
|
164
|
-
? (await rpc.getMultipleAccounts(fiberAddresses, { encoding: 'base64' }).send()).value
|
|
165
|
-
: [];
|
|
166
|
-
const fiberAccounts = fiberAddresses
|
|
167
|
-
.filter((_, i) => probed[i] !== null)
|
|
168
|
-
.map(fiberAddress => ({
|
|
169
|
-
address: fiberAddress,
|
|
170
|
-
role: kit_1.AccountRole.WRITABLE,
|
|
171
|
-
}));
|
|
151
|
+
// One account per tracked id, existing or not. Which of them still have
|
|
152
|
+
// anything to close is the thread program's call — see
|
|
153
|
+
// `trackedFiberAccounts`.
|
|
154
|
+
const fiberAccounts = await (0, fibers_1.trackedFiberAccounts)(contractThread, fiberIds);
|
|
172
155
|
const ix = await (0, instructions_1.getCloseContractThreadInstructionAsync)({ owner: ownerSigner, contract: contractAddress, thread: contractThread }, { programAddress });
|
|
173
156
|
ix.accounts.push(...fiberAccounts);
|
|
174
157
|
return ix;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeContract.js","sourceRoot":"","sources":["../../../src/instructions/closeContract.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA8GH,
|
|
1
|
+
{"version":3,"file":"closeContract.js","sourceRoot":"","sources":["../../../src/instructions/closeContract.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ const signer_1 = require("../utils/signer");
|
|
|
14
14
|
const instructions_2 = require("../utils/instructions");
|
|
15
15
|
const thread_1 = require("../accounts/thread");
|
|
16
16
|
const thread_2 = require("../pda/thread");
|
|
17
|
+
const fibers_1 = require("../utils/fibers");
|
|
17
18
|
const srsly_1 = require("../pda/srsly");
|
|
18
19
|
/**
|
|
19
20
|
* Close a contract's automation thread and all of its fibers, reclaiming
|
|
@@ -41,11 +42,10 @@ async function closeContractThread(params, config) {
|
|
|
41
42
|
// Fetch thread account to read actual fiber_ids
|
|
42
43
|
const threadAccount = await (0, thread_1.fetchThreadByAddress)(contractThread, finalConfig.rpcUrl);
|
|
43
44
|
const fiberIds = Array.from(threadAccount.data.fiberIds);
|
|
44
|
-
//
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
})));
|
|
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;;
|
|
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"}
|
|
@@ -15,6 +15,7 @@ const signer_1 = require("../utils/signer");
|
|
|
15
15
|
const instructions_2 = require("../utils/instructions");
|
|
16
16
|
const thread_1 = require("../accounts/thread");
|
|
17
17
|
const thread_2 = require("../pda/thread");
|
|
18
|
+
const fibers_1 = require("../utils/fibers");
|
|
18
19
|
const srsly_1 = require("../pda/srsly");
|
|
19
20
|
/**
|
|
20
21
|
* Admin variant of `closeContractThread` that doesn't require the
|
|
@@ -43,11 +44,10 @@ async function deleteContractThread(params, config) {
|
|
|
43
44
|
// Fetch thread account to read actual fiber_ids
|
|
44
45
|
const threadAccount = await (0, thread_1.fetchThreadByAddress)(contractThread, finalConfig.rpcUrl);
|
|
45
46
|
const fiberIds = Array.from(threadAccount.data.fiberIds);
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
})));
|
|
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;;
|
|
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"}
|
package/dist/cjs/package.json
CHANGED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Resolving a thread's fiber accounts for instructions that close them.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.trackedFiberAccounts = trackedFiberAccounts;
|
|
7
|
+
const kit_1 = require("@solana/kit");
|
|
8
|
+
const thread_1 = require("../pda/thread");
|
|
9
|
+
/**
|
|
10
|
+
* The fiber accounts a close instruction should carry, given what a thread
|
|
11
|
+
* tracks: one per entry in `fiber_ids`, whether or not the account it names
|
|
12
|
+
* still exists.
|
|
13
|
+
*
|
|
14
|
+
* `fiber_ids` records the indices a thread *tracks*, and nothing on chain
|
|
15
|
+
* keeps that list in agreement with the accounts it names — a fiber account
|
|
16
|
+
* can be closed out from under a thread that still lists it, which is what
|
|
17
|
+
* the 2026-08-26 rent sweep did to 623 of them.
|
|
18
|
+
*
|
|
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.
|
|
25
|
+
*
|
|
26
|
+
* Deriving an address is pure computation, so this needs no RPC.
|
|
27
|
+
*/
|
|
28
|
+
async function trackedFiberAccounts(thread, fiberIds) {
|
|
29
|
+
if (!fiberIds.length)
|
|
30
|
+
return [];
|
|
31
|
+
const addresses = await Promise.all(fiberIds.map(id => (0, thread_1.deriveFiber)(thread, id)));
|
|
32
|
+
return addresses.map(address => ({ address, role: kit_1.AccountRole.WRITABLE }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=fibers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const kit_1 = require("@solana/kit");
|
|
5
|
+
vitest_1.vi.mock('../pda/thread', () => ({ deriveFiber: vitest_1.vi.fn() }));
|
|
6
|
+
const thread_1 = require("../pda/thread");
|
|
7
|
+
const fibers_1 = require("./fibers");
|
|
8
|
+
const THREAD = 'Sysvar1nstructions1111111111111111111111111';
|
|
9
|
+
const FIBER_0 = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
|
|
10
|
+
const FIBER_1 = 'So11111111111111111111111111111111111111112';
|
|
11
|
+
(0, vitest_1.beforeEach)(() => {
|
|
12
|
+
vitest_1.vi.clearAllMocks();
|
|
13
|
+
vitest_1.vi.mocked(thread_1.deriveFiber).mockImplementation(async (_thread, index) => index === 0 ? FIBER_0 : FIBER_1);
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.describe)('trackedFiberAccounts', () => {
|
|
16
|
+
(0, vitest_1.it)('carries a tracked fiber whose account is gone', async () => {
|
|
17
|
+
// The state the 2026-08-26 rent sweep left behind: the thread still tracks
|
|
18
|
+
// both indices, but fiber 1's account was closed. The id has to be
|
|
19
|
+
// accounted for or `thread_close` fails with `MissingFiberAccounts`, and
|
|
20
|
+
// passing the account is the only way to account for it — dropping the id
|
|
21
|
+
// is the thread program's call, and only it can edit `fiber_ids`.
|
|
22
|
+
const accounts = await (0, fibers_1.trackedFiberAccounts)(THREAD, [0, 1]);
|
|
23
|
+
(0, vitest_1.expect)(accounts).toEqual([
|
|
24
|
+
{ address: FIBER_0, role: kit_1.AccountRole.WRITABLE },
|
|
25
|
+
{ address: FIBER_1, role: kit_1.AccountRole.WRITABLE },
|
|
26
|
+
]);
|
|
27
|
+
});
|
|
28
|
+
(0, vitest_1.it)('carries every fiber when all of them exist', async () => {
|
|
29
|
+
const accounts = await (0, fibers_1.trackedFiberAccounts)(THREAD, [0, 1]);
|
|
30
|
+
(0, vitest_1.expect)(accounts.map(a => a.address)).toEqual([FIBER_0, FIBER_1]);
|
|
31
|
+
});
|
|
32
|
+
(0, vitest_1.it)('returns nothing when the thread tracks nothing', async () => {
|
|
33
|
+
const accounts = await (0, fibers_1.trackedFiberAccounts)(THREAD, []);
|
|
34
|
+
(0, vitest_1.expect)(accounts).toEqual([]);
|
|
35
|
+
(0, vitest_1.expect)(thread_1.deriveFiber).not.toHaveBeenCalled();
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.it)('reads no account state, so it needs no RPC', async () => {
|
|
38
|
+
// Existence is not consulted at all — the addresses are pure computation
|
|
39
|
+
// from the thread and the ids.
|
|
40
|
+
await (0, fibers_1.trackedFiberAccounts)(THREAD, [0, 1]);
|
|
41
|
+
(0, vitest_1.expect)(thread_1.deriveFiber).toHaveBeenCalledTimes(2);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=fibers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fibers.test.js","sourceRoot":"","sources":["../../../src/utils/fibers.test.ts"],"names":[],"mappings":";;AAAA,mCAA8D;AAC9D,qCAAwD;AAExD,WAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAE3D,0CAA4C;AAC5C,qCAAgD;AAEhD,MAAM,MAAM,GAAG,6CAAwD,CAAC;AACxE,MAAM,OAAO,GAAG,8CAAyD,CAAC;AAC1E,MAAM,OAAO,GAAG,6CAAwD,CAAC;AAEzE,IAAA,mBAAU,EAAC,GAAG,EAAE;IACd,WAAE,CAAC,aAAa,EAAE,CAAC;IACnB,WAAE,CAAC,MAAM,CAAC,oBAAW,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CACjE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAChC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAA,WAAE,EAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,2EAA2E;QAC3E,mEAAmE;QACnE,yEAAyE;QACzE,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,QAAQ,GAAG,MAAM,IAAA,6BAAoB,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5D,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YACvB,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAW,CAAC,QAAQ,EAAE;YAChD,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAW,CAAC,QAAQ,EAAE;SACjD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAA,6BAAoB,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5D,IAAA,eAAM,EAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,QAAQ,GAAG,MAAM,IAAA,6BAAoB,EAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAExD,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAA,eAAM,EAAC,oBAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,yEAAyE;QACzE,+BAA+B;QAC/B,MAAM,IAAA,6BAAoB,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3C,IAAA,eAAM,EAAC,oBAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
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
|
+
exports.VERSION = '6.0.0';
|
|
7
7
|
//# sourceMappingURL=version.js.map
|
|
@@ -4,16 +4,16 @@
|
|
|
4
4
|
* Thin convenience wrapper around Codama-generated closeContract instruction.
|
|
5
5
|
* Closes a contract with no active rentals and claims remaining payments.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { address } from '@solana/kit';
|
|
8
8
|
import { getCloseContractInstructionAsync, getCloseContractThreadInstructionAsync, } from '../generated/codama/instructions';
|
|
9
|
-
import { mergeConfig, getAddresses
|
|
10
|
-
import {
|
|
9
|
+
import { mergeConfig, getAddresses } from '../utils/config';
|
|
10
|
+
import { trackedFiberAccounts } from '../utils/fibers';
|
|
11
11
|
import { toTransactionSigner } from '../utils/signer';
|
|
12
12
|
import { fetchThreadByAddress } from '../accounts/thread';
|
|
13
13
|
import { resolveContractSnapshot } from '../utils/contractSnapshot';
|
|
14
14
|
import { deriveAssociatedTokenAccount } from '../pda/token';
|
|
15
15
|
import { deriveContract, deriveBorrowerState, deriveRentalAuthority } from '../pda/srsly';
|
|
16
|
-
import { deriveContractThread
|
|
16
|
+
import { deriveContractThread } from '../pda/thread';
|
|
17
17
|
import { prepareInstructions } from '../utils/instructions';
|
|
18
18
|
import { closeRental } from './closeRental';
|
|
19
19
|
/**
|
|
@@ -145,27 +145,10 @@ export async function closeContract(params, config) {
|
|
|
145
145
|
const contractThread = await deriveContractThread(contractAddress, rentalAuthority);
|
|
146
146
|
const threadAccount = await fetchThreadByAddress(contractThread, finalConfig.rpcUrl);
|
|
147
147
|
const fiberIds = Array.from(threadAccount.data.fiberIds);
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
//
|
|
151
|
-
|
|
152
|
-
// an id whose account is gone makes the fiber program deserialize an empty
|
|
153
|
-
// buffer and fail with `InvalidFiberData`, so a contract that tracks a
|
|
154
|
-
// destroyed fiber could never be closed at all.
|
|
155
|
-
//
|
|
156
|
-
// A tracked-but-absent fiber needs nothing closed; dropping it from the
|
|
157
|
-
// list is the whole remedy.
|
|
158
|
-
const fiberAddresses = await Promise.all(fiberIds.map(id => deriveFiber(contractThread, id)));
|
|
159
|
-
const rpc = createRpc(finalConfig.rpcUrl || getRpcUrl(config));
|
|
160
|
-
const probed = fiberAddresses.length
|
|
161
|
-
? (await rpc.getMultipleAccounts(fiberAddresses, { encoding: 'base64' }).send()).value
|
|
162
|
-
: [];
|
|
163
|
-
const fiberAccounts = fiberAddresses
|
|
164
|
-
.filter((_, i) => probed[i] !== null)
|
|
165
|
-
.map(fiberAddress => ({
|
|
166
|
-
address: fiberAddress,
|
|
167
|
-
role: AccountRole.WRITABLE,
|
|
168
|
-
}));
|
|
148
|
+
// One account per tracked id, existing or not. Which of them still have
|
|
149
|
+
// anything to close is the thread program's call — see
|
|
150
|
+
// `trackedFiberAccounts`.
|
|
151
|
+
const fiberAccounts = await trackedFiberAccounts(contractThread, fiberIds);
|
|
169
152
|
const ix = await getCloseContractThreadInstructionAsync({ owner: ownerSigner, contract: contractAddress, thread: contractThread }, { programAddress });
|
|
170
153
|
ix.accounts.push(...fiberAccounts);
|
|
171
154
|
return ix;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeContract.js","sourceRoot":"","sources":["../../../src/instructions/closeContract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"closeContract.js","sourceRoot":"","sources":["../../../src/instructions/closeContract.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
* Thin convenience wrapper around Codama-generated closeContractThread instruction.
|
|
5
5
|
* Closes a per-contract automation thread and reclaims rent.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { address } from '@solana/kit';
|
|
8
8
|
import { getCloseContractThreadInstructionAsync } from '../generated/codama/instructions';
|
|
9
9
|
import { mergeConfig, getAddresses } from '../utils/config';
|
|
10
10
|
import { toTransactionSigner } from '../utils/signer';
|
|
11
11
|
import { prepareInstructions } from '../utils/instructions';
|
|
12
12
|
import { fetchThreadByAddress } from '../accounts/thread';
|
|
13
|
-
import { deriveContractThread
|
|
13
|
+
import { deriveContractThread } from '../pda/thread';
|
|
14
|
+
import { trackedFiberAccounts } from '../utils/fibers';
|
|
14
15
|
import { deriveRentalAuthority } from '../pda/srsly';
|
|
15
16
|
/**
|
|
16
17
|
* Close a contract's automation thread and all of its fibers, reclaiming
|
|
@@ -38,11 +39,10 @@ export async function closeContractThread(params, config) {
|
|
|
38
39
|
// Fetch thread account to read actual fiber_ids
|
|
39
40
|
const threadAccount = await fetchThreadByAddress(contractThread, finalConfig.rpcUrl);
|
|
40
41
|
const fiberIds = Array.from(threadAccount.data.fiberIds);
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
})));
|
|
42
|
+
// One account per tracked id, existing or not. Which of them still have
|
|
43
|
+
// anything to close is the thread program's call — see
|
|
44
|
+
// `trackedFiberAccounts`.
|
|
45
|
+
const fiberAccounts = await trackedFiberAccounts(contractThread, fiberIds);
|
|
46
46
|
const kitInstruction = await getCloseContractThreadInstructionAsync({
|
|
47
47
|
owner: ownerSigner,
|
|
48
48
|
contract: contractAddress,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeContractThread.js","sourceRoot":"","sources":["../../../src/instructions/closeContractThread.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"closeContractThread.js","sourceRoot":"","sources":["../../../src/instructions/closeContractThread.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAe,OAAO,EAAgB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,sCAAsC,EAAE,MAAM,kCAAkC,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAwB,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAsBrD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAiC,EACjC,MAA2B;IAE3B,MAAM,WAAW,GAAG,WAAW,CAAC,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,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,KAAgB,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,QAAmB,CAAC,CAAC;IAE5D,oBAAoB;IACpB,MAAM,eAAe,GAAG,MAAM,qBAAqB,EAAE,CAAC;IACtD,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAEpF,gDAAgD;IAChD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,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,oBAAoB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAE3E,MAAM,cAAc,GAAG,MAAM,sCAAsC,CACjE;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,mBAAmB,CAAC,cAAc,EAAE;QACzC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
* Admin-only instruction to delete a contract's thread for schema migrations.
|
|
6
6
|
* Unlike closeContractThread, does not require the contract account.
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
8
|
+
import { address } from '@solana/kit';
|
|
9
9
|
import { getDeleteContractThreadInstructionAsync } from '../generated/codama/instructions';
|
|
10
10
|
import { mergeConfig, getAddresses } from '../utils/config';
|
|
11
11
|
import { toTransactionSigner } from '../utils/signer';
|
|
12
12
|
import { prepareInstructions } from '../utils/instructions';
|
|
13
13
|
import { fetchThreadByAddress } from '../accounts/thread';
|
|
14
|
-
import { deriveContractThread
|
|
14
|
+
import { deriveContractThread } from '../pda/thread';
|
|
15
|
+
import { trackedFiberAccounts } from '../utils/fibers';
|
|
15
16
|
import { deriveRentalAuthority } from '../pda/srsly';
|
|
16
17
|
/**
|
|
17
18
|
* Admin variant of `closeContractThread` that doesn't require the
|
|
@@ -40,11 +41,10 @@ export async function deleteContractThread(params, config) {
|
|
|
40
41
|
// Fetch thread account to read actual fiber_ids
|
|
41
42
|
const threadAccount = await fetchThreadByAddress(contractThread, finalConfig.rpcUrl);
|
|
42
43
|
const fiberIds = Array.from(threadAccount.data.fiberIds);
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
})));
|
|
44
|
+
// One account per tracked id, existing or not. Which of them still have
|
|
45
|
+
// anything to close is the thread program's call — see
|
|
46
|
+
// `trackedFiberAccounts`.
|
|
47
|
+
const fiberAccounts = await trackedFiberAccounts(contractThread, fiberIds);
|
|
48
48
|
const kitInstruction = await getDeleteContractThreadInstructionAsync({
|
|
49
49
|
admin: adminSigner,
|
|
50
50
|
thread: contractThread,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteContractThread.js","sourceRoot":"","sources":["../../../src/instructions/deleteContractThread.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"deleteContractThread.js","sourceRoot":"","sources":["../../../src/instructions/deleteContractThread.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAe,OAAO,EAAgB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,uCAAuC,EAAE,MAAM,kCAAkC,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAwB,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAsBrD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkC,EAClC,MAA2B;IAE3B,MAAM,WAAW,GAAG,WAAW,CAAC,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,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,KAAgB,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,QAAmB,CAAC,CAAC;IAE5D,oBAAoB;IACpB,MAAM,eAAe,GAAG,MAAM,qBAAqB,EAAE,CAAC;IACtD,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAEpF,gDAAgD;IAChD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,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,oBAAoB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAE3E,MAAM,cAAc,GAAG,MAAM,uCAAuC,CAClE;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,mBAAmB,CAAC,cAAc,EAAE;QACzC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/esm/package.json
CHANGED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolving a thread's fiber accounts for instructions that close them.
|
|
3
|
+
*/
|
|
4
|
+
import { AccountRole } from '@solana/kit';
|
|
5
|
+
import { deriveFiber } from '../pda/thread';
|
|
6
|
+
/**
|
|
7
|
+
* The fiber accounts a close instruction should carry, given what a thread
|
|
8
|
+
* tracks: one per entry in `fiber_ids`, whether or not the account it names
|
|
9
|
+
* still exists.
|
|
10
|
+
*
|
|
11
|
+
* `fiber_ids` records the indices a thread *tracks*, and nothing on chain
|
|
12
|
+
* keeps that list in agreement with the accounts it names — a fiber account
|
|
13
|
+
* can be closed out from under a thread that still lists it, which is what
|
|
14
|
+
* the 2026-08-26 rent sweep did to 623 of them.
|
|
15
|
+
*
|
|
16
|
+
* Reconciling the two is the thread program's job, not ours. It is the only
|
|
17
|
+
* participant that can see the list and the accounts *and* edit the list;
|
|
18
|
+
* dropping an index here asserts it needs no accounting for, which is not
|
|
19
|
+
* ours to assert and which `thread_close` rejects — it requires every tracked
|
|
20
|
+
* id to be accounted for and fails with `MissingFiberAccounts` otherwise.
|
|
21
|
+
* Passing the account is how an id whose account is gone gets accounted for.
|
|
22
|
+
*
|
|
23
|
+
* Deriving an address is pure computation, so this needs no RPC.
|
|
24
|
+
*/
|
|
25
|
+
export async function trackedFiberAccounts(thread, fiberIds) {
|
|
26
|
+
if (!fiberIds.length)
|
|
27
|
+
return [];
|
|
28
|
+
const addresses = await Promise.all(fiberIds.map(id => deriveFiber(thread, id)));
|
|
29
|
+
return addresses.map(address => ({ address, role: AccountRole.WRITABLE }));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=fibers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fibers.js","sourceRoot":"","sources":["../../../src/utils/fibers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,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,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjF,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,QAAiB,EAAE,CAAC,CAAC,CAAC;AACtF,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, expect, it, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { AccountRole } from '@solana/kit';
|
|
3
|
+
vi.mock('../pda/thread', () => ({ deriveFiber: vi.fn() }));
|
|
4
|
+
import { deriveFiber } from '../pda/thread';
|
|
5
|
+
import { trackedFiberAccounts } from './fibers';
|
|
6
|
+
const THREAD = 'Sysvar1nstructions1111111111111111111111111';
|
|
7
|
+
const FIBER_0 = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
|
|
8
|
+
const FIBER_1 = 'So11111111111111111111111111111111111111112';
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
vi.clearAllMocks();
|
|
11
|
+
vi.mocked(deriveFiber).mockImplementation(async (_thread, index) => index === 0 ? FIBER_0 : FIBER_1);
|
|
12
|
+
});
|
|
13
|
+
describe('trackedFiberAccounts', () => {
|
|
14
|
+
it('carries a tracked fiber whose account is gone', async () => {
|
|
15
|
+
// The state the 2026-08-26 rent sweep left behind: the thread still tracks
|
|
16
|
+
// both indices, but fiber 1's account was closed. The id has to be
|
|
17
|
+
// accounted for or `thread_close` fails with `MissingFiberAccounts`, and
|
|
18
|
+
// passing the account is the only way to account for it — dropping the id
|
|
19
|
+
// is the thread program's call, and only it can edit `fiber_ids`.
|
|
20
|
+
const accounts = await trackedFiberAccounts(THREAD, [0, 1]);
|
|
21
|
+
expect(accounts).toEqual([
|
|
22
|
+
{ address: FIBER_0, role: AccountRole.WRITABLE },
|
|
23
|
+
{ address: FIBER_1, role: AccountRole.WRITABLE },
|
|
24
|
+
]);
|
|
25
|
+
});
|
|
26
|
+
it('carries every fiber when all of them exist', async () => {
|
|
27
|
+
const accounts = await trackedFiberAccounts(THREAD, [0, 1]);
|
|
28
|
+
expect(accounts.map(a => a.address)).toEqual([FIBER_0, FIBER_1]);
|
|
29
|
+
});
|
|
30
|
+
it('returns nothing when the thread tracks nothing', async () => {
|
|
31
|
+
const accounts = await trackedFiberAccounts(THREAD, []);
|
|
32
|
+
expect(accounts).toEqual([]);
|
|
33
|
+
expect(deriveFiber).not.toHaveBeenCalled();
|
|
34
|
+
});
|
|
35
|
+
it('reads no account state, so it needs no RPC', async () => {
|
|
36
|
+
// Existence is not consulted at all — the addresses are pure computation
|
|
37
|
+
// from the thread and the ids.
|
|
38
|
+
await trackedFiberAccounts(THREAD, [0, 1]);
|
|
39
|
+
expect(deriveFiber).toHaveBeenCalledTimes(2);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=fibers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fibers.test.js","sourceRoot":"","sources":["../../../src/utils/fibers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AAExD,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,MAAM,GAAG,6CAAwD,CAAC;AACxE,MAAM,OAAO,GAAG,8CAAyD,CAAC;AAC1E,MAAM,OAAO,GAAG,6CAAwD,CAAC;AAEzE,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CACjE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAChC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,2EAA2E;QAC3E,mEAAmE;QACnE,yEAAyE;QACzE,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5D,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YACvB,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE;YAChD,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE;SACjD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAExD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,yEAAyE;QACzE,+BAA+B;QAC/B,MAAM,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3C,MAAM,CAAC,WAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/esm/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeContract.d.ts","sourceRoot":"","sources":["../../../src/instructions/closeContract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAwB,KAAK,OAAO,EAAoB,MAAM,aAAa,CAAC;AAKnF,OAAO,
|
|
1
|
+
{"version":3,"file":"closeContract.d.ts","sourceRoot":"","sources":["../../../src/instructions/closeContract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAwB,KAAK,OAAO,EAAoB,MAAM,aAAa,CAAC;AAKnF,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5E,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE5E,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAI3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,KAAK,EAAE,eAAe,CAAC;IAEvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAE5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAEzB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAE/B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAElC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAC1B,OAAO,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAmMjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeContractThread.d.ts","sourceRoot":"","sources":["../../../src/instructions/closeContractThread.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAwB,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"closeContractThread.d.ts","sourceRoot":"","sources":["../../../src/instructions/closeContractThread.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAwB,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAM5D;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,KAAK,EAAE,eAAe,CAAC;IAEvB,6CAA6C;IAC7C,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAE3B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,yBAAyB,EACjC,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAC1B,OAAO,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CA4CjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteContractThread.d.ts","sourceRoot":"","sources":["../../../src/instructions/deleteContractThread.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAwB,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"deleteContractThread.d.ts","sourceRoot":"","sources":["../../../src/instructions/deleteContractThread.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAwB,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAM5D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,KAAK,EAAE,eAAe,CAAC;IAEvB,0EAA0E;IAC1E,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAE3B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,EAClC,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAC1B,OAAO,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CA2CjD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolving a thread's fiber accounts for instructions that close them.
|
|
3
|
+
*/
|
|
4
|
+
import { AccountRole, type Address } from '@solana/kit';
|
|
5
|
+
/**
|
|
6
|
+
* The fiber accounts a close instruction should carry, given what a thread
|
|
7
|
+
* tracks: one per entry in `fiber_ids`, whether or not the account it names
|
|
8
|
+
* still exists.
|
|
9
|
+
*
|
|
10
|
+
* `fiber_ids` records the indices a thread *tracks*, and nothing on chain
|
|
11
|
+
* keeps that list in agreement with the accounts it names — a fiber account
|
|
12
|
+
* can be closed out from under a thread that still lists it, which is what
|
|
13
|
+
* the 2026-08-26 rent sweep did to 623 of them.
|
|
14
|
+
*
|
|
15
|
+
* Reconciling the two is the thread program's job, not ours. It is the only
|
|
16
|
+
* participant that can see the list and the accounts *and* edit the list;
|
|
17
|
+
* dropping an index here asserts it needs no accounting for, which is not
|
|
18
|
+
* ours to assert and which `thread_close` rejects — it requires every tracked
|
|
19
|
+
* id to be accounted for and fails with `MissingFiberAccounts` otherwise.
|
|
20
|
+
* Passing the account is how an id whose account is gone gets accounted for.
|
|
21
|
+
*
|
|
22
|
+
* Deriving an address is pure computation, so this needs no RPC.
|
|
23
|
+
*/
|
|
24
|
+
export declare function trackedFiberAccounts(thread: Address, fiberIds: number[]): Promise<{
|
|
25
|
+
address: Address;
|
|
26
|
+
role: AccountRole.WRITABLE;
|
|
27
|
+
}[]>;
|
|
28
|
+
//# sourceMappingURL=fibers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fibers.d.ts","sourceRoot":"","sources":["../../../src/utils/fibers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAGxD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAA;CAAE,EAAE,CAAC,CAM7D"}
|