Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(staking): add tx hash #3573

Merged
merged 2 commits into from Nov 24, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion openapi/SwarmDebug.yaml
Expand Up @@ -1035,7 +1035,7 @@ paths:
- $ref: "SwarmCommon.yaml#/components/parameters/GasLimitParameter"
responses:
"200":
description: Amount successfully staked
$ref: "SwarmCommon.yaml#/components/schemas/StakeDepositResponse"
"400":
$ref: "SwarmCommon.yaml#/components/responses/400"
"500":
Expand Down
20 changes: 10 additions & 10 deletions pkg/api/postage.go
Expand Up @@ -100,24 +100,24 @@ func (s *Service) postageCreateHandler(w http.ResponseWriter, r *http.Request) {
)
if err != nil {
if errors.Is(err, postagecontract.ErrChainDisabled) {
logger.Debug("create batch: no chain backend", "error", err, "txHash", txHash)
logger.Debug("create batch: no chain backend", "error", err)
logger.Error(nil, "create batch: no chain backend")
jsonhttp.MethodNotAllowed(w, "no chain backend")
return
}
if errors.Is(err, postagecontract.ErrInsufficientFunds) {
logger.Debug("create batch: out of funds", "error", err, "txHash", txHash)
logger.Debug("create batch: out of funds", "error", err)
logger.Error(nil, "create batch: out of funds")
jsonhttp.BadRequest(w, "out of funds")
return
}
if errors.Is(err, postagecontract.ErrInvalidDepth) {
logger.Debug("create batch: invalid depth", "error", err, "txHash", txHash)
logger.Debug("create batch: invalid depth", "error", err)
logger.Error(nil, "create batch: invalid depth")
jsonhttp.BadRequest(w, "invalid depth")
return
}
logger.Debug("create batch: create failed", "error", err, "txHash", txHash)
logger.Debug("create batch: create failed", "error", err)
logger.Error(nil, "create batch: create failed")
jsonhttp.InternalServerError(w, "cannot create batch")
return
Expand Down Expand Up @@ -466,18 +466,18 @@ func (s *Service) postageTopUpHandler(w http.ResponseWriter, r *http.Request) {
txHash, err := s.postageContract.TopUpBatch(r.Context(), paths.BatchID, paths.Amount)
if err != nil {
if errors.Is(err, postagecontract.ErrInsufficientFunds) {
logger.Debug("topup batch: out of funds", "batch_id", hexBatchID, "amount", paths.Amount, "error", err, "tx_hash", txHash)
logger.Debug("topup batch: out of funds", "batch_id", hexBatchID, "amount", paths.Amount, "error", err)
logger.Error(nil, "topup batch: out of funds")
jsonhttp.PaymentRequired(w, "out of funds")
return
}
if errors.Is(err, postagecontract.ErrNotImplemented) {
logger.Debug("topup batch: not implemented", "error", err, "tx_hash", txHash)
logger.Debug("topup batch: not implemented", "error", err)
logger.Error(nil, "topup batch: not implemented")
jsonhttp.NotImplemented(w, nil)
return
}
logger.Debug("topup batch: topup failed", "batch_id", hexBatchID, "amount", paths.Amount, "error", err, "tx_hash", txHash)
logger.Debug("topup batch: topup failed", "batch_id", hexBatchID, "amount", paths.Amount, "error", err)
logger.Error(nil, "topup batch: topup failed")
jsonhttp.InternalServerError(w, "cannot topup batch")
return
Expand Down Expand Up @@ -505,18 +505,18 @@ func (s *Service) postageDiluteHandler(w http.ResponseWriter, r *http.Request) {
txHash, err := s.postageContract.DiluteBatch(r.Context(), paths.BatchID, paths.Depth)
if err != nil {
if errors.Is(err, postagecontract.ErrInvalidDepth) {
logger.Debug("dilute batch: invalid depth", "error", err, "tx_hash", txHash)
logger.Debug("dilute batch: invalid depth", "error", err)
logger.Error(nil, "dilute batch: invalid depth")
jsonhttp.BadRequest(w, "invalid depth")
return
}
if errors.Is(err, postagecontract.ErrNotImplemented) {
logger.Debug("dilute batch: not implemented", "error", "tx_hash", txHash)
logger.Debug("dilute batch: not implemented", "error")
logger.Error(nil, "dilute batch: not implemented")
jsonhttp.NotImplemented(w, nil)
return
}
logger.Debug("dilute batch: dilute failed", "batch_id", hexBatchID, "depth", paths.Depth, "error", err, "tx_hash", txHash)
logger.Debug("dilute batch: dilute failed", "batch_id", hexBatchID, "depth", paths.Depth, "error", err)
logger.Error(nil, "dilute batch: dilute failed")
jsonhttp.InternalServerError(w, "cannot dilute batch")
return
Expand Down
9 changes: 7 additions & 2 deletions pkg/api/staking.go
Expand Up @@ -32,6 +32,9 @@ func (s *Service) stakingAccessHandler(h http.Handler) http.Handler {
type getStakeResponse struct {
StakedAmount *bigint.BigInt `json:"stakedAmount"`
}
type stakeDepositResponse struct {
TxHash string `json:"txhash"`
}

func (s *Service) stakingDepositHandler(w http.ResponseWriter, r *http.Request) {
logger := s.logger.WithName("post_stake_deposit").Build()
Expand All @@ -44,7 +47,7 @@ func (s *Service) stakingDepositHandler(w http.ResponseWriter, r *http.Request)
return
}

err := s.stakingContract.DepositStake(r.Context(), paths.Amount)
txHash, err := s.stakingContract.DepositStake(r.Context(), paths.Amount)
if err != nil {
if errors.Is(err, staking.ErrInsufficientStakeAmount) {
logger.Debug("insufficient stake amount", "minimum_stake", staking.MinimumStakeAmount, "error", err)
Expand All @@ -69,7 +72,9 @@ func (s *Service) stakingDepositHandler(w http.ResponseWriter, r *http.Request)
jsonhttp.InternalServerError(w, "cannot stake")
return
}
jsonhttp.OK(w, nil)
jsonhttp.OK(w, stakeDepositResponse{
TxHash: txHash.String(),
})
}

func (s *Service) getStakedAmountHandler(w http.ResponseWriter, r *http.Request) {
Expand Down
22 changes: 12 additions & 10 deletions pkg/api/staking_test.go
Expand Up @@ -7,6 +7,7 @@ package api_test
import (
"context"
"fmt"
"github.com/ethereum/go-ethereum/common"
"github.com/ethersphere/bee/pkg/bigint"
"math/big"
"net/http"
Expand All @@ -23,6 +24,7 @@ import (
func TestDepositStake(t *testing.T) {
t.Parallel()

txHash := common.HexToHash("0x1234")
minStake := big.NewInt(100000000000000000).String()
depositStake := func(amount string) string {
return fmt.Sprintf("/stake/%s", amount)
Expand All @@ -32,8 +34,8 @@ func TestDepositStake(t *testing.T) {
t.Parallel()

contract := stakingContractMock.New(
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) error {
return nil
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) (common.Hash, error) {
return txHash, nil
}),
)
ts, _, _, _ := newTestServer(t, testServerOptions{DebugAPI: true, StakingContract: contract})
Expand All @@ -45,8 +47,8 @@ func TestDepositStake(t *testing.T) {

invalidMinStake := big.NewInt(0).String()
contract := stakingContractMock.New(
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) error {
return staking.ErrInsufficientStakeAmount
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) (common.Hash, error) {
return common.Hash{}, staking.ErrInsufficientStakeAmount
}),
)
ts, _, _, _ := newTestServer(t, testServerOptions{DebugAPI: true, StakingContract: contract})
Expand All @@ -58,8 +60,8 @@ func TestDepositStake(t *testing.T) {
t.Parallel()

contract := stakingContractMock.New(
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) error {
return staking.ErrInsufficientFunds
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) (common.Hash, error) {
return common.Hash{}, staking.ErrInsufficientFunds
}),
)
ts, _, _, _ := newTestServer(t, testServerOptions{DebugAPI: true, StakingContract: contract})
Expand All @@ -71,8 +73,8 @@ func TestDepositStake(t *testing.T) {
t.Parallel()

contract := stakingContractMock.New(
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) error {
return fmt.Errorf("some error")
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) (common.Hash, error) {
return common.Hash{}, fmt.Errorf("some error")
}),
)
ts, _, _, _ := newTestServer(t, testServerOptions{DebugAPI: true, StakingContract: contract})
Expand All @@ -84,12 +86,12 @@ func TestDepositStake(t *testing.T) {
t.Parallel()

contract := stakingContractMock.New(
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) error {
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) (common.Hash, error) {
gasLimit := sctx.GetGasLimit(ctx)
if gasLimit != 2000000 {
t.Fatalf("want 2000000, got %d", gasLimit)
}
return nil
return txHash, nil
}),
)
ts, _, _, _ := newTestServer(t, testServerOptions{
Expand Down
4 changes: 2 additions & 2 deletions pkg/node/devnode.go
Expand Up @@ -370,8 +370,8 @@ func NewDevBee(logger log.Logger, o *DevOptions) (b *DevBee, err error) {
mockSteward := new(mockSteward.Steward)

mockStaking := stakingContractMock.New(
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) error {
return staking.ErrNotImplemented
stakingContractMock.WithDepositStake(func(ctx context.Context, stakedAmount *big.Int) (common.Hash, error) {
return common.Hash{}, staking.ErrNotImplemented
}))

debugOpts := api.ExtraOptions{
Expand Down
10 changes: 4 additions & 6 deletions pkg/postage/postagecontract/contract.go
Expand Up @@ -286,9 +286,8 @@ func (c *postageContract) CreateBatch(ctx context.Context, initialBalance *big.I
return
}

receipt, err := c.sendApproveTransaction(ctx, totalAmount)
_, err = c.sendApproveTransaction(ctx, totalAmount)
if err != nil {
txHash = receipt.TxHash
return
}

Expand All @@ -298,7 +297,7 @@ func (c *postageContract) CreateBatch(ctx context.Context, initialBalance *big.I
return
}

receipt, err = c.sendCreateBatchTransaction(ctx, c.owner, initialBalance, depth, common.BytesToHash(nonce), immutable)
receipt, err := c.sendCreateBatchTransaction(ctx, c.owner, initialBalance, depth, common.BytesToHash(nonce), immutable)
if err != nil {
return
}
Expand Down Expand Up @@ -352,13 +351,12 @@ func (c *postageContract) TopUpBatch(ctx context.Context, batchID []byte, topupB
return
}

receipt, err := c.sendApproveTransaction(ctx, totalAmount)
_, err = c.sendApproveTransaction(ctx, totalAmount)
if err != nil {
txHash = receipt.TxHash
return
}

receipt, err = c.sendTopUpBatchTransaction(ctx, batch.ID, topupBalance)
receipt, err := c.sendTopUpBatchTransaction(ctx, batch.ID, topupBalance)
if err != nil {
txHash = receipt.TxHash
return
Expand Down
24 changes: 13 additions & 11 deletions pkg/storageincentives/staking/contract.go
Expand Up @@ -35,7 +35,7 @@ var (
)

type Contract interface {
DepositStake(ctx context.Context, stakedAmount *big.Int) error
DepositStake(ctx context.Context, stakedAmount *big.Int) (common.Hash, error)
GetStake(ctx context.Context) (*big.Int, error)
}

Expand Down Expand Up @@ -159,37 +159,39 @@ func (s *contract) getStake(ctx context.Context, overlay swarm.Address) (*big.In
return abi.ConvertType(results[0], new(big.Int)).(*big.Int), nil
}

func (s *contract) DepositStake(ctx context.Context, stakedAmount *big.Int) error {
func (s *contract) DepositStake(ctx context.Context, stakedAmount *big.Int) (txHash common.Hash, err error) {
prevStakedAmount, err := s.GetStake(ctx)
if err != nil {
return err
return
}

if len(prevStakedAmount.Bits()) == 0 {
if stakedAmount.Cmp(MinimumStakeAmount) == -1 {
return ErrInsufficientStakeAmount
err = ErrInsufficientStakeAmount
return
}
}

balance, err := s.getBalance(ctx)
if err != nil {
return err
return
}

if balance.Cmp(stakedAmount) < 0 {
return ErrInsufficientFunds
err = ErrInsufficientFunds
return
umerm-work marked this conversation as resolved.
Show resolved Hide resolved
}

_, err = s.sendApproveTransaction(ctx, stakedAmount)
if err != nil {
return err
return
}

_, err = s.sendDepositStakeTransaction(ctx, s.owner, stakedAmount, s.overlayNonce)
if err != nil {
return err
receipt, err := s.sendDepositStakeTransaction(ctx, s.owner, stakedAmount, s.overlayNonce)
if receipt != nil {
txHash = receipt.TxHash
}
return nil
return
}

func (s *contract) GetStake(ctx context.Context) (*big.Int, error) {
Expand Down
22 changes: 11 additions & 11 deletions pkg/storageincentives/staking/contract_test.go
Expand Up @@ -81,7 +81,7 @@ func TestDepositStake(t *testing.T) {
})),
nonce)

err = contract.DepositStake(ctx, stakedAmount)
_, err = contract.DepositStake(ctx, stakedAmount)
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -135,7 +135,7 @@ func TestDepositStake(t *testing.T) {
})),
nonce)

err = contract.DepositStake(ctx, stakedAmount)
_, err = contract.DepositStake(ctx, stakedAmount)
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -167,7 +167,7 @@ func TestDepositStake(t *testing.T) {
})),
nonce)

err := contract.DepositStake(ctx, big.NewInt(0))
_, err := contract.DepositStake(ctx, big.NewInt(0))
if !errors.Is(err, staking2.ErrInsufficientStakeAmount) {
t.Fatal(fmt.Errorf("wanted %w, got %v", staking2.ErrInsufficientStakeAmount, err))
}
Expand All @@ -192,7 +192,7 @@ func TestDepositStake(t *testing.T) {
})),
nonce)

err := contract.DepositStake(ctx, big.NewInt(100000000000000000))
_, err := contract.DepositStake(ctx, big.NewInt(100000000000000000))
if !errors.Is(err, staking2.ErrInsufficientFunds) {
t.Fatal(fmt.Errorf("wanted %w, got %v", staking2.ErrInsufficientFunds, err))
}
Expand All @@ -217,7 +217,7 @@ func TestDepositStake(t *testing.T) {
})),
nonce)

err := contract.DepositStake(ctx, big.NewInt(100000000000000000))
_, err := contract.DepositStake(ctx, big.NewInt(100000000000000000))
if !errors.Is(err, staking2.ErrInsufficientFunds) {
t.Fatal(fmt.Errorf("wanted %w, got %v", staking2.ErrInsufficientStakeAmount, err))
}
Expand Down Expand Up @@ -248,7 +248,7 @@ func TestDepositStake(t *testing.T) {
})),
nonce)

err := contract.DepositStake(ctx, stakedAmount)
_, err := contract.DepositStake(ctx, stakedAmount)
if err == nil {
t.Fatal("expected error")
}
Expand Down Expand Up @@ -290,7 +290,7 @@ func TestDepositStake(t *testing.T) {
})),
nonce)

err = contract.DepositStake(ctx, stakedAmount)
_, err = contract.DepositStake(ctx, stakedAmount)
if err == nil {
t.Fatal("expected error")
}
Expand Down Expand Up @@ -318,7 +318,7 @@ func TestDepositStake(t *testing.T) {
}
return txHashDeposited, nil
}
return common.Hash{}, errors.New("sent to wrong contract")
return txHashDeposited, errors.New("sent to wrong contract")
}),
transactionMock.WithWaitForReceiptFunc(func(ctx context.Context, txHash common.Hash) (receipt *types.Receipt, err error) {
if txHash == txHashDeposited {
Expand All @@ -344,7 +344,7 @@ func TestDepositStake(t *testing.T) {
})),
nonce)

err = contract.DepositStake(ctx, stakedAmount)
_, err = contract.DepositStake(ctx, stakedAmount)
if !errors.Is(err, transaction.ErrTransactionReverted) {
t.Fatalf("expeted %v, got %v", transaction.ErrTransactionReverted, err)
}
Expand Down Expand Up @@ -396,7 +396,7 @@ func TestDepositStake(t *testing.T) {
})),
nonce)

err = contract.DepositStake(ctx, stakedAmount)
_, err = contract.DepositStake(ctx, stakedAmount)
if err == nil {
t.Fatalf("expected error")
}
Expand All @@ -415,7 +415,7 @@ func TestDepositStake(t *testing.T) {
})),
nonce)

err := contract.DepositStake(ctx, stakedAmount)
_, err := contract.DepositStake(ctx, stakedAmount)
if err == nil {
t.Fatalf("expected error")
}
Expand Down