Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}