package ucs03_zkgm
import (
"encoding/hex"
types "gno.land/p/onbloc/ibc/union/types"
z "gno.land/p/onbloc/ibc/union/zkgm"
)
func Send(cur realm, channelId types.ChannelId, timeoutTimestamp types.Timestamp, salt [32]byte, instruction z.Instruction) types.Packet {
assertIsNotPaused()
return mustGetImpl().Send(0, cur, channelId, timeoutTimestamp, salt, instruction)
}
// SendRaw sends a ZKGM packet from hex-encoded instruction fields. Use this
// entry point from gnokey maketx call (not maketx run) so OriginSend captures
// any native coins attached with -send for escrow-bearing instructions.
//
// - channelId: local source IBC channel id on this chain.
// - timeoutTimestamp: packet expiry in nanoseconds since the Unix epoch.
// - saltHex: 32-byte send salt as hex; an optional 0x prefix is accepted.
// - version: instruction version byte (e.g. 2 for TokenOrderV2).
// - opcode: instruction opcode (0=Forward, 1=Call, 2=Batch, 3=TokenOrder).
// - operandHex: ABI-encoded instruction operand as hex; 0x prefix optional.
func SendRaw(cur realm, channelId uint32, timeoutTimestamp uint64, saltHex string, version uint8, opcode uint8, operandHex string) types.Packet {
assertIsNotPaused()
saltBytes, err := parseHex(saltHex)
if err != nil {
panic(err)
}
if len(saltBytes) != 32 {
panic(ErrInvalidSaltLength)
}
var salt [32]byte
copy(salt[:], saltBytes)
operandBytes, err := parseHex(operandHex)
if err != nil {
panic(err)
}
instruction := z.Instruction{
Version: version,
Opcode: opcode,
Operand: operandBytes,
}
return mustGetImpl().Send(0, cur, types.ChannelId(channelId), types.Timestamp(timeoutTimestamp), salt, instruction)
}
func parseHex(s string) ([]byte, error) {
if len(s) >= 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X') {
s = s[2:]
}
bz, err := hex.DecodeString(s)
if err != nil {
return nil, err
}
return bz, nil
}