mirror of
https://github.com/luxfi/node.git
synced 2026-10-30 15:24:05 +00:00
62 lines
1.3 KiB
Go
62 lines
1.3 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/xvm/txs"
|
|
lux "github.com/luxfi/utxo"
|
|
)
|
|
|
|
var _ Signer = (*signer)(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)
|
|
}
|
|
|
|
type signer struct {
|
|
kc keychain.Keychain
|
|
backend Backend
|
|
}
|
|
|
|
func New(kc keychain.Keychain, backend Backend) Signer {
|
|
return &signer{
|
|
kc: kc,
|
|
backend: backend,
|
|
}
|
|
}
|
|
|
|
func (s *signer) 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}
|
|
return tx, signer.Sign(ctx, tx)
|
|
}
|