@@ -10,6 +10,88 @@ import {
10
10
import { Chain , StarknetChain } from "../chains" ;
11
11
import { Account , Contract , shortString } from "starknet" ;
12
12
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
+ }
13
95
14
96
export class StarknetPriceFeedContract extends PriceFeedContract {
15
97
static type = "StarknetPriceFeedContract" ;
@@ -111,7 +193,6 @@ export class StarknetPriceFeedContract extends PriceFeedContract {
111
193
async getPriceFeed ( feedId : string ) : Promise < PriceFeed | undefined > {
112
194
const contract = await this . getContractClient ( ) ;
113
195
const result = await contract . query_price_feed_unsafe ( "0x" + feedId ) ;
114
- console . log ( result ) ;
115
196
if ( result . Ok !== undefined ) {
116
197
return {
117
198
price : convertPrice ( result . Ok . price ) ,
0 commit comments