arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
Merge pull request #212 from hermeznetwork/feature/ethclient-simplify

Simplify eth code
laisolizq 37299818+laisolizq@users.noreply.github.com
Wed, 21 Oct 2020 12:39:32 +0200
commit

3f6b9d908717f9e57bd919134626638b627b3677

parent

edb466c996a9555470e5ce35e95dde862709e3d8

M common/l1tx.go → common/l1tx.go

@@ -11,8 +11,8 @@ "github.com/iden3/go-iden3-crypto/babyjub"

) const ( - // L1TxBytesLen is the length of the byte array that represents the L1Tx - L1TxBytesLen = 72 + // L1UserTxBytesLen is the length of the byte array that represents the L1Tx + L1UserTxBytesLen = 72 // L1CoordinatorTxBytesLen is the length of the byte array that represents the L1CoordinatorTx L1CoordinatorTxBytesLen = 101 )

@@ -27,20 +27,20 @@ // values: | type | ToForgeL1TxsNum | Position | 0 (padding) |

// where type: // - L1UserTx: 0 // - L1CoordinatorTx: 1 - TxID TxID - ToForgeL1TxsNum *int64 // toForgeL1TxsNum in which the tx was forged / will be forged - Position int - UserOrigin bool // true if the tx was originated by a user, false if it was aoriginated by a coordinator. Note that this differ from the spec for implementation simplification purpposes - FromIdx Idx // FromIdx is used by L1Tx/Deposit to indicate the Idx receiver of the L1Tx.LoadAmount (deposit) - FromEthAddr ethCommon.Address - FromBJJ *babyjub.PublicKey - ToIdx Idx // ToIdx is ignored in L1Tx/Deposit, but used in the L1Tx/DepositAndTransfer - TokenID TokenID - Amount *big.Int - LoadAmount *big.Int - EthBlockNum int64 // Ethereum Block Number in which this L1Tx was added to the queue - Type TxType - BatchNum *BatchNum + TxID TxID `meddler:"id"` + ToForgeL1TxsNum *int64 `meddler:"to_forge_l1_txs_num"` // toForgeL1TxsNum in which the tx was forged / will be forged + Position int `meddler:"position"` + UserOrigin bool `meddler:"user_origin"` // true if the tx was originated by a user, false if it was aoriginated by a coordinator. Note that this differ from the spec for implementation simplification purpposes + FromIdx Idx `meddler:"from_idx,zeroisnull"` // FromIdx is used by L1Tx/Deposit to indicate the Idx receiver of the L1Tx.LoadAmount (deposit) + FromEthAddr ethCommon.Address `meddler:"from_eth_addr,zeroisnull"` + FromBJJ *babyjub.PublicKey `meddler:"from_bjj,zeroisnull"` + ToIdx Idx `meddler:"to_idx"` // ToIdx is ignored in L1Tx/Deposit, but used in the L1Tx/DepositAndTransfer + TokenID TokenID `meddler:"token_id"` + Amount *big.Int `meddler:"amount,bigint"` + LoadAmount *big.Int `meddler:"load_amount,bigint"` + EthBlockNum int64 `meddler:"eth_block_num"` // Ethereum Block Number in which this L1Tx was added to the queue + Type TxType `meddler:"type"` + BatchNum *BatchNum `meddler:"batch_num"` } // NewL1Tx returns the given L1Tx with the TxId & Type parameters calculated

@@ -146,9 +146,9 @@ }

return genericTx } -// Bytes encodes a L1Tx into []byte -func (tx *L1Tx) Bytes() ([]byte, error) { - var b [L1TxBytesLen]byte +// BytesUser encodes a L1Tx into []byte +func (tx *L1Tx) BytesUser() ([]byte, error) { + var b [L1UserTxBytesLen]byte copy(b[0:20], tx.FromEthAddr.Bytes()) pkCompL := tx.FromBJJ.Compress() pkCompB := SwapEndianness(pkCompL[:])

@@ -193,13 +193,15 @@ copy(b[97:101], tx.TokenID.Bytes())

return b[:], nil } -// L1TxFromBytes decodes a L1Tx from []byte -func L1TxFromBytes(b []byte) (*L1Tx, error) { - if len(b) != L1TxBytesLen { +// L1UserTxFromBytes decodes a L1Tx from []byte +func L1UserTxFromBytes(b []byte) (*L1Tx, error) { + if len(b) != L1UserTxBytesLen { return nil, fmt.Errorf("Can not parse L1Tx bytes, expected length %d, current: %d", 68, len(b)) } - tx := &L1Tx{} + tx := &L1Tx{ + UserOrigin: true, + } var err error tx.FromEthAddr = ethCommon.BytesToAddress(b[0:20])

@@ -231,8 +233,8 @@

return tx, nil } -// L1TxFromCoordinatorBytes decodes a L1Tx from []byte -func L1TxFromCoordinatorBytes(b []byte) (*L1Tx, error) { +// L1CoordinatorTxFromBytes decodes a L1Tx from []byte +func L1CoordinatorTxFromBytes(b []byte) (*L1Tx, error) { if len(b) != L1CoordinatorTxBytesLen { return nil, fmt.Errorf("Can not parse L1CoordinatorTx bytes, expected length %d, current: %d", 101, len(b)) }

@@ -240,7 +242,9 @@

bytesMessage1 := []byte("\x19Ethereum Signed Message:\n98") bytesMessage2 := []byte("I authorize this babyjubjub key for hermez rollup account creation") - tx := &L1Tx{} + tx := &L1Tx{ + UserOrigin: false, + } var err error // Ethereum adds 27 to v v := b[0] - byte(27) //nolint:gomnd
M common/l1tx_test.go → common/l1tx_test.go

@@ -49,7 +49,7 @@ assert.Nil(t, err)

assert.Equal(t, "0x01000000000000cafe005800", l1Tx.TxID.String()) } -func TestL1TxByteParsers(t *testing.T) { +func TestL1userTxByteParsers(t *testing.T) { var pkComp babyjub.PublicKeyComp pkCompL := []byte("0x56ca90f80d7c374ae7485e9bcc47d4ac399460948da6aeeb899311097925a72c") err := pkComp.UnmarshalText(pkCompL)

@@ -59,6 +59,7 @@ pk, err := pkComp.Decompress()

require.Nil(t, err) l1Tx := &L1Tx{ + UserOrigin: true, ToIdx: 3, TokenID: 5, Amount: big.NewInt(1),

@@ -68,21 +69,21 @@ FromBJJ: pk,

FromEthAddr: ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370"), } - encodedData, err := l1Tx.Bytes() + encodedData, err := l1Tx.BytesUser() require.Nil(t, err) - decodedData, err := L1TxFromBytes(encodedData) + decodedData, err := L1UserTxFromBytes(encodedData) require.Nil(t, err) assert.Equal(t, l1Tx, decodedData) - encodedData2, err := decodedData.Bytes() + encodedData2, err := decodedData.BytesUser() require.Nil(t, err) assert.Equal(t, encodedData, encodedData2) // expect error if length!=68 - _, err = L1TxFromBytes(encodedData[:66]) + _, err = L1UserTxFromBytes(encodedData[:66]) require.NotNil(t, err) - _, err = L1TxFromBytes([]byte{}) + _, err = L1UserTxFromBytes([]byte{}) require.NotNil(t, err) - _, err = L1TxFromBytes(nil) + _, err = L1UserTxFromBytes(nil) require.NotNil(t, err) }

@@ -113,7 +114,7 @@

expected, err := utils.HexDecode("85dab5b9e2e361d0c208d77be90efcc0439b0a530dd02deb2c81068e7a0f7e327df80b4ab79ee1f41a7def613e73a20c32eece5a000001c638db8be880f00020039c0000053cb88d") require.Nil(t, err) - encodedData, err := l1Tx.Bytes() + encodedData, err := l1Tx.BytesUser() require.Nil(t, err) assert.Equal(t, expected, encodedData) }

@@ -161,7 +162,7 @@ }

bytesCoordinatorL1, err := l1Tx.BytesCoordinatorTx(signature) require.Nil(t, err) - l1txDecoded, err := L1TxFromCoordinatorBytes(bytesCoordinatorL1) + l1txDecoded, err := L1CoordinatorTxFromBytes(bytesCoordinatorL1) require.Nil(t, err) assert.Equal(t, l1Tx, l1txDecoded) bytesCoordinatorL12, err := l1txDecoded.BytesCoordinatorTx(signature)

@@ -169,11 +170,11 @@ require.Nil(t, err)

assert.Equal(t, bytesCoordinatorL1, bytesCoordinatorL12) // expect error if length!=68 - _, err = L1TxFromCoordinatorBytes(bytesCoordinatorL1[:66]) + _, err = L1CoordinatorTxFromBytes(bytesCoordinatorL1[:66]) require.NotNil(t, err) - _, err = L1TxFromCoordinatorBytes([]byte{}) + _, err = L1CoordinatorTxFromBytes([]byte{}) require.NotNil(t, err) - _, err = L1TxFromCoordinatorBytes(nil) + _, err = L1CoordinatorTxFromBytes(nil) require.NotNil(t, err) }
M eth/auction.go → eth/auction.go

@@ -265,7 +265,7 @@ type AuctionClient struct {

client *EthereumClient address ethCommon.Address tokenAddress ethCommon.Address - gasLimit uint64 + auction *HermezAuctionProtocol.HermezAuctionProtocol contractAbi abi.ABI }

@@ -275,11 +275,15 @@ contractAbi, err := abi.JSON(strings.NewReader(string(HermezAuctionProtocol.HermezAuctionProtocolABI)))

if err != nil { return nil, err } + auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(address, client.Client()) + if err != nil { + return nil, err + } return &AuctionClient{ client: client, address: address, tokenAddress: tokenAddress, - gasLimit: 1000000, //nolint:gomnd + auction: auction, contractAbi: contractAbi, }, nil }

@@ -289,13 +293,9 @@ func (c *AuctionClient) AuctionSetSlotDeadline(newDeadline uint8) (*types.Transaction, error) {

var tx *types.Transaction var err error if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return nil, err - } - return auction.SetSlotDeadline(auth, newDeadline) + return c.auction.SetSlotDeadline(auth, newDeadline) }, ); err != nil { return nil, fmt.Errorf("Failed setting slotDeadline: %w", err)

@@ -304,14 +304,9 @@ return tx, nil

} // AuctionGetSlotDeadline is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetSlotDeadline() (uint8, error) { - var slotDeadline uint8 +func (c *AuctionClient) AuctionGetSlotDeadline() (slotDeadline uint8, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - slotDeadline, err = auction.GetSlotDeadline(nil) + slotDeadline, err = c.auction.GetSlotDeadline(nil) return err }); err != nil { return 0, err

