@vercora-protocol/sdk 0.2.1 → 0.2.3
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/CHANGELOG.md +14 -0
- package/README.md +4 -4
- package/agents/skill.md +1 -1
- package/dist/client.d.ts +8 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +119 -15
- package/dist/client.js.map +1 -1
- package/dist/generated/vercora.d.ts +37 -6
- package/dist/generated/vercora.d.ts.map +1 -1
- package/dist/idl/vercora.json +37 -6
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/pda.d.ts +6 -0
- package/dist/pda.d.ts.map +1 -1
- package/dist/pda.js +12 -0
- package/dist/pda.js.map +1 -1
- package/dist/resolverDecode.d.ts +30 -0
- package/dist/resolverDecode.d.ts.map +1 -0
- package/dist/resolverDecode.js +63 -0
- package/dist/resolverDecode.js.map +1 -0
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,20 @@ All notable changes to `@vercora-protocol/sdk` are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
7
|
|
|
8
|
+
### [0.2.3](https://github.com/vercora/vercora-anchor/compare/v0.2.2...v0.2.3) (2026-04-22)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **all:** fix resolver resolution ([dc907cf](https://github.com/vercora/vercora-anchor/commit/dc907cf31bdffb960d1e9f7ddc322b8d1b85abcd))
|
|
14
|
+
|
|
15
|
+
### [0.2.2](https://github.com/vercora/vercora-anchor/compare/v0.2.1...v0.2.2) (2026-04-22)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Features
|
|
19
|
+
|
|
20
|
+
* **anchor:** update upsert_platform to be updated only by global authorities ([7103db2](https://github.com/vercora/vercora-anchor/commit/7103db232165b11a17de2a9ebc3126206ada302d))
|
|
21
|
+
|
|
8
22
|
### [0.2.1](https://github.com/vercora/vercora-anchor/compare/v0.2.0...v0.2.1) (2026-04-21)
|
|
9
23
|
|
|
10
24
|
|
package/README.md
CHANGED
|
@@ -86,7 +86,7 @@ Public properties: **`program`**, **`connection`**, **`globalConfig`** (PDA).
|
|
|
86
86
|
| `createMarketFull(creator, collateralMint, creatorFeeAccount, resolverPubkeys, params)` | Runs create → outcomes → resolvers (+ mints **or** pari state in one flow). |
|
|
87
87
|
| `updateParimutuelState(marketPda, params)` | Creator updates penalty split, **`isEarlyWithdrawAllowed`**, **`maxWalletOutcomeInvestment`**, and **`isWalletOutcomeStakeExact`** (open pari pool). |
|
|
88
88
|
|
|
89
|
-
**`CreateMarketParams`:** requires **`platformId`** (**`> 0`**, BN) with a registered platform + **`upsertPlatformProfile`** (resolver stake, challenge window, and refute bond are set on the profile — not per market). **`CreateMarketParams` (pari-mutuel):** optional **`isEarlyWithdrawAllowed`** (default **`true`**). Optional **`maxWalletOutcomeInvestment`** (`BN`, **`0`** = unlimited per-wallet per-outcome net stake cap in collateral base units). Optional **`isWalletOutcomeStakeExact`**: when **`true`** (parimutuel only), each stake must bring the wallet’s net on that outcome to **exactly** `maxWalletOutcomeInvestment`; requires **`maxWalletOutcomeInvestment > 0`**. Setting exact mode on a complete-set market fails with **`InvalidWalletOutcomeStakeExactConfig`**. Ignored for complete-set markets otherwise.
|
|
89
|
+
**`CreateMarketParams`:** requires **`platformId`** (**`> 0`**, BN) with a registered platform + **`upsertPlatformProfile`** (global config authority; resolver stake, challenge window, and refute bond are set on the profile — not per market). **`CreateMarketParams` (pari-mutuel):** optional **`isEarlyWithdrawAllowed`** (default **`true`**). Optional **`maxWalletOutcomeInvestment`** (`BN`, **`0`** = unlimited per-wallet per-outcome net stake cap in collateral base units). Optional **`isWalletOutcomeStakeExact`**: when **`true`** (parimutuel only), each stake must bring the wallet’s net on that outcome to **exactly** `maxWalletOutcomeInvestment`; requires **`maxWalletOutcomeInvestment > 0`**. Setting exact mode on a complete-set market fails with **`InvalidWalletOutcomeStakeExactConfig`**. Ignored for complete-set markets otherwise.
|
|
90
90
|
|
|
91
91
|
**`UpdateParimutuelStateParams`:** every call writes **all** fields — pass **current** values from **`fetchMarket`** / **`fetchParimutuelState`** for anything you are not changing. Includes **`earlyWithdrawPenaltyBps`**, **`penaltyKeptInPoolBps`**, **`isEarlyWithdrawAllowed`**, **`maxWalletOutcomeInvestment`**, **`isWalletOutcomeStakeExact`**. If **`isWalletOutcomeStakeExact`** is **`true`**, **`maxWalletOutcomeInvestment`** must be **> 0** (same rule as create). Use this to tighten or relax per-wallet caps and to toggle exact vs ceiling mode **after** launch (market must still be open and not resolved/voided).
|
|
92
92
|
|
|
@@ -157,7 +157,7 @@ See **[Resolution approval flow](#resolution-approval-flow-propose--challenge--c
|
|
|
157
157
|
| `fetchParimutuelActiveStakesBatch(marketPda, user, outcomeCount)` | Active stakes per outcome. |
|
|
158
158
|
| `computeParimutuelOdds(state, outcomeCount)` | Implied probs + payout multipliers. |
|
|
159
159
|
| `fetchResolver(marketPda, index)` | One resolver account. |
|
|
160
|
-
| `fetchAllResolvers(marketPda, numResolvers)`
|
|
160
|
+
| `fetchAllResolvers(marketPda, numResolvers, { debug })` | Initialized resolver slots; optional `debug: true` logs PDA presence to the console. |
|
|
161
161
|
|
|
162
162
|
### Profiles
|
|
163
163
|
|
|
@@ -166,7 +166,7 @@ See **[Resolution approval flow](#resolution-approval-flow-propose--challenge--c
|
|
|
166
166
|
| `upsertUserProfile(params)` | Display name / URL. |
|
|
167
167
|
| `closeUserProfile()` | Close caller’s profile. |
|
|
168
168
|
| `verifyUserProfile(params)` | Verifier marks verified. |
|
|
169
|
-
| `upsertPlatformProfile(params)` | Platform profile (scoped by `platform_id`). |
|
|
169
|
+
| `upsertPlatformProfile(params)` | Platform profile (scoped by `platform_id`); **global config** primary or secondary authority must sign. |
|
|
170
170
|
| `closePlatformProfile(platformId)` | Close profile. |
|
|
171
171
|
| `verifyPlatformProfile(params)` | Verify platform profile. |
|
|
172
172
|
|
|
@@ -488,7 +488,7 @@ Settlement is **two-phase**: first a **proposal** is recorded on `ResolutionStat
|
|
|
488
488
|
On-chain, **`platform_id`** is **`u32`** and **`category_id`** is **`u8`** in `CreateMarketArgs` (not pubkeys).
|
|
489
489
|
|
|
490
490
|
1. **`register_platform`** — assigns the next id from `GlobalConfig.next_platform_id` (starts at **1**); PDA `["platform", platform_id le u32]`.
|
|
491
|
-
2. **`upsert_platform_profile`** — metadata + **resolution policy** (`resolver_stake`, `challenge_window_secs`, `refute_bond`).
|
|
491
|
+
2. **`upsert_platform_profile`** — metadata + **resolution policy** (`resolver_stake`, `challenge_window_secs`, `refute_bond`); signed by **global config** primary or secondary authority.
|
|
492
492
|
3. **`create_market_category`** — `category_id` must equal `PlatformRegistry.next_category_id`; PDA `["market-category", platform_id, category_id]`.
|
|
493
493
|
4. **`create_market`** — requires **`platform_id > 0`**, **`platform_registry`**, **`platform_profile`**, **`resolution_state`**, **`resolver_stake_vault`**. Use **`category_id == 0`** for uncategorized markets (omit **`market_category`** account). Non-zero **`category_id`** requires an active **`market_category`** PDA for that platform.
|
|
494
494
|
|
package/agents/skill.md
CHANGED
|
@@ -79,7 +79,7 @@ Paths are under `node_modules/@vercora-protocol/sdk/` after install.
|
|
|
79
79
|
|
|
80
80
|
## Quick guardrails (resolution)
|
|
81
81
|
|
|
82
|
-
- **`create_market`** requires **`platform_id > 0`**: register a platform, **`upsert_platform_profile
|
|
82
|
+
- **`create_market`** requires **`platform_id > 0`**: register a platform, **`upsert_platform_profile`** (global config primary or secondary authority signs), and pass **`platform_registry`**, **`platform_profile`**, **`resolution_state`**, **`resolver_stake_vault`** (SDK methods wire PDAs when you use `PredictionMarketClient`).
|
|
83
83
|
- Settlement is **two-phase**: **`finalizeResolution`** records a **proposal** on **`fetchResolutionState`** (`proposed_outcome`, `proposal_ts`). It does **not** set **`winningOutcomeIndex`** on the market.
|
|
84
84
|
- After **`challenge_window_secs`** from **`fetchPlatformProfile(platformId)`** (same value used on-chain for the challenge window), call **`confirmResolution`** to finalize **`Market.winningOutcomeIndex`**. Until then, traders cannot **`redeemWinning`** / **`parimutuelClaim`** as “resolved.”
|
|
85
85
|
- Optional dispute: **`openRefute`** (bond + alternative outcome) during the window; **`resolveRefute`** dismisses refutes (authorized signers per program). **`confirmResolution`** fails while a dispute blocks it.
|
package/dist/client.d.ts
CHANGED
|
@@ -309,7 +309,7 @@ export declare class PredictionMarketClient {
|
|
|
309
309
|
fetchUserProfile(wallet: PublicKey): Promise<UserProfileAccount | null>;
|
|
310
310
|
/**
|
|
311
311
|
* Create or update `PlatformProfile` for `params.platformId`.
|
|
312
|
-
* Caller must be
|
|
312
|
+
* Caller must be global config primary or secondary authority.
|
|
313
313
|
*/
|
|
314
314
|
upsertPlatformProfile(params: UpsertPlatformProfileParams, opts?: anchor.web3.ConfirmOptions): Promise<string>;
|
|
315
315
|
closePlatformProfile(platformId: BN | number, opts?: anchor.web3.ConfirmOptions): Promise<string>;
|
|
@@ -345,9 +345,15 @@ export declare class PredictionMarketClient {
|
|
|
345
345
|
* Fetch all initialized resolver accounts for a market in parallel.
|
|
346
346
|
* Slots whose PDA has never been created are omitted from the result.
|
|
347
347
|
*
|
|
348
|
+
* Resolver PDAs are **not** created in `create_market`; they appear after
|
|
349
|
+
* `initialize_market_resolver` (e.g. `initializeMarketResolverSlots` in the SDK).
|
|
350
|
+
*
|
|
348
351
|
* @param numResolvers - Value of `MarketAccount.numResolvers` (or an upper bound like 8).
|
|
352
|
+
* @param options.debug - When true, logs each slot (`console.info` / `console.warn`): PDA, existence, owner vs program id, decode outcome, RPC endpoint.
|
|
349
353
|
*/
|
|
350
|
-
fetchAllResolvers(market: PublicKey, numResolvers: number
|
|
354
|
+
fetchAllResolvers(market: PublicKey, numResolvers: number, options?: {
|
|
355
|
+
debug?: boolean;
|
|
356
|
+
}): Promise<{
|
|
351
357
|
index: number;
|
|
352
358
|
resolverPubkey: PublicKey;
|
|
353
359
|
}[]>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,UAAU,EACV,SAAS,EAOV,MAAM,iBAAiB,CAAC;AASzB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -39,6 +39,7 @@ const anchor_1 = require("@coral-xyz/anchor");
|
|
|
39
39
|
const web3_js_1 = require("@solana/web3.js");
|
|
40
40
|
const spl_token_1 = require("@solana/spl-token");
|
|
41
41
|
const pda_1 = require("./pda");
|
|
42
|
+
const resolverDecode_1 = require("./resolverDecode");
|
|
42
43
|
const types_1 = require("./types");
|
|
43
44
|
/**
|
|
44
45
|
* Some RPC plans (e.g. QuickNode Discover) reject `getMultipleAccounts` with more than 5 keys.
|
|
@@ -332,6 +333,12 @@ class PredictionMarketClient {
|
|
|
332
333
|
const marketCategoryPk = !categoryIdBn.isZero()
|
|
333
334
|
? (0, pda_1.deriveMarketCategory)(this.program.programId, platformIdBn, categoryIdBn)
|
|
334
335
|
: null;
|
|
336
|
+
const maxOi = params.maxOutcomeInvestment ?? new anchor_1.BN(0);
|
|
337
|
+
const maxWi = params.maxWalletOutcomeInvestment ?? new anchor_1.BN(0);
|
|
338
|
+
if (params.marketType === 'parimutuel' &&
|
|
339
|
+
!(0, pda_1.isValidParimutuelWalletVsOutcomeCap)(maxOi, maxWi)) {
|
|
340
|
+
throw new Error('Parimutuel: maxWalletOutcomeInvestment cannot exceed maxOutcomeInvestment when both are non-zero');
|
|
341
|
+
}
|
|
335
342
|
const createIx = await this.program.methods
|
|
336
343
|
.createMarket({
|
|
337
344
|
marketId: params.marketId,
|
|
@@ -341,8 +348,8 @@ class PredictionMarketClient {
|
|
|
341
348
|
creatorFeeBps: params.creatorFeeBps,
|
|
342
349
|
depositPlatformFeeBps: params.depositPlatformFeeBps,
|
|
343
350
|
numResolvers: params.numResolvers,
|
|
344
|
-
maxOutcomeInvestment:
|
|
345
|
-
maxWalletOutcomeInvestment:
|
|
351
|
+
maxOutcomeInvestment: maxOi,
|
|
352
|
+
maxWalletOutcomeInvestment: maxWi,
|
|
346
353
|
title: params.title,
|
|
347
354
|
marketType: (0, types_1.toMarketTypeIx)(params.marketType),
|
|
348
355
|
platformId: (0, pda_1.bnToU32)(platformIdBn),
|
|
@@ -546,6 +553,11 @@ class PredictionMarketClient {
|
|
|
546
553
|
* To change only one knob, pass current values from `fetchMarket` / `fetchParimutuelState` for the rest.
|
|
547
554
|
*/
|
|
548
555
|
async updateParimutuelState(marketPda, params, opts) {
|
|
556
|
+
const market = await this.fetchMarket(marketPda);
|
|
557
|
+
const maxOi = (0, pda_1.bnLike)(market.maxOutcomeInvestment ?? 0);
|
|
558
|
+
if (!(0, pda_1.isValidParimutuelWalletVsOutcomeCap)(maxOi, params.maxWalletOutcomeInvestment)) {
|
|
559
|
+
throw new Error('maxWalletOutcomeInvestment cannot exceed maxOutcomeInvestment on the market when both are non-zero');
|
|
560
|
+
}
|
|
549
561
|
return this.program.methods
|
|
550
562
|
.updateParimutuelState({
|
|
551
563
|
marketId: params.marketId,
|
|
@@ -1498,7 +1510,7 @@ class PredictionMarketClient {
|
|
|
1498
1510
|
// ─── Site / partner profiles (platform identity) ────────────────────────────
|
|
1499
1511
|
/**
|
|
1500
1512
|
* Create or update `PlatformProfile` for `params.platformId`.
|
|
1501
|
-
* Caller must be
|
|
1513
|
+
* Caller must be global config primary or secondary authority.
|
|
1502
1514
|
*/
|
|
1503
1515
|
async upsertPlatformProfile(params, opts) {
|
|
1504
1516
|
const pid = (0, pda_1.bnToU32)(params.platformId);
|
|
@@ -1508,7 +1520,8 @@ class PredictionMarketClient {
|
|
|
1508
1520
|
.accounts({
|
|
1509
1521
|
platformRegistry,
|
|
1510
1522
|
platformProfile: (0, pda_1.derivePlatformProfile)(this.program.programId, pid),
|
|
1511
|
-
|
|
1523
|
+
authority: this.walletKey,
|
|
1524
|
+
globalConfig: this.globalConfig,
|
|
1512
1525
|
systemProgram: web3_js_1.SystemProgram.programId,
|
|
1513
1526
|
})
|
|
1514
1527
|
.rpc(opts ?? { skipPreflight: true });
|
|
@@ -1632,31 +1645,122 @@ class PredictionMarketClient {
|
|
|
1632
1645
|
* Fetch all initialized resolver accounts for a market in parallel.
|
|
1633
1646
|
* Slots whose PDA has never been created are omitted from the result.
|
|
1634
1647
|
*
|
|
1648
|
+
* Resolver PDAs are **not** created in `create_market`; they appear after
|
|
1649
|
+
* `initialize_market_resolver` (e.g. `initializeMarketResolverSlots` in the SDK).
|
|
1650
|
+
*
|
|
1635
1651
|
* @param numResolvers - Value of `MarketAccount.numResolvers` (or an upper bound like 8).
|
|
1652
|
+
* @param options.debug - When true, logs each slot (`console.info` / `console.warn`): PDA, existence, owner vs program id, decode outcome, RPC endpoint.
|
|
1636
1653
|
*/
|
|
1637
|
-
async fetchAllResolvers(market, numResolvers) {
|
|
1638
|
-
const
|
|
1654
|
+
async fetchAllResolvers(market, numResolvers, options) {
|
|
1655
|
+
const expectedProgram = this.program.programId;
|
|
1656
|
+
const pdas = Array.from({ length: numResolvers }, (_, i) => (0, pda_1.deriveResolver)(expectedProgram, market, i));
|
|
1639
1657
|
const infos = await this.getMultipleAccountsInfoBatched(pdas);
|
|
1658
|
+
if (options?.debug && infos.length !== pdas.length) {
|
|
1659
|
+
// eslint-disable-next-line no-console
|
|
1660
|
+
console.warn('[vercora:fetchAllResolvers] batch length mismatch', {
|
|
1661
|
+
expectedKeys: pdas.length,
|
|
1662
|
+
infosReturned: infos.length,
|
|
1663
|
+
rpc: this.connection.rpcEndpoint,
|
|
1664
|
+
});
|
|
1665
|
+
}
|
|
1640
1666
|
const results = [];
|
|
1667
|
+
const debugRows = [];
|
|
1641
1668
|
for (let i = 0; i < numResolvers; i++) {
|
|
1642
1669
|
const info = infos[i];
|
|
1643
1670
|
if (!info) {
|
|
1644
1671
|
results.push(null);
|
|
1672
|
+
if (options?.debug) {
|
|
1673
|
+
debugRows.push({
|
|
1674
|
+
index: i,
|
|
1675
|
+
pda: pdas[i].toBase58(),
|
|
1676
|
+
accountExists: false,
|
|
1677
|
+
});
|
|
1678
|
+
}
|
|
1645
1679
|
continue;
|
|
1646
1680
|
}
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1681
|
+
const ownerMatchesProgram = info.owner.equals(expectedProgram);
|
|
1682
|
+
const buf = Buffer.from(info.data);
|
|
1683
|
+
const expectedDisc = (0, resolverDecode_1.resolverDiscriminatorFromIdl)(this.program);
|
|
1684
|
+
const actualDisc = buf.subarray(0, 8);
|
|
1685
|
+
const discriminatorMatch = !!(expectedDisc &&
|
|
1686
|
+
expectedDisc.length === 8 &&
|
|
1687
|
+
actualDisc.equals(expectedDisc));
|
|
1688
|
+
// `trustOwner: true` only when the account is owned by this program. The resolver PDA is
|
|
1689
|
+
// derived from program-controlled seeds, so a program-owned account at this PDA must have
|
|
1690
|
+
// been created by `initialize_market_resolver`. This lets wallets still match resolver
|
|
1691
|
+
// slots when the browser IDL differs from the deployed program (e.g. after `declare_id!`
|
|
1692
|
+
// rotation or IDL lag following a redeploy); without it, `findResolverSlot` would return
|
|
1693
|
+
// null and the UI would refuse to show resolver voting controls.
|
|
1694
|
+
const resolverPubkey = (0, resolverDecode_1.decodeResolverPubkeyFromAccountData)(this.program, buf, {
|
|
1695
|
+
trustOwner: ownerMatchesProgram,
|
|
1696
|
+
});
|
|
1697
|
+
if (resolverPubkey) {
|
|
1698
|
+
results.push({ index: i, resolverPubkey });
|
|
1699
|
+
if (options?.debug) {
|
|
1700
|
+
debugRows.push({
|
|
1701
|
+
index: i,
|
|
1702
|
+
pda: pdas[i].toBase58(),
|
|
1703
|
+
accountExists: true,
|
|
1704
|
+
owner: info.owner.toBase58(),
|
|
1705
|
+
ownerMatchesProgram,
|
|
1706
|
+
resolverPubkey: resolverPubkey.toBase58(),
|
|
1707
|
+
dataLen: buf.length,
|
|
1708
|
+
discriminatorMatch,
|
|
1709
|
+
expectedDiscHex: expectedDisc?.toString('hex') ?? null,
|
|
1710
|
+
actualDiscHex: actualDisc.toString('hex'),
|
|
1711
|
+
});
|
|
1655
1712
|
}
|
|
1656
1713
|
}
|
|
1657
|
-
|
|
1714
|
+
else {
|
|
1658
1715
|
results.push(null);
|
|
1716
|
+
if (options?.debug) {
|
|
1717
|
+
debugRows.push({
|
|
1718
|
+
index: i,
|
|
1719
|
+
pda: pdas[i].toBase58(),
|
|
1720
|
+
accountExists: true,
|
|
1721
|
+
owner: info.owner.toBase58(),
|
|
1722
|
+
ownerMatchesProgram,
|
|
1723
|
+
decodeError: true,
|
|
1724
|
+
dataLen: buf.length,
|
|
1725
|
+
discriminatorMatch,
|
|
1726
|
+
expectedDiscHex: expectedDisc?.toString('hex') ?? null,
|
|
1727
|
+
actualDiscHex: actualDisc.toString('hex'),
|
|
1728
|
+
});
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
}
|
|
1732
|
+
if (options?.debug) {
|
|
1733
|
+
const badOwnerSlots = debugRows.filter((r) => r.accountExists && r.ownerMatchesProgram === false);
|
|
1734
|
+
if (badOwnerSlots.length > 0) {
|
|
1735
|
+
// eslint-disable-next-line no-console
|
|
1736
|
+
console.warn('[vercora:fetchAllResolvers] account at resolver PDA is not owned by this program (wrong deploy / cluster / IDL?)', {
|
|
1737
|
+
expectedProgram: expectedProgram.toBase58(),
|
|
1738
|
+
rpc: this.connection.rpcEndpoint,
|
|
1739
|
+
slots: badOwnerSlots,
|
|
1740
|
+
});
|
|
1659
1741
|
}
|
|
1742
|
+
const wrongDiscOwnerOk = debugRows.filter((r) => r.accountExists &&
|
|
1743
|
+
r.ownerMatchesProgram &&
|
|
1744
|
+
r.decodeError &&
|
|
1745
|
+
r.discriminatorMatch === false);
|
|
1746
|
+
if (wrongDiscOwnerOk.length > 0) {
|
|
1747
|
+
// eslint-disable-next-line no-console
|
|
1748
|
+
console.warn('[vercora:fetchAllResolvers] program-owned account at resolver PDA has wrong discriminator (not Resolver for this IDL — wrong seeds vs on-chain program, wrong market PDA, or wrong program id for derivation)', { rpc: this.connection.rpcEndpoint, slots: wrongDiscOwnerOk });
|
|
1749
|
+
}
|
|
1750
|
+
const initializedN = results.filter((r) => r !== null).length;
|
|
1751
|
+
const missingAccountN = debugRows.filter((r) => !r.accountExists).length;
|
|
1752
|
+
const decodeErrN = debugRows.filter((r) => r.decodeError === true).length;
|
|
1753
|
+
const badOwnerN = debugRows.filter((r) => r.accountExists && r.ownerMatchesProgram === false).length;
|
|
1754
|
+
// One-line summary so a collapsed console row still shows the diagnosis.
|
|
1755
|
+
// eslint-disable-next-line no-console
|
|
1756
|
+
console.info(`[vercora:fetchAllResolvers] decoded=${initializedN}/${numResolvers} missingAccount=${missingAccountN} decodeError=${decodeErrN} badOwner=${badOwnerN} market=${market.toBase58().slice(0, 8)}…`, {
|
|
1757
|
+
programId: expectedProgram.toBase58(),
|
|
1758
|
+
market: market.toBase58(),
|
|
1759
|
+
numResolvers,
|
|
1760
|
+
rpc: this.connection.rpcEndpoint,
|
|
1761
|
+
slots: debugRows,
|
|
1762
|
+
initializedCount: initializedN,
|
|
1763
|
+
});
|
|
1660
1764
|
}
|
|
1661
1765
|
return results.filter((r) => r !== null);
|
|
1662
1766
|
}
|