@magicblock-labs/ephemeral-rollups-kit 0.3.6
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 +18 -0
- package/lib/__test__/connection.test.d.ts +2 -0
- package/lib/__test__/connection.test.d.ts.map +1 -0
- package/lib/__test__/connection.test.js +205 -0
- package/lib/__test__/connection.test.js.map +1 -0
- package/lib/confirmation.d.ts +19 -0
- package/lib/confirmation.d.ts.map +1 -0
- package/lib/confirmation.js +100 -0
- package/lib/confirmation.js.map +1 -0
- package/lib/connection.d.ts +43 -0
- package/lib/connection.d.ts.map +1 -0
- package/lib/connection.js +160 -0
- package/lib/connection.js.map +1 -0
- package/lib/constants.d.ts +4 -0
- package/lib/constants.d.ts.map +1 -0
- package/lib/constants.js +8 -0
- package/lib/constants.js.map +1 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +24 -0
- package/lib/index.js.map +1 -0
- package/lib/instructions/delegate.d.ts +25 -0
- package/lib/instructions/delegate.d.ts.map +1 -0
- package/lib/instructions/delegate.js +108 -0
- package/lib/instructions/delegate.js.map +1 -0
- package/lib/pda.d.ts +5 -0
- package/lib/pda.d.ts.map +1 -0
- package/lib/pda.js +35 -0
- package/lib/pda.js.map +1 -0
- package/lib/privacy/auth.d.ts +3 -0
- package/lib/privacy/auth.d.ts.map +1 -0
- package/lib/privacy/auth.js +25 -0
- package/lib/privacy/auth.js.map +1 -0
- package/lib/privacy/constants.d.ts +4 -0
- package/lib/privacy/constants.d.ts.map +1 -0
- package/lib/privacy/constants.js +7 -0
- package/lib/privacy/constants.js.map +1 -0
- package/lib/privacy/index.d.ts +5 -0
- package/lib/privacy/index.d.ts.map +1 -0
- package/lib/privacy/index.js +21 -0
- package/lib/privacy/index.js.map +1 -0
- package/lib/privacy/pda.d.ts +4 -0
- package/lib/privacy/pda.d.ts.map +1 -0
- package/lib/privacy/pda.js +25 -0
- package/lib/privacy/pda.js.map +1 -0
- package/lib/privacy/verify.d.ts +2 -0
- package/lib/privacy/verify.d.ts.map +1 -0
- package/lib/privacy/verify.js +29 -0
- package/lib/privacy/verify.js.map +1 -0
- package/lib/resolver.d.ts +28 -0
- package/lib/resolver.d.ts.map +1 -0
- package/lib/resolver.js +103 -0
- package/lib/resolver.js.map +1 -0
- package/lib/utils.d.ts +6 -0
- package/lib/utils.d.ts.map +1 -0
- package/lib/utils.js +56 -0
- package/lib/utils.js.map +1 -0
- package/package.json +54 -0
package/lib/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./constants.js"), exports);
|
|
18
|
+
__exportStar(require("./instructions/delegate.js"), exports);
|
|
19
|
+
__exportStar(require("./pda.js"), exports);
|
|
20
|
+
__exportStar(require("./utils.js"), exports);
|
|
21
|
+
__exportStar(require("./resolver.js"), exports);
|
|
22
|
+
__exportStar(require("./connection.js"), exports);
|
|
23
|
+
__exportStar(require("./confirmation.js"), exports);
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,6DAA2C;AAC3C,2CAAyB;AACzB,6CAA2B;AAC3B,gDAA8B;AAC9B,kDAAgC;AAChC,oDAAkC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as beet from "@metaplex-foundation/beet";
|
|
2
|
+
import { AccountMeta, Address, Instruction } from "@solana/kit";
|
|
3
|
+
export declare const delegateStruct: beet.FixableBeetArgsStruct<{
|
|
4
|
+
instructionDiscriminator: number[];
|
|
5
|
+
commit_frequency_ms: beet.bignum;
|
|
6
|
+
seeds: number[][];
|
|
7
|
+
validator?: beet.COption<Uint8Array>;
|
|
8
|
+
}>;
|
|
9
|
+
export declare const delegateInstructionDiscriminator: number[];
|
|
10
|
+
interface DelegateAccountArgs {
|
|
11
|
+
commit_frequency_ms: number;
|
|
12
|
+
seeds: Uint8Array[][];
|
|
13
|
+
validator?: Address;
|
|
14
|
+
}
|
|
15
|
+
export declare function createDelegateInstruction(accountsInput: {
|
|
16
|
+
payer: Address;
|
|
17
|
+
delegatedAccount: Address;
|
|
18
|
+
ownerProgram: Address;
|
|
19
|
+
delegationRecord?: Address;
|
|
20
|
+
delegationMetadata?: Address;
|
|
21
|
+
systemProgram?: Address;
|
|
22
|
+
validator?: Address;
|
|
23
|
+
}, args?: DelegateAccountArgs, programId?: Address<"DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh">): Promise<Instruction<string, readonly (import("@solana/kit").AccountLookupMeta<string, string> | AccountMeta<string>)[]>>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=delegate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../src/instructions/delegate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAe,WAAW,EAAE,MAAM,aAAa,CAAC;AAS7E,eAAO,MAAM,cAAc;8BACC,MAAM,EAAE;yBACb,IAAI,CAAC,MAAM;WACzB,MAAM,EAAE,EAAE;gBACL,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;EASrC,CAAC;AACF,eAAO,MAAM,gCAAgC,UAA2B,CAAC;AAGzE,UAAU,mBAAmB;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE;IACb,KAAK,EAAE,OAAO,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,EACD,IAAI,CAAC,EAAE,mBAAmB,EAC1B,SAAS,0DAAwB,4HAyElC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.delegateInstructionDiscriminator = exports.delegateStruct = void 0;
|
|
37
|
+
exports.createDelegateInstruction = createDelegateInstruction;
|
|
38
|
+
const beet = __importStar(require("@metaplex-foundation/beet"));
|
|
39
|
+
const kit_1 = require("@solana/kit");
|
|
40
|
+
const system_1 = require("@solana-program/system");
|
|
41
|
+
const constants_1 = require("../constants");
|
|
42
|
+
const pda_1 = require("../pda");
|
|
43
|
+
exports.delegateStruct = new beet.FixableBeetArgsStruct([
|
|
44
|
+
["instructionDiscriminator", beet.uniformFixedSizeArray(beet.u8, 8)],
|
|
45
|
+
["commit_frequency_ms", beet.u32],
|
|
46
|
+
["seeds", beet.array(beet.array(beet.u8))],
|
|
47
|
+
["validator", beet.coption(beet.uniformFixedSizeArray(beet.u8, 32))],
|
|
48
|
+
], "DelegateInstructionArgs");
|
|
49
|
+
exports.delegateInstructionDiscriminator = [0, 0, 0, 0, 0, 0, 0, 0];
|
|
50
|
+
async function createDelegateInstruction(accountsInput, args, programId = constants_1.DELEGATION_PROGRAM_ID) {
|
|
51
|
+
const delegateBufferPda = await (0, pda_1.delegateBufferPdaFromDelegatedAccountAndOwnerProgram)(accountsInput.delegatedAccount, accountsInput.ownerProgram);
|
|
52
|
+
const delegationRecordPda = await (0, pda_1.delegationRecordPdaFromDelegatedAccount)(accountsInput.delegatedAccount);
|
|
53
|
+
const delegationMetadataPda = await (0, pda_1.delegationMetadataPdaFromDelegatedAccount)(accountsInput.delegatedAccount);
|
|
54
|
+
args = args ?? {
|
|
55
|
+
commit_frequency_ms: 4294967295,
|
|
56
|
+
seeds: [],
|
|
57
|
+
};
|
|
58
|
+
const accounts = [
|
|
59
|
+
{
|
|
60
|
+
address: accountsInput.payer,
|
|
61
|
+
role: kit_1.AccountRole.READONLY_SIGNER,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
address: accountsInput.delegatedAccount,
|
|
65
|
+
role: kit_1.AccountRole.WRITABLE_SIGNER,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
address: accountsInput.ownerProgram,
|
|
69
|
+
role: kit_1.AccountRole.READONLY,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
address: delegateBufferPda,
|
|
73
|
+
role: kit_1.AccountRole.WRITABLE,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
address: accountsInput.delegationRecord ?? delegationRecordPda,
|
|
77
|
+
role: kit_1.AccountRole.WRITABLE,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
address: accountsInput.delegationMetadata ?? delegationMetadataPda,
|
|
81
|
+
role: kit_1.AccountRole.WRITABLE,
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
address: accountsInput.systemProgram ?? system_1.SYSTEM_PROGRAM_ADDRESS,
|
|
85
|
+
role: kit_1.AccountRole.READONLY,
|
|
86
|
+
},
|
|
87
|
+
...(accountsInput.validator
|
|
88
|
+
? [
|
|
89
|
+
{
|
|
90
|
+
address: accountsInput.validator,
|
|
91
|
+
role: kit_1.AccountRole.READONLY,
|
|
92
|
+
},
|
|
93
|
+
]
|
|
94
|
+
: []),
|
|
95
|
+
];
|
|
96
|
+
const [data] = exports.delegateStruct.serialize({
|
|
97
|
+
instructionDiscriminator: exports.delegateInstructionDiscriminator,
|
|
98
|
+
commit_frequency_ms: args.commit_frequency_ms,
|
|
99
|
+
seeds: args.seeds.map((seed) => seed.map(Number)),
|
|
100
|
+
});
|
|
101
|
+
const delegateInstruction = {
|
|
102
|
+
accounts,
|
|
103
|
+
data,
|
|
104
|
+
programAddress: programId,
|
|
105
|
+
};
|
|
106
|
+
return delegateInstruction;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=delegate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegate.js","sourceRoot":"","sources":["../../src/instructions/delegate.ts"],"names":[],"mappings":"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"}
|
package/lib/pda.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Address } from "@solana/kit";
|
|
2
|
+
export declare function delegationRecordPdaFromDelegatedAccount(delegatedAccount: Address): Promise<Address<string>>;
|
|
3
|
+
export declare function delegationMetadataPdaFromDelegatedAccount(delegatedAccount: Address): Promise<Address<string>>;
|
|
4
|
+
export declare function delegateBufferPdaFromDelegatedAccountAndOwnerProgram(delegatedAccount: Address, ownerProgramId: Address): Promise<Address<string>>;
|
|
5
|
+
//# sourceMappingURL=pda.d.ts.map
|
package/lib/pda.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pda.d.ts","sourceRoot":"","sources":["../src/pda.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAGR,MAAM,aAAa,CAAC;AAGrB,wBAAsB,uCAAuC,CAC3D,gBAAgB,EAAE,OAAO,4BAQ1B;AAED,wBAAsB,yCAAyC,CAC7D,gBAAgB,EAAE,OAAO,4BAY1B;AAED,wBAAsB,oDAAoD,CACxE,gBAAgB,EAAE,OAAO,EACzB,cAAc,EAAE,OAAO,4BAQxB"}
|
package/lib/pda.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.delegationRecordPdaFromDelegatedAccount = delegationRecordPdaFromDelegatedAccount;
|
|
4
|
+
exports.delegationMetadataPdaFromDelegatedAccount = delegationMetadataPdaFromDelegatedAccount;
|
|
5
|
+
exports.delegateBufferPdaFromDelegatedAccountAndOwnerProgram = delegateBufferPdaFromDelegatedAccountAndOwnerProgram;
|
|
6
|
+
const kit_1 = require("@solana/kit");
|
|
7
|
+
const constants_1 = require("./constants");
|
|
8
|
+
async function delegationRecordPdaFromDelegatedAccount(delegatedAccount) {
|
|
9
|
+
const addressEncoder = (0, kit_1.getAddressEncoder)();
|
|
10
|
+
const [delegationRecordPda] = await (0, kit_1.getProgramDerivedAddress)({
|
|
11
|
+
programAddress: constants_1.DELEGATION_PROGRAM_ID,
|
|
12
|
+
seeds: [Buffer.from("delegation"), addressEncoder.encode(delegatedAccount)],
|
|
13
|
+
});
|
|
14
|
+
return delegationRecordPda;
|
|
15
|
+
}
|
|
16
|
+
async function delegationMetadataPdaFromDelegatedAccount(delegatedAccount) {
|
|
17
|
+
const addressEncoder = (0, kit_1.getAddressEncoder)();
|
|
18
|
+
const [delegationMetadataPda] = await (0, kit_1.getProgramDerivedAddress)({
|
|
19
|
+
programAddress: constants_1.DELEGATION_PROGRAM_ID,
|
|
20
|
+
seeds: [
|
|
21
|
+
Buffer.from("delegation-metadata"),
|
|
22
|
+
addressEncoder.encode(delegatedAccount),
|
|
23
|
+
],
|
|
24
|
+
});
|
|
25
|
+
return delegationMetadataPda;
|
|
26
|
+
}
|
|
27
|
+
async function delegateBufferPdaFromDelegatedAccountAndOwnerProgram(delegatedAccount, ownerProgramId) {
|
|
28
|
+
const addressEncoder = (0, kit_1.getAddressEncoder)();
|
|
29
|
+
const [delegateBufferPda] = await (0, kit_1.getProgramDerivedAddress)({
|
|
30
|
+
programAddress: ownerProgramId,
|
|
31
|
+
seeds: [Buffer.from("buffer"), addressEncoder.encode(delegatedAccount)],
|
|
32
|
+
});
|
|
33
|
+
return delegateBufferPda;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=pda.js.map
|
package/lib/pda.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pda.js","sourceRoot":"","sources":["../src/pda.ts"],"names":[],"mappings":";;AAOA,0FASC;AAED,8FAaC;AAED,oHAUC;AA3CD,qCAIqB;AACrB,2CAAoD;AAE7C,KAAK,UAAU,uCAAuC,CAC3D,gBAAyB;IAEzB,MAAM,cAAc,GAAG,IAAA,uBAAiB,GAAE,CAAC;IAC3C,MAAM,CAAC,mBAAmB,CAAC,GAAG,MAAM,IAAA,8BAAwB,EAAC;QAC3D,cAAc,EAAE,iCAAqB;QACrC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;KAC5E,CAAC,CAAC;IACH,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAEM,KAAK,UAAU,yCAAyC,CAC7D,gBAAyB;IAEzB,MAAM,cAAc,GAAG,IAAA,uBAAiB,GAAE,CAAC;IAC3C,MAAM,CAAC,qBAAqB,CAAC,GAAG,MAAM,IAAA,8BAAwB,EAAC;QAC7D,cAAc,EAAE,iCAAqB;QACrC,KAAK,EAAE;YACL,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC;YAClC,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC;SACxC;KACF,CAAC,CAAC;IAEH,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAEM,KAAK,UAAU,oDAAoD,CACxE,gBAAyB,EACzB,cAAuB;IAEvB,MAAM,cAAc,GAAG,IAAA,uBAAiB,GAAE,CAAC;IAC3C,MAAM,CAAC,iBAAiB,CAAC,GAAG,MAAM,IAAA,8BAAwB,EAAC;QACzD,cAAc,EAAE,cAAc;QAC9B,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;KACxE,CAAC,CAAC;IACH,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/privacy/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAkBtC,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,OAAO,EAClB,WAAW,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,mBAkC1D"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAuthToken = getAuthToken;
|
|
4
|
+
async function getAuthToken(rpcUrl, publicKey, signMessage) {
|
|
5
|
+
const bs58 = (await import("bs58")).default;
|
|
6
|
+
const challengeResponse = await fetch(`${rpcUrl}/auth/challenge?pubkey=${publicKey.toString()}`);
|
|
7
|
+
const { challenge } = await challengeResponse.json();
|
|
8
|
+
const signature = await signMessage(new Uint8Array(Buffer.from(challenge, "utf-8")));
|
|
9
|
+
const signatureString = bs58.encode(signature);
|
|
10
|
+
const authResponse = await fetch(`${rpcUrl}/auth/login`, {
|
|
11
|
+
method: "POST",
|
|
12
|
+
headers: { "Content-Type": "application/json" },
|
|
13
|
+
body: JSON.stringify({
|
|
14
|
+
pubkey: publicKey.toString(),
|
|
15
|
+
challenge,
|
|
16
|
+
signature: signatureString,
|
|
17
|
+
}),
|
|
18
|
+
});
|
|
19
|
+
const authJson = await authResponse.json();
|
|
20
|
+
if (authResponse.status !== 200) {
|
|
21
|
+
throw new Error(`Failed to authenticate: ${authJson.error}`);
|
|
22
|
+
}
|
|
23
|
+
return authJson.token;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/privacy/auth.ts"],"names":[],"mappings":";;AAkBA,oCAqCC;AArCM,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,SAAkB,EAClB,WAAyD;IAGzD,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAG5C,MAAM,iBAAiB,GAAG,MAAM,KAAK,CACnC,GAAG,MAAM,0BAA0B,SAAS,CAAC,QAAQ,EAAE,EAAE,CAC1D,CAAC;IACF,MAAM,EAAE,SAAS,EAAE,GAA0B,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAG5E,MAAM,SAAS,GAAG,MAAM,WAAW,CACjC,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAChD,CAAC;IACF,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAG/C,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,aAAa,EAAE;QACvD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,MAAM,EAAE,SAAS,CAAC,QAAQ,EAAE;YAC5B,SAAS;YACT,SAAS,EAAE,eAAe;SAC3B,CAAC;KACH,CAAC,CAAC;IACH,MAAM,QAAQ,GAAsB,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IAE9D,IAAI,YAAY,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/privacy/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAW,MAAM,aAAa,CAAC;AAE/C,eAAO,MAAM,gBAAgB,QAA2B,CAAC;AAEzD,eAAO,MAAM,qBAAqB,EAAE,OAEnC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PERMISSION_PROGRAM_ID = exports.SESSION_DURATION = void 0;
|
|
4
|
+
const kit_1 = require("@solana/kit");
|
|
5
|
+
exports.SESSION_DURATION = 1000 * 60 * 60 * 24 * 30;
|
|
6
|
+
exports.PERMISSION_PROGRAM_ID = (0, kit_1.address)("BTWAqWNBmF2TboMh3fxMJfgR16xGHYD7Kgr2dPwbRPBi");
|
|
7
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/privacy/constants.ts"],"names":[],"mappings":";;;AAAA,qCAA+C;AAElC,QAAA,gBAAgB,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAE5C,QAAA,qBAAqB,GAAY,IAAA,aAAO,EACnD,8CAA8C,CAC/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/privacy/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./pda.js"), exports);
|
|
18
|
+
__exportStar(require("./auth.js"), exports);
|
|
19
|
+
__exportStar(require("./verify.js"), exports);
|
|
20
|
+
__exportStar(require("./constants.js"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/privacy/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,4CAA0B;AAC1B,8CAA4B;AAC5B,iDAA+B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pda.d.ts","sourceRoot":"","sources":["../../src/privacy/pda.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAGR,MAAM,aAAa,CAAC;AAWrB,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,OAAO,4BAO9D;AAOD,wBAAsB,cAAc,CAAC,EAAE,EAAE,OAAO,4BAO/C"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.permissionPdaFromAccount = permissionPdaFromAccount;
|
|
4
|
+
exports.groupPdaFromId = groupPdaFromId;
|
|
5
|
+
const kit_1 = require("@solana/kit");
|
|
6
|
+
const constants_1 = require("./constants");
|
|
7
|
+
const PERMISSION_SEED = Buffer.from("permission:");
|
|
8
|
+
const GROUP_SEED = Buffer.from("group:");
|
|
9
|
+
async function permissionPdaFromAccount(account) {
|
|
10
|
+
const addressEncoder = (0, kit_1.getAddressEncoder)();
|
|
11
|
+
const [permissionPda] = await (0, kit_1.getProgramDerivedAddress)({
|
|
12
|
+
programAddress: constants_1.PERMISSION_PROGRAM_ID,
|
|
13
|
+
seeds: [PERMISSION_SEED, addressEncoder.encode(account)],
|
|
14
|
+
});
|
|
15
|
+
return permissionPda;
|
|
16
|
+
}
|
|
17
|
+
async function groupPdaFromId(id) {
|
|
18
|
+
const addressEncoder = (0, kit_1.getAddressEncoder)();
|
|
19
|
+
const [groupPda] = await (0, kit_1.getProgramDerivedAddress)({
|
|
20
|
+
programAddress: constants_1.PERMISSION_PROGRAM_ID,
|
|
21
|
+
seeds: [GROUP_SEED, addressEncoder.encode(id)],
|
|
22
|
+
});
|
|
23
|
+
return groupPda;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=pda.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pda.js","sourceRoot":"","sources":["../../src/privacy/pda.ts"],"names":[],"mappings":";;AAeA,4DAOC;AAOD,wCAOC;AApCD,qCAIqB;AACrB,2CAAoD;AAEpD,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACnD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAOlC,KAAK,UAAU,wBAAwB,CAAC,OAAgB;IAC7D,MAAM,cAAc,GAAG,IAAA,uBAAiB,GAAE,CAAC;IAC3C,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,IAAA,8BAAwB,EAAC;QACrD,cAAc,EAAE,iCAAqB;QACrC,KAAK,EAAE,CAAC,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KACzD,CAAC,CAAC;IACH,OAAO,aAAa,CAAC;AACvB,CAAC;AAOM,KAAK,UAAU,cAAc,CAAC,EAAW;IAC9C,MAAM,cAAc,GAAG,IAAA,uBAAiB,GAAE,CAAC;IAC3C,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAA,8BAAwB,EAAC;QAChD,cAAc,EAAE,iCAAqB;QACrC,KAAK,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;KAC/C,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/privacy/verify.ts"],"names":[],"mappings":"AAcA,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4C5E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyTeeRpcIntegrity = verifyTeeRpcIntegrity;
|
|
4
|
+
async function verifyTeeRpcIntegrity(rpcUrl) {
|
|
5
|
+
const { default: init, js_get_collateral: jsGetCollateral, js_verify: jsVerify, } = await import("@phala/dcap-qvl-web");
|
|
6
|
+
const challengeBytes = Buffer.from(Uint8Array.from(Array(32)
|
|
7
|
+
.fill(0)
|
|
8
|
+
.map(() => Math.floor(Math.random() * 256))));
|
|
9
|
+
const challenge = challengeBytes.toString("base64");
|
|
10
|
+
const url = `${rpcUrl}/quote?challenge=${encodeURIComponent(challenge)}`;
|
|
11
|
+
const response = await fetch(url);
|
|
12
|
+
const responseBody = await response.json();
|
|
13
|
+
if (response.status !== 200 || !("quote" in responseBody)) {
|
|
14
|
+
throw new Error(responseBody.error ?? "Failed to get quote");
|
|
15
|
+
}
|
|
16
|
+
await init();
|
|
17
|
+
const rawQuote = Uint8Array.from(Buffer.from(responseBody.quote, "base64"));
|
|
18
|
+
const pccsUrl = "https://pccs.phala.network/tdx/certification/v4";
|
|
19
|
+
const quoteCollateral = await jsGetCollateral(pccsUrl, rawQuote);
|
|
20
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
21
|
+
try {
|
|
22
|
+
jsVerify(rawQuote, quoteCollateral, now);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/privacy/verify.ts"],"names":[],"mappings":";;AAcA,sDA4CC;AA5CM,KAAK,UAAU,qBAAqB,CAAC,MAAc;IAExD,MAAM,EACJ,OAAO,EAAE,IAAI,EACb,iBAAiB,EAAE,eAAe,EAClC,SAAS,EAAE,QAAQ,GACpB,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAExC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAChC,UAAU,CAAC,IAAI,CACb,KAAK,CAAC,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,CAAC;SACP,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAC9C,CACF,CAAC;IACF,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,GAAG,MAAM,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;IAEzE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,YAAY,GAAkC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE1E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,IAAI,YAAY,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAC;IAC/D,CAAC;IAGD,MAAM,IAAI,EAAE,CAAC;IAEb,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAG5E,MAAM,OAAO,GAAG,iDAAiD,CAAC;IAClE,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAGjE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAGlD,IAAI,CAAC;QACH,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Address, TransactionMessage, Rpc, SolanaRpcApiDevnet } from "@solana/kit";
|
|
2
|
+
export interface Configuration {
|
|
3
|
+
chain: string;
|
|
4
|
+
websocket: string;
|
|
5
|
+
}
|
|
6
|
+
declare enum DelegationStatus {
|
|
7
|
+
Delegated = 0,
|
|
8
|
+
Undelegated = 1
|
|
9
|
+
}
|
|
10
|
+
type DelegationRecord = {
|
|
11
|
+
status: DelegationStatus.Delegated;
|
|
12
|
+
validator: Address;
|
|
13
|
+
} | {
|
|
14
|
+
status: DelegationStatus.Undelegated;
|
|
15
|
+
};
|
|
16
|
+
export declare class Resolver {
|
|
17
|
+
private readonly routes;
|
|
18
|
+
private readonly delegations;
|
|
19
|
+
private readonly chain;
|
|
20
|
+
private readonly ws;
|
|
21
|
+
constructor(config: Configuration, routes: Map<string, string>);
|
|
22
|
+
trackAccount(pubkey: Address): Promise<DelegationRecord>;
|
|
23
|
+
resolve(pubkey: Address): Promise<Rpc<SolanaRpcApiDevnet> | undefined>;
|
|
24
|
+
resolveForTransaction(tx: TransactionMessage): Promise<Rpc<SolanaRpcApiDevnet> | undefined>;
|
|
25
|
+
private updateStatus;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAOP,kBAAkB,EAIlB,GAAG,EACH,kBAAkB,EAMnB,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,aAAa;IAE5B,KAAK,EAAE,MAAM,CAAC;IAEd,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,aAAK,gBAAgB;IACnB,SAAS,IAAA;IACT,WAAW,IAAA;CACZ;AAGD,KAAK,gBAAgB,GACjB;IAAE,MAAM,EAAE,gBAAgB,CAAC,SAAS,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAC1D;IAAE,MAAM,EAAE,gBAAgB,CAAC,WAAW,CAAA;CAAE,CAAC;AAG7C,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8C;IACrE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuC;IACnE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;IAChD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA8C;gBAErD,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAajD,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8CxD,OAAO,CAClB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC;IAelC,qBAAqB,CAChC,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC;IAoB/C,OAAO,CAAC,YAAY;CAuBrB"}
|
package/lib/resolver.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Resolver = void 0;
|
|
4
|
+
const kit_1 = require("@solana/kit");
|
|
5
|
+
const constants_js_1 = require("./constants.js");
|
|
6
|
+
var DelegationStatus;
|
|
7
|
+
(function (DelegationStatus) {
|
|
8
|
+
DelegationStatus[DelegationStatus["Delegated"] = 0] = "Delegated";
|
|
9
|
+
DelegationStatus[DelegationStatus["Undelegated"] = 1] = "Undelegated";
|
|
10
|
+
})(DelegationStatus || (DelegationStatus = {}));
|
|
11
|
+
class Resolver {
|
|
12
|
+
constructor(config, routes) {
|
|
13
|
+
this.routes = new Map();
|
|
14
|
+
this.delegations = new Map();
|
|
15
|
+
this.chain = (0, kit_1.createSolanaRpc)(config.chain);
|
|
16
|
+
this.ws = (0, kit_1.createSolanaRpcSubscriptions)(config.websocket);
|
|
17
|
+
this.routes = new Map([...routes.entries()].map(([k, v]) => [k, (0, kit_1.createSolanaRpc)(v)]));
|
|
18
|
+
}
|
|
19
|
+
async trackAccount(pubkey) {
|
|
20
|
+
const pubkeyStr = pubkey.toString();
|
|
21
|
+
if (this.delegations.has(pubkeyStr)) {
|
|
22
|
+
const record = this.delegations.get(pubkeyStr);
|
|
23
|
+
if (record !== undefined) {
|
|
24
|
+
return record;
|
|
25
|
+
}
|
|
26
|
+
throw new Error(`Expected a delegation record for ${pubkeyStr}, but found undefined.`);
|
|
27
|
+
}
|
|
28
|
+
const addressEncoder = (0, kit_1.getAddressEncoder)();
|
|
29
|
+
const [delegationRecord] = await (0, kit_1.getProgramDerivedAddress)({
|
|
30
|
+
programAddress: constants_js_1.DELEGATION_PROGRAM_ID,
|
|
31
|
+
seeds: [Buffer.from("delegation"), addressEncoder.encode(pubkey)],
|
|
32
|
+
});
|
|
33
|
+
const abortController = new AbortController();
|
|
34
|
+
const accountNotifications = await this.ws
|
|
35
|
+
.accountNotifications(delegationRecord, {
|
|
36
|
+
commitment: "confirmed",
|
|
37
|
+
encoding: "base64",
|
|
38
|
+
})
|
|
39
|
+
.subscribe({ abortSignal: abortController.signal });
|
|
40
|
+
for await (const accountNotification of accountNotifications) {
|
|
41
|
+
this.updateStatus(accountNotification.value, pubkey);
|
|
42
|
+
abortController.abort();
|
|
43
|
+
}
|
|
44
|
+
const accountInfo = await this.chain
|
|
45
|
+
.getAccountInfo(delegationRecord, {
|
|
46
|
+
commitment: "confirmed",
|
|
47
|
+
encoding: "base64",
|
|
48
|
+
})
|
|
49
|
+
.send();
|
|
50
|
+
return this.updateStatus(accountInfo.value, pubkey);
|
|
51
|
+
}
|
|
52
|
+
async resolve(pubkey) {
|
|
53
|
+
let record = this.delegations.get(pubkey);
|
|
54
|
+
if (!record) {
|
|
55
|
+
record = await this.trackAccount(pubkey);
|
|
56
|
+
}
|
|
57
|
+
return record.status === DelegationStatus.Delegated
|
|
58
|
+
? this.routes.get(record.validator)
|
|
59
|
+
: this.chain;
|
|
60
|
+
}
|
|
61
|
+
async resolveForTransaction(tx) {
|
|
62
|
+
const validators = new Set();
|
|
63
|
+
for (const account of tx.instructions.flatMap((i) => i.accounts)) {
|
|
64
|
+
if (!account)
|
|
65
|
+
continue;
|
|
66
|
+
const { address, role } = account;
|
|
67
|
+
if (role === kit_1.AccountRole.READONLY || role === kit_1.AccountRole.READONLY_SIGNER)
|
|
68
|
+
continue;
|
|
69
|
+
const record = await this.trackAccount(address);
|
|
70
|
+
if (record.status === DelegationStatus.Delegated) {
|
|
71
|
+
validators.add(record.validator.toString());
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const vs = [...validators];
|
|
75
|
+
return vs.length === 1
|
|
76
|
+
? this.routes.get(vs[0])
|
|
77
|
+
: validators.size === 0
|
|
78
|
+
? this.chain
|
|
79
|
+
: undefined;
|
|
80
|
+
}
|
|
81
|
+
updateStatus(account, pubkey) {
|
|
82
|
+
const isDelegated = account !== null &&
|
|
83
|
+
account.owner === constants_js_1.DELEGATION_PROGRAM_ID &&
|
|
84
|
+
account.lamports !== (0, kit_1.lamports)(BigInt(0));
|
|
85
|
+
const record = isDelegated
|
|
86
|
+
? {
|
|
87
|
+
status: DelegationStatus.Delegated,
|
|
88
|
+
validator: (() => {
|
|
89
|
+
const decodedData = delegationRecordCodec.decode(Buffer.from(account.data[0], "base64"));
|
|
90
|
+
return (0, kit_1.address)(decodedData.validator);
|
|
91
|
+
})(),
|
|
92
|
+
}
|
|
93
|
+
: { status: DelegationStatus.Undelegated };
|
|
94
|
+
this.delegations.set(pubkey.toString(), record);
|
|
95
|
+
return record;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.Resolver = Resolver;
|
|
99
|
+
const delegationRecordCodec = (0, kit_1.getStructCodec)([
|
|
100
|
+
["delegationStatus", (0, kit_1.getU8Codec)()],
|
|
101
|
+
["validator", (0, kit_1.getAddressCodec)()],
|
|
102
|
+
]);
|
|
103
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
|
package/lib/utils.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Signature, TransactionMessage } from "@solana/kit";
|
|
2
|
+
export declare function getWritableAccounts(transactionMessage: TransactionMessage): string[];
|
|
3
|
+
export declare function isRouter(clusterUrlHttp: string): Promise<boolean>;
|
|
4
|
+
export declare function parseScheduleCommitsLogsMessage(logMessages: readonly string[]): Signature | null;
|
|
5
|
+
export declare function parseCommitsLogsMessage(logMessages: readonly string[]): Signature | null;
|
|
6
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAQzE,wBAAgB,mBAAmB,CACjC,kBAAkB,EAAE,kBAAkB,GACrC,MAAM,EAAE,CAeV;AAQD,wBAAsB,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBvE;AAWD,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,SAAS,GAAG,IAAI,CAQlB;AAWD,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,SAAS,GAAG,IAAI,CAQlB"}
|
package/lib/utils.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getWritableAccounts = getWritableAccounts;
|
|
4
|
+
exports.isRouter = isRouter;
|
|
5
|
+
exports.parseScheduleCommitsLogsMessage = parseScheduleCommitsLogsMessage;
|
|
6
|
+
exports.parseCommitsLogsMessage = parseCommitsLogsMessage;
|
|
7
|
+
const kit_1 = require("@solana/kit");
|
|
8
|
+
function getWritableAccounts(transactionMessage) {
|
|
9
|
+
const writableAccounts = new Set();
|
|
10
|
+
for (const instruction of transactionMessage.instructions) {
|
|
11
|
+
if (instruction.accounts) {
|
|
12
|
+
for (const account of instruction.accounts) {
|
|
13
|
+
if (account.role === kit_1.AccountRole.WRITABLE ||
|
|
14
|
+
account.role === kit_1.AccountRole.WRITABLE_SIGNER) {
|
|
15
|
+
writableAccounts.add(account.address.toString());
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return Array.from(writableAccounts);
|
|
21
|
+
}
|
|
22
|
+
async function isRouter(clusterUrlHttp) {
|
|
23
|
+
const response = await fetch(clusterUrlHttp, {
|
|
24
|
+
method: "POST",
|
|
25
|
+
headers: { "Content-Type": "application/json" },
|
|
26
|
+
body: JSON.stringify({
|
|
27
|
+
jsonrpc: "2.0",
|
|
28
|
+
id: 1,
|
|
29
|
+
method: "getBlockhashForAccounts",
|
|
30
|
+
params: [[]],
|
|
31
|
+
}),
|
|
32
|
+
});
|
|
33
|
+
const { result } = (await response.json());
|
|
34
|
+
return (result != null &&
|
|
35
|
+
typeof result.blockhash === "string" &&
|
|
36
|
+
result.blockhash.length > 0);
|
|
37
|
+
}
|
|
38
|
+
function parseScheduleCommitsLogsMessage(logMessages) {
|
|
39
|
+
for (const message of logMessages) {
|
|
40
|
+
const signaturePrefix = "ScheduledCommitSent signature: ";
|
|
41
|
+
if (message.includes(signaturePrefix)) {
|
|
42
|
+
return message.split(signaturePrefix)[1];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
function parseCommitsLogsMessage(logMessages) {
|
|
48
|
+
for (const message of logMessages) {
|
|
49
|
+
const signaturePrefix = "ScheduledCommitSent signature[0]: ";
|
|
50
|
+
if (message.includes(signaturePrefix)) {
|
|
51
|
+
return message.split(signaturePrefix)[1];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=utils.js.map
|
package/lib/utils.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;AAQA,kDAiBC;AAQD,4BAqBC;AAWD,0EAUC;AAWD,0DAUC;AAhGD,qCAAyE;AAQzE,SAAgB,mBAAmB,CACjC,kBAAsC;IAEtC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,KAAK,MAAM,WAAW,IAAI,kBAAkB,CAAC,YAAY,EAAE,CAAC;QAC1D,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC3C,IACE,OAAO,CAAC,IAAI,KAAK,iBAAW,CAAC,QAAQ;oBACrC,OAAO,CAAC,IAAI,KAAK,iBAAW,CAAC,eAAe,EAC5C,CAAC;oBACD,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC;AAQM,KAAK,UAAU,QAAQ,CAAC,cAAsB;IACnD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE;QAC3C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,yBAAyB;YACjC,MAAM,EAAE,CAAC,EAAE,CAAC;SACb,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAExC,CAAC;IAEF,OAAO,CACL,MAAM,IAAI,IAAI;QACd,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACpC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAC5B,CAAC;AACJ,CAAC;AAWD,SAAgB,+BAA+B,CAC7C,WAA8B;IAE9B,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,eAAe,GAAG,iCAAiC,CAAC;QAC1D,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACtC,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAc,CAAC;QACxD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAWD,SAAgB,uBAAuB,CACrC,WAA8B;IAE9B,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,eAAe,GAAG,oCAAoC,CAAC;QAC7D,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACtC,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAc,CAAC;QACxD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|