@@ -8,6 +8,8 @@ module wormhole_transceiver::wormhole_transceiver {
8
8
use ntt_common::validated_transceiver_message::{Self , ValidatedTransceiverMessage };
9
9
use ntt_common::transceiver_message::{Self , PrefixOf };
10
10
use ntt_common::transceiver_message_data;
11
+ use ntt::state::{State as ManagerState };
12
+ use sui::coin::{CoinMetadata };
11
13
12
14
public struct Auth has drop {}
13
15
@@ -28,23 +30,24 @@ module wormhole_transceiver::wormhole_transceiver {
28
30
State {
29
31
id: object::new (ctx),
30
32
peers: table::new (ctx),
31
- emitter_cap: wormhole::emitter ::new (wormhole_state, ctx),
33
+ emitter_cap: wormhole::emitter ::new (wormhole_state, ctx), // Creates a new emitter cap for WH core. Acts as the *peer* on the other side.
32
34
}
33
35
}
34
36
35
37
public struct DeployerCap has key , store {
36
38
id: UID
37
39
}
38
40
39
- fun init (ctx: &mut TxContext ) {
41
+ // Only callable by the 'creator' of the module.
42
+ fun init (ctx: &mut TxContext ) { // Made on creation of module
40
43
let deployer = DeployerCap { id: object::new (ctx) };
41
- transfer::transfer (deployer, ctx. sender ());
44
+ transfer::transfer (deployer, tx_context:: sender (ctx ));
42
45
}
43
46
44
47
#[allow(lint(share_owned))]
45
48
public fun complete (deployer: DeployerCap , wormhole_state: &wormhole::state ::State , ctx: &mut TxContext ): AdminCap {
46
49
let DeployerCap { id } = deployer;
47
- object::delete (id);
50
+ object::delete (id); // Deletion means that nothing can redeploy this again...
48
51
49
52
let state = new (wormhole_state, ctx);
50
53
transfer::public_share_object (state);
@@ -56,6 +59,7 @@ module wormhole_transceiver::wormhole_transceiver {
56
59
state: &mut State ,
57
60
message: OutboundMessage <Auth >,
58
61
): Option <MessageTicket > {
62
+
59
63
let (ntt_manager_message, source_ntt_manager, recipient_ntt_manager)
60
64
= message.unwrap_outbound_message (&Auth {});
61
65
@@ -79,7 +83,7 @@ module wormhole_transceiver::wormhole_transceiver {
79
83
80
84
public fun validate_message (
81
85
state: &State ,
82
- vaa: VAA ,
86
+ vaa: VAA ,
83
87
): ValidatedTransceiverMessage <Auth , vector<u8>> {
84
88
let (emitter_chain, emitter_address, payload)
85
89
= vaa::take_emitter_info_and_payload (vaa);
@@ -112,13 +116,54 @@ module wormhole_transceiver::wormhole_transceiver {
112
116
if (state.peers.contains (chain)) {
113
117
state.peers.remove (chain);
114
118
};
115
- state.peers.add (chain, peer)
119
+ state.peers.add (chain, peer);
116
120
}
117
121
118
- }
122
+ public fun set_peer_with_accountant (_ : &AdminCap , state: &mut State , chain: u16 , peer: ExternalAddress ): Option <MessageTicket >{
123
+
124
+ // Cannot replace WH peers because of complexities with the accountant
125
+ assert !(!state.peers.contains (chain));
126
+
127
+ broadcast_peer (chain, peer, state)
128
+ }
129
+
130
+ /*
131
+ TransceiverInit on EVM
132
+ BroadCastId on Solana
133
+ */
134
+ public fun broadcast_id <CoinType , Auth >(_: &AdminCap , coin_meta: &CoinMetadata <CoinType >, state: &mut State , manager_state: &ManagerState <CoinType >): Option <MessageTicket > {
135
+ // MessageTicket cannot be dropped. Means that the WH message is forced to be emitted, since only the `publish_message` call can get rid of it.
136
+
137
+ let mut manager_address_opt: Option <address > = ntt_common::contract_auth ::get_auth_address <Auth >();
138
+ let manager_address = option::extract (&mut manager_address_opt);
139
+
140
+ let external_address_manager_address = wormhole::external_address ::from_address (manager_address);
141
+
142
+ let transceiver_info_struct = wormhole_transceiver::transceiver_structs ::new_transceiver_info (external_address_manager_address, *manager_state.borrow_mode (), wormhole::external_address ::from_id (object::id (coin_meta)), coin_meta.get_decimals ());
143
+
144
+ let message_ticket = wormhole::publish_message ::prepare_message (
145
+ &mut state.emitter_cap,
146
+ 0 ,
147
+ transceiver_info_struct.transceiver_info_to_bytes (),
148
+ );
149
+ option::some (message_ticket)
150
+ }
151
+
152
+ /*
153
+ Broadcast Peer in Solana
154
+ Transceiver Registration in EVM
155
+ */
156
+ fun broadcast_peer (chain_id: u16 , peer_address: ExternalAddress , state: &mut State ): Option <MessageTicket >{
157
+
158
+ let transceiver_registration_struct = wormhole_transceiver::transceiver_structs ::new_transceiver_registration (chain_id, peer_address);
159
+ let message_ticket = wormhole::publish_message ::prepare_message (
160
+ &mut state.emitter_cap,
161
+ 0 ,
162
+ transceiver_registration_struct.transceiver_registration_to_bytes (),
163
+ );
164
+ option::some (message_ticket)
165
+ }
119
166
120
- #[test_only]
121
- module wormhole_transceiver ::tests {
122
167
#[test]
123
168
public fun test_auth_type () {
124
169
assert !(ntt_common::contract_auth ::is_auth_type <wormhole_transceiver::wormhole_transceiver ::Auth >(), 0 );
0 commit comments