dc4bc/fsm/state_machines/dkg_proposal_fsm/actions.go

593 lines
17 KiB
Go
Raw Normal View History

2020-08-06 17:20:13 -07:00
package dkg_proposal_fsm
import (
"errors"
"fmt"
2020-09-29 08:05:40 -07:00
"reflect"
2020-08-11 09:46:18 -07:00
"github.com/depools/dc4bc/fsm/config"
2020-08-06 17:20:13 -07:00
"github.com/depools/dc4bc/fsm/fsm"
"github.com/depools/dc4bc/fsm/state_machines/internal"
"github.com/depools/dc4bc/fsm/types/requests"
2020-08-21 09:21:42 -07:00
"github.com/depools/dc4bc/fsm/types/responses"
2020-08-06 17:20:13 -07:00
)
2020-08-13 08:22:06 -07:00
// Init
2020-08-06 17:20:13 -07:00
2020-08-13 08:22:06 -07:00
func (m *DKGProposalFSM) actionInitDKGProposal(inEvent fsm.Event, args ...interface{}) (outEvent fsm.Event, response interface{}, err error) {
2020-08-19 06:47:38 -07:00
m.payloadMu.Lock()
defer m.payloadMu.Unlock()
2020-08-13 08:22:06 -07:00
if m.payload.DKGProposalPayload != nil {
return
}
2020-08-19 06:47:38 -07:00
if len(args) != 1 {
err = errors.New("{arg0} required {DefaultRequest}")
return
}
request, ok := args[0].(requests.DefaultRequest)
if !ok {
err = errors.New("cannot cast {arg0} to type {DefaultRequest}")
return
}
2020-08-13 08:22:06 -07:00
m.payload.DKGProposalPayload = &internal.DKGConfirmation{
2020-08-19 06:47:38 -07:00
Quorum: make(internal.DKGProposalQuorum),
CreatedAt: request.CreatedAt,
ExpiresAt: request.CreatedAt.Add(config.DkgConfirmationDeadline),
}
2020-08-19 06:47:38 -07:00
for participantId, participant := range m.payload.SignatureProposalPayload.Quorum {
m.payload.DKGProposalPayload.Quorum[participantId] = &internal.DKGProposalParticipant{
Addr: participant.Addr,
2020-08-24 00:31:33 -07:00
DkgPubKey: make([]byte, len(participant.DkgPubKey)),
2020-08-13 08:22:06 -07:00
Status: internal.CommitAwaitConfirmation,
UpdatedAt: participant.UpdatedAt,
2020-08-11 09:46:18 -07:00
}
2020-08-19 06:47:38 -07:00
copy(m.payload.DKGProposalPayload.Quorum[participantId].DkgPubKey, participant.DkgPubKey)
2020-08-11 09:46:18 -07:00
}
2020-08-13 08:22:06 -07:00
// Remove m.payload.SignatureProposalPayload?
2020-08-11 09:46:18 -07:00
2020-08-21 09:21:42 -07:00
// Make response
responseData := make(responses.DKGProposalPubKeysParticipantResponse, 0)
for participantId, participant := range m.payload.DKGProposalPayload.Quorum {
responseEntry := &responses.DKGProposalPubKeysParticipantEntry{
ParticipantId: participantId,
Addr: participant.Addr,
DkgPubKey: participant.DkgPubKey,
}
responseData = append(responseData, responseEntry)
}
return inEvent, responseData, nil
2020-08-11 09:46:18 -07:00
}
2020-08-06 17:20:13 -07:00
// Commits
2020-08-08 14:44:52 -07:00
func (m *DKGProposalFSM) actionCommitConfirmationReceived(inEvent fsm.Event, args ...interface{}) (outEvent fsm.Event, response interface{}, err error) {
m.payloadMu.Lock()
defer m.payloadMu.Unlock()
if len(args) != 1 {
err = errors.New("{arg0} required {DKGProposalCommitConfirmationRequest}")
return
}
request, ok := args[0].(requests.DKGProposalCommitConfirmationRequest)
if !ok {
err = errors.New("cannot cast {arg0} to type {DKGProposalCommitConfirmationRequest}")
return
}
if err = request.Validate(); err != nil {
return
}
2020-08-12 06:40:03 -07:00
if !m.payload.DKGQuorumExists(request.ParticipantId) {
err = errors.New("{ParticipantId} not exist in quorum")
return
}
2020-08-12 06:40:03 -07:00
dkgProposalParticipant := m.payload.DKGQuorumGet(request.ParticipantId)
2020-08-11 09:46:18 -07:00
if dkgProposalParticipant.Status != internal.CommitAwaitConfirmation {
2020-09-29 08:05:40 -07:00
err = fmt.Errorf("cannot confirm commit with {Status} = {\"%s\"}", dkgProposalParticipant.Status)
2020-08-11 09:46:18 -07:00
return
}
2020-08-24 00:31:33 -07:00
dkgProposalParticipant.DkgCommit = make([]byte, len(request.Commit))
2020-08-21 09:21:42 -07:00
copy(dkgProposalParticipant.DkgCommit, request.Commit)
dkgProposalParticipant.Status = internal.CommitConfirmed
2020-08-19 06:47:38 -07:00
dkgProposalParticipant.UpdatedAt = request.CreatedAt
2020-08-24 16:41:22 -07:00
m.payload.DKGProposalPayload.UpdatedAt = request.CreatedAt
2020-08-19 06:47:38 -07:00
2020-08-12 06:40:03 -07:00
m.payload.DKGQuorumUpdate(request.ParticipantId, dkgProposalParticipant)
2020-08-06 17:20:13 -07:00
return
}
2020-08-11 09:46:18 -07:00
func (m *DKGProposalFSM) actionValidateDkgProposalAwaitCommits(inEvent fsm.Event, args ...interface{}) (outEvent fsm.Event, response interface{}, err error) {
var (
2020-08-19 07:26:10 -07:00
isContainsError bool
2020-08-11 09:46:18 -07:00
)
m.payloadMu.Lock()
defer m.payloadMu.Unlock()
2020-08-19 07:26:10 -07:00
if m.payload.DKGProposalPayload.IsExpired() {
2020-08-24 16:41:22 -07:00
outEvent = eventDKGCommitsConfirmationCancelByTimeoutInternal
2020-08-19 07:26:10 -07:00
return
}
2020-08-11 09:46:18 -07:00
2020-08-12 06:40:03 -07:00
unconfirmedParticipants := m.payload.DKGQuorumCount()
for _, participant := range m.payload.DKGProposalPayload.Quorum {
2020-08-19 07:26:10 -07:00
if participant.Status == internal.CommitConfirmationError {
isContainsError = true
} else if participant.Status == internal.CommitConfirmed {
unconfirmedParticipants--
2020-08-11 09:46:18 -07:00
}
}
if isContainsError {
2020-08-24 16:41:22 -07:00
outEvent = eventDKGCommitsConfirmationCancelByErrorInternal
2020-08-11 09:46:18 -07:00
return
}
// The are no declined and timed out participants, check for all confirmations
if unconfirmedParticipants > 0 {
return
}
outEvent = eventDKGCommitsConfirmedInternal
2020-08-12 06:40:03 -07:00
for _, participant := range m.payload.DKGProposalPayload.Quorum {
2020-08-11 09:46:18 -07:00
participant.Status = internal.DealAwaitConfirmation
}
2020-08-21 09:21:42 -07:00
// Make response
responseData := make(responses.DKGProposalCommitParticipantResponse, 0)
for participantId, participant := range m.payload.DKGProposalPayload.Quorum {
responseEntry := &responses.DKGProposalCommitParticipantEntry{
ParticipantId: participantId,
Addr: participant.Addr,
DkgCommit: participant.DkgCommit,
}
responseData = append(responseData, responseEntry)
}
response = responseData
2020-08-11 09:46:18 -07:00
return
}
2020-08-06 17:20:13 -07:00
// Deals
2020-08-08 14:44:52 -07:00
func (m *DKGProposalFSM) actionDealConfirmationReceived(inEvent fsm.Event, args ...interface{}) (outEvent fsm.Event, response interface{}, err error) {
m.payloadMu.Lock()
defer m.payloadMu.Unlock()
if len(args) != 1 {
err = errors.New("{arg0} required {DKGProposalDealConfirmationRequest}")
return
}
request, ok := args[0].(requests.DKGProposalDealConfirmationRequest)
if !ok {
err = errors.New("cannot cast {arg0} to type {DKGProposalDealConfirmationRequest}")
return
}
if err = request.Validate(); err != nil {
return
}
2020-08-12 06:40:03 -07:00
if !m.payload.DKGQuorumExists(request.ParticipantId) {
err = errors.New("{ParticipantId} not exist in quorum")
return
}
2020-08-12 06:40:03 -07:00
dkgProposalParticipant := m.payload.DKGQuorumGet(request.ParticipantId)
2020-08-11 09:46:18 -07:00
if dkgProposalParticipant.Status != internal.DealAwaitConfirmation {
2020-09-29 08:05:40 -07:00
err = fmt.Errorf("cannot confirm deal with {Status} = {\"%s\"}", dkgProposalParticipant.Status)
2020-08-11 09:46:18 -07:00
return
}
2020-08-24 00:31:33 -07:00
dkgProposalParticipant.DkgDeal = make([]byte, len(request.Deal))
2020-08-21 09:21:42 -07:00
copy(dkgProposalParticipant.DkgDeal, request.Deal)
dkgProposalParticipant.Status = internal.DealConfirmed
2020-08-19 06:47:38 -07:00
dkgProposalParticipant.UpdatedAt = request.CreatedAt
2020-08-24 16:41:22 -07:00
m.payload.DKGProposalPayload.UpdatedAt = request.CreatedAt
2020-08-19 06:47:38 -07:00
2020-08-12 06:40:03 -07:00
m.payload.DKGQuorumUpdate(request.ParticipantId, dkgProposalParticipant)
2020-08-06 17:20:13 -07:00
return
}
2020-08-11 09:46:18 -07:00
func (m *DKGProposalFSM) actionValidateDkgProposalAwaitDeals(inEvent fsm.Event, args ...interface{}) (outEvent fsm.Event, response interface{}, err error) {
var (
2020-08-19 07:26:10 -07:00
isContainsError bool
2020-08-11 09:46:18 -07:00
)
m.payloadMu.Lock()
defer m.payloadMu.Unlock()
2020-08-19 07:26:10 -07:00
if m.payload.DKGProposalPayload.IsExpired() {
outEvent = eventDKGDealsConfirmationCancelByTimeoutInternal
return
}
2020-08-11 09:46:18 -07:00
2020-08-24 05:50:14 -07:00
// Only awaiting deals stage requires ({all_participants} - 1) confirmations
unconfirmedDealsParticipants := m.payload.DKGQuorumCount() - 1
2020-08-12 06:40:03 -07:00
for _, participant := range m.payload.DKGProposalPayload.Quorum {
2020-08-19 07:26:10 -07:00
if participant.Status == internal.DealConfirmationError {
isContainsError = true
} else if participant.Status == internal.DealConfirmed {
2020-08-24 05:50:14 -07:00
unconfirmedDealsParticipants--
2020-08-11 09:46:18 -07:00
}
}
if isContainsError {
outEvent = eventDKGDealsConfirmationCancelByErrorInternal
return
}
2020-08-24 05:50:14 -07:00
if unconfirmedDealsParticipants > 0 {
2020-08-11 09:46:18 -07:00
return
}
outEvent = eventDKGDealsConfirmedInternal
2020-08-12 06:40:03 -07:00
for _, participant := range m.payload.DKGProposalPayload.Quorum {
2020-08-11 09:46:18 -07:00
participant.Status = internal.ResponseAwaitConfirmation
}
2020-08-21 09:21:42 -07:00
// Make response
responseData := make(responses.DKGProposalDealParticipantResponse, 0)
for participantId, participant := range m.payload.DKGProposalPayload.Quorum {
2020-08-22 05:04:44 -07:00
if len(participant.DkgDeal) == 0 {
continue
}
2020-08-21 09:21:42 -07:00
responseEntry := &responses.DKGProposalDealParticipantEntry{
ParticipantId: participantId,
Addr: participant.Addr,
DkgDeal: participant.DkgDeal,
}
responseData = append(responseData, responseEntry)
}
response = responseData
2020-08-11 09:46:18 -07:00
return
}
// Responses
2020-08-08 14:44:52 -07:00
func (m *DKGProposalFSM) actionResponseConfirmationReceived(inEvent fsm.Event, args ...interface{}) (outEvent fsm.Event, response interface{}, err error) {
m.payloadMu.Lock()
defer m.payloadMu.Unlock()
if len(args) != 1 {
err = errors.New("{arg0} required {DKGProposalResponseConfirmationRequest}")
return
}
request, ok := args[0].(requests.DKGProposalResponseConfirmationRequest)
if !ok {
err = errors.New("cannot cast {arg0} to type {DKGProposalResponseConfirmationRequest}")
return
}
if err = request.Validate(); err != nil {
return
}
2020-08-12 06:40:03 -07:00
if !m.payload.DKGQuorumExists(request.ParticipantId) {
err = errors.New("{ParticipantId} not exist in quorum")
return
}
2020-08-12 06:40:03 -07:00
dkgProposalParticipant := m.payload.DKGQuorumGet(request.ParticipantId)
2020-08-11 09:46:18 -07:00
if dkgProposalParticipant.Status != internal.ResponseAwaitConfirmation {
2020-09-29 08:05:40 -07:00
err = fmt.Errorf("cannot confirm response with {Status} = {\"%s\"}", dkgProposalParticipant.Status)
2020-08-11 09:46:18 -07:00
return
}
2020-08-24 00:31:33 -07:00
dkgProposalParticipant.DkgResponse = make([]byte, len(request.Response))
2020-08-21 09:21:42 -07:00
copy(dkgProposalParticipant.DkgResponse, request.Response)
dkgProposalParticipant.Status = internal.ResponseConfirmed
2020-08-19 06:47:38 -07:00
dkgProposalParticipant.UpdatedAt = request.CreatedAt
2020-08-24 16:41:22 -07:00
m.payload.DKGProposalPayload.UpdatedAt = request.CreatedAt
2020-08-19 06:47:38 -07:00
2020-08-12 06:40:03 -07:00
m.payload.DKGQuorumUpdate(request.ParticipantId, dkgProposalParticipant)
2020-08-06 17:20:13 -07:00
return
}
2020-08-11 09:46:18 -07:00
func (m *DKGProposalFSM) actionValidateDkgProposalAwaitResponses(inEvent fsm.Event, args ...interface{}) (outEvent fsm.Event, response interface{}, err error) {
var (
2020-08-19 07:26:10 -07:00
isContainsError bool
2020-08-11 09:46:18 -07:00
)
m.payloadMu.Lock()
defer m.payloadMu.Unlock()
2020-08-19 07:26:10 -07:00
if m.payload.DKGProposalPayload.IsExpired() {
outEvent = eventDKGResponseConfirmationCancelByTimeoutInternal
return
}
2020-08-11 09:46:18 -07:00
2020-08-12 06:40:03 -07:00
unconfirmedParticipants := m.payload.DKGQuorumCount()
for _, participant := range m.payload.DKGProposalPayload.Quorum {
2020-08-19 07:26:10 -07:00
if participant.Status == internal.ResponseConfirmationError {
isContainsError = true
} else if participant.Status == internal.ResponseConfirmed {
unconfirmedParticipants--
2020-08-11 09:46:18 -07:00
}
}
if isContainsError {
outEvent = eventDKGResponseConfirmationCancelByErrorInternal
return
}
// The are no declined and timed out participants, check for all confirmations
if unconfirmedParticipants > 0 {
return
}
outEvent = eventDKGResponsesConfirmedInternal
2020-08-12 06:40:03 -07:00
for _, participant := range m.payload.DKGProposalPayload.Quorum {
participant.Status = internal.MasterKeyAwaitConfirmation
}
2020-08-21 09:21:42 -07:00
// Make response
responseData := make(responses.DKGProposalResponseParticipantResponse, 0)
for participantId, participant := range m.payload.DKGProposalPayload.Quorum {
responseEntry := &responses.DKGProposalResponseParticipantEntry{
ParticipantId: participantId,
Addr: participant.Addr,
DkgResponse: participant.DkgResponse,
}
responseData = append(responseData, responseEntry)
}
response = responseData
2020-08-12 06:40:03 -07:00
return
}
// Master key
func (m *DKGProposalFSM) actionMasterKeyConfirmationReceived(inEvent fsm.Event, args ...interface{}) (outEvent fsm.Event, response interface{}, err error) {
m.payloadMu.Lock()
defer m.payloadMu.Unlock()
if len(args) != 1 {
err = errors.New("{arg0} required {DKGProposalMasterKeyConfirmationRequest}")
return
}
request, ok := args[0].(requests.DKGProposalMasterKeyConfirmationRequest)
if !ok {
err = errors.New("cannot cast {arg0} to type {DKGProposalMasterKeyConfirmationRequest}")
return
}
if err = request.Validate(); err != nil {
return
}
if !m.payload.DKGQuorumExists(request.ParticipantId) {
err = errors.New("{ParticipantId} not exist in quorum")
return
}
dkgProposalParticipant := m.payload.DKGQuorumGet(request.ParticipantId)
if dkgProposalParticipant.Status != internal.MasterKeyAwaitConfirmation {
2020-09-29 08:05:40 -07:00
err = fmt.Errorf("cannot confirm response with {Status} = {\"%s\"}", dkgProposalParticipant.Status)
2020-08-12 06:40:03 -07:00
return
}
2020-08-24 00:31:33 -07:00
dkgProposalParticipant.DkgMasterKey = make([]byte, len(request.MasterKey))
2020-08-21 09:21:42 -07:00
copy(dkgProposalParticipant.DkgMasterKey, request.MasterKey)
2020-08-12 06:40:03 -07:00
dkgProposalParticipant.Status = internal.MasterKeyConfirmed
2020-08-19 06:47:38 -07:00
dkgProposalParticipant.UpdatedAt = request.CreatedAt
2020-08-24 16:41:22 -07:00
m.payload.DKGProposalPayload.UpdatedAt = request.CreatedAt
2020-08-19 06:47:38 -07:00
2020-08-12 06:40:03 -07:00
m.payload.DKGQuorumUpdate(request.ParticipantId, dkgProposalParticipant)
return
}
func (m *DKGProposalFSM) actionValidateDkgProposalAwaitMasterKey(inEvent fsm.Event, args ...interface{}) (outEvent fsm.Event, response interface{}, err error) {
var (
2020-08-19 07:26:10 -07:00
isContainsError bool
masterKeys [][]byte
2020-08-12 06:40:03 -07:00
)
m.payloadMu.Lock()
defer m.payloadMu.Unlock()
2020-08-19 07:26:10 -07:00
if m.payload.DKGProposalPayload.IsExpired() {
outEvent = eventDKGMasterKeyConfirmationCancelByTimeoutInternal
return
}
2020-08-12 06:40:03 -07:00
unconfirmedParticipants := m.payload.DKGQuorumCount()
2020-08-12 07:16:07 -07:00
2020-08-12 06:40:03 -07:00
for _, participant := range m.payload.DKGProposalPayload.Quorum {
2020-08-19 07:26:10 -07:00
if participant.Status == internal.MasterKeyConfirmationError {
isContainsError = true
} else if participant.Status == internal.MasterKeyConfirmed {
2020-08-21 09:21:42 -07:00
masterKeys = append(masterKeys, participant.DkgMasterKey)
2020-08-19 07:26:10 -07:00
unconfirmedParticipants--
2020-08-12 06:40:03 -07:00
}
}
if isContainsError {
outEvent = eventDKGMasterKeyConfirmationCancelByErrorInternal
return
}
2020-08-12 07:16:07 -07:00
// Temporary simplest match master keys
if len(masterKeys) > 1 {
2020-08-24 16:41:22 -07:00
for _, masterKey := range masterKeys {
if !reflect.DeepEqual(masterKey, masterKeys[0]) {
for _, participant := range m.payload.DKGProposalPayload.Quorum {
participant.Status = internal.MasterKeyConfirmationError
participant.Error = errors.New("master key is mismatched")
2020-08-12 07:16:07 -07:00
}
2020-08-24 16:41:22 -07:00
outEvent = eventDKGMasterKeyConfirmationCancelByErrorInternal
return
2020-08-12 07:16:07 -07:00
}
}
}
2020-08-12 06:40:03 -07:00
// The are no declined and timed out participants, check for all confirmations
if unconfirmedParticipants > 0 {
return
}
outEvent = eventDKGMasterKeyConfirmedInternal
2020-08-12 07:16:07 -07:00
for _, participant := range m.payload.DKGProposalPayload.Quorum {
participant.Status = internal.MasterKeyConfirmed
}
2020-08-11 09:46:18 -07:00
return
}
// Errors
2020-08-08 14:44:52 -07:00
func (m *DKGProposalFSM) actionConfirmationError(inEvent fsm.Event, args ...interface{}) (outEvent fsm.Event, response interface{}, err error) {
m.payloadMu.Lock()
defer m.payloadMu.Unlock()
if len(args) != 1 {
err = errors.New("{arg0} required {DKGProposalConfirmationErrorRequest}")
return
}
request, ok := args[0].(requests.DKGProposalConfirmationErrorRequest)
if !ok {
err = errors.New("cannot cast {arg0} to type {DKGProposalConfirmationErrorRequest}")
return
}
if err = request.Validate(); err != nil {
return
}
2020-08-12 06:40:03 -07:00
if !m.payload.DKGQuorumExists(request.ParticipantId) {
err = errors.New("{ParticipantId} not exist in quorum")
return
}
2020-08-12 06:40:03 -07:00
dkgProposalParticipant := m.payload.DKGQuorumGet(request.ParticipantId)
// TODO: Move to methods
2020-08-08 14:44:52 -07:00
switch inEvent {
case EventDKGCommitConfirmationError:
switch dkgProposalParticipant.Status {
case internal.CommitAwaitConfirmation:
dkgProposalParticipant.Status = internal.CommitConfirmationError
case internal.CommitConfirmed:
err = errors.New("{Status} already confirmed")
case internal.CommitConfirmationError:
2020-09-29 08:05:40 -07:00
err = fmt.Errorf("{Status} already has {\"%s\"}", internal.CommitConfirmationError)
default:
2020-09-29 08:05:40 -07:00
err = fmt.Errorf(
"{Status} now is \"%s\" and cannot set to {\"%s\"}",
dkgProposalParticipant.Status,
2020-08-12 06:40:03 -07:00
internal.CommitConfirmationError,
2020-09-29 08:05:40 -07:00
)
}
case EventDKGDealConfirmationError:
switch dkgProposalParticipant.Status {
case internal.DealAwaitConfirmation:
2020-08-12 06:40:03 -07:00
dkgProposalParticipant.Status = internal.DealConfirmationError
case internal.DealConfirmed:
err = errors.New("{Status} already confirmed")
case internal.DealConfirmationError:
2020-09-29 08:05:40 -07:00
err = fmt.Errorf("{Status} already has {\"%s\"}", internal.DealConfirmationError)
default:
2020-09-29 08:05:40 -07:00
err = fmt.Errorf(
"{Status} now is \"%s\" and cannot set to {\"%s\"}",
dkgProposalParticipant.Status,
2020-08-12 06:40:03 -07:00
internal.DealConfirmationError,
2020-09-29 08:05:40 -07:00
)
}
case EventDKGResponseConfirmationError:
switch dkgProposalParticipant.Status {
case internal.ResponseAwaitConfirmation:
2020-08-12 06:40:03 -07:00
dkgProposalParticipant.Status = internal.ResponseConfirmationError
case internal.ResponseConfirmed:
err = errors.New("{Status} already confirmed")
case internal.ResponseConfirmationError:
2020-09-29 08:05:40 -07:00
err = fmt.Errorf("{Status} already has {\"%s\"}", internal.ResponseConfirmationError)
default:
2020-09-29 08:05:40 -07:00
err = fmt.Errorf(
"{Status} now is \"%s\" and cannot set to {\"%s\"}",
dkgProposalParticipant.Status,
2020-08-12 06:40:03 -07:00
internal.ResponseConfirmationError,
2020-09-29 08:05:40 -07:00
)
2020-08-12 06:40:03 -07:00
}
case EventDKGMasterKeyConfirmationError:
switch dkgProposalParticipant.Status {
case internal.MasterKeyAwaitConfirmation:
dkgProposalParticipant.Status = internal.MasterKeyConfirmationError
case internal.MasterKeyConfirmed:
err = errors.New("{Status} already confirmed")
case internal.MasterKeyConfirmationError:
2020-09-29 08:05:40 -07:00
err = fmt.Errorf("{Status} already has {\"%s\"}", internal.MasterKeyConfirmationError)
2020-08-12 06:40:03 -07:00
default:
2020-09-29 08:05:40 -07:00
err = fmt.Errorf(
2020-08-12 06:40:03 -07:00
"{Status} now is \"%s\" and cannot set to {\"%s\"}",
dkgProposalParticipant.Status,
internal.MasterKeyConfirmationError,
2020-09-29 08:05:40 -07:00
)
}
default:
2020-09-29 08:05:40 -07:00
err = fmt.Errorf("{%s} event cannot be used for action {actionConfirmationError}", inEvent)
}
if err != nil {
return
}
2020-08-12 06:40:03 -07:00
dkgProposalParticipant.Error = request.Error
2020-08-19 06:47:38 -07:00
2020-08-13 08:22:06 -07:00
dkgProposalParticipant.UpdatedAt = request.CreatedAt
2020-08-24 16:41:22 -07:00
m.payload.DKGProposalPayload.UpdatedAt = request.CreatedAt
2020-08-12 06:40:03 -07:00
m.payload.DKGQuorumUpdate(request.ParticipantId, dkgProposalParticipant)
2020-08-08 14:44:52 -07:00
// TODO: Add outEvent
2020-08-06 17:20:13 -07:00
return
}