@nosana/scenario 2.2.0 → 2.2.1
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/README.md +106 -17
- package/dist/helpers/index.d.ts +3 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +3 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/jobs/close-market.d.ts +3 -0
- package/dist/helpers/jobs/close-market.d.ts.map +1 -0
- package/dist/helpers/jobs/close-market.js +11 -0
- package/dist/helpers/jobs/close-market.js.map +1 -0
- package/dist/helpers/jobs/create-market.d.ts +3 -0
- package/dist/helpers/jobs/create-market.d.ts.map +1 -0
- package/dist/helpers/jobs/create-market.js +14 -0
- package/dist/helpers/jobs/create-market.js.map +1 -0
- package/dist/helpers/jobs/index.d.ts +6 -0
- package/dist/helpers/jobs/index.d.ts.map +1 -0
- package/dist/helpers/jobs/index.js +6 -0
- package/dist/helpers/jobs/index.js.map +1 -0
- package/dist/helpers/jobs/join-market-queue.d.ts +6 -0
- package/dist/helpers/jobs/join-market-queue.d.ts.map +1 -0
- package/dist/helpers/jobs/join-market-queue.js +28 -0
- package/dist/helpers/jobs/join-market-queue.js.map +1 -0
- package/dist/helpers/jobs/list-job.d.ts +3 -0
- package/dist/helpers/jobs/list-job.d.ts.map +1 -0
- package/dist/helpers/jobs/list-job.js +20 -0
- package/dist/helpers/jobs/list-job.js.map +1 -0
- package/dist/helpers/jobs/wait-for-job-state.d.ts +3 -0
- package/dist/helpers/jobs/wait-for-job-state.d.ts.map +1 -0
- package/dist/helpers/jobs/wait-for-job-state.js +14 -0
- package/dist/helpers/jobs/wait-for-job-state.js.map +1 -0
- package/dist/helpers/nodes/finish-job.d.ts +3 -0
- package/dist/helpers/nodes/finish-job.d.ts.map +1 -0
- package/dist/helpers/nodes/finish-job.js +14 -0
- package/dist/helpers/nodes/finish-job.js.map +1 -0
- package/dist/helpers/nodes/index.d.ts +3 -0
- package/dist/helpers/nodes/index.d.ts.map +1 -0
- package/dist/helpers/nodes/index.js +3 -0
- package/dist/helpers/nodes/index.js.map +1 -0
- package/dist/helpers/nodes/verify-job-assigned-to-node.d.ts +6 -0
- package/dist/helpers/nodes/verify-job-assigned-to-node.d.ts.map +1 -0
- package/dist/helpers/nodes/verify-job-assigned-to-node.js +14 -0
- package/dist/helpers/nodes/verify-job-assigned-to-node.js.map +1 -0
- package/dist/helpers/resolve-client.d.ts +3 -0
- package/dist/helpers/resolve-client.d.ts.map +1 -0
- package/dist/helpers/resolve-client.js +5 -0
- package/dist/helpers/resolve-client.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/setup.d.ts +5 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +9 -4
- package/dist/setup.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ npm install --save-dev @nosana/scenario
|
|
|
14
14
|
|
|
15
15
|
```ts
|
|
16
16
|
import { describe, it, expect } from 'vitest';
|
|
17
|
-
import { getScenarioClient } from '@nosana/scenario';
|
|
17
|
+
import { getScenarioClient, createMarket, listJob } from '@nosana/scenario';
|
|
18
18
|
|
|
19
19
|
describe('scenario: basic', () => {
|
|
20
20
|
it('works with the Nosana SDK', async () => {
|
|
@@ -22,9 +22,27 @@ describe('scenario: basic', () => {
|
|
|
22
22
|
const balance = await client.solana.getBalance();
|
|
23
23
|
expect(balance).toBeGreaterThan(0);
|
|
24
24
|
});
|
|
25
|
+
|
|
26
|
+
it('creates a market and lists a job', async () => {
|
|
27
|
+
const marketAddress = await createMarket();
|
|
28
|
+
const jobAddress = await listJob({ market: marketAddress });
|
|
29
|
+
expect(jobAddress).toBeDefined();
|
|
30
|
+
});
|
|
25
31
|
});
|
|
26
32
|
```
|
|
27
33
|
|
|
34
|
+
### Multiple Clients
|
|
35
|
+
|
|
36
|
+
Use the `key` option to create independently funded clients — useful for multi-party scenarios:
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
const deployer = await getScenarioClient(); // cached as 'default'
|
|
40
|
+
const node = await getScenarioClient({ key: 'node' }); // separate wallet
|
|
41
|
+
const node2 = await getScenarioClient({ key: 'node2' }); // another separate wallet
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Each unique key gets its own keypair, SOL airdrop, and NOS mint on localnet.
|
|
45
|
+
|
|
28
46
|
### Run Against Different Networks
|
|
29
47
|
|
|
30
48
|
No code changes needed — just set environment variables:
|
|
@@ -87,20 +105,11 @@ pnpm run localnet:down
|
|
|
87
105
|
|
|
88
106
|
### `getScenarioClient(options?): Promise<NosanaClient>`
|
|
89
107
|
|
|
90
|
-
Returns a cached `NosanaClient` for the target network.
|
|
91
|
-
|
|
92
|
-
The network is determined by (in order of precedence):
|
|
93
|
-
1. `options.network`
|
|
94
|
-
2. `NOSANA_NETWORK` environment variable
|
|
95
|
-
3. `'localnet'` (default)
|
|
96
|
-
|
|
97
|
-
The wallet is determined by (in order of precedence):
|
|
98
|
-
1. `options.wallet`
|
|
99
|
-
2. `NOSANA_WALLET` environment variable (path to a Solana keypair JSON file)
|
|
100
|
-
3. Auto-generated keypair (localnet only)
|
|
108
|
+
Returns a cached `NosanaClient` for the target network. Each unique `key` gets its own independently funded client instance.
|
|
101
109
|
|
|
102
110
|
| Option | Type | Default | Description |
|
|
103
111
|
|--------|------|---------|-------------|
|
|
112
|
+
| `key` | `string` | `'default'` | Cache key — each unique key creates a separate client with its own wallet |
|
|
104
113
|
| `network` | `'localnet' \| 'devnet' \| 'mainnet'` | `NOSANA_NETWORK` env or `'localnet'` | Target network |
|
|
105
114
|
| `wallet` | `Wallet` | `NOSANA_WALLET` env or auto-generated (localnet) | Wallet signer |
|
|
106
115
|
| `airdropAmount` | `bigint` | `2_000_000_000n` | SOL airdrop amount (localnet only) |
|
|
@@ -115,19 +124,99 @@ The wallet is determined by (in order of precedence):
|
|
|
115
124
|
|
|
116
125
|
Returns a cached `NosanaClient` connected to localnet. Equivalent to `getScenarioClient({ network: 'localnet' })`.
|
|
117
126
|
|
|
118
|
-
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
### Helper Functions
|
|
130
|
+
|
|
131
|
+
All helper functions include built-in vitest `expect` assertions and accept an optional `clientOverride` parameter. When omitted, they use the default scenario client (`getScenarioClient()`).
|
|
132
|
+
|
|
133
|
+
#### Jobs
|
|
134
|
+
|
|
135
|
+
##### `createMarket(params?, clientOverride?): Promise<Address>`
|
|
136
|
+
|
|
137
|
+
Create a market on-chain and return its address.
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
const marketAddress = await createMarket();
|
|
141
|
+
const marketAddress = await createMarket({ jobPrice: 1000n });
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
##### `closeMarket(marketAddress, clientOverride?): Promise<void>`
|
|
145
|
+
|
|
146
|
+
Close an existing market.
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
await closeMarket(marketAddress.toString());
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
##### `listJob(params, clientOverride?): Promise<Address>`
|
|
153
|
+
|
|
154
|
+
List (submit) a job to a market and return the job address. `timeout` defaults to `3600` and `ipfsHash` defaults to a test hash — only `market` is required.
|
|
155
|
+
|
|
156
|
+
```ts
|
|
157
|
+
const jobAddress = await listJob({ market: marketAddress });
|
|
158
|
+
const jobAddress = await listJob({ market: marketAddress, timeout: 7200 });
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
##### `joinMarketQueue(marketAddress, options?, clientOverride?): Promise<void>`
|
|
162
|
+
|
|
163
|
+
Join a market's node queue. Verifies the node is queued by default.
|
|
164
|
+
|
|
165
|
+
```ts
|
|
166
|
+
const nodeClient = await getScenarioClient({ key: 'node' });
|
|
167
|
+
await joinMarketQueue(marketAddress.toString(), {}, nodeClient);
|
|
168
|
+
|
|
169
|
+
// Disable queue verification
|
|
170
|
+
await joinMarketQueue(marketAddress.toString(), { verifyQueued: false }, nodeClient);
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
##### `waitForJobState(jobAddress, expectedState, clientOverride?): Promise<void>`
|
|
174
|
+
|
|
175
|
+
Poll until a job reaches the expected state using vitest's `expect.poll`.
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
import { JobState } from '@nosana/scenario';
|
|
179
|
+
|
|
180
|
+
await waitForJobState(jobAddress.toString(), JobState.RUNNING);
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
#### Nodes
|
|
184
|
+
|
|
185
|
+
##### `finishJob(jobAddress, clientOverride?): Promise<void>`
|
|
186
|
+
|
|
187
|
+
Finish (complete) a job as a node, submitting a default IPFS results hash.
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
const nodeClient = await getScenarioClient({ key: 'node' });
|
|
191
|
+
await finishJob(jobAddress.toString(), nodeClient);
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
##### `verifyJobAssignedToNode(jobAddress, options?, clientOverride?): Promise<void>`
|
|
195
|
+
|
|
196
|
+
Assert that a job is assigned to the client's wallet. Optionally verify the job state.
|
|
197
|
+
|
|
198
|
+
```ts
|
|
199
|
+
const nodeClient = await getScenarioClient({ key: 'node' });
|
|
200
|
+
await verifyJobAssignedToNode(jobAddress.toString(), { expectedState: 1 }, nodeClient);
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
### Utilities
|
|
206
|
+
|
|
207
|
+
#### `mintNosTo(client, recipient, amount): Promise<void>`
|
|
119
208
|
|
|
120
209
|
Mint NOS tokens to any address on the localnet.
|
|
121
210
|
|
|
122
|
-
|
|
211
|
+
#### `ensureLocalnetMint(client): Promise<{ mintAuthority, mintAddress }>`
|
|
123
212
|
|
|
124
213
|
Ensures the NOS mint exists on localnet. Creates it if it doesn't exist.
|
|
125
214
|
|
|
126
|
-
|
|
215
|
+
#### `executeInstructionPlan(client, plan): Promise<void>`
|
|
127
216
|
|
|
128
217
|
Execute a Solana instruction plan using the client's wallet as fee payer.
|
|
129
218
|
|
|
130
|
-
|
|
219
|
+
#### `defineScenarioVitestConfig(overrides?): object`
|
|
131
220
|
|
|
132
221
|
Returns a Vitest config object with the scenario setup file pre-configured.
|
|
133
222
|
|
|
@@ -138,4 +227,4 @@ Returns a Vitest config object with the scenario setup file pre-configured.
|
|
|
138
227
|
|
|
139
228
|
### Re-exports from `@nosana/kit`
|
|
140
229
|
|
|
141
|
-
- `NosanaNetwork`, `type NosanaClient`, `type Wallet`, `type Address`
|
|
230
|
+
- `NosanaNetwork`, `JobState`, `type NosanaClient`, `type Wallet`, `type Address`
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createMarket, closeMarket, listJob, joinMarketQueue, waitForJobState, type JoinMarketQueueOptions, } from './jobs/index.js';
|
|
2
|
+
export { finishJob, verifyJobAssignedToNode, type VerifyJobAssignedOptions, } from './nodes/index.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,EACf,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,SAAS,EACT,uBAAuB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,GAEhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,SAAS,EACT,uBAAuB,GAExB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-market.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/close-market.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzD,wBAAsB,WAAW,CAC/B,aAAa,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { address } from '@nosana/kit';
|
|
2
|
+
import { expect } from 'vitest';
|
|
3
|
+
import { resolveClient } from '../resolve-client.js';
|
|
4
|
+
export async function closeMarket(marketAddress, clientOverride) {
|
|
5
|
+
const client = await resolveClient(clientOverride);
|
|
6
|
+
const market = address(marketAddress);
|
|
7
|
+
const instruction = await client.jobs.closeMarket({ market });
|
|
8
|
+
const tx = await client.solana.buildSignAndSend(instruction);
|
|
9
|
+
expect(tx).not.toBeNull();
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=close-market.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-market.js","sourceRoot":"","sources":["../../../src/helpers/jobs/close-market.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,aAAqB,EACrB,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE7D,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-market.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/create-market.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKrE,wBAAsB,YAAY,CAChC,MAAM,GAAE,UAAe,EACvB,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,OAAO,CAAC,CAYlB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { JobsClient } from '@nosana/kit';
|
|
2
|
+
import { expect } from 'vitest';
|
|
3
|
+
import { resolveClient } from '../resolve-client.js';
|
|
4
|
+
export async function createMarket(params = {}, clientOverride) {
|
|
5
|
+
const client = await resolveClient(clientOverride);
|
|
6
|
+
const instruction = await client.jobs.createMarket(params);
|
|
7
|
+
const tx = await client.solana.buildSignAndSend(instruction);
|
|
8
|
+
const parsed = JobsClient.parseOpenInstruction(instruction);
|
|
9
|
+
const marketAddress = parsed.accounts.market.address;
|
|
10
|
+
expect(marketAddress).toBeDefined();
|
|
11
|
+
expect(tx).not.toBeNull();
|
|
12
|
+
return marketAddress;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=create-market.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-market.js","sourceRoot":"","sources":["../../../src/helpers/jobs/create-market.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAqB,EAAE,EACvB,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IAErD,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAE1B,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createMarket } from './create-market.js';
|
|
2
|
+
export { closeMarket } from './close-market.js';
|
|
3
|
+
export { listJob } from './list-job.js';
|
|
4
|
+
export { joinMarketQueue, type JoinMarketQueueOptions } from './join-market-queue.js';
|
|
5
|
+
export { waitForJobState } from './wait-for-job-state.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createMarket } from './create-market.js';
|
|
2
|
+
export { closeMarket } from './close-market.js';
|
|
3
|
+
export { listJob } from './list-job.js';
|
|
4
|
+
export { joinMarketQueue } from './join-market-queue.js';
|
|
5
|
+
export { waitForJobState } from './wait-for-job-state.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAA+B,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type NosanaClient } from '@nosana/kit';
|
|
2
|
+
export interface JoinMarketQueueOptions {
|
|
3
|
+
verifyQueued?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function joinMarketQueue(marketAddress: string, options?: JoinMarketQueueOptions, clientOverride?: NosanaClient): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=join-market-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-market-queue.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/join-market-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzD,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,sBAA2B,EACpC,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { address } from '@nosana/kit';
|
|
2
|
+
import { expect } from 'vitest';
|
|
3
|
+
import { resolveClient } from '../resolve-client.js';
|
|
4
|
+
export async function joinMarketQueue(marketAddress, options = {}, clientOverride) {
|
|
5
|
+
const client = await resolveClient(clientOverride);
|
|
6
|
+
const market = address(marketAddress);
|
|
7
|
+
const { verifyQueued = true } = options;
|
|
8
|
+
const instruction = await client.jobs.work({ market });
|
|
9
|
+
try {
|
|
10
|
+
await client.solana.buildSignAndSend(instruction);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const err = error;
|
|
14
|
+
const errorCode = err?.details?.cause?.context?.code;
|
|
15
|
+
const errorLogs = err?.context?.logs || [];
|
|
16
|
+
const hasNodeAlreadyQueued = errorCode === 6014 || errorLogs.some((log) => log.includes('NodeAlreadyQueued'));
|
|
17
|
+
if (!hasNodeAlreadyQueued) {
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (verifyQueued) {
|
|
22
|
+
const marketAfter = await client.jobs.market(market);
|
|
23
|
+
const nodeAddress = client.wallet.address.toString();
|
|
24
|
+
const queueAddresses = marketAfter.queue.map((addr) => addr.toString());
|
|
25
|
+
expect(queueAddresses).toContain(nodeAddress);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=join-market-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-market-queue.js","sourceRoot":"","sources":["../../../src/helpers/jobs/join-market-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAMrD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,aAAqB,EACrB,UAAkC,EAAE,EACpC,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAExC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,KAGX,CAAC;QACF,MAAM,SAAS,GAAG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;QACrD,MAAM,SAAS,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;QAC3C,MAAM,oBAAoB,GACxB,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAEnF,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtD,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Address, ListParams, NosanaClient } from '@nosana/kit';
|
|
2
|
+
export declare function listJob(params: Omit<ListParams, 'timeout' | 'ipfsHash'> & Partial<Pick<ListParams, 'timeout' | 'ipfsHash'>>, clientOverride?: NosanaClient): Promise<Address>;
|
|
3
|
+
//# sourceMappingURL=list-job.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-job.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/list-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQrE,wBAAsB,OAAO,CAC3B,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC,GAC9C,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC,EACnD,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,OAAO,CAAC,CAgBlB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { JobsClient } from '@nosana/kit';
|
|
2
|
+
import { expect } from 'vitest';
|
|
3
|
+
import { resolveClient } from '../resolve-client.js';
|
|
4
|
+
const DEFAULT_TIMEOUT = 3600;
|
|
5
|
+
const DEFAULT_IPFS_HASH = 'QmVp8m3Uq1Cm6JJ3NsuTMSGLNnqXa1mC85uV7YxBREQ78p';
|
|
6
|
+
export async function listJob(params, clientOverride) {
|
|
7
|
+
const client = await resolveClient(clientOverride);
|
|
8
|
+
const instruction = await client.jobs.list({
|
|
9
|
+
timeout: DEFAULT_TIMEOUT,
|
|
10
|
+
ipfsHash: DEFAULT_IPFS_HASH,
|
|
11
|
+
...params,
|
|
12
|
+
});
|
|
13
|
+
const tx = await client.solana.buildSignAndSend(instruction);
|
|
14
|
+
const parsed = JobsClient.parseListInstruction(instruction);
|
|
15
|
+
const jobAddress = parsed.accounts.job.address;
|
|
16
|
+
expect(jobAddress).toBeDefined();
|
|
17
|
+
expect(tx).not.toBeNull();
|
|
18
|
+
return jobAddress;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=list-job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-job.js","sourceRoot":"","sources":["../../../src/helpers/jobs/list-job.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,iBAAiB,GAAG,gDAAgD,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MACmD,EACnD,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACzC,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,iBAAiB;QAC3B,GAAG,MAAM;KACV,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;IAE/C,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAE1B,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-for-job-state.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/wait-for-job-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAInE,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,QAAQ,EACvB,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CAaf"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { address } from '@nosana/kit';
|
|
2
|
+
import { expect } from 'vitest';
|
|
3
|
+
import { resolveClient } from '../resolve-client.js';
|
|
4
|
+
export async function waitForJobState(jobAddress, expectedState, clientOverride) {
|
|
5
|
+
const client = await resolveClient(clientOverride);
|
|
6
|
+
const job = address(jobAddress);
|
|
7
|
+
await expect
|
|
8
|
+
.poll(async () => {
|
|
9
|
+
const fetched = await client.jobs.get(job);
|
|
10
|
+
return fetched?.state;
|
|
11
|
+
}, { message: `Waiting for job to reach ${expectedState} state` })
|
|
12
|
+
.toBe(expectedState);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=wait-for-job-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-for-job-state.js","sourceRoot":"","sources":["../../../src/helpers/jobs/wait-for-job-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA+B,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,aAAuB,EACvB,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEhC,MAAM,MAAM;SACT,IAAI,CACH,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,OAAO,EAAE,KAAK,CAAC;IACxB,CAAC,EACD,EAAE,OAAO,EAAE,4BAA4B,aAAa,QAAQ,EAAE,CAC/D;SACA,IAAI,CAAC,aAAa,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finish-job.d.ts","sourceRoot":"","sources":["../../../src/helpers/nodes/finish-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzD,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { address } from '@nosana/kit';
|
|
2
|
+
import { expect } from 'vitest';
|
|
3
|
+
import { resolveClient } from '../resolve-client.js';
|
|
4
|
+
export async function finishJob(jobAddress, clientOverride) {
|
|
5
|
+
const client = await resolveClient(clientOverride);
|
|
6
|
+
const job = address(jobAddress);
|
|
7
|
+
const instruction = await client.jobs.finish({
|
|
8
|
+
job,
|
|
9
|
+
ipfsResultsHash: 'QmV2iq3gexzSwPAbhBAPVDip7Pu6k7whECUa4wzUjnPtdA',
|
|
10
|
+
});
|
|
11
|
+
const tx = await client.solana.buildSignAndSend(instruction);
|
|
12
|
+
expect(tx).not.toBeNull();
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=finish-job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finish-job.js","sourceRoot":"","sources":["../../../src/helpers/nodes/finish-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB,EAAE,cAA6B;IAC/E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEhC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3C,GAAG;QACH,eAAe,EAAE,gDAAgD;KAClE,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE7D,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/helpers/nodes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,uBAAuB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/nodes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,uBAAuB,GAExB,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type NosanaClient } from '@nosana/kit';
|
|
2
|
+
export type VerifyJobAssignedOptions = {
|
|
3
|
+
expectedState?: number;
|
|
4
|
+
};
|
|
5
|
+
export declare function verifyJobAssignedToNode(jobAddress: string, options?: VerifyJobAssignedOptions, clientOverride?: NosanaClient): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=verify-job-assigned-to-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-job-assigned-to-node.d.ts","sourceRoot":"","sources":["../../../src/helpers/nodes/verify-job-assigned-to-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzD,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,wBAAwB,EAClC,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CAWf"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { address } from '@nosana/kit';
|
|
2
|
+
import { expect } from 'vitest';
|
|
3
|
+
import { resolveClient } from '../resolve-client.js';
|
|
4
|
+
export async function verifyJobAssignedToNode(jobAddress, options, clientOverride) {
|
|
5
|
+
const client = await resolveClient(clientOverride);
|
|
6
|
+
const job = address(jobAddress);
|
|
7
|
+
const { state, node } = await client.jobs.get(job);
|
|
8
|
+
const nodeAddress = client.wallet.address.toString();
|
|
9
|
+
expect(node).toBe(nodeAddress);
|
|
10
|
+
if (options?.expectedState !== undefined) {
|
|
11
|
+
expect(state).toBe(options.expectedState);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=verify-job-assigned-to-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-job-assigned-to-node.js","sourceRoot":"","sources":["../../../src/helpers/nodes/verify-job-assigned-to-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAMrD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAAkB,EAClB,OAAkC,EAClC,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAEtD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE/B,IAAI,OAAO,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-client.d.ts","sourceRoot":"","sources":["../../src/helpers/resolve-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wBAAsB,aAAa,CAAC,cAAc,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAExF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-client.js","sourceRoot":"","sources":["../../src/helpers/resolve-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,cAA6B;IAC/D,OAAO,cAAc,IAAI,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC;AACvD,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
export { getScenarioClient, getLocalnetClient, type ScenarioClientOptions, type LocalnetClientOptions, } from './setup.js';
|
|
2
2
|
export { mintNosTo, ensureLocalnetMint, executeInstructionPlan, loadMintKeypairSigner, loadMintAuthoritySigner, } from './utils.js';
|
|
3
|
+
export { createMarket, closeMarket, listJob, joinMarketQueue, waitForJobState, finishJob, verifyJobAssignedToNode, type JoinMarketQueueOptions, type VerifyJobAssignedOptions, } from './helpers/index.js';
|
|
3
4
|
export { scenarioVitestSetup } from './vitest-setup-fn.js';
|
|
4
5
|
export { defineScenarioVitestConfig } from './vitest-config.js';
|
|
5
6
|
export { startLocalnet, stopLocalnet, LOCALNET_RPC_ENDPOINT, LOCALNET_WS_ENDPOINT, type LocalnetOptions, } from '@nosana/localnet';
|
|
6
7
|
export type { NosanaClient, Wallet, Address } from '@nosana/kit';
|
|
7
|
-
export { NosanaNetwork } from '@nosana/kit';
|
|
8
|
+
export { NosanaNetwork, JobState } from '@nosana/kit';
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EACL,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,EACf,SAAS,EACT,uBAAuB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EACL,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
export { getScenarioClient, getLocalnetClient, } from './setup.js';
|
|
2
2
|
export { mintNosTo, ensureLocalnetMint, executeInstructionPlan, loadMintKeypairSigner, loadMintAuthoritySigner, } from './utils.js';
|
|
3
|
+
export { createMarket, closeMarket, listJob, joinMarketQueue, waitForJobState, finishJob, verifyJobAssignedToNode, } from './helpers/index.js';
|
|
3
4
|
export { scenarioVitestSetup } from './vitest-setup-fn.js';
|
|
4
5
|
export { defineScenarioVitestConfig } from './vitest-config.js';
|
|
5
6
|
// Re-export localnet helpers for convenience
|
|
6
7
|
export { startLocalnet, stopLocalnet, LOCALNET_RPC_ENDPOINT, LOCALNET_WS_ENDPOINT, } from '@nosana/localnet';
|
|
7
|
-
export { NosanaNetwork } from '@nosana/kit';
|
|
8
|
+
export { NosanaNetwork, JobState } from '@nosana/kit';
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAGlB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhE,6CAA6C;AAC7C,OAAO,EACL,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAGlB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,EACf,SAAS,EACT,uBAAuB,GAGxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhE,6CAA6C;AAC7C,OAAO,EACL,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/setup.d.ts
CHANGED
|
@@ -29,6 +29,11 @@ export interface ScenarioClientOptions extends LocalnetClientOptions {
|
|
|
29
29
|
* pointing to a Solana keypair JSON file).
|
|
30
30
|
*/
|
|
31
31
|
network?: 'localnet' | 'devnet' | 'mainnet';
|
|
32
|
+
/**
|
|
33
|
+
* Cache key for the client instance. Each unique key gets its own
|
|
34
|
+
* independently funded client. Defaults to `'default'`.
|
|
35
|
+
*/
|
|
36
|
+
key?: string;
|
|
32
37
|
}
|
|
33
38
|
/**
|
|
34
39
|
* Returns a cached Nosana client connected to localnet.
|
package/dist/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IAE5C;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAmCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CAKxF;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CAWxF"}
|
package/dist/setup.js
CHANGED
|
@@ -74,17 +74,22 @@ async function loadWalletFromFile(filePath) {
|
|
|
74
74
|
* ```
|
|
75
75
|
*/
|
|
76
76
|
export function getScenarioClient(options) {
|
|
77
|
-
if (!globalWithScenario.
|
|
78
|
-
globalWithScenario.
|
|
77
|
+
if (!globalWithScenario.__NOSANA_SCENARIO_CLIENTS__) {
|
|
78
|
+
globalWithScenario.__NOSANA_SCENARIO_CLIENTS__ = new Map();
|
|
79
79
|
}
|
|
80
|
-
|
|
80
|
+
const resolvedKey = options?.key ?? 'default';
|
|
81
|
+
const clients = globalWithScenario.__NOSANA_SCENARIO_CLIENTS__;
|
|
82
|
+
if (!clients.has(resolvedKey)) {
|
|
83
|
+
clients.set(resolvedKey, createScenarioClientInstance(options));
|
|
84
|
+
}
|
|
85
|
+
return clients.get(resolvedKey);
|
|
81
86
|
}
|
|
82
87
|
async function createScenarioClientInstance(options) {
|
|
83
88
|
const network = options?.network ??
|
|
84
89
|
process.env.NOSANA_NETWORK ??
|
|
85
90
|
'localnet';
|
|
86
91
|
if (network === 'localnet') {
|
|
87
|
-
return
|
|
92
|
+
return createLocalnetClientInstance(options);
|
|
88
93
|
}
|
|
89
94
|
const wallet = options?.wallet ?? (await resolveWalletFromEnv());
|
|
90
95
|
if (!wallet) {
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GAId,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GAId,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAoDvC,MAAM,kBAAkB,GAAG,UAAsC,CAAC;AAClE,MAAM,kBAAkB,GAAG,UAAuC,CAAC;AAEnE,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,KAAK,UAAU,4BAA4B,CACzC,UAAiC,EAAE;IAEnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,qBAAqB,EAAE,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;YAC1B,SAAS,EAAE,MAAM,CAAC,OAAO;YACzB,MAAM,EAAE,OAAO,CAAC,aAAa,IAAI,WAAc;SAChD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,IAAI,WAAc,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA+B;IAC/D,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,EAAE,CAAC;QACnD,kBAAkB,CAAC,0BAA0B,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,kBAAkB,CAAC,0BAA0B,CAAC;AACvD,CAAC;AAED,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IAChD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,OAAO,4BAA4B,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA+B;IAC/D,IAAI,CAAC,kBAAkB,CAAC,2BAA2B,EAAE,CAAC;QACpD,kBAAkB,CAAC,2BAA2B,GAAG,IAAI,GAAG,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,EAAE,GAAG,IAAI,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAG,kBAAkB,CAAC,2BAA2B,CAAC;IAC/D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,4BAA4B,CACzC,OAA+B;IAE/B,MAAM,OAAO,GACX,OAAO,EAAE,OAAO;QACf,OAAO,CAAC,GAAG,CAAC,cAAmD;QAChE,UAAU,CAAC;IAEb,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,oBAAoB,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,kCAAkC,OAAO,IAAI;YAC3C,uEAAuE;YACvE,0DAA0D,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC;IAC3F,OAAO,kBAAkB,CAAC,aAAa,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC7C,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAC;AACxC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nosana/scenario",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "Nosana scenario test helpers: network-aware client setup for localnet, devnet, and mainnet",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"package.json",
|
|
60
60
|
"README.md"
|
|
61
61
|
],
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "9b58da22f18b0391ef29d2657055b0ac0b9c53c6"
|
|
63
63
|
}
|