packet.gno
2.01 Kb · 103 lines
1package lziface
2
3import (
4 "encoding/binary"
5)
6
7// GnoPacket represents a LayerZero message packet originating from gno
8type GnoPacket struct {
9 Nonce uint64 // uint64 in Solidity
10 SrcEid uint32 // uint32 in Solidity
11 SenderAddr address // address in Solidity
12 DstEid uint32 // uint32 in Solidity
13 Receiver [32]byte // bytes32 in Solidity
14 GUID [32]byte // bytes32 in Solidity
15 Message []byte // bytes in Solidity
16}
17
18func (p *GnoPacket) Encode() []byte {
19 bz := make([]byte, 1+8+4+32+4+32+32+len(p.Message))
20
21 bz[0] = 1 // version
22
23 binary.BigEndian.PutUint64(bz[1:], p.Nonce)
24
25 binary.BigEndian.PutUint32(bz[1+8:], p.SrcEid)
26
27 senderLzAddr := AddressToBytes32(p.SenderAddr)
28 copy(bz[1+8+4:], senderLzAddr[:])
29
30 binary.BigEndian.PutUint32(bz[1+8+4+32:], p.DstEid)
31
32 copy(bz[1+8+4+32+4:], p.Receiver[:])
33
34 copy(bz[81:], p.GUID[:])
35
36 copy(bz[81+32:], p.Message)
37
38 return bz
39}
40
41type Packet []byte
42
43func (p Packet) Header() PacketHeader {
44 return PacketHeader(p[:81])
45}
46
47func (p Packet) Payload() PacketPayload {
48 return PacketPayload(p[81:])
49}
50
51type PacketHeader []byte
52
53func (ph PacketHeader) Version() uint8 {
54 return ph[0]
55}
56
57func (ph PacketHeader) Nonce() uint64 {
58 return binary.BigEndian.Uint64(ph[1:])
59}
60
61func (ph PacketHeader) SrcEID() uint32 {
62 return binary.BigEndian.Uint32(ph[9:])
63}
64
65func (ph PacketHeader) Sender() [32]byte {
66 sender := [32]byte{}
67 copy(sender[:], ph[13:])
68 return sender
69}
70
71func (ph PacketHeader) DstEID() uint32 {
72 return binary.BigEndian.Uint32(ph[45:])
73}
74
75func (ph PacketHeader) Receiver() [32]byte {
76 receiver := [32]byte{}
77 copy(receiver[:], ph[49:])
78 return receiver
79}
80
81func (ph PacketHeader) ReceiverAddr() address {
82 return Bytes32ToAddress(ph.Receiver())
83}
84
85func (ph PacketHeader) Origin() *Origin {
86 return &Origin{
87 SrcEID: ph.SrcEID(),
88 Sender: ph.Sender(),
89 Nonce: ph.Nonce(),
90 }
91}
92
93type PacketPayload []byte
94
95func (ph PacketPayload) GUID() [32]byte {
96 guid := [32]byte{}
97 copy(guid[:], ph)
98 return guid
99}
100
101func (ph PacketPayload) Message() []byte {
102 return ph[32:]
103}