@useaccord/sdk 0.5.2 → 0.7.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/index.js CHANGED
@@ -7003,7 +7003,10 @@ function createAccordAdapter(accord) {
7003
7003
  },
7004
7004
  { programAddress: input.programId }
7005
7005
  );
7006
- return appendRemaining(ix, [input.jurorStake]);
7006
+ return appendRemaining(ix, [
7007
+ input.jurorStake,
7008
+ ...input.attestation ? [{ address: input.attestation, isWritable: false }] : []
7009
+ ]);
7007
7010
  },
7008
7011
  async fetchCommittedVrf(dispute) {
7009
7012
  const m = await accord.client.accord.accounts.dispute.fetchMaybe(dispute);
@@ -7830,7 +7833,7 @@ function sleep(ms) {
7830
7833
  return new Promise((r) => setTimeout(r, ms));
7831
7834
  }
7832
7835
  __name(sleep, "sleep");
7833
- function drawSeat(client, programId, accounts, roundPda, seat, membership) {
7836
+ function drawSeat(client, programId, accounts, roundPda, seat, membership, attestation) {
7834
7837
  return client.buildDrawSeat({
7835
7838
  programId,
7836
7839
  accounts,
@@ -7840,7 +7843,8 @@ function drawSeat(client, programId, accounts, roundPda, seat, membership) {
7840
7843
  leaf: membership.leaf,
7841
7844
  proof: membership.proof,
7842
7845
  index: membership.index,
7843
- jurorStake: membership.jurorStake
7846
+ jurorStake: membership.jurorStake,
7847
+ attestation
7844
7848
  });
7845
7849
  }
7846
7850
  __name(drawSeat, "drawSeat");
@@ -8072,7 +8076,7 @@ function createAccordMethods(adapter, programId = ACCORD_PROGRAM_ID, _signer) {
8072
8076
  // vrf + per-seat draw
8073
8077
  requestVrf: /* @__PURE__ */ __name((accounts, extras) => requestVrf(adapter, programId, accounts, extras), "requestVrf"),
8074
8078
  awaitCommittedVrf: /* @__PURE__ */ __name((dispute, opts) => awaitCommittedVrf(adapter, dispute, opts), "awaitCommittedVrf"),
8075
- drawSeat: /* @__PURE__ */ __name((accounts, roundPda, seat, membership) => drawSeat(adapter, programId, accounts, roundPda, seat, membership), "drawSeat"),
8079
+ drawSeat: /* @__PURE__ */ __name((accounts, roundPda, seat, membership, attestation) => drawSeat(adapter, programId, accounts, roundPda, seat, membership, attestation), "drawSeat"),
8076
8080
  // voting
8077
8081
  commit: /* @__PURE__ */ __name((accounts, args) => commit(adapter, programId, accounts, args), "commit"),
8078
8082
  reveal: /* @__PURE__ */ __name((accounts, args) => reveal(adapter, programId, accounts, args), "reveal"),
@@ -8099,7 +8103,7 @@ var Accord = class {
8099
8103
  this.rpc = createSolanaRpc(config.endpoint);
8100
8104
  this.signer = config.signer;
8101
8105
  this.client = accordProgram()(
8102
- this.rpc
8106
+ { rpc: this.rpc }
8103
8107
  );
8104
8108
  }
8105
8109
  /**
@@ -8271,255 +8275,340 @@ function findDisputesByFiler(rpc, filer) {
8271
8275
  }
8272
8276
  __name(findDisputesByFiler, "findDisputesByFiler");
8273
8277
 
8278
+ // src/sas.ts
8279
+ import {
8280
+ getBase58Decoder as getBase58Decoder2,
8281
+ getBase64Encoder as getBase64Encoder2,
8282
+ getAddressDecoder as getAddressDecoder12
8283
+ } from "@solana/kit";
8284
+ var SAS_PROGRAM_ID = "22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG";
8285
+ var SAS_ATTESTATION_DISCRIMINATOR = 2;
8286
+ var DISC_OFF = 0;
8287
+ var NONCE_OFF = 1;
8288
+ var CREDENTIAL_OFF = 33;
8289
+ var SCHEMA_OFF = 65;
8290
+ var DATA_LEN_OFF = 97;
8291
+ var DATA_OFF = 101;
8292
+ var WALLET_OFF = DATA_OFF;
8293
+ var WALLET_W = 32;
8294
+ var SIGNER_W = 32;
8295
+ var EXPIRY_W = 8;
8296
+ var SAS_ATTESTATION_MIN_LEN = DATA_OFF + WALLET_W + SIGNER_W + EXPIRY_W;
8297
+ function decodeSasAttestation(bytes) {
8298
+ const u8 = bytes;
8299
+ if (u8.length < SAS_ATTESTATION_MIN_LEN) {
8300
+ throw new Error(
8301
+ `SasAttestationMalformed: ${u8.length} < ${SAS_ATTESTATION_MIN_LEN} bytes`
8302
+ );
8303
+ }
8304
+ if (u8[DISC_OFF] !== SAS_ATTESTATION_DISCRIMINATOR) {
8305
+ throw new Error(
8306
+ `SasAttestationMalformed: discriminator ${u8[DISC_OFF]} != ${SAS_ATTESTATION_DISCRIMINATOR}`
8307
+ );
8308
+ }
8309
+ const dv = new DataView(u8.buffer, u8.byteOffset, u8.byteLength);
8310
+ const dataLen = dv.getUint32(DATA_LEN_OFF, true);
8311
+ if (dataLen < WALLET_W) {
8312
+ throw new Error(
8313
+ `SasAttestationMalformed: data_len ${dataLen} < ${WALLET_W} (no wallet binding)`
8314
+ );
8315
+ }
8316
+ const signerOff = DATA_OFF + dataLen;
8317
+ const expiryOff = signerOff + SIGNER_W;
8318
+ if (u8.length < expiryOff + EXPIRY_W) {
8319
+ throw new Error(`SasAttestationMalformed: truncated expiry tail`);
8320
+ }
8321
+ const addressDecoder = getAddressDecoder12();
8322
+ return {
8323
+ nonce: u8.slice(NONCE_OFF, NONCE_OFF + WALLET_W),
8324
+ credential: addressDecoder.decode(
8325
+ u8.subarray(CREDENTIAL_OFF, CREDENTIAL_OFF + WALLET_W)
8326
+ ),
8327
+ schema: addressDecoder.decode(
8328
+ u8.subarray(SCHEMA_OFF, SCHEMA_OFF + WALLET_W)
8329
+ ),
8330
+ wallet: addressDecoder.decode(
8331
+ u8.subarray(WALLET_OFF, WALLET_OFF + WALLET_W)
8332
+ ),
8333
+ signer: addressDecoder.decode(u8.subarray(signerOff, signerOff + SIGNER_W)),
8334
+ expiry: dv.getBigInt64(expiryOff, true)
8335
+ };
8336
+ }
8337
+ __name(decodeSasAttestation, "decodeSasAttestation");
8338
+ async function findSasAttestations(rpc, filters = {}) {
8339
+ const base582 = getBase58Decoder2();
8340
+ const memcmp = [
8341
+ {
8342
+ memcmp: {
8343
+ offset: 0n,
8344
+ // Single discriminator byte at offset 0 (SAS uses u8, not Anchor's
8345
+ // 8). Kit's base58 decoder yields plain `string`; brand it like
8346
+ // query.ts does for the filter's `bytes` field.
8347
+ bytes: base582.decode(
8348
+ new Uint8Array([SAS_ATTESTATION_DISCRIMINATOR])
8349
+ ),
8350
+ encoding: "base58"
8351
+ }
8352
+ }
8353
+ ];
8354
+ if (filters.credential !== void 0) {
8355
+ memcmp.push(addressFilter(BigInt(CREDENTIAL_OFF), filters.credential));
8356
+ }
8357
+ if (filters.schema !== void 0) {
8358
+ memcmp.push(addressFilter(BigInt(SCHEMA_OFF), filters.schema));
8359
+ }
8360
+ if (filters.wallet !== void 0) {
8361
+ memcmp.push(addressFilter(BigInt(WALLET_OFF), filters.wallet));
8362
+ }
8363
+ const accountInfos = await rpc.getProgramAccounts(SAS_PROGRAM_ID, { encoding: "base64", filters: memcmp }).send();
8364
+ const base64 = getBase64Encoder2();
8365
+ const out = [];
8366
+ for (const info of accountInfos) {
8367
+ try {
8368
+ const [data] = info.account.data;
8369
+ out.push({
8370
+ ...info.account,
8371
+ address: info.pubkey,
8372
+ programAddress: SAS_PROGRAM_ID,
8373
+ data: decodeSasAttestation(base64.encode(data))
8374
+ });
8375
+ } catch {
8376
+ }
8377
+ }
8378
+ return out;
8379
+ }
8380
+ __name(findSasAttestations, "findSasAttestations");
8381
+
8382
+ // src/generated/errors/accord.ts
8383
+ import {
8384
+ isProgramError
8385
+ } from "@solana/kit";
8386
+ var ACCORD_ERROR__UNAUTHORIZED = 6e3;
8387
+ var ACCORD_ERROR__SUBACCORD_MISMATCH = 6001;
8388
+ var ACCORD_ERROR__IMMUTABLE_SUBACCORD = 6002;
8389
+ var ACCORD_ERROR__TIMELOCK_NOT_ELAPSED = 6003;
8390
+ var ACCORD_ERROR__NO_PENDING_UPDATE = 6004;
8391
+ var ACCORD_ERROR__NOT_PAUSE_AUTHORITY = 6005;
8392
+ var ACCORD_ERROR__ALREADY_PAUSED = 6006;
8393
+ var ACCORD_ERROR__NOT_PAUSED = 6007;
8394
+ var ACCORD_ERROR__NO_PENDING_UNPAUSE = 6008;
8395
+ var ACCORD_ERROR__UNPAUSE_TIMELOCK_NOT_ELAPSED = 6009;
8396
+ var ACCORD_ERROR__PROGRAM_PAUSED = 6010;
8397
+ var ACCORD_ERROR__INSUFFICIENT_STAKE = 6011;
8398
+ var ACCORD_ERROR__STAKE_LOCKED = 6012;
8399
+ var ACCORD_ERROR__INVALID_AMOUNT = 6013;
8400
+ var ACCORD_ERROR__WITHDRAWAL_TOO_EARLY = 6014;
8401
+ var ACCORD_ERROR__NO_PENDING_WITHDRAWAL = 6015;
8402
+ var ACCORD_ERROR__INSUFFICIENT_BALANCE = 6016;
8403
+ var ACCORD_ERROR__PENDING_SETTLEMENT = 6017;
8404
+ var ACCORD_ERROR__WITHDRAWAL_PENDING = 6018;
8405
+ var ACCORD_ERROR__INSUFFICIENT_JURORS = 6019;
8406
+ var ACCORD_ERROR__INVALID_OPTIONS = 6020;
8407
+ var ACCORD_ERROR__INVALID_STATE = 6021;
8408
+ var ACCORD_ERROR__FEE_MISMATCH = 6022;
8409
+ var ACCORD_ERROR__INVALID_MERKLE_PATH = 6023;
8410
+ var ACCORD_ERROR__TREE_FULL = 6024;
8411
+ var ACCORD_ERROR__DUPLICATE_JUROR = 6025;
8412
+ var ACCORD_ERROR__INVALID_MEMBERSHIP_PROOF = 6026;
8413
+ var ACCORD_ERROR__INVALID_PANEL_SIZE = 6027;
8414
+ var ACCORD_ERROR__INFLATED_STAKE = 6028;
8415
+ var ACCORD_ERROR__SORTITION_MISMATCH = 6029;
8416
+ var ACCORD_ERROR__VRF_ALREADY_COMMITTED = 6030;
8417
+ var ACCORD_ERROR__VRF_NOT_COMMITTED = 6031;
8418
+ var ACCORD_ERROR__COMMIT_ALREADY_EXISTS = 6032;
8419
+ var ACCORD_ERROR__COMMIT_MISSING = 6033;
8420
+ var ACCORD_ERROR__REVEAL_MISMATCH = 6034;
8421
+ var ACCORD_ERROR__COMMIT_WINDOW_CLOSED = 6035;
8422
+ var ACCORD_ERROR__REVEAL_WINDOW_CLOSED = 6036;
8423
+ var ACCORD_ERROR__NOT_DRAWN_JUROR = 6037;
8424
+ var ACCORD_ERROR__INVALID_VOTE = 6038;
8425
+ var ACCORD_ERROR__ALREADY_REVEALED = 6039;
8426
+ var ACCORD_ERROR__APPEAL_WINDOW_OPEN = 6040;
8427
+ var ACCORD_ERROR__MAX_APPEALS_REACHED = 6041;
8428
+ var ACCORD_ERROR__MAX_APPEALS_LIMIT_EXCEEDED = 6042;
8429
+ var ACCORD_ERROR__APPEAL_WINDOW_CLOSED = 6043;
8430
+ var ACCORD_ERROR__APPEAL_WINDOW_TOO_SHORT = 6044;
8431
+ var ACCORD_ERROR__ROUND_NOT_FINALIZABLE = 6045;
8432
+ var ACCORD_ERROR__DISPUTE_NOT_FINAL = 6046;
8433
+ var ACCORD_ERROR__ARITHMETIC_OVERFLOW = 6047;
8434
+ var ACCORD_ERROR__ROUND_ALREADY_SETTLED = 6048;
8435
+ var ACCORD_ERROR__ROUND_NOT_SETTLABLE = 6049;
8436
+ var ACCORD_ERROR__DISPUTE_FAILED = 6050;
8437
+ var ACCORD_ERROR__CANCEL_TOO_EARLY = 6051;
8438
+ var ACCORD_ERROR__MAX_RETRIES_EXCEEDED = 6052;
8439
+ var ACCORD_ERROR__NO_FEES_EARNED = 6053;
8440
+ var ACCORD_ERROR__NOT_REDRAW_ELIGIBLE = 6054;
8441
+ var ACCORD_ERROR__MAX_DRAW_ATTEMPTS_LIMIT_EXCEEDED = 6055;
8442
+ var ACCORD_ERROR__INVALID_THRESHOLD = 6056;
8443
+ var ACCORD_ERROR__ATTESTATION_MISSING = 6057;
8444
+ var ACCORD_ERROR__ATTESTATION_BINDING_PARTIAL = 6058;
8445
+ var ACCORD_ERROR__ATTESTATION_MALFORMED = 6059;
8446
+ var ACCORD_ERROR__ATTESTATION_MISMATCH = 6060;
8447
+ var ACCORD_ERROR__ATTESTATION_SUBJECT_MISMATCH = 6061;
8448
+ var ACCORD_ERROR__ATTESTATION_EXPIRED = 6062;
8449
+ var ACCORD_ERROR__ATTESTATION_NOT_EXPIRED = 6063;
8450
+ var ACCORD_ERROR__SLOT_NOT_DRAINED = 6064;
8451
+ var ACCORD_ERROR__SLOT_ALREADY_RECLAIMED = 6065;
8452
+ var ACCORD_ERROR__FREE_LIST_HEAD_MISMATCH = 6066;
8453
+ var ACCORD_ERROR__SLOT_AWAITING_RECYCLE = 6067;
8454
+ var ACCORD_ERROR__EVEN_JURY_SIZE = 6068;
8455
+ var ACCORD_ERROR__LADDER_EXCEEDS_MAX_JURORS = 6069;
8456
+ var ACCORD_ERROR__FEE_DOMINATES_SLASH = 6070;
8457
+ var accordErrorMessages;
8458
+ if (process.env["NODE_ENV"] !== "production") {
8459
+ accordErrorMessages = {
8460
+ [ACCORD_ERROR__ALREADY_PAUSED]: `Program is already paused.`,
8461
+ [ACCORD_ERROR__ALREADY_REVEALED]: `Juror has already revealed.`,
8462
+ [ACCORD_ERROR__APPEAL_WINDOW_CLOSED]: `Appeal window has closed; the dispute can only be finalized.`,
8463
+ [ACCORD_ERROR__APPEAL_WINDOW_OPEN]: `Appeal window has not elapsed yet.`,
8464
+ [ACCORD_ERROR__APPEAL_WINDOW_TOO_SHORT]: `Appeal window is below the per-Subaccord floor (MIN_APPEAL_WINDOW_SECS).`,
8465
+ [ACCORD_ERROR__ARITHMETIC_OVERFLOW]: `Arithmetic overflow.`,
8466
+ [ACCORD_ERROR__ATTESTATION_BINDING_PARTIAL]: `Credential and schema must be set together (both-or-neither).`,
8467
+ [ACCORD_ERROR__ATTESTATION_EXPIRED]: `Attestation has expired or will expire before the dispute lifecycle completes.`,
8468
+ [ACCORD_ERROR__ATTESTATION_MALFORMED]: `Attestation account is malformed (wrong owner, discriminator, or too short).`,
8469
+ [ACCORD_ERROR__ATTESTATION_MISMATCH]: `Attestation credential or schema does not match the Subaccord binding.`,
8470
+ [ACCORD_ERROR__ATTESTATION_MISSING]: `Subaccord is credential-gated but no attestation account was provided.`,
8471
+ [ACCORD_ERROR__ATTESTATION_NOT_EXPIRED]: `Attestation has not expired; prune_juror requires an actually-expired credential.`,
8472
+ [ACCORD_ERROR__ATTESTATION_SUBJECT_MISMATCH]: `Attestation subject wallet does not match the juror.`,
8473
+ [ACCORD_ERROR__CANCEL_TOO_EARLY]: `Dispute has not exceeded its stage timeout; cancel_dispute is not yet available.`,
8474
+ [ACCORD_ERROR__COMMIT_ALREADY_EXISTS]: `Juror has already committed.`,
8475
+ [ACCORD_ERROR__COMMIT_MISSING]: `No commit to reveal for this Juror.`,
8476
+ [ACCORD_ERROR__COMMIT_WINDOW_CLOSED]: `Commit window is closed.`,
8477
+ [ACCORD_ERROR__DISPUTE_FAILED]: `Dispute is in terminal Failed state.`,
8478
+ [ACCORD_ERROR__DISPUTE_NOT_FINAL]: `Dispute is not in a finalizable state.`,
8479
+ [ACCORD_ERROR__DUPLICATE_JUROR]: `Draw selected a duplicate Juror.`,
8480
+ [ACCORD_ERROR__EVEN_JURY_SIZE]: `Round-1 jury size (min_jury_size) must be odd (tie avoidance).`,
8481
+ [ACCORD_ERROR__FEE_DOMINATES_SLASH]: `Same-mint pool is fee-dominated: alpha_bps\xB7min_stake/10_000 must cover MIN_SLASH_FEE_RATIO\xB7fee_per_juror.`,
8482
+ [ACCORD_ERROR__FEE_MISMATCH]: `Tendered fee does not match the required round-1 dispute fee (min_jury_size * fee_per_juror).`,
8483
+ [ACCORD_ERROR__FREE_LIST_HEAD_MISMATCH]: `Provided freed-slot account does not match the free-list head.`,
8484
+ [ACCORD_ERROR__IMMUTABLE_SUBACCORD]: `Subaccord is immutable (authority == default).`,
8485
+ [ACCORD_ERROR__INFLATED_STAKE]: `Drawn juror's live stake is below the accumulator leaf's claim (inflation guard, ADR-0012).`,
8486
+ [ACCORD_ERROR__INSUFFICIENT_BALANCE]: `Withdrawal exceeds the Juror's free stake (amount - slash_reserve).`,
8487
+ [ACCORD_ERROR__INSUFFICIENT_JURORS]: `Subaccord has fewer active distinct stakers than the required panel size.`,
8488
+ [ACCORD_ERROR__INSUFFICIENT_STAKE]: `Staked amount is below the Subaccord minimum.`,
8489
+ [ACCORD_ERROR__INVALID_AMOUNT]: `Amount must be greater than zero.`,
8490
+ [ACCORD_ERROR__INVALID_MEMBERSHIP_PROOF]: `Juror Merkle membership/weight proof is invalid.`,
8491
+ [ACCORD_ERROR__INVALID_MERKLE_PATH]: `Accumulator Merkle path does not authenticate against the stored root.`,
8492
+ [ACCORD_ERROR__INVALID_OPTIONS]: `Dispute options are invalid (need 2..=MAX_OPTIONS).`,
8493
+ [ACCORD_ERROR__INVALID_PANEL_SIZE]: `Number of juror memberships does not match the required panel size.`,
8494
+ [ACCORD_ERROR__INVALID_STATE]: `Dispute is not in the required state for this instruction.`,
8495
+ [ACCORD_ERROR__INVALID_THRESHOLD]: `Basis-point value out of range (must be <= 10_000; reveal threshold or alpha).`,
8496
+ [ACCORD_ERROR__INVALID_VOTE]: `Revealed vote index is out of range.`,
8497
+ [ACCORD_ERROR__LADDER_EXCEEDS_MAX_JURORS]: `The appeal ladder (min_jury_size, max_appeals) exceeds MAX_JURORS at its top round.`,
8498
+ [ACCORD_ERROR__MAX_APPEALS_LIMIT_EXCEEDED]: `Subaccord max_appeals exceeds the program ceiling.`,
8499
+ [ACCORD_ERROR__MAX_APPEALS_REACHED]: `Maximum appeals reached for this dispute.`,
8500
+ [ACCORD_ERROR__MAX_DRAW_ATTEMPTS_LIMIT_EXCEEDED]: `Subaccord max_draw_attempts exceeds the program ceiling.`,
8501
+ [ACCORD_ERROR__MAX_RETRIES_EXCEEDED]: `Sortition retries exceeded the on-chain bound; the pool may be too concentrated.`,
8502
+ [ACCORD_ERROR__NO_FEES_EARNED]: `Juror has no earned fees to withdraw.`,
8503
+ [ACCORD_ERROR__NO_PENDING_UNPAUSE]: `No pending unpause to execute.`,
8504
+ [ACCORD_ERROR__NO_PENDING_UPDATE]: `No pending update to execute.`,
8505
+ [ACCORD_ERROR__NO_PENDING_WITHDRAWAL]: `No pending withdrawal to execute.`,
8506
+ [ACCORD_ERROR__NOT_DRAWN_JUROR]: `Signer is not a drawn Juror for this round.`,
8507
+ [ACCORD_ERROR__NOT_PAUSE_AUTHORITY]: `Signer is not the pause authority.`,
8508
+ [ACCORD_ERROR__NOT_PAUSED]: `Program is not paused.`,
8509
+ [ACCORD_ERROR__NOT_REDRAW_ELIGIBLE]: `Dispute is not in RedrawEligible state; redraw is not available.`,
8510
+ [ACCORD_ERROR__PENDING_SETTLEMENT]: `Settle pending reward/slash first: call reconcile_stake before request_withdraw.`,
8511
+ [ACCORD_ERROR__PROGRAM_PAUSED]: `Program is paused; this instruction is halted.`,
8512
+ [ACCORD_ERROR__REVEAL_MISMATCH]: `Reveal does not match the committed hash.`,
8513
+ [ACCORD_ERROR__REVEAL_WINDOW_CLOSED]: `Reveal window is closed.`,
8514
+ [ACCORD_ERROR__ROUND_ALREADY_SETTLED]: `Round has already been settled.`,
8515
+ [ACCORD_ERROR__ROUND_NOT_FINALIZABLE]: `Round cannot be finalized yet (window not elapsed).`,
8516
+ [ACCORD_ERROR__ROUND_NOT_SETTLABLE]: `Round index out of range for settlement (must be < current_round).`,
8517
+ [ACCORD_ERROR__SLOT_ALREADY_RECLAIMED]: `JurorStake slot is already on the free list (next_free != MAX).`,
8518
+ [ACCORD_ERROR__SLOT_AWAITING_RECYCLE]: `Juror's tree slot was reclaimed and sits mid-free-list; retry once the slots ahead of it are recycled.`,
8519
+ [ACCORD_ERROR__SLOT_NOT_DRAINED]: `JurorStake is not fully drained (staked, active_draws, stake_delta, or fees_earned > 0).`,
8520
+ [ACCORD_ERROR__SORTITION_MISMATCH]: `Submitted membership does not match the VRF-derived sortition selection (ADR-0009).`,
8521
+ [ACCORD_ERROR__STAKE_LOCKED]: `Cannot unstake while active_draws > 0 (stake is frozen until drawn disputes settle).`,
8522
+ [ACCORD_ERROR__SUBACCORD_MISMATCH]: `Dispute does not belong to this Subaccord (cross-pool substitution rejected).`,
8523
+ [ACCORD_ERROR__TIMELOCK_NOT_ELAPSED]: `Timelock has not elapsed yet.`,
8524
+ [ACCORD_ERROR__TREE_FULL]: `Accumulator tree is full (no free leaf within the configured depth).`,
8525
+ [ACCORD_ERROR__UNAUTHORIZED]: `Signer is not the Subaccord authority.`,
8526
+ [ACCORD_ERROR__UNPAUSE_TIMELOCK_NOT_ELAPSED]: `Unpause timelock has not elapsed yet.`,
8527
+ [ACCORD_ERROR__VRF_ALREADY_COMMITTED]: `VRF result already committed for this dispute.`,
8528
+ [ACCORD_ERROR__VRF_NOT_COMMITTED]: `No VRF result committed for this dispute; the root is not yet frozen.`,
8529
+ [ACCORD_ERROR__WITHDRAWAL_PENDING]: `A withdrawal is already pending \u2014 complete it via withdraw before requesting another.`,
8530
+ [ACCORD_ERROR__WITHDRAWAL_TOO_EARLY]: `Withdrawal timelock has not elapsed yet.`
8531
+ };
8532
+ }
8533
+
8274
8534
  // src/errors.ts
8275
8535
  var ACCORD_ERROR_CODE_OFFSET = 6e3;
8276
8536
  function err(code, name, message) {
8277
8537
  return { code, name, message };
8278
8538
  }
8279
8539
  __name(err, "err");
8280
- var BASE = ACCORD_ERROR_CODE_OFFSET;
8281
8540
  var AccordErrors = {
8282
- // --- authority / timelock (ADR-0005) ---
8283
- Unauthorized: err(
8284
- BASE + 0,
8285
- "Unauthorized",
8286
- "Signer is not the Subaccord authority."
8287
- ),
8288
- ImmutableSubaccord: err(
8289
- BASE + 1,
8290
- "ImmutableSubaccord",
8291
- "Subaccord is immutable (authority == default)."
8292
- ),
8293
- TimelockNotElapsed: err(
8294
- BASE + 2,
8295
- "TimelockNotElapsed",
8296
- "Timelock has not elapsed yet."
8297
- ),
8298
- NoPendingUpdate: err(
8299
- BASE + 3,
8300
- "NoPendingUpdate",
8301
- "No pending update to execute."
8302
- ),
8303
- // --- circuit breaker (ADR-0007) ---
8304
- NotPauseAuthority: err(
8305
- BASE + 4,
8306
- "NotPauseAuthority",
8307
- "Signer is not the pause authority."
8308
- ),
8309
- AlreadyPaused: err(BASE + 5, "AlreadyPaused", "Program is already paused."),
8310
- NotPaused: err(BASE + 6, "NotPaused", "Program is not paused."),
8311
- NoPendingUnpause: err(
8312
- BASE + 7,
8313
- "NoPendingUnpause",
8314
- "No pending unpause to execute."
8315
- ),
8316
- UnpauseTimelockNotElapsed: err(
8317
- BASE + 8,
8318
- "UnpauseTimelockNotElapsed",
8319
- "Unpause timelock has not elapsed yet."
8320
- ),
8321
- ProgramPaused: err(
8322
- BASE + 9,
8323
- "ProgramPaused",
8324
- "Program is paused; this instruction is halted."
8325
- ),
8326
- // --- staking ---
8327
- InsufficientStake: err(
8328
- BASE + 10,
8329
- "InsufficientStake",
8330
- "Staked amount is below the Subaccord minimum."
8331
- ),
8332
- StakeLocked: err(
8333
- BASE + 11,
8334
- "StakeLocked",
8335
- "Cannot unstake while active_draws > 0 (stake is frozen until drawn disputes settle)."
8336
- ),
8337
- InvalidAmount: err(
8338
- BASE + 12,
8339
- "InvalidAmount",
8340
- "Amount must be greater than zero."
8341
- ),
8342
- InsufficientBalance: err(
8343
- BASE + 13,
8344
- "InsufficientBalance",
8345
- "Withdrawal exceeds the Juror's staked balance."
8346
- ),
8347
- // --- dispute intake ---
8348
- InsufficientJurors: err(
8349
- BASE + 14,
8350
- "InsufficientJurors",
8351
- "Subaccord has fewer active distinct stakers than the required panel size."
8352
- ),
8353
- InvalidOptions: err(
8354
- BASE + 15,
8355
- "InvalidOptions",
8356
- "Dispute options are invalid (need 2..=MAX_OPTIONS)."
8357
- ),
8358
- InvalidState: err(
8359
- BASE + 16,
8360
- "InvalidState",
8361
- "Dispute is not in the required state for this instruction."
8362
- ),
8363
- FeeMismatch: err(
8364
- BASE + 17,
8365
- "FeeMismatch",
8366
- "Tendered fee does not match the required round-1 dispute fee (min_jury_size * fee_per_juror)."
8367
- ),
8368
- // --- accumulator (ADR-0012) ---
8369
- InvalidMerklePath: err(
8370
- BASE + 18,
8371
- "InvalidMerklePath",
8372
- "Accumulator Merkle path does not authenticate against the stored root."
8373
- ),
8374
- TreeFull: err(
8375
- BASE + 19,
8376
- "TreeFull",
8377
- "Accumulator tree is full (no free leaf within the configured depth)."
8378
- ),
8379
- // --- draw ---
8380
- DuplicateJuror: err(
8381
- BASE + 20,
8382
- "DuplicateJuror",
8383
- "Draw selected a duplicate Juror."
8384
- ),
8385
- InvalidMembershipProof: err(
8386
- BASE + 21,
8387
- "InvalidMembershipProof",
8388
- "Juror Merkle membership/weight proof is invalid."
8389
- ),
8390
- InvalidPanelSize: err(
8391
- BASE + 22,
8392
- "InvalidPanelSize",
8393
- "Number of juror memberships does not match the required panel size."
8394
- ),
8395
- InflatedStake: err(
8396
- BASE + 23,
8397
- "InflatedStake",
8398
- "Drawn juror's live stake is below the accumulator leaf's claim (inflation guard, ADR-0012)."
8399
- ),
8400
- SortitionMismatch: err(
8401
- BASE + 24,
8402
- "SortitionMismatch",
8403
- "Submitted membership does not match the VRF-derived sortition selection (ADR-0009)."
8404
- ),
8405
- VrfAlreadyCommitted: err(
8406
- BASE + 25,
8407
- "VrfAlreadyCommitted",
8408
- "VRF result already committed for this dispute."
8409
- ),
8410
- VrfNotCommitted: err(
8411
- BASE + 26,
8412
- "VrfNotCommitted",
8413
- "No VRF result committed for this dispute; the root is not yet frozen."
8414
- ),
8415
- // --- voting ---
8416
- CommitAlreadyExists: err(
8417
- BASE + 27,
8418
- "CommitAlreadyExists",
8419
- "Juror has already committed."
8420
- ),
8421
- CommitMissing: err(
8422
- BASE + 28,
8423
- "CommitMissing",
8424
- "No commit to reveal for this Juror."
8425
- ),
8426
- RevealMismatch: err(
8427
- BASE + 29,
8428
- "RevealMismatch",
8429
- "Reveal does not match the committed hash."
8430
- ),
8431
- CommitWindowClosed: err(
8432
- BASE + 30,
8433
- "CommitWindowClosed",
8434
- "Commit window is closed."
8435
- ),
8436
- RevealWindowClosed: err(
8437
- BASE + 31,
8438
- "RevealWindowClosed",
8439
- "Reveal window is closed."
8440
- ),
8441
- NotDrawnJuror: err(
8442
- BASE + 32,
8443
- "NotDrawnJuror",
8444
- "Signer is not a drawn Juror for this round."
8445
- ),
8446
- InvalidVote: err(
8447
- BASE + 33,
8448
- "InvalidVote",
8449
- "Revealed vote index is out of range."
8450
- ),
8451
- AlreadyRevealed: err(
8452
- BASE + 34,
8453
- "AlreadyRevealed",
8454
- "Juror has already revealed."
8455
- ),
8456
- // --- finalization ---
8457
- AppealWindowOpen: err(
8458
- BASE + 35,
8459
- "AppealWindowOpen",
8460
- "Appeal window has not elapsed yet."
8461
- ),
8462
- // --- appeals (ADR-0004) ---
8463
- MaxAppealsReached: err(
8464
- BASE + 36,
8465
- "MaxAppealsReached",
8466
- "Maximum appeals reached for this dispute."
8467
- ),
8468
- MaxAppealsLimitExceeded: err(
8469
- BASE + 37,
8470
- "MaxAppealsLimitExceeded",
8471
- "Subaccord max_appeals exceeds the program ceiling."
8472
- ),
8473
- AppealWindowClosed: err(
8474
- BASE + 38,
8475
- "AppealWindowClosed",
8476
- "Appeal window has closed; the dispute can only be finalized."
8477
- ),
8478
- // --- finalization ---
8479
- RoundNotFinalizable: err(
8480
- BASE + 39,
8481
- "RoundNotFinalizable",
8482
- "Round cannot be finalized yet (window not elapsed)."
8483
- ),
8484
- DisputeNotFinal: err(
8485
- BASE + 40,
8486
- "DisputeNotFinal",
8487
- "Dispute is not in a finalizable state."
8488
- ),
8489
- // --- arithmetic ---
8490
- ArithmeticOverflow: err(
8491
- BASE + 41,
8492
- "ArithmeticOverflow",
8493
- "Arithmetic overflow."
8494
- ),
8495
- // --- multi-round settlement (CONCEPT-REVIEW Ugly 5 / accord-r6ti) ---
8496
- RoundAlreadySettled: err(
8497
- BASE + 42,
8498
- "RoundAlreadySettled",
8499
- "Round has already been settled."
8500
- ),
8501
- RoundNotSettlable: err(
8502
- BASE + 43,
8503
- "RoundNotSettlable",
8504
- "Round index out of range for settlement (must be < current_round)."
8505
- ),
8506
- // --- cancel / Failed state (Ugly 4) ---
8507
- DisputeFailed: err(
8508
- BASE + 44,
8509
- "DisputeFailed",
8510
- "Dispute is in terminal Failed state."
8511
- ),
8512
- CancelTooEarly: err(
8513
- BASE + 45,
8514
- "CancelTooEarly",
8515
- "Dispute has not exceeded its stage timeout; cancel_dispute is not yet available."
8516
- ),
8517
- // --- draw (bean accord-tzo0) ---
8518
- MaxRetriesExceeded: err(
8519
- BASE + 46,
8520
- "MaxRetriesExceeded",
8521
- "Sortition retries exceeded the on-chain bound; the pool may be too concentrated."
8522
- )
8541
+ Unauthorized: err(ACCORD_ERROR__UNAUTHORIZED, "Unauthorized", "Signer is not the Subaccord authority."),
8542
+ SubaccordMismatch: err(ACCORD_ERROR__SUBACCORD_MISMATCH, "SubaccordMismatch", "Dispute does not belong to this Subaccord (cross-pool substitution rejected)."),
8543
+ ImmutableSubaccord: err(ACCORD_ERROR__IMMUTABLE_SUBACCORD, "ImmutableSubaccord", "Subaccord is immutable (authority == default)."),
8544
+ TimelockNotElapsed: err(ACCORD_ERROR__TIMELOCK_NOT_ELAPSED, "TimelockNotElapsed", "Timelock has not elapsed yet."),
8545
+ NoPendingUpdate: err(ACCORD_ERROR__NO_PENDING_UPDATE, "NoPendingUpdate", "No pending update to execute."),
8546
+ NotPauseAuthority: err(ACCORD_ERROR__NOT_PAUSE_AUTHORITY, "NotPauseAuthority", "Signer is not the pause authority."),
8547
+ AlreadyPaused: err(ACCORD_ERROR__ALREADY_PAUSED, "AlreadyPaused", "Program is already paused."),
8548
+ NotPaused: err(ACCORD_ERROR__NOT_PAUSED, "NotPaused", "Program is not paused."),
8549
+ NoPendingUnpause: err(ACCORD_ERROR__NO_PENDING_UNPAUSE, "NoPendingUnpause", "No pending unpause to execute."),
8550
+ UnpauseTimelockNotElapsed: err(ACCORD_ERROR__UNPAUSE_TIMELOCK_NOT_ELAPSED, "UnpauseTimelockNotElapsed", "Unpause timelock has not elapsed yet."),
8551
+ ProgramPaused: err(ACCORD_ERROR__PROGRAM_PAUSED, "ProgramPaused", "Program is paused; this instruction is halted."),
8552
+ InsufficientStake: err(ACCORD_ERROR__INSUFFICIENT_STAKE, "InsufficientStake", "Staked amount is below the Subaccord minimum."),
8553
+ StakeLocked: err(ACCORD_ERROR__STAKE_LOCKED, "StakeLocked", "Cannot unstake while active_draws > 0 (stake is frozen until drawn disputes settle)."),
8554
+ InvalidAmount: err(ACCORD_ERROR__INVALID_AMOUNT, "InvalidAmount", "Amount must be greater than zero."),
8555
+ WithdrawalTooEarly: err(ACCORD_ERROR__WITHDRAWAL_TOO_EARLY, "WithdrawalTooEarly", "Withdrawal timelock has not elapsed yet."),
8556
+ NoPendingWithdrawal: err(ACCORD_ERROR__NO_PENDING_WITHDRAWAL, "NoPendingWithdrawal", "No pending withdrawal to execute."),
8557
+ InsufficientBalance: err(ACCORD_ERROR__INSUFFICIENT_BALANCE, "InsufficientBalance", "Withdrawal exceeds the Juror's free stake (amount - slash_reserve)."),
8558
+ PendingSettlement: err(ACCORD_ERROR__PENDING_SETTLEMENT, "PendingSettlement", "Settle pending reward/slash first: call reconcile_stake before request_withdraw."),
8559
+ WithdrawalPending: err(ACCORD_ERROR__WITHDRAWAL_PENDING, "WithdrawalPending", "A withdrawal is already pending \u2014 complete it via withdraw before requesting another."),
8560
+ InsufficientJurors: err(ACCORD_ERROR__INSUFFICIENT_JURORS, "InsufficientJurors", "Subaccord has fewer active distinct stakers than the required panel size."),
8561
+ InvalidOptions: err(ACCORD_ERROR__INVALID_OPTIONS, "InvalidOptions", "Dispute options are invalid (need 2..=MAX_OPTIONS)."),
8562
+ InvalidState: err(ACCORD_ERROR__INVALID_STATE, "InvalidState", "Dispute is not in the required state for this instruction."),
8563
+ FeeMismatch: err(ACCORD_ERROR__FEE_MISMATCH, "FeeMismatch", "Tendered fee does not match the required round-1 dispute fee (min_jury_size * fee_per_juror)."),
8564
+ InvalidMerklePath: err(ACCORD_ERROR__INVALID_MERKLE_PATH, "InvalidMerklePath", "Accumulator Merkle path does not authenticate against the stored root."),
8565
+ TreeFull: err(ACCORD_ERROR__TREE_FULL, "TreeFull", "Accumulator tree is full (no free leaf within the configured depth)."),
8566
+ DuplicateJuror: err(ACCORD_ERROR__DUPLICATE_JUROR, "DuplicateJuror", "Draw selected a duplicate Juror."),
8567
+ InvalidMembershipProof: err(ACCORD_ERROR__INVALID_MEMBERSHIP_PROOF, "InvalidMembershipProof", "Juror Merkle membership/weight proof is invalid."),
8568
+ InvalidPanelSize: err(ACCORD_ERROR__INVALID_PANEL_SIZE, "InvalidPanelSize", "Number of juror memberships does not match the required panel size."),
8569
+ InflatedStake: err(ACCORD_ERROR__INFLATED_STAKE, "InflatedStake", "Drawn juror's live stake is below the accumulator leaf's claim (inflation guard, ADR-0012)."),
8570
+ SortitionMismatch: err(ACCORD_ERROR__SORTITION_MISMATCH, "SortitionMismatch", "Submitted membership does not match the VRF-derived sortition selection (ADR-0009)."),
8571
+ VrfAlreadyCommitted: err(ACCORD_ERROR__VRF_ALREADY_COMMITTED, "VrfAlreadyCommitted", "VRF result already committed for this dispute."),
8572
+ VrfNotCommitted: err(ACCORD_ERROR__VRF_NOT_COMMITTED, "VrfNotCommitted", "No VRF result committed for this dispute; the root is not yet frozen."),
8573
+ CommitAlreadyExists: err(ACCORD_ERROR__COMMIT_ALREADY_EXISTS, "CommitAlreadyExists", "Juror has already committed."),
8574
+ CommitMissing: err(ACCORD_ERROR__COMMIT_MISSING, "CommitMissing", "No commit to reveal for this Juror."),
8575
+ RevealMismatch: err(ACCORD_ERROR__REVEAL_MISMATCH, "RevealMismatch", "Reveal does not match the committed hash."),
8576
+ CommitWindowClosed: err(ACCORD_ERROR__COMMIT_WINDOW_CLOSED, "CommitWindowClosed", "Commit window is closed."),
8577
+ RevealWindowClosed: err(ACCORD_ERROR__REVEAL_WINDOW_CLOSED, "RevealWindowClosed", "Reveal window is closed."),
8578
+ NotDrawnJuror: err(ACCORD_ERROR__NOT_DRAWN_JUROR, "NotDrawnJuror", "Signer is not a drawn Juror for this round."),
8579
+ InvalidVote: err(ACCORD_ERROR__INVALID_VOTE, "InvalidVote", "Revealed vote index is out of range."),
8580
+ AlreadyRevealed: err(ACCORD_ERROR__ALREADY_REVEALED, "AlreadyRevealed", "Juror has already revealed."),
8581
+ AppealWindowOpen: err(ACCORD_ERROR__APPEAL_WINDOW_OPEN, "AppealWindowOpen", "Appeal window has not elapsed yet."),
8582
+ MaxAppealsReached: err(ACCORD_ERROR__MAX_APPEALS_REACHED, "MaxAppealsReached", "Maximum appeals reached for this dispute."),
8583
+ MaxAppealsLimitExceeded: err(ACCORD_ERROR__MAX_APPEALS_LIMIT_EXCEEDED, "MaxAppealsLimitExceeded", "Subaccord max_appeals exceeds the program ceiling."),
8584
+ AppealWindowClosed: err(ACCORD_ERROR__APPEAL_WINDOW_CLOSED, "AppealWindowClosed", "Appeal window has closed; the dispute can only be finalized."),
8585
+ AppealWindowTooShort: err(ACCORD_ERROR__APPEAL_WINDOW_TOO_SHORT, "AppealWindowTooShort", "Appeal window is below the per-Subaccord floor (MIN_APPEAL_WINDOW_SECS)."),
8586
+ RoundNotFinalizable: err(ACCORD_ERROR__ROUND_NOT_FINALIZABLE, "RoundNotFinalizable", "Round cannot be finalized yet (window not elapsed)."),
8587
+ DisputeNotFinal: err(ACCORD_ERROR__DISPUTE_NOT_FINAL, "DisputeNotFinal", "Dispute is not in a finalizable state."),
8588
+ ArithmeticOverflow: err(ACCORD_ERROR__ARITHMETIC_OVERFLOW, "ArithmeticOverflow", "Arithmetic overflow."),
8589
+ RoundAlreadySettled: err(ACCORD_ERROR__ROUND_ALREADY_SETTLED, "RoundAlreadySettled", "Round has already been settled."),
8590
+ RoundNotSettlable: err(ACCORD_ERROR__ROUND_NOT_SETTLABLE, "RoundNotSettlable", "Round index out of range for settlement (must be < current_round)."),
8591
+ DisputeFailed: err(ACCORD_ERROR__DISPUTE_FAILED, "DisputeFailed", "Dispute is in terminal Failed state."),
8592
+ CancelTooEarly: err(ACCORD_ERROR__CANCEL_TOO_EARLY, "CancelTooEarly", "Dispute has not exceeded its stage timeout; cancel_dispute is not yet available."),
8593
+ MaxRetriesExceeded: err(ACCORD_ERROR__MAX_RETRIES_EXCEEDED, "MaxRetriesExceeded", "Sortition retries exceeded the on-chain bound; the pool may be too concentrated."),
8594
+ NoFeesEarned: err(ACCORD_ERROR__NO_FEES_EARNED, "NoFeesEarned", "Juror has no earned fees to withdraw."),
8595
+ NotRedrawEligible: err(ACCORD_ERROR__NOT_REDRAW_ELIGIBLE, "NotRedrawEligible", "Dispute is not in RedrawEligible state; redraw is not available."),
8596
+ MaxDrawAttemptsLimitExceeded: err(ACCORD_ERROR__MAX_DRAW_ATTEMPTS_LIMIT_EXCEEDED, "MaxDrawAttemptsLimitExceeded", "Subaccord max_draw_attempts exceeds the program ceiling."),
8597
+ InvalidThreshold: err(ACCORD_ERROR__INVALID_THRESHOLD, "InvalidThreshold", "Basis-point value out of range (must be <= 10_000; reveal threshold or alpha)."),
8598
+ AttestationMissing: err(ACCORD_ERROR__ATTESTATION_MISSING, "AttestationMissing", "Subaccord is credential-gated but no attestation account was provided."),
8599
+ AttestationBindingPartial: err(ACCORD_ERROR__ATTESTATION_BINDING_PARTIAL, "AttestationBindingPartial", "Credential and schema must be set together (both-or-neither)."),
8600
+ AttestationMalformed: err(ACCORD_ERROR__ATTESTATION_MALFORMED, "AttestationMalformed", "Attestation account is malformed (wrong owner, discriminator, or too short)."),
8601
+ AttestationMismatch: err(ACCORD_ERROR__ATTESTATION_MISMATCH, "AttestationMismatch", "Attestation credential or schema does not match the Subaccord binding."),
8602
+ AttestationSubjectMismatch: err(ACCORD_ERROR__ATTESTATION_SUBJECT_MISMATCH, "AttestationSubjectMismatch", "Attestation subject wallet does not match the juror."),
8603
+ AttestationExpired: err(ACCORD_ERROR__ATTESTATION_EXPIRED, "AttestationExpired", "Attestation has expired or will expire before the dispute lifecycle completes."),
8604
+ AttestationNotExpired: err(ACCORD_ERROR__ATTESTATION_NOT_EXPIRED, "AttestationNotExpired", "Attestation has not expired; prune_juror requires an actually-expired credential."),
8605
+ SlotNotDrained: err(ACCORD_ERROR__SLOT_NOT_DRAINED, "SlotNotDrained", "JurorStake is not fully drained (staked, active_draws, stake_delta, or fees_earned > 0)."),
8606
+ SlotAlreadyReclaimed: err(ACCORD_ERROR__SLOT_ALREADY_RECLAIMED, "SlotAlreadyReclaimed", "JurorStake slot is already on the free list (next_free != MAX)."),
8607
+ FreeListHeadMismatch: err(ACCORD_ERROR__FREE_LIST_HEAD_MISMATCH, "FreeListHeadMismatch", "Provided freed-slot account does not match the free-list head."),
8608
+ SlotAwaitingRecycle: err(ACCORD_ERROR__SLOT_AWAITING_RECYCLE, "SlotAwaitingRecycle", "Juror's tree slot was reclaimed and sits mid-free-list; retry once the slots ahead of it are recycled."),
8609
+ EvenJurySize: err(ACCORD_ERROR__EVEN_JURY_SIZE, "EvenJurySize", "Round-1 jury size (min_jury_size) must be odd (tie avoidance)."),
8610
+ LadderExceedsMaxJurors: err(ACCORD_ERROR__LADDER_EXCEEDS_MAX_JURORS, "LadderExceedsMaxJurors", "The appeal ladder (min_jury_size, max_appeals) exceeds MAX_JURORS at its top round."),
8611
+ FeeDominatesSlash: err(ACCORD_ERROR__FEE_DOMINATES_SLASH, "FeeDominatesSlash", "Same-mint pool is fee-dominated: alpha_bps\xB7min_stake/10_000 must cover MIN_SLASH_FEE_RATIO\xB7fee_per_juror.")
8523
8612
  };
8524
8613
 
8525
8614
  // src/methods/stakeFlow.ts
@@ -8611,6 +8700,7 @@ __name(disputePhase, "disputePhase");
8611
8700
 
8612
8701
  // src/queries.ts
8613
8702
  import {
8703
+ getAddressEncoder as getAddressEncoder35,
8614
8704
  parseBase64RpcAccount
8615
8705
  } from "@solana/kit";
8616
8706
  function discriminatorToBase64(d) {
@@ -8655,6 +8745,45 @@ async function findAllPendingUpdates(rpc, config) {
8655
8745
  );
8656
8746
  }
8657
8747
  __name(findAllPendingUpdates, "findAllPendingUpdates");
8748
+ var SAS_PROGRAM_ID2 = "22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG";
8749
+ var SAS_CREDENTIAL_OFFSET = 33;
8750
+ var SAS_SCHEMA_OFFSET = 65;
8751
+ var SAS_WALLET_OFFSET = 101;
8752
+ function addressToBase64(a) {
8753
+ return btoa(String.fromCharCode(...getAddressEncoder35().encode(a)));
8754
+ }
8755
+ __name(addressToBase64, "addressToBase64");
8756
+ async function findSasAttestation(rpc, binding, config) {
8757
+ const found = await rpc.getProgramAccounts(SAS_PROGRAM_ID2, {
8758
+ encoding: "base64",
8759
+ filters: [
8760
+ {
8761
+ memcmp: {
8762
+ bytes: addressToBase64(binding.credential),
8763
+ offset: BigInt(SAS_CREDENTIAL_OFFSET),
8764
+ encoding: "base64"
8765
+ }
8766
+ },
8767
+ {
8768
+ memcmp: {
8769
+ bytes: addressToBase64(binding.schema),
8770
+ offset: BigInt(SAS_SCHEMA_OFFSET),
8771
+ encoding: "base64"
8772
+ }
8773
+ },
8774
+ {
8775
+ memcmp: {
8776
+ bytes: addressToBase64(binding.juror),
8777
+ offset: BigInt(SAS_WALLET_OFFSET),
8778
+ encoding: "base64"
8779
+ }
8780
+ }
8781
+ ],
8782
+ commitment: config?.commitment
8783
+ }).send();
8784
+ return found.length > 0 ? found[0].pubkey : null;
8785
+ }
8786
+ __name(findSasAttestation, "findSasAttestation");
8658
8787
 
8659
8788
  // src/domain.ts
8660
8789
  import { sha256 as sha2563 } from "@noble/hashes/sha256";
@@ -8807,6 +8936,9 @@ export {
8807
8936
  NO_RULING,
8808
8937
  NO_VOTE,
8809
8938
  ROUND_DISCRIMINATOR,
8939
+ SAS_ATTESTATION_DISCRIMINATOR,
8940
+ SAS_ATTESTATION_MIN_LEN,
8941
+ SAS_PROGRAM_ID,
8810
8942
  SDK_NAME,
8811
8943
  SDK_VERSION,
8812
8944
  SUBACCORD_DISCRIMINATOR,
@@ -8851,6 +8983,7 @@ export {
8851
8983
  createAccordMethods,
8852
8984
  createDispute,
8853
8985
  createSubaccord,
8986
+ decodeSasAttestation,
8854
8987
  decodeScalarVote,
8855
8988
  disputePhase,
8856
8989
  disputeSeeds,
@@ -8901,6 +9034,8 @@ export {
8901
9034
  findPendingUpdatePda,
8902
9035
  findProgramIdentityPda,
8903
9036
  findRoundPda2 as findRoundPda,
9037
+ findSasAttestation,
9038
+ findSasAttestations,
8904
9039
  findSubaccordPda,
8905
9040
  getAccordStateDecoder,
8906
9041
  getAggregationCodec,