Skip to content
This repository was archived by the owner on Feb 8, 2026. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions api/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ func (s *Server) CreatePluginPolicy(c echo.Context) error {

// We re-init plugin as verification server doesn't have plugin defined

if err := s.plugin.ValidatePluginPolicy(policy); err != nil {
if err := s.plugin.ValidateCreatePluginPolicy(policy); err != nil {
s.logger.WithError(err).Error("failed to validate plugin policy")
return c.JSON(http.StatusBadRequest, NewErrorResponse("failed to validate policy"))
}
Expand Down Expand Up @@ -209,7 +209,7 @@ func (s *Server) UpdatePluginPolicyById(c echo.Context) error {
return fmt.Errorf("fail to parse request, err: %w", err)
}

if err := s.plugin.ValidatePluginPolicy(policy); err != nil {
if err := s.plugin.ValidateUpdatePluginPolicy(policy); err != nil {
s.logger.WithError(err).
WithField("plugin_id", policy.PluginID).
WithField("policy_id", policy.ID).
Expand Down Expand Up @@ -259,6 +259,13 @@ func (s *Server) DeletePluginPolicyById(c echo.Context) error {
return c.JSON(http.StatusInternalServerError, NewErrorResponse("failed to get policy"))
}

if err := s.plugin.ValidateDeletePluginPolicy(*policy); err != nil {
s.logger.WithError(err).
WithField("policy_id", policyID).
Error("Failed to validate plugin policy")
return c.JSON(http.StatusBadRequest, NewErrorResponse("failed to validate policy"))
}

// This is because we have different signature stored in the database.
policy.Signature = reqBody.Signature

Expand Down
6 changes: 3 additions & 3 deletions api/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import (
"github.com/labstack/echo/v4/middleware"
"github.com/labstack/gommon/log"
"github.com/sirupsen/logrus"
plugincommon "github.com/vultisig/plugin/plugin/common"
vcommon "github.com/vultisig/verifier/common"
"github.com/vultisig/verifier/plugin"
vtypes "github.com/vultisig/verifier/types"
"github.com/vultisig/verifier/vault"

Expand All @@ -37,7 +37,7 @@ type Server struct {
sdClient *statsd.Client
scheduler *scheduler.SchedulerService
policyService service.Policy
plugin plugin.Plugin
plugin plugincommon.Plugin
logger *logrus.Logger
mode string
}
Expand All @@ -52,7 +52,7 @@ func NewServer(
client *asynq.Client,
inspector *asynq.Inspector,
sdClient *statsd.Client,
p plugin.Plugin,
p plugincommon.Plugin,
) *Server {
logger := logrus.WithField("service", "plugin").Logger
schedulerService, err := scheduler.NewSchedulerService(
Expand Down
22 changes: 22 additions & 0 deletions plugin/common/plugin.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package common

import (
"context"

"github.com/vultisig/mobile-tss-lib/tss"
rtypes "github.com/vultisig/recipes/types"
"github.com/vultisig/verifier/types"
)

type Plugin interface {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm I don't think this works best

The goal of having a verifier/plugin interface is to ensure that we, at a minimum, implement the core functionality that a plugin needs to be functional - separating it out is possible, but I don't think we should do it just yet

If anything, this interface should have the verifier plugin interface embedded in it, not duplicate the functions

GetRecipeSpecification() *rtypes.RecipeSchema

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or we should even consider upstreaming it (but maybe at a later date)

ValidatePluginPolicy(policyDoc types.PluginPolicy) error // Used for validating a document that already exists when signing a transaction. Mostly checks on typing and constraints.
ValidateUpdatePluginPolicy(policyDoc types.PluginPolicy) error // Additional validations for updating a policy.
ValidateCreatePluginPolicy(policyDoc types.PluginPolicy) error // Additional validations for creating a policy. e.g. can't create more than one fee policy
ValidateDeletePluginPolicy(policyDoc types.PluginPolicy) error // Additional validations for deleting a policy. e.g. can't delete fee policy if there are fees still pending collection or other active plugins

ProposeTransactions(policy types.PluginPolicy) ([]types.PluginKeysignRequest, error)
ValidateProposedTransactions(policy types.PluginPolicy, txs []types.PluginKeysignRequest) error
SigningComplete(ctx context.Context, signature tss.KeysignResponse, signRequest types.PluginKeysignRequest, policy types.PluginPolicy) error
}
14 changes: 12 additions & 2 deletions plugin/dca/dca.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ import (
"github.com/vultisig/mobile-tss-lib/tss"
"github.com/vultisig/verifier/address"
vcommon "github.com/vultisig/verifier/common"
"github.com/vultisig/verifier/plugin"
vtypes "github.com/vultisig/verifier/types"

rtypes "github.com/vultisig/recipes/types"

"github.com/vultisig/plugin/common"
"github.com/vultisig/plugin/internal/sigutil"
"github.com/vultisig/plugin/pkg/uniswap"
plugincommon "github.com/vultisig/plugin/plugin/common"
"github.com/vultisig/plugin/storage"
)

Expand All @@ -47,7 +47,7 @@ var (
ErrCompletedPolicy = errors.New("policy completed all swaps")
)

var _ plugin.Plugin = (*DCAPlugin)(nil)
var _ plugincommon.Plugin = (*DCAPlugin)(nil)

type DCAPlugin struct {
uniswapClient *uniswap.Client
Expand Down Expand Up @@ -231,6 +231,16 @@ func (p *DCAPlugin) ValidatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return nil
}

func (p *DCAPlugin) ValidateCreatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return p.ValidatePluginPolicy(policyDoc)
}
func (p *DCAPlugin) ValidateUpdatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return p.ValidatePluginPolicy(policyDoc)
}
Comment on lines +236 to +239

Copilot AI Jul 16, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Missing spacing between function definitions. Consider adding a blank line after the previous function to improve readability and maintain consistency with the codebase formatting.

Suggested change
}
func (p *DCAPlugin) ValidateUpdatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return p.ValidatePluginPolicy(policyDoc)
}
}
func (p *DCAPlugin) ValidateUpdatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return p.ValidatePluginPolicy(policyDoc)
}

Copilot uses AI. Check for mistakes.
Comment on lines +236 to +239

Copilot AI Jul 16, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Missing spacing between function definitions. Consider adding a blank line after the previous function to improve readability and maintain consistency with the codebase formatting.

Suggested change
}
func (p *DCAPlugin) ValidateUpdatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return p.ValidatePluginPolicy(policyDoc)
}
}
func (p *DCAPlugin) ValidateUpdatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return p.ValidatePluginPolicy(policyDoc)
}

Copilot uses AI. Check for mistakes.
func (p *DCAPlugin) ValidateDeletePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return p.ValidatePluginPolicy(policyDoc)
}

func validateInterval(intervalStr string, frequency string) error {
interval, err := strconv.Atoi(intervalStr)
if err != nil {
Expand Down
4 changes: 2 additions & 2 deletions plugin/fees/fees.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"github.com/hibiken/asynq"
"github.com/sirupsen/logrus"
vcommon "github.com/vultisig/verifier/common"
"github.com/vultisig/verifier/plugin"
"github.com/vultisig/verifier/tx_indexer"
vtypes "github.com/vultisig/verifier/types"
"golang.org/x/sync/errgroup"
Expand All @@ -19,6 +18,7 @@ import (

"github.com/vultisig/plugin/internal/types"
"github.com/vultisig/plugin/internal/verifierapi"
"github.com/vultisig/plugin/plugin/common"
"github.com/vultisig/plugin/storage"
"github.com/vultisig/recipes/sdk/evm"
)
Expand All @@ -29,7 +29,7 @@ All key logic related to fees will go here, that includes
- getting fee information
*/

var _ plugin.Plugin = (*FeePlugin)(nil)
var _ common.Plugin = (*FeePlugin)(nil)

type FeePlugin struct {
vaultService *vault.ManagementService
Expand Down
12 changes: 12 additions & 0 deletions plugin/fees/policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,18 @@ func (fp *FeePlugin) ValidatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return plugin.ValidatePluginPolicy(policyDoc, fp.GetRecipeSpecification())
}

func (fp *FeePlugin) ValidateUpdatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return plugin.ValidatePluginPolicy(policyDoc, fp.GetRecipeSpecification())
}

func (fp *FeePlugin) ValidateCreatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return plugin.ValidatePluginPolicy(policyDoc, fp.GetRecipeSpecification())
}

func (fp *FeePlugin) ValidateDeletePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return plugin.ValidatePluginPolicy(policyDoc, fp.GetRecipeSpecification())
}

func (fp *FeePlugin) GetRecipeSpecification() *rtypes.RecipeSchema {
return &rtypes.RecipeSchema{
Version: 1, // Schema version
Expand Down
8 changes: 4 additions & 4 deletions plugin/payroll/payroll.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ import (
"github.com/ethereum/go-ethereum/ethclient"
"github.com/hibiken/asynq"
"github.com/sirupsen/logrus"
"github.com/vultisig/plugin/plugin/common"
"github.com/vultisig/plugin/storage"
"github.com/vultisig/recipes/sdk/evm"
"github.com/vultisig/verifier/common"
"github.com/vultisig/verifier/plugin"
vcommon "github.com/vultisig/verifier/common"
"github.com/vultisig/verifier/tx_indexer"
"github.com/vultisig/verifier/vault"
)

var _ plugin.Plugin = (*PayrollPlugin)(nil)
var _ common.Plugin = (*PayrollPlugin)(nil)

type PayrollPlugin struct {
db storage.DatabaseStorage
Expand Down Expand Up @@ -50,7 +50,7 @@ func NewPayrollPlugin(
return nil, err
}

ethEvmChainID, err := common.Ethereum.EvmID()
ethEvmChainID, err := vcommon.Ethereum.EvmID()
if err != nil {
return nil, fmt.Errorf("common.Ethereum.EvmID: %w", err)
}
Expand Down
12 changes: 12 additions & 0 deletions plugin/payroll/policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,15 @@ func (p *PayrollPlugin) ValidateProposedTransactions(policy vtypes.PluginPolicy,
func (p *PayrollPlugin) ValidatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return plugin.ValidatePluginPolicy(policyDoc, p.GetRecipeSpecification())
}

func (p *PayrollPlugin) ValidateCreatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return p.ValidatePluginPolicy(policyDoc)
}

func (p *PayrollPlugin) ValidateUpdatePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return p.ValidatePluginPolicy(policyDoc)
}

func (p *PayrollPlugin) ValidateDeletePluginPolicy(policyDoc vtypes.PluginPolicy) error {
return p.ValidatePluginPolicy(policyDoc)
}