@telaro/sacp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INTEGRATION.md +238 -0
- package/README.md +253 -0
- package/dist/codec.d.ts +35 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +63 -0
- package/dist/codec.js.map +1 -0
- package/dist/constants.d.ts +50 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +50 -0
- package/dist/constants.js.map +1 -0
- package/dist/dispatcher.d.ts +87 -0
- package/dist/dispatcher.d.ts.map +1 -0
- package/dist/dispatcher.js +175 -0
- package/dist/dispatcher.js.map +1 -0
- package/dist/events.d.ts +93 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +142 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/job.d.ts +99 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +297 -0
- package/dist/job.js.map +1 -0
- package/dist/lst.d.ts +52 -0
- package/dist/lst.d.ts.map +1 -0
- package/dist/lst.js +58 -0
- package/dist/lst.js.map +1 -0
- package/dist/negotiation.d.ts +66 -0
- package/dist/negotiation.d.ts.map +1 -0
- package/dist/negotiation.js +184 -0
- package/dist/negotiation.js.map +1 -0
- package/dist/offering.d.ts +65 -0
- package/dist/offering.d.ts.map +1 -0
- package/dist/offering.js +190 -0
- package/dist/offering.js.map +1 -0
- package/dist/pdas.d.ts +44 -0
- package/dist/pdas.d.ts.map +1 -0
- package/dist/pdas.js +95 -0
- package/dist/pdas.js.map +1 -0
- package/dist/runtime.d.ts +244 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +481 -0
- package/dist/runtime.js.map +1 -0
- package/dist/signer.d.ts +107 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +94 -0
- package/dist/signer.js.map +1 -0
- package/dist/take_rate.d.ts +44 -0
- package/dist/take_rate.d.ts.map +1 -0
- package/dist/take_rate.js +141 -0
- package/dist/take_rate.js.map +1 -0
- package/dist/timeout.d.ts +35 -0
- package/dist/timeout.d.ts.map +1 -0
- package/dist/timeout.js +113 -0
- package/dist/timeout.js.map +1 -0
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +133 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +315 -0
- package/dist/validation.js.map +1 -0
- package/dist/watcher.d.ts +67 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +176 -0
- package/dist/watcher.js.map +1 -0
- package/dist/wormhole.d.ts +88 -0
- package/dist/wormhole.d.ts.map +1 -0
- package/dist/wormhole.js +152 -0
- package/dist/wormhole.js.map +1 -0
- package/package.json +138 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"negotiation.d.ts","sourceRoot":"","sources":["../src/negotiation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EAGT,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AA2CzB,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AAU/E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,sBAAsB,CAAC;IAC3B,cAAc,EAAE,SAAS,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,kBAAkB,GACzB,uBAAuB,CA4BzB;AAID,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,kBAAkB,GACzB,sBAAsB,CAmBxB;AAID,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,sBAAsB,CAWzB;AAID,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,sBAAsB,CAYzB;AAID,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,sBAAsB,CAAC;IAC3B,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,SAAS,CAAC;CAC3B;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,oBAAoB,GAC3B,yBAAyB,CAuB3B;AAID,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;IAChC,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,EAAE,SAAS,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAqED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAKpC"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { PublicKey, SYSVAR_RENT_PUBKEY, SystemProgram, TransactionInstruction, } from "@solana/web3.js";
|
|
2
|
+
import { encodeI64, encodeInstruction, encodeString, encodeU64, } from "./codec.js";
|
|
3
|
+
import { SACP_PROGRAM_ID } from "./constants.js";
|
|
4
|
+
import { findEscrowPda, findEscrowVaultPda, findJobPda, findNegotiationPda, } from "./pdas.js";
|
|
5
|
+
/**
|
|
6
|
+
* v1.0 Phase 8 — Negotiation phase.
|
|
7
|
+
*
|
|
8
|
+
* Replaces the v0.x assumption that the buyer dictates Job terms in
|
|
9
|
+
* one shot. A Negotiation is a separate PDA that tracks proposed +
|
|
10
|
+
* countered terms between buyer and provider. Either side can counter
|
|
11
|
+
* back-and-forth; whichever side did NOT propose last is the only one
|
|
12
|
+
* eligible to accept. Once Accepted, the buyer calls `materialize_job`
|
|
13
|
+
* to lift the negotiation into a real Job + escrow vault.
|
|
14
|
+
*
|
|
15
|
+
* State machine (NegotiationState):
|
|
16
|
+
* Open = 0 (buyer proposed, awaiting provider)
|
|
17
|
+
* Countered = 1 (provider countered, awaiting buyer)
|
|
18
|
+
* Accepted = 2 (both sides committed; ready to materialize)
|
|
19
|
+
* Cancelled = 3
|
|
20
|
+
*
|
|
21
|
+
* The legacy `create_job` flow is untouched — callers that don't need
|
|
22
|
+
* negotiation can keep using it. This module exists for the path that
|
|
23
|
+
* does.
|
|
24
|
+
*/
|
|
25
|
+
const SPL_TOKEN_PROGRAM_ID = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
|
|
26
|
+
const SPL_ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL");
|
|
27
|
+
const NEGOTIATION_STATE_NUMERIC = {
|
|
28
|
+
Open: 0,
|
|
29
|
+
Countered: 1,
|
|
30
|
+
Accepted: 2,
|
|
31
|
+
Cancelled: 3,
|
|
32
|
+
};
|
|
33
|
+
export function buildProposeTermsIx(params) {
|
|
34
|
+
if (Buffer.byteLength(params.workUri, "utf8") > 256) {
|
|
35
|
+
throw new Error("workUri exceeds 256 bytes");
|
|
36
|
+
}
|
|
37
|
+
const [negotiationPda] = findNegotiationPda(params.buyer, params.negotiationId);
|
|
38
|
+
const data = encodeInstruction("propose_terms", encodeU64(params.negotiationId), encodeU64(params.amount), encodeString(params.workUri), encodeI64(params.submitWindowSecs));
|
|
39
|
+
const ix = new TransactionInstruction({
|
|
40
|
+
programId: SACP_PROGRAM_ID,
|
|
41
|
+
keys: [
|
|
42
|
+
{ pubkey: params.buyer, isSigner: true, isWritable: true },
|
|
43
|
+
{ pubkey: params.provider, isSigner: false, isWritable: false },
|
|
44
|
+
{ pubkey: params.evaluator, isSigner: false, isWritable: false },
|
|
45
|
+
{ pubkey: params.bondMint, isSigner: false, isWritable: false },
|
|
46
|
+
{ pubkey: negotiationPda, isSigner: false, isWritable: true },
|
|
47
|
+
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
|
|
48
|
+
],
|
|
49
|
+
data,
|
|
50
|
+
});
|
|
51
|
+
return { ix, negotiationPda };
|
|
52
|
+
}
|
|
53
|
+
export function buildCounterTermsIx(params) {
|
|
54
|
+
if (Buffer.byteLength(params.workUri, "utf8") > 256) {
|
|
55
|
+
throw new Error("workUri exceeds 256 bytes");
|
|
56
|
+
}
|
|
57
|
+
const [negotiationPda] = findNegotiationPda(params.buyer, params.negotiationId);
|
|
58
|
+
const data = encodeInstruction("counter_terms", encodeU64(params.amount), encodeString(params.workUri), encodeI64(params.submitWindowSecs));
|
|
59
|
+
return new TransactionInstruction({
|
|
60
|
+
programId: SACP_PROGRAM_ID,
|
|
61
|
+
keys: [
|
|
62
|
+
{ pubkey: params.signer, isSigner: true, isWritable: false },
|
|
63
|
+
{ pubkey: negotiationPda, isSigner: false, isWritable: true },
|
|
64
|
+
],
|
|
65
|
+
data,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/* ─── builder: accept_terms ──────────────────────────────────────── */
|
|
69
|
+
export function buildAcceptTermsIx(params) {
|
|
70
|
+
const [negotiationPda] = findNegotiationPda(params.buyer, params.negotiationId);
|
|
71
|
+
const data = encodeInstruction("accept_terms");
|
|
72
|
+
return new TransactionInstruction({
|
|
73
|
+
programId: SACP_PROGRAM_ID,
|
|
74
|
+
keys: [
|
|
75
|
+
{ pubkey: params.signer, isSigner: true, isWritable: false },
|
|
76
|
+
{ pubkey: negotiationPda, isSigner: false, isWritable: true },
|
|
77
|
+
],
|
|
78
|
+
data,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/* ─── builder: cancel_negotiation ────────────────────────────────── */
|
|
82
|
+
export function buildCancelNegotiationIx(params) {
|
|
83
|
+
const [negotiationPda] = findNegotiationPda(params.buyer, params.negotiationId);
|
|
84
|
+
const data = encodeInstruction("cancel_negotiation");
|
|
85
|
+
return new TransactionInstruction({
|
|
86
|
+
programId: SACP_PROGRAM_ID,
|
|
87
|
+
keys: [
|
|
88
|
+
{ pubkey: params.signer, isSigner: true, isWritable: true },
|
|
89
|
+
{ pubkey: params.buyer, isSigner: false, isWritable: true },
|
|
90
|
+
{ pubkey: negotiationPda, isSigner: false, isWritable: true },
|
|
91
|
+
],
|
|
92
|
+
data,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
export function buildMaterializeJobIx(params) {
|
|
96
|
+
const [negotiationPda] = findNegotiationPda(params.buyer, params.negotiationId);
|
|
97
|
+
const [jobPda] = findJobPda(params.jobId);
|
|
98
|
+
const [escrowPda] = findEscrowPda(params.jobId);
|
|
99
|
+
const [escrowVaultPda] = findEscrowVaultPda(params.jobId);
|
|
100
|
+
const data = encodeInstruction("materialize_job", encodeU64(params.jobId));
|
|
101
|
+
const ix = new TransactionInstruction({
|
|
102
|
+
programId: SACP_PROGRAM_ID,
|
|
103
|
+
keys: [
|
|
104
|
+
{ pubkey: params.buyer, isSigner: true, isWritable: true },
|
|
105
|
+
{ pubkey: params.bondMint, isSigner: false, isWritable: false },
|
|
106
|
+
{ pubkey: negotiationPda, isSigner: false, isWritable: true },
|
|
107
|
+
{ pubkey: jobPda, isSigner: false, isWritable: true },
|
|
108
|
+
{ pubkey: escrowPda, isSigner: false, isWritable: false },
|
|
109
|
+
{ pubkey: escrowVaultPda, isSigner: false, isWritable: true },
|
|
110
|
+
{ pubkey: SPL_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
|
|
111
|
+
{ pubkey: SPL_ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
|
|
112
|
+
{ pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false },
|
|
113
|
+
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
|
|
114
|
+
],
|
|
115
|
+
data,
|
|
116
|
+
});
|
|
117
|
+
return { ix, jobPda, escrowPda, escrowVaultPda };
|
|
118
|
+
}
|
|
119
|
+
function parseNegotiationFromBuffer(pda, data) {
|
|
120
|
+
let offset = 8;
|
|
121
|
+
const readPubkey = () => {
|
|
122
|
+
const pk = new PublicKey(data.subarray(offset, offset + 32));
|
|
123
|
+
offset += 32;
|
|
124
|
+
return pk;
|
|
125
|
+
};
|
|
126
|
+
const readU64 = () => {
|
|
127
|
+
const v = data.readBigUInt64LE(offset);
|
|
128
|
+
offset += 8;
|
|
129
|
+
return v;
|
|
130
|
+
};
|
|
131
|
+
const readI64 = () => {
|
|
132
|
+
const v = data.readBigInt64LE(offset);
|
|
133
|
+
offset += 8;
|
|
134
|
+
return v;
|
|
135
|
+
};
|
|
136
|
+
const readString = () => {
|
|
137
|
+
const len = data.readUInt32LE(offset);
|
|
138
|
+
offset += 4;
|
|
139
|
+
const s = data.subarray(offset, offset + len).toString("utf8");
|
|
140
|
+
offset += len;
|
|
141
|
+
return s;
|
|
142
|
+
};
|
|
143
|
+
const readU8 = () => {
|
|
144
|
+
const v = data.readUInt8(offset);
|
|
145
|
+
offset += 1;
|
|
146
|
+
return v;
|
|
147
|
+
};
|
|
148
|
+
const buyer = readPubkey();
|
|
149
|
+
const provider = readPubkey();
|
|
150
|
+
const evaluator = readPubkey();
|
|
151
|
+
const bondMint = readPubkey();
|
|
152
|
+
const negotiationId = readU64();
|
|
153
|
+
const currentAmount = readU64();
|
|
154
|
+
const currentWorkUri = readString();
|
|
155
|
+
const currentSubmitWindowSecs = readI64();
|
|
156
|
+
const stateByte = readU8();
|
|
157
|
+
const lastProposer = readPubkey();
|
|
158
|
+
const createdAt = readI64();
|
|
159
|
+
const updatedAt = readI64();
|
|
160
|
+
const state = (Object.entries(NEGOTIATION_STATE_NUMERIC).find(([, v]) => v === stateByte)?.[0] ?? "Open");
|
|
161
|
+
return {
|
|
162
|
+
pda,
|
|
163
|
+
buyer,
|
|
164
|
+
provider,
|
|
165
|
+
evaluator,
|
|
166
|
+
bondMint,
|
|
167
|
+
negotiationId,
|
|
168
|
+
currentAmount,
|
|
169
|
+
currentWorkUri,
|
|
170
|
+
currentSubmitWindowSecs,
|
|
171
|
+
state,
|
|
172
|
+
lastProposer,
|
|
173
|
+
createdAt,
|
|
174
|
+
updatedAt,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export async function fetchNegotiation(connection, buyer, negotiationId) {
|
|
178
|
+
const [pda] = findNegotiationPda(buyer, negotiationId);
|
|
179
|
+
const info = await connection.getAccountInfo(pda, "confirmed");
|
|
180
|
+
if (!info)
|
|
181
|
+
return null;
|
|
182
|
+
return parseNegotiationFromBuffer(pda, info.data);
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=negotiation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"negotiation.js","sourceRoot":"","sources":["../src/negotiation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Connection, PublicKey, TransactionInstruction } from "@solana/web3.js";
|
|
2
|
+
export interface RegisterOfferingParams {
|
|
3
|
+
provider: PublicKey;
|
|
4
|
+
defaultEvaluator: PublicKey;
|
|
5
|
+
bondMint: PublicKey;
|
|
6
|
+
slotId: number;
|
|
7
|
+
category: number;
|
|
8
|
+
pricePerUnit: bigint;
|
|
9
|
+
minAmount: bigint;
|
|
10
|
+
maxAmount: bigint;
|
|
11
|
+
metadataUri: string;
|
|
12
|
+
}
|
|
13
|
+
export interface RegisterOfferingBuildResult {
|
|
14
|
+
ix: TransactionInstruction;
|
|
15
|
+
offeringPda: PublicKey;
|
|
16
|
+
}
|
|
17
|
+
export declare function buildRegisterOfferingIx(params: RegisterOfferingParams): RegisterOfferingBuildResult;
|
|
18
|
+
export interface UpdateOfferingParams {
|
|
19
|
+
provider: PublicKey;
|
|
20
|
+
slotId: number;
|
|
21
|
+
pricePerUnit: bigint;
|
|
22
|
+
minAmount: bigint;
|
|
23
|
+
maxAmount: bigint;
|
|
24
|
+
metadataUri: string;
|
|
25
|
+
active: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function buildUpdateOfferingIx(params: UpdateOfferingParams): TransactionInstruction;
|
|
28
|
+
export declare function buildCloseOfferingIx(params: {
|
|
29
|
+
provider: PublicKey;
|
|
30
|
+
slotId: number;
|
|
31
|
+
}): TransactionInstruction;
|
|
32
|
+
export interface FetchedOffering {
|
|
33
|
+
pda: PublicKey;
|
|
34
|
+
provider: PublicKey;
|
|
35
|
+
defaultEvaluator: PublicKey;
|
|
36
|
+
bondMint: PublicKey;
|
|
37
|
+
slotId: number;
|
|
38
|
+
category: number;
|
|
39
|
+
pricePerUnit: bigint;
|
|
40
|
+
minAmount: bigint;
|
|
41
|
+
maxAmount: bigint;
|
|
42
|
+
metadataUri: string;
|
|
43
|
+
active: boolean;
|
|
44
|
+
createdAt: bigint;
|
|
45
|
+
updatedAt: bigint;
|
|
46
|
+
}
|
|
47
|
+
export declare function fetchOffering(connection: Connection, provider: PublicKey, slotId: number): Promise<FetchedOffering | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Browse Offerings by an optional set of filters. Uses
|
|
50
|
+
* `getProgramAccounts` with memcmp filters when the field permits
|
|
51
|
+
* (provider / bond_mint), otherwise filters post-fetch.
|
|
52
|
+
*
|
|
53
|
+
* Field offsets in the Offering account:
|
|
54
|
+
* discriminator(8) | provider(32) | default_evaluator(32) | bond_mint(32) | slot_id(4) | category(1) | price_per_unit(8) | min_amount(8) | max_amount(8) | metadata_uri(4+N) | active(1) | created_at(8) | updated_at(8) | bump(1)
|
|
55
|
+
*
|
|
56
|
+
* provider sits at offset 8, bond_mint at 72, category at 76.
|
|
57
|
+
*/
|
|
58
|
+
export declare function listOfferings(connection: Connection, filter?: {
|
|
59
|
+
provider?: PublicKey;
|
|
60
|
+
bondMint?: PublicKey;
|
|
61
|
+
category?: number;
|
|
62
|
+
onlyActive?: boolean;
|
|
63
|
+
maxPrice?: bigint;
|
|
64
|
+
}): Promise<FetchedOffering[]>;
|
|
65
|
+
//# sourceMappingURL=offering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offering.d.ts","sourceRoot":"","sources":["../src/offering.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EAET,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAoCzB,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,SAAS,CAAC;IACpB,gBAAgB,EAAE,SAAS,CAAC;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,sBAAsB,CAAC;IAC3B,WAAW,EAAE,SAAS,CAAC;CACxB;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,sBAAsB,GAC7B,2BAA2B,CA6B7B;AAID,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,oBAAoB,GAC3B,sBAAsB,CAkBxB;AAID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,sBAAsB,CAWzB;AAID,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;IACpB,gBAAgB,EAAE,SAAS,CAAC;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAoED,wBAAsB,aAAa,CACjC,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,SAAS,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAKjC;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,UAAU,EACtB,MAAM,CAAC,EAAE;IACP,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,eAAe,EAAE,CAAC,CAiC5B"}
|
package/dist/offering.js
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { PublicKey, SystemProgram, TransactionInstruction, } from "@solana/web3.js";
|
|
2
|
+
import { encodeInstruction, encodeString, encodeU8, encodeU64, } from "./codec.js";
|
|
3
|
+
import { SACP_PROGRAM_ID } from "./constants.js";
|
|
4
|
+
import { findOfferingPda } from "./pdas.js";
|
|
5
|
+
/**
|
|
6
|
+
* v0.9 — Offering registry.
|
|
7
|
+
*
|
|
8
|
+
* A provider registers one or more Offerings (PDA per slot_id) that
|
|
9
|
+
* describe what they do, in what price band, in what bond mint, and
|
|
10
|
+
* which evaluator they trust by default. Buyers browse Offerings and
|
|
11
|
+
* use `createJobFromOffering` (SDK helper) to spin up a Job with
|
|
12
|
+
* those terms.
|
|
13
|
+
*
|
|
14
|
+
* Layout matches `Offering` in programs/sacp_job/src/lib.rs.
|
|
15
|
+
*
|
|
16
|
+
* Wire-level: hand-rolled Borsh — no IDL dependency, same pattern as
|
|
17
|
+
* the rest of @telaro/sacp.
|
|
18
|
+
*/
|
|
19
|
+
function encodeU32(value) {
|
|
20
|
+
const buf = Buffer.alloc(4);
|
|
21
|
+
buf.writeUInt32LE(value);
|
|
22
|
+
return buf;
|
|
23
|
+
}
|
|
24
|
+
function encodeBool(value) {
|
|
25
|
+
return Buffer.from([value ? 1 : 0]);
|
|
26
|
+
}
|
|
27
|
+
export function buildRegisterOfferingIx(params) {
|
|
28
|
+
if (params.minAmount > params.maxAmount) {
|
|
29
|
+
throw new Error("minAmount must be ≤ maxAmount");
|
|
30
|
+
}
|
|
31
|
+
if (Buffer.byteLength(params.metadataUri, "utf8") > 256) {
|
|
32
|
+
throw new Error("metadataUri exceeds 256 bytes");
|
|
33
|
+
}
|
|
34
|
+
const [offeringPda] = findOfferingPda(params.provider, params.slotId);
|
|
35
|
+
const data = encodeInstruction("register_offering", encodeU32(params.slotId), encodeU8(params.category), encodeU64(params.pricePerUnit), encodeU64(params.minAmount), encodeU64(params.maxAmount), encodeString(params.metadataUri));
|
|
36
|
+
const ix = new TransactionInstruction({
|
|
37
|
+
programId: SACP_PROGRAM_ID,
|
|
38
|
+
keys: [
|
|
39
|
+
{ pubkey: params.provider, isSigner: true, isWritable: true },
|
|
40
|
+
{ pubkey: params.defaultEvaluator, isSigner: false, isWritable: false },
|
|
41
|
+
{ pubkey: params.bondMint, isSigner: false, isWritable: false },
|
|
42
|
+
{ pubkey: offeringPda, isSigner: false, isWritable: true },
|
|
43
|
+
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
|
|
44
|
+
],
|
|
45
|
+
data,
|
|
46
|
+
});
|
|
47
|
+
return { ix, offeringPda };
|
|
48
|
+
}
|
|
49
|
+
export function buildUpdateOfferingIx(params) {
|
|
50
|
+
const [offeringPda] = findOfferingPda(params.provider, params.slotId);
|
|
51
|
+
const data = encodeInstruction("update_offering", encodeU64(params.pricePerUnit), encodeU64(params.minAmount), encodeU64(params.maxAmount), encodeString(params.metadataUri), encodeBool(params.active));
|
|
52
|
+
return new TransactionInstruction({
|
|
53
|
+
programId: SACP_PROGRAM_ID,
|
|
54
|
+
keys: [
|
|
55
|
+
{ pubkey: params.provider, isSigner: true, isWritable: false },
|
|
56
|
+
{ pubkey: offeringPda, isSigner: false, isWritable: true },
|
|
57
|
+
],
|
|
58
|
+
data,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/* ─── builder: close_offering ──────────────────────────────────────── */
|
|
62
|
+
export function buildCloseOfferingIx(params) {
|
|
63
|
+
const [offeringPda] = findOfferingPda(params.provider, params.slotId);
|
|
64
|
+
const data = encodeInstruction("close_offering");
|
|
65
|
+
return new TransactionInstruction({
|
|
66
|
+
programId: SACP_PROGRAM_ID,
|
|
67
|
+
keys: [
|
|
68
|
+
{ pubkey: params.provider, isSigner: true, isWritable: true },
|
|
69
|
+
{ pubkey: offeringPda, isSigner: false, isWritable: true },
|
|
70
|
+
],
|
|
71
|
+
data,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function parseOfferingFromBuffer(pda, data) {
|
|
75
|
+
let offset = 8;
|
|
76
|
+
const readPubkey = () => {
|
|
77
|
+
const pk = new PublicKey(data.subarray(offset, offset + 32));
|
|
78
|
+
offset += 32;
|
|
79
|
+
return pk;
|
|
80
|
+
};
|
|
81
|
+
const readU64 = () => {
|
|
82
|
+
const v = data.readBigUInt64LE(offset);
|
|
83
|
+
offset += 8;
|
|
84
|
+
return v;
|
|
85
|
+
};
|
|
86
|
+
const readI64 = () => {
|
|
87
|
+
const v = data.readBigInt64LE(offset);
|
|
88
|
+
offset += 8;
|
|
89
|
+
return v;
|
|
90
|
+
};
|
|
91
|
+
const readU32 = () => {
|
|
92
|
+
const v = data.readUInt32LE(offset);
|
|
93
|
+
offset += 4;
|
|
94
|
+
return v;
|
|
95
|
+
};
|
|
96
|
+
const readU8 = () => {
|
|
97
|
+
const v = data.readUInt8(offset);
|
|
98
|
+
offset += 1;
|
|
99
|
+
return v;
|
|
100
|
+
};
|
|
101
|
+
const readString = () => {
|
|
102
|
+
const len = data.readUInt32LE(offset);
|
|
103
|
+
offset += 4;
|
|
104
|
+
const s = data.subarray(offset, offset + len).toString("utf8");
|
|
105
|
+
offset += len;
|
|
106
|
+
return s;
|
|
107
|
+
};
|
|
108
|
+
const readBool = () => readU8() !== 0;
|
|
109
|
+
const provider = readPubkey();
|
|
110
|
+
const defaultEvaluator = readPubkey();
|
|
111
|
+
const bondMint = readPubkey();
|
|
112
|
+
const slotId = readU32();
|
|
113
|
+
const category = readU8();
|
|
114
|
+
const pricePerUnit = readU64();
|
|
115
|
+
const minAmount = readU64();
|
|
116
|
+
const maxAmount = readU64();
|
|
117
|
+
const metadataUri = readString();
|
|
118
|
+
const active = readBool();
|
|
119
|
+
const createdAt = readI64();
|
|
120
|
+
const updatedAt = readI64();
|
|
121
|
+
return {
|
|
122
|
+
pda,
|
|
123
|
+
provider,
|
|
124
|
+
defaultEvaluator,
|
|
125
|
+
bondMint,
|
|
126
|
+
slotId,
|
|
127
|
+
category,
|
|
128
|
+
pricePerUnit,
|
|
129
|
+
minAmount,
|
|
130
|
+
maxAmount,
|
|
131
|
+
metadataUri,
|
|
132
|
+
active,
|
|
133
|
+
createdAt,
|
|
134
|
+
updatedAt,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
export async function fetchOffering(connection, provider, slotId) {
|
|
138
|
+
const [pda] = findOfferingPda(provider, slotId);
|
|
139
|
+
const info = await connection.getAccountInfo(pda, "confirmed");
|
|
140
|
+
if (!info)
|
|
141
|
+
return null;
|
|
142
|
+
return parseOfferingFromBuffer(pda, info.data);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Browse Offerings by an optional set of filters. Uses
|
|
146
|
+
* `getProgramAccounts` with memcmp filters when the field permits
|
|
147
|
+
* (provider / bond_mint), otherwise filters post-fetch.
|
|
148
|
+
*
|
|
149
|
+
* Field offsets in the Offering account:
|
|
150
|
+
* discriminator(8) | provider(32) | default_evaluator(32) | bond_mint(32) | slot_id(4) | category(1) | price_per_unit(8) | min_amount(8) | max_amount(8) | metadata_uri(4+N) | active(1) | created_at(8) | updated_at(8) | bump(1)
|
|
151
|
+
*
|
|
152
|
+
* provider sits at offset 8, bond_mint at 72, category at 76.
|
|
153
|
+
*/
|
|
154
|
+
export async function listOfferings(connection, filter) {
|
|
155
|
+
const filters = [];
|
|
156
|
+
if (filter?.provider) {
|
|
157
|
+
filters.push({
|
|
158
|
+
memcmp: { offset: 8, bytes: filter.provider.toBase58() },
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if (filter?.bondMint) {
|
|
162
|
+
filters.push({
|
|
163
|
+
memcmp: { offset: 72, bytes: filter.bondMint.toBase58() },
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
const accounts = await connection.getProgramAccounts(SACP_PROGRAM_ID, {
|
|
167
|
+
commitment: "confirmed",
|
|
168
|
+
filters,
|
|
169
|
+
});
|
|
170
|
+
const out = [];
|
|
171
|
+
for (const { pubkey, account } of accounts) {
|
|
172
|
+
try {
|
|
173
|
+
const off = parseOfferingFromBuffer(pubkey, account.data);
|
|
174
|
+
if (filter?.category !== undefined && off.category !== filter.category) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (filter?.onlyActive && !off.active)
|
|
178
|
+
continue;
|
|
179
|
+
if (filter?.maxPrice !== undefined && off.pricePerUnit > filter.maxPrice) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
out.push(off);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Discriminator mismatch — not an Offering account.
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return out;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=offering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offering.js","sourceRoot":"","sources":["../src/offering.ts"],"names":[],"mappings":"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"}
|
package/dist/pdas.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { PublicKey } from "@solana/web3.js";
|
|
2
|
+
export declare function findJobPda(jobId: bigint): [PublicKey, number];
|
|
3
|
+
/**
|
|
4
|
+
* Escrow authority PDA. PDA-only — does not hold tokens itself, only
|
|
5
|
+
* signs as the owner of the `EscrowVault` TokenAccount.
|
|
6
|
+
*/
|
|
7
|
+
export declare function findEscrowPda(jobId: bigint): [PublicKey, number];
|
|
8
|
+
/**
|
|
9
|
+
* Escrow vault — the actual SPL Token account holding the Job's funds.
|
|
10
|
+
* Owned by the `Escrow` authority PDA above.
|
|
11
|
+
*/
|
|
12
|
+
export declare function findEscrowVaultPda(jobId: bigint): [PublicKey, number];
|
|
13
|
+
export declare function findSubmissionPda(jobId: bigint): [PublicKey, number];
|
|
14
|
+
export declare function findVerdictPda(jobId: bigint): [PublicKey, number];
|
|
15
|
+
/**
|
|
16
|
+
* Protocol Config PDA. Holds the take-rate policy and the
|
|
17
|
+
* authority that can update it or withdraw from the per-mint Treasury
|
|
18
|
+
* ATAs. Doubles as the Treasury ATAs' owner — there is no separate
|
|
19
|
+
* "treasury authority" PDA on the Job side.
|
|
20
|
+
*/
|
|
21
|
+
export declare function findSacpConfigPda(): [PublicKey, number];
|
|
22
|
+
/** v0.9: Provider's per-slot Offering PDA. `slotId` is u32 little-endian. */
|
|
23
|
+
export declare function findOfferingPda(provider: PublicKey, slotId: number): [PublicKey, number];
|
|
24
|
+
/** v1.0 Phase 8: Negotiation PDA. `negotiationId` is u64 little-endian. */
|
|
25
|
+
export declare function findNegotiationPda(buyer: PublicKey, negotiationId: bigint): [PublicKey, number];
|
|
26
|
+
export declare function findValidatorPda(authority: PublicKey): [PublicKey, number];
|
|
27
|
+
export declare function findBondPda(validator: PublicKey): [PublicKey, number];
|
|
28
|
+
/** PDA that signs as authority over the bond vault TokenAccount. */
|
|
29
|
+
export declare function findBondAuthorityPda(validatorAuthority: PublicKey): [PublicKey, number];
|
|
30
|
+
/** Bond vault — the SPL Token account holding the validator's stake. */
|
|
31
|
+
export declare function findBondVaultPda(validatorAuthority: PublicKey): [PublicKey, number];
|
|
32
|
+
export declare function findChallengePda(jobId: bigint): [PublicKey, number];
|
|
33
|
+
/** Program-owned treasury authority — single PDA, controls every per-mint vault. */
|
|
34
|
+
export declare function findTreasuryAuthorityPda(): [PublicKey, number];
|
|
35
|
+
/** Canonical per-mint treasury vault. Receives 30% of every slash. */
|
|
36
|
+
export declare function findTreasuryVaultPda(bondMint: PublicKey): [PublicKey, number];
|
|
37
|
+
/**
|
|
38
|
+
* Resolver Config PDA. Holds the authority that can call
|
|
39
|
+
* `resolve_challenge`. Pre-v0.7 deployments must run
|
|
40
|
+
* `init_resolver_config` immediately after upgrade — until then the
|
|
41
|
+
* validation program rejects every resolution attempt.
|
|
42
|
+
*/
|
|
43
|
+
export declare function findResolverConfigPda(): [PublicKey, number];
|
|
44
|
+
//# sourceMappingURL=pdas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdas.d.ts","sourceRoot":"","sources":["../src/pdas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAwC5C,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAK7D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKhE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKpE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKjE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAKvD;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,SAAS,EACnB,MAAM,EAAE,MAAM,GACb,CAAC,SAAS,EAAE,MAAM,CAAC,CAOrB;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,MAAM,GACpB,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAK1E;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrE;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAClC,kBAAkB,EAAE,SAAS,GAC5B,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAC9B,kBAAkB,EAAE,SAAS,GAC5B,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKnE;AAED,oFAAoF;AACpF,wBAAgB,wBAAwB,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAK9D;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,SAAS,GAClB,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAK3D"}
|
package/dist/pdas.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { PublicKey } from "@solana/web3.js";
|
|
2
|
+
import { BOND_AUTHORITY_SEED_PREFIX, BOND_SEED_PREFIX, BOND_VAULT_SEED_PREFIX, CHALLENGE_SEED_PREFIX, CONFIG_SEED_PREFIX, NEGOTIATION_SEED_PREFIX, OFFERING_SEED_PREFIX, ESCROW_SEED_PREFIX, ESCROW_VAULT_SEED_PREFIX, JOB_SEED_PREFIX, RESOLVER_CONFIG_SEED_PREFIX, SACP_PROGRAM_ID, SACP_VALIDATION_PROGRAM_ID, SUBMISSION_SEED_PREFIX, TREASURY_AUTHORITY_SEED_PREFIX, TREASURY_VAULT_SEED_PREFIX, VALIDATOR_SEED_PREFIX, VERDICT_SEED_PREFIX, } from "./constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* Deterministic PDA derivations matching SRFC v0.1 §"PDA layout".
|
|
5
|
+
*
|
|
6
|
+
* All Job-side PDAs are keyed by `jobId` (u64) so the spec is opinion-
|
|
7
|
+
* agnostic about who allocates IDs — we recommend a monotonic counter
|
|
8
|
+
* held by the Client (e.g. `Date.now() * 1000 + nonce`). The PDAs
|
|
9
|
+
* never collide between programs because the seed namespace differs.
|
|
10
|
+
*
|
|
11
|
+
* v0.1 helpers are sync because they only call `PublicKey.findProgramAddressSync`,
|
|
12
|
+
* which is a pure derivation. No I/O.
|
|
13
|
+
*/
|
|
14
|
+
function u64Bytes(n) {
|
|
15
|
+
const buf = Buffer.alloc(8);
|
|
16
|
+
buf.writeBigUInt64LE(n);
|
|
17
|
+
return buf;
|
|
18
|
+
}
|
|
19
|
+
export function findJobPda(jobId) {
|
|
20
|
+
return PublicKey.findProgramAddressSync([Buffer.from(JOB_SEED_PREFIX), u64Bytes(jobId)], SACP_PROGRAM_ID);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Escrow authority PDA. PDA-only — does not hold tokens itself, only
|
|
24
|
+
* signs as the owner of the `EscrowVault` TokenAccount.
|
|
25
|
+
*/
|
|
26
|
+
export function findEscrowPda(jobId) {
|
|
27
|
+
return PublicKey.findProgramAddressSync([Buffer.from(ESCROW_SEED_PREFIX), u64Bytes(jobId)], SACP_PROGRAM_ID);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Escrow vault — the actual SPL Token account holding the Job's funds.
|
|
31
|
+
* Owned by the `Escrow` authority PDA above.
|
|
32
|
+
*/
|
|
33
|
+
export function findEscrowVaultPda(jobId) {
|
|
34
|
+
return PublicKey.findProgramAddressSync([Buffer.from(ESCROW_VAULT_SEED_PREFIX), u64Bytes(jobId)], SACP_PROGRAM_ID);
|
|
35
|
+
}
|
|
36
|
+
export function findSubmissionPda(jobId) {
|
|
37
|
+
return PublicKey.findProgramAddressSync([Buffer.from(SUBMISSION_SEED_PREFIX), u64Bytes(jobId)], SACP_PROGRAM_ID);
|
|
38
|
+
}
|
|
39
|
+
export function findVerdictPda(jobId) {
|
|
40
|
+
return PublicKey.findProgramAddressSync([Buffer.from(VERDICT_SEED_PREFIX), u64Bytes(jobId)], SACP_PROGRAM_ID);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Protocol Config PDA. Holds the take-rate policy and the
|
|
44
|
+
* authority that can update it or withdraw from the per-mint Treasury
|
|
45
|
+
* ATAs. Doubles as the Treasury ATAs' owner — there is no separate
|
|
46
|
+
* "treasury authority" PDA on the Job side.
|
|
47
|
+
*/
|
|
48
|
+
export function findSacpConfigPda() {
|
|
49
|
+
return PublicKey.findProgramAddressSync([Buffer.from(CONFIG_SEED_PREFIX)], SACP_PROGRAM_ID);
|
|
50
|
+
}
|
|
51
|
+
/** v0.9: Provider's per-slot Offering PDA. `slotId` is u32 little-endian. */
|
|
52
|
+
export function findOfferingPda(provider, slotId) {
|
|
53
|
+
const slotBytes = Buffer.alloc(4);
|
|
54
|
+
slotBytes.writeUInt32LE(slotId);
|
|
55
|
+
return PublicKey.findProgramAddressSync([Buffer.from(OFFERING_SEED_PREFIX), provider.toBuffer(), slotBytes], SACP_PROGRAM_ID);
|
|
56
|
+
}
|
|
57
|
+
/** v1.0 Phase 8: Negotiation PDA. `negotiationId` is u64 little-endian. */
|
|
58
|
+
export function findNegotiationPda(buyer, negotiationId) {
|
|
59
|
+
return PublicKey.findProgramAddressSync([Buffer.from(NEGOTIATION_SEED_PREFIX), buyer.toBuffer(), u64Bytes(negotiationId)], SACP_PROGRAM_ID);
|
|
60
|
+
}
|
|
61
|
+
export function findValidatorPda(authority) {
|
|
62
|
+
return PublicKey.findProgramAddressSync([Buffer.from(VALIDATOR_SEED_PREFIX), authority.toBuffer()], SACP_VALIDATION_PROGRAM_ID);
|
|
63
|
+
}
|
|
64
|
+
export function findBondPda(validator) {
|
|
65
|
+
return PublicKey.findProgramAddressSync([Buffer.from(BOND_SEED_PREFIX), validator.toBuffer()], SACP_VALIDATION_PROGRAM_ID);
|
|
66
|
+
}
|
|
67
|
+
/** PDA that signs as authority over the bond vault TokenAccount. */
|
|
68
|
+
export function findBondAuthorityPda(validatorAuthority) {
|
|
69
|
+
return PublicKey.findProgramAddressSync([Buffer.from(BOND_AUTHORITY_SEED_PREFIX), validatorAuthority.toBuffer()], SACP_VALIDATION_PROGRAM_ID);
|
|
70
|
+
}
|
|
71
|
+
/** Bond vault — the SPL Token account holding the validator's stake. */
|
|
72
|
+
export function findBondVaultPda(validatorAuthority) {
|
|
73
|
+
return PublicKey.findProgramAddressSync([Buffer.from(BOND_VAULT_SEED_PREFIX), validatorAuthority.toBuffer()], SACP_VALIDATION_PROGRAM_ID);
|
|
74
|
+
}
|
|
75
|
+
export function findChallengePda(jobId) {
|
|
76
|
+
return PublicKey.findProgramAddressSync([Buffer.from(CHALLENGE_SEED_PREFIX), u64Bytes(jobId)], SACP_VALIDATION_PROGRAM_ID);
|
|
77
|
+
}
|
|
78
|
+
/** Program-owned treasury authority — single PDA, controls every per-mint vault. */
|
|
79
|
+
export function findTreasuryAuthorityPda() {
|
|
80
|
+
return PublicKey.findProgramAddressSync([Buffer.from(TREASURY_AUTHORITY_SEED_PREFIX)], SACP_VALIDATION_PROGRAM_ID);
|
|
81
|
+
}
|
|
82
|
+
/** Canonical per-mint treasury vault. Receives 30% of every slash. */
|
|
83
|
+
export function findTreasuryVaultPda(bondMint) {
|
|
84
|
+
return PublicKey.findProgramAddressSync([Buffer.from(TREASURY_VAULT_SEED_PREFIX), bondMint.toBuffer()], SACP_VALIDATION_PROGRAM_ID);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolver Config PDA. Holds the authority that can call
|
|
88
|
+
* `resolve_challenge`. Pre-v0.7 deployments must run
|
|
89
|
+
* `init_resolver_config` immediately after upgrade — until then the
|
|
90
|
+
* validation program rejects every resolution attempt.
|
|
91
|
+
*/
|
|
92
|
+
export function findResolverConfigPda() {
|
|
93
|
+
return PublicKey.findProgramAddressSync([Buffer.from(RESOLVER_CONFIG_SEED_PREFIX)], SACP_VALIDATION_PROGRAM_ID);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=pdas.js.map
|
package/dist/pdas.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdas.js","sourceRoot":"","sources":["../src/pdas.ts"],"names":[],"mappings":"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"}
|