@1upmonster/duel 0.1.7 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/dist/admin.d.ts +20 -42
  2. package/dist/admin.js +82 -118
  3. package/dist/encryption.js +1 -2
  4. package/dist/generated/duel/accounts/index.d.ts +10 -0
  5. package/dist/generated/duel/accounts/index.js +11 -0
  6. package/dist/generated/duel/accounts/matchTicket.d.ts +38 -0
  7. package/dist/generated/duel/accounts/matchTicket.js +45 -0
  8. package/dist/generated/duel/accounts/queue.d.ts +42 -0
  9. package/dist/generated/duel/accounts/queue.js +45 -0
  10. package/dist/generated/duel/accounts/tenant.d.ts +41 -0
  11. package/dist/generated/duel/accounts/tenant.js +44 -0
  12. package/dist/generated/duel/errors/duel.d.ts +33 -0
  13. package/dist/generated/duel/errors/duel.js +37 -0
  14. package/dist/generated/duel/errors/index.d.ts +8 -0
  15. package/dist/generated/duel/errors/index.js +9 -0
  16. package/dist/generated/duel/index.d.ts +12 -0
  17. package/dist/generated/duel/index.js +13 -0
  18. package/dist/generated/duel/instructions/cancelTicket.d.ts +45 -0
  19. package/dist/generated/duel/instructions/cancelTicket.js +56 -0
  20. package/dist/generated/duel/instructions/closeTicket.d.ts +45 -0
  21. package/dist/generated/duel/instructions/closeTicket.js +56 -0
  22. package/dist/generated/duel/instructions/commitTickets.d.ts +39 -0
  23. package/dist/generated/duel/instructions/commitTickets.js +50 -0
  24. package/dist/generated/duel/instructions/createTicket.d.ts +48 -0
  25. package/dist/generated/duel/instructions/createTicket.js +63 -0
  26. package/dist/generated/duel/instructions/delegateQueue.d.ts +69 -0
  27. package/dist/generated/duel/instructions/delegateQueue.js +90 -0
  28. package/dist/generated/duel/instructions/delegateTicket.d.ts +69 -0
  29. package/dist/generated/duel/instructions/delegateTicket.js +90 -0
  30. package/dist/generated/duel/instructions/flushMatches.d.ts +37 -0
  31. package/dist/generated/duel/instructions/flushMatches.js +43 -0
  32. package/dist/generated/duel/instructions/index.d.ts +18 -0
  33. package/dist/generated/duel/instructions/index.js +19 -0
  34. package/dist/generated/duel/instructions/initializeQueue.d.ts +48 -0
  35. package/dist/generated/duel/instructions/initializeQueue.js +63 -0
  36. package/dist/generated/duel/instructions/initializeTenant.d.ts +70 -0
  37. package/dist/generated/duel/instructions/initializeTenant.js +67 -0
  38. package/dist/generated/duel/instructions/joinQueue.d.ts +51 -0
  39. package/dist/generated/duel/instructions/joinQueue.js +56 -0
  40. package/dist/generated/duel/instructions/processUndelegation.d.ts +43 -0
  41. package/dist/generated/duel/instructions/processUndelegation.js +49 -0
  42. package/dist/generated/duel/programs/duel.d.ts +88 -0
  43. package/dist/generated/duel/programs/duel.js +138 -0
  44. package/dist/generated/duel/programs/index.d.ts +8 -0
  45. package/dist/generated/duel/programs/index.js +9 -0
  46. package/dist/generated/duel/types/accountType.d.ts +25 -0
  47. package/dist/generated/duel/types/accountType.js +25 -0
  48. package/dist/generated/duel/types/index.d.ts +13 -0
  49. package/dist/generated/duel/types/index.js +14 -0
  50. package/dist/generated/duel/types/matchEntry.d.ts +23 -0
  51. package/dist/generated/duel/types/matchEntry.js +18 -0
  52. package/dist/generated/duel/types/matchFound.d.ts +23 -0
  53. package/dist/generated/duel/types/matchFound.js +18 -0
  54. package/dist/generated/duel/types/pendingMatch.d.ts +21 -0
  55. package/dist/generated/duel/types/pendingMatch.js +18 -0
  56. package/dist/generated/duel/types/queueEntry.d.ts +19 -0
  57. package/dist/generated/duel/types/queueEntry.js +18 -0
  58. package/dist/generated/duel/types/ticketStatus.d.ts +40 -0
  59. package/dist/generated/duel/types/ticketStatus.js +25 -0
  60. package/dist/generated/rps-game/accounts/gameSession.d.ts +40 -0
  61. package/dist/generated/rps-game/accounts/gameSession.js +45 -0
  62. package/dist/generated/rps-game/accounts/index.d.ts +9 -0
  63. package/dist/generated/rps-game/accounts/index.js +10 -0
  64. package/dist/generated/rps-game/accounts/playerProfile.d.ts +36 -0
  65. package/dist/generated/rps-game/accounts/playerProfile.js +47 -0
  66. package/dist/generated/rps-game/errors/index.d.ts +8 -0
  67. package/dist/generated/rps-game/errors/index.js +9 -0
  68. package/dist/generated/rps-game/errors/rpsGame.d.ts +25 -0
  69. package/dist/generated/rps-game/errors/rpsGame.js +29 -0
  70. package/dist/generated/rps-game/index.d.ts +12 -0
  71. package/dist/generated/rps-game/index.js +13 -0
  72. package/dist/generated/rps-game/instructions/closePlayer.d.ts +45 -0
  73. package/dist/generated/rps-game/instructions/closePlayer.js +56 -0
  74. package/dist/generated/rps-game/instructions/delegatePda.d.ts +69 -0
  75. package/dist/generated/rps-game/instructions/delegatePda.js +90 -0
  76. package/dist/generated/rps-game/instructions/index.d.ts +16 -0
  77. package/dist/generated/rps-game/instructions/index.js +17 -0
  78. package/dist/generated/rps-game/instructions/initializePlayer.d.ts +48 -0
  79. package/dist/generated/rps-game/instructions/initializePlayer.js +63 -0
  80. package/dist/generated/rps-game/instructions/makeChoice.d.ts +44 -0
  81. package/dist/generated/rps-game/instructions/makeChoice.js +46 -0
  82. package/dist/generated/rps-game/instructions/onMatchFound.d.ts +43 -0
  83. package/dist/generated/rps-game/instructions/onMatchFound.js +45 -0
  84. package/dist/generated/rps-game/instructions/persistResults.d.ts +43 -0
  85. package/dist/generated/rps-game/instructions/persistResults.js +50 -0
  86. package/dist/generated/rps-game/instructions/processUndelegation.d.ts +43 -0
  87. package/dist/generated/rps-game/instructions/processUndelegation.js +49 -0
  88. package/dist/generated/rps-game/instructions/startGame.d.ts +54 -0
  89. package/dist/generated/rps-game/instructions/startGame.js +67 -0
  90. package/dist/generated/rps-game/instructions/startGameWithTicket.d.ts +57 -0
  91. package/dist/generated/rps-game/instructions/startGameWithTicket.js +67 -0
  92. package/dist/generated/rps-game/programs/index.d.ts +8 -0
  93. package/dist/generated/rps-game/programs/index.js +9 -0
  94. package/dist/generated/rps-game/programs/rpsGame.d.ts +78 -0
  95. package/dist/generated/rps-game/programs/rpsGame.js +118 -0
  96. package/dist/generated/rps-game/types/accountType.d.ts +34 -0
  97. package/dist/generated/rps-game/types/accountType.js +25 -0
  98. package/dist/generated/rps-game/types/choice.d.ts +17 -0
  99. package/dist/generated/rps-game/types/choice.js +25 -0
  100. package/dist/generated/rps-game/types/gameResult.d.ts +26 -0
  101. package/dist/generated/rps-game/types/gameResult.js +25 -0
  102. package/dist/generated/rps-game/types/index.d.ts +10 -0
  103. package/dist/generated/rps-game/types/index.js +11 -0
  104. package/dist/index.d.ts +2 -1
  105. package/dist/index.js +3 -2
  106. package/dist/player.d.ts +21 -49
  107. package/dist/player.js +61 -141
  108. package/dist/tee.d.ts +14 -0
  109. package/dist/tee.js +62 -0
  110. package/dist/transaction.d.ts +11 -0
  111. package/dist/transaction.js +50 -0
  112. package/dist/utils.d.ts +4 -4
  113. package/dist/utils.js +23 -8
  114. package/package.json +4 -7
  115. package/src/admin.ts +129 -164
  116. package/src/duel.json +66 -2
  117. package/src/encryption.ts +0 -3
  118. package/src/generated/duel/accounts/index.ts +11 -0
  119. package/src/generated/duel/accounts/matchTicket.ts +77 -0
  120. package/src/generated/duel/accounts/queue.ts +77 -0
  121. package/src/generated/duel/accounts/tenant.ts +76 -0
  122. package/src/generated/duel/errors/duel.ts +48 -0
  123. package/src/generated/duel/errors/index.ts +9 -0
  124. package/src/generated/duel/index.ts +13 -0
  125. package/src/generated/duel/instructions/cancelTicket.ts +100 -0
  126. package/src/generated/duel/instructions/closeTicket.ts +100 -0
  127. package/src/generated/duel/instructions/commitTickets.ts +84 -0
  128. package/src/generated/duel/instructions/createTicket.ts +109 -0
  129. package/src/generated/duel/instructions/delegateQueue.ts +157 -0
  130. package/src/generated/duel/instructions/delegateTicket.ts +157 -0
  131. package/src/generated/duel/instructions/flushMatches.ts +76 -0
  132. package/src/generated/duel/instructions/index.ts +19 -0
  133. package/src/generated/duel/instructions/initializeQueue.ts +109 -0
  134. package/src/generated/duel/instructions/initializeTenant.ts +126 -0
  135. package/src/generated/duel/instructions/joinQueue.ts +106 -0
  136. package/src/generated/duel/instructions/processUndelegation.ts +86 -0
  137. package/src/generated/duel/programs/duel.ts +104 -0
  138. package/src/generated/duel/programs/index.ts +9 -0
  139. package/src/generated/duel/types/accountType.ts +36 -0
  140. package/src/generated/duel/types/index.ts +14 -0
  141. package/src/generated/duel/types/matchEntry.ts +25 -0
  142. package/src/generated/duel/types/matchFound.ts +25 -0
  143. package/src/generated/duel/types/pendingMatch.ts +25 -0
  144. package/src/generated/duel/types/queueEntry.ts +25 -0
  145. package/src/generated/duel/types/ticketStatus.ts +38 -0
  146. package/src/generated/rps-game/accounts/gameSession.ts +77 -0
  147. package/src/generated/rps-game/accounts/index.ts +10 -0
  148. package/src/generated/rps-game/accounts/playerProfile.ts +80 -0
  149. package/src/generated/rps-game/errors/index.ts +9 -0
  150. package/src/generated/rps-game/errors/rpsGame.ts +40 -0
  151. package/src/generated/rps-game/index.ts +13 -0
  152. package/src/generated/rps-game/instructions/closePlayer.ts +100 -0
  153. package/src/generated/rps-game/instructions/delegatePda.ts +157 -0
  154. package/src/generated/rps-game/instructions/index.ts +17 -0
  155. package/src/generated/rps-game/instructions/initializePlayer.ts +109 -0
  156. package/src/generated/rps-game/instructions/makeChoice.ts +84 -0
  157. package/src/generated/rps-game/instructions/onMatchFound.ts +79 -0
  158. package/src/generated/rps-game/instructions/persistResults.ts +88 -0
  159. package/src/generated/rps-game/instructions/processUndelegation.ts +86 -0
  160. package/src/generated/rps-game/instructions/startGame.ts +118 -0
  161. package/src/generated/rps-game/instructions/startGameWithTicket.ts +121 -0
  162. package/src/generated/rps-game/programs/index.ts +9 -0
  163. package/src/generated/rps-game/programs/rpsGame.ts +95 -0
  164. package/src/generated/rps-game/types/accountType.ts +36 -0
  165. package/src/generated/rps-game/types/choice.ts +25 -0
  166. package/src/generated/rps-game/types/gameResult.ts +37 -0
  167. package/src/generated/rps-game/types/index.ts +11 -0
  168. package/src/index.ts +2 -1
  169. package/src/player.ts +96 -193
  170. package/src/rps_game.json +991 -0
  171. package/src/tee.ts +79 -0
  172. package/src/transaction.ts +90 -0
  173. package/src/utils.ts +35 -20
  174. package/tsconfig.json +2 -2
  175. package/dist/client.d.ts +0 -54
  176. package/dist/client.js +0 -265
  177. package/dist/duel.json +0 -517
  178. package/dist/private_matchmaking.json +0 -534
  179. package/dist/types.d.ts +0 -635
  180. package/dist/types.js +0 -2
  181. package/src/types.ts +0 -300
package/dist/player.js CHANGED
@@ -1,167 +1,87 @@
1
- import * as anchor from "@coral-xyz/anchor";
2
- import * as web3 from "@solana/web3.js";
3
- import { createRequire } from "module";
4
- const IDL = createRequire(import.meta.url)("./duel.json");
1
+ import { createSolanaRpc, } from "@solana/kit";
2
+ import { getCreateTicketInstructionAsync, getDelegateTicketInstructionAsync, getJoinQueueInstructionAsync, getCancelTicketInstructionAsync, getCloseTicketInstructionAsync, fetchMaybeMatchTicket, accountType, } from "./generated/duel/index.js";
3
+ import { sendInstruction } from "./transaction.js";
5
4
  import * as utils from "./utils.js";
5
+ const DUEL_PROGRAM_ID = "EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X";
6
6
  export class MatchmakingPlayer {
7
- constructor(provider, programId) {
8
- const address = typeof programId === "string" ? programId : programId.toBase58();
9
- const idl = { ...IDL, address };
10
- this.program = new anchor.Program(idl, provider);
11
- this.provider = provider;
7
+ constructor(rpc, signer, programId = DUEL_PROGRAM_ID) {
8
+ this.rpc = rpc;
9
+ this.signer = signer;
10
+ this.programId = programId;
12
11
  }
13
- /**
14
- * Derive MatchTicket PDA
15
- */
16
- getTicketPda(player, tenant) {
17
- return utils.deriveTicketPda(this.program.programId, player, tenant);
12
+ async getTicketPda(player, tenant) {
13
+ return utils.deriveTicketPda(this.programId, player, tenant);
18
14
  }
19
- /**
20
- * Fetch MatchTicket account data
21
- */
22
15
  async getTicket(ticketPda) {
23
- return await this.program.account.matchTicket.fetch(ticketPda);
16
+ return fetchMaybeMatchTicket(this.rpc, ticketPda);
24
17
  }
25
- /**
26
- * Create MatchTicket PDA on L1
27
- */
28
- async createTicket(tenant, confirmOptions, signers = []) {
29
- const ticketPda = this.getTicketPda(this.provider.publicKey, tenant);
30
- return await this.program.methods
31
- .createTicket()
32
- .accountsPartial({
33
- ticket: ticketPda,
34
- tenant: tenant,
35
- player: this.provider.publicKey,
36
- })
37
- .signers(signers)
38
- .rpc(confirmOptions);
18
+ async createTicket(tenant) {
19
+ const ix = await getCreateTicketInstructionAsync({
20
+ player: this.signer,
21
+ tenant,
22
+ }, { programAddress: this.programId });
23
+ return sendInstruction(this.rpc, ix, this.signer);
39
24
  }
40
- /**
41
- * Delegate ticket into TEE (becomes invisible on L1)
42
- */
43
- async delegateTicket(player, tenant, validator = new web3.PublicKey("FnE6VJT5QNZdedZPnCoLsARgBwoE6DeJNjBs2H1gySXA"), confirmOptions, signers = []) {
44
- const ticketPda = this.getTicketPda(player, tenant);
45
- return await this.program.methods
46
- .delegateTicket({ ticket: { player, tenant } })
47
- .accounts({
25
+ async delegateTicket(player, tenant, validator) {
26
+ const ticketPda = await this.getTicketPda(player, tenant);
27
+ const ix = await getDelegateTicketInstructionAsync({
48
28
  pda: ticketPda,
49
- payer: this.provider.publicKey,
50
- validator: validator,
51
- })
52
- .signers(signers)
53
- .rpc(confirmOptions);
29
+ payer: this.signer,
30
+ validator,
31
+ accountType: accountType("Ticket", { player, tenant }),
32
+ }, { programAddress: this.programId });
33
+ return sendInstruction(this.rpc, ix, this.signer);
54
34
  }
55
- /**
56
- * Join Queue (TEE Aware) - now requires ticket
57
- */
58
- async joinQueue(queue, tenant, playerData, confirmOptions, signers = []) {
59
- const ticketPda = this.getTicketPda(this.provider.publicKey, tenant);
60
- return await this.program.methods
61
- .joinQueue()
62
- .accountsPartial({
63
- queue: queue,
64
- tenant: tenant,
65
- playerData: playerData,
66
- playerTicket: ticketPda,
67
- signer: this.provider.publicKey,
68
- })
69
- .signers(signers)
70
- .rpc(confirmOptions);
35
+ async joinQueue(queue, tenant, playerData) {
36
+ const ix = await getJoinQueueInstructionAsync({
37
+ queue,
38
+ tenant,
39
+ playerData,
40
+ signer: this.signer,
41
+ }, { programAddress: this.programId });
42
+ return sendInstruction(this.rpc, ix, this.signer);
71
43
  }
72
- /**
73
- * Cancel search, marks ticket as Cancelled (runs in TEE)
74
- */
75
- async cancelTicket(tenant, confirmOptions, signers = []) {
76
- const ticketPda = this.getTicketPda(this.provider.publicKey, tenant);
77
- return await this.program.methods
78
- .cancelTicket()
79
- .accountsPartial({
80
- ticket: ticketPda,
81
- tenant: tenant,
82
- player: this.provider.publicKey,
83
- })
84
- .signers(signers)
85
- .rpc(confirmOptions);
44
+ async cancelTicket(tenant) {
45
+ const ix = await getCancelTicketInstructionAsync({
46
+ player: this.signer,
47
+ tenant,
48
+ }, { programAddress: this.programId });
49
+ return sendInstruction(this.rpc, ix, this.signer);
86
50
  }
87
- /**
88
- * Close ticket and reclaim rent (L1, after match consumed or cancelled)
89
- */
90
- async closeTicket(tenant, confirmOptions, signers = []) {
91
- const ticketPda = this.getTicketPda(this.provider.publicKey, tenant);
92
- return await this.program.methods
93
- .closeTicket()
94
- .accountsPartial({
95
- ticket: ticketPda,
96
- tenant: tenant,
97
- player: this.provider.publicKey,
98
- })
99
- .signers(signers)
100
- .rpc(confirmOptions);
101
- }
102
- /**
103
- * Wait for match by subscribing to ticket PDA changes on L1.
104
- * Returns match info when ticket status changes to Matched.
105
- */
106
- async waitForMatch(ticketPda, connection, timeoutMs = 120000) {
107
- return new Promise((resolve, reject) => {
108
- let subscriptionId = null;
109
- let timeoutId = null;
110
- const cleanup = () => {
111
- if (timeoutId)
112
- clearTimeout(timeoutId);
113
- if (subscriptionId !== null) {
114
- connection.removeAccountChangeListener(subscriptionId);
115
- }
116
- };
117
- // Set timeout
118
- timeoutId = setTimeout(() => {
119
- cleanup();
120
- resolve(null);
121
- }, timeoutMs);
122
- // Subscribe to account changes on L1
123
- subscriptionId = connection.onAccountChange(ticketPda, (accountInfo) => {
124
- try {
125
- const decoded = this.program.coder.accounts.decode("matchTicket", accountInfo.data);
126
- if (decoded.status.matched) {
127
- cleanup();
128
- resolve({
129
- opponent: decoded.status.matched.opponent,
130
- matchId: decoded.status.matched.matchId,
131
- });
132
- }
133
- }
134
- catch (e) {
135
- // Ignore decode errors (account may be in transition)
136
- }
137
- }, "confirmed");
138
- });
51
+ async closeTicket(tenant) {
52
+ const ix = await getCloseTicketInstructionAsync({
53
+ player: this.signer,
54
+ tenant,
55
+ }, { programAddress: this.programId });
56
+ return sendInstruction(this.rpc, ix, this.signer);
139
57
  }
140
58
  /**
141
- * Poll L1 for ticket status (fallback for environments without websocket)
59
+ * Poll L1 for ticket status.
60
+ * Returns match info when status becomes Matched.
142
61
  */
143
- async pollForMatch(ticketPda, connection, maxAttempts = 60, pollInterval = 2000, signal) {
62
+ async pollForMatch(ticketPda, maxAttempts = 60, pollInterval = 2000, signal) {
144
63
  for (let i = 0; i < maxAttempts; i++) {
145
64
  if (signal?.aborted)
146
65
  return null;
147
- await new Promise(resolve => setTimeout(resolve, pollInterval));
66
+ await new Promise((r) => setTimeout(r, pollInterval));
148
67
  try {
149
- const accountInfo = await connection.getAccountInfo(ticketPda);
150
- if (!accountInfo)
68
+ const maybeTicket = await fetchMaybeMatchTicket(this.rpc, ticketPda);
69
+ if (!maybeTicket.exists)
151
70
  continue;
152
- const decoded = this.program.coder.accounts.decode("matchTicket", accountInfo.data);
153
- if (decoded.status.matched) {
154
- return {
155
- opponent: decoded.status.matched.opponent,
156
- matchId: decoded.status.matched.matchId,
157
- };
71
+ const status = maybeTicket.data.status;
72
+ if (status.__kind === "Matched") {
73
+ return { opponent: status.opponent, matchId: status.matchId };
158
74
  }
159
75
  }
160
- catch (e) {
161
- // Account may not exist yet or be in transition
76
+ catch {
77
+ // Ignore decode errors during transition
162
78
  }
163
79
  }
164
80
  return null;
165
81
  }
82
+ /** Create a new MatchmakingPlayer pointing at a TEE RPC endpoint. */
83
+ withRpc(teeUrl) {
84
+ return new MatchmakingPlayer(createSolanaRpc(teeUrl), this.signer, this.programId);
85
+ }
166
86
  }
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxJQUFJLE1BQU0saUJBQWlCLENBQUM7QUFFeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN2QyxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMxRCxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLE9BQU8saUJBQWlCO0lBSTVCLFlBQVksUUFBK0IsRUFBRSxTQUFrQztRQUM3RSxNQUFNLE9BQU8sR0FBRyxPQUFPLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pGLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxNQUFzQixFQUFFLE1BQXNCO1FBQ3pELE9BQU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUF5QjtRQUN2QyxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxD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QyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FDaEQsYUFBYSxFQUNiLFdBQVcsQ0FBQyxJQUFJLENBQ2pCLENBQUM7Z0JBRUYsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtvQkFDMUIsT0FBTzt3QkFDTCxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUTt3QkFDekMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU87cUJBQ3hDLENBQUM7aUJBQ0g7YUFDRjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLGdEQUFnRDthQUNqRDtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhbmNob3IgZnJvbSBcIkBjb3JhbC14eXovYW5jaG9yXCI7XG5pbXBvcnQgKiBhcyB3ZWIzIGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCB0eXBlIHsgRHVlbCB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuY29uc3QgSURMID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpKFwiLi9kdWVsLmpzb25cIik7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tIFwiLi91dGlscy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgTWF0Y2htYWtpbmdQbGF5ZXIge1xuICBwdWJsaWMgcHJvZ3JhbTogYW5jaG9yLlByb2dyYW08RHVlbD47XG4gIHB1YmxpYyBwcm92aWRlcjogYW5jaG9yLkFuY2hvclByb3ZpZGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb3ZpZGVyOiBhbmNob3IuQW5jaG9yUHJvdmlkZXIsIHByb2dyYW1JZDogd2ViMy5QdWJsaWNLZXkgfCBzdHJpbmcpIHtcbiAgICBjb25zdCBhZGRyZXNzID0gdHlwZW9mIHByb2dyYW1JZCA9PT0gXCJzdHJpbmdcIiA/IHByb2dyYW1JZCA6IHByb2dyYW1JZC50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IGlkbCA9IHsgLi4uSURMLCBhZGRyZXNzIH07XG4gICAgdGhpcy5wcm9ncmFtID0gbmV3IGFuY2hvci5Qcm9ncmFtKGlkbCBhcyBhbnksIHByb3ZpZGVyKTtcbiAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlIE1hdGNoVGlja2V0IFBEQVxuICAgKi9cbiAgZ2V0VGlja2V0UGRhKHBsYXllcjogd2ViMy5QdWJsaWNLZXksIHRlbmFudDogd2ViMy5QdWJsaWNLZXkpOiB3ZWIzLlB1YmxpY0tleSB7XG4gICAgcmV0dXJuIHV0aWxzLmRlcml2ZVRpY2tldFBkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkLCBwbGF5ZXIsIHRlbmFudCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggTWF0Y2hUaWNrZXQgYWNjb3VudCBkYXRhXG4gICAqL1xuICBhc3luYyBnZXRUaWNrZXQodGlja2V0UGRhOiB3ZWIzLlB1YmxpY0tleSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5hY2NvdW50Lm1hdGNoVGlja2V0LmZldGNoKHRpY2tldFBkYSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIE1hdGNoVGlja2V0IFBEQSBvbiBMMVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVGlja2V0KFxuICAgIHRlbmFudDogd2ViMy5QdWJsaWNLZXksXG4gICAgY29uZmlybU9wdGlvbnM/OiB3ZWIzLkNvbmZpcm1PcHRpb25zLFxuICAgIHNpZ25lcnM6IHdlYjMuS2V5cGFpcltdID0gW11cbiAgKTogUHJvbWlzZTx3ZWIzLlRyYW5zYWN0aW9uU2lnbmF0dXJlPiB7XG4gICAgY29uc3QgdGlja2V0UGRhID0gdGhpcy5nZXRUaWNrZXRQZGEodGhpcy5wcm92aWRlci5wdWJsaWNLZXksIHRlbmFudCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuY3JlYXRlVGlja2V0KClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICB0aWNrZXQ6IHRpY2tldFBkYSxcbiAgICAgICAgdGVuYW50OiB0ZW5hbnQsXG4gICAgICAgIHBsYXllcjogdGhpcy5wcm92aWRlci5wdWJsaWNLZXksXG4gICAgICB9KVxuICAgICAgLnNpZ25lcnMoc2lnbmVycylcbiAgICAgIC5ycGMoY29uZmlybU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGVnYXRlIHRpY2tldCBpbnRvIFRFRSAoYmVjb21lcyBpbnZpc2libGUgb24gTDEpXG4gICAqL1xuICBhc3luYyBkZWxlZ2F0ZVRpY2tldChcbiAgICBwbGF5ZXI6IHdlYjMuUHVibGljS2V5LFxuICAgIHRlbmFudDogd2ViMy5QdWJsaWNLZXksXG4gICAgdmFsaWRhdG9yOiB3ZWIzLlB1YmxpY0tleSA9IG5ldyB3ZWIzLlB1YmxpY0tleShcIkZuRTZWSlQ1UU5aZGVkWlBuQ29Mc0FSZ0J3b0U2RGVKTmpCczJIMWd5U1hBXCIpLFxuICAgIGNvbmZpcm1PcHRpb25zPzogd2ViMy5Db25maXJtT3B0aW9ucyxcbiAgICBzaWduZXJzOiB3ZWIzLktleXBhaXJbXSA9IFtdXG4gICk6IFByb21pc2U8d2ViMy5UcmFuc2FjdGlvblNpZ25hdHVyZT4ge1xuICAgIGNvbnN0IHRpY2tldFBkYSA9IHRoaXMuZ2V0VGlja2V0UGRhKHBsYXllciwgdGVuYW50KTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5kZWxlZ2F0ZVRpY2tldCh7IHRpY2tldDogeyBwbGF5ZXIsIHRlbmFudCB9IH0gYXMgYW55KVxuICAgICAgLmFjY291bnRzKHtcbiAgICAgICAgcGRhOiB0aWNrZXRQZGEsXG4gICAgICAgIHBheWVyOiB0aGlzLnByb3ZpZGVyLnB1YmxpY0tleSxcbiAgICAgICAgdmFsaWRhdG9yOiB2YWxpZGF0b3IsXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC5zaWduZXJzKHNpZ25lcnMpXG4gICAgICAucnBjKGNvbmZpcm1PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2luIFF1ZXVlIChURUUgQXdhcmUpIC0gbm93IHJlcXVpcmVzIHRpY2tldFxuICAgKi9cbiAgYXN5bmMgam9pblF1ZXVlKFxuICAgIHF1ZXVlOiB3ZWIzLlB1YmxpY0tleSxcbiAgICB0ZW5hbnQ6IHdlYjMuUHVibGljS2V5LFxuICAgIHBsYXllckRhdGE6IHdlYjMuUHVibGljS2V5LFxuICAgIGNvbmZpcm1PcHRpb25zPzogd2ViMy5Db25maXJtT3B0aW9ucyxcbiAgICBzaWduZXJzOiB3ZWIzLktleXBhaXJbXSA9IFtdXG4gICk6IFByb21pc2U8d2ViMy5UcmFuc2FjdGlvblNpZ25hdHVyZT4ge1xuICAgIGNvbnN0IHRpY2tldFBkYSA9IHRoaXMuZ2V0VGlja2V0UGRhKHRoaXMucHJvdmlkZXIucHVibGljS2V5LCB0ZW5hbnQpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmpvaW5RdWV1ZSgpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgcXVldWU6IHF1ZXVlLFxuICAgICAgICB0ZW5hbnQ6IHRlbmFudCxcbiAgICAgICAgcGxheWVyRGF0YTogcGxheWVyRGF0YSxcbiAgICAgICAgcGxheWVyVGlja2V0OiB0aWNrZXRQZGEsXG4gICAgICAgIHNpZ25lcjogdGhpcy5wcm92aWRlci5wdWJsaWNLZXksXG4gICAgICB9KVxuICAgICAgLnNpZ25lcnMoc2lnbmVycylcbiAgICAgIC5ycGMoY29uZmlybU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBzZWFyY2gsIG1hcmtzIHRpY2tldCBhcyBDYW5jZWxsZWQgKHJ1bnMgaW4gVEVFKVxuICAgKi9cbiAgYXN5bmMgY2FuY2VsVGlja2V0KFxuICAgIHRlbmFudDogd2ViMy5QdWJsaWNLZXksXG4gICAgY29uZmlybU9wdGlvbnM/OiB3ZWIzLkNvbmZpcm1PcHRpb25zLFxuICAgIHNpZ25lcnM6IHdlYjMuS2V5cGFpcltdID0gW11cbiAgKTogUHJvbWlzZTx3ZWIzLlRyYW5zYWN0aW9uU2lnbmF0dXJlPiB7XG4gICAgY29uc3QgdGlja2V0UGRhID0gdGhpcy5nZXRUaWNrZXRQZGEodGhpcy5wcm92aWRlci5wdWJsaWNLZXksIHRlbmFudCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuY2FuY2VsVGlja2V0KClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICB0aWNrZXQ6IHRpY2tldFBkYSxcbiAgICAgICAgdGVuYW50OiB0ZW5hbnQsXG4gICAgICAgIHBsYXllcjogdGhpcy5wcm92aWRlci5wdWJsaWNLZXksXG4gICAgICB9KVxuICAgICAgLnNpZ25lcnMoc2lnbmVycylcbiAgICAgIC5ycGMoY29uZmlybU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRpY2tldCBhbmQgcmVjbGFpbSByZW50IChMMSwgYWZ0ZXIgbWF0Y2ggY29uc3VtZWQgb3IgY2FuY2VsbGVkKVxuICAgKi9cbiAgYXN5bmMgY2xvc2VUaWNrZXQoXG4gICAgdGVuYW50OiB3ZWIzLlB1YmxpY0tleSxcbiAgICBjb25maXJtT3B0aW9ucz86IHdlYjMuQ29uZmlybU9wdGlvbnMsXG4gICAgc2lnbmVyczogd2ViMy5LZXlwYWlyW10gPSBbXVxuICApOiBQcm9taXNlPHdlYjMuVHJhbnNhY3Rpb25TaWduYXR1cmU+IHtcbiAgICBjb25zdCB0aWNrZXRQZGEgPSB0aGlzLmdldFRpY2tldFBkYSh0aGlzLnByb3ZpZGVyLnB1YmxpY0tleSwgdGVuYW50KTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5jbG9zZVRpY2tldCgpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgdGlja2V0OiB0aWNrZXRQZGEsXG4gICAgICAgIHRlbmFudDogdGVuYW50LFxuICAgICAgICBwbGF5ZXI6IHRoaXMucHJvdmlkZXIucHVibGljS2V5LFxuICAgICAgfSlcbiAgICAgIC5zaWduZXJzKHNpZ25lcnMpXG4gICAgICAucnBjKGNvbmZpcm1PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0IGZvciBtYXRjaCBieSBzdWJzY3JpYmluZyB0byB0aWNrZXQgUERBIGNoYW5nZXMgb24gTDEuXG4gICAqIFJldHVybnMgbWF0Y2ggaW5mbyB3aGVuIHRpY2tldCBzdGF0dXMgY2hhbmdlcyB0byBNYXRjaGVkLlxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck1hdGNoKFxuICAgIHRpY2tldFBkYTogd2ViMy5QdWJsaWNLZXksXG4gICAgY29ubmVjdGlvbjogd2ViMy5Db25uZWN0aW9uLFxuICAgIHRpbWVvdXRNczogbnVtYmVyID0gMTIwMDAwXG4gICk6IFByb21pc2U8eyBvcHBvbmVudDogd2ViMy5QdWJsaWNLZXk7IG1hdGNoSWQ6IGFuY2hvci5CTiB9IHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc3Vic2NyaXB0aW9uSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHRpbWVvdXRJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRpbWVvdXRJZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIGlmIChzdWJzY3JpcHRpb25JZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbm5lY3Rpb24ucmVtb3ZlQWNjb3VudENoYW5nZUxpc3RlbmVyKHN1YnNjcmlwdGlvbklkKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gU2V0IHRpbWVvdXRcbiAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICB9LCB0aW1lb3V0TXMpO1xuXG4gICAgICAvLyBTdWJzY3JpYmUgdG8gYWNjb3VudCBjaGFuZ2VzIG9uIEwxXG4gICAgICBzdWJzY3JpcHRpb25JZCA9IGNvbm5lY3Rpb24ub25BY2NvdW50Q2hhbmdlKFxuICAgICAgICB0aWNrZXRQZGEsXG4gICAgICAgIChhY2NvdW50SW5mbzogd2ViMy5BY2NvdW50SW5mbzxCdWZmZXI+KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLnByb2dyYW0uY29kZXIuYWNjb3VudHMuZGVjb2RlKFxuICAgICAgICAgICAgICBcIm1hdGNoVGlja2V0XCIsXG4gICAgICAgICAgICAgIGFjY291bnRJbmZvLmRhdGFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZGVjb2RlZC5zdGF0dXMubWF0Y2hlZCkge1xuICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgIG9wcG9uZW50OiBkZWNvZGVkLnN0YXR1cy5tYXRjaGVkLm9wcG9uZW50LFxuICAgICAgICAgICAgICAgIG1hdGNoSWQ6IGRlY29kZWQuc3RhdHVzLm1hdGNoZWQubWF0Y2hJZCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGRlY29kZSBlcnJvcnMgKGFjY291bnQgbWF5IGJlIGluIHRyYW5zaXRpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImNvbmZpcm1lZFwiXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGwgTDEgZm9yIHRpY2tldCBzdGF0dXMgKGZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCB3ZWJzb2NrZXQpXG4gICAqL1xuICBhc3luYyBwb2xsRm9yTWF0Y2goXG4gICAgdGlja2V0UGRhOiB3ZWIzLlB1YmxpY0tleSxcbiAgICBjb25uZWN0aW9uOiB3ZWIzLkNvbm5lY3Rpb24sXG4gICAgbWF4QXR0ZW1wdHM6IG51bWJlciA9IDYwLFxuICAgIHBvbGxJbnRlcnZhbDogbnVtYmVyID0gMjAwMCxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbFxuICApOiBQcm9taXNlPHsgb3Bwb25lbnQ6IHdlYjMuUHVibGljS2V5OyBtYXRjaElkOiBhbmNob3IuQk4gfSB8IG51bGw+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heEF0dGVtcHRzOyBpKyspIHtcbiAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHJldHVybiBudWxsO1xuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgcG9sbEludGVydmFsKSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFjY291bnRJbmZvID0gYXdhaXQgY29ubmVjdGlvbi5nZXRBY2NvdW50SW5mbyh0aWNrZXRQZGEpO1xuICAgICAgICBpZiAoIWFjY291bnRJbmZvKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5wcm9ncmFtLmNvZGVyLmFjY291bnRzLmRlY29kZShcbiAgICAgICAgICBcIm1hdGNoVGlja2V0XCIsXG4gICAgICAgICAgYWNjb3VudEluZm8uZGF0YVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkZWNvZGVkLnN0YXR1cy5tYXRjaGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9wcG9uZW50OiBkZWNvZGVkLnN0YXR1cy5tYXRjaGVkLm9wcG9uZW50LFxuICAgICAgICAgICAgbWF0Y2hJZDogZGVjb2RlZC5zdGF0dXMubWF0Y2hlZC5tYXRjaElkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gQWNjb3VudCBtYXkgbm90IGV4aXN0IHlldCBvciBiZSBpbiB0cmFuc2l0aW9uXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxHQUtoQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLGlDQUFpQyxFQUNqQyw0QkFBNEIsRUFDNUIsK0JBQStCLEVBQy9CLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIsV0FBVyxHQUNaLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE1BQU0sZUFBZSxHQUFHLDhDQUF5RCxDQUFDO0FBRWxGLE1BQU0sT0FBTyxpQkFBaUI7SUFLNUIsWUFDRSxHQUFzQixFQUN0QixNQUF5QixFQUN6QixZQUFxQixlQUFlO1FBRXBDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBZSxFQUFFLE1BQWU7UUFDakQsT0FBTyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQWtCO1FBQ2hDLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFlO1FBQ2hDLE1BQU0sRUFBRSxHQUFHLE1BQU0sK0JBQStCLENBQUM7WUFDL0MsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLE1BQU07U0FDUCxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FDbEIsTUFBZSxFQUNmLE1BQWUsRUFDZixTQUFtQjtRQUVuQixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFELE1BQU0sRUFBRSxHQUFHLE1BQU0saUNBQWlDLENBQUM7WUFDakQsR0FBRyxFQUFFLFNBQVM7WUFDZCxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbEIsU0FBUztZQUNULFdBQVcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1NBQ3ZELEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkMsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUNiLEtBQWMsRUFDZCxNQUFlLEVBQ2YsVUFBbUI7UUFFbkIsTUFBTSxFQUFFLEdBQUcsTUFBTSw0QkFBNEIsQ0FBQztZQUM1QyxLQUFLO1lBQ0wsTUFBTTtZQUNOLFVBQVU7WUFDVixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN2QyxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBZTtRQUNoQyxNQUFNLEVBQUUsR0FBRyxNQUFNLCtCQUErQixDQUFDO1lBQy9DLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixNQUFNO1NBQ1AsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN2QyxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBZTtRQUMvQixNQUFNLEVBQUUsR0FBRyxNQUFNLDhCQUE4QixDQUFDO1lBQzlDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixNQUFNO1NBQ1AsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN2QyxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQ2hCLFNBQWtCLEVBQ2xCLFdBQVcsR0FBRyxFQUFFLEVBQ2hCLFlBQVksR0FBRyxJQUFJLEVBQ25CLE1BQW9CO1FBRXBCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxJQUFJLE1BQU0sRUFBRSxPQUFPO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07b0JBQUUsU0FBUztnQkFDbEMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ3ZDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDaEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2hFLENBQUM7WUFDSCxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLHlDQUF5QztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSxPQUFPLENBQUMsTUFBYztRQUNwQixPQUFPLElBQUksaUJBQWlCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNyZWF0ZVNvbGFuYVJwYyxcbiAgdHlwZSBBZGRyZXNzLFxuICB0eXBlIFRyYW5zYWN0aW9uU2lnbmVyLFxuICB0eXBlIFJwYyxcbiAgdHlwZSBTb2xhbmFScGNBcGksXG59IGZyb20gXCJAc29sYW5hL2tpdFwiO1xuaW1wb3J0IHtcbiAgZ2V0Q3JlYXRlVGlja2V0SW5zdHJ1Y3Rpb25Bc3luYyxcbiAgZ2V0RGVsZWdhdGVUaWNrZXRJbnN0cnVjdGlvbkFzeW5jLFxuICBnZXRKb2luUXVldWVJbnN0cnVjdGlvbkFzeW5jLFxuICBnZXRDYW5jZWxUaWNrZXRJbnN0cnVjdGlvbkFzeW5jLFxuICBnZXRDbG9zZVRpY2tldEluc3RydWN0aW9uQXN5bmMsXG4gIGZldGNoTWF5YmVNYXRjaFRpY2tldCxcbiAgYWNjb3VudFR5cGUsXG59IGZyb20gXCIuL2dlbmVyYXRlZC9kdWVsL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBzZW5kSW5zdHJ1Y3Rpb24gfSBmcm9tIFwiLi90cmFuc2FjdGlvbi5qc1wiO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSBcIi4vdXRpbHMuanNcIjtcblxuY29uc3QgRFVFTF9QUk9HUkFNX0lEID0gXCJFZFp6VXdLZDFYMlpXanhMUHB6MWNwRXpNRjdSVVpDNDNQcTY0djFWY0s1WFwiIGFzIEFkZHJlc3M7XG5cbmV4cG9ydCBjbGFzcyBNYXRjaG1ha2luZ1BsYXllciB7XG4gIHB1YmxpYyBycGM6IFJwYzxTb2xhbmFScGNBcGk+O1xuICBwdWJsaWMgc2lnbmVyOiBUcmFuc2FjdGlvblNpZ25lcjtcbiAgcHVibGljIHByb2dyYW1JZDogQWRkcmVzcztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBycGM6IFJwYzxTb2xhbmFScGNBcGk+LFxuICAgIHNpZ25lcjogVHJhbnNhY3Rpb25TaWduZXIsXG4gICAgcHJvZ3JhbUlkOiBBZGRyZXNzID0gRFVFTF9QUk9HUkFNX0lELFxuICApIHtcbiAgICB0aGlzLnJwYyA9IHJwYztcbiAgICB0aGlzLnNpZ25lciA9IHNpZ25lcjtcbiAgICB0aGlzLnByb2dyYW1JZCA9IHByb2dyYW1JZDtcbiAgfVxuXG4gIGFzeW5jIGdldFRpY2tldFBkYShwbGF5ZXI6IEFkZHJlc3MsIHRlbmFudDogQWRkcmVzcyk6IFByb21pc2U8QWRkcmVzcz4ge1xuICAgIHJldHVybiB1dGlscy5kZXJpdmVUaWNrZXRQZGEodGhpcy5wcm9ncmFtSWQsIHBsYXllciwgdGVuYW50KTtcbiAgfVxuXG4gIGFzeW5jIGdldFRpY2tldCh0aWNrZXRQZGE6IEFkZHJlc3MpIHtcbiAgICByZXR1cm4gZmV0Y2hNYXliZU1hdGNoVGlja2V0KHRoaXMucnBjLCB0aWNrZXRQZGEpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVGlja2V0KHRlbmFudDogQWRkcmVzcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCBnZXRDcmVhdGVUaWNrZXRJbnN0cnVjdGlvbkFzeW5jKHtcbiAgICAgIHBsYXllcjogdGhpcy5zaWduZXIsXG4gICAgICB0ZW5hbnQsXG4gICAgfSwgeyBwcm9ncmFtQWRkcmVzczogdGhpcy5wcm9ncmFtSWQgfSk7XG4gICAgcmV0dXJuIHNlbmRJbnN0cnVjdGlvbih0aGlzLnJwYywgaXgsIHRoaXMuc2lnbmVyKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGVnYXRlVGlja2V0KFxuICAgIHBsYXllcjogQWRkcmVzcyxcbiAgICB0ZW5hbnQ6IEFkZHJlc3MsXG4gICAgdmFsaWRhdG9yPzogQWRkcmVzcyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0aWNrZXRQZGEgPSBhd2FpdCB0aGlzLmdldFRpY2tldFBkYShwbGF5ZXIsIHRlbmFudCk7XG4gICAgY29uc3QgaXggPSBhd2FpdCBnZXREZWxlZ2F0ZVRpY2tldEluc3RydWN0aW9uQXN5bmMoe1xuICAgICAgcGRhOiB0aWNrZXRQZGEsXG4gICAgICBwYXllcjogdGhpcy5zaWduZXIsXG4gICAgICB2YWxpZGF0b3IsXG4gICAgICBhY2NvdW50VHlwZTogYWNjb3VudFR5cGUoXCJUaWNrZXRcIiwgeyBwbGF5ZXIsIHRlbmFudCB9KSxcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcbiAgICByZXR1cm4gc2VuZEluc3RydWN0aW9uKHRoaXMucnBjLCBpeCwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgYXN5bmMgam9pblF1ZXVlKFxuICAgIHF1ZXVlOiBBZGRyZXNzLFxuICAgIHRlbmFudDogQWRkcmVzcyxcbiAgICBwbGF5ZXJEYXRhOiBBZGRyZXNzLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgZ2V0Sm9pblF1ZXVlSW5zdHJ1Y3Rpb25Bc3luYyh7XG4gICAgICBxdWV1ZSxcbiAgICAgIHRlbmFudCxcbiAgICAgIHBsYXllckRhdGEsXG4gICAgICBzaWduZXI6IHRoaXMuc2lnbmVyLFxuICAgIH0sIHsgcHJvZ3JhbUFkZHJlc3M6IHRoaXMucHJvZ3JhbUlkIH0pO1xuICAgIHJldHVybiBzZW5kSW5zdHJ1Y3Rpb24odGhpcy5ycGMsIGl4LCB0aGlzLnNpZ25lcik7XG4gIH1cblxuICBhc3luYyBjYW5jZWxUaWNrZXQodGVuYW50OiBBZGRyZXNzKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IGdldENhbmNlbFRpY2tldEluc3RydWN0aW9uQXN5bmMoe1xuICAgICAgcGxheWVyOiB0aGlzLnNpZ25lcixcbiAgICAgIHRlbmFudCxcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcbiAgICByZXR1cm4gc2VuZEluc3RydWN0aW9uKHRoaXMucnBjLCBpeCwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2VUaWNrZXQodGVuYW50OiBBZGRyZXNzKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IGdldENsb3NlVGlja2V0SW5zdHJ1Y3Rpb25Bc3luYyh7XG4gICAgICBwbGF5ZXI6IHRoaXMuc2lnbmVyLFxuICAgICAgdGVuYW50LFxuICAgIH0sIHsgcHJvZ3JhbUFkZHJlc3M6IHRoaXMucHJvZ3JhbUlkIH0pO1xuICAgIHJldHVybiBzZW5kSW5zdHJ1Y3Rpb24odGhpcy5ycGMsIGl4LCB0aGlzLnNpZ25lcik7XG4gIH1cblxuICAvKipcbiAgICogUG9sbCBMMSBmb3IgdGlja2V0IHN0YXR1cy5cbiAgICogUmV0dXJucyBtYXRjaCBpbmZvIHdoZW4gc3RhdHVzIGJlY29tZXMgTWF0Y2hlZC5cbiAgICovXG4gIGFzeW5jIHBvbGxGb3JNYXRjaChcbiAgICB0aWNrZXRQZGE6IEFkZHJlc3MsXG4gICAgbWF4QXR0ZW1wdHMgPSA2MCxcbiAgICBwb2xsSW50ZXJ2YWwgPSAyMDAwLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHsgb3Bwb25lbnQ6IEFkZHJlc3M7IG1hdGNoSWQ6IGJpZ2ludCB9IHwgbnVsbD4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4QXR0ZW1wdHM7IGkrKykge1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgcmV0dXJuIG51bGw7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBwb2xsSW50ZXJ2YWwpKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1heWJlVGlja2V0ID0gYXdhaXQgZmV0Y2hNYXliZU1hdGNoVGlja2V0KHRoaXMucnBjLCB0aWNrZXRQZGEpO1xuICAgICAgICBpZiAoIW1heWJlVGlja2V0LmV4aXN0cykgY29udGludWU7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IG1heWJlVGlja2V0LmRhdGEuc3RhdHVzO1xuICAgICAgICBpZiAoc3RhdHVzLl9fa2luZCA9PT0gXCJNYXRjaGVkXCIpIHtcbiAgICAgICAgICByZXR1cm4geyBvcHBvbmVudDogc3RhdHVzLm9wcG9uZW50LCBtYXRjaElkOiBzdGF0dXMubWF0Y2hJZCB9O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWdub3JlIGRlY29kZSBlcnJvcnMgZHVyaW5nIHRyYW5zaXRpb25cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbmV3IE1hdGNobWFraW5nUGxheWVyIHBvaW50aW5nIGF0IGEgVEVFIFJQQyBlbmRwb2ludC4gKi9cbiAgd2l0aFJwYyh0ZWVVcmw6IHN0cmluZyk6IE1hdGNobWFraW5nUGxheWVyIHtcbiAgICByZXR1cm4gbmV3IE1hdGNobWFraW5nUGxheWVyKGNyZWF0ZVNvbGFuYVJwYyh0ZWVVcmwpLCB0aGlzLnNpZ25lciwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG59XG4iXX0=
package/dist/tee.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { type Address, type MessagePartialSigner } from "@solana/kit";
2
+ export type { MessagePartialSigner as MessageSigner };
3
+ /**
4
+ * Authenticate with the MagicBlock TEE via challenge-sign flow.
5
+ */
6
+ export declare function getAuthToken(rpcUrl: string, signer: MessagePartialSigner): Promise<{
7
+ token: string;
8
+ expiresAt: number;
9
+ }>;
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).
13
+ */
14
+ export declare function waitUntilPermissionActive(teeUrlWithToken: string, pda: Address, timeoutMs?: number): Promise<boolean>;
package/dist/tee.js ADDED
@@ -0,0 +1,62 @@
1
+ import { getBase58Decoder, createSignableMessage, } from "@solana/kit";
2
+ /**
3
+ * Authenticate with the MagicBlock TEE via challenge-sign flow.
4
+ */
5
+ export async function getAuthToken(rpcUrl, signer) {
6
+ const challengeRes = await fetch(`${rpcUrl}/auth/challenge?pubkey=${signer.address}`);
7
+ if (!challengeRes.ok) {
8
+ throw new Error(`TEE challenge failed: ${challengeRes.statusText}`);
9
+ }
10
+ const { challenge } = (await challengeRes.json());
11
+ const challengeBytes = new TextEncoder().encode(challenge);
12
+ const [sigDict] = await signer.signMessages([createSignableMessage(challengeBytes)]);
13
+ const signature = sigDict[signer.address];
14
+ const signatureString = getBase58Decoder().decode(signature);
15
+ const tokenRes = await fetch(`${rpcUrl}/auth/login`, {
16
+ method: "POST",
17
+ headers: { "Content-Type": "application/json" },
18
+ body: JSON.stringify({
19
+ pubkey: signer.address,
20
+ challenge,
21
+ signature: signatureString,
22
+ }),
23
+ });
24
+ const authJson = (await tokenRes.json());
25
+ if (tokenRes.status !== 200) {
26
+ throw new Error(`Failed to authenticate: ${authJson.error}`);
27
+ }
28
+ const expiresAt = authJson.expiresAt ?? Date.now() + 1000 * 60 * 60 * 24 * 30;
29
+ return { token: authJson.token, expiresAt };
30
+ }
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).
34
+ */
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) {
47
+ 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
+ }
54
+ }
55
+ catch {
56
+ // ignore transient errors, keep polling
57
+ }
58
+ await new Promise((r) => setTimeout(r, 400));
59
+ }
60
+ return false;
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUd0QixNQUFNLGFBQWEsQ0FBQztBQUlyQjs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxNQUFjLEVBQ2QsTUFBNEI7SUFFNUIsTUFBTSxZQUFZLEdBQUcsTUFBTSxLQUFLLENBQzlCLEdBQUcsTUFBTSwwQkFBMEIsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUNwRCxDQUFDO0lBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixZQUFZLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQTBCLENBQUM7SUFFM0UsTUFBTSxjQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQWtCLENBQUMsQ0FBQztJQUNyRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUU3RCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLE1BQU0sYUFBYSxFQUFFO1FBQ25ELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1FBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ25CLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN0QixTQUFTO1lBQ1QsU0FBUyxFQUFFLGVBQWU7U0FDM0IsQ0FBQztLQUNILENBQUMsQ0FBQztJQUNILE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQTBELENBQUM7SUFDbEcsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzlFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0MsZUFBdUIsRUFDdkIsR0FBWSxFQUNaLFNBQVMsR0FBRyxLQUFLO0lBRWpCLGtHQUFrRztJQUNsRyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RSxJQUFJLGFBQXFCLENBQUM7SUFDMUIsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLGFBQWEsR0FBRyxHQUFHLE9BQU8sZUFBZSxVQUFVLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDdEUsQ0FBQztTQUFNLENBQUM7UUFDTixhQUFhLEdBQUcsR0FBRyxPQUFPLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2QyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDWCxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBb0MsQ0FBQztnQkFDbEYsSUFBSSxlQUFlLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2pFLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asd0NBQXdDO1FBQzFDLENBQUM7UUFDRCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGdldEJhc2U1OERlY29kZXIsXG4gIGNyZWF0ZVNpZ25hYmxlTWVzc2FnZSxcbiAgdHlwZSBBZGRyZXNzLFxuICB0eXBlIE1lc3NhZ2VQYXJ0aWFsU2lnbmVyLFxufSBmcm9tIFwiQHNvbGFuYS9raXRcIjtcblxuZXhwb3J0IHR5cGUgeyBNZXNzYWdlUGFydGlhbFNpZ25lciBhcyBNZXNzYWdlU2lnbmVyIH07XG5cbi8qKlxuICogQXV0aGVudGljYXRlIHdpdGggdGhlIE1hZ2ljQmxvY2sgVEVFIHZpYSBjaGFsbGVuZ2Utc2lnbiBmbG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aFRva2VuKFxuICBycGNVcmw6IHN0cmluZyxcbiAgc2lnbmVyOiBNZXNzYWdlUGFydGlhbFNpZ25lcixcbik6IFByb21pc2U8eyB0b2tlbjogc3RyaW5nOyBleHBpcmVzQXQ6IG51bWJlciB9PiB7XG4gIGNvbnN0IGNoYWxsZW5nZVJlcyA9IGF3YWl0IGZldGNoKFxuICAgIGAke3JwY1VybH0vYXV0aC9jaGFsbGVuZ2U/cHVia2V5PSR7c2lnbmVyLmFkZHJlc3N9YFxuICApO1xuICBpZiAoIWNoYWxsZW5nZVJlcy5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVEVFIGNoYWxsZW5nZSBmYWlsZWQ6ICR7Y2hhbGxlbmdlUmVzLnN0YXR1c1RleHR9YCk7XG4gIH1cbiAgY29uc3QgeyBjaGFsbGVuZ2UgfSA9IChhd2FpdCBjaGFsbGVuZ2VSZXMuanNvbigpKSBhcyB7IGNoYWxsZW5nZTogc3RyaW5nIH07XG5cbiAgY29uc3QgY2hhbGxlbmdlQnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoY2hhbGxlbmdlKTtcbiAgY29uc3QgW3NpZ0RpY3RdID0gYXdhaXQgc2lnbmVyLnNpZ25NZXNzYWdlcyhbY3JlYXRlU2lnbmFibGVNZXNzYWdlKGNoYWxsZW5nZUJ5dGVzKV0pO1xuICBjb25zdCBzaWduYXR1cmUgPSBzaWdEaWN0W3NpZ25lci5hZGRyZXNzIGFzIEFkZHJlc3NdO1xuICBjb25zdCBzaWduYXR1cmVTdHJpbmcgPSBnZXRCYXNlNThEZWNvZGVyKCkuZGVjb2RlKHNpZ25hdHVyZSk7XG5cbiAgY29uc3QgdG9rZW5SZXMgPSBhd2FpdCBmZXRjaChgJHtycGNVcmx9L2F1dGgvbG9naW5gLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcHVia2V5OiBzaWduZXIuYWRkcmVzcyxcbiAgICAgIGNoYWxsZW5nZSxcbiAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlU3RyaW5nLFxuICAgIH0pLFxuICB9KTtcbiAgY29uc3QgYXV0aEpzb24gPSAoYXdhaXQgdG9rZW5SZXMuanNvbigpKSBhcyB7IHRva2VuOiBzdHJpbmc7IGV4cGlyZXNBdD86IG51bWJlcjsgZXJyb3I/OiBzdHJpbmcgfTtcbiAgaWYgKHRva2VuUmVzLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gYXV0aGVudGljYXRlOiAke2F1dGhKc29uLmVycm9yfWApO1xuICB9XG4gIGNvbnN0IGV4cGlyZXNBdCA9IGF1dGhKc29uLmV4cGlyZXNBdCA/PyBEYXRlLm5vdygpICsgMTAwMCAqIDYwICogNjAgKiAyNCAqIDMwO1xuICByZXR1cm4geyB0b2tlbjogYXV0aEpzb24udG9rZW4sIGV4cGlyZXNBdCB9O1xufVxuXG4vKipcbiAqIFBvbGwgdGhlIFRFRSAvcGVybWlzc2lvbiBlbmRwb2ludCB1bnRpbCB0aGUgZ2l2ZW4gUERBIGhhcyBhdXRob3JpemVkIHVzZXJzLFxuICogaW5kaWNhdGluZyBkZWxlZ2F0aW9uIGlzIGFjdGl2ZS4gUmV0dXJucyBmYWxzZSBvbiB0aW1lb3V0IChkb2VzIG5vdCB0aHJvdykuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0VW50aWxQZXJtaXNzaW9uQWN0aXZlKFxuICB0ZWVVcmxXaXRoVG9rZW46IHN0cmluZyxcbiAgcGRhOiBBZGRyZXNzLFxuICB0aW1lb3V0TXMgPSAzMDAwMCxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBQYXJzZSBVUkw6IFwiaHR0cHM6Ly9ob3N0L3BhdGg/dG9rZW49eHh4XCIgLT4gYmFzZVVybD1cImh0dHBzOi8vaG9zdC9wYXRoXCIsIHRva2VuUGFyYW09XCJ0b2tlbj14eHhcIlxuICBjb25zdCBbYmFzZVVybCwgdG9rZW5QYXJhbV0gPSB0ZWVVcmxXaXRoVG9rZW4ucmVwbGFjZShcIi8/XCIsIFwiP1wiKS5zcGxpdChcIj9cIik7XG4gIGxldCBwZXJtaXNzaW9uVXJsOiBzdHJpbmc7XG4gIGlmICh0b2tlblBhcmFtKSB7XG4gICAgcGVybWlzc2lvblVybCA9IGAke2Jhc2VVcmx9L3Blcm1pc3Npb24/JHt0b2tlblBhcmFtfSZwdWJrZXk9JHtwZGF9YDtcbiAgfSBlbHNlIHtcbiAgICBwZXJtaXNzaW9uVXJsID0gYCR7YmFzZVVybH0vcGVybWlzc2lvbj9wdWJrZXk9JHtwZGF9YDtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXRNcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChwZXJtaXNzaW9uVXJsKTtcbiAgICAgIGlmIChyZXMub2spIHtcbiAgICAgICAgY29uc3QgeyBhdXRob3JpemVkVXNlcnMgfSA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IGF1dGhvcml6ZWRVc2Vycz86IHVua25vd25bXSB9O1xuICAgICAgICBpZiAoYXV0aG9yaXplZFVzZXJzICYmIGF1dGhvcml6ZWRVc2Vycy5sZW5ndGggPiAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB0cmFuc2llbnQgZXJyb3JzLCBrZWVwIHBvbGxpbmdcbiAgICB9XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgNDAwKSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
@@ -0,0 +1,11 @@
1
+ import { type Instruction, type SolanaRpcApi, type Rpc, type TransactionSigner } from "@solana/kit";
2
+ type SolanaRpc = Rpc<SolanaRpcApi>;
3
+ /**
4
+ * Build, sign with a Kit keypair signer, and send a single instruction.
5
+ */
6
+ export declare function sendInstruction(rpc: SolanaRpc, instruction: Instruction, signer: TransactionSigner): Promise<string>;
7
+ /**
8
+ * Build, sign, and send multiple instructions in a single transaction.
9
+ */
10
+ export declare function sendInstructions(rpc: SolanaRpc, instructions: Instruction[], signer: TransactionSigner): Promise<string>;
11
+ export {};
@@ -0,0 +1,50 @@
1
+ import { createTransactionMessage, setTransactionMessageFeePayerSigner, setTransactionMessageLifetimeUsingBlockhash, appendTransactionMessageInstruction, appendTransactionMessageInstructions, signTransactionMessageWithSigners, getBase64EncodedWireTransaction, pipe, } from "@solana/kit";
2
+ /**
3
+ * Build, sign with a Kit keypair signer, and send a single instruction.
4
+ */
5
+ export async function sendInstruction(rpc, instruction, signer) {
6
+ const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ const tx = pipe(createTransactionMessage({ version: 0 }), (m) => setTransactionMessageFeePayerSigner(signer, m), (m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m), (m) => appendTransactionMessageInstruction(instruction, m));
9
+ const signedTx = await signTransactionMessageWithSigners(tx);
10
+ const encoded = getBase64EncodedWireTransaction(signedTx);
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ const sig = await rpc.sendTransaction(encoded, {
13
+ encoding: "base64",
14
+ skipPreflight: true,
15
+ }).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
+ }
33
+ return sig;
34
+ }
35
+ /**
36
+ * Build, sign, and send multiple instructions in a single transaction.
37
+ */
38
+ export async function sendInstructions(rpc, instructions, signer) {
39
+ const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
40
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
+ const tx = pipe(createTransactionMessage({ version: 0 }), (m) => setTransactionMessageFeePayerSigner(signer, m), (m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m), (m) => appendTransactionMessageInstructions(instructions, m));
42
+ const signedTx = await signTransactionMessageWithSigners(tx);
43
+ const encoded = getBase64EncodedWireTransaction(signedTx);
44
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
+ return rpc.sendTransaction(encoded, {
46
+ encoding: "base64",
47
+ skipPreflight: true,
48
+ }).send();
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixtQ0FBbUMsRUFDbkMsMkNBQTJDLEVBQzNDLG1DQUFtQyxFQUNuQyxvQ0FBb0MsRUFDcEMsaUNBQWlDLEVBQ2pDLCtCQUErQixFQUMvQixJQUFJLEdBS0wsTUFBTSxhQUFhLENBQUM7QUFJckI7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FDbkMsR0FBYyxFQUNkLFdBQXdCLEVBQ3hCLE1BQXlCO0lBRXpCLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEdBQUcsTUFBTSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUV6RSw4REFBOEQ7SUFDOUQsTUFBTSxFQUFFLEdBQVEsSUFBSSxDQUNsQix3QkFBd0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFVLEVBQUUsQ0FBQyxFQUNqRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUNBQW1DLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUNyRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsMkNBQTJDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxFQUN0RSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUNBQW1DLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUMzRCxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxpQ0FBaUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RCxNQUFNLE9BQU8sR0FBRywrQkFBK0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUxRCw4REFBOEQ7SUFDOUQsTUFBTSxHQUFHLEdBQUcsTUFBTyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQWMsRUFBRTtRQUNyRCxRQUFRLEVBQUUsUUFBUTtRQUNsQixhQUFhLEVBQUUsSUFBSTtLQUNwQixDQUFDLENBQUMsSUFBSSxFQUFzQixDQUFDO0lBRTlCLDJDQUEyQztJQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1Qyw4REFBOEQ7UUFDOUQsTUFBTSxRQUFRLEdBQUcsTUFBTyxHQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlILE1BQU0sTUFBTSxHQUFHLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsOERBQThEO2dCQUM5RCxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2SSxDQUFDO2lCQUFNLElBQUksTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFDRCxNQUFNO1FBQ1IsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLEdBQWMsRUFDZCxZQUEyQixFQUMzQixNQUF5QjtJQUV6QixNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFekUsOERBQThEO0lBQzlELE1BQU0sRUFBRSxHQUFRLElBQUksQ0FDbEIsd0JBQXdCLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBVSxFQUFFLENBQUMsRUFDakQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1DQUFtQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFDckQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsRUFDdEUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG9DQUFvQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FDN0QsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLE1BQU0saUNBQWlDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0QsTUFBTSxPQUFPLEdBQUcsK0JBQStCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFMUQsOERBQThEO0lBQzlELE9BQU8sR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFjLEVBQUU7UUFDekMsUUFBUSxFQUFFLFFBQVE7UUFDbEIsYUFBYSxFQUFFLElBQUk7S0FDcEIsQ0FBQyxDQUFDLElBQUksRUFBcUIsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY3JlYXRlVHJhbnNhY3Rpb25NZXNzYWdlLFxuICBzZXRUcmFuc2FjdGlvbk1lc3NhZ2VGZWVQYXllclNpZ25lcixcbiAgc2V0VHJhbnNhY3Rpb25NZXNzYWdlTGlmZXRpbWVVc2luZ0Jsb2NraGFzaCxcbiAgYXBwZW5kVHJhbnNhY3Rpb25NZXNzYWdlSW5zdHJ1Y3Rpb24sXG4gIGFwcGVuZFRyYW5zYWN0aW9uTWVzc2FnZUluc3RydWN0aW9ucyxcbiAgc2lnblRyYW5zYWN0aW9uTWVzc2FnZVdpdGhTaWduZXJzLFxuICBnZXRCYXNlNjRFbmNvZGVkV2lyZVRyYW5zYWN0aW9uLFxuICBwaXBlLFxuICB0eXBlIEluc3RydWN0aW9uLFxuICB0eXBlIFNvbGFuYVJwY0FwaSxcbiAgdHlwZSBScGMsXG4gIHR5cGUgVHJhbnNhY3Rpb25TaWduZXIsXG59IGZyb20gXCJAc29sYW5hL2tpdFwiO1xuXG50eXBlIFNvbGFuYVJwYyA9IFJwYzxTb2xhbmFScGNBcGk+O1xuXG4vKipcbiAqIEJ1aWxkLCBzaWduIHdpdGggYSBLaXQga2V5cGFpciBzaWduZXIsIGFuZCBzZW5kIGEgc2luZ2xlIGluc3RydWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEluc3RydWN0aW9uKFxuICBycGM6IFNvbGFuYVJwYyxcbiAgaW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uLFxuICBzaWduZXI6IFRyYW5zYWN0aW9uU2lnbmVyLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyB2YWx1ZTogbGF0ZXN0QmxvY2toYXNoIH0gPSBhd2FpdCBycGMuZ2V0TGF0ZXN0QmxvY2toYXNoKCkuc2VuZCgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IHR4OiBhbnkgPSBwaXBlKFxuICAgIGNyZWF0ZVRyYW5zYWN0aW9uTWVzc2FnZSh7IHZlcnNpb246IDAgYXMgY29uc3QgfSksXG4gICAgKG0pID0+IHNldFRyYW5zYWN0aW9uTWVzc2FnZUZlZVBheWVyU2lnbmVyKHNpZ25lciwgbSksXG4gICAgKG0pID0+IHNldFRyYW5zYWN0aW9uTWVzc2FnZUxpZmV0aW1lVXNpbmdCbG9ja2hhc2gobGF0ZXN0QmxvY2toYXNoLCBtKSxcbiAgICAobSkgPT4gYXBwZW5kVHJhbnNhY3Rpb25NZXNzYWdlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIG0pLFxuICApO1xuXG4gIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgc2lnblRyYW5zYWN0aW9uTWVzc2FnZVdpdGhTaWduZXJzKHR4KTtcbiAgY29uc3QgZW5jb2RlZCA9IGdldEJhc2U2NEVuY29kZWRXaXJlVHJhbnNhY3Rpb24oc2lnbmVkVHgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IHNpZyA9IGF3YWl0IChycGMuc2VuZFRyYW5zYWN0aW9uKGVuY29kZWQgYXMgYW55LCB7XG4gICAgZW5jb2Rpbmc6IFwiYmFzZTY0XCIsXG4gICAgc2tpcFByZWZsaWdodDogdHJ1ZSxcbiAgfSkuc2VuZCgpIGFzIFByb21pc2U8c3RyaW5nPik7XG5cbiAgLy8gUG9sbCBmb3Igc3RhdHVzIHRvIGRldGVjdCBydW50aW1lIGVycm9yc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAxMDAwKSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IChycGMgYXMgYW55KS5nZXRTaWduYXR1cmVTdGF0dXNlcyhbc2lnXSwgeyBzZWFyY2hUcmFuc2FjdGlvbkhpc3Rvcnk6IGZhbHNlIH0pLnNlbmQoKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICBjb25zdCBzdGF0dXMgPSBzdGF0dXNlcz8udmFsdWU/LlswXTtcbiAgICBpZiAoc3RhdHVzKSB7XG4gICAgICBpZiAoc3RhdHVzLmVycikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBjb25zb2xlLmVycm9yKGBbVFhdICR7c2lnLnNsaWNlKDAsIDE2KX0uLi4gRkFJTEVEOmAsIEpTT04uc3RyaW5naWZ5KHN0YXR1cy5lcnIsIChfLCB2KSA9PiB0eXBlb2YgdiA9PT0gJ2JpZ2ludCcgPyB2LnRvU3RyaW5nKCkgOiB2KSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cy5jb25maXJtYXRpb25TdGF0dXMpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFtUWF0gJHtzaWcuc2xpY2UoMCwgMTYpfS4uLiAke3N0YXR1cy5jb25maXJtYXRpb25TdGF0dXN9YCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpZztcbn1cblxuLyoqXG4gKiBCdWlsZCwgc2lnbiwgYW5kIHNlbmQgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEluc3RydWN0aW9ucyhcbiAgcnBjOiBTb2xhbmFScGMsXG4gIGluc3RydWN0aW9uczogSW5zdHJ1Y3Rpb25bXSxcbiAgc2lnbmVyOiBUcmFuc2FjdGlvblNpZ25lcixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgdmFsdWU6IGxhdGVzdEJsb2NraGFzaCB9ID0gYXdhaXQgcnBjLmdldExhdGVzdEJsb2NraGFzaCgpLnNlbmQoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25zdCB0eDogYW55ID0gcGlwZShcbiAgICBjcmVhdGVUcmFuc2FjdGlvbk1lc3NhZ2UoeyB2ZXJzaW9uOiAwIGFzIGNvbnN0IH0pLFxuICAgIChtKSA9PiBzZXRUcmFuc2FjdGlvbk1lc3NhZ2VGZWVQYXllclNpZ25lcihzaWduZXIsIG0pLFxuICAgIChtKSA9PiBzZXRUcmFuc2FjdGlvbk1lc3NhZ2VMaWZldGltZVVzaW5nQmxvY2toYXNoKGxhdGVzdEJsb2NraGFzaCwgbSksXG4gICAgKG0pID0+IGFwcGVuZFRyYW5zYWN0aW9uTWVzc2FnZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIG0pLFxuICApO1xuXG4gIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgc2lnblRyYW5zYWN0aW9uTWVzc2FnZVdpdGhTaWduZXJzKHR4KTtcbiAgY29uc3QgZW5jb2RlZCA9IGdldEJhc2U2NEVuY29kZWRXaXJlVHJhbnNhY3Rpb24oc2lnbmVkVHgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHJldHVybiBycGMuc2VuZFRyYW5zYWN0aW9uKGVuY29kZWQgYXMgYW55LCB7XG4gICAgZW5jb2Rpbmc6IFwiYmFzZTY0XCIsXG4gICAgc2tpcFByZWZsaWdodDogdHJ1ZSxcbiAgfSkuc2VuZCgpIGFzIFByb21pc2U8c3RyaW5nPjtcbn1cbiJdfQ==
package/dist/utils.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import * as web3 from "@solana/web3.js";
1
+ import { type Address } from "@solana/kit";
2
2
  export declare const QUEUE_SEED = "queue";
3
3
  export declare const TENANT_SEED = "tenant";
4
4
  export declare const TICKET_SEED = "ticket";
5
- export declare function deriveQueuePda(programId: web3.PublicKey, authority: web3.PublicKey): web3.PublicKey;
6
- export declare function deriveTenantPda(programId: web3.PublicKey, authority: web3.PublicKey): web3.PublicKey;
7
- export declare function deriveTicketPda(programId: web3.PublicKey, player: web3.PublicKey, tenant: web3.PublicKey): web3.PublicKey;
5
+ export declare function deriveQueuePda(programId: Address, authority: Address): Promise<Address>;
6
+ export declare function deriveTenantPda(programId: Address, authority: Address): Promise<Address>;
7
+ export declare function deriveTicketPda(programId: Address, player: Address, tenant: Address): Promise<Address>;
package/dist/utils.js CHANGED
@@ -1,17 +1,32 @@
1
- import * as web3 from "@solana/web3.js";
1
+ import { getProgramDerivedAddress, getAddressEncoder, getUtf8Encoder, } from "@solana/kit";
2
+ const addressEncoder = getAddressEncoder();
3
+ const utf8Encoder = getUtf8Encoder();
2
4
  export const QUEUE_SEED = "queue";
3
5
  export const TENANT_SEED = "tenant";
4
6
  export const TICKET_SEED = "ticket";
5
- export function deriveQueuePda(programId, authority) {
6
- const [pda] = web3.PublicKey.findProgramAddressSync([Buffer.from(QUEUE_SEED), authority.toBuffer()], programId);
7
+ export async function deriveQueuePda(programId, authority) {
8
+ const [pda] = await getProgramDerivedAddress({
9
+ programAddress: programId,
10
+ seeds: [utf8Encoder.encode(QUEUE_SEED), addressEncoder.encode(authority)],
11
+ });
7
12
  return pda;
8
13
  }
9
- export function deriveTenantPda(programId, authority) {
10
- const [pda] = web3.PublicKey.findProgramAddressSync([Buffer.from(TENANT_SEED), authority.toBuffer()], programId);
14
+ export async function deriveTenantPda(programId, authority) {
15
+ const [pda] = await getProgramDerivedAddress({
16
+ programAddress: programId,
17
+ seeds: [utf8Encoder.encode(TENANT_SEED), addressEncoder.encode(authority)],
18
+ });
11
19
  return pda;
12
20
  }
13
- export function deriveTicketPda(programId, player, tenant) {
14
- const [pda] = web3.PublicKey.findProgramAddressSync([Buffer.from(TICKET_SEED), player.toBuffer(), tenant.toBuffer()], programId);
21
+ export async function deriveTicketPda(programId, player, tenant) {
22
+ const [pda] = await getProgramDerivedAddress({
23
+ programAddress: programId,
24
+ seeds: [
25
+ utf8Encoder.encode(TICKET_SEED),
26
+ addressEncoder.encode(player),
27
+ addressEncoder.encode(tenant),
28
+ ],
29
+ });
15
30
  return pda;
16
31
  }
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxpQkFBaUIsQ0FBQztBQUd4QyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDO0FBQ2xDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUM7QUFDcEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUVwQyxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQXlCLEVBQUUsU0FBeUI7SUFDL0UsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQy9DLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDL0MsU0FBUyxDQUNaLENBQUM7SUFDRixPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLFNBQXlCLEVBQUUsU0FBeUI7SUFDaEYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQy9DLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDaEQsU0FBUyxDQUNaLENBQUM7SUFDRixPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLFNBQXlCLEVBQUUsTUFBc0IsRUFBRSxNQUFzQjtJQUNyRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FDL0MsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDaEUsU0FBUyxDQUNaLENBQUM7SUFDRixPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB3ZWIzIGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCAqIGFzIGFuY2hvciBmcm9tIFwiQGNvcmFsLXh5ei9hbmNob3JcIjtcblxuZXhwb3J0IGNvbnN0IFFVRVVFX1NFRUQgPSBcInF1ZXVlXCI7XG5leHBvcnQgY29uc3QgVEVOQU5UX1NFRUQgPSBcInRlbmFudFwiO1xuZXhwb3J0IGNvbnN0IFRJQ0tFVF9TRUVEID0gXCJ0aWNrZXRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVF1ZXVlUGRhKHByb2dyYW1JZDogd2ViMy5QdWJsaWNLZXksIGF1dGhvcml0eTogd2ViMy5QdWJsaWNLZXkpOiB3ZWIzLlB1YmxpY0tleSB7XG4gICAgY29uc3QgW3BkYV0gPSB3ZWIzLlB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgICBbQnVmZmVyLmZyb20oUVVFVUVfU0VFRCksIGF1dGhvcml0eS50b0J1ZmZlcigpXSxcbiAgICAgICAgcHJvZ3JhbUlkXG4gICAgKTtcbiAgICByZXR1cm4gcGRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlVGVuYW50UGRhKHByb2dyYW1JZDogd2ViMy5QdWJsaWNLZXksIGF1dGhvcml0eTogd2ViMy5QdWJsaWNLZXkpOiB3ZWIzLlB1YmxpY0tleSB7XG4gICAgY29uc3QgW3BkYV0gPSB3ZWIzLlB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgICBbQnVmZmVyLmZyb20oVEVOQU5UX1NFRUQpLCBhdXRob3JpdHkudG9CdWZmZXIoKV0sXG4gICAgICAgIHByb2dyYW1JZFxuICAgICk7XG4gICAgcmV0dXJuIHBkYTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVRpY2tldFBkYShwcm9ncmFtSWQ6IHdlYjMuUHVibGljS2V5LCBwbGF5ZXI6IHdlYjMuUHVibGljS2V5LCB0ZW5hbnQ6IHdlYjMuUHVibGljS2V5KTogd2ViMy5QdWJsaWNLZXkge1xuICAgIGNvbnN0IFtwZGFdID0gd2ViMy5QdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgICAgW0J1ZmZlci5mcm9tKFRJQ0tFVF9TRUVEKSwgcGxheWVyLnRvQnVmZmVyKCksIHRlbmFudC50b0J1ZmZlcigpXSxcbiAgICAgICAgcHJvZ3JhbUlkXG4gICAgKTtcbiAgICByZXR1cm4gcGRhO1xufVxuIl19
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixpQkFBaUIsRUFDakIsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixFQUFFLENBQUM7QUFDM0MsTUFBTSxXQUFXLEdBQUcsY0FBYyxFQUFFLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQztBQUNsQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDO0FBQ3BDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUM7QUFFcEMsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsU0FBa0IsRUFBRSxTQUFrQjtJQUN6RSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQztRQUMzQyxjQUFjLEVBQUUsU0FBUztRQUN6QixLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDMUUsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsU0FBa0IsRUFBRSxTQUFrQjtJQUMxRSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQztRQUMzQyxjQUFjLEVBQUUsU0FBUztRQUN6QixLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDM0UsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQ25DLFNBQWtCLEVBQ2xCLE1BQWUsRUFDZixNQUFlO0lBRWYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7UUFDM0MsY0FBYyxFQUFFLFNBQVM7UUFDekIsS0FBSyxFQUFFO1lBQ0wsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDL0IsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDN0IsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDOUI7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBnZXRQcm9ncmFtRGVyaXZlZEFkZHJlc3MsXG4gIGdldEFkZHJlc3NFbmNvZGVyLFxuICBnZXRVdGY4RW5jb2RlcixcbiAgdHlwZSBBZGRyZXNzLFxufSBmcm9tIFwiQHNvbGFuYS9raXRcIjtcblxuY29uc3QgYWRkcmVzc0VuY29kZXIgPSBnZXRBZGRyZXNzRW5jb2RlcigpO1xuY29uc3QgdXRmOEVuY29kZXIgPSBnZXRVdGY4RW5jb2RlcigpO1xuXG5leHBvcnQgY29uc3QgUVVFVUVfU0VFRCA9IFwicXVldWVcIjtcbmV4cG9ydCBjb25zdCBURU5BTlRfU0VFRCA9IFwidGVuYW50XCI7XG5leHBvcnQgY29uc3QgVElDS0VUX1NFRUQgPSBcInRpY2tldFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVyaXZlUXVldWVQZGEocHJvZ3JhbUlkOiBBZGRyZXNzLCBhdXRob3JpdHk6IEFkZHJlc3MpOiBQcm9taXNlPEFkZHJlc3M+IHtcbiAgY29uc3QgW3BkYV0gPSBhd2FpdCBnZXRQcm9ncmFtRGVyaXZlZEFkZHJlc3Moe1xuICAgIHByb2dyYW1BZGRyZXNzOiBwcm9ncmFtSWQsXG4gICAgc2VlZHM6IFt1dGY4RW5jb2Rlci5lbmNvZGUoUVVFVUVfU0VFRCksIGFkZHJlc3NFbmNvZGVyLmVuY29kZShhdXRob3JpdHkpXSxcbiAgfSk7XG4gIHJldHVybiBwZGE7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXJpdmVUZW5hbnRQZGEocHJvZ3JhbUlkOiBBZGRyZXNzLCBhdXRob3JpdHk6IEFkZHJlc3MpOiBQcm9taXNlPEFkZHJlc3M+IHtcbiAgY29uc3QgW3BkYV0gPSBhd2FpdCBnZXRQcm9ncmFtRGVyaXZlZEFkZHJlc3Moe1xuICAgIHByb2dyYW1BZGRyZXNzOiBwcm9ncmFtSWQsXG4gICAgc2VlZHM6IFt1dGY4RW5jb2Rlci5lbmNvZGUoVEVOQU5UX1NFRUQpLCBhZGRyZXNzRW5jb2Rlci5lbmNvZGUoYXV0aG9yaXR5KV0sXG4gIH0pO1xuICByZXR1cm4gcGRhO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVyaXZlVGlja2V0UGRhKFxuICBwcm9ncmFtSWQ6IEFkZHJlc3MsXG4gIHBsYXllcjogQWRkcmVzcyxcbiAgdGVuYW50OiBBZGRyZXNzXG4pOiBQcm9taXNlPEFkZHJlc3M+IHtcbiAgY29uc3QgW3BkYV0gPSBhd2FpdCBnZXRQcm9ncmFtRGVyaXZlZEFkZHJlc3Moe1xuICAgIHByb2dyYW1BZGRyZXNzOiBwcm9ncmFtSWQsXG4gICAgc2VlZHM6IFtcbiAgICAgIHV0ZjhFbmNvZGVyLmVuY29kZShUSUNLRVRfU0VFRCksXG4gICAgICBhZGRyZXNzRW5jb2Rlci5lbmNvZGUocGxheWVyKSxcbiAgICAgIGFkZHJlc3NFbmNvZGVyLmVuY29kZSh0ZW5hbnQpLFxuICAgIF0sXG4gIH0pO1xuICByZXR1cm4gcGRhO1xufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1upmonster/duel",
3
- "version": "0.1.7",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "description": "SDK for Private Matchmaking on Solana",
6
6
  "license": "MIT",
@@ -15,14 +15,11 @@
15
15
  "prepublishOnly": "npm run build"
16
16
  },
17
17
  "dependencies": {
18
- "@coral-xyz/anchor": "^0.32.1",
19
- "@solana/web3.js": "^1.95.3",
20
- "@magicblock-labs/ephemeral-rollups-sdk": "0.8.0",
21
- "bn.js": "^5.2.1"
18
+ "@solana/kit": "^6.1.0",
19
+ "@solana/program-client-core": "^6.1.0"
22
20
  },
23
21
  "devDependencies": {
24
- "typescript": "^4.3.5",
25
22
  "@types/node": "^16.0.0",
26
- "@types/bn.js": "^5.1.0"
23
+ "typescript": "~5.7.0"
27
24
  }
28
25
  }