@@ -320,17 +315,11 @@ return slotDeadline, nil

} // AuctionSetOpenAuctionSlots is the interface to call the smart contract function -func (c *AuctionClient) AuctionSetOpenAuctionSlots(newOpenAuctionSlots uint16) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionSetOpenAuctionSlots(newOpenAuctionSlots uint16) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return nil, err - } - return auction.SetOpenAuctionSlots(auth, newOpenAuctionSlots) + return c.auction.SetOpenAuctionSlots(auth, newOpenAuctionSlots) }, ); err != nil { return nil, fmt.Errorf("Failed setting openAuctionSlots: %w", err)

@@ -339,14 +328,9 @@ return tx, nil

} // AuctionGetOpenAuctionSlots is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetOpenAuctionSlots() (uint16, error) { - var openAuctionSlots uint16 +func (c *AuctionClient) AuctionGetOpenAuctionSlots() (openAuctionSlots uint16, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - openAuctionSlots, err = auction.GetOpenAuctionSlots(nil) + openAuctionSlots, err = c.auction.GetOpenAuctionSlots(nil) return err }); err != nil { return 0, err

@@ -355,17 +339,11 @@ return openAuctionSlots, nil

} // AuctionSetClosedAuctionSlots is the interface to call the smart contract function -func (c *AuctionClient) AuctionSetClosedAuctionSlots(newClosedAuctionSlots uint16) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionSetClosedAuctionSlots(newClosedAuctionSlots uint16) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return nil, err - } - return auction.SetClosedAuctionSlots(auth, newClosedAuctionSlots) + return c.auction.SetClosedAuctionSlots(auth, newClosedAuctionSlots) }, ); err != nil { return nil, fmt.Errorf("Failed setting closedAuctionSlots: %w", err)

@@ -374,14 +352,9 @@ return tx, nil

} // AuctionGetClosedAuctionSlots is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetClosedAuctionSlots() (uint16, error) { - var closedAuctionSlots uint16 +func (c *AuctionClient) AuctionGetClosedAuctionSlots() (closedAuctionSlots uint16, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - closedAuctionSlots, err = auction.GetClosedAuctionSlots(nil) + closedAuctionSlots, err = c.auction.GetClosedAuctionSlots(nil) return err }); err != nil { return 0, err

@@ -390,17 +363,11 @@ return closedAuctionSlots, nil

} // AuctionSetOutbidding is the interface to call the smart contract function -func (c *AuctionClient) AuctionSetOutbidding(newOutbidding uint16) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionSetOutbidding(newOutbidding uint16) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( 12500000, //nolint:gomnd func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return nil, err - } - return auction.SetOutbidding(auth, newOutbidding) + return c.auction.SetOutbidding(auth, newOutbidding) }, ); err != nil { return nil, fmt.Errorf("Failed setting setOutbidding: %w", err)

@@ -409,14 +376,9 @@ return tx, nil

} // AuctionGetOutbidding is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetOutbidding() (uint16, error) { - var outbidding uint16 +func (c *AuctionClient) AuctionGetOutbidding() (outbidding uint16, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - outbidding, err = auction.GetOutbidding(nil) + outbidding, err = c.auction.GetOutbidding(nil) return err }); err != nil { return 0, err

@@ -425,17 +387,11 @@ return outbidding, nil

} // AuctionSetAllocationRatio is the interface to call the smart contract function -func (c *AuctionClient) AuctionSetAllocationRatio(newAllocationRatio [3]uint16) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionSetAllocationRatio(newAllocationRatio [3]uint16) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return nil, err - } - return auction.SetAllocationRatio(auth, newAllocationRatio) + return c.auction.SetAllocationRatio(auth, newAllocationRatio) }, ); err != nil { return nil, fmt.Errorf("Failed setting allocationRatio: %w", err)

@@ -444,14 +400,9 @@ return tx, nil

} // AuctionGetAllocationRatio is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetAllocationRatio() ([3]uint16, error) { - var allocationRation [3]uint16 +func (c *AuctionClient) AuctionGetAllocationRatio() (allocationRation [3]uint16, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - allocationRation, err = auction.GetAllocationRatio(nil) + allocationRation, err = c.auction.GetAllocationRatio(nil) return err }); err != nil { return [3]uint16{}, err

@@ -460,17 +411,11 @@ return allocationRation, nil

} // AuctionSetDonationAddress is the interface to call the smart contract function -func (c *AuctionClient) AuctionSetDonationAddress(newDonationAddress ethCommon.Address) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionSetDonationAddress(newDonationAddress ethCommon.Address) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return nil, err - } - return auction.SetDonationAddress(auth, newDonationAddress) + return c.auction.SetDonationAddress(auth, newDonationAddress) }, ); err != nil { return nil, fmt.Errorf("Failed setting donationAddress: %w", err)

@@ -479,33 +424,23 @@ return tx, nil

} // AuctionGetDonationAddress is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetDonationAddress() (*ethCommon.Address, error) { - var donationAddress ethCommon.Address +func (c *AuctionClient) AuctionGetDonationAddress() (donationAddress *ethCommon.Address, err error) { + var _donationAddress ethCommon.Address if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - donationAddress, err = auction.GetDonationAddress(nil) + _donationAddress, err = c.auction.GetDonationAddress(nil) return err }); err != nil { return nil, err } - return &donationAddress, nil + return &_donationAddress, nil } // AuctionSetBootCoordinator is the interface to call the smart contract function -func (c *AuctionClient) AuctionSetBootCoordinator(newBootCoordinator ethCommon.Address) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionSetBootCoordinator(newBootCoordinator ethCommon.Address) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return nil, err - } - return auction.SetBootCoordinator(auth, newBootCoordinator) + return c.auction.SetBootCoordinator(auth, newBootCoordinator) }, ); err != nil { return nil, fmt.Errorf("Failed setting bootCoordinator: %w", err)

@@ -514,34 +449,24 @@ return tx, nil

} // AuctionGetBootCoordinator is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetBootCoordinator() (*ethCommon.Address, error) { - var bootCoordinator ethCommon.Address +func (c *AuctionClient) AuctionGetBootCoordinator() (bootCoordinator *ethCommon.Address, err error) { + var _bootCoordinator ethCommon.Address if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - bootCoordinator, err = auction.GetBootCoordinator(nil) + _bootCoordinator, err = c.auction.GetBootCoordinator(nil) return err }); err != nil { return nil, err } - return &bootCoordinator, nil + return &_bootCoordinator, nil } // AuctionChangeDefaultSlotSetBid is the interface to call the smart contract function -func (c *AuctionClient) AuctionChangeDefaultSlotSetBid(slotSet int64, newInitialMinBid *big.Int) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionChangeDefaultSlotSetBid(slotSet int64, newInitialMinBid *big.Int) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return nil, err - } slotSetToSend := big.NewInt(slotSet) - return auction.ChangeDefaultSlotSetBid(auth, slotSetToSend, newInitialMinBid) + return c.auction.ChangeDefaultSlotSetBid(auth, slotSetToSend, newInitialMinBid) }, ); err != nil { return nil, fmt.Errorf("Failed changing slotSet Bid: %w", err)

