Skip to content

Commit 11506d9

Browse files
authored
feat(contract_manager): support starknet wormhole contract (#1726)
1 parent a7fcded commit 11506d9

File tree

3 files changed

+90
-2
lines changed

3 files changed

+90
-2
lines changed

contract_manager/src/contracts/starknet.ts

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,88 @@ import {
1010
import { Chain, StarknetChain } from "../chains";
1111
import { Account, Contract, shortString } from "starknet";
1212
import { ByteBuffer } from "@pythnetwork/pyth-starknet-js";
13+
import { WormholeContract } from "./wormhole";
14+
15+
export class StarknetWormholeContract extends WormholeContract {
16+
static type = "StarknetWormholeContract";
17+
18+
getId(): string {
19+
return `${this.chain.getId()}_${this.address}`;
20+
}
21+
22+
getType(): string {
23+
return StarknetWormholeContract.type;
24+
}
25+
26+
toJson() {
27+
return {
28+
chain: this.chain.getId(),
29+
address: this.address,
30+
type: StarknetWormholeContract.type,
31+
};
32+
}
33+
34+
static fromJson(
35+
chain: Chain,
36+
parsed: {
37+
type: string;
38+
address: string;
39+
}
40+
): StarknetWormholeContract {
41+
if (parsed.type !== StarknetWormholeContract.type)
42+
throw new Error("Invalid type");
43+
if (!(chain instanceof StarknetChain))
44+
throw new Error(`Wrong chain type ${chain}`);
45+
return new StarknetWormholeContract(chain, parsed.address);
46+
}
47+
48+
constructor(public chain: StarknetChain, public address: string) {
49+
super();
50+
}
51+
52+
async getContractClient(): Promise<Contract> {
53+
const provider = this.chain.getProvider();
54+
const classData = await provider.getClassAt(this.address);
55+
return new Contract(classData.abi, this.address, provider);
56+
}
57+
58+
async getCurrentGuardianSetIndex(): Promise<number> {
59+
const contract = await this.getContractClient();
60+
return Number(await contract.get_current_guardian_set_index());
61+
}
62+
63+
async getChainId(): Promise<number> {
64+
const contract = await this.getContractClient();
65+
return Number(await contract.chain_id());
66+
}
67+
68+
async getGuardianSet(): Promise<string[]> {
69+
const contract = await this.getContractClient();
70+
const setIndex = await contract.get_current_guardian_set_index();
71+
const set = await contract.get_guardian_set(setIndex);
72+
return set.keys.map((key: bigint) => key.toString(16).padStart(40, "0"));
73+
}
74+
75+
async upgradeGuardianSets(
76+
senderPrivateKey: PrivateKey,
77+
vaa: Buffer
78+
): Promise<TxResult> {
79+
const senderAddress = await this.chain.getAccountAddress(senderPrivateKey);
80+
const provider = this.chain.getProvider();
81+
const contract = await this.getContractClient();
82+
const account = new Account(
83+
provider,
84+
"0x" + senderAddress,
85+
"0x" + senderPrivateKey
86+
);
87+
contract.connect(account);
88+
89+
const updateData = ByteBuffer.fromBuffer(vaa);
90+
const tx = await contract.submit_new_guardian_set(updateData);
91+
const info = await provider.waitForTransaction(tx.transaction_hash);
92+
return { id: tx.transaction_hash, info };
93+
}
94+
}
1395

1496
export class StarknetPriceFeedContract extends PriceFeedContract {
1597
static type = "StarknetPriceFeedContract";
@@ -111,7 +193,6 @@ export class StarknetPriceFeedContract extends PriceFeedContract {
111193
async getPriceFeed(feedId: string): Promise<PriceFeed | undefined> {
112194
const contract = await this.getContractClient();
113195
const result = await contract.query_price_feed_unsafe("0x" + feedId);
114-
console.log(result);
115196
if (result.Ok !== undefined) {
116197
return {
117198
price: convertPrice(result.Ok.price),

contract_manager/src/store.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ import { PriceFeedContract, Storable } from "./base";
2727
import { parse, stringify } from "yaml";
2828
import { readdirSync, readFileSync, statSync, writeFileSync } from "fs";
2929
import { Vault } from "./governance";
30-
import { StarknetPriceFeedContract } from "./contracts/starknet";
30+
import {
31+
StarknetPriceFeedContract,
32+
StarknetWormholeContract,
33+
} from "./contracts/starknet";
3134

3235
export class Store {
3336
public chains: Record<string, Chain> = { global: new GlobalChain() };
@@ -139,6 +142,7 @@ export class Store {
139142
[FuelPriceFeedContract.type]: FuelPriceFeedContract,
140143
[FuelWormholeContract.type]: FuelWormholeContract,
141144
[StarknetPriceFeedContract.type]: StarknetPriceFeedContract,
145+
[StarknetWormholeContract.type]: StarknetWormholeContract,
142146
};
143147
this.getYamlFiles(`${this.path}/contracts/`).forEach((yamlFile) => {
144148
const parsedArray = parse(readFileSync(yamlFile, "utf-8"));
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- chain: starknet_sepolia
2+
address: "0x07fa5a689a768982ecb60ed05f39ca8f6efe623dd32ee6f3608662e3452a104c"
3+
type: StarknetWormholeContract

0 commit comments

Comments
 (0)