You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
2.4 KiB

package api
import (
"errors"
"fmt"
"git.wownero.com/onionltd/monero-multisig-broker/messagelog"
)
type Message struct {
RPCName string `json:"rpc_name"`
Sender string `json:"sender"`
MultisigInfo string `json:"multisig_info"`
MultisigTxSet string `json:"multisig_txset"`
Address string `json:"address"`
TxDataHex string `json:"tx_data_hex"`
TxHashList []string `json:"tx_hash_list"`
}
const PrepareMultisig = "prepare_multisig"
func NewPrepareMultisig(multisigInfo string) Message {
return Message{
RPCName: PrepareMultisig,
MultisigInfo: multisigInfo,
}
}
const MakeMultisig = "make_multisig"
func NewMakeMultisig(multisigInfo string) Message {
return Message{
RPCName: MakeMultisig,
MultisigInfo: multisigInfo,
}
}
const FinalizeMultisig = "finalize_multisig"
func NewFinalizeMultisig(address string) Message {
return Message{
RPCName: FinalizeMultisig,
Address: address,
}
}
const Transfer = "transfer"
func NewTransferMessage(multisigTxSet string) Message {
return Message{
RPCName: Transfer,
MultisigTxSet: multisigTxSet,
}
}
func convertToLogMessage(m Message) messagelog.Message {
return messagelog.Message{
ContentType: "application/json",
Content: m,
}
}
func convertFromLogMessage(m messagelog.Message) (Message, error) {
content, ok := m.Content.(map[string]interface{})
if !ok {
return Message{}, errors.New("content is not an object")
}
messageType, ok := content["rpc_name"].(string)
if !ok {
return Message{}, errors.New("unexpected object format")
}
var message Message
switch messageType {
case PrepareMultisig:
msInfo, ok := content["multisig_info"].(string)
if !ok {
return Message{}, fmt.Errorf("missing `%s` for message type %s", "multisig_info", PrepareMultisig)
}
message = NewPrepareMultisig(msInfo)
case MakeMultisig:
msInfo, ok := content["multisig_info"].(string)
if !ok {
return Message{}, fmt.Errorf("missing `%s` for message type %s", "multisig_info", MakeMultisig)
}
message = NewMakeMultisig(msInfo)
case FinalizeMultisig:
address, ok := content["address"].(string)
if !ok {
return Message{}, fmt.Errorf("missing `%s` for message type %s", "address", FinalizeMultisig)
}
message = NewFinalizeMultisig(address)
default:
return Message{}, errors.New("unknown message type")
}
message.Sender = m.Sender
return message, nil
}