Skip to content

Commit 337bf2d

Browse files
committed
feat: add governance payload functions for managing feeds and publishers
1 parent 06f6f2e commit 337bf2d

File tree

11 files changed

+14550
-29
lines changed

11 files changed

+14550
-29
lines changed

governance/xc_admin/packages/xc_admin_common/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
"url": "https://github.com/pyth-network/pyth-crosschain/issues"
1616
},
1717
"scripts": {
18-
"build": "tsc",
18+
"build": "npm run build:proto && tsc",
19+
"build:proto": "pbjs -t static-module -w es6 -o src/programs/lazer/generated/governance_instruction.js ../../../../lazer/publisher_sdk/proto/governance_instruction.proto ../../../../lazer/publisher_sdk/proto/dynamic_value.proto && pbts -o src/programs/lazer/generated/governance_instruction.d.ts src/programs/lazer/generated/governance_instruction.js",
1920
"test:unit": "jest",
2021
"fix:format": "prettier --write \"src/**/*.ts\"",
2122
"test:format": "prettier --check \"src/**/*.ts\""
@@ -51,6 +52,7 @@
5152
"fast-check": "^3.10.0",
5253
"jest": "^29.3.1",
5354
"prettier": "catalog:",
55+
"protobufjs-cli": "^1.1.3",
5456
"ts-jest": "^29.0.3"
5557
}
5658
}

governance/xc_admin/packages/xc_admin_common/src/programs/lazer/generated/governance_instruction.d.ts

Lines changed: 3819 additions & 0 deletions
Large diffs are not rendered by default.

governance/xc_admin/packages/xc_admin_common/src/programs/lazer/generated/governance_instruction.js

Lines changed: 10022 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { PublicKey } from "@solana/web3.js";
2+
import { getProtoTypes } from "./proto_utils";
3+
4+
export interface AddFeedParams {
5+
priceFeedId: number;
6+
metadata: Record<string, unknown>; // DynamicValue.Map from proto
7+
permissionedPublishers?: number[];
8+
shardFilter?: {
9+
allShards?: Record<string, never>;
10+
shardNames?: { shardNames: string[] };
11+
shardGroups?: { shardGroups: string[] };
12+
};
13+
governanceSource: PublicKey;
14+
sequenceNo?: number;
15+
}
16+
17+
/** Create an AddFeed governance instruction */
18+
export async function createAddFeed(params: AddFeedParams): Promise<Buffer> {
19+
const { GovernanceInstruction, GovernanceDirective, AddFeed } = getProtoTypes();
20+
21+
// Create AddFeed message using proto type
22+
const addFeedMessage = AddFeed.create({
23+
priceFeedId: params.priceFeedId,
24+
metadata: params.metadata,
25+
permissionedPublishers: params.permissionedPublishers || []
26+
});
27+
28+
// Create GovernanceDirective using proto type
29+
const directive = GovernanceDirective.create({
30+
shardFilter: params.shardFilter || { allShards: {} },
31+
addFeed: addFeedMessage
32+
});
33+
34+
const governanceInstruction = {
35+
source: {
36+
singleEd25519: {
37+
publicKey: params.governanceSource.toBytes()
38+
}
39+
},
40+
directives: [directive],
41+
governanceSequenceNo: params.sequenceNo || Date.now()
42+
};
43+
44+
const message = GovernanceInstruction.create(governanceInstruction);
45+
return Buffer.from(GovernanceInstruction.encode(message).finish());
46+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { PublicKey } from "@solana/web3.js";
2+
import { getProtoTypes } from "./proto_utils";
3+
4+
export interface AddPublisherParams {
5+
publisherId: number;
6+
name: string;
7+
publicKeys: Uint8Array[];
8+
isActive: boolean;
9+
shardFilter?: {
10+
allShards?: Record<string, never>;
11+
shardNames?: { shardNames: string[] };
12+
shardGroups?: { shardGroups: string[] };
13+
};
14+
governanceSource: PublicKey;
15+
sequenceNo?: number;
16+
}
17+
18+
/** Create an AddPublisher governance instruction */
19+
export async function createAddPublisher(params: AddPublisherParams): Promise<Buffer> {
20+
const { GovernanceInstruction, GovernanceDirective, AddPublisher } = getProtoTypes();
21+
22+
// Create AddPublisher message using proto type
23+
const addPublisherMessage = AddPublisher.create({
24+
publisherId: params.publisherId,
25+
name: params.name,
26+
publicKeys: params.publicKeys,
27+
isActive: params.isActive
28+
});
29+
30+
// Create GovernanceDirective using proto type
31+
const directive = GovernanceDirective.create({
32+
shardFilter: params.shardFilter || { allShards: {} },
33+
addPublisher: addPublisherMessage
34+
});
35+
36+
const governanceInstruction = {
37+
source: {
38+
singleEd25519: {
39+
publicKey: params.governanceSource.toBytes()
40+
}
41+
},
42+
directives: [directive],
43+
governanceSequenceNo: params.sequenceNo || Date.now()
44+
};
45+
46+
const message = GovernanceInstruction.create(governanceInstruction);
47+
return Buffer.from(GovernanceInstruction.encode(message).finish());
48+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { PublicKey } from "@solana/web3.js";
2+
import { getProtoTypes } from "./proto_utils";
3+
4+
export type UpdateFeedAction =
5+
| { type: "updateFeedMetadata"; name: string; value?: any }
6+
| { type: "activateFeed"; activationTimestamp?: string }
7+
| { type: "deactivateFeed"; deactivationTimestamp?: string }
8+
| { type: "removeFeed" };
9+
10+
export interface UpdateFeedParams {
11+
priceFeedId: number;
12+
action: UpdateFeedAction;
13+
shardFilter?: {
14+
allShards?: Record<string, never>;
15+
shardNames?: { shardNames: string[] };
16+
shardGroups?: { shardGroups: string[] };
17+
};
18+
governanceSource: PublicKey;
19+
sequenceNo?: number;
20+
}
21+
22+
/** Create an UpdateFeed governance instruction */
23+
export async function createUpdateFeed(params: UpdateFeedParams): Promise<Buffer> {
24+
const { GovernanceInstruction, GovernanceDirective, UpdateFeed, UpdateFeedMetadata, ActivateFeed, DeactivateFeed } = getProtoTypes();
25+
26+
// Create the appropriate action message based on type
27+
let actionMessage: any = {};
28+
29+
switch (params.action.type) {
30+
case "updateFeedMetadata":
31+
actionMessage.updateFeedMetadata = UpdateFeedMetadata.create({
32+
name: params.action.name,
33+
value: params.action.value
34+
});
35+
break;
36+
case "activateFeed":
37+
actionMessage.activateFeed = ActivateFeed.create({});
38+
break;
39+
case "deactivateFeed":
40+
actionMessage.deactivateFeed = DeactivateFeed.create({});
41+
break;
42+
case "removeFeed":
43+
actionMessage.removeFeed = {};
44+
break;
45+
}
46+
47+
// Create UpdateFeed message using proto type
48+
const updateFeedMessage = UpdateFeed.create({
49+
priceFeedId: params.priceFeedId,
50+
...actionMessage
51+
});
52+
53+
// Create GovernanceDirective using proto type
54+
const directive = GovernanceDirective.create({
55+
shardFilter: params.shardFilter || { allShards: {} },
56+
updateFeed: updateFeedMessage
57+
});
58+
59+
const governanceInstruction = {
60+
source: {
61+
singleEd25519: {
62+
publicKey: params.governanceSource.toBytes()
63+
}
64+
},
65+
directives: [directive],
66+
governanceSequenceNo: params.sequenceNo || Date.now()
67+
};
68+
69+
const message = GovernanceInstruction.create(governanceInstruction);
70+
return Buffer.from(GovernanceInstruction.encode(message).finish());
71+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import { PublicKey } from "@solana/web3.js";
2+
import { getProtoTypes } from "./proto_utils";
3+
4+
export type UpdatePublisherAction =
5+
| { type: "setPublisherName"; name: string }
6+
| { type: "addPublisherPublicKeys"; publicKeys: Uint8Array[] }
7+
| { type: "removePublisherPublicKeys"; publicKeys: Uint8Array[] }
8+
| { type: "setPublisherPublicKeys"; publicKeys: Uint8Array[] }
9+
| { type: "setPublisherActive"; isActive: boolean }
10+
| { type: "removePublisher" };
11+
12+
export interface UpdatePublisherParams {
13+
publisherId: number;
14+
action: UpdatePublisherAction;
15+
shardFilter?: {
16+
allShards?: Record<string, never>;
17+
shardNames?: { shardNames: string[] };
18+
shardGroups?: { shardGroups: string[] };
19+
};
20+
governanceSource: PublicKey;
21+
sequenceNo?: number;
22+
}
23+
24+
/** Create an UpdatePublisher governance instruction */
25+
export async function createUpdatePublisher(params: UpdatePublisherParams): Promise<Buffer> {
26+
const {
27+
GovernanceInstruction,
28+
GovernanceDirective,
29+
UpdatePublisher,
30+
SetPublisherName,
31+
SetPublisherActive,
32+
AddPublisherPublicKeys,
33+
RemovePublisherPublicKeys,
34+
SetPublisherPublicKeys
35+
} = getProtoTypes();
36+
37+
// Create the appropriate action message based on type
38+
let actionMessage: any = {};
39+
40+
switch (params.action.type) {
41+
case "setPublisherName":
42+
actionMessage.setPublisherName = SetPublisherName.create({
43+
name: params.action.name
44+
});
45+
break;
46+
case "addPublisherPublicKeys":
47+
actionMessage.addPublisherPublicKeys = AddPublisherPublicKeys.create({
48+
publicKeys: params.action.publicKeys
49+
});
50+
break;
51+
case "removePublisherPublicKeys":
52+
actionMessage.removePublisherPublicKeys = RemovePublisherPublicKeys.create({
53+
publicKeys: params.action.publicKeys
54+
});
55+
break;
56+
case "setPublisherPublicKeys":
57+
actionMessage.setPublisherPublicKeys = SetPublisherPublicKeys.create({
58+
publicKeys: params.action.publicKeys
59+
});
60+
break;
61+
case "setPublisherActive":
62+
actionMessage.setPublisherActive = SetPublisherActive.create({
63+
isActive: params.action.isActive
64+
});
65+
break;
66+
case "removePublisher":
67+
actionMessage.removePublisher = {};
68+
break;
69+
}
70+
71+
// Create UpdatePublisher message using proto type
72+
const updatePublisherMessage = UpdatePublisher.create({
73+
publisherId: params.publisherId,
74+
...actionMessage
75+
});
76+
77+
// Create GovernanceDirective using proto type
78+
const directive = GovernanceDirective.create({
79+
shardFilter: params.shardFilter || { allShards: {} },
80+
updatePublisher: updatePublisherMessage
81+
});
82+
83+
const governanceInstruction = {
84+
source: {
85+
singleEd25519: {
86+
publicKey: params.governanceSource.toBytes()
87+
}
88+
},
89+
directives: [directive],
90+
governanceSequenceNo: params.sequenceNo || Date.now()
91+
};
92+
93+
const message = GovernanceInstruction.create(governanceInstruction);
94+
return Buffer.from(GovernanceInstruction.encode(message).finish());
95+
}

0 commit comments

Comments
 (0)