@@ -550,14 +475,9 @@ return tx, nil

} // AuctionGetClaimableHEZ is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetClaimableHEZ(claimAddress ethCommon.Address) (*big.Int, error) { - var claimableHEZ *big.Int +func (c *AuctionClient) AuctionGetClaimableHEZ(claimAddress ethCommon.Address) (claimableHEZ *big.Int, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - claimableHEZ, err = auction.GetClaimableHEZ(nil, claimAddress) + claimableHEZ, err = c.auction.GetClaimableHEZ(nil, claimAddress) return err }); err != nil { return nil, err

@@ -566,17 +486,11 @@ return claimableHEZ, nil

} // AuctionSetCoordinator is the interface to call the smart contract function -func (c *AuctionClient) AuctionSetCoordinator(forger ethCommon.Address, coordinatorURL string) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionSetCoordinator(forger ethCommon.Address, coordinatorURL string) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return nil, err - } - return auction.SetCoordinator(auth, forger, coordinatorURL) + return c.auction.SetCoordinator(auth, forger, coordinatorURL) }, ); err != nil { return nil, fmt.Errorf("Failed set coordinator: %w", err)

@@ -585,32 +499,22 @@ return tx, nil

} // AuctionGetCurrentSlotNumber is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetCurrentSlotNumber() (int64, error) { +func (c *AuctionClient) AuctionGetCurrentSlotNumber() (currentSlotNumber int64, err error) { var _currentSlotNumber *big.Int if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - _currentSlotNumber, err = auction.GetCurrentSlotNumber(nil) + _currentSlotNumber, err = c.auction.GetCurrentSlotNumber(nil) return err }); err != nil { return 0, err } - currentSlotNumber := _currentSlotNumber.Int64() - return currentSlotNumber, nil + return _currentSlotNumber.Int64(), nil } // AuctionGetMinBidBySlot is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetMinBidBySlot(slot int64) (*big.Int, error) { - var minBid *big.Int +func (c *AuctionClient) AuctionGetMinBidBySlot(slot int64) (minBid *big.Int, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } slotToSend := big.NewInt(slot) - minBid, err = auction.GetMinBidBySlot(nil, slotToSend) + minBid, err = c.auction.GetMinBidBySlot(nil, slotToSend) return err }); err != nil { return big.NewInt(0), err

@@ -619,15 +523,10 @@ return minBid, nil

} // AuctionGetSlotSet is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetSlotSet(slot int64) (*big.Int, error) { - var slotSet *big.Int +func (c *AuctionClient) AuctionGetSlotSet(slot int64) (slotSet *big.Int, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } slotToSend := big.NewInt(slot) - slotSet, err = auction.GetSlotSet(nil, slotToSend) + slotSet, err = c.auction.GetSlotSet(nil, slotToSend) return err }); err != nil { return big.NewInt(0), err

@@ -636,14 +535,9 @@ return slotSet, nil

} // AuctionGetDefaultSlotSetBid is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetDefaultSlotSetBid(slotSet uint8) (*big.Int, error) { - var minBidSlotSet *big.Int +func (c *AuctionClient) AuctionGetDefaultSlotSetBid(slotSet uint8) (minBidSlotSet *big.Int, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - minBidSlotSet, err = auction.GetDefaultSlotSetBid(nil, slotSet) + minBidSlotSet, err = c.auction.GetDefaultSlotSetBid(nil, slotSet) return err }); err != nil { return big.NewInt(0), err

@@ -652,28 +546,21 @@ return minBidSlotSet, nil

} // AuctionGetSlotNumber is the interface to call the smart contract function -func (c *AuctionClient) AuctionGetSlotNumber(blockNum int64) (int64, error) { - var slot *big.Int +func (c *AuctionClient) AuctionGetSlotNumber(blockNum int64) (slot int64, err error) { + var _slot *big.Int if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - blockNumBig := big.NewInt(blockNum) - slot, err = auction.GetSlotNumber(nil, blockNumBig) + _slot, err = c.auction.GetSlotNumber(nil, big.NewInt(blockNum)) return err }); err != nil { return 0, err } - return slot.Int64(), nil + return _slot.Int64(), nil } // AuctionBid is the interface to call the smart contract function -func (c *AuctionClient) AuctionBid(slot int64, bidAmount *big.Int) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionBid(slot int64, bidAmount *big.Int) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { tokens, err := ERC777.NewERC777(c.tokenAddress, ec) if err != nil {

@@ -703,11 +590,10 @@ return tx, nil

} // AuctionMultiBid is the interface to call the smart contract function -func (c *AuctionClient) AuctionMultiBid(startingSlot int64, endingSlot int64, slotSet [6]bool, maxBid, closedMinBid, budget *big.Int) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionMultiBid(startingSlot int64, endingSlot int64, slotSet [6]bool, + maxBid, closedMinBid, budget *big.Int) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 1000000, //nolint:gomnd func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { tokens, err := ERC777.NewERC777(c.tokenAddress, ec) if err != nil {

@@ -752,14 +638,9 @@ return tx, nil

} // AuctionCanForge is the interface to call the smart contract function -func (c *AuctionClient) AuctionCanForge(forger ethCommon.Address, blockNum int64) (bool, error) { - var canForge bool +func (c *AuctionClient) AuctionCanForge(forger ethCommon.Address, blockNum int64) (canForge bool, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - canForge, err = auction.CanForge(nil, forger, big.NewInt(blockNum)) + canForge, err = c.auction.CanForge(nil, forger, big.NewInt(blockNum)) return err }); err != nil { return false, err

@@ -768,17 +649,11 @@ return canForge, nil

} // AuctionClaimHEZ is the interface to call the smart contract function -func (c *AuctionClient) AuctionClaimHEZ() (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionClaimHEZ() (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return nil, err - } - return auction.ClaimHEZ(auth) + return c.auction.ClaimHEZ(auth) }, ); err != nil { return nil, fmt.Errorf("Failed claim HEZ: %w", err)

@@ -787,17 +662,11 @@ return tx, nil

} // AuctionForge is the interface to call the smart contract function -func (c *AuctionClient) AuctionForge(forger ethCommon.Address) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *AuctionClient) AuctionForge(forger ethCommon.Address) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return nil, err - } - return auction.Forge(auth, forger) + return c.auction.Forge(auth, forger) }, ); err != nil { return nil, fmt.Errorf("Failed forge: %w", err)

@@ -806,31 +675,27 @@ return tx, nil

} // AuctionConstants returns the Constants of the Auction Smart Contract -func (c *AuctionClient) AuctionConstants() (*AuctionConstants, error) { - auctionConstants := new(AuctionConstants) +func (c *AuctionClient) AuctionConstants() (auctionConstants *AuctionConstants, err error) { + auctionConstants = new(AuctionConstants) if err := c.client.Call(func(ec *ethclient.Client) error { - auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec) - if err != nil { - return err - } - auctionConstants.BlocksPerSlot, err = auction.BLOCKSPERSLOT(nil) + auctionConstants.BlocksPerSlot, err = c.auction.BLOCKSPERSLOT(nil) if err != nil { return err } - genesisBlock, err := auction.GenesisBlock(nil) + genesisBlock, err := c.auction.GenesisBlock(nil) if err != nil { return err } auctionConstants.GenesisBlockNum = genesisBlock.Int64() - auctionConstants.HermezRollup, err = auction.HermezRollup(nil) + auctionConstants.HermezRollup, err = c.auction.HermezRollup(nil) if err != nil { return err } - auctionConstants.InitialMinimalBidding, err = auction.INITIALMINIMALBIDDING(nil) + auctionConstants.InitialMinimalBidding, err = c.auction.INITIALMINIMALBIDDING(nil) if err != nil { return err } - auctionConstants.TokenHEZ, err = auction.TokenHEZ(nil) + auctionConstants.TokenHEZ, err = c.auction.TokenHEZ(nil) return err }); err != nil { return nil, err

@@ -839,10 +704,9 @@ return auctionConstants, nil

} // AuctionVariables returns the variables of the Auction Smart Contract -func (c *AuctionClient) AuctionVariables() (*AuctionVariables, error) { - auctionVariables := new(AuctionVariables) +func (c *AuctionClient) AuctionVariables() (auctionVariables *AuctionVariables, err error) { + auctionVariables = new(AuctionVariables) if err := c.client.Call(func(ec *ethclient.Client) error { - var err error auctionVariables.AllocationRatio, err = c.AuctionGetAllocationRatio() if err != nil { return err
M eth/client.go → eth/client.go

@@ -5,6 +5,7 @@ "fmt"

"github.com/ethereum/go-ethereum/accounts" ethKeystore "github.com/ethereum/go-ethereum/accounts/keystore" + ethCommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" )

@@ -29,14 +30,38 @@ AuctionClient

