@1upmonster/duel 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -5
- package/dist/admin.js +32 -3
- package/dist/generated/duel/instructions/delegateQueue.js +3 -3
- package/dist/generated/duel/instructions/delegateTicket.js +3 -3
- package/dist/generated/duel/instructions/index.d.ts +1 -0
- package/dist/generated/duel/instructions/index.js +2 -1
- package/dist/generated/duel/instructions/setupQueuePermission.d.ts +51 -0
- package/dist/generated/duel/instructions/setupQueuePermission.js +63 -0
- package/dist/generated/duel/programs/duel.d.ts +6 -2
- package/dist/generated/duel/programs/duel.js +12 -4
- package/dist/player.d.ts +2 -1
- package/dist/player.js +37 -6
- package/dist/tee.d.ts +4 -3
- package/dist/tee.js +17 -23
- package/dist/transaction.d.ts +2 -0
- package/dist/transaction.js +30 -19
- package/dist/utils.d.ts +10 -0
- package/dist/utils.js +28 -1
- package/package.json +1 -1
- package/src/admin.ts +36 -0
- package/src/duel.json +57 -0
- package/src/generated/duel/instructions/delegateQueue.ts +2 -2
- package/src/generated/duel/instructions/delegateTicket.ts +2 -2
- package/src/generated/duel/instructions/index.ts +1 -0
- package/src/generated/duel/instructions/setupQueuePermission.ts +112 -0
- package/src/generated/duel/programs/duel.ts +8 -4
- package/src/player.ts +41 -3
- package/src/tee.ts +18 -22
- package/src/transaction.ts +33 -18
- package/src/utils.ts +34 -0
- package/src/encryption.ts +0 -154
package/dist/transaction.d.ts
CHANGED
|
@@ -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 {};
|
package/dist/transaction.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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,
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixtQ0FBbUMsRUFDbkMsMkNBQTJDLEVBQzNDLG1DQUFtQyxFQUNuQyxvQ0FBb0MsRUFDcEMsaUNBQWlDLEVBQ2pDLCtCQUErQixFQUMvQixJQUFJLEdBS0wsTUFBTSxhQUFhLENBQUM7QUFJckIsOERBQThEO0FBQzlELE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUzRjs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsR0FBYyxFQUFFLEdBQVc7SUFDM0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDNUMsOERBQThEO1FBQzlELE1BQU0sUUFBUSxHQUFHLE1BQU8sR0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5SCxNQUFNLE1BQU0sR0FBRyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZHLENBQUM7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztZQUN4RSxPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFDRCx3RUFBd0U7SUFDeEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FDbkMsR0FBYyxFQUNkLFdBQXdCLEVBQ3hCLE1BQXlCO0lBRXpCLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEdBQUcsTUFBTSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUV6RSw4REFBOEQ7SUFDOUQsTUFBTSxFQUFFLEdBQVEsSUFBSSxDQUNsQix3QkFBd0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFVLEVBQUUsQ0FBQyxFQUNqRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUNBQW1DLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUNyRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsMkNBQTJDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxFQUN0RSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUNBQW1DLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUMzRCxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxpQ0FBaUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RCxNQUFNLE9BQU8sR0FBRywrQkFBK0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUxRCw4REFBOEQ7SUFDOUQsTUFBTSxHQUFHLEdBQUcsTUFBTyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQWMsRUFBRTtRQUNyRCxRQUFRLEVBQUUsUUFBUTtRQUNsQixhQUFhLEVBQUUsSUFBSTtLQUNwQixDQUFDLENBQUMsSUFBSSxFQUFzQixDQUFDO0lBRTlCLE1BQU0sa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLEdBQWMsRUFDZCxZQUEyQixFQUMzQixNQUF5QjtJQUV6QixNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFekUsOERBQThEO0lBQzlELE1BQU0sRUFBRSxHQUFRLElBQUksQ0FDbEIsd0JBQXdCLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBVSxFQUFFLENBQUMsRUFDakQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1DQUFtQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFDckQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsRUFDdEUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG9DQUFvQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FDN0QsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLE1BQU0saUNBQWlDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0QsTUFBTSxPQUFPLEdBQUcsK0JBQStCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFMUQsOERBQThEO0lBQzlELE1BQU0sR0FBRyxHQUFHLE1BQU8sR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFjLEVBQUU7UUFDckQsUUFBUSxFQUFFLFFBQVE7UUFDbEIsYUFBYSxFQUFFLElBQUk7S0FDcEIsQ0FBQyxDQUFDLElBQUksRUFBc0IsQ0FBQztJQUU5QixNQUFNLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNuQyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjcmVhdGVUcmFuc2FjdGlvbk1lc3NhZ2UsXG4gIHNldFRyYW5zYWN0aW9uTWVzc2FnZUZlZVBheWVyU2lnbmVyLFxuICBzZXRUcmFuc2FjdGlvbk1lc3NhZ2VMaWZldGltZVVzaW5nQmxvY2toYXNoLFxuICBhcHBlbmRUcmFuc2FjdGlvbk1lc3NhZ2VJbnN0cnVjdGlvbixcbiAgYXBwZW5kVHJhbnNhY3Rpb25NZXNzYWdlSW5zdHJ1Y3Rpb25zLFxuICBzaWduVHJhbnNhY3Rpb25NZXNzYWdlV2l0aFNpZ25lcnMsXG4gIGdldEJhc2U2NEVuY29kZWRXaXJlVHJhbnNhY3Rpb24sXG4gIHBpcGUsXG4gIHR5cGUgSW5zdHJ1Y3Rpb24sXG4gIHR5cGUgU29sYW5hUnBjQXBpLFxuICB0eXBlIFJwYyxcbiAgdHlwZSBUcmFuc2FjdGlvblNpZ25lcixcbn0gZnJvbSBcIkBzb2xhbmEva2l0XCI7XG5cbnR5cGUgU29sYW5hUnBjID0gUnBjPFNvbGFuYVJwY0FwaT47XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBiaWdJbnRSZXBsYWNlciA9IChfOiBzdHJpbmcsIHY6IHVua25vd24pID0+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,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixpQkFBaUIsRUFDakIsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixFQUFFLENBQUM7QUFDM0MsTUFBTSxXQUFXLEdBQUcsY0FBYyxFQUFFLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsOENBQXlELENBQUM7QUFDNUYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsOENBQXlELENBQUM7QUFFNUYsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsY0FBdUI7SUFDL0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7UUFDM0MsY0FBYyxFQUFFLGtCQUFrQjtRQUNsQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7S0FDbEYsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsaUdBQWlHO0FBQ2pHLE1BQU0sQ0FBQyxLQUFLLFVBQVUsOEJBQThCLENBQUMsYUFBc0I7SUFLekUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQztRQUN4RCxjQUFjLEVBQUUsa0JBQWtCO1FBQ2xDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztLQUNoRixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxNQUFNLHdCQUF3QixDQUFDO1FBQzFELGNBQWMsRUFBRSxrQkFBa0I7UUFDbEMsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDekYsQ0FBQyxDQUFDO0lBQ0gsbUZBQW1GO0lBQ25GLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7UUFDeEQsY0FBYyxFQUFFLGtCQUFrQjtRQUNsQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDNUUsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDcEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUNwQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUFDLFNBQWtCLEVBQUUsU0FBa0I7SUFDekUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7UUFDM0MsY0FBYyxFQUFFLFNBQVM7UUFDekIsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQzFFLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLFNBQWtCLEVBQUUsU0FBa0I7SUFDMUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7UUFDM0MsY0FBYyxFQUFFLFNBQVM7UUFDekIsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQzNFLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUNuQyxTQUFrQixFQUNsQixNQUFlLEVBQ2YsTUFBZTtJQUVmLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLHdCQUF3QixDQUFDO1FBQzNDLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLEtBQUssRUFBRTtZQUNMLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQy9CLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzdCLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQzlCO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZ2V0UHJvZ3JhbURlcml2ZWRBZGRyZXNzLFxuICBnZXRBZGRyZXNzRW5jb2RlcixcbiAgZ2V0VXRmOEVuY29kZXIsXG4gIHR5cGUgQWRkcmVzcyxcbn0gZnJvbSBcIkBzb2xhbmEva2l0XCI7XG5cbmNvbnN0IGFkZHJlc3NFbmNvZGVyID0gZ2V0QWRkcmVzc0VuY29kZXIoKTtcbmNvbnN0IHV0ZjhFbmNvZGVyID0gZ2V0VXRmOEVuY29kZXIoKTtcblxuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fUFJPR1JBTSA9IFwiQUNMc2VvUG95QzNjQnFvVXRrYmpaNGFEcmt1clpXODZ2MTlwWHoyWFFucDFcIiBhcyBBZGRyZXNzO1xuZXhwb3J0IGNvbnN0IERFTEVHQVRJT05fUFJPR1JBTSA9IFwiREVMZUdHdlhwV1YyZnFKVWhxY0Y1WlNZTVM0SlRManRlYUFNQVJSU2FlU2hcIiBhcyBBZGRyZXNzO1xuXG4vKiogRGVyaXZlcyB0aGUgUGVybWlzc2lvbiBQREEgZm9yIGEgZ2l2ZW4gcGVybWlzc2lvbmVkIGFjY291bnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVyaXZlUGVybWlzc2lvblBkYShhY2NvdW50QWRkcmVzczogQWRkcmVzcyk6IFByb21pc2U8QWRkcmVzcz4ge1xuICBjb25zdCBbcGRhXSA9IGF3YWl0IGdldFByb2dyYW1EZXJpdmVkQWRkcmVzcyh7XG4gICAgcHJvZ3JhbUFkZHJlc3M6IFBFUk1JU1NJT05fUFJPR1JBTSxcbiAgICBzZWVkczogW3V0ZjhFbmNvZGVyLmVuY29kZShcInBlcm1pc3Npb246XCIpLCBhZGRyZXNzRW5jb2Rlci5lbmNvZGUoYWNjb3VudEFkZHJlc3MpXSxcbiAgfSk7XG4gIHJldHVybiBwZGE7XG59XG5cbi8qKiBEZXJpdmVzIHRoZSBERUxlR0cgZGVsZWdhdGlvbiBQREFzIGZvciB0aGUgUGVybWlzc2lvbiBQREEgKHVzZWQgaW4gRGVsZWdhdGVQZXJtaXNzaW9uIGl4KS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXJpdmVQZXJtaXNzaW9uRGVsZWdhdGlvblBkYXMocGVybWlzc2lvblBkYTogQWRkcmVzcyk6IFByb21pc2U8e1xuICBkZWxlZ2F0aW9uQnVmZmVyOiBBZGRyZXNzO1xuICBkZWxlZ2F0aW9uUmVjb3JkOiBBZGRyZXNzO1xuICBkZWxlZ2F0aW9uTWV0YWRhdGE6IEFkZHJlc3M7XG59PiB7XG4gIGNvbnN0IFtkZWxlZ2F0aW9uUmVjb3JkXSA9IGF3YWl0IGdldFByb2dyYW1EZXJpdmVkQWRkcmVzcyh7XG4gICAgcHJvZ3JhbUFkZHJlc3M6IERFTEVHQVRJT05fUFJPR1JBTSxcbiAgICBzZWVkczogW3V0ZjhFbmNvZGVyLmVuY29kZShcImRlbGVnYXRpb25cIiksIGFkZHJlc3NFbmNvZGVyLmVuY29kZShwZXJtaXNzaW9uUGRhKV0sXG4gIH0pO1xuICBjb25zdCBbZGVsZWdhdGlvbk1ldGFkYXRhXSA9IGF3YWl0IGdldFByb2dyYW1EZXJpdmVkQWRkcmVzcyh7XG4gICAgcHJvZ3JhbUFkZHJlc3M6IERFTEVHQVRJT05fUFJPR1JBTSxcbiAgICBzZWVkczogW3V0ZjhFbmNvZGVyLmVuY29kZShcImRlbGVnYXRpb24tbWV0YWRhdGFcIiksIGFkZHJlc3NFbmNvZGVyLmVuY29kZShwZXJtaXNzaW9uUGRhKV0sXG4gIH0pO1xuICAvLyBCdWZmZXIgUERBIGlzIHVuZGVyIHRoZSBvd25lclByb2dyYW0gKFBFUk1JU1NJT05fUFJPR1JBTSBmb3IgdGhlIFBlcm1pc3Npb24gUERBKVxuICBjb25zdCBbZGVsZWdhdGlvbkJ1ZmZlcl0gPSBhd2FpdCBnZXRQcm9ncmFtRGVyaXZlZEFkZHJlc3Moe1xuICAgIHByb2dyYW1BZGRyZXNzOiBQRVJNSVNTSU9OX1BST0dSQU0sXG4gICAgc2VlZHM6IFt1dGY4RW5jb2Rlci5lbmNvZGUoXCJidWZmZXJcIiksIGFkZHJlc3NFbmNvZGVyLmVuY29kZShwZXJtaXNzaW9uUGRhKV0sXG4gIH0pO1xuICByZXR1cm4geyBkZWxlZ2F0aW9uQnVmZmVyLCBkZWxlZ2F0aW9uUmVjb3JkLCBkZWxlZ2F0aW9uTWV0YWRhdGEgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFFVRVVFX1NFRUQgPSBcInF1ZXVlXCI7XG5leHBvcnQgY29uc3QgVEVOQU5UX1NFRUQgPSBcInRlbmFudFwiO1xuZXhwb3J0IGNvbnN0IFRJQ0tFVF9TRUVEID0gXCJ0aWNrZXRcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcml2ZVF1ZXVlUGRhKHByb2dyYW1JZDogQWRkcmVzcywgYXV0aG9yaXR5OiBBZGRyZXNzKTogUHJvbWlzZTxBZGRyZXNzPiB7XG4gIGNvbnN0IFtwZGFdID0gYXdhaXQgZ2V0UHJvZ3JhbURlcml2ZWRBZGRyZXNzKHtcbiAgICBwcm9ncmFtQWRkcmVzczogcHJvZ3JhbUlkLFxuICAgIHNlZWRzOiBbdXRmOEVuY29kZXIuZW5jb2RlKFFVRVVFX1NFRUQpLCBhZGRyZXNzRW5jb2Rlci5lbmNvZGUoYXV0aG9yaXR5KV0sXG4gIH0pO1xuICByZXR1cm4gcGRhO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVyaXZlVGVuYW50UGRhKHByb2dyYW1JZDogQWRkcmVzcywgYXV0aG9yaXR5OiBBZGRyZXNzKTogUHJvbWlzZTxBZGRyZXNzPiB7XG4gIGNvbnN0IFtwZGFdID0gYXdhaXQgZ2V0UHJvZ3JhbURlcml2ZWRBZGRyZXNzKHtcbiAgICBwcm9ncmFtQWRkcmVzczogcHJvZ3JhbUlkLFxuICAgIHNlZWRzOiBbdXRmOEVuY29kZXIuZW5jb2RlKFRFTkFOVF9TRUVEKSwgYWRkcmVzc0VuY29kZXIuZW5jb2RlKGF1dGhvcml0eSldLFxuICB9KTtcbiAgcmV0dXJuIHBkYTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcml2ZVRpY2tldFBkYShcbiAgcHJvZ3JhbUlkOiBBZGRyZXNzLFxuICBwbGF5ZXI6IEFkZHJlc3MsXG4gIHRlbmFudDogQWRkcmVzc1xuKTogUHJvbWlzZTxBZGRyZXNzPiB7XG4gIGNvbnN0IFtwZGFdID0gYXdhaXQgZ2V0UHJvZ3JhbURlcml2ZWRBZGRyZXNzKHtcbiAgICBwcm9ncmFtQWRkcmVzczogcHJvZ3JhbUlkLFxuICAgIHNlZWRzOiBbXG4gICAgICB1dGY4RW5jb2Rlci5lbmNvZGUoVElDS0VUX1NFRUQpLFxuICAgICAgYWRkcmVzc0VuY29kZXIuZW5jb2RlKHBsYXllciksXG4gICAgICBhZGRyZXNzRW5jb2Rlci5lbmNvZGUodGVuYW50KSxcbiAgICBdLFxuICB9KTtcbiAgcmV0dXJuIHBkYTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
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,
|
package/src/duel.json
CHANGED
|
@@ -832,6 +832,63 @@
|
|
|
832
832
|
}
|
|
833
833
|
]
|
|
834
834
|
},
|
|
835
|
+
{
|
|
836
|
+
"name": "setup_queue_permission",
|
|
837
|
+
"docs": [
|
|
838
|
+
"Set up permission for queue PDA so only the authority can read it on TEE.",
|
|
839
|
+
"Must be called BEFORE delegate_queue while the program still owns the PDA."
|
|
840
|
+
],
|
|
841
|
+
"discriminator": [
|
|
842
|
+
223,
|
|
843
|
+
132,
|
|
844
|
+
77,
|
|
845
|
+
15,
|
|
846
|
+
224,
|
|
847
|
+
155,
|
|
848
|
+
125,
|
|
849
|
+
224
|
|
850
|
+
],
|
|
851
|
+
"accounts": [
|
|
852
|
+
{
|
|
853
|
+
"name": "queue",
|
|
854
|
+
"pda": {
|
|
855
|
+
"seeds": [
|
|
856
|
+
{
|
|
857
|
+
"kind": "const",
|
|
858
|
+
"value": [
|
|
859
|
+
113,
|
|
860
|
+
117,
|
|
861
|
+
101,
|
|
862
|
+
117,
|
|
863
|
+
101
|
|
864
|
+
]
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
"kind": "account",
|
|
868
|
+
"path": "authority"
|
|
869
|
+
}
|
|
870
|
+
]
|
|
871
|
+
}
|
|
872
|
+
},
|
|
873
|
+
{
|
|
874
|
+
"name": "authority",
|
|
875
|
+
"writable": true,
|
|
876
|
+
"signer": true
|
|
877
|
+
},
|
|
878
|
+
{
|
|
879
|
+
"name": "permission",
|
|
880
|
+
"writable": true
|
|
881
|
+
},
|
|
882
|
+
{
|
|
883
|
+
"name": "permission_program"
|
|
884
|
+
},
|
|
885
|
+
{
|
|
886
|
+
"name": "system_program",
|
|
887
|
+
"address": "11111111111111111111111111111111"
|
|
888
|
+
}
|
|
889
|
+
],
|
|
890
|
+
"args": []
|
|
891
|
+
},
|
|
835
892
|
{
|
|
836
893
|
"name": "setup_ticket_permission",
|
|
837
894
|
"docs": [
|
|
@@ -65,10 +65,10 @@ if (!accounts.bufferPda.value) {
|
|
|
65
65
|
accounts.bufferPda.value = await getProgramDerivedAddress({ programAddress: 'EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X' as Address<'EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X'>, seeds: [getBytesEncoder().encode(new Uint8Array([98, 117, 102, 102, 101, 114])), getAddressEncoder().encode(getAddressFromResolvedInstructionAccount("pda", accounts.pda.value))] });
|
|
66
66
|
}
|
|
67
67
|
if (!accounts.delegationRecordPda.value) {
|
|
68
|
-
accounts.delegationRecordPda.value = await getProgramDerivedAddress({ programAddress
|
|
68
|
+
accounts.delegationRecordPda.value = await getProgramDerivedAddress({ programAddress: 'DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh' as Address<'DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh'>, seeds: [getBytesEncoder().encode(new Uint8Array([100, 101, 108, 101, 103, 97, 116, 105, 111, 110])), getAddressEncoder().encode(getAddressFromResolvedInstructionAccount("pda", accounts.pda.value))] });
|
|
69
69
|
}
|
|
70
70
|
if (!accounts.delegationMetadataPda.value) {
|
|
71
|
-
accounts.delegationMetadataPda.value = await getProgramDerivedAddress({ programAddress
|
|
71
|
+
accounts.delegationMetadataPda.value = await getProgramDerivedAddress({ programAddress: 'DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh' as Address<'DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh'>, seeds: [getBytesEncoder().encode(new Uint8Array([100, 101, 108, 101, 103, 97, 116, 105, 111, 110, 45, 109, 101, 116, 97, 100, 97, 116, 97])), getAddressEncoder().encode(getAddressFromResolvedInstructionAccount("pda", accounts.pda.value))] });
|
|
72
72
|
}
|
|
73
73
|
if (!accounts.ownerProgram.value) {
|
|
74
74
|
accounts.ownerProgram.value = 'EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X' as Address<'EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X'>;
|
|
@@ -65,10 +65,10 @@ if (!accounts.bufferPda.value) {
|
|
|
65
65
|
accounts.bufferPda.value = await getProgramDerivedAddress({ programAddress: 'EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X' as Address<'EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X'>, seeds: [getBytesEncoder().encode(new Uint8Array([98, 117, 102, 102, 101, 114])), getAddressEncoder().encode(getAddressFromResolvedInstructionAccount("pda", accounts.pda.value))] });
|
|
66
66
|
}
|
|
67
67
|
if (!accounts.delegationRecordPda.value) {
|
|
68
|
-
accounts.delegationRecordPda.value = await getProgramDerivedAddress({ programAddress
|
|
68
|
+
accounts.delegationRecordPda.value = await getProgramDerivedAddress({ programAddress: 'DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh' as Address<'DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh'>, seeds: [getBytesEncoder().encode(new Uint8Array([100, 101, 108, 101, 103, 97, 116, 105, 111, 110])), getAddressEncoder().encode(getAddressFromResolvedInstructionAccount("pda", accounts.pda.value))] });
|
|
69
69
|
}
|
|
70
70
|
if (!accounts.delegationMetadataPda.value) {
|
|
71
|
-
accounts.delegationMetadataPda.value = await getProgramDerivedAddress({ programAddress
|
|
71
|
+
accounts.delegationMetadataPda.value = await getProgramDerivedAddress({ programAddress: 'DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh' as Address<'DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh'>, seeds: [getBytesEncoder().encode(new Uint8Array([100, 101, 108, 101, 103, 97, 116, 105, 111, 110, 45, 109, 101, 116, 97, 100, 97, 116, 97])), getAddressEncoder().encode(getAddressFromResolvedInstructionAccount("pda", accounts.pda.value))] });
|
|
72
72
|
}
|
|
73
73
|
if (!accounts.ownerProgram.value) {
|
|
74
74
|
accounts.ownerProgram.value = 'EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X' as Address<'EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X'>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was AUTOGENERATED using the Codama library.
|
|
3
|
+
* Please DO NOT EDIT THIS FILE, instead use visitors
|
|
4
|
+
* to add features, then rerun Codama to update it.
|
|
5
|
+
*
|
|
6
|
+
* @see https://github.com/codama-idl/codama
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { combineCodec, fixDecoderSize, fixEncoderSize, getAddressEncoder, getBytesDecoder, getBytesEncoder, getProgramDerivedAddress, getStructDecoder, getStructEncoder, SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, SolanaError, transformEncoder, type AccountMeta, type AccountSignerMeta, type Address, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, type TransactionSigner, type WritableAccount, type WritableSignerAccount } from '@solana/kit';
|
|
10
|
+
import { getAccountMetaFactory, getAddressFromResolvedInstructionAccount, type ResolvedInstructionAccount } from '@solana/program-client-core';
|
|
11
|
+
import { DUEL_PROGRAM_ADDRESS } from '../programs';
|
|
12
|
+
|
|
13
|
+
export const SETUP_QUEUE_PERMISSION_DISCRIMINATOR = new Uint8Array([223, 132, 77, 15, 224, 155, 125, 224]);
|
|
14
|
+
|
|
15
|
+
export function getSetupQueuePermissionDiscriminatorBytes() { return fixEncoderSize(getBytesEncoder(), 8).encode(SETUP_QUEUE_PERMISSION_DISCRIMINATOR); }
|
|
16
|
+
|
|
17
|
+
export type SetupQueuePermissionInstruction<TProgram extends string = typeof DUEL_PROGRAM_ADDRESS, TAccountQueue extends string | AccountMeta<string> = string, TAccountAuthority extends string | AccountMeta<string> = string, TAccountPermission extends string | AccountMeta<string> = string, TAccountPermissionProgram extends string | AccountMeta<string> = string, TAccountSystemProgram extends string | AccountMeta<string> = "11111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta<string>[] = []> =
|
|
18
|
+
Instruction<TProgram> & InstructionWithData<ReadonlyUint8Array> & InstructionWithAccounts<[TAccountQueue extends string ? ReadonlyAccount<TAccountQueue> : TAccountQueue, TAccountAuthority extends string ? WritableSignerAccount<TAccountAuthority> & AccountSignerMeta<TAccountAuthority> : TAccountAuthority, TAccountPermission extends string ? WritableAccount<TAccountPermission> : TAccountPermission, TAccountPermissionProgram extends string ? ReadonlyAccount<TAccountPermissionProgram> : TAccountPermissionProgram, TAccountSystemProgram extends string ? ReadonlyAccount<TAccountSystemProgram> : TAccountSystemProgram, ...TRemainingAccounts]>;
|
|
19
|
+
|
|
20
|
+
export type SetupQueuePermissionInstructionData = { discriminator: ReadonlyUint8Array; };
|
|
21
|
+
|
|
22
|
+
export type SetupQueuePermissionInstructionDataArgs = { };
|
|
23
|
+
|
|
24
|
+
export function getSetupQueuePermissionInstructionDataEncoder(): FixedSizeEncoder<SetupQueuePermissionInstructionDataArgs> {
|
|
25
|
+
return transformEncoder(getStructEncoder([['discriminator', fixEncoderSize(getBytesEncoder(), 8)]]), (value) => ({ ...value, discriminator: SETUP_QUEUE_PERMISSION_DISCRIMINATOR }));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function getSetupQueuePermissionInstructionDataDecoder(): FixedSizeDecoder<SetupQueuePermissionInstructionData> {
|
|
29
|
+
return getStructDecoder([['discriminator', fixDecoderSize(getBytesDecoder(), 8)]]);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function getSetupQueuePermissionInstructionDataCodec(): FixedSizeCodec<SetupQueuePermissionInstructionDataArgs, SetupQueuePermissionInstructionData> {
|
|
33
|
+
return combineCodec(getSetupQueuePermissionInstructionDataEncoder(), getSetupQueuePermissionInstructionDataDecoder());
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type SetupQueuePermissionAsyncInput<TAccountQueue extends string = string, TAccountAuthority extends string = string, TAccountPermission extends string = string, TAccountPermissionProgram extends string = string, TAccountSystemProgram extends string = string> = {
|
|
37
|
+
queue?: Address<TAccountQueue>;
|
|
38
|
+
authority: TransactionSigner<TAccountAuthority>;
|
|
39
|
+
permission: Address<TAccountPermission>;
|
|
40
|
+
permissionProgram: Address<TAccountPermissionProgram>;
|
|
41
|
+
systemProgram?: Address<TAccountSystemProgram>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function getSetupQueuePermissionInstructionAsync<TAccountQueue extends string, TAccountAuthority extends string, TAccountPermission extends string, TAccountPermissionProgram extends string, TAccountSystemProgram extends string, TProgramAddress extends Address = typeof DUEL_PROGRAM_ADDRESS>(input: SetupQueuePermissionAsyncInput<TAccountQueue, TAccountAuthority, TAccountPermission, TAccountPermissionProgram, TAccountSystemProgram>, config?: { programAddress?: TProgramAddress } ): Promise<SetupQueuePermissionInstruction<TProgramAddress, TAccountQueue, TAccountAuthority, TAccountPermission, TAccountPermissionProgram, TAccountSystemProgram>> {
|
|
45
|
+
// Program address.
|
|
46
|
+
const programAddress = config?.programAddress ?? DUEL_PROGRAM_ADDRESS;
|
|
47
|
+
|
|
48
|
+
// Original accounts.
|
|
49
|
+
const originalAccounts = { queue: { value: input.queue ?? null, isWritable: false }, authority: { value: input.authority ?? null, isWritable: true }, permission: { value: input.permission ?? null, isWritable: true }, permissionProgram: { value: input.permissionProgram ?? null, isWritable: false }, systemProgram: { value: input.systemProgram ?? null, isWritable: false } }
|
|
50
|
+
const accounts = originalAccounts as Record<keyof typeof originalAccounts, ResolvedInstructionAccount>;
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
// Resolve default values.
|
|
54
|
+
if (!accounts.queue.value) {
|
|
55
|
+
accounts.queue.value = await getProgramDerivedAddress({ programAddress, seeds: [getBytesEncoder().encode(new Uint8Array([113, 117, 101, 117, 101])), getAddressEncoder().encode(getAddressFromResolvedInstructionAccount("authority", accounts.authority.value))] });
|
|
56
|
+
}
|
|
57
|
+
if (!accounts.systemProgram.value) {
|
|
58
|
+
accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
|
|
62
|
+
return Object.freeze({ accounts: [getAccountMeta("queue", accounts.queue), getAccountMeta("authority", accounts.authority), getAccountMeta("permission", accounts.permission), getAccountMeta("permissionProgram", accounts.permissionProgram), getAccountMeta("systemProgram", accounts.systemProgram)], data: getSetupQueuePermissionInstructionDataEncoder().encode({}), programAddress } as SetupQueuePermissionInstruction<TProgramAddress, TAccountQueue, TAccountAuthority, TAccountPermission, TAccountPermissionProgram, TAccountSystemProgram>);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export type SetupQueuePermissionInput<TAccountQueue extends string = string, TAccountAuthority extends string = string, TAccountPermission extends string = string, TAccountPermissionProgram extends string = string, TAccountSystemProgram extends string = string> = {
|
|
66
|
+
queue: Address<TAccountQueue>;
|
|
67
|
+
authority: TransactionSigner<TAccountAuthority>;
|
|
68
|
+
permission: Address<TAccountPermission>;
|
|
69
|
+
permissionProgram: Address<TAccountPermissionProgram>;
|
|
70
|
+
systemProgram?: Address<TAccountSystemProgram>;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function getSetupQueuePermissionInstruction<TAccountQueue extends string, TAccountAuthority extends string, TAccountPermission extends string, TAccountPermissionProgram extends string, TAccountSystemProgram extends string, TProgramAddress extends Address = typeof DUEL_PROGRAM_ADDRESS>(input: SetupQueuePermissionInput<TAccountQueue, TAccountAuthority, TAccountPermission, TAccountPermissionProgram, TAccountSystemProgram>, config?: { programAddress?: TProgramAddress } ): SetupQueuePermissionInstruction<TProgramAddress, TAccountQueue, TAccountAuthority, TAccountPermission, TAccountPermissionProgram, TAccountSystemProgram> {
|
|
74
|
+
// Program address.
|
|
75
|
+
const programAddress = config?.programAddress ?? DUEL_PROGRAM_ADDRESS;
|
|
76
|
+
|
|
77
|
+
// Original accounts.
|
|
78
|
+
const originalAccounts = { queue: { value: input.queue ?? null, isWritable: false }, authority: { value: input.authority ?? null, isWritable: true }, permission: { value: input.permission ?? null, isWritable: true }, permissionProgram: { value: input.permissionProgram ?? null, isWritable: false }, systemProgram: { value: input.systemProgram ?? null, isWritable: false } }
|
|
79
|
+
const accounts = originalAccounts as Record<keyof typeof originalAccounts, ResolvedInstructionAccount>;
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
// Resolve default values.
|
|
83
|
+
if (!accounts.systemProgram.value) {
|
|
84
|
+
accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
|
|
88
|
+
return Object.freeze({ accounts: [getAccountMeta("queue", accounts.queue), getAccountMeta("authority", accounts.authority), getAccountMeta("permission", accounts.permission), getAccountMeta("permissionProgram", accounts.permissionProgram), getAccountMeta("systemProgram", accounts.systemProgram)], data: getSetupQueuePermissionInstructionDataEncoder().encode({}), programAddress } as SetupQueuePermissionInstruction<TProgramAddress, TAccountQueue, TAccountAuthority, TAccountPermission, TAccountPermissionProgram, TAccountSystemProgram>);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export type ParsedSetupQueuePermissionInstruction<TProgram extends string = typeof DUEL_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[]> = { programAddress: Address<TProgram>;
|
|
92
|
+
accounts: {
|
|
93
|
+
queue: TAccountMetas[0];
|
|
94
|
+
authority: TAccountMetas[1];
|
|
95
|
+
permission: TAccountMetas[2];
|
|
96
|
+
permissionProgram: TAccountMetas[3];
|
|
97
|
+
systemProgram: TAccountMetas[4];
|
|
98
|
+
};
|
|
99
|
+
data: SetupQueuePermissionInstructionData; };
|
|
100
|
+
|
|
101
|
+
export function parseSetupQueuePermissionInstruction<TProgram extends string, TAccountMetas extends readonly AccountMeta[]>(instruction: Instruction<TProgram> & InstructionWithAccounts<TAccountMetas> & InstructionWithData<ReadonlyUint8Array>): ParsedSetupQueuePermissionInstruction<TProgram, TAccountMetas> {
|
|
102
|
+
if (instruction.accounts.length < 5) {
|
|
103
|
+
throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 5 });
|
|
104
|
+
}
|
|
105
|
+
let accountIndex = 0;
|
|
106
|
+
const getNextAccount = () => {
|
|
107
|
+
const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;
|
|
108
|
+
accountIndex += 1;
|
|
109
|
+
return accountMeta;
|
|
110
|
+
}
|
|
111
|
+
return { programAddress: instruction.programAddress, accounts: { queue: getNextAccount(), authority: getNextAccount(), permission: getNextAccount(), permissionProgram: getNextAccount(), systemProgram: getNextAccount() }, data: getSetupQueuePermissionInstructionDataDecoder().decode(instruction.data) };
|
|
112
|
+
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { assertIsInstructionWithAccounts, containsBytes, fixEncoderSize, getBytesEncoder, SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_ACCOUNT, SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, SolanaError, type Address, type ClientWithPayer, type ClientWithRpc, type ClientWithTransactionPlanning, type ClientWithTransactionSending, type GetAccountInfoApi, type GetMultipleAccountsApi, type Instruction, type InstructionWithData, type ReadonlyUint8Array } from '@solana/kit';
|
|
10
10
|
import { addSelfFetchFunctions, addSelfPlanAndSendFunctions, type SelfFetchFunctions, type SelfPlanAndSendFunctions } from '@solana/program-client-core';
|
|
11
11
|
import { getMatchTicketCodec, getQueueCodec, getTenantCodec, type MatchTicket, type MatchTicketArgs, type Queue, type QueueArgs, type Tenant, type TenantArgs } from '../accounts';
|
|
12
|
-
import { getCancelTicketInstructionAsync, getCloseTicketInstructionAsync, getCommitTicketsInstruction, getCreateTicketInstructionAsync, getDelegateQueueInstructionAsync, getDelegateTicketInstructionAsync, getFlushMatchesInstruction, getInitializeQueueInstructionAsync, getInitializeTenantInstructionAsync, getJoinQueueInstructionAsync, getProcessUndelegationInstruction, getSetupTicketPermissionInstructionAsync, parseCancelTicketInstruction, parseCloseTicketInstruction, parseCommitTicketsInstruction, parseCreateTicketInstruction, parseDelegateQueueInstruction, parseDelegateTicketInstruction, parseFlushMatchesInstruction, parseInitializeQueueInstruction, parseInitializeTenantInstruction, parseJoinQueueInstruction, parseProcessUndelegationInstruction, parseSetupTicketPermissionInstruction, type CancelTicketAsyncInput, type CloseTicketAsyncInput, type CommitTicketsInput, type CreateTicketAsyncInput, type DelegateQueueAsyncInput, type DelegateTicketAsyncInput, type FlushMatchesInput, type InitializeQueueAsyncInput, type InitializeTenantAsyncInput, type JoinQueueAsyncInput, type ParsedCancelTicketInstruction, type ParsedCloseTicketInstruction, type ParsedCommitTicketsInstruction, type ParsedCreateTicketInstruction, type ParsedDelegateQueueInstruction, type ParsedDelegateTicketInstruction, type ParsedFlushMatchesInstruction, type ParsedInitializeQueueInstruction, type ParsedInitializeTenantInstruction, type ParsedJoinQueueInstruction, type ParsedProcessUndelegationInstruction, type ParsedSetupTicketPermissionInstruction, type ProcessUndelegationInput, type SetupTicketPermissionAsyncInput } from '../instructions';
|
|
12
|
+
import { getCancelTicketInstructionAsync, getCloseTicketInstructionAsync, getCommitTicketsInstruction, getCreateTicketInstructionAsync, getDelegateQueueInstructionAsync, getDelegateTicketInstructionAsync, getFlushMatchesInstruction, getInitializeQueueInstructionAsync, getInitializeTenantInstructionAsync, getJoinQueueInstructionAsync, getProcessUndelegationInstruction, getSetupQueuePermissionInstructionAsync, getSetupTicketPermissionInstructionAsync, parseCancelTicketInstruction, parseCloseTicketInstruction, parseCommitTicketsInstruction, parseCreateTicketInstruction, parseDelegateQueueInstruction, parseDelegateTicketInstruction, parseFlushMatchesInstruction, parseInitializeQueueInstruction, parseInitializeTenantInstruction, parseJoinQueueInstruction, parseProcessUndelegationInstruction, parseSetupQueuePermissionInstruction, parseSetupTicketPermissionInstruction, type CancelTicketAsyncInput, type CloseTicketAsyncInput, type CommitTicketsInput, type CreateTicketAsyncInput, type DelegateQueueAsyncInput, type DelegateTicketAsyncInput, type FlushMatchesInput, type InitializeQueueAsyncInput, type InitializeTenantAsyncInput, type JoinQueueAsyncInput, type ParsedCancelTicketInstruction, type ParsedCloseTicketInstruction, type ParsedCommitTicketsInstruction, type ParsedCreateTicketInstruction, type ParsedDelegateQueueInstruction, type ParsedDelegateTicketInstruction, type ParsedFlushMatchesInstruction, type ParsedInitializeQueueInstruction, type ParsedInitializeTenantInstruction, type ParsedJoinQueueInstruction, type ParsedProcessUndelegationInstruction, type ParsedSetupQueuePermissionInstruction, type ParsedSetupTicketPermissionInstruction, type ProcessUndelegationInput, type SetupQueuePermissionAsyncInput, type SetupTicketPermissionAsyncInput } from '../instructions';
|
|
13
13
|
|
|
14
14
|
export const DUEL_PROGRAM_ADDRESS = 'EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X' as Address<'EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X'>;
|
|
15
15
|
|
|
@@ -23,7 +23,7 @@ if (containsBytes(data, fixEncoderSize(getBytesEncoder(), 8).encode(new Uint8Arr
|
|
|
23
23
|
throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_ACCOUNT, { accountData: data, programName: "duel" });
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
export enum DuelInstruction { CancelTicket, CloseTicket, CommitTickets, CreateTicket, DelegateQueue, DelegateTicket, FlushMatches, InitializeQueue, InitializeTenant, JoinQueue, ProcessUndelegation, SetupTicketPermission }
|
|
26
|
+
export enum DuelInstruction { CancelTicket, CloseTicket, CommitTickets, CreateTicket, DelegateQueue, DelegateTicket, FlushMatches, InitializeQueue, InitializeTenant, JoinQueue, ProcessUndelegation, SetupQueuePermission, SetupTicketPermission }
|
|
27
27
|
|
|
28
28
|
export function identifyDuelInstruction(instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array): DuelInstruction {
|
|
29
29
|
const data = 'data' in instruction ? instruction.data : instruction;
|
|
@@ -38,6 +38,7 @@ if (containsBytes(data, fixEncoderSize(getBytesEncoder(), 8).encode(new Uint8Arr
|
|
|
38
38
|
if (containsBytes(data, fixEncoderSize(getBytesEncoder(), 8).encode(new Uint8Array([94, 120, 34, 186, 57, 167, 241, 206])), 0)) { return DuelInstruction.InitializeTenant; }
|
|
39
39
|
if (containsBytes(data, fixEncoderSize(getBytesEncoder(), 8).encode(new Uint8Array([157, 115, 48, 109, 65, 86, 203, 238])), 0)) { return DuelInstruction.JoinQueue; }
|
|
40
40
|
if (containsBytes(data, fixEncoderSize(getBytesEncoder(), 8).encode(new Uint8Array([196, 28, 41, 206, 48, 37, 51, 167])), 0)) { return DuelInstruction.ProcessUndelegation; }
|
|
41
|
+
if (containsBytes(data, fixEncoderSize(getBytesEncoder(), 8).encode(new Uint8Array([223, 132, 77, 15, 224, 155, 125, 224])), 0)) { return DuelInstruction.SetupQueuePermission; }
|
|
41
42
|
if (containsBytes(data, fixEncoderSize(getBytesEncoder(), 8).encode(new Uint8Array([164, 29, 7, 235, 183, 223, 11, 85])), 0)) { return DuelInstruction.SetupTicketPermission; }
|
|
42
43
|
throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, { instructionData: data, programName: "duel" });
|
|
43
44
|
}
|
|
@@ -54,6 +55,7 @@ export type ParsedDuelInstruction<TProgram extends string = 'EdZzUwKd1X2ZWjxLPpz
|
|
|
54
55
|
| { instructionType: DuelInstruction.InitializeTenant } & ParsedInitializeTenantInstruction<TProgram>
|
|
55
56
|
| { instructionType: DuelInstruction.JoinQueue } & ParsedJoinQueueInstruction<TProgram>
|
|
56
57
|
| { instructionType: DuelInstruction.ProcessUndelegation } & ParsedProcessUndelegationInstruction<TProgram>
|
|
58
|
+
| { instructionType: DuelInstruction.SetupQueuePermission } & ParsedSetupQueuePermissionInstruction<TProgram>
|
|
57
59
|
| { instructionType: DuelInstruction.SetupTicketPermission } & ParsedSetupTicketPermissionInstruction<TProgram>
|
|
58
60
|
|
|
59
61
|
|
|
@@ -85,6 +87,8 @@ case DuelInstruction.JoinQueue: { assertIsInstructionWithAccounts(instruction);
|
|
|
85
87
|
return { instructionType: DuelInstruction.JoinQueue, ...parseJoinQueueInstruction(instruction) }; }
|
|
86
88
|
case DuelInstruction.ProcessUndelegation: { assertIsInstructionWithAccounts(instruction);
|
|
87
89
|
return { instructionType: DuelInstruction.ProcessUndelegation, ...parseProcessUndelegationInstruction(instruction) }; }
|
|
90
|
+
case DuelInstruction.SetupQueuePermission: { assertIsInstructionWithAccounts(instruction);
|
|
91
|
+
return { instructionType: DuelInstruction.SetupQueuePermission, ...parseSetupQueuePermissionInstruction(instruction) }; }
|
|
88
92
|
case DuelInstruction.SetupTicketPermission: { assertIsInstructionWithAccounts(instruction);
|
|
89
93
|
return { instructionType: DuelInstruction.SetupTicketPermission, ...parseSetupTicketPermissionInstruction(instruction) }; }
|
|
90
94
|
default: throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, { instructionType: instructionType as string, programName: "duel" });
|
|
@@ -95,13 +99,13 @@ export type DuelPlugin = { accounts: DuelPluginAccounts; instructions: DuelPlugi
|
|
|
95
99
|
|
|
96
100
|
export type DuelPluginAccounts = { matchTicket: ReturnType<typeof getMatchTicketCodec> & SelfFetchFunctions<MatchTicketArgs, MatchTicket>; queue: ReturnType<typeof getQueueCodec> & SelfFetchFunctions<QueueArgs, Queue>; tenant: ReturnType<typeof getTenantCodec> & SelfFetchFunctions<TenantArgs, Tenant>; }
|
|
97
101
|
|
|
98
|
-
export type DuelPluginInstructions = { cancelTicket: (input: CancelTicketAsyncInput) => ReturnType<typeof getCancelTicketInstructionAsync> & SelfPlanAndSendFunctions; closeTicket: (input: CloseTicketAsyncInput) => ReturnType<typeof getCloseTicketInstructionAsync> & SelfPlanAndSendFunctions; commitTickets: (input: MakeOptional<CommitTicketsInput, "payer">) => ReturnType<typeof getCommitTicketsInstruction> & SelfPlanAndSendFunctions; createTicket: (input: CreateTicketAsyncInput) => ReturnType<typeof getCreateTicketInstructionAsync> & SelfPlanAndSendFunctions; delegateQueue: (input: MakeOptional<DelegateQueueAsyncInput, "payer">) => ReturnType<typeof getDelegateQueueInstructionAsync> & SelfPlanAndSendFunctions; delegateTicket: (input: MakeOptional<DelegateTicketAsyncInput, "payer">) => ReturnType<typeof getDelegateTicketInstructionAsync> & SelfPlanAndSendFunctions; flushMatches: (input: FlushMatchesInput) => ReturnType<typeof getFlushMatchesInstruction> & SelfPlanAndSendFunctions; initializeQueue: (input: InitializeQueueAsyncInput) => ReturnType<typeof getInitializeQueueInstructionAsync> & SelfPlanAndSendFunctions; initializeTenant: (input: InitializeTenantAsyncInput) => ReturnType<typeof getInitializeTenantInstructionAsync> & SelfPlanAndSendFunctions; joinQueue: (input: JoinQueueAsyncInput) => ReturnType<typeof getJoinQueueInstructionAsync> & SelfPlanAndSendFunctions; processUndelegation: (input: MakeOptional<ProcessUndelegationInput, "payer">) => ReturnType<typeof getProcessUndelegationInstruction> & SelfPlanAndSendFunctions; setupTicketPermission: (input: SetupTicketPermissionAsyncInput) => ReturnType<typeof getSetupTicketPermissionInstructionAsync> & SelfPlanAndSendFunctions; }
|
|
102
|
+
export type DuelPluginInstructions = { cancelTicket: (input: CancelTicketAsyncInput) => ReturnType<typeof getCancelTicketInstructionAsync> & SelfPlanAndSendFunctions; closeTicket: (input: CloseTicketAsyncInput) => ReturnType<typeof getCloseTicketInstructionAsync> & SelfPlanAndSendFunctions; commitTickets: (input: MakeOptional<CommitTicketsInput, "payer">) => ReturnType<typeof getCommitTicketsInstruction> & SelfPlanAndSendFunctions; createTicket: (input: CreateTicketAsyncInput) => ReturnType<typeof getCreateTicketInstructionAsync> & SelfPlanAndSendFunctions; delegateQueue: (input: MakeOptional<DelegateQueueAsyncInput, "payer">) => ReturnType<typeof getDelegateQueueInstructionAsync> & SelfPlanAndSendFunctions; delegateTicket: (input: MakeOptional<DelegateTicketAsyncInput, "payer">) => ReturnType<typeof getDelegateTicketInstructionAsync> & SelfPlanAndSendFunctions; flushMatches: (input: FlushMatchesInput) => ReturnType<typeof getFlushMatchesInstruction> & SelfPlanAndSendFunctions; initializeQueue: (input: InitializeQueueAsyncInput) => ReturnType<typeof getInitializeQueueInstructionAsync> & SelfPlanAndSendFunctions; initializeTenant: (input: InitializeTenantAsyncInput) => ReturnType<typeof getInitializeTenantInstructionAsync> & SelfPlanAndSendFunctions; joinQueue: (input: JoinQueueAsyncInput) => ReturnType<typeof getJoinQueueInstructionAsync> & SelfPlanAndSendFunctions; processUndelegation: (input: MakeOptional<ProcessUndelegationInput, "payer">) => ReturnType<typeof getProcessUndelegationInstruction> & SelfPlanAndSendFunctions; setupQueuePermission: (input: SetupQueuePermissionAsyncInput) => ReturnType<typeof getSetupQueuePermissionInstructionAsync> & SelfPlanAndSendFunctions; setupTicketPermission: (input: SetupTicketPermissionAsyncInput) => ReturnType<typeof getSetupTicketPermissionInstructionAsync> & SelfPlanAndSendFunctions; }
|
|
99
103
|
|
|
100
104
|
export type DuelPluginRequirements = ClientWithRpc<GetAccountInfoApi & GetMultipleAccountsApi> & ClientWithPayer & ClientWithTransactionPlanning & ClientWithTransactionSending
|
|
101
105
|
|
|
102
106
|
export function duelProgram() {
|
|
103
107
|
return <T extends DuelPluginRequirements>(client: T) => {
|
|
104
|
-
return { ...client, duel: <DuelPlugin>{ accounts: { matchTicket: addSelfFetchFunctions(client, getMatchTicketCodec()), queue: addSelfFetchFunctions(client, getQueueCodec()), tenant: addSelfFetchFunctions(client, getTenantCodec()) }, instructions: { cancelTicket: input => addSelfPlanAndSendFunctions(client, getCancelTicketInstructionAsync(input)), closeTicket: input => addSelfPlanAndSendFunctions(client, getCloseTicketInstructionAsync(input)), commitTickets: input => addSelfPlanAndSendFunctions(client, getCommitTicketsInstruction({ ...input, payer: input.payer ?? client.payer })), createTicket: input => addSelfPlanAndSendFunctions(client, getCreateTicketInstructionAsync(input)), delegateQueue: input => addSelfPlanAndSendFunctions(client, getDelegateQueueInstructionAsync({ ...input, payer: input.payer ?? client.payer })), delegateTicket: input => addSelfPlanAndSendFunctions(client, getDelegateTicketInstructionAsync({ ...input, payer: input.payer ?? client.payer })), flushMatches: input => addSelfPlanAndSendFunctions(client, getFlushMatchesInstruction(input)), initializeQueue: input => addSelfPlanAndSendFunctions(client, getInitializeQueueInstructionAsync(input)), initializeTenant: input => addSelfPlanAndSendFunctions(client, getInitializeTenantInstructionAsync(input)), joinQueue: input => addSelfPlanAndSendFunctions(client, getJoinQueueInstructionAsync(input)), processUndelegation: input => addSelfPlanAndSendFunctions(client, getProcessUndelegationInstruction({ ...input, payer: input.payer ?? client.payer.address })), setupTicketPermission: input => addSelfPlanAndSendFunctions(client, getSetupTicketPermissionInstructionAsync(input)) } } };
|
|
108
|
+
return { ...client, duel: <DuelPlugin>{ accounts: { matchTicket: addSelfFetchFunctions(client, getMatchTicketCodec()), queue: addSelfFetchFunctions(client, getQueueCodec()), tenant: addSelfFetchFunctions(client, getTenantCodec()) }, instructions: { cancelTicket: input => addSelfPlanAndSendFunctions(client, getCancelTicketInstructionAsync(input)), closeTicket: input => addSelfPlanAndSendFunctions(client, getCloseTicketInstructionAsync(input)), commitTickets: input => addSelfPlanAndSendFunctions(client, getCommitTicketsInstruction({ ...input, payer: input.payer ?? client.payer })), createTicket: input => addSelfPlanAndSendFunctions(client, getCreateTicketInstructionAsync(input)), delegateQueue: input => addSelfPlanAndSendFunctions(client, getDelegateQueueInstructionAsync({ ...input, payer: input.payer ?? client.payer })), delegateTicket: input => addSelfPlanAndSendFunctions(client, getDelegateTicketInstructionAsync({ ...input, payer: input.payer ?? client.payer })), flushMatches: input => addSelfPlanAndSendFunctions(client, getFlushMatchesInstruction(input)), initializeQueue: input => addSelfPlanAndSendFunctions(client, getInitializeQueueInstructionAsync(input)), initializeTenant: input => addSelfPlanAndSendFunctions(client, getInitializeTenantInstructionAsync(input)), joinQueue: input => addSelfPlanAndSendFunctions(client, getJoinQueueInstructionAsync(input)), processUndelegation: input => addSelfPlanAndSendFunctions(client, getProcessUndelegationInstruction({ ...input, payer: input.payer ?? client.payer.address })), setupQueuePermission: input => addSelfPlanAndSendFunctions(client, getSetupQueuePermissionInstructionAsync(input)), setupTicketPermission: input => addSelfPlanAndSendFunctions(client, getSetupTicketPermissionInstructionAsync(input)) } } };
|
|
105
109
|
};
|
|
106
110
|
}
|
|
107
111
|
|