forked from wormhole-foundation/native-token-transfers
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathntt_manager_message.move
100 lines (86 loc) · 2.55 KB
/
ntt_manager_message.move
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
module ntt_common::ntt_manager_message {
use wormhole::bytes::{Self};
use wormhole::cursor::{Self};
use wormhole::bytes32::{Self, Bytes32};
use wormhole::external_address::{Self, ExternalAddress};
public struct NttManagerMessage<A> has store, copy, drop {
// unique message identifier
id: Bytes32,
// original message sender address.
sender: ExternalAddress,
// thing inside
payload: A,
}
const E_PAYLOAD_TOO_LONG: u64 = 0;
public fun new<A>(
id: Bytes32,
sender: ExternalAddress,
payload: A
): NttManagerMessage<A> {
NttManagerMessage {
id,
sender,
payload
}
}
public fun get_id<A>(
message: &NttManagerMessage<A>
): Bytes32 {
message.id
}
public fun borrow_payload<A>(
message: &NttManagerMessage<A>
): &A {
&message.payload
}
public fun destruct<A>(
message: NttManagerMessage<A>
):(
Bytes32,
ExternalAddress,
A
) {
let NttManagerMessage {
id,
sender,
payload
} = message;
(id, sender, payload)
}
public fun to_bytes(
message: NttManagerMessage<vector<u8>>
): vector<u8> {
let NttManagerMessage {id, sender, payload} = message;
assert!(vector::length(&payload) < (((1<<16)-1) as u64), E_PAYLOAD_TOO_LONG);
let payload_length = (vector::length(&payload) as u16);
let mut buf: vector<u8> = vector::empty<u8>();
vector::append(&mut buf, id.to_bytes());
vector::append(&mut buf, sender.to_bytes());
bytes::push_u16_be(&mut buf, payload_length);
vector::append(&mut buf, payload);
buf
}
public fun take_bytes(cur: &mut cursor::Cursor<u8>): NttManagerMessage<vector<u8>> {
let id = bytes32::take_bytes(cur);
let sender = external_address::take_bytes(cur);
let payload_length = bytes::take_u16_be(cur);
let payload = bytes::take_bytes(cur, (payload_length as u64));
NttManagerMessage {
id,
sender,
payload
}
}
public macro fun map<$A, $B>(
$message: NttManagerMessage<$A>,
$f: |$A| -> $B
): NttManagerMessage<$B> {
let (id, sender, payload) = destruct($message);
new(id, sender, $f(payload))
}
public fun parse(
buf: vector<u8>
): NttManagerMessage<vector<u8>> {
ntt_common::parse::parse!(buf, |x| take_bytes(x))
}
}