RollupClient } +// RollupConfig is the configuration for the Rollup smart contract interface +type RollupConfig struct { + Address ethCommon.Address +} + +// AuctionConfig is the configuration for the Auction smart contract interface +type AuctionConfig struct { + Address ethCommon.Address + TokenHEZAddress ethCommon.Address +} + +// ClientConfig is the configuration of the Client +type ClientConfig struct { + Ethereum EthereumConfig + Rollup RollupConfig + Auction AuctionConfig +} + // NewClient creates a new Client to interact with Ethereum and the Hermez smart contracts. -func NewClient(client *ethclient.Client, account *accounts.Account, ks *ethKeystore.KeyStore, config *EthereumConfig) *Client { - ethereumClient := NewEthereumClient(client, account, ks, config) - auctionClient := &AuctionClient{} - rollupCient := &RollupClient{} +func NewClient(client *ethclient.Client, account *accounts.Account, ks *ethKeystore.KeyStore, cfg *ClientConfig) (*Client, error) { + ethereumClient := NewEthereumClient(client, account, ks, &cfg.Ethereum) + auctionClient, err := NewAuctionClient(ethereumClient, cfg.Auction.Address, cfg.Auction.TokenHEZAddress) + if err != nil { + return nil, err + } + rollupCient, err := NewRollupClient(ethereumClient, cfg.Rollup.Address, cfg.Auction.TokenHEZAddress) + if err != nil { + return nil, err + } return &Client{ EthereumClient: *ethereumClient, AuctionClient: *auctionClient, RollupClient: *rollupCient, - } + }, nil }
M eth/client_test.go → eth/client_test.go

@@ -8,7 +8,7 @@ )

func TestClientInterface(t *testing.T) { var c ClientInterface - client := NewClient(nil, nil, nil, nil) + client, _ := NewClient(nil, nil, nil, &ClientConfig{}) c = client require.NotNil(t, c) }
M eth/ethereum.go → eth/ethereum.go

@@ -301,3 +301,8 @@ Symbol: symbol,

Decimals: uint64(decimals), }, nil } + +// Client returns the internal ethclient.Client +func (c *EthereumClient) Client() *ethclient.Client { + return c.client +}
M eth/rollup.go → eth/rollup.go

@@ -153,9 +153,9 @@ }

// RollupEventL1UserTx is an event of the Rollup Smart Contract type RollupEventL1UserTx struct { - ToForgeL1TxsNum int64 // QueueIndex *big.Int - Position int // TransactionIndex *big.Int - L1UserTx common.L1Tx + // ToForgeL1TxsNum int64 // QueueIndex *big.Int + // Position int // TransactionIndex *big.Int + L1UserTx common.L1Tx } // RollupEventL1UserTxAux is an event of the Rollup Smart Contract

@@ -173,7 +173,8 @@ }

// RollupEventForgeBatch is an event of the Rollup Smart Contract type RollupEventForgeBatch struct { - BatchNum int64 + BatchNum int64 + // Sender ethCommon.Address EthTxHash ethCommon.Hash }

@@ -279,7 +280,7 @@ //

RollupConstants() (*RollupPublicConstants, error) RollupEventsByBlock(blockNum int64) (*RollupEvents, *ethCommon.Hash, error) - RollupForgeBatchArgs(ethCommon.Hash) (*RollupForgeBatchArgs, error) + RollupForgeBatchArgs(ethCommon.Hash) (*RollupForgeBatchArgs, *ethCommon.Address, error) } //

@@ -291,13 +292,17 @@ type RollupClient struct {

client *EthereumClient address ethCommon.Address tokenHEZAddress ethCommon.Address - gasLimit uint64 + hermez *Hermez.Hermez contractAbi abi.ABI } // NewRollupClient creates a new RollupClient func NewRollupClient(client *EthereumClient, address ethCommon.Address, tokenHEZAddress ethCommon.Address) (*RollupClient, error) { contractAbi, err := abi.JSON(strings.NewReader(string(Hermez.HermezABI))) + if err != nil { + return nil, err + } + hermez, err := Hermez.NewHermez(address, client.Client()) if err != nil { return nil, err }

@@ -305,22 +310,16 @@ return &RollupClient{

client: client, address: address, tokenHEZAddress: tokenHEZAddress, - gasLimit: 1000000, //nolint:gomnd + hermez: hermez, contractAbi: contractAbi, }, nil } // RollupForgeBatch is the interface to call the smart contract function -func (c *RollupClient) RollupForgeBatch(args *RollupForgeBatchArgs) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *RollupClient) RollupForgeBatch(args *RollupForgeBatchArgs) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 1000000, //nolint:gomnd func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - hermez, err := Hermez.NewHermez(c.address, ec) - if err != nil { - return nil, err - } rollupConst, err := c.RollupConstants() if err != nil { return nil, err

@@ -362,7 +361,7 @@ return nil, err

} feeIdxCoordinator = append(feeIdxCoordinator, bytesFeeIdx[len(bytesFeeIdx)-int(lenBytes):]...) } - return hermez.ForgeBatch(auth, newLastIdx, args.NewStRoot, args.NewExitRoot, l1CoordinatorBytes, l2DataBytes, feeIdxCoordinator, args.VerifierIdx, args.L1Batch, args.ProofA, args.ProofB, args.ProofC) + return c.hermez.ForgeBatch(auth, newLastIdx, args.NewStRoot, args.NewExitRoot, l1CoordinatorBytes, l2DataBytes, feeIdxCoordinator, args.VerifierIdx, args.L1Batch, args.ProofA, args.ProofB, args.ProofC) }, ); err != nil { return nil, fmt.Errorf("Failed forge batch: %w", err)

@@ -373,11 +372,9 @@

// RollupAddToken is the interface to call the smart contract function. // `feeAddToken` is the amount of HEZ tokens that will be paid to add the // token. `feeAddToken` must match the public value of the smart contract. -func (c *RollupClient) RollupAddToken(tokenAddress ethCommon.Address, feeAddToken *big.Int) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *RollupClient) RollupAddToken(tokenAddress ethCommon.Address, feeAddToken *big.Int) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { tokens, err := ERC777.NewERC777(c.tokenHEZAddress, ec) if err != nil {

@@ -403,11 +400,9 @@ return tx, nil

} // RollupWithdrawMerkleProof is the interface to call the smart contract function -func (c *RollupClient) RollupWithdrawMerkleProof(fromBJJ *babyjub.PublicKey, tokenID uint32, numExitRoot, idx int64, amount *big.Int, siblings []*big.Int, instantWithdraw bool) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *RollupClient) RollupWithdrawMerkleProof(fromBJJ *babyjub.PublicKey, tokenID uint32, numExitRoot, idx int64, amount *big.Int, siblings []*big.Int, instantWithdraw bool) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { hermez, err := Hermez.NewHermez(c.address, ec) if err != nil {

@@ -433,11 +428,9 @@ return nil, errTODO

} // RollupL1UserTxERC20ETH is the interface to call the smart contract function -func (c *RollupClient) RollupL1UserTxERC20ETH(fromBJJ *babyjub.PublicKey, fromIdx int64, loadAmount *big.Int, amount *big.Int, tokenID uint32, toIdx int64) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *RollupClient) RollupL1UserTxERC20ETH(fromBJJ *babyjub.PublicKey, fromIdx int64, loadAmount *big.Int, amount *big.Int, tokenID uint32, toIdx int64) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { hermez, err := Hermez.NewHermez(c.address, ec) if err != nil {

@@ -469,11 +462,9 @@ return tx, nil

} // RollupL1UserTxERC777 is the interface to call the smart contract function -func (c *RollupClient) RollupL1UserTxERC777(fromBJJ *babyjub.PublicKey, fromIdx int64, loadAmount *big.Int, amount *big.Int, tokenID uint32, toIdx int64) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *RollupClient) RollupL1UserTxERC777(fromBJJ *babyjub.PublicKey, fromIdx int64, loadAmount *big.Int, amount *big.Int, tokenID uint32, toIdx int64) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { tokens, err := ERC777.NewERC777(c.tokenHEZAddress, ec) if err != nil {

@@ -544,11 +535,9 @@ return registerTokensCount, nil

} // RollupUpdateForgeL1L2BatchTimeout is the interface to call the smart contract function -func (c *RollupClient) RollupUpdateForgeL1L2BatchTimeout(newForgeL1L2BatchTimeout int64) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *RollupClient) RollupUpdateForgeL1L2BatchTimeout(newForgeL1L2BatchTimeout int64) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { hermez, err := Hermez.NewHermez(c.address, ec) if err != nil {

@@ -563,11 +552,9 @@ return tx, nil

} // RollupUpdateFeeAddToken is the interface to call the smart contract function -func (c *RollupClient) RollupUpdateFeeAddToken(newFeeAddToken *big.Int) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *RollupClient) RollupUpdateFeeAddToken(newFeeAddToken *big.Int) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { hermez, err := Hermez.NewHermez(c.address, ec) if err != nil {

@@ -582,25 +569,21 @@ return tx, nil

} // RollupConstants returns the Constants of the Rollup Smart Contract -func (c *RollupClient) RollupConstants() (*RollupPublicConstants, error) { - rollupConstants := new(RollupPublicConstants) +func (c *RollupClient) RollupConstants() (rollupConstants *RollupPublicConstants, err error) { + rollupConstants = new(RollupPublicConstants) if err := c.client.Call(func(ec *ethclient.Client) error { - hermez, err := Hermez.NewHermez(c.address, ec) - if err != nil { - return err - } - absoluteMaxL1L2BatchTimeout, err := hermez.ABSOLUTEMAXL1L2BATCHTIMEOUT(nil) + absoluteMaxL1L2BatchTimeout, err := c.hermez.ABSOLUTEMAXL1L2BATCHTIMEOUT(nil) if err != nil { return err } rollupConstants.AbsoluteMaxL1L2BatchTimeout = int64(absoluteMaxL1L2BatchTimeout) - rollupConstants.TokenHEZ, err = hermez.TokenHEZ(nil) + rollupConstants.TokenHEZ, err = c.hermez.TokenHEZ(nil) if err != nil { return err } for i := int64(0); i < int64(LenVerifiers); i++ { var newRollupVerifier RollupVerifierStruct - rollupVerifier, err := hermez.RollupVerifiers(nil, big.NewInt(i)) + rollupVerifier, err := c.hermez.RollupVerifiers(nil, big.NewInt(i)) if err != nil { return err }

@@ -608,19 +591,19 @@ newRollupVerifier.MaxTx = rollupVerifier.MaxTx.Int64()

newRollupVerifier.NLevels = rollupVerifier.NLevels.Int64() rollupConstants.Verifiers = append(rollupConstants.Verifiers, newRollupVerifier) } - rollupConstants.HermezAuctionContract, err = hermez.HermezAuctionContract(nil) + rollupConstants.HermezAuctionContract, err = c.hermez.HermezAuctionContract(nil) if err != nil { return err } - rollupConstants.HermezGovernanceDAOAddress, err = hermez.HermezGovernanceDAOAddress(nil) + rollupConstants.HermezGovernanceDAOAddress, err = c.hermez.HermezGovernanceDAOAddress(nil) if err != nil { return err } - rollupConstants.SafetyAddress, err = hermez.SafetyAddress(nil) + rollupConstants.SafetyAddress, err = c.hermez.SafetyAddress(nil) if err != nil { return err } - rollupConstants.WithdrawDelayerContract, err = hermez.WithdrawDelayerContract(nil) + rollupConstants.WithdrawDelayerContract, err = c.hermez.WithdrawDelayerContract(nil) return err }); err != nil { return nil, err

@@ -670,12 +653,14 @@ err := c.contractAbi.Unpack(&L1UserTxAux, "L1UserTxEvent", vLog.Data)

if err != nil { return nil, nil, err } - L1Tx, err := common.L1TxFromBytes(L1UserTxAux.L1UserTx) + L1Tx, err := common.L1UserTxFromBytes(L1UserTxAux.L1UserTx) if err != nil { return nil, nil, err } - L1UserTx.ToForgeL1TxsNum = new(big.Int).SetBytes(vLog.Topics[1][:]).Int64() - L1UserTx.Position = int(new(big.Int).SetBytes(vLog.Topics[2][:]).Int64()) + toForgeL1TxsNum := new(big.Int).SetBytes(vLog.Topics[1][:]).Int64() + L1Tx.ToForgeL1TxsNum = &toForgeL1TxsNum + L1Tx.Position = int(new(big.Int).SetBytes(vLog.Topics[2][:]).Int64()) + L1Tx.UserOrigin = true L1UserTx.L1UserTx = *L1Tx rollupEvents.L1UserTx = append(rollupEvents.L1UserTx, L1UserTx) case logHermezAddToken:

@@ -690,6 +675,7 @@ case logHermezForgeBatch:

var forgeBatch RollupEventForgeBatch forgeBatch.BatchNum = new(big.Int).SetBytes(vLog.Topics[1][:]).Int64() forgeBatch.EthTxHash = vLog.TxHash + // forgeBatch.Sender = vLog.Address rollupEvents.ForgeBatch = append(rollupEvents.ForgeBatch, forgeBatch) case logHermezUpdateForgeL1L2BatchTimeout: var updateForgeL1L2BatchTimeout struct {

@@ -724,20 +710,29 @@ }

return &rollupEvents, &blockHash, nil } -// RollupForgeBatchArgs returns the arguments used in a ForgeBatch call in the Rollup Smart Contract in the given transaction -func (c *RollupClient) RollupForgeBatchArgs(ethTxHash ethCommon.Hash) (*RollupForgeBatchArgs, error) { +// RollupForgeBatchArgs returns the arguments used in a ForgeBatch call in the +// Rollup Smart Contract in the given transaction, and the sender address. +func (c *RollupClient) RollupForgeBatchArgs(ethTxHash ethCommon.Hash) (*RollupForgeBatchArgs, *ethCommon.Address, error) { tx, _, err := c.client.client.TransactionByHash(context.Background(), ethTxHash) if err != nil { - return nil, err + return nil, nil, err } txData := tx.Data() method, err := c.contractAbi.MethodById(txData[:4]) if err != nil { - return nil, err + return nil, nil, err + } + receipt, err := c.client.client.TransactionReceipt(context.Background(), ethTxHash) + if err != nil { + return nil, nil, err + } + sender, err := c.client.client.TransactionSender(context.Background(), tx, receipt.Logs[0].BlockHash, receipt.Logs[0].Index) + if err != nil { + return nil, nil, err } var aux RollupForgeBatchArgsAux if err := method.Inputs.Unpack(&aux, txData[4:]); err != nil { - return nil, err + return nil, nil, err } rollupForgeBatchArgs := RollupForgeBatchArgs{ L1Batch: aux.L1Batch,

@@ -763,16 +758,16 @@ r := bytesL1Coordinator[33:65]

signature = append(signature, r[:]...) signature = append(signature, s[:]...) signature = append(signature, v) - l1Tx, err := common.L1TxFromCoordinatorBytes(bytesL1Coordinator) + l1Tx, err := common.L1CoordinatorTxFromBytes(bytesL1Coordinator) if err != nil { - return nil, err + return nil, nil, err } rollupForgeBatchArgs.L1CoordinatorTxs = append(rollupForgeBatchArgs.L1CoordinatorTxs, *l1Tx) rollupForgeBatchArgs.L1CoordinatorTxsAuths = append(rollupForgeBatchArgs.L1CoordinatorTxsAuths, signature) } rollupConsts, err := c.RollupConstants() if err != nil { - return nil, err + return nil, nil, err } nLevels := rollupConsts.Verifiers[rollupForgeBatchArgs.VerifierIdx].NLevels lenL2TxsBytes := int((nLevels/8)*2 + 2 + 1)

@@ -780,7 +775,7 @@ numTxsL2 := len(aux.L2TxsData) / lenL2TxsBytes

for i := 0; i < numTxsL2; i++ { l2Tx, err := common.L2TxFromBytes(aux.L2TxsData[i*lenL2TxsBytes:(i+1)*lenL2TxsBytes], int(nLevels)) if err != nil { - return nil, err + return nil, nil, err } rollupForgeBatchArgs.L2TxsData = append(rollupForgeBatchArgs.L2TxsData, *l2Tx) }

@@ -796,11 +791,11 @@ copy(paddedFeeIdx[:], aux.FeeIdxCoordinator[i*lenFeeIdxCoordinatorBytes:(i+1)*lenFeeIdxCoordinatorBytes])

} feeIdxCoordinator, err := common.IdxFromBytes(paddedFeeIdx[:]) if err != nil { - return nil, err + return nil, nil, err } if feeIdxCoordinator != common.Idx(0) { rollupForgeBatchArgs.FeeIdxCoordinator = append(rollupForgeBatchArgs.FeeIdxCoordinator, feeIdxCoordinator) } } - return &rollupForgeBatchArgs, nil + return &rollupForgeBatchArgs, &sender, nil }
M eth/rollup_test.go → eth/rollup_test.go

@@ -152,7 +152,7 @@ r := bytesL1Coordinator[33:65]

signature = append(signature, r[:]...) signature = append(signature, s[:]...) signature = append(signature, v) - l1Tx, err := common.L1TxFromCoordinatorBytes(bytesL1Coordinator) + l1Tx, err := common.L1CoordinatorTxFromBytes(bytesL1Coordinator) require.Nil(t, err) args.L1CoordinatorTxs = append(args.L1CoordinatorTxs, *l1Tx) args.L1CoordinatorTxsAuths = append(args.L1CoordinatorTxsAuths, signature)

@@ -190,8 +190,9 @@ ethHashForge = rollupEvents.ForgeBatch[0].EthTxHash

} func TestRollupForgeBatchArgs(t *testing.T) { - args, err := rollupClient.RollupForgeBatchArgs(ethHashForge) + args, sender, err := rollupClient.RollupForgeBatchArgs(ethHashForge) require.Nil(t, err) + assert.Equal(t, *sender, rollupClient.client.account.Address) assert.Equal(t, argsForge.FeeIdxCoordinator, args.FeeIdxCoordinator) assert.Equal(t, argsForge.L1Batch, args.L1Batch) assert.Equal(t, argsForge.L1CoordinatorTxs, args.L1CoordinatorTxs)
M eth/wdelayer.go → eth/wdelayer.go

@@ -136,52 +136,46 @@ // WDelayerClient is the implementation of the interface to the WithdrawDelayer Smart Contract in ethereum.

type WDelayerClient struct { client *EthereumClient address ethCommon.Address - gasLimit uint64 + wdelayer *WithdrawalDelayer.WithdrawalDelayer contractAbi abi.ABI } // NewWDelayerClient creates a new WDelayerClient func NewWDelayerClient(client *EthereumClient, address ethCommon.Address) (*WDelayerClient, error) { contractAbi, err := abi.JSON(strings.NewReader(string(WithdrawalDelayer.WithdrawalDelayerABI))) + if err != nil { + return nil, err + } + wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(address, client.Client()) if err != nil { return nil, err } return &WDelayerClient{ client: client, address: address, - gasLimit: 1000000, //nolint:gomnd + wdelayer: wdelayer, contractAbi: contractAbi, }, nil } // WDelayerGetHermezGovernanceDAOAddress is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerGetHermezGovernanceDAOAddress() (*ethCommon.Address, error) { - var hermezGovernanceDAOAddress ethCommon.Address +func (c *WDelayerClient) WDelayerGetHermezGovernanceDAOAddress() (hermezGovernanceDAOAddress *ethCommon.Address, err error) { + var _hermezGovernanceDAOAddress ethCommon.Address if err := c.client.Call(func(ec *ethclient.Client) error { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return err - } - hermezGovernanceDAOAddress, err = wdelayer.GetHermezGovernanceDAOAddress(nil) + _hermezGovernanceDAOAddress, err = c.wdelayer.GetHermezGovernanceDAOAddress(nil) return err }); err != nil { return nil, err } - return &hermezGovernanceDAOAddress, nil + return &_hermezGovernanceDAOAddress, nil } // WDelayerSetHermezGovernanceDAOAddress is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerSetHermezGovernanceDAOAddress(newAddress ethCommon.Address) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *WDelayerClient) WDelayerSetHermezGovernanceDAOAddress(newAddress ethCommon.Address) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return nil, err - } - return wdelayer.SetHermezGovernanceDAOAddress(auth, newAddress) + return c.wdelayer.SetHermezGovernanceDAOAddress(auth, newAddress) }, ); err != nil { return nil, fmt.Errorf("Failed setting hermezGovernanceDAOAddress: %w", err)

@@ -190,33 +184,23 @@ return tx, nil

} // WDelayerGetHermezKeeperAddress is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerGetHermezKeeperAddress() (*ethCommon.Address, error) { - var hermezKeeperAddress ethCommon.Address +func (c *WDelayerClient) WDelayerGetHermezKeeperAddress() (hermezKeeperAddress *ethCommon.Address, err error) { + var _hermezKeeperAddress ethCommon.Address if err := c.client.Call(func(ec *ethclient.Client) error { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return err - } - hermezKeeperAddress, err = wdelayer.GetHermezKeeperAddress(nil) + _hermezKeeperAddress, err = c.wdelayer.GetHermezKeeperAddress(nil) return err }); err != nil { return nil, err } - return &hermezKeeperAddress, nil + return &_hermezKeeperAddress, nil } // WDelayerSetHermezKeeperAddress is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerSetHermezKeeperAddress(newAddress ethCommon.Address) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *WDelayerClient) WDelayerSetHermezKeeperAddress(newAddress ethCommon.Address) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return nil, err - } - return wdelayer.SetHermezKeeperAddress(auth, newAddress) + return c.wdelayer.SetHermezKeeperAddress(auth, newAddress) }, ); err != nil { return nil, fmt.Errorf("Failed setting hermezKeeperAddress: %w", err)

@@ -225,33 +209,23 @@ return tx, nil

} // WDelayerGetWhiteHackGroupAddress is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerGetWhiteHackGroupAddress() (*ethCommon.Address, error) { - var whiteHackGroupAddress ethCommon.Address +func (c *WDelayerClient) WDelayerGetWhiteHackGroupAddress() (whiteHackGroupAddress *ethCommon.Address, err error) { + var _whiteHackGroupAddress ethCommon.Address if err := c.client.Call(func(ec *ethclient.Client) error { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return err - } - whiteHackGroupAddress, err = wdelayer.GetWhiteHackGroupAddress(nil) + _whiteHackGroupAddress, err = c.wdelayer.GetWhiteHackGroupAddress(nil) return err }); err != nil { return nil, err } - return &whiteHackGroupAddress, nil + return &_whiteHackGroupAddress, nil } // WDelayerSetWhiteHackGroupAddress is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerSetWhiteHackGroupAddress(newAddress ethCommon.Address) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *WDelayerClient) WDelayerSetWhiteHackGroupAddress(newAddress ethCommon.Address) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return nil, err - } - return wdelayer.SetWhiteHackGroupAddress(auth, newAddress) + return c.wdelayer.SetWhiteHackGroupAddress(auth, newAddress) }, ); err != nil { return nil, fmt.Errorf("Failed setting whiteHackGroupAddress: %w", err)

@@ -260,14 +234,9 @@ return tx, nil

} // WDelayerIsEmergencyMode is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerIsEmergencyMode() (bool, error) { - var ermergencyMode bool +func (c *WDelayerClient) WDelayerIsEmergencyMode() (ermergencyMode bool, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return err - } - ermergencyMode, err = wdelayer.IsEmergencyMode(nil) + ermergencyMode, err = c.wdelayer.IsEmergencyMode(nil) return err }); err != nil { return false, err

@@ -276,14 +245,9 @@ return ermergencyMode, nil

} // WDelayerGetWithdrawalDelay is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerGetWithdrawalDelay() (*big.Int, error) { - var withdrawalDelay *big.Int +func (c *WDelayerClient) WDelayerGetWithdrawalDelay() (withdrawalDelay *big.Int, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return err - } - withdrawalDelay, err = wdelayer.GetWithdrawalDelay(nil) + withdrawalDelay, err = c.wdelayer.GetWithdrawalDelay(nil) return err }); err != nil { return nil, err

@@ -292,14 +256,9 @@ return withdrawalDelay, nil

} // WDelayerGetEmergencyModeStartingTime is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerGetEmergencyModeStartingTime() (*big.Int, error) { - var emergencyModeStartingTime *big.Int +func (c *WDelayerClient) WDelayerGetEmergencyModeStartingTime() (emergencyModeStartingTime *big.Int, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return err - } - emergencyModeStartingTime, err = wdelayer.GetEmergencyModeStartingTime(nil) + emergencyModeStartingTime, err = c.wdelayer.GetEmergencyModeStartingTime(nil) return err }); err != nil { return nil, err

@@ -308,17 +267,11 @@ return emergencyModeStartingTime, nil

} // WDelayerEnableEmergencyMode is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerEnableEmergencyMode() (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *WDelayerClient) WDelayerEnableEmergencyMode() (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return nil, err - } - return wdelayer.EnableEmergencyMode(auth) + return c.wdelayer.EnableEmergencyMode(auth) }, ); err != nil { return nil, fmt.Errorf("Failed setting enable emergency mode: %w", err)

@@ -327,17 +280,11 @@ return tx, nil

} // WDelayerChangeWithdrawalDelay is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerChangeWithdrawalDelay(newWithdrawalDelay uint64) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *WDelayerClient) WDelayerChangeWithdrawalDelay(newWithdrawalDelay uint64) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return nil, err - } - return wdelayer.ChangeWithdrawalDelay(auth, newWithdrawalDelay) + return c.wdelayer.ChangeWithdrawalDelay(auth, newWithdrawalDelay) }, ); err != nil { return nil, fmt.Errorf("Failed setting withdrawal delay: %w", err)

@@ -346,14 +293,9 @@ return tx, nil

} // WDelayerDepositInfo is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerDepositInfo(owner, token ethCommon.Address) (DepositState, error) { - var depositInfo DepositState +func (c *WDelayerClient) WDelayerDepositInfo(owner, token ethCommon.Address) (depositInfo DepositState, err error) { if err := c.client.Call(func(ec *ethclient.Client) error { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return err - } - amount, depositTimestamp, err := wdelayer.DepositInfo(nil, owner, token) + amount, depositTimestamp, err := c.wdelayer.DepositInfo(nil, owner, token) depositInfo.Amount = amount depositInfo.DepositTimestamp = depositTimestamp return err

@@ -364,17 +306,11 @@ return depositInfo, nil

} // WDelayerDeposit is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerDeposit(owner, token ethCommon.Address, amount *big.Int) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *WDelayerClient) WDelayerDeposit(owner, token ethCommon.Address, amount *big.Int) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return nil, err - } - return wdelayer.Deposit(auth, owner, token, amount) + return c.wdelayer.Deposit(auth, owner, token, amount) }, ); err != nil { return nil, fmt.Errorf("Failed deposit: %w", err)

@@ -383,17 +319,11 @@ return tx, nil

} // WDelayerWithdrawal is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerWithdrawal(owner, token ethCommon.Address) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *WDelayerClient) WDelayerWithdrawal(owner, token ethCommon.Address) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return nil, err - } - return wdelayer.Withdrawal(auth, owner, token) + return c.wdelayer.Withdrawal(auth, owner, token) }, ); err != nil { return nil, fmt.Errorf("Failed withdrawal: %w", err)

@@ -402,17 +332,11 @@ return tx, nil

} // WDelayerEscapeHatchWithdrawal is the interface to call the smart contract function -func (c *WDelayerClient) WDelayerEscapeHatchWithdrawal(to, token ethCommon.Address, amount *big.Int) (*types.Transaction, error) { - var tx *types.Transaction - var err error +func (c *WDelayerClient) WDelayerEscapeHatchWithdrawal(to, token ethCommon.Address, amount *big.Int) (tx *types.Transaction, err error) { if tx, err = c.client.CallAuth( - c.gasLimit, + 0, func(ec *ethclient.Client, auth *bind.TransactOpts) (*types.Transaction, error) { - wdelayer, err := WithdrawalDelayer.NewWithdrawalDelayer(c.address, ec) - if err != nil { - return nil, err - } - return wdelayer.EscapeHatchWithdrawal(auth, to, token, amount) + return c.wdelayer.EscapeHatchWithdrawal(auth, to, token, amount) }, ); err != nil { return nil, fmt.Errorf("Failed escapeHatchWithdrawal: %w", err)
M node/node.go → node/node.go

@@ -82,7 +82,10 @@ ethClient, err := ethclient.Dial(cfg.Web3.URL)

if err != nil { return nil, err } - client := eth.NewClient(ethClient, nil, nil, nil) + client, err := eth.NewClient(ethClient, nil, nil, nil) + if err != nil { + return nil, err + } sync, err := synchronizer.NewSynchronizer(client, historyDB, stateDB) if err != nil {
M synchronizer/synchronizer.go → synchronizer/synchronizer.go

@@ -383,7 +383,7 @@ batchData := historydb.NewBatchData()

position := 0 // Get the input for each Tx - forgeBatchArgs, err := s.ethClient.RollupForgeBatchArgs(evtForgeBatch.EthTxHash) + forgeBatchArgs, sender, err := s.ethClient.RollupForgeBatchArgs(evtForgeBatch.EthTxHash) if err != nil { return nil, err }

@@ -467,7 +467,7 @@ // Get Batch information

batch := &common.Batch{ BatchNum: common.BatchNum(evtForgeBatch.BatchNum), EthBlockNum: blockNum, - // ForgerAddr: , TODO: Get it from ethClient -> Add ForgerAddr to RollupEventForgeBatch + ForgerAddr: *sender, // CollectedFees: , TODO: Clarify where to get them if they are still needed StateRoot: common.Hash(forgeBatchArgs.NewStRoot.Bytes()), NumAccounts: numAccounts,

@@ -582,11 +582,6 @@ func getL1UserTx(eventsL1UserTx []eth.RollupEventL1UserTx, blockNum int64) ([]common.L1Tx, error) {

l1Txs := make([]common.L1Tx, 0) for _, evtL1UserTx := range eventsL1UserTx { - // Fill aditional Tx fields - toForge := evtL1UserTx.ToForgeL1TxsNum - evtL1UserTx.L1UserTx.ToForgeL1TxsNum = &toForge - evtL1UserTx.L1UserTx.Position = evtL1UserTx.Position - evtL1UserTx.L1UserTx.UserOrigin = true evtL1UserTx.L1UserTx.EthBlockNum = blockNum nL1Tx, err := common.NewL1Tx(&evtL1UserTx.L1UserTx) if err != nil {
M synchronizer/synchronizer_test.go → synchronizer/synchronizer_test.go

@@ -57,7 +57,7 @@ require.Nil(t, err)

blocks, err := s.historyDB.GetBlocks(0, 9999) require.Nil(t, err) - assert.Equal(t, int64(0), blocks[0].EthBlockNum) + assert.Equal(t, int64(1), blocks[0].EthBlockNum) // TODO once transakcio is completed /*
M test/ethclient.go → test/ethclient.go

@@ -10,6 +10,7 @@ "reflect"

"sync" "time" + "github.com/ethereum/go-ethereum" ethCommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/hermeznetwork/hermez-node/common"

@@ -225,7 +226,9 @@ AuctionVariables *eth.AuctionVariables

VerifyProof bool } -// NewClientSetupExample returns a ClientSetup example with hardcoded realistic values. +// NewClientSetupExample returns a ClientSetup example with hardcoded realistic +// values. With this setup, the rollup genesis will be block 1, and block 0 +// and 1 will be premined. //nolint:gomnd func NewClientSetupExample() *ClientSetup { // rfield, ok := new(big.Int).SetString("21888242871839275222246405745257275088548364400416034343698204186575808495617", 10)

@@ -259,7 +262,7 @@ }

auctionConstants := &eth.AuctionConstants{ BlocksPerSlot: 40, InitialMinimalBidding: initialMinimalBidding, - GenesisBlockNum: 0, + GenesisBlockNum: 1, GovernanceAddress: governanceAddress, TokenHEZ: tokenHEZ, HermezRollup: ethCommon.HexToAddress("0x474B6e29852257491cf283EfB1A9C61eBFe48369"),

@@ -296,6 +299,11 @@ // blockNum int64

// blockHash ethCommon.Hash // } +type batch struct { + ForgeBatchArgs eth.RollupForgeBatchArgs + Sender ethCommon.Address +} + // Client implements the eth.ClientInterface interface, allowing to manipulate the // values for testing, working with deterministic results. type Client struct {

@@ -311,8 +319,8 @@ maxBlockNum int64 // highest block num calculated

timer Timer hasher hasher - forgeBatchArgsPending map[ethCommon.Hash]*eth.RollupForgeBatchArgs - forgeBatchArgs map[ethCommon.Hash]*eth.RollupForgeBatchArgs + forgeBatchArgsPending map[ethCommon.Hash]*batch + forgeBatchArgs map[ethCommon.Hash]*batch } // NewClient returns a new test Client that implements the eth.IClient

@@ -326,7 +334,7 @@ // Add ethereum genesis block

mapL1TxQueue := make(map[int64]*eth.QueueStruct) mapL1TxQueue[0] = eth.NewQueueStruct() mapL1TxQueue[1] = eth.NewQueueStruct() - blockCurrent := Block{ + blockCurrent := &Block{ Rollup: &RollupBlock{ State: eth.RollupState{ StateRoot: big.NewInt(0),

@@ -367,11 +375,11 @@ },

} blockCurrent.Rollup.Eth = blockCurrent.Eth blockCurrent.Auction.Eth = blockCurrent.Eth - blocks[blockNum] = &blockCurrent + blocks[blockNum] = blockCurrent blockNext := blockCurrent.Next() blocks[blockNum+1] = blockNext - return &Client{ + c := Client{ rw: &sync.RWMutex{}, log: l, addr: addr,

@@ -380,9 +388,17 @@ auctionConstants: setup.AuctionConstants,

blocks: blocks, timer: timer, hasher: hasher, - forgeBatchArgsPending: make(map[ethCommon.Hash]*eth.RollupForgeBatchArgs), - forgeBatchArgs: make(map[ethCommon.Hash]*eth.RollupForgeBatchArgs), + forgeBatchArgsPending: make(map[ethCommon.Hash]*batch), + forgeBatchArgs: make(map[ethCommon.Hash]*batch), + blockNum: blockNum, + maxBlockNum: blockNum, + } + + for i := int64(1); i < setup.AuctionConstants.GenesisBlockNum+1; i++ { + c.CtlMineBlock() } + + return &c } //

@@ -452,7 +468,7 @@ blockCurrent.Eth.Hash = c.hasher.Next()

for ethTxHash, forgeBatchArgs := range c.forgeBatchArgsPending { c.forgeBatchArgs[ethTxHash] = forgeBatchArgs } - c.forgeBatchArgsPending = make(map[ethCommon.Hash]*eth.RollupForgeBatchArgs) + c.forgeBatchArgsPending = make(map[ethCommon.Hash]*batch) blockNext := blockCurrent.Next() c.blocks[c.blockNum+1] = blockNext

@@ -552,10 +568,10 @@ func (c *Client) EthBlockByNumber(ctx context.Context, blockNum int64) (*common.Block, error) {

c.rw.RLock() defer c.rw.RUnlock() - block, ok := c.blocks[blockNum] - if !ok { - return nil, fmt.Errorf("block not found") + if blockNum > c.blockNum { + return nil, ethereum.NotFound } + block := c.blocks[blockNum] return &common.Block{ EthBlockNum: blockNum, Timestamp: time.Unix(block.Eth.Time, 0),

@@ -579,9 +595,54 @@ // Rollup

// // CtlAddL1TxUser adds an L1TxUser to the L1UserTxs queue of the Rollup -func (c *Client) CtlAddL1TxUser(l1Tx *common.L1Tx) { +// func (c *Client) CtlAddL1TxUser(l1Tx *common.L1Tx) { +// c.rw.Lock() +// defer c.rw.Unlock() +// +// nextBlock := c.nextBlock() +// r := nextBlock.Rollup +// queue := r.State.MapL1TxQueue[r.State.LastToForgeL1TxsNum] +// if len(queue.L1TxQueue) >= eth.RollupConstMaxL1UserTx { +// r.State.LastToForgeL1TxsNum++ +// r.State.MapL1TxQueue[r.State.LastToForgeL1TxsNum] = eth.NewQueueStruct() +// queue = r.State.MapL1TxQueue[r.State.LastToForgeL1TxsNum] +// } +// if int64(l1Tx.FromIdx) > r.State.CurrentIdx { +// panic("l1Tx.FromIdx > r.State.CurrentIdx") +// } +// if int(l1Tx.TokenID)+1 > len(r.State.TokenList) { +// panic("l1Tx.TokenID + 1 > len(r.State.TokenList)") +// } +// queue.L1TxQueue = append(queue.L1TxQueue, *l1Tx) +// r.Events.L1UserTx = append(r.Events.L1UserTx, eth.RollupEventL1UserTx{ +// L1Tx: *l1Tx, +// ToForgeL1TxsNum: r.State.LastToForgeL1TxsNum, +// Position: len(queue.L1TxQueue) - 1, +// }) +// } + +// RollupL1UserTxERC20ETH sends an L1UserTx to the Rollup. +func (c *Client) RollupL1UserTxERC20ETH( + fromBJJ *babyjub.PublicKey, + fromIdx int64, + loadAmount *big.Int, + amount *big.Int, + tokenID uint32, + toIdx int64, +) (tx *types.Transaction, err error) { c.rw.Lock() defer c.rw.Unlock() + cpy := c.nextBlock().copy() + defer func() { c.revertIfErr(err, cpy) }() + + _, err = common.NewFloat16(amount) + if err != nil { + return nil, err + } + _, err = common.NewFloat16(loadAmount) + if err != nil { + return nil, err + } nextBlock := c.nextBlock() r := nextBlock.Rollup

@@ -591,24 +652,34 @@ r.State.LastToForgeL1TxsNum++

r.State.MapL1TxQueue[r.State.LastToForgeL1TxsNum] = eth.NewQueueStruct() queue = r.State.MapL1TxQueue[r.State.LastToForgeL1TxsNum] } - if int64(l1Tx.FromIdx) > r.State.CurrentIdx { + if fromIdx > r.State.CurrentIdx { panic("l1Tx.FromIdx > r.State.CurrentIdx") } - if int(l1Tx.TokenID)+1 > len(r.State.TokenList) { + if int(tokenID)+1 > len(r.State.TokenList) { panic("l1Tx.TokenID + 1 > len(r.State.TokenList)") } - queue.L1TxQueue = append(queue.L1TxQueue, *l1Tx) - r.Events.L1UserTx = append(r.Events.L1UserTx, eth.RollupEventL1UserTx{ - L1UserTx: *l1Tx, - ToForgeL1TxsNum: r.State.LastToForgeL1TxsNum, + toForgeL1TxsNum := r.State.LastToForgeL1TxsNum + l1Tx, err := common.NewL1Tx(&common.L1Tx{ + FromIdx: common.Idx(fromIdx), + FromEthAddr: *c.addr, + FromBJJ: fromBJJ, + Amount: amount, + LoadAmount: loadAmount, + TokenID: common.TokenID(tokenID), + ToIdx: common.Idx(toIdx), + ToForgeL1TxsNum: &toForgeL1TxsNum, Position: len(queue.L1TxQueue) - 1, + UserOrigin: true, }) -} + if err != nil { + return nil, err + } -// RollupL1UserTxERC20ETH is the interface to call the smart contract function -func (c *Client) RollupL1UserTxERC20ETH(fromBJJ *babyjub.PublicKey, fromIdx int64, loadAmount *big.Int, amount *big.Int, tokenID uint32, toIdx int64) (*types.Transaction, error) { - log.Error("TODO") - return nil, errTODO + queue.L1TxQueue = append(queue.L1TxQueue, *l1Tx) + r.Events.L1UserTx = append(r.Events.L1UserTx, eth.RollupEventL1UserTx{ + L1UserTx: *l1Tx, + }) + return r.addTransaction(newTransaction("l1UserTxERC20ETH", l1Tx)), nil } // RollupL1UserTxERC777 is the interface to call the smart contract function

@@ -710,7 +781,7 @@ r.State.MapL1TxQueue[r.State.LastToForgeL1TxsNum] = eth.NewQueueStruct()

} } ethTx := r.addTransaction(newTransaction("forgebatch", args)) - c.forgeBatchArgsPending[ethTx.Hash()] = args + c.forgeBatchArgsPending[ethTx.Hash()] = &batch{*args, *c.addr} r.Events.ForgeBatch = append(r.Events.ForgeBatch, eth.RollupEventForgeBatch{ BatchNum: int64(len(r.State.ExitRoots)), EthTxHash: ethTx.Hash(),

@@ -820,15 +891,15 @@ return &block.Rollup.Events, &block.Eth.Hash, nil

} // RollupForgeBatchArgs returns the arguments used in a ForgeBatch call in the Rollup Smart Contract in the given transaction -func (c *Client) RollupForgeBatchArgs(ethTxHash ethCommon.Hash) (*eth.RollupForgeBatchArgs, error) { +func (c *Client) RollupForgeBatchArgs(ethTxHash ethCommon.Hash) (*eth.RollupForgeBatchArgs, *ethCommon.Address, error) { c.rw.RLock() defer c.rw.RUnlock() - forgeBatchArgs, ok := c.forgeBatchArgs[ethTxHash] + batch, ok := c.forgeBatchArgs[ethTxHash] if !ok { - return nil, fmt.Errorf("transaction not found") + return nil, nil, fmt.Errorf("transaction not found") } - return forgeBatchArgs, nil + return &batch.ForgeBatchArgs, &batch.Sender, nil } //
M test/ethclient_test.go → test/ethclient_test.go

@@ -42,21 +42,21 @@ clientSetup := NewClientSetupExample()

c := NewClient(true, &timer, &ethCommon.Address{}, clientSetup) blockNum, err := c.EthCurrentBlock() require.Nil(t, err) - assert.Equal(t, int64(0), blockNum) + assert.Equal(t, int64(1), blockNum) block, err := c.EthBlockByNumber(context.TODO(), 0) require.Nil(t, err) assert.Equal(t, int64(0), block.EthBlockNum) assert.Equal(t, time.Unix(0, 0), block.Timestamp) assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000000", block.Hash.Hex()) - assert.Equal(t, int64(0), c.blockNum) // Mine some empty blocks - c.CtlMineBlock() assert.Equal(t, int64(1), c.blockNum) c.CtlMineBlock() assert.Equal(t, int64(2), c.blockNum) + c.CtlMineBlock() + assert.Equal(t, int64(3), c.blockNum) block, err = c.EthBlockByNumber(context.TODO(), 2) require.Nil(t, err)

@@ -154,14 +154,17 @@ const N = 16

var keys [N]*keys for i := 0; i < N; i++ { keys[i] = genKeys(int64(i)) - l1UserTx := common.L1Tx{ + tx := common.L1Tx{ FromIdx: 0, FromEthAddr: keys[i].Addr, FromBJJ: keys[i].BJJPublicKey, TokenID: common.TokenID(0), + Amount: big.NewInt(0), LoadAmount: big.NewInt(10 + int64(i)), } - c.CtlAddL1TxUser(&l1UserTx) + _, err := c.RollupL1UserTxERC20ETH(tx.FromBJJ, int64(tx.FromIdx), tx.LoadAmount, + tx.Amount, uint32(tx.TokenID), int64(tx.ToIdx)) + require.Nil(t, err) } c.CtlMineBlock()

@@ -231,8 +234,9 @@ require.Nil(t, err)

rollupEvents, _, err = c.RollupEventsByBlock(blockNum) require.Nil(t, err) - rollupForgeBatchArgs1, err := c.RollupForgeBatchArgs(rollupEvents.ForgeBatch[0].EthTxHash) + rollupForgeBatchArgs1, sender, err := c.RollupForgeBatchArgs(rollupEvents.ForgeBatch[0].EthTxHash) require.Nil(t, err) + assert.Equal(t, *c.addr, *sender) assert.Equal(t, rollupForgeBatchArgs0, rollupForgeBatchArgs1) }