@1upmonster/duel 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.
Files changed (39) hide show
  1. package/README.md +120 -59
  2. package/dist/admin.d.ts +8 -1
  3. package/dist/admin.js +52 -9
  4. package/dist/generated/duel/errors/duel.d.ts +1 -3
  5. package/dist/generated/duel/errors/duel.js +2 -4
  6. package/dist/generated/duel/instructions/index.d.ts +2 -0
  7. package/dist/generated/duel/instructions/index.js +3 -1
  8. package/dist/generated/duel/instructions/joinQueue.d.ts +1 -1
  9. package/dist/generated/duel/instructions/joinQueue.js +3 -3
  10. package/dist/generated/duel/instructions/setupQueuePermission.d.ts +51 -0
  11. package/dist/generated/duel/instructions/setupQueuePermission.js +63 -0
  12. package/dist/generated/duel/instructions/setupTicketPermission.d.ts +54 -0
  13. package/dist/generated/duel/instructions/setupTicketPermission.js +63 -0
  14. package/dist/generated/duel/programs/duel.d.ts +11 -3
  15. package/dist/generated/duel/programs/duel.js +19 -3
  16. package/dist/player.d.ts +8 -1
  17. package/dist/player.js +56 -5
  18. package/dist/tee.d.ts +4 -3
  19. package/dist/tee.js +17 -23
  20. package/dist/transaction.d.ts +2 -0
  21. package/dist/transaction.js +30 -19
  22. package/dist/utils.d.ts +10 -0
  23. package/dist/utils.js +28 -1
  24. package/package.json +1 -1
  25. package/src/admin.ts +67 -7
  26. package/src/duel.json +57 -5
  27. package/src/generated/duel/errors/duel.ts +2 -4
  28. package/src/generated/duel/instructions/index.ts +3 -1
  29. package/src/generated/duel/instructions/joinQueue.ts +3 -3
  30. package/src/generated/duel/instructions/setupQueuePermission.ts +112 -0
  31. package/src/generated/duel/instructions/setupTicketPermission.ts +115 -0
  32. package/src/generated/duel/programs/duel.ts +12 -4
  33. package/src/player.ts +72 -1
  34. package/src/tee.ts +18 -22
  35. package/src/transaction.ts +33 -18
  36. package/src/utils.ts +34 -0
  37. package/src/encryption.ts +0 -154
  38. package/src/idl/private_matchmaking.json +0 -1027
  39. package/src/idl/private_matchmaking.ts +0 -1033
package/dist/player.d.ts CHANGED
@@ -8,7 +8,7 @@ export declare class MatchmakingPlayer {
8
8
  getTicket(ticketPda: Address): Promise<import("@solana/accounts").MaybeAccount<import("./generated/duel/index.js").MatchTicket, string>>;
9
9
  createTicket(tenant: Address): Promise<string>;
10
10
  delegateTicket(player: Address, tenant: Address, validator?: Address): Promise<string>;
11
- joinQueue(queue: Address, tenant: Address, playerData: Address): Promise<string>;
11
+ joinQueue(queue: Address, tenant: Address, playerData: Address, callbackProgram?: Address): Promise<string>;
12
12
  cancelTicket(tenant: Address): Promise<string>;
13
13
  closeTicket(tenant: Address): Promise<string>;
14
14
  /**
@@ -19,6 +19,13 @@ export declare class MatchmakingPlayer {
19
19
  opponent: Address;
20
20
  matchId: bigint;
21
21
  } | null>;
22
+ /**
23
+ * High-level: full matchmaking TEE entry flow.
24
+ * Creates ticket on L1, sets up permission PDA (so only player + queue authority can read it),
25
+ * delegates the permission PDA and ticket to TEE, then joins the queue.
26
+ * Use individual methods (createTicket, delegateTicket, joinQueue) as escape hatches if needed.
27
+ */
28
+ enterQueue(tenant: Address, queue: Address, playerData: Address, teeRpc: Rpc<SolanaRpcApi>, teeUrlWithToken: string, validator?: Address, callbackProgram?: Address): Promise<Address>;
22
29
  /** Create a new MatchmakingPlayer pointing at a TEE RPC endpoint. */
23
30
  withRpc(teeUrl: string): MatchmakingPlayer;
24
31
  }
package/dist/player.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createSolanaRpc, } from "@solana/kit";
2
- import { getCreateTicketInstructionAsync, getDelegateTicketInstructionAsync, getJoinQueueInstructionAsync, getCancelTicketInstructionAsync, getCloseTicketInstructionAsync, fetchMaybeMatchTicket, accountType, } from "./generated/duel/index.js";
1
+ import { createSolanaRpc, AccountRole, } from "@solana/kit";
2
+ import { getCreateTicketInstructionAsync, getDelegateTicketInstructionAsync, getSetupTicketPermissionInstructionAsync, getJoinQueueInstructionAsync, getCancelTicketInstructionAsync, getCloseTicketInstructionAsync, fetchMaybeMatchTicket, accountType, } from "./generated/duel/index.js";
3
3
  import { sendInstruction } from "./transaction.js";
4
4
  import * as utils from "./utils.js";
5
5
  const DUEL_PROGRAM_ID = "EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X";
@@ -32,14 +32,18 @@ export class MatchmakingPlayer {
32
32
  }, { programAddress: this.programId });
33
33
  return sendInstruction(this.rpc, ix, this.signer);
34
34
  }
35
- async joinQueue(queue, tenant, playerData) {
35
+ async joinQueue(queue, tenant, playerData, callbackProgram) {
36
36
  const ix = await getJoinQueueInstructionAsync({
37
37
  queue,
38
38
  tenant,
39
39
  playerData,
40
40
  signer: this.signer,
41
41
  }, { programAddress: this.programId });
42
- return sendInstruction(this.rpc, ix, this.signer);
42
+ const ixFinal = callbackProgram
43
+ ? { ...ix, accounts: [...ix.accounts, { address: callbackProgram, role: 0 }] }
44
+ : ix;
45
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
+ return sendInstruction(this.rpc, ixFinal, this.signer);
43
47
  }
44
48
  async cancelTicket(tenant) {
45
49
  const ix = await getCancelTicketInstructionAsync({
@@ -79,9 +83,56 @@ export class MatchmakingPlayer {
79
83
  }
80
84
  return null;
81
85
  }
86
+ /**
87
+ * High-level: full matchmaking TEE entry flow.
88
+ * Creates ticket on L1, sets up permission PDA (so only player + queue authority can read it),
89
+ * delegates the permission PDA and ticket to TEE, then joins the queue.
90
+ * Use individual methods (createTicket, delegateTicket, joinQueue) as escape hatches if needed.
91
+ */
92
+ async enterQueue(tenant, queue, playerData, teeRpc, teeUrlWithToken, validator, callbackProgram) {
93
+ const player = this.signer.address;
94
+ const ticketPda = await this.getTicketPda(player, tenant);
95
+ // 1. Create ticket on L1
96
+ await this.createTicket(tenant);
97
+ // 2. Create Permission PDA for the ticket (CPI from duel program with invoke_signed)
98
+ const permissionPda = await utils.derivePermissionPda(ticketPda);
99
+ const setupIx = await getSetupTicketPermissionInstructionAsync({
100
+ player: this.signer,
101
+ tenant,
102
+ permission: permissionPda,
103
+ permissionProgram: utils.PERMISSION_PROGRAM,
104
+ }, { programAddress: this.programId });
105
+ await sendInstruction(this.rpc, setupIx, this.signer);
106
+ // 3. Delegate Permission PDA to TEE (called on permission program, player signs)
107
+ const { delegationBuffer, delegationRecord, delegationMetadata } = await utils.derivePermissionDelegationPdas(permissionPda);
108
+ const delegatePermIx = {
109
+ programAddress: utils.PERMISSION_PROGRAM,
110
+ data: new Uint8Array([3, 0, 0, 0, 0, 0, 0, 0]),
111
+ accounts: [
112
+ { address: this.signer.address, role: AccountRole.WRITABLE_SIGNER },
113
+ { address: this.signer.address, role: AccountRole.READONLY_SIGNER },
114
+ { address: ticketPda, role: AccountRole.READONLY },
115
+ { address: permissionPda, role: AccountRole.WRITABLE },
116
+ { address: "11111111111111111111111111111111", role: AccountRole.READONLY },
117
+ { address: utils.PERMISSION_PROGRAM, role: AccountRole.READONLY },
118
+ { address: delegationBuffer, role: AccountRole.WRITABLE },
119
+ { address: delegationRecord, role: AccountRole.WRITABLE },
120
+ { address: delegationMetadata, role: AccountRole.WRITABLE },
121
+ { address: utils.DELEGATION_PROGRAM, role: AccountRole.READONLY },
122
+ ...(validator ? [{ address: validator, role: AccountRole.READONLY }] : []),
123
+ ],
124
+ };
125
+ await sendInstruction(this.rpc, delegatePermIx, this.signer);
126
+ // 4. Delegate ticket to TEE
127
+ await this.delegateTicket(player, tenant, validator);
128
+ // 5. Join the queue on TEE
129
+ const teeClient = new MatchmakingPlayer(teeRpc, this.signer, this.programId);
130
+ await teeClient.joinQueue(queue, tenant, playerData, callbackProgram);
131
+ return ticketPda;
132
+ }
82
133
  /** Create a new MatchmakingPlayer pointing at a TEE RPC endpoint. */
83
134
  withRpc(teeUrl) {
84
135
  return new MatchmakingPlayer(createSolanaRpc(teeUrl), this.signer, this.programId);
85
136
  }
86
137
  }
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxHQUtoQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLGlDQUFpQyxFQUNqQyw0QkFBNEIsRUFDNUIsK0JBQStCLEVBQy9CLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIsV0FBVyxHQUNaLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE1BQU0sZUFBZSxHQUFHLDhDQUF5RCxDQUFDO0FBRWxGLE1BQU0sT0FBTyxpQkFBaUI7SUFLNUIsWUFDRSxHQUFzQixFQUN0QixNQUF5QixFQUN6QixZQUFxQixlQUFlO1FBRXBDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBZSxFQUFFLE1BQWU7UUFDakQsT0FBTyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQWtCO1FBQ2hDLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFlO1FBQ2hDLE1BQU0sRUFBRSxHQUFHLE1BQU0sK0JBQStCLENBQUM7WUFDL0MsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLE1BQU07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QU07b0JBQUUsU0FBUztnQkFDbEMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ3ZDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDaEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2hFLENBQUM7WUFDSCxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLHlDQUF5QztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSxPQUFPLENBQUMsTUFBYztRQUNwQixPQUFPLElBQUksaUJBQWlCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNyZWF0ZVNvbGFuYVJwYyxcbiAgdHlwZSBBZGRyZXNzLFxuICB0eXBlIFRyYW5zYWN0aW9uU2lnbmVyLFxuICB0eXBlIFJwYyxcbiAgdHlwZSBTb2xhbmFScGNBcGksXG59IGZyb20gXCJAc29sYW5hL2tpdFwiO1xuaW1wb3J0IHtcbiAgZ2V0Q3JlYXRlVGlja2V0SW5zdHJ1Y3Rpb25Bc3luYyxcbiAgZ2V0RGVsZWdhdGVUaWNrZXRJbnN0cnVjdGlvbkFzeW5jLFxuICBnZXRKb2luUXVldWVJbnN0cnVjdGlvbkFzeW5jLFxuICBnZXRDYW5jZWxUaWNrZXRJbnN0cnVjdGlvbkFzeW5jLFxuICBnZXRDbG9zZVRpY2tldEluc3RydWN0aW9uQXN5bmMsXG4gIGZldGNoTWF5YmVNYXRjaFRpY2tldCxcbiAgYWNjb3VudFR5cGUsXG59IGZyb20gXCIuL2dlbmVyYXRlZC9kdWVsL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBzZW5kSW5zdHJ1Y3Rpb24gfSBmcm9tIFwiLi90cmFuc2FjdGlvbi5qc1wiO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSBcIi4vdXRpbHMuanNcIjtcblxuY29uc3QgRFVFTF9QUk9HUkFNX0lEID0gXCJFZFp6VXdLZDFYMlpXanhMUHB6MWNwRXpNRjdSVVpDNDNQcTY0djFWY0s1WFwiIGFzIEFkZHJlc3M7XG5cbmV4cG9ydCBjbGFzcyBNYXRjaG1ha2luZ1BsYXllciB7XG4gIHB1YmxpYyBycGM6IFJwYzxTb2xhbmFScGNBcGk+O1xuICBwdWJsaWMgc2lnbmVyOiBUcmFuc2FjdGlvblNpZ25lcjtcbiAgcHVibGljIHByb2dyYW1JZDogQWRkcmVzcztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBycGM6IFJwYzxTb2xhbmFScGNBcGk+LFxuICAgIHNpZ25lcjogVHJhbnNhY3Rpb25TaWduZXIsXG4gICAgcHJvZ3JhbUlkOiBBZGRyZXNzID0gRFVFTF9QUk9HUkFNX0lELFxuICApIHtcbiAgICB0aGlzLnJwYyA9IHJwYztcbiAgICB0aGlzLnNpZ25lciA9IHNpZ25lcjtcbiAgICB0aGlzLnByb2dyYW1JZCA9IHByb2dyYW1JZDtcbiAgfVxuXG4gIGFzeW5jIGdldFRpY2tldFBkYShwbGF5ZXI6IEFkZHJlc3MsIHRlbmFudDogQWRkcmVzcyk6IFByb21pc2U8QWRkcmVzcz4ge1xuICAgIHJldHVybiB1dGlscy5kZXJpdmVUaWNrZXRQZGEodGhpcy5wcm9ncmFtSWQsIHBsYXllciwgdGVuYW50KTtcbiAgfVxuXG4gIGFzeW5jIGdldFRpY2tldCh0aWNrZXRQZGE6IEFkZHJlc3MpIHtcbiAgICByZXR1cm4gZmV0Y2hNYXliZU1hdGNoVGlja2V0KHRoaXMucnBjLCB0aWNrZXRQZGEpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVGlja2V0KHRlbmFudDogQWRkcmVzcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCBnZXRDcmVhdGVUaWNrZXRJbnN0cnVjdGlvbkFzeW5jKHtcbiAgICAgIHBsYXllcjogdGhpcy5zaWduZXIsXG4gICAgICB0ZW5hbnQsXG4gICAgfSwgeyBwcm9ncmFtQWRkcmVzczogdGhpcy5wcm9ncmFtSWQgfSk7XG4gICAgcmV0dXJuIHNlbmRJbnN0cnVjdGlvbih0aGlzLnJwYywgaXgsIHRoaXMuc2lnbmVyKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGVnYXRlVGlja2V0KFxuICAgIHBsYXllcjogQWRkcmVzcyxcbiAgICB0ZW5hbnQ6IEFkZHJlc3MsXG4gICAgdmFsaWRhdG9yPzogQWRkcmVzcyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0aWNrZXRQZGEgPSBhd2FpdCB0aGlzLmdldFRpY2tldFBkYShwbGF5ZXIsIHRlbmFudCk7XG4gICAgY29uc3QgaXggPSBhd2FpdCBnZXREZWxlZ2F0ZVRpY2tldEluc3RydWN0aW9uQXN5bmMoe1xuICAgICAgcGRhOiB0aWNrZXRQZGEsXG4gICAgICBwYXllcjogdGhpcy5zaWduZXIsXG4gICAgICB2YWxpZGF0b3IsXG4gICAgICBhY2NvdW50VHlwZTogYWNjb3VudFR5cGUoXCJUaWNrZXRcIiwgeyBwbGF5ZXIsIHRlbmFudCB9KSxcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcbiAgICByZXR1cm4gc2VuZEluc3RydWN0aW9uKHRoaXMucnBjLCBpeCwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgYXN5bmMgam9pblF1ZXVlKFxuICAgIHF1ZXVlOiBBZGRyZXNzLFxuICAgIHRlbmFudDogQWRkcmVzcyxcbiAgICBwbGF5ZXJEYXRhOiBBZGRyZXNzLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgZ2V0Sm9pblF1ZXVlSW5zdHJ1Y3Rpb25Bc3luYyh7XG4gICAgICBxdWV1ZSxcbiAgICAgIHRlbmFudCxcbiAgICAgIHBsYXllckRhdGEsXG4gICAgICBzaWduZXI6IHRoaXMuc2lnbmVyLFxuICAgIH0sIHsgcHJvZ3JhbUFkZHJlc3M6IHRoaXMucHJvZ3JhbUlkIH0pO1xuICAgIHJldHVybiBzZW5kSW5zdHJ1Y3Rpb24odGhpcy5ycGMsIGl4LCB0aGlzLnNpZ25lcik7XG4gIH1cblxuICBhc3luYyBjYW5jZWxUaWNrZXQodGVuYW50OiBBZGRyZXNzKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IGdldENhbmNlbFRpY2tldEluc3RydWN0aW9uQXN5bmMoe1xuICAgICAgcGxheWVyOiB0aGlzLnNpZ25lcixcbiAgICAgIHRlbmFudCxcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcbiAgICByZXR1cm4gc2VuZEluc3RydWN0aW9uKHRoaXMucnBjLCBpeCwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2VUaWNrZXQodGVuYW50OiBBZGRyZXNzKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IGdldENsb3NlVGlja2V0SW5zdHJ1Y3Rpb25Bc3luYyh7XG4gICAgICBwbGF5ZXI6IHRoaXMuc2lnbmVyLFxuICAgICAgdGVuYW50LFxuICAgIH0sIHsgcHJvZ3JhbUFkZHJlc3M6IHRoaXMucHJvZ3JhbUlkIH0pO1xuICAgIHJldHVybiBzZW5kSW5zdHJ1Y3Rpb24odGhpcy5ycGMsIGl4LCB0aGlzLnNpZ25lcik7XG4gIH1cblxuICAvKipcbiAgICogUG9sbCBMMSBmb3IgdGlja2V0IHN0YXR1cy5cbiAgICogUmV0dXJucyBtYXRjaCBpbmZvIHdoZW4gc3RhdHVzIGJlY29tZXMgTWF0Y2hlZC5cbiAgICovXG4gIGFzeW5jIHBvbGxGb3JNYXRjaChcbiAgICB0aWNrZXRQZGE6IEFkZHJlc3MsXG4gICAgbWF4QXR0ZW1wdHMgPSA2MCxcbiAgICBwb2xsSW50ZXJ2YWwgPSAyMDAwLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHsgb3Bwb25lbnQ6IEFkZHJlc3M7IG1hdGNoSWQ6IGJpZ2ludCB9IHwgbnVsbD4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4QXR0ZW1wdHM7IGkrKykge1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgcmV0dXJuIG51bGw7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBwb2xsSW50ZXJ2YWwpKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1heWJlVGlja2V0ID0gYXdhaXQgZmV0Y2hNYXliZU1hdGNoVGlja2V0KHRoaXMucnBjLCB0aWNrZXRQZGEpO1xuICAgICAgICBpZiAoIW1heWJlVGlja2V0LmV4aXN0cykgY29udGludWU7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IG1heWJlVGlja2V0LmRhdGEuc3RhdHVzO1xuICAgICAgICBpZiAoc3RhdHVzLl9fa2luZCA9PT0gXCJNYXRjaGVkXCIpIHtcbiAgICAgICAgICByZXR1cm4geyBvcHBvbmVudDogc3RhdHVzLm9wcG9uZW50LCBtYXRjaElkOiBzdGF0dXMubWF0Y2hJZCB9O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWdub3JlIGRlY29kZSBlcnJvcnMgZHVyaW5nIHRyYW5zaXRpb25cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbmV3IE1hdGNobWFraW5nUGxheWVyIHBvaW50aW5nIGF0IGEgVEVFIFJQQyBlbmRwb2ludC4gKi9cbiAgd2l0aFJwYyh0ZWVVcmw6IHN0cmluZyk6IE1hdGNobWFraW5nUGxheWVyIHtcbiAgICByZXR1cm4gbmV3IE1hdGNobWFraW5nUGxheWVyKGNyZWF0ZVNvbGFuYVJwYyh0ZWVVcmwpLCB0aGlzLnNpZ25lciwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG59XG4iXX0=
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFdBQVcsR0FNWixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLGlDQUFpQyxFQUNqQyx3Q0FBd0MsRUFDeEMsNEJBQTRCLEVBQzVCLCtCQUErQixFQUMvQiw4QkFBOEIsRUFDOUIscUJBQXFCLEVBQ3JCLFdBQVcsR0FDWixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLGVBQWUsR0FBRyw4Q0FBeUQsQ0FBQztBQUVsRixNQUFNLE9BQU8saUJBQWlCO0lBSzVCLFlBQ0UsR0FBc0IsRUFDdEIsTUFBeUIsRUFDekIsWUFBcUIsZUFBZTtRQUVwQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQWUsRUFBRSxNQUFlO1FBQ2pELE9BQU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFrQjtRQUNoQyxPQUFPLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBZTtRQUNoQyxNQUFNLEVBQUUsR0FBRyxNQUFNLCtCQUErQixDQUFDO1lBQy9DLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixNQUFNO1NBQ1AsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN2QyxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjLENBQ2xCLE1BQWUsRUFDZixNQUFlLEVBQ2YsU0FBbUI7UUFFbkIsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRCxNQUFNLEVBQUUsR0FBRyxNQUFNLGlDQUFpQyxDQUFDO1lBQ2pELEdBQUcsRUFBRSxTQUFTO1lBQ2QsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ2xCLFNBQVM7WUFDVCxXQUFXLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUN2RCxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FDYixLQUFjLEVBQ2QsTUFBZSxFQUNmLFVBQW1CLEVBQ25CLGVBQXlCO1FBRXpCLE1BQU0sRUFBRSxHQUFHLE1BQU0sNEJBQTRCLENBQUM7WUFDNUMsS0FBSztZQUNMLE1BQU07WUFDTixVQUFVO1lBQ1YsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3BCLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsZUFBZTtZQUM3QixDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFVLEVBQUUsQ0FBQyxFQUFFO1lBQ3ZGLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCw4REFBOEQ7UUFDOUQsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFjLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQWU7UUFDaEMsTUFBTSxFQUFFLEdBQUcsTUFBTSwrQkFBK0IsQ0FBQztZQUMvQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsTUFBTTtTQUNQLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkMsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQWU7UUFDL0IsTUFBTSxFQUFFLEdBQUcsTUFBTSw4QkFBOEIsQ0FBQztZQUM5QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsTUFBTTtTQUNQLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkMsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUNoQixTQUFrQixFQUNsQixXQUFXLEdBQUcsRUFBRSxFQUNoQixZQUFZLEdBQUcsSUFBSSxFQUNuQixNQUFvQjtRQUVwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsSUFBSSxNQUFNLEVBQUUsT0FBTztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUNqQyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0scUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO29CQUFFLFNBQVM7Z0JBQ2xDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUN2QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ2hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNoRSxDQUFDO1lBQ0gsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCx5Q0FBeUM7WUFDM0MsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQ2QsTUFBZSxFQUNmLEtBQWMsRUFDZCxVQUFtQixFQUNuQixNQUF5QixFQUN6QixlQUF1QixFQUN2QixTQUFtQixFQUNuQixlQUF5QjtRQUV6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQWtCLENBQUM7UUFDOUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUxRCx5QkFBeUI7UUFDekIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWhDLHFGQUFxRjtRQUNyRixNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxNQUFNLE9BQU8sR0FBRyxNQUFNLHdDQUF3QyxDQUFDO1lBQzdELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixNQUFNO1lBQ04sVUFBVSxFQUFFLGFBQWE7WUFDekIsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtTQUM1QyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0RCxpRkFBaUY7UUFDakYsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLEdBQzlELE1BQU0sS0FBSyxDQUFDLDhCQUE4QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVELE1BQU0sY0FBYyxHQUFnQjtZQUNsQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtZQUN4QyxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsUUFBUSxFQUFFO2dCQUNSLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsZUFBZSxFQUFFO2dCQUNuRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLGVBQWUsRUFBRTtnQkFDbkUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUNsRCxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3RELEVBQUUsT0FBTyxFQUFFLGtDQUE2QyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUN0RixFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pFLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUN6RCxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRTtnQkFDekQsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUU7Z0JBQzNELEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRTtnQkFDakUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDM0U7U0FDRixDQUFDO1FBQ0YsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdELDRCQUE0QjtRQUM1QixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVyRCwyQkFBMkI7UUFDM0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0UsTUFBTSxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRXRFLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxxRUFBcUU7SUFDckUsT0FBTyxDQUFDLE1BQWM7UUFDcEIsT0FBTyxJQUFJLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjcmVhdGVTb2xhbmFScGMsXG4gIEFjY291bnRSb2xlLFxuICB0eXBlIEFkZHJlc3MsXG4gIHR5cGUgVHJhbnNhY3Rpb25TaWduZXIsXG4gIHR5cGUgUnBjLFxuICB0eXBlIFNvbGFuYVJwY0FwaSxcbiAgdHlwZSBJbnN0cnVjdGlvbixcbn0gZnJvbSBcIkBzb2xhbmEva2l0XCI7XG5pbXBvcnQge1xuICBnZXRDcmVhdGVUaWNrZXRJbnN0cnVjdGlvbkFzeW5jLFxuICBnZXREZWxlZ2F0ZVRpY2tldEluc3RydWN0aW9uQXN5bmMsXG4gIGdldFNldHVwVGlja2V0UGVybWlzc2lvbkluc3RydWN0aW9uQXN5bmMsXG4gIGdldEpvaW5RdWV1ZUluc3RydWN0aW9uQXN5bmMsXG4gIGdldENhbmNlbFRpY2tldEluc3RydWN0aW9uQXN5bmMsXG4gIGdldENsb3NlVGlja2V0SW5zdHJ1Y3Rpb25Bc3luYyxcbiAgZmV0Y2hNYXliZU1hdGNoVGlja2V0LFxuICBhY2NvdW50VHlwZSxcbn0gZnJvbSBcIi4vZ2VuZXJhdGVkL2R1ZWwvaW5kZXguanNcIjtcbmltcG9ydCB7IHNlbmRJbnN0cnVjdGlvbiB9IGZyb20gXCIuL3RyYW5zYWN0aW9uLmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tIFwiLi91dGlscy5qc1wiO1xuXG5jb25zdCBEVUVMX1BST0dSQU1fSUQgPSBcIkVkWnpVd0tkMVgyWldqeExQcHoxY3BFek1GN1JVWkM0M1BxNjR2MVZjSzVYXCIgYXMgQWRkcmVzcztcblxuZXhwb3J0IGNsYXNzIE1hdGNobWFraW5nUGxheWVyIHtcbiAgcHVibGljIHJwYzogUnBjPFNvbGFuYVJwY0FwaT47XG4gIHB1YmxpYyBzaWduZXI6IFRyYW5zYWN0aW9uU2lnbmVyO1xuICBwdWJsaWMgcHJvZ3JhbUlkOiBBZGRyZXNzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJwYzogUnBjPFNvbGFuYVJwY0FwaT4sXG4gICAgc2lnbmVyOiBUcmFuc2FjdGlvblNpZ25lcixcbiAgICBwcm9ncmFtSWQ6IEFkZHJlc3MgPSBEVUVMX1BST0dSQU1fSUQsXG4gICkge1xuICAgIHRoaXMucnBjID0gcnBjO1xuICAgIHRoaXMuc2lnbmVyID0gc2lnbmVyO1xuICAgIHRoaXMucHJvZ3JhbUlkID0gcHJvZ3JhbUlkO1xuICB9XG5cbiAgYXN5bmMgZ2V0VGlja2V0UGRhKHBsYXllcjogQWRkcmVzcywgdGVuYW50OiBBZGRyZXNzKTogUHJvbWlzZTxBZGRyZXNzPiB7XG4gICAgcmV0dXJuIHV0aWxzLmRlcml2ZVRpY2tldFBkYSh0aGlzLnByb2dyYW1JZCwgcGxheWVyLCB0ZW5hbnQpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VGlja2V0KHRpY2tldFBkYTogQWRkcmVzcykge1xuICAgIHJldHVybiBmZXRjaE1heWJlTWF0Y2hUaWNrZXQodGhpcy5ycGMsIHRpY2tldFBkYSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVUaWNrZXQodGVuYW50OiBBZGRyZXNzKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IGdldENyZWF0ZVRpY2tldEluc3RydWN0aW9uQXN5bmMoe1xuICAgICAgcGxheWVyOiB0aGlzLnNpZ25lcixcbiAgICAgIHRlbmFudCxcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcbiAgICByZXR1cm4gc2VuZEluc3RydWN0aW9uKHRoaXMucnBjLCBpeCwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgYXN5bmMgZGVsZWdhdGVUaWNrZXQoXG4gICAgcGxheWVyOiBBZGRyZXNzLFxuICAgIHRlbmFudDogQWRkcmVzcyxcbiAgICB2YWxpZGF0b3I/OiBBZGRyZXNzLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpY2tldFBkYSA9IGF3YWl0IHRoaXMuZ2V0VGlja2V0UGRhKHBsYXllciwgdGVuYW50KTtcbiAgICBjb25zdCBpeCA9IGF3YWl0IGdldERlbGVnYXRlVGlja2V0SW5zdHJ1Y3Rpb25Bc3luYyh7XG4gICAgICBwZGE6IHRpY2tldFBkYSxcbiAgICAgIHBheWVyOiB0aGlzLnNpZ25lcixcbiAgICAgIHZhbGlkYXRvcixcbiAgICAgIGFjY291bnRUeXBlOiBhY2NvdW50VHlwZShcIlRpY2tldFwiLCB7IHBsYXllciwgdGVuYW50IH0pLFxuICAgIH0sIHsgcHJvZ3JhbUFkZHJlc3M6IHRoaXMucHJvZ3JhbUlkIH0pO1xuICAgIHJldHVybiBzZW5kSW5zdHJ1Y3Rpb24odGhpcy5ycGMsIGl4LCB0aGlzLnNpZ25lcik7XG4gIH1cblxuICBhc3luYyBqb2luUXVldWUoXG4gICAgcXVldWU6IEFkZHJlc3MsXG4gICAgdGVuYW50OiBBZGRyZXNzLFxuICAgIHBsYXllckRhdGE6IEFkZHJlc3MsXG4gICAgY2FsbGJhY2tQcm9ncmFtPzogQWRkcmVzcyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IGdldEpvaW5RdWV1ZUluc3RydWN0aW9uQXN5bmMoe1xuICAgICAgcXVldWUsXG4gICAgICB0ZW5hbnQsXG4gICAgICBwbGF5ZXJEYXRhLFxuICAgICAgc2lnbmVyOiB0aGlzLnNpZ25lcixcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcbiAgICBjb25zdCBpeEZpbmFsID0gY2FsbGJhY2tQcm9ncmFtXG4gICAgICA/IHsgLi4uaXgsIGFjY291bnRzOiBbLi4uaXguYWNjb3VudHMsIHsgYWRkcmVzczogY2FsbGJhY2tQcm9ncmFtLCByb2xlOiAwIGFzIGNvbnN0IH1dIH1cbiAgICAgIDogaXg7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICByZXR1cm4gc2VuZEluc3RydWN0aW9uKHRoaXMucnBjLCBpeEZpbmFsIGFzIGFueSwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgYXN5bmMgY2FuY2VsVGlja2V0KHRlbmFudDogQWRkcmVzcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCBnZXRDYW5jZWxUaWNrZXRJbnN0cnVjdGlvbkFzeW5jKHtcbiAgICAgIHBsYXllcjogdGhpcy5zaWduZXIsXG4gICAgICB0ZW5hbnQsXG4gICAgfSwgeyBwcm9ncmFtQWRkcmVzczogdGhpcy5wcm9ncmFtSWQgfSk7XG4gICAgcmV0dXJuIHNlbmRJbnN0cnVjdGlvbih0aGlzLnJwYywgaXgsIHRoaXMuc2lnbmVyKTtcbiAgfVxuXG4gIGFzeW5jIGNsb3NlVGlja2V0KHRlbmFudDogQWRkcmVzcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCBnZXRDbG9zZVRpY2tldEluc3RydWN0aW9uQXN5bmMoe1xuICAgICAgcGxheWVyOiB0aGlzLnNpZ25lcixcbiAgICAgIHRlbmFudCxcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcbiAgICByZXR1cm4gc2VuZEluc3RydWN0aW9uKHRoaXMucnBjLCBpeCwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGwgTDEgZm9yIHRpY2tldCBzdGF0dXMuXG4gICAqIFJldHVybnMgbWF0Y2ggaW5mbyB3aGVuIHN0YXR1cyBiZWNvbWVzIE1hdGNoZWQuXG4gICAqL1xuICBhc3luYyBwb2xsRm9yTWF0Y2goXG4gICAgdGlja2V0UGRhOiBBZGRyZXNzLFxuICAgIG1heEF0dGVtcHRzID0gNjAsXG4gICAgcG9sbEludGVydmFsID0gMjAwMCxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx7IG9wcG9uZW50OiBBZGRyZXNzOyBtYXRjaElkOiBiaWdpbnQgfSB8IG51bGw+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heEF0dGVtcHRzOyBpKyspIHtcbiAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHJldHVybiBudWxsO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgcG9sbEludGVydmFsKSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYXliZVRpY2tldCA9IGF3YWl0IGZldGNoTWF5YmVNYXRjaFRpY2tldCh0aGlzLnJwYywgdGlja2V0UGRhKTtcbiAgICAgICAgaWYgKCFtYXliZVRpY2tldC5leGlzdHMpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBtYXliZVRpY2tldC5kYXRhLnN0YXR1cztcbiAgICAgICAgaWYgKHN0YXR1cy5fX2tpbmQgPT09IFwiTWF0Y2hlZFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHsgb3Bwb25lbnQ6IHN0YXR1cy5vcHBvbmVudCwgbWF0Y2hJZDogc3RhdHVzLm1hdGNoSWQgfTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElnbm9yZSBkZWNvZGUgZXJyb3JzIGR1cmluZyB0cmFuc2l0aW9uXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZ2gtbGV2ZWw6IGZ1bGwgbWF0Y2htYWtpbmcgVEVFIGVudHJ5IGZsb3cuXG4gICAqIENyZWF0ZXMgdGlja2V0IG9uIEwxLCBzZXRzIHVwIHBlcm1pc3Npb24gUERBIChzbyBvbmx5IHBsYXllciArIHF1ZXVlIGF1dGhvcml0eSBjYW4gcmVhZCBpdCksXG4gICAqIGRlbGVnYXRlcyB0aGUgcGVybWlzc2lvbiBQREEgYW5kIHRpY2tldCB0byBURUUsIHRoZW4gam9pbnMgdGhlIHF1ZXVlLlxuICAgKiBVc2UgaW5kaXZpZHVhbCBtZXRob2RzIChjcmVhdGVUaWNrZXQsIGRlbGVnYXRlVGlja2V0LCBqb2luUXVldWUpIGFzIGVzY2FwZSBoYXRjaGVzIGlmIG5lZWRlZC5cbiAgICovXG4gIGFzeW5jIGVudGVyUXVldWUoXG4gICAgdGVuYW50OiBBZGRyZXNzLFxuICAgIHF1ZXVlOiBBZGRyZXNzLFxuICAgIHBsYXllckRhdGE6IEFkZHJlc3MsXG4gICAgdGVlUnBjOiBScGM8U29sYW5hUnBjQXBpPixcbiAgICB0ZWVVcmxXaXRoVG9rZW46IHN0cmluZyxcbiAgICB2YWxpZGF0b3I/OiBBZGRyZXNzLFxuICAgIGNhbGxiYWNrUHJvZ3JhbT86IEFkZHJlc3MsXG4gICk6IFByb21pc2U8QWRkcmVzcz4ge1xuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2lnbmVyLmFkZHJlc3MgYXMgQWRkcmVzcztcbiAgICBjb25zdCB0aWNrZXRQZGEgPSBhd2FpdCB0aGlzLmdldFRpY2tldFBkYShwbGF5ZXIsIHRlbmFudCk7XG5cbiAgICAvLyAxLiBDcmVhdGUgdGlja2V0IG9uIEwxXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVUaWNrZXQodGVuYW50KTtcblxuICAgIC8vIDIuIENyZWF0ZSBQZXJtaXNzaW9uIFBEQSBmb3IgdGhlIHRpY2tldCAoQ1BJIGZyb20gZHVlbCBwcm9ncmFtIHdpdGggaW52b2tlX3NpZ25lZClcbiAgICBjb25zdCBwZXJtaXNzaW9uUGRhID0gYXdhaXQgdXRpbHMuZGVyaXZlUGVybWlzc2lvblBkYSh0aWNrZXRQZGEpO1xuICAgIGNvbnN0IHNldHVwSXggPSBhd2FpdCBnZXRTZXR1cFRpY2tldFBlcm1pc3Npb25JbnN0cnVjdGlvbkFzeW5jKHtcbiAgICAgIHBsYXllcjogdGhpcy5zaWduZXIsXG4gICAgICB0ZW5hbnQsXG4gICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uUGRhLFxuICAgICAgcGVybWlzc2lvblByb2dyYW06IHV0aWxzLlBFUk1JU1NJT05fUFJPR1JBTSxcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcbiAgICBhd2FpdCBzZW5kSW5zdHJ1Y3Rpb24odGhpcy5ycGMsIHNldHVwSXgsIHRoaXMuc2lnbmVyKTtcblxuICAgIC8vIDMuIERlbGVnYXRlIFBlcm1pc3Npb24gUERBIHRvIFRFRSAoY2FsbGVkIG9uIHBlcm1pc3Npb24gcHJvZ3JhbSwgcGxheWVyIHNpZ25zKVxuICAgIGNvbnN0IHsgZGVsZWdhdGlvbkJ1ZmZlciwgZGVsZWdhdGlvblJlY29yZCwgZGVsZWdhdGlvbk1ldGFkYXRhIH0gPVxuICAgICAgYXdhaXQgdXRpbHMuZGVyaXZlUGVybWlzc2lvbkRlbGVnYXRpb25QZGFzKHBlcm1pc3Npb25QZGEpO1xuICAgIGNvbnN0IGRlbGVnYXRlUGVybUl4OiBJbnN0cnVjdGlvbiA9IHtcbiAgICAgIHByb2dyYW1BZGRyZXNzOiB1dGlscy5QRVJNSVNTSU9OX1BST0dSQU0sXG4gICAgICBkYXRhOiBuZXcgVWludDhBcnJheShbMywgMCwgMCwgMCwgMCwgMCwgMCwgMF0pLFxuICAgICAgYWNjb3VudHM6IFtcbiAgICAgICAgeyBhZGRyZXNzOiB0aGlzLnNpZ25lci5hZGRyZXNzLCByb2xlOiBBY2NvdW50Um9sZS5XUklUQUJMRV9TSUdORVIgfSxcbiAgICAgICAgeyBhZGRyZXNzOiB0aGlzLnNpZ25lci5hZGRyZXNzLCByb2xlOiBBY2NvdW50Um9sZS5SRUFET05MWV9TSUdORVIgfSxcbiAgICAgICAgeyBhZGRyZXNzOiB0aWNrZXRQZGEsIHJvbGU6IEFjY291bnRSb2xlLlJFQURPTkxZIH0sXG4gICAgICAgIHsgYWRkcmVzczogcGVybWlzc2lvblBkYSwgcm9sZTogQWNjb3VudFJvbGUuV1JJVEFCTEUgfSxcbiAgICAgICAgeyBhZGRyZXNzOiBcIjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIgYXMgQWRkcmVzcywgcm9sZTogQWNjb3VudFJvbGUuUkVBRE9OTFkgfSxcbiAgICAgICAgeyBhZGRyZXNzOiB1dGlscy5QRVJNSVNTSU9OX1BST0dSQU0sIHJvbGU6IEFjY291bnRSb2xlLlJFQURPTkxZIH0sXG4gICAgICAgIHsgYWRkcmVzczogZGVsZWdhdGlvbkJ1ZmZlciwgcm9sZTogQWNjb3VudFJvbGUuV1JJVEFCTEUgfSxcbiAgICAgICAgeyBhZGRyZXNzOiBkZWxlZ2F0aW9uUmVjb3JkLCByb2xlOiBBY2NvdW50Um9sZS5XUklUQUJMRSB9LFxuICAgICAgICB7IGFkZHJlc3M6IGRlbGVnYXRpb25NZXRhZGF0YSwgcm9sZTogQWNjb3VudFJvbGUuV1JJVEFCTEUgfSxcbiAgICAgICAgeyBhZGRyZXNzOiB1dGlscy5ERUxFR0FUSU9OX1BST0dSQU0sIHJvbGU6IEFjY291bnRSb2xlLlJFQURPTkxZIH0sXG4gICAgICAgIC4uLih2YWxpZGF0b3IgPyBbeyBhZGRyZXNzOiB2YWxpZGF0b3IsIHJvbGU6IEFjY291bnRSb2xlLlJFQURPTkxZIH1dIDogW10pLFxuICAgICAgXSxcbiAgICB9O1xuICAgIGF3YWl0IHNlbmRJbnN0cnVjdGlvbih0aGlzLnJwYywgZGVsZWdhdGVQZXJtSXgsIHRoaXMuc2lnbmVyKTtcblxuICAgIC8vIDQuIERlbGVnYXRlIHRpY2tldCB0byBURUVcbiAgICBhd2FpdCB0aGlzLmRlbGVnYXRlVGlja2V0KHBsYXllciwgdGVuYW50LCB2YWxpZGF0b3IpO1xuXG4gICAgLy8gNS4gSm9pbiB0aGUgcXVldWUgb24gVEVFXG4gICAgY29uc3QgdGVlQ2xpZW50ID0gbmV3IE1hdGNobWFraW5nUGxheWVyKHRlZVJwYywgdGhpcy5zaWduZXIsIHRoaXMucHJvZ3JhbUlkKTtcbiAgICBhd2FpdCB0ZWVDbGllbnQuam9pblF1ZXVlKHF1ZXVlLCB0ZW5hbnQsIHBsYXllckRhdGEsIGNhbGxiYWNrUHJvZ3JhbSk7XG5cbiAgICByZXR1cm4gdGlja2V0UGRhO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBNYXRjaG1ha2luZ1BsYXllciBwb2ludGluZyBhdCBhIFRFRSBSUEMgZW5kcG9pbnQuICovXG4gIHdpdGhScGModGVlVXJsOiBzdHJpbmcpOiBNYXRjaG1ha2luZ1BsYXllciB7XG4gICAgcmV0dXJuIG5ldyBNYXRjaG1ha2luZ1BsYXllcihjcmVhdGVTb2xhbmFScGModGVlVXJsKSwgdGhpcy5zaWduZXIsIHRoaXMucHJvZ3JhbUlkKTtcbiAgfVxufVxuIl19
package/dist/tee.d.ts CHANGED
@@ -8,7 +8,8 @@ export declare function getAuthToken(rpcUrl: string, signer: MessagePartialSigne
8
8
  expiresAt: number;
9
9
  }>;
10
10
  /**
11
- * Poll the TEE /permission endpoint until the given PDA has authorized users,
12
- * indicating delegation is active. Returns false on timeout (does not throw).
11
+ * Poll the TEE until the Permission PDA for the given account is active (authorizedUsers non-empty).
12
+ * This confirms the TEE has picked up the delegated Permission PDA and is enforcing access control.
13
+ * Returns true if active before timeout, false otherwise.
13
14
  */
14
- export declare function waitUntilPermissionActive(teeUrlWithToken: string, pda: Address, timeoutMs?: number): Promise<boolean>;
15
+ export declare function waitForPermission(teeUrlWithToken: string, accountAddress: Address, timeoutMs?: number): Promise<boolean>;
package/dist/tee.js CHANGED
@@ -29,34 +29,28 @@ export async function getAuthToken(rpcUrl, signer) {
29
29
  return { token: authJson.token, expiresAt };
30
30
  }
31
31
  /**
32
- * Poll the TEE /permission endpoint until the given PDA has authorized users,
33
- * indicating delegation is active. Returns false on timeout (does not throw).
32
+ * Poll the TEE until the Permission PDA for the given account is active (authorizedUsers non-empty).
33
+ * This confirms the TEE has picked up the delegated Permission PDA and is enforcing access control.
34
+ * Returns true if active before timeout, false otherwise.
34
35
  */
35
- export async function waitUntilPermissionActive(teeUrlWithToken, pda, timeoutMs = 30000) {
36
- // Parse URL: "https://host/path?token=xxx" -> baseUrl="https://host/path", tokenParam="token=xxx"
37
- const [baseUrl, tokenParam] = teeUrlWithToken.replace("/?", "?").split("?");
38
- let permissionUrl;
39
- if (tokenParam) {
40
- permissionUrl = `${baseUrl}/permission?${tokenParam}&pubkey=${pda}`;
41
- }
42
- else {
43
- permissionUrl = `${baseUrl}/permission?pubkey=${pda}`;
44
- }
45
- const start = Date.now();
46
- while (Date.now() - start < timeoutMs) {
36
+ export async function waitForPermission(teeUrlWithToken, accountAddress, timeoutMs = 10000) {
37
+ const [baseUrl, token] = teeUrlWithToken.replace("/?", "?").split("?");
38
+ const permUrl = token
39
+ ? `${baseUrl}/permission?${token}&pubkey=${accountAddress}`
40
+ : `${baseUrl}/permission?pubkey=${accountAddress}`;
41
+ const deadline = Date.now() + timeoutMs;
42
+ while (Date.now() < deadline) {
47
43
  try {
48
- const res = await fetch(permissionUrl);
49
- if (res.ok) {
50
- const { authorizedUsers } = (await res.json());
51
- if (authorizedUsers && authorizedUsers.length > 0)
52
- return true;
53
- }
44
+ const res = await fetch(permUrl);
45
+ const json = (await res.json());
46
+ if (json.authorizedUsers && json.authorizedUsers.length > 0)
47
+ return true;
54
48
  }
55
49
  catch {
56
- // ignore transient errors, keep polling
50
+ // ignore transient errors
57
51
  }
58
- await new Promise((r) => setTimeout(r, 400));
52
+ await new Promise((r) => setTimeout(r, 500));
59
53
  }
60
54
  return false;
61
55
  }
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUd0QixNQUFNLGFBQWEsQ0FBQztBQUlyQjs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxNQUFjLEVBQ2QsTUFBNEI7SUFFNUIsTUFBTSxZQUFZLEdBQUcsTUFBTSxLQUFLLENBQzlCLEdBQUcsTUFBTSwwQkFBMEIsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUNwRCxDQUFDO0lBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixZQUFZLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQTBCLENBQUM7SUFFM0UsTUFBTSxjQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQWtCLENBQUMsQ0FBQztJQUNyRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUU3RCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLE1BQU0sYUFBYSxFQUFFO1FBQ25ELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1FBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ25CLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN0QixTQUFTO1lBQ1QsU0FBUyxFQUFFLGVBQWU7U0FDM0IsQ0FBQztLQUNILENBQUMsQ0FBQztJQUNILE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQTBELENBQUM7SUFDbEcsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzlFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0MsZUFBdUIsRUFDdkIsR0FBWSxFQUNaLFNBQVMsR0FBRyxLQUFLO0lBRWpCLGtHQUFrRztJQUNsRyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RSxJQUFJLGFBQXFCLENBQUM7SUFDMUIsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLGFBQWEsR0FBRyxHQUFHLE9BQU8sZUFBZSxVQUFVLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDdEUsQ0FBQztTQUFNLENBQUM7UUFDTixhQUFhLEdBQUcsR0FBRyxPQUFPLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2QyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDWCxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBb0MsQ0FBQztnQkFDbEYsSUFBSSxlQUFlLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2pFLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asd0NBQXdDO1FBQzFDLENBQUM7UUFDRCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGdldEJhc2U1OERlY29kZXIsXG4gIGNyZWF0ZVNpZ25hYmxlTWVzc2FnZSxcbiAgdHlwZSBBZGRyZXNzLFxuICB0eXBlIE1lc3NhZ2VQYXJ0aWFsU2lnbmVyLFxufSBmcm9tIFwiQHNvbGFuYS9raXRcIjtcblxuZXhwb3J0IHR5cGUgeyBNZXNzYWdlUGFydGlhbFNpZ25lciBhcyBNZXNzYWdlU2lnbmVyIH07XG5cbi8qKlxuICogQXV0aGVudGljYXRlIHdpdGggdGhlIE1hZ2ljQmxvY2sgVEVFIHZpYSBjaGFsbGVuZ2Utc2lnbiBmbG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aFRva2VuKFxuICBycGNVcmw6IHN0cmluZyxcbiAgc2lnbmVyOiBNZXNzYWdlUGFydGlhbFNpZ25lcixcbik6IFByb21pc2U8eyB0b2tlbjogc3RyaW5nOyBleHBpcmVzQXQ6IG51bWJlciB9PiB7XG4gIGNvbnN0IGNoYWxsZW5nZVJlcyA9IGF3YWl0IGZldGNoKFxuICAgIGAke3JwY1VybH0vYXV0aC9jaGFsbGVuZ2U/cHVia2V5PSR7c2lnbmVyLmFkZHJlc3N9YFxuICApO1xuICBpZiAoIWNoYWxsZW5nZVJlcy5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVEVFIGNoYWxsZW5nZSBmYWlsZWQ6ICR7Y2hhbGxlbmdlUmVzLnN0YXR1c1RleHR9YCk7XG4gIH1cbiAgY29uc3QgeyBjaGFsbGVuZ2UgfSA9IChhd2FpdCBjaGFsbGVuZ2VSZXMuanNvbigpKSBhcyB7IGNoYWxsZW5nZTogc3RyaW5nIH07XG5cbiAgY29uc3QgY2hhbGxlbmdlQnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoY2hhbGxlbmdlKTtcbiAgY29uc3QgW3NpZ0RpY3RdID0gYXdhaXQgc2lnbmVyLnNpZ25NZXNzYWdlcyhbY3JlYXRlU2lnbmFibGVNZXNzYWdlKGNoYWxsZW5nZUJ5dGVzKV0pO1xuICBjb25zdCBzaWduYXR1cmUgPSBzaWdEaWN0W3NpZ25lci5hZGRyZXNzIGFzIEFkZHJlc3NdO1xuICBjb25zdCBzaWduYXR1cmVTdHJpbmcgPSBnZXRCYXNlNThEZWNvZGVyKCkuZGVjb2RlKHNpZ25hdHVyZSk7XG5cbiAgY29uc3QgdG9rZW5SZXMgPSBhd2FpdCBmZXRjaChgJHtycGNVcmx9L2F1dGgvbG9naW5gLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcHVia2V5OiBzaWduZXIuYWRkcmVzcyxcbiAgICAgIGNoYWxsZW5nZSxcbiAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlU3RyaW5nLFxuICAgIH0pLFxuICB9KTtcbiAgY29uc3QgYXV0aEpzb24gPSAoYXdhaXQgdG9rZW5SZXMuanNvbigpKSBhcyB7IHRva2VuOiBzdHJpbmc7IGV4cGlyZXNBdD86IG51bWJlcjsgZXJyb3I/OiBzdHJpbmcgfTtcbiAgaWYgKHRva2VuUmVzLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gYXV0aGVudGljYXRlOiAke2F1dGhKc29uLmVycm9yfWApO1xuICB9XG4gIGNvbnN0IGV4cGlyZXNBdCA9IGF1dGhKc29uLmV4cGlyZXNBdCA/PyBEYXRlLm5vdygpICsgMTAwMCAqIDYwICogNjAgKiAyNCAqIDMwO1xuICByZXR1cm4geyB0b2tlbjogYXV0aEpzb24udG9rZW4sIGV4cGlyZXNBdCB9O1xufVxuXG4vKipcbiAqIFBvbGwgdGhlIFRFRSAvcGVybWlzc2lvbiBlbmRwb2ludCB1bnRpbCB0aGUgZ2l2ZW4gUERBIGhhcyBhdXRob3JpemVkIHVzZXJzLFxuICogaW5kaWNhdGluZyBkZWxlZ2F0aW9uIGlzIGFjdGl2ZS4gUmV0dXJucyBmYWxzZSBvbiB0aW1lb3V0IChkb2VzIG5vdCB0aHJvdykuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0VW50aWxQZXJtaXNzaW9uQWN0aXZlKFxuICB0ZWVVcmxXaXRoVG9rZW46IHN0cmluZyxcbiAgcGRhOiBBZGRyZXNzLFxuICB0aW1lb3V0TXMgPSAzMDAwMCxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBQYXJzZSBVUkw6IFwiaHR0cHM6Ly9ob3N0L3BhdGg/dG9rZW49eHh4XCIgLT4gYmFzZVVybD1cImh0dHBzOi8vaG9zdC9wYXRoXCIsIHRva2VuUGFyYW09XCJ0b2tlbj14eHhcIlxuICBjb25zdCBbYmFzZVVybCwgdG9rZW5QYXJhbV0gPSB0ZWVVcmxXaXRoVG9rZW4ucmVwbGFjZShcIi8/XCIsIFwiP1wiKS5zcGxpdChcIj9cIik7XG4gIGxldCBwZXJtaXNzaW9uVXJsOiBzdHJpbmc7XG4gIGlmICh0b2tlblBhcmFtKSB7XG4gICAgcGVybWlzc2lvblVybCA9IGAke2Jhc2VVcmx9L3Blcm1pc3Npb24/JHt0b2tlblBhcmFtfSZwdWJrZXk9JHtwZGF9YDtcbiAgfSBlbHNlIHtcbiAgICBwZXJtaXNzaW9uVXJsID0gYCR7YmFzZVVybH0vcGVybWlzc2lvbj9wdWJrZXk9JHtwZGF9YDtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXRNcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChwZXJtaXNzaW9uVXJsKTtcbiAgICAgIGlmIChyZXMub2spIHtcbiAgICAgICAgY29uc3QgeyBhdXRob3JpemVkVXNlcnMgfSA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IGF1dGhvcml6ZWRVc2Vycz86IHVua25vd25bXSB9O1xuICAgICAgICBpZiAoYXV0aG9yaXplZFVzZXJzICYmIGF1dGhvcml6ZWRVc2Vycy5sZW5ndGggPiAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB0cmFuc2llbnQgZXJyb3JzLCBrZWVwIHBvbGxpbmdcbiAgICB9XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgNDAwKSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUd0QixNQUFNLGFBQWEsQ0FBQztBQUlyQjs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxNQUFjLEVBQ2QsTUFBNEI7SUFFNUIsTUFBTSxZQUFZLEdBQUcsTUFBTSxLQUFLLENBQzlCLEdBQUcsTUFBTSwwQkFBMEIsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUNwRCxDQUFDO0lBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixZQUFZLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQTBCLENBQUM7SUFFM0UsTUFBTSxjQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQWtCLENBQUMsQ0FBQztJQUNyRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUU3RCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLE1BQU0sYUFBYSxFQUFFO1FBQ25ELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1FBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ25CLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN0QixTQUFTO1lBQ1QsU0FBUyxFQUFFLGVBQWU7U0FDM0IsQ0FBQztLQUNILENBQUMsQ0FBQztJQUNILE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQTBELENBQUM7SUFDbEcsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzlFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLGVBQXVCLEVBQ3ZCLGNBQXVCLEVBQ3ZCLFNBQVMsR0FBRyxLQUFLO0lBRWpCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLEtBQUs7UUFDbkIsQ0FBQyxDQUFDLEdBQUcsT0FBTyxlQUFlLEtBQUssV0FBVyxjQUFjLEVBQUU7UUFDM0QsQ0FBQyxDQUFDLEdBQUcsT0FBTyxzQkFBc0IsY0FBYyxFQUFFLENBQUM7SUFFckQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUN4QyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUEyQyxDQUFDO1lBQzFFLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNFLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwwQkFBMEI7UUFDNUIsQ0FBQztRQUNELE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZ2V0QmFzZTU4RGVjb2RlcixcbiAgY3JlYXRlU2lnbmFibGVNZXNzYWdlLFxuICB0eXBlIEFkZHJlc3MsXG4gIHR5cGUgTWVzc2FnZVBhcnRpYWxTaWduZXIsXG59IGZyb20gXCJAc29sYW5hL2tpdFwiO1xuXG5leHBvcnQgdHlwZSB7IE1lc3NhZ2VQYXJ0aWFsU2lnbmVyIGFzIE1lc3NhZ2VTaWduZXIgfTtcblxuLyoqXG4gKiBBdXRoZW50aWNhdGUgd2l0aCB0aGUgTWFnaWNCbG9jayBURUUgdmlhIGNoYWxsZW5nZS1zaWduIGZsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBdXRoVG9rZW4oXG4gIHJwY1VybDogc3RyaW5nLFxuICBzaWduZXI6IE1lc3NhZ2VQYXJ0aWFsU2lnbmVyLFxuKTogUHJvbWlzZTx7IHRva2VuOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyIH0+IHtcbiAgY29uc3QgY2hhbGxlbmdlUmVzID0gYXdhaXQgZmV0Y2goXG4gICAgYCR7cnBjVXJsfS9hdXRoL2NoYWxsZW5nZT9wdWJrZXk9JHtzaWduZXIuYWRkcmVzc31gXG4gICk7XG4gIGlmICghY2hhbGxlbmdlUmVzLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBURUUgY2hhbGxlbmdlIGZhaWxlZDogJHtjaGFsbGVuZ2VSZXMuc3RhdHVzVGV4dH1gKTtcbiAgfVxuICBjb25zdCB7IGNoYWxsZW5nZSB9ID0gKGF3YWl0IGNoYWxsZW5nZVJlcy5qc29uKCkpIGFzIHsgY2hhbGxlbmdlOiBzdHJpbmcgfTtcblxuICBjb25zdCBjaGFsbGVuZ2VCeXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShjaGFsbGVuZ2UpO1xuICBjb25zdCBbc2lnRGljdF0gPSBhd2FpdCBzaWduZXIuc2lnbk1lc3NhZ2VzKFtjcmVhdGVTaWduYWJsZU1lc3NhZ2UoY2hhbGxlbmdlQnl0ZXMpXSk7XG4gIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ0RpY3Rbc2lnbmVyLmFkZHJlc3MgYXMgQWRkcmVzc107XG4gIGNvbnN0IHNpZ25hdHVyZVN0cmluZyA9IGdldEJhc2U1OERlY29kZXIoKS5kZWNvZGUoc2lnbmF0dXJlKTtcblxuICBjb25zdCB0b2tlblJlcyA9IGF3YWl0IGZldGNoKGAke3JwY1VybH0vYXV0aC9sb2dpbmAsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBwdWJrZXk6IHNpZ25lci5hZGRyZXNzLFxuICAgICAgY2hhbGxlbmdlLFxuICAgICAgc2lnbmF0dXJlOiBzaWduYXR1cmVTdHJpbmcsXG4gICAgfSksXG4gIH0pO1xuICBjb25zdCBhdXRoSnNvbiA9IChhd2FpdCB0b2tlblJlcy5qc29uKCkpIGFzIHsgdG9rZW46IHN0cmluZzsgZXhwaXJlc0F0PzogbnVtYmVyOyBlcnJvcj86IHN0cmluZyB9O1xuICBpZiAodG9rZW5SZXMuc3RhdHVzICE9PSAyMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBhdXRoZW50aWNhdGU6ICR7YXV0aEpzb24uZXJyb3J9YCk7XG4gIH1cbiAgY29uc3QgZXhwaXJlc0F0ID0gYXV0aEpzb24uZXhwaXJlc0F0ID8/IERhdGUubm93KCkgKyAxMDAwICogNjAgKiA2MCAqIDI0ICogMzA7XG4gIHJldHVybiB7IHRva2VuOiBhdXRoSnNvbi50b2tlbiwgZXhwaXJlc0F0IH07XG59XG5cbi8qKlxuICogUG9sbCB0aGUgVEVFIHVudGlsIHRoZSBQZXJtaXNzaW9uIFBEQSBmb3IgdGhlIGdpdmVuIGFjY291bnQgaXMgYWN0aXZlIChhdXRob3JpemVkVXNlcnMgbm9uLWVtcHR5KS5cbiAqIFRoaXMgY29uZmlybXMgdGhlIFRFRSBoYXMgcGlja2VkIHVwIHRoZSBkZWxlZ2F0ZWQgUGVybWlzc2lvbiBQREEgYW5kIGlzIGVuZm9yY2luZyBhY2Nlc3MgY29udHJvbC5cbiAqIFJldHVybnMgdHJ1ZSBpZiBhY3RpdmUgYmVmb3JlIHRpbWVvdXQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JQZXJtaXNzaW9uKFxuICB0ZWVVcmxXaXRoVG9rZW46IHN0cmluZyxcbiAgYWNjb3VudEFkZHJlc3M6IEFkZHJlc3MsXG4gIHRpbWVvdXRNcyA9IDEwMDAwLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IFtiYXNlVXJsLCB0b2tlbl0gPSB0ZWVVcmxXaXRoVG9rZW4ucmVwbGFjZShcIi8/XCIsIFwiP1wiKS5zcGxpdChcIj9cIik7XG4gIGNvbnN0IHBlcm1VcmwgPSB0b2tlblxuICAgID8gYCR7YmFzZVVybH0vcGVybWlzc2lvbj8ke3Rva2VufSZwdWJrZXk9JHthY2NvdW50QWRkcmVzc31gXG4gICAgOiBgJHtiYXNlVXJsfS9wZXJtaXNzaW9uP3B1YmtleT0ke2FjY291bnRBZGRyZXNzfWA7XG5cbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGltZW91dE1zO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHBlcm1VcmwpO1xuICAgICAgY29uc3QganNvbiA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IGF1dGhvcml6ZWRVc2Vycz86IHVua25vd25bXSB8IG51bGwgfTtcbiAgICAgIGlmIChqc29uLmF1dGhvcml6ZWRVc2VycyAmJiBqc29uLmF1dGhvcml6ZWRVc2Vycy5sZW5ndGggPiAwKSByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB0cmFuc2llbnQgZXJyb3JzXG4gICAgfVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDUwMCkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuIl19
@@ -2,10 +2,12 @@ import { type Instruction, type SolanaRpcApi, type Rpc, type TransactionSigner }
2
2
  type SolanaRpc = Rpc<SolanaRpcApi>;
3
3
  /**
4
4
  * Build, sign with a Kit keypair signer, and send a single instruction.
5
+ * Throws if the transaction is rejected or times out.
5
6
  */
6
7
  export declare function sendInstruction(rpc: SolanaRpc, instruction: Instruction, signer: TransactionSigner): Promise<string>;
7
8
  /**
8
9
  * Build, sign, and send multiple instructions in a single transaction.
10
+ * Throws if the transaction is rejected or times out.
9
11
  */
10
12
  export declare function sendInstructions(rpc: SolanaRpc, instructions: Instruction[], signer: TransactionSigner): Promise<string>;
11
13
  export {};
@@ -1,6 +1,30 @@
1
1
  import { createTransactionMessage, setTransactionMessageFeePayerSigner, setTransactionMessageLifetimeUsingBlockhash, appendTransactionMessageInstruction, appendTransactionMessageInstructions, signTransactionMessageWithSigners, getBase64EncodedWireTransaction, pipe, } from "@solana/kit";
2
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
+ const bigIntReplacer = (_, v) => typeof v === 'bigint' ? v.toString() : v;
4
+ /**
5
+ * Poll for transaction confirmation and throw if it failed.
6
+ * This ensures callers always know immediately when a transaction is rejected.
7
+ */
8
+ async function confirmTransaction(rpc, sig) {
9
+ for (let i = 0; i < 8; i++) {
10
+ await new Promise(r => setTimeout(r, 1000));
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ const statuses = await rpc.getSignatureStatuses([sig], { searchTransactionHistory: false }).send().catch(() => null);
13
+ const status = statuses?.value?.[0];
14
+ if (status) {
15
+ if (status.err) {
16
+ throw new Error(`[TX] ${sig.slice(0, 16)}... FAILED: ${JSON.stringify(status.err, bigIntReplacer)}`);
17
+ }
18
+ console.log(`[TX] ${sig.slice(0, 16)}... ${status.confirmationStatus}`);
19
+ return;
20
+ }
21
+ }
22
+ // No status after 8s — treat as timeout rather than silently succeeding
23
+ throw new Error(`[TX] ${sig.slice(0, 16)}... confirmation timeout (no status after 8s)`);
24
+ }
2
25
  /**
3
26
  * Build, sign with a Kit keypair signer, and send a single instruction.
27
+ * Throws if the transaction is rejected or times out.
4
28
  */
5
29
  export async function sendInstruction(rpc, instruction, signer) {
6
30
  const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
@@ -13,27 +37,12 @@ export async function sendInstruction(rpc, instruction, signer) {
13
37
  encoding: "base64",
14
38
  skipPreflight: true,
15
39
  }).send();
16
- // Poll for status to detect runtime errors
17
- for (let i = 0; i < 8; i++) {
18
- await new Promise(r => setTimeout(r, 1000));
19
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
- const statuses = await rpc.getSignatureStatuses([sig], { searchTransactionHistory: false }).send().catch(() => null);
21
- const status = statuses?.value?.[0];
22
- if (status) {
23
- if (status.err) {
24
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
- console.error(`[TX] ${sig.slice(0, 16)}... FAILED:`, JSON.stringify(status.err, (_, v) => typeof v === 'bigint' ? v.toString() : v));
26
- }
27
- else if (status.confirmationStatus) {
28
- console.log(`[TX] ${sig.slice(0, 16)}... ${status.confirmationStatus}`);
29
- }
30
- break;
31
- }
32
- }
40
+ await confirmTransaction(rpc, sig);
33
41
  return sig;
34
42
  }
35
43
  /**
36
44
  * Build, sign, and send multiple instructions in a single transaction.
45
+ * Throws if the transaction is rejected or times out.
37
46
  */
38
47
  export async function sendInstructions(rpc, instructions, signer) {
39
48
  const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
@@ -42,9 +51,11 @@ export async function sendInstructions(rpc, instructions, signer) {
42
51
  const signedTx = await signTransactionMessageWithSigners(tx);
43
52
  const encoded = getBase64EncodedWireTransaction(signedTx);
44
53
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
- return rpc.sendTransaction(encoded, {
54
+ const sig = await rpc.sendTransaction(encoded, {
46
55
  encoding: "base64",
47
56
  skipPreflight: true,
48
57
  }).send();
58
+ await confirmTransaction(rpc, sig);
59
+ return sig;
49
60
  }
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixtQ0FBbUMsRUFDbkMsMkNBQTJDLEVBQzNDLG1DQUFtQyxFQUNuQyxvQ0FBb0MsRUFDcEMsaUNBQWlDLEVBQ2pDLCtCQUErQixFQUMvQixJQUFJLEdBS0wsTUFBTSxhQUFhLENBQUM7QUFJckI7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FDbkMsR0FBYyxFQUNkLFdBQXdCLEVBQ3hCLE1BQXlCO0lBRXpCLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEdBQUcsTUFBTSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUV6RSw4REFBOEQ7SUFDOUQsTUFBTSxFQUFFLEdBQVEsSUFBSSxDQUNsQix3QkFBd0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFVLEVBQUUsQ0FBQyxFQUNqRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUNBQW1DLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUNyRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsMkNBQTJDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxFQUN0RSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUNBQW1DLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUMzRCxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxpQ0FBaUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RCxNQUFNLE9BQU8sR0FBRywrQkFBK0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUxRCw4REFBOEQ7SUFDOUQsTUFBTSxHQUFHLEdBQUcsTUFBTyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQWMsRUFBRTtRQUNyRCxRQUFRLEVBQUUsUUFBUTtRQUNsQixhQUFhLEVBQUUsSUFBSTtLQUNwQixDQUFDLENBQUMsSUFBSSxFQUFzQixDQUFDO0lBRTlCLDJDQUEyQztJQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1Qyw4REFBOEQ7UUFDOUQsTUFBTSxRQUFRLEdBQUcsTUFBTyxHQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlILE1BQU0sTUFBTSxHQUFHLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsOERBQThEO2dCQUM5RCxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2SSxDQUFDO2lCQUFNLElBQUksTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFDRCxNQUFNO1FBQ1IsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLEdBQWMsRUFDZCxZQUEyQixFQUMzQixNQUF5QjtJQUV6QixNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFekUsOERBQThEO0lBQzlELE1BQU0sRUFBRSxHQUFRLElBQUksQ0FDbEIsd0JBQXdCLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBVSxFQUFFLENBQUMsRUFDakQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1DQUFtQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFDckQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsRUFDdEUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG9DQUFvQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FDN0QsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLE1BQU0saUNBQWlDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0QsTUFBTSxPQUFPLEdBQUcsK0JBQStCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFMUQsOERBQThEO0lBQzlELE9BQU8sR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFjLEVBQUU7UUFDekMsUUFBUSxFQUFFLFFBQVE7UUFDbEIsYUFBYSxFQUFFLElBQUk7S0FDcEIsQ0FBQyxDQUFDLElBQUksRUFBcUIsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY3JlYXRlVHJhbnNhY3Rpb25NZXNzYWdlLFxuICBzZXRUcmFuc2FjdGlvbk1lc3NhZ2VGZWVQYXllclNpZ25lcixcbiAgc2V0VHJhbnNhY3Rpb25NZXNzYWdlTGlmZXRpbWVVc2luZ0Jsb2NraGFzaCxcbiAgYXBwZW5kVHJhbnNhY3Rpb25NZXNzYWdlSW5zdHJ1Y3Rpb24sXG4gIGFwcGVuZFRyYW5zYWN0aW9uTWVzc2FnZUluc3RydWN0aW9ucyxcbiAgc2lnblRyYW5zYWN0aW9uTWVzc2FnZVdpdGhTaWduZXJzLFxuICBnZXRCYXNlNjRFbmNvZGVkV2lyZVRyYW5zYWN0aW9uLFxuICBwaXBlLFxuICB0eXBlIEluc3RydWN0aW9uLFxuICB0eXBlIFNvbGFuYVJwY0FwaSxcbiAgdHlwZSBScGMsXG4gIHR5cGUgVHJhbnNhY3Rpb25TaWduZXIsXG59IGZyb20gXCJAc29sYW5hL2tpdFwiO1xuXG50eXBlIFNvbGFuYVJwYyA9IFJwYzxTb2xhbmFScGNBcGk+O1xuXG4vKipcbiAqIEJ1aWxkLCBzaWduIHdpdGggYSBLaXQga2V5cGFpciBzaWduZXIsIGFuZCBzZW5kIGEgc2luZ2xlIGluc3RydWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEluc3RydWN0aW9uKFxuICBycGM6IFNvbGFuYVJwYyxcbiAgaW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uLFxuICBzaWduZXI6IFRyYW5zYWN0aW9uU2lnbmVyLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyB2YWx1ZTogbGF0ZXN0QmxvY2toYXNoIH0gPSBhd2FpdCBycGMuZ2V0TGF0ZXN0QmxvY2toYXNoKCkuc2VuZCgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IHR4OiBhbnkgPSBwaXBlKFxuICAgIGNyZWF0ZVRyYW5zYWN0aW9uTWVzc2FnZSh7IHZlcnNpb246IDAgYXMgY29uc3QgfSksXG4gICAgKG0pID0+IHNldFRyYW5zYWN0aW9uTWVzc2FnZUZlZVBheWVyU2lnbmVyKHNpZ25lciwgbSksXG4gICAgKG0pID0+IHNldFRyYW5zYWN0aW9uTWVzc2FnZUxpZmV0aW1lVXNpbmdCbG9ja2hhc2gobGF0ZXN0QmxvY2toYXNoLCBtKSxcbiAgICAobSkgPT4gYXBwZW5kVHJhbnNhY3Rpb25NZXNzYWdlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIG0pLFxuICApO1xuXG4gIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgc2lnblRyYW5zYWN0aW9uTWVzc2FnZVdpdGhTaWduZXJzKHR4KTtcbiAgY29uc3QgZW5jb2RlZCA9IGdldEJhc2U2NEVuY29kZWRXaXJlVHJhbnNhY3Rpb24oc2lnbmVkVHgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IHNpZyA9IGF3YWl0IChycGMuc2VuZFRyYW5zYWN0aW9uKGVuY29kZWQgYXMgYW55LCB7XG4gICAgZW5jb2Rpbmc6IFwiYmFzZTY0XCIsXG4gICAgc2tpcFByZWZsaWdodDogdHJ1ZSxcbiAgfSkuc2VuZCgpIGFzIFByb21pc2U8c3RyaW5nPik7XG5cbiAgLy8gUG9sbCBmb3Igc3RhdHVzIHRvIGRldGVjdCBydW50aW1lIGVycm9yc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAxMDAwKSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IChycGMgYXMgYW55KS5nZXRTaWduYXR1cmVTdGF0dXNlcyhbc2lnXSwgeyBzZWFyY2hUcmFuc2FjdGlvbkhpc3Rvcnk6IGZhbHNlIH0pLnNlbmQoKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICBjb25zdCBzdGF0dXMgPSBzdGF0dXNlcz8udmFsdWU/LlswXTtcbiAgICBpZiAoc3RhdHVzKSB7XG4gICAgICBpZiAoc3RhdHVzLmVycikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBjb25zb2xlLmVycm9yKGBbVFhdICR7c2lnLnNsaWNlKDAsIDE2KX0uLi4gRkFJTEVEOmAsIEpTT04uc3RyaW5naWZ5KHN0YXR1cy5lcnIsIChfLCB2KSA9PiB0eXBlb2YgdiA9PT0gJ2JpZ2ludCcgPyB2LnRvU3RyaW5nKCkgOiB2KSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cy5jb25maXJtYXRpb25TdGF0dXMpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFtUWF0gJHtzaWcuc2xpY2UoMCwgMTYpfS4uLiAke3N0YXR1cy5jb25maXJtYXRpb25TdGF0dXN9YCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpZztcbn1cblxuLyoqXG4gKiBCdWlsZCwgc2lnbiwgYW5kIHNlbmQgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEluc3RydWN0aW9ucyhcbiAgcnBjOiBTb2xhbmFScGMsXG4gIGluc3RydWN0aW9uczogSW5zdHJ1Y3Rpb25bXSxcbiAgc2lnbmVyOiBUcmFuc2FjdGlvblNpZ25lcixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgdmFsdWU6IGxhdGVzdEJsb2NraGFzaCB9ID0gYXdhaXQgcnBjLmdldExhdGVzdEJsb2NraGFzaCgpLnNlbmQoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25zdCB0eDogYW55ID0gcGlwZShcbiAgICBjcmVhdGVUcmFuc2FjdGlvbk1lc3NhZ2UoeyB2ZXJzaW9uOiAwIGFzIGNvbnN0IH0pLFxuICAgIChtKSA9PiBzZXRUcmFuc2FjdGlvbk1lc3NhZ2VGZWVQYXllclNpZ25lcihzaWduZXIsIG0pLFxuICAgIChtKSA9PiBzZXRUcmFuc2FjdGlvbk1lc3NhZ2VMaWZldGltZVVzaW5nQmxvY2toYXNoKGxhdGVzdEJsb2NraGFzaCwgbSksXG4gICAgKG0pID0+IGFwcGVuZFRyYW5zYWN0aW9uTWVzc2FnZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIG0pLFxuICApO1xuXG4gIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgc2lnblRyYW5zYWN0aW9uTWVzc2FnZVdpdGhTaWduZXJzKHR4KTtcbiAgY29uc3QgZW5jb2RlZCA9IGdldEJhc2U2NEVuY29kZWRXaXJlVHJhbnNhY3Rpb24oc2lnbmVkVHgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHJldHVybiBycGMuc2VuZFRyYW5zYWN0aW9uKGVuY29kZWQgYXMgYW55LCB7XG4gICAgZW5jb2Rpbmc6IFwiYmFzZTY0XCIsXG4gICAgc2tpcFByZWZsaWdodDogdHJ1ZSxcbiAgfSkuc2VuZCgpIGFzIFByb21pc2U8c3RyaW5nPjtcbn1cbiJdfQ==
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixtQ0FBbUMsRUFDbkMsMkNBQTJDLEVBQzNDLG1DQUFtQyxFQUNuQyxvQ0FBb0MsRUFDcEMsaUNBQWlDLEVBQ2pDLCtCQUErQixFQUMvQixJQUFJLEdBS0wsTUFBTSxhQUFhLENBQUM7QUFJckIsOERBQThEO0FBQzlELE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUzRjs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsR0FBYyxFQUFFLEdBQVc7SUFDM0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDNUMsOERBQThEO1FBQzlELE1BQU0sUUFBUSxHQUFHLE1BQU8sR0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5SCxNQUFNLE1BQU0sR0FBRyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxD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UUFDckQsUUFBUSxFQUFFLFFBQVE7UUFDbEIsYUFBYSxFQUFFLElBQUk7S0FDcEIsQ0FBQyxDQUFDLElBQUksRUFBc0IsQ0FBQztJQUU5QixNQUFNLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNuQyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjcmVhdGVUcmFuc2FjdGlvbk1lc3NhZ2UsXG4gIHNldFRyYW5zYWN0aW9uTWVzc2FnZUZlZVBheWVyU2lnbmVyLFxuICBzZXRUcmFuc2FjdGlvbk1lc3NhZ2VMaWZldGltZVVzaW5nQmxvY2toYXNoLFxuICBhcHBlbmRUcmFuc2FjdGlvbk1lc3NhZ2VJbnN0cnVjdGlvbixcbiAgYXBwZW5kVHJhbnNhY3Rpb25NZXNzYWdlSW5zdHJ1Y3Rpb25zLFxuICBzaWduVHJhbnNhY3Rpb25NZXNzYWdlV2l0aFNpZ25lcnMsXG4gIGdldEJhc2U2NEVuY29kZWRXaXJlVHJhbnNhY3Rpb24sXG4gIHBpcGUsXG4gIHR5cGUgSW5zdHJ1Y3Rpb24sXG4gIHR5cGUgU29sYW5hUnBjQXBpLFxuICB0eXBlIFJwYyxcbiAgdHlwZSBUcmFuc2FjdGlvblNpZ25lcixcbn0gZnJvbSBcIkBzb2xhbmEva2l0XCI7XG5cbnR5cGUgU29sYW5hUnBjID0gUnBjPFNvbGFuYVJwY0FwaT47XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBiaWdJbnRSZXBsYWNlciA9IChfOiBzdHJpbmcsIHY6IHVua25vd24pID0+IHR5cGVvZiB2ID09PSAnYmlnaW50JyA/IHYudG9TdHJpbmcoKSA6IHY7XG5cbi8qKlxuICogUG9sbCBmb3IgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIGFuZCB0aHJvdyBpZiBpdCBmYWlsZWQuXG4gKiBUaGlzIGVuc3VyZXMgY2FsbGVycyBhbHdheXMga25vdyBpbW1lZGlhdGVseSB3aGVuIGEgdHJhbnNhY3Rpb24gaXMgcmVqZWN0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbmZpcm1UcmFuc2FjdGlvbihycGM6IFNvbGFuYVJwYywgc2lnOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMTAwMCkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3Qgc3RhdHVzZXMgPSBhd2FpdCAocnBjIGFzIGFueSkuZ2V0U2lnbmF0dXJlU3RhdHVzZXMoW3NpZ10sIHsgc2VhcmNoVHJhbnNhY3Rpb25IaXN0b3J5OiBmYWxzZSB9KS5zZW5kKCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgY29uc3Qgc3RhdHVzID0gc3RhdHVzZXM/LnZhbHVlPy5bMF07XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgaWYgKHN0YXR1cy5lcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbVFhdICR7c2lnLnNsaWNlKDAsIDE2KX0uLi4gRkFJTEVEOiAke0pTT04uc3RyaW5naWZ5KHN0YXR1cy5lcnIsIGJpZ0ludFJlcGxhY2VyKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGBbVFhdICR7c2lnLnNsaWNlKDAsIDE2KX0uLi4gJHtzdGF0dXMuY29uZmlybWF0aW9uU3RhdHVzfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICAvLyBObyBzdGF0dXMgYWZ0ZXIgOHMg4oCUIHRyZWF0IGFzIHRpbWVvdXQgcmF0aGVyIHRoYW4gc2lsZW50bHkgc3VjY2VlZGluZ1xuICB0aHJvdyBuZXcgRXJyb3IoYFtUWF0gJHtzaWcuc2xpY2UoMCwgMTYpfS4uLiBjb25maXJtYXRpb24gdGltZW91dCAobm8gc3RhdHVzIGFmdGVyIDhzKWApO1xufVxuXG4vKipcbiAqIEJ1aWxkLCBzaWduIHdpdGggYSBLaXQga2V5cGFpciBzaWduZXIsIGFuZCBzZW5kIGEgc2luZ2xlIGluc3RydWN0aW9uLlxuICogVGhyb3dzIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyByZWplY3RlZCBvciB0aW1lcyBvdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kSW5zdHJ1Y3Rpb24oXG4gIHJwYzogU29sYW5hUnBjLFxuICBpbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24sXG4gIHNpZ25lcjogVHJhbnNhY3Rpb25TaWduZXIsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHZhbHVlOiBsYXRlc3RCbG9ja2hhc2ggfSA9IGF3YWl0IHJwYy5nZXRMYXRlc3RCbG9ja2hhc2goKS5zZW5kKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgY29uc3QgdHg6IGFueSA9IHBpcGUoXG4gICAgY3JlYXRlVHJhbnNhY3Rpb25NZXNzYWdlKHsgdmVyc2lvbjogMCBhcyBjb25zdCB9KSxcbiAgICAobSkgPT4gc2V0VHJhbnNhY3Rpb25NZXNzYWdlRmVlUGF5ZXJTaWduZXIoc2lnbmVyLCBtKSxcbiAgICAobSkgPT4gc2V0VHJhbnNhY3Rpb25NZXNzYWdlTGlmZXRpbWVVc2luZ0Jsb2NraGFzaChsYXRlc3RCbG9ja2hhc2gsIG0pLFxuICAgIChtKSA9PiBhcHBlbmRUcmFuc2FjdGlvbk1lc3NhZ2VJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgbSksXG4gICk7XG5cbiAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCBzaWduVHJhbnNhY3Rpb25NZXNzYWdlV2l0aFNpZ25lcnModHgpO1xuICBjb25zdCBlbmNvZGVkID0gZ2V0QmFzZTY0RW5jb2RlZFdpcmVUcmFuc2FjdGlvbihzaWduZWRUeCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgY29uc3Qgc2lnID0gYXdhaXQgKHJwYy5zZW5kVHJhbnNhY3Rpb24oZW5jb2RlZCBhcyBhbnksIHtcbiAgICBlbmNvZGluZzogXCJiYXNlNjRcIixcbiAgICBza2lwUHJlZmxpZ2h0OiB0cnVlLFxuICB9KS5zZW5kKCkgYXMgUHJvbWlzZTxzdHJpbmc+KTtcblxuICBhd2FpdCBjb25maXJtVHJhbnNhY3Rpb24ocnBjLCBzaWcpO1xuICByZXR1cm4gc2lnO1xufVxuXG4vKipcbiAqIEJ1aWxkLCBzaWduLCBhbmQgc2VuZCBtdWx0aXBsZSBpbnN0cnVjdGlvbnMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uXG4gKiBUaHJvd3MgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIHJlamVjdGVkIG9yIHRpbWVzIG91dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRJbnN0cnVjdGlvbnMoXG4gIHJwYzogU29sYW5hUnBjLFxuICBpbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uW10sXG4gIHNpZ25lcjogVHJhbnNhY3Rpb25TaWduZXIsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHZhbHVlOiBsYXRlc3RCbG9ja2hhc2ggfSA9IGF3YWl0IHJwYy5nZXRMYXRlc3RCbG9ja2hhc2goKS5zZW5kKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgY29uc3QgdHg6IGFueSA9IHBpcGUoXG4gICAgY3JlYXRlVHJhbnNhY3Rpb25NZXNzYWdlKHsgdmVyc2lvbjogMCBhcyBjb25zdCB9KSxcbiAgICAobSkgPT4gc2V0VHJhbnNhY3Rpb25NZXNzYWdlRmVlUGF5ZXJTaWduZXIoc2lnbmVyLCBtKSxcbiAgICAobSkgPT4gc2V0VHJhbnNhY3Rpb25NZXNzYWdlTGlmZXRpbWVVc2luZ0Jsb2NraGFzaChsYXRlc3RCbG9ja2hhc2gsIG0pLFxuICAgIChtKSA9PiBhcHBlbmRUcmFuc2FjdGlvbk1lc3NhZ2VJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBtKSxcbiAgKTtcblxuICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHNpZ25UcmFuc2FjdGlvbk1lc3NhZ2VXaXRoU2lnbmVycyh0eCk7XG4gIGNvbnN0IGVuY29kZWQgPSBnZXRCYXNlNjRFbmNvZGVkV2lyZVRyYW5zYWN0aW9uKHNpZ25lZFR4KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25zdCBzaWcgPSBhd2FpdCAocnBjLnNlbmRUcmFuc2FjdGlvbihlbmNvZGVkIGFzIGFueSwge1xuICAgIGVuY29kaW5nOiBcImJhc2U2NFwiLFxuICAgIHNraXBQcmVmbGlnaHQ6IHRydWUsXG4gIH0pLnNlbmQoKSBhcyBQcm9taXNlPHN0cmluZz4pO1xuXG4gIGF3YWl0IGNvbmZpcm1UcmFuc2FjdGlvbihycGMsIHNpZyk7XG4gIHJldHVybiBzaWc7XG59XG4iXX0=
package/dist/utils.d.ts CHANGED
@@ -1,4 +1,14 @@
1
1
  import { type Address } from "@solana/kit";
2
+ export declare const PERMISSION_PROGRAM: Address;
3
+ export declare const DELEGATION_PROGRAM: Address;
4
+ /** Derives the Permission PDA for a given permissioned account. */
5
+ export declare function derivePermissionPda(accountAddress: Address): Promise<Address>;
6
+ /** Derives the DELeGG delegation PDAs for the Permission PDA (used in DelegatePermission ix). */
7
+ export declare function derivePermissionDelegationPdas(permissionPda: Address): Promise<{
8
+ delegationBuffer: Address;
9
+ delegationRecord: Address;
10
+ delegationMetadata: Address;
11
+ }>;
2
12
  export declare const QUEUE_SEED = "queue";
3
13
  export declare const TENANT_SEED = "tenant";
4
14
  export declare const TICKET_SEED = "ticket";
package/dist/utils.js CHANGED
@@ -1,6 +1,33 @@
1
1
  import { getProgramDerivedAddress, getAddressEncoder, getUtf8Encoder, } from "@solana/kit";
2
2
  const addressEncoder = getAddressEncoder();
3
3
  const utf8Encoder = getUtf8Encoder();
4
+ export const PERMISSION_PROGRAM = "ACLseoPoyC3cBqoUtkbjZ4aDrkurZW86v19pXz2XQnp1";
5
+ export const DELEGATION_PROGRAM = "DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh";
6
+ /** Derives the Permission PDA for a given permissioned account. */
7
+ export async function derivePermissionPda(accountAddress) {
8
+ const [pda] = await getProgramDerivedAddress({
9
+ programAddress: PERMISSION_PROGRAM,
10
+ seeds: [utf8Encoder.encode("permission:"), addressEncoder.encode(accountAddress)],
11
+ });
12
+ return pda;
13
+ }
14
+ /** Derives the DELeGG delegation PDAs for the Permission PDA (used in DelegatePermission ix). */
15
+ export async function derivePermissionDelegationPdas(permissionPda) {
16
+ const [delegationRecord] = await getProgramDerivedAddress({
17
+ programAddress: DELEGATION_PROGRAM,
18
+ seeds: [utf8Encoder.encode("delegation"), addressEncoder.encode(permissionPda)],
19
+ });
20
+ const [delegationMetadata] = await getProgramDerivedAddress({
21
+ programAddress: DELEGATION_PROGRAM,
22
+ seeds: [utf8Encoder.encode("delegation-metadata"), addressEncoder.encode(permissionPda)],
23
+ });
24
+ // Buffer PDA is under the ownerProgram (PERMISSION_PROGRAM for the Permission PDA)
25
+ const [delegationBuffer] = await getProgramDerivedAddress({
26
+ programAddress: PERMISSION_PROGRAM,
27
+ seeds: [utf8Encoder.encode("buffer"), addressEncoder.encode(permissionPda)],
28
+ });
29
+ return { delegationBuffer, delegationRecord, delegationMetadata };
30
+ }
4
31
  export const QUEUE_SEED = "queue";
5
32
  export const TENANT_SEED = "tenant";
6
33
  export const TICKET_SEED = "ticket";
@@ -29,4 +56,4 @@ export async function deriveTicketPda(programId, player, tenant) {
29
56
  });
30
57
  return pda;
31
58
  }
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixpQkFBaUIsRUFDakIsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixFQUFFLENBQUM7QUFDM0MsTUFBTSxXQUFXLEdBQUcsY0FBYyxFQUFFLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQztBQUNsQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDO0FBQ3BDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUM7QUFFcEMsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsU0FBa0IsRUFBRSxTQUFrQjtJQUN6RSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQztRQUMzQyxjQUFjLEVBQUUsU0FBUztRQUN6QixLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDMUUsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsU0FBa0IsRUFBRSxTQUFrQjtJQUMxRSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQztRQUMzQyxjQUFjLEVBQUUsU0FBUztRQUN6QixLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDM0UsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQ25DLFNBQWtCLEVBQ2xCLE1BQWUsRUFDZixNQUFlO0lBRWYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7UUFDM0MsY0FBYyxFQUFFLFNBQVM7UUFDekIsS0FBSyxFQUFFO1lBQ0wsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDL0IsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDN0IsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDOUI7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBnZXRQcm9ncmFtRGVyaXZlZEFkZHJlc3MsXG4gIGdldEFkZHJlc3NFbmNvZGVyLFxuICBnZXRVdGY4RW5jb2RlcixcbiAgdHlwZSBBZGRyZXNzLFxufSBmcm9tIFwiQHNvbGFuYS9raXRcIjtcblxuY29uc3QgYWRkcmVzc0VuY29kZXIgPSBnZXRBZGRyZXNzRW5jb2RlcigpO1xuY29uc3QgdXRmOEVuY29kZXIgPSBnZXRVdGY4RW5jb2RlcigpO1xuXG5leHBvcnQgY29uc3QgUVVFVUVfU0VFRCA9IFwicXVldWVcIjtcbmV4cG9ydCBjb25zdCBURU5BTlRfU0VFRCA9IFwidGVuYW50XCI7XG5leHBvcnQgY29uc3QgVElDS0VUX1NFRUQgPSBcInRpY2tldFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVyaXZlUXVldWVQZGEocHJvZ3JhbUlkOiBBZGRyZXNzLCBhdXRob3JpdHk6IEFkZHJlc3MpOiBQcm9taXNlPEFkZHJlc3M+IHtcbiAgY29uc3QgW3BkYV0gPSBhd2FpdCBnZXRQcm9ncmFtRGVyaXZlZEFkZHJlc3Moe1xuICAgIHByb2dyYW1BZGRyZXNzOiBwcm9ncmFtSWQsXG4gICAgc2VlZHM6IFt1dGY4RW5jb2Rlci5lbmNvZGUoUVVFVUVfU0VFRCksIGFkZHJlc3NFbmNvZGVyLmVuY29kZShhdXRob3JpdHkpXSxcbiAgfSk7XG4gIHJldHVybiBwZGE7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXJpdmVUZW5hbnRQZGEocHJvZ3JhbUlkOiBBZGRyZXNzLCBhdXRob3JpdHk6IEFkZHJlc3MpOiBQcm9taXNlPEFkZHJlc3M+IHtcbiAgY29uc3QgW3BkYV0gPSBhd2FpdCBnZXRQcm9ncmFtRGVyaXZlZEFkZHJlc3Moe1xuICAgIHByb2dyYW1BZGRyZXNzOiBwcm9ncmFtSWQsXG4gICAgc2VlZHM6IFt1dGY4RW5jb2Rlci5lbmNvZGUoVEVOQU5UX1NFRUQpLCBhZGRyZXNzRW5jb2Rlci5lbmNvZGUoYXV0aG9yaXR5KV0sXG4gIH0pO1xuICByZXR1cm4gcGRhO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVyaXZlVGlja2V0UGRhKFxuICBwcm9ncmFtSWQ6IEFkZHJlc3MsXG4gIHBsYXllcjogQWRkcmVzcyxcbiAgdGVuYW50OiBBZGRyZXNzXG4pOiBQcm9taXNlPEFkZHJlc3M+IHtcbiAgY29uc3QgW3BkYV0gPSBhd2FpdCBnZXRQcm9ncmFtRGVyaXZlZEFkZHJlc3Moe1xuICAgIHByb2dyYW1BZGRyZXNzOiBwcm9ncmFtSWQsXG4gICAgc2VlZHM6IFtcbiAgICAgIHV0ZjhFbmNvZGVyLmVuY29kZShUSUNLRVRfU0VFRCksXG4gICAgICBhZGRyZXNzRW5jb2Rlci5lbmNvZGUocGxheWVyKSxcbiAgICAgIGFkZHJlc3NFbmNvZGVyLmVuY29kZSh0ZW5hbnQpLFxuICAgIF0sXG4gIH0pO1xuICByZXR1cm4gcGRhO1xufVxuIl19
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixpQkFBaUIsRUFDakIsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixFQUFFLENBQUM7QUFDM0MsTUFBTSxXQUFXLEdBQUcsY0FBYyxFQUFFLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsOENBQXlELENBQUM7QUFDNUYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsOENBQXlELENBQUM7QUFFNUYsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsY0FBdUI7SUFDL0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7UUFDM0MsY0FBYyxFQUFFLGtCQUFrQjtRQUNsQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7S0FDbEYsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsaUdBQWlHO0FBQ2pHLE1BQU0sQ0FBQyxLQUFLLFVBQVUsOEJBQThCLENBQUMsYUFBc0I7SUFLekUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQztRQUN4RCxjQUFjLEVBQUUsa0JBQWtCO1FBQ2xDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztLQUNoRixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxNQUFNLHdCQUF3QixDQUFDO1FBQzFELGNBQWMsRUFBRSxrQkFBa0I7UUFDbEMsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDekYsQ0FBQyxDQUFDO0lBQ0gsbUZBQW1GO0lBQ25GLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7UUFDeEQsY0FBYyxFQUFFLGtCQUFrQjtRQUNsQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDNUUsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDcEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUNwQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUFDLFNBQWtCLEVBQUUsU0FBa0I7SUFDekUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7UUFDM0MsY0FBYyxFQUFFLFNBQVM7UUFDekIsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQzFFLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLFNBQWtCLEVBQUUsU0FBa0I7SUFDMUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7UUFDM0MsY0FBYyxFQUFFLFNBQVM7UUFDekIsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQzNFLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUNuQyxTQUFrQixFQUNsQixNQUFlLEVBQ2YsTUFBZTtJQUVmLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLHdCQUF3QixDQUFDO1FBQzNDLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLEtBQUssRUFBRTtZQUNMLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQy9CLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzdCLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQzlCO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZ2V0UHJvZ3JhbURlcml2ZWRBZGRyZXNzLFxuICBnZXRBZGRyZXNzRW5jb2RlcixcbiAgZ2V0VXRmOEVuY29kZXIsXG4gIHR5cGUgQWRkcmVzcyxcbn0gZnJvbSBcIkBzb2xhbmEva2l0XCI7XG5cbmNvbnN0IGFkZHJlc3NFbmNvZGVyID0gZ2V0QWRkcmVzc0VuY29kZXIoKTtcbmNvbnN0IHV0ZjhFbmNvZGVyID0gZ2V0VXRmOEVuY29kZXIoKTtcblxuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fUFJPR1JBTSA9IFwiQUNMc2VvUG95QzNjQnFvVXRrYmpaNGFEcmt1clpXODZ2MTlwWHoyWFFucDFcIiBhcyBBZGRyZXNzO1xuZXhwb3J0IGNvbnN0IERFTEVHQVRJT05fUFJPR1JBTSA9IFwiREVMZUdHdlhwV1YyZnFKVWhxY0Y1WlNZTVM0SlRManRlYUFNQVJSU2FlU2hcIiBhcyBBZGRyZXNzO1xuXG4vKiogRGVyaXZlcyB0aGUgUGVybWlzc2lvbiBQREEgZm9yIGEgZ2l2ZW4gcGVybWlzc2lvbmVkIGFjY291bnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVyaXZlUGVybWlzc2lvblBkYShhY2NvdW50QWRkcmVzczogQWRkcmVzcyk6IFByb21pc2U8QWRkcmVzcz4ge1xuICBjb25zdCBbcGRhXSA9IGF3YWl0IGdldFByb2dyYW1EZXJpdmVkQWRkcmVzcyh7XG4gICAgcHJvZ3JhbUFkZHJlc3M6IFBFUk1JU1NJT05fUFJPR1JBTSxcbiAgICBzZWVkczogW3V0ZjhFbmNvZGVyLmVuY29kZShcInBlcm1pc3Npb246XCIpLCBhZGRyZXNzRW5jb2Rlci5lbmNvZGUoYWNjb3VudEFkZHJlc3MpXSxcbiAgfSk7XG4gIHJldHVybiBwZGE7XG59XG5cbi8qKiBEZXJpdmVzIHRoZSBERUxlR0cgZGVsZWdhdGlvbiBQREFzIGZvciB0aGUgUGVybWlzc2lvbiBQREEgKHVzZWQgaW4gRGVsZWdhdGVQZXJtaXNzaW9uIGl4KS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXJpdmVQZXJtaXNzaW9uRGVsZWdhdGlvblBkYXMocGVybWlzc2lvblBkYTogQWRkcmVzcyk6IFByb21pc2U8e1xuICBkZWxlZ2F0aW9uQnVmZmVyOiBBZGRyZXNzO1xuICBkZWxlZ2F0aW9uUmVjb3JkOiBBZGRyZXNzO1xuICBkZWxlZ2F0aW9uTWV0YWRhdGE6IEFkZHJlc3M7XG59PiB7XG4gIGNvbnN0IFtkZWxlZ2F0aW9uUmVjb3JkXSA9IGF3YWl0IGdldFByb2dyYW1EZXJpdmVkQWRkcmVzcyh7XG4gICAgcHJvZ3JhbUFkZHJlc3M6IERFTEVHQVRJT05fUFJPR1JBTSxcbiAgICBzZWVkczogW3V0ZjhFbmNvZGVyLmVuY29kZShcImRlbGVnYXRpb25cIiksIGFkZHJlc3NFbmNvZGVyLmVuY29kZShwZXJtaXNzaW9uUGRhKV0sXG4gIH0pO1xuICBjb25zdCBbZGVsZWdhdGlvbk1ldGFkYXRhXSA9IGF3YWl0IGdldFByb2dyYW1EZXJpdmVkQWRkcmVzcyh7XG4gICAgcHJvZ3JhbUFkZHJlc3M6IERFTEVHQVRJT05fUFJPR1JBTSxcbiAgICBzZWVkczogW3V0ZjhFbmNvZGVyLmVuY29kZShcImRlbGVnYXRpb24tbWV0YWRhdGFcIiksIGFkZHJlc3NFbmNvZGVyLmVuY29kZShwZXJtaXNzaW9uUGRhKV0sXG4gIH0pO1xuICAvLyBCdWZmZXIgUERBIGlzIHVuZGVyIHRoZSBvd25lclByb2dyYW0gKFBFUk1JU1NJT05fUFJPR1JBTSBmb3IgdGhlIFBlcm1pc3Npb24gUERBKVxuICBjb25zdCBbZGVsZWdhdGlvbkJ1ZmZlcl0gPSBhd2FpdCBnZXRQcm9ncmFtRGVyaXZlZEFkZHJlc3Moe1xuICAgIHByb2dyYW1BZGRyZXNzOiBQRVJNSVNTSU9OX1BST0dSQU0sXG4gICAgc2VlZHM6IFt1dGY4RW5jb2Rlci5lbmNvZGUoXCJidWZmZXJcIiksIGFkZHJlc3NFbmNvZGVyLmVuY29kZShwZXJtaXNzaW9uUGRhKV0sXG4gIH0pO1xuICByZXR1cm4geyBkZWxlZ2F0aW9uQnVmZmVyLCBkZWxlZ2F0aW9uUmVjb3JkLCBkZWxlZ2F0aW9uTWV0YWRhdGEgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFFVRVVFX1NFRUQgPSBcInF1ZXVlXCI7XG5leHBvcnQgY29uc3QgVEVOQU5UX1NFRUQgPSBcInRlbmFudFwiO1xuZXhwb3J0IGNvbnN0IFRJQ0tFVF9TRUVEID0gXCJ0aWNrZXRcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcml2ZVF1ZXVlUGRhKHByb2dyYW1JZDogQWRkcmVzcywgYXV0aG9yaXR5OiBBZGRyZXNzKTogUHJvbWlzZTxBZGRyZXNzPiB7XG4gIGNvbnN0IFtwZGFdID0gYXdhaXQgZ2V0UHJvZ3JhbURlcml2ZWRBZGRyZXNzKHtcbiAgICBwcm9ncmFtQWRkcmVzczogcHJvZ3JhbUlkLFxuICAgIHNlZWRzOiBbdXRmOEVuY29kZXIuZW5jb2RlKFFVRVVFX1NFRUQpLCBhZGRyZXNzRW5jb2Rlci5lbmNvZGUoYXV0aG9yaXR5KV0sXG4gIH0pO1xuICByZXR1cm4gcGRhO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVyaXZlVGVuYW50UGRhKHByb2dyYW1JZDogQWRkcmVzcywgYXV0aG9yaXR5OiBBZGRyZXNzKTogUHJvbWlzZTxBZGRyZXNzPiB7XG4gIGNvbnN0IFtwZGFdID0gYXdhaXQgZ2V0UHJvZ3JhbURlcml2ZWRBZGRyZXNzKHtcbiAgICBwcm9ncmFtQWRkcmVzczogcHJvZ3JhbUlkLFxuICAgIHNlZWRzOiBbdXRmOEVuY29kZXIuZW5jb2RlKFRFTkFOVF9TRUVEKSwgYWRkcmVzc0VuY29kZXIuZW5jb2RlKGF1dGhvcml0eSldLFxuICB9KTtcbiAgcmV0dXJuIHBkYTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcml2ZVRpY2tldFBkYShcbiAgcHJvZ3JhbUlkOiBBZGRyZXNzLFxuICBwbGF5ZXI6IEFkZHJlc3MsXG4gIHRlbmFudDogQWRkcmVzc1xuKTogUHJvbWlzZTxBZGRyZXNzPiB7XG4gIGNvbnN0IFtwZGFdID0gYXdhaXQgZ2V0UHJvZ3JhbURlcml2ZWRBZGRyZXNzKHtcbiAgICBwcm9ncmFtQWRkcmVzczogcHJvZ3JhbUlkLFxuICAgIHNlZWRzOiBbXG4gICAgICB1dGY4RW5jb2Rlci5lbmNvZGUoVElDS0VUX1NFRUQpLFxuICAgICAgYWRkcmVzc0VuY29kZXIuZW5jb2RlKHBsYXllciksXG4gICAgICBhZGRyZXNzRW5jb2Rlci5lbmNvZGUodGVuYW50KSxcbiAgICBdLFxuICB9KTtcbiAgcmV0dXJuIHBkYTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1upmonster/duel",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "type": "module",
5
5
  "description": "SDK for Private Matchmaking on Solana",
6
6
  "license": "MIT",
package/src/admin.ts CHANGED
@@ -1,14 +1,17 @@
1
1
  import {
2
2
  createSolanaRpc,
3
+ AccountRole,
3
4
  type Address,
4
5
  type TransactionSigner,
5
6
  type Rpc,
6
7
  type SolanaRpcApi,
8
+ type Instruction,
7
9
  } from "@solana/kit";
8
10
  import {
9
11
  getInitializeTenantInstructionAsync,
10
12
  getInitializeQueueInstructionAsync,
11
13
  getDelegateQueueInstructionAsync,
14
+ getSetupQueuePermissionInstructionAsync,
12
15
  getFlushMatchesInstruction,
13
16
  getCommitTicketsInstruction,
14
17
  fetchQueue,
@@ -114,6 +117,39 @@ export class MatchmakingAdmin {
114
117
  validator?: Address,
115
118
  ): Promise<string> {
116
119
  const queuePda = await this.getQueuePda(authority);
120
+
121
+ // 1. Create Permission PDA for the queue (CPI from duel program with invoke_signed)
122
+ const permissionPda = await utils.derivePermissionPda(queuePda);
123
+ const setupIx = await getSetupQueuePermissionInstructionAsync({
124
+ authority: this.signer,
125
+ permission: permissionPda,
126
+ permissionProgram: utils.PERMISSION_PROGRAM,
127
+ }, { programAddress: this.programId });
128
+ await sendInstruction(this.rpc, setupIx, this.signer);
129
+
130
+ // 2. Delegate Permission PDA to TEE (called on permission program, authority signs)
131
+ const { delegationBuffer, delegationRecord, delegationMetadata } =
132
+ await utils.derivePermissionDelegationPdas(permissionPda);
133
+ const delegatePermIx: Instruction = {
134
+ programAddress: utils.PERMISSION_PROGRAM,
135
+ data: new Uint8Array([3, 0, 0, 0, 0, 0, 0, 0]), // discriminator = 3 (DelegatePermission)
136
+ accounts: [
137
+ { address: this.signer.address, role: AccountRole.WRITABLE_SIGNER }, // payer
138
+ { address: this.signer.address, role: AccountRole.READONLY_SIGNER }, // authority
139
+ { address: queuePda, role: AccountRole.READONLY }, // permissionedAccount (not signer)
140
+ { address: permissionPda, role: AccountRole.WRITABLE }, // permission PDA
141
+ { address: "11111111111111111111111111111111" as Address, role: AccountRole.READONLY }, // system_program
142
+ { address: utils.PERMISSION_PROGRAM, role: AccountRole.READONLY }, // owner_program
143
+ { address: delegationBuffer, role: AccountRole.WRITABLE },
144
+ { address: delegationRecord, role: AccountRole.WRITABLE },
145
+ { address: delegationMetadata, role: AccountRole.WRITABLE },
146
+ { address: utils.DELEGATION_PROGRAM, role: AccountRole.READONLY },
147
+ ...(validator ? [{ address: validator, role: AccountRole.READONLY }] : []),
148
+ ],
149
+ };
150
+ await sendInstruction(this.rpc, delegatePermIx, this.signer);
151
+
152
+ // 3. Delegate queue PDA to TEE (existing DELeGG flow)
117
153
  const ix = await getDelegateQueueInstructionAsync({
118
154
  pda: queuePda,
119
155
  payer: this.signer,
@@ -127,7 +163,6 @@ export class MatchmakingAdmin {
127
163
  queue: Address,
128
164
  tenant: Address,
129
165
  ticketPdas: Address[],
130
- callbackProgram?: Address,
131
166
  ): Promise<string> {
132
167
  const ix = getFlushMatchesInstruction({
133
168
  queue,
@@ -135,14 +170,12 @@ export class MatchmakingAdmin {
135
170
  signer: this.signer,
136
171
  }, { programAddress: this.programId });
137
172
 
138
- const remainingAccounts = [
139
- ...ticketPdas.map((address) => ({ address, role: 1 as const })),
140
- ...(callbackProgram ? [{ address: callbackProgram, role: 0 as const }] : []),
141
- ];
142
-
143
173
  const ixWithRemaining = {
144
174
  ...ix,
145
- accounts: [...ix.accounts, ...remainingAccounts],
175
+ accounts: [
176
+ ...ix.accounts,
177
+ ...ticketPdas.map((address) => ({ address, role: 1 as const })),
178
+ ],
146
179
  };
147
180
 
148
181
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -170,6 +203,33 @@ export class MatchmakingAdmin {
170
203
  return sendInstruction(this.rpc, ixWithRemaining as any, this.signer);
171
204
  }
172
205
 
206
+ /**
207
+ * High-level: full match resolution flow (runs on TEE).
208
+ * Reads the queue's pending matches, flushes them (updating opponent tickets),
209
+ * waits for TEE settlement, then commits all tickets back to L1.
210
+ * Use individual methods (flushMatches, commitTickets) as escape hatches if needed.
211
+ */
212
+ async resolveMatches(
213
+ queue: Address,
214
+ tenant: Address,
215
+ ticketPdas: Address[],
216
+ settlementDelayMs = 3000,
217
+ ): Promise<void> {
218
+ const queueData = await this.getQueue(queue);
219
+ const pendingTicketPdas = await Promise.all(
220
+ queueData.data.pendingMatches.map((pm) =>
221
+ utils.deriveTicketPda(this.programId, pm.player, tenant),
222
+ ),
223
+ );
224
+
225
+ if (pendingTicketPdas.length > 0) {
226
+ await this.flushMatches(queue, tenant, pendingTicketPdas);
227
+ await new Promise((r) => setTimeout(r, settlementDelayMs));
228
+ }
229
+
230
+ await this.commitTickets(tenant, ticketPdas);
231
+ }
232
+
173
233
  /** Create a new MatchmakingAdmin pointing at a TEE RPC endpoint. */
174
234
  withRpc(teeUrl: string): MatchmakingAdmin {
175
235
  return new MatchmakingAdmin(createSolanaRpc(teeUrl), this.signer, this.programId);