mirror of
https://github.com/luxfi/node.git
synced 2026-10-30 15:24:05 +00:00
67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
// Copyright (C) 2019-2025, Lux Industries Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package signer
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/luxfi/ids"
|
|
"github.com/luxfi/keychain"
|
|
"github.com/luxfi/node/vms/platformvm/fx"
|
|
"github.com/luxfi/node/vms/platformvm/txs"
|
|
lux "github.com/luxfi/utxo"
|
|
)
|
|
|
|
var _ Signer = (*txSigner)(nil)
|
|
|
|
type Signer interface {
|
|
// Sign adds as many missing signatures as possible to the provided
|
|
// transaction.
|
|
//
|
|
// If there are already some signatures on the transaction, those signatures
|
|
// will not be removed.
|
|
//
|
|
// If the signer doesn't have the ability to provide a required signature,
|
|
// the signature slot will be skipped without reporting an error.
|
|
Sign(ctx context.Context, tx *txs.Tx) error
|
|
}
|
|
|
|
type Backend interface {
|
|
GetUTXO(ctx context.Context, chainID, utxoID ids.ID) (*lux.UTXO, error)
|
|
GetOwner(ctx context.Context, ownerID ids.ID) (fx.Owner, error)
|
|
}
|
|
|
|
type txSigner struct {
|
|
kc keychain.Keychain
|
|
backend Backend
|
|
}
|
|
|
|
func New(kc keychain.Keychain, backend Backend) Signer {
|
|
return &txSigner{
|
|
kc: kc,
|
|
backend: backend,
|
|
}
|
|
}
|
|
|
|
func (s *txSigner) Sign(ctx context.Context, tx *txs.Tx) error {
|
|
return tx.Unsigned.Visit(&visitor{
|
|
kc: s.kc,
|
|
backend: s.backend,
|
|
ctx: ctx,
|
|
tx: tx,
|
|
})
|
|
}
|
|
|
|
func SignUnsigned(
|
|
ctx context.Context,
|
|
signer Signer,
|
|
utx txs.UnsignedTx,
|
|
) (*txs.Tx, error) {
|
|
tx := &txs.Tx{Unsigned: utx}
|
|
if err := signer.Sign(ctx, tx); err != nil {
|
|
return nil, err
|
|
}
|
|
return tx, nil
|
|
}
|