Skip to content
Draft
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
13 changes: 12 additions & 1 deletion api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
"github.com/data-preservation-programs/singularity/service"
"github.com/data-preservation-programs/singularity/service/contentprovider"
"github.com/data-preservation-programs/singularity/util"
"github.com/data-preservation-programs/singularity/util/keystore"
"github.com/filecoin-project/lassie/pkg/lassie"
logging "github.com/ipfs/go-log/v2"
"github.com/labstack/echo/v4"
Expand All @@ -47,6 +48,7 @@ type Server struct {
listener net.Listener
lotusClient jsonrpc.RPCClient
dealMaker replication.DealMaker
keyStore keystore.KeyStore
closer io.Closer
host host.Host
retriever *retriever.Retriever
Expand Down Expand Up @@ -135,6 +137,10 @@ func InitServer(ctx context.Context, params APIParams) (*Server, error) {
endpointfinder.WithErrorLruSize(128),
endpointfinder.WithErrorLruTimeout(time.Minute*5),
)
ks, err := keystore.NewLocalKeyStore(wallet.GetKeystoreDir())
if err != nil {
return nil, errors.Wrap(err, "failed to init keystore")
}
return &Server{
db: db,
host: h,
Expand All @@ -146,6 +152,7 @@ func InitServer(ctx context.Context, params APIParams) (*Server, error) {
time.Hour,
time.Minute*5,
),
keyStore: ks,
retriever: retriever.NewRetriever(lassie, endpointFinder),
closer: closer,
adminHandler: &admin.DefaultHandler{},
Expand Down Expand Up @@ -219,6 +226,10 @@ func (s *Server) toEchoHandler(handlerFunc any) echo.HandlerFunc {
inputParams = append(inputParams, reflect.ValueOf(s.dealMaker))
continue
}
if paramType.String() == "keystore.KeyStore" {
inputParams = append(inputParams, reflect.ValueOf(s.keyStore))
continue
}
if paramType.Kind() == reflect.String || isIntKind(paramType.Kind()) || isUIntKind(paramType.Kind()) {
if j >= len(c.ParamValues()) {
logger.Error("Invalid handler function signature.")
Expand Down Expand Up @@ -347,7 +358,7 @@ func (s *Server) setupRoutes(e *echo.Echo) {
e.DELETE("/api/preparation/:id/piece/:piece_cid", s.toEchoHandler(s.dataprepHandler.DeletePieceHandler))

// Wallet
e.POST("/api/wallet", s.toEchoHandler(s.walletHandler.ImportHandler))
e.POST("/api/wallet", s.toEchoHandler(s.walletHandler.ImportKeystoreHandler))
e.GET("/api/wallet", s.toEchoHandler(s.walletHandler.ListHandler))
e.DELETE("/api/wallet/:address", s.toEchoHandler(s.walletHandler.RemoveHandler))

Expand Down
9 changes: 5 additions & 4 deletions api/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
"github.com/data-preservation-programs/singularity/model"
"github.com/data-preservation-programs/singularity/replication"
"github.com/data-preservation-programs/singularity/service"
"github.com/data-preservation-programs/singularity/util/keystore"
"github.com/data-preservation-programs/singularity/util"
"github.com/data-preservation-programs/singularity/util/testutil"
"github.com/gotidy/ptr"
Expand All @@ -50,8 +51,8 @@ type MockDealMaker struct {
mock.Mock
}

func (m *MockDealMaker) MakeDeal(ctx context.Context, walletObj model.Wallet, car model.Car, dealConfig replication.DealConfig) (*model.Deal, error) {
args := m.Called(ctx, walletObj, car, dealConfig)
func (m *MockDealMaker) MakeDeal(ctx context.Context, db *gorm.DB, ks keystore.KeyStore, actorObj model.Actor, car model.Car, dealConfig replication.DealConfig) (*model.Deal, error) {
args := m.Called(ctx, actorObj, car, dealConfig)
return args.Get(0).(*model.Deal), args.Error(1)
}

Expand Down Expand Up @@ -97,7 +98,7 @@ func setupMockDeal() deal.Handler {
m := new(deal.MockDeal)
m.On("ListHandler", mock.Anything, mock.Anything, mock.Anything).
Return([]model.Deal{{}}, nil)
m.On("SendManualHandler", mock.Anything, mock.Anything, mock.Anything, mock.Anything).
m.On("SendManualHandler", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).
Return(&model.Deal{}, nil)
return m
}
Expand Down Expand Up @@ -191,7 +192,7 @@ func setupMockWallet() wallet.Handler {
m.On("ListHandler", mock.Anything, mock.Anything).
Return([]model.Wallet{{}}, nil)
m.On("ListAttachedHandler", mock.Anything, mock.Anything, "id").
Return([]model.Wallet{{}}, nil)
Return([]model.Actor{{}}, nil)
m.On("RemoveHandler", mock.Anything, mock.Anything, "wallet").
Return(nil)
return m
Expand Down
4 changes: 2 additions & 2 deletions cmd/dataprep_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ var testPreparation = model.Preparation{
DeleteAfterExport: false,
MaxSize: 100,
PieceSize: 200,
Wallets: []model.Wallet{{
Actors: []model.Actor{{
ID: "client_id",
Address: "client_address",
PrivateKey: "private_key",
Expand Down Expand Up @@ -225,7 +225,7 @@ func TestDataPreparationListAttachedWalletHandler(t *testing.T) {
mockHandler := new(wallet.MockWallet)
defer swapWalletHandler(mockHandler)()

mockHandler.On("ListAttachedHandler", mock.Anything, mock.Anything, mock.Anything).Return(testPreparation.Wallets, nil)
mockHandler.On("ListAttachedHandler", mock.Anything, mock.Anything, mock.Anything).Return(testPreparation.Actors, nil)
_, _, err := runner.Run(ctx, "singularity prep list-wallets 1")
require.NoError(t, err)

Expand Down
10 changes: 9 additions & 1 deletion cmd/deal/send-manual.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ import (
"github.com/data-preservation-programs/singularity/cmd/cliutil"
"github.com/data-preservation-programs/singularity/database"
"github.com/data-preservation-programs/singularity/handler/deal"
"github.com/data-preservation-programs/singularity/handler/wallet"
"github.com/data-preservation-programs/singularity/replication"
"github.com/data-preservation-programs/singularity/service/epochutil"
"github.com/data-preservation-programs/singularity/util"
"github.com/data-preservation-programs/singularity/util/keystore"
"github.com/urfave/cli/v2"
)

Expand Down Expand Up @@ -176,13 +178,19 @@ Notes:
return errors.Wrap(err, "failed to init host")
}
defer h.Close()

ks, err := keystore.NewLocalKeyStore(wallet.GetKeystoreDir())
if err != nil {
return errors.Wrap(err, "failed to init keystore")
}

dealMaker := replication.NewDealMaker(
util.NewLotusClient(c.String("lotus-api"), c.String("lotus-token")),
h,
10*timeout,
timeout,
)
dealModel, err := deal.Default.SendManualHandler(ctx, db, dealMaker, proposal)
dealModel, err := deal.Default.SendManualHandler(ctx, db, ks, dealMaker, proposal)
if err != nil {
return errors.WithStack(err)
}
Expand Down
6 changes: 3 additions & 3 deletions cmd/deal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ func swapDealHandler(mockHandler deal.Handler) func() {

func TestSendDealHandler(t *testing.T) {
testutil.One(t, func(ctx context.Context, t *testing.T, db *gorm.DB) {
err := db.Create(&model.Wallet{ID: "client_id"}).Error
err := db.Create(&model.Actor{ID: "client_id"}).Error
require.NoError(t, err)
runner := NewRunner()
defer runner.Save(t)
mockHandler := new(deal.MockDeal)
defer swapDealHandler(mockHandler)()
mockHandler.On("SendManualHandler", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&model.Deal{
mockHandler.On("SendManualHandler", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&model.Deal{
State: "proposed",
Provider: "f01",
ProposalID: "proposal_id",
Expand All @@ -46,7 +46,7 @@ func TestSendDealHandler(t *testing.T) {
}, nil).Once()
_, _, err = runner.Run(ctx, "singularity deal send-manual --client client --provider provider --piece-cid piece_cid --piece-size 1024 --save")
require.NoError(t, err)
mockHandler.On("SendManualHandler", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&model.Deal{
mockHandler.On("SendManualHandler", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&model.Deal{
State: "proposed",
Provider: "f01",
ProposalID: "proposal_id",
Expand Down
16 changes: 10 additions & 6 deletions cmd/wallet/import.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ import (
"github.com/data-preservation-programs/singularity/cmd/cliutil"
"github.com/data-preservation-programs/singularity/database"
"github.com/data-preservation-programs/singularity/handler/wallet"
"github.com/data-preservation-programs/singularity/util"
"github.com/data-preservation-programs/singularity/util/keystore"
"github.com/urfave/cli/v2"
)

var ImportCmd = &cli.Command{
Name: "import",
Usage: "Import a wallet from exported private key",
Usage: "Import a wallet from a private key file into the keystore",
ArgsUsage: "[path, or stdin if omitted]",
Action: func(c *cli.Context) error {
db, closer, err := database.OpenFromCLI(c)
Expand All @@ -41,12 +41,16 @@ var ImportCmd = &cli.Command{
}
}

lotusClient := util.NewLotusClient(c.String("lotus-api"), c.String("lotus-token"))
w, err := wallet.Default.ImportHandler(
ks, err := keystore.NewLocalKeyStore(wallet.GetKeystoreDir())
if err != nil {
return errors.Wrap(err, "failed to init keystore")
}

w, err := wallet.Default.ImportKeystoreHandler(
c.Context,
db,
lotusClient,
wallet.ImportRequest{
ks,
wallet.ImportKeystoreRequest{
PrivateKey: privateKey,
})
if err != nil {
Expand Down
15 changes: 6 additions & 9 deletions cmd/wallet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,8 @@ func TestWalletImport(t *testing.T) {
mockHandler := new(wallet.MockWallet)
defer swapWalletHandler(mockHandler)()
mockHandler.On("ImportHandler", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&model.Wallet{
ID: "id",
Address: "address",
PrivateKey: "private",
ID: 1,
Address: "address",
}, nil)
_, _, err = runner.Run(ctx, "singularity wallet import "+testutil.EscapePath(filepath.Join(tmp, "private")))
require.NoError(t, err)
Expand All @@ -51,13 +50,11 @@ func TestWalletList(t *testing.T) {
mockHandler := new(wallet.MockWallet)
defer swapWalletHandler(mockHandler)()
mockHandler.On("ListHandler", mock.Anything, mock.Anything).Return([]model.Wallet{{
ID: "id1",
Address: "address1",
PrivateKey: "private1",
ID: 1,
Address: "address1",
}, {
ID: "id2",
Address: "address2",
PrivateKey: "private2",
ID: 2,
Address: "address2",
}}, nil)
_, _, err := runner.Run(ctx, "singularity wallet list")
require.NoError(t, err)
Expand Down
12 changes: 4 additions & 8 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ require (
github.com/bcicen/jstream v1.0.1
github.com/brianvoe/gofakeit/v6 v6.23.2
github.com/cockroachdb/errors v1.11.3
github.com/data-preservation-programs/go-synapse v0.0.0-20260220134035-b27d67ac9095
github.com/data-preservation-programs/table v0.0.3
github.com/dustin/go-humanize v1.0.1
github.com/ethereum/go-ethereum v1.14.12
github.com/fatih/color v1.18.0
github.com/filecoin-project/go-address v1.2.0
github.com/filecoin-project/go-cbor-util v0.0.2
Expand Down Expand Up @@ -48,7 +50,6 @@ require (
github.com/ipni/go-libipni v0.6.14
github.com/jellydator/ttlcache/v3 v3.0.1
github.com/joho/godotenv v1.5.1
github.com/jsign/go-filsigner v0.4.1
github.com/klauspost/compress v1.18.1
github.com/labstack/echo/v4 v4.10.2
github.com/libp2p/go-libp2p v0.44.0
Expand Down Expand Up @@ -145,24 +146,19 @@ require (
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect
github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect
github.com/data-preservation-programs/go-synapse v0.0.0-20260206105716-b6a5e7e6808e // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/dchest/blake2b v1.0.0 // indirect
github.com/deckarep/golang-set/v2 v2.6.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
github.com/distribution/reference v0.6.0 // indirect
github.com/docker/docker v28.5.1+incompatible // indirect
github.com/docker/go-connections v0.6.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/drand/kyber v1.3.1 // indirect
github.com/drand/kyber-bls12381 v0.3.3 // indirect
github.com/dropbox/dropbox-sdk-go-unofficial/v6 v6.0.5 // indirect
github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 // indirect
github.com/emersion/go-message v0.18.2 // indirect
github.com/emersion/go-vcard v0.0.0-20241024213814-c9703dde27ff // indirect
github.com/ethereum/c-kzg-4844 v1.0.0 // indirect
github.com/ethereum/go-ethereum v1.14.12 // indirect
github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/filecoin-project/filecoin-ffi v1.34.0 // indirect
Expand Down Expand Up @@ -256,7 +252,6 @@ require (
github.com/jpillora/backoff v1.0.0 // indirect
github.com/jtolio/noiseconn v0.0.0-20231127013910-f6d9ecbf1de7 // indirect
github.com/jzelinskie/whirlpool v0.0.0-20201016144138-0675e54bb004 // indirect
github.com/kilic/bls12-381 v0.1.1-0.20220929213557-ca162e8a70f4 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/koofr/go-httpclient v0.0.0-20240520111329-e20f8f203988 // indirect
github.com/koofr/go-koofrclient v0.0.0-20221207135200-cbd7fc9ad6a6 // indirect
Expand All @@ -282,6 +277,7 @@ require (
github.com/miekg/dns v1.1.68 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mmcloughlin/addchain v0.4.0 // indirect
github.com/moby/docker-image-spec v1.3.1 // indirect
Expand Down Expand Up @@ -356,7 +352,7 @@ require (
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/supranational/blst v0.3.13 // indirect
github.com/supranational/blst v0.3.16 // indirect
github.com/swaggo/files/v2 v2.0.0 // indirect
github.com/t3rm1n4l/go-mega v0.0.0-20250926104142-ccb8d3498e6c // indirect
github.com/tklauser/go-sysconf v0.3.15 // indirect
Expand Down
Loading