diff --git a/chains/btc/executor/executor.go b/chains/btc/executor/executor.go index 8238fc78..c3501ce3 100644 --- a/chains/btc/executor/executor.go +++ b/chains/btc/executor/executor.go @@ -101,11 +101,33 @@ func (e *Executor) Execute(proposals []*proposal.Proposal) error { if len(props) == 0 { return nil } - resource, ok := e.resources[props[0].Data.ResourceId] - if !ok { - return fmt.Errorf("no address for resource") + + propsPerResource := make(map[[32]byte][]*BtcTransferProposal) + for _, prop := range props { + propsPerResource[prop.Data.ResourceId] = append(propsPerResource[prop.Data.ResourceId], prop) } + p := pool.New().WithErrors() + for resourceID, props := range propsPerResource { + resourceID := resourceID + props := props + + p.Go(func() error { + resource, ok := e.resources[resourceID] + if !ok { + return fmt.Errorf("no resource for ID %s", hex.EncodeToString(resourceID[:])) + } + + sessionID := fmt.Sprintf("%s-%s", sessionID, hex.EncodeToString(resourceID[:])) + return e.executeResourceProps(props, resource, sessionID) + }) + } + return p.Wait() +} + +func (e *Executor) executeResourceProps(props []*BtcTransferProposal, resource config.Resource, sessionID string) error { + log.Info().Str("SessionID", sessionID).Msgf("Executing proposals for resource %s", hex.EncodeToString(resource.ResourceID[:])) + tx, utxos, err := e.rawTx(props, resource) if err != nil { return err