Update ethclient contracts & rollup iteration 1

This commit is contained in:
laisolizq
2020-10-06 12:00:11 +02:00
parent 15a122a6a0
commit 202b98b3e6
13 changed files with 1443 additions and 1787 deletions

View File

@@ -21,7 +21,8 @@ const (
// maxBalanceBytes is the maximum bytes that can use the Account.Balance *big.Int // maxBalanceBytes is the maximum bytes that can use the Account.Balance *big.Int
maxBalanceBytes = 24 maxBalanceBytes = 24
idxBytesLen = 6 // IdxBytesLen idx bytes
IdxBytesLen = 6
// maxIdxValue is the maximum value that Idx can have (48 bits: maxIdxValue=2**48-1) // maxIdxValue is the maximum value that Idx can have (48 bits: maxIdxValue=2**48-1)
maxIdxValue = 0xffffffffffff maxIdxValue = 0xffffffffffff
@@ -66,8 +67,8 @@ func (idx Idx) BigInt() *big.Int {
// IdxFromBytes returns Idx from a byte array // IdxFromBytes returns Idx from a byte array
func IdxFromBytes(b []byte) (Idx, error) { func IdxFromBytes(b []byte) (Idx, error) {
if len(b) != idxBytesLen { if len(b) != IdxBytesLen {
return 0, fmt.Errorf("can not parse Idx, bytes len %d, expected %d", len(b), idxBytesLen) return 0, fmt.Errorf("can not parse Idx, bytes len %d, expected %d", len(b), IdxBytesLen)
} }
var idxBytes [8]byte var idxBytes [8]byte
copy(idxBytes[2:], b[:]) copy(idxBytes[2:], b[:])

View File

@@ -27,36 +27,36 @@ type AuctionConstants struct {
InitialMinimalBidding *big.Int InitialMinimalBidding *big.Int
// First block where the first slot begins // First block where the first slot begins
GenesisBlockNum int64 GenesisBlockNum int64
// Hermez Governanze Token smartcontract address who controls some parameters and collects HEZ fee
// Only for test
GovernanceAddress ethCommon.Address
// ERC777 token with which the bids will be made // ERC777 token with which the bids will be made
TokenHEZ ethCommon.Address TokenHEZ ethCommon.Address
// HermezRollup smartcontract address // HermezRollup smartcontract address
HermezRollup ethCommon.Address HermezRollup ethCommon.Address
// Hermez Governanze Token smartcontract address who controls some parameters and collects HEZ fee
// Only for test
GovernanceAddress ethCommon.Address
} }
// SlotState is the state of a slot // SlotState is the state of a slot
type SlotState struct { type SlotState struct {
Forger ethCommon.Address Bidder ethCommon.Address
Fulfilled bool
BidAmount *big.Int BidAmount *big.Int
ClosedMinBid *big.Int ClosedMinBid *big.Int
Fulfilled bool
} }
// NewSlotState returns an empty SlotState // NewSlotState returns an empty SlotState
func NewSlotState() *SlotState { func NewSlotState() *SlotState {
return &SlotState{ return &SlotState{
Forger: ethCommon.Address{}, Bidder: ethCommon.Address{},
Fulfilled: false,
BidAmount: big.NewInt(0), BidAmount: big.NewInt(0),
ClosedMinBid: big.NewInt(0), ClosedMinBid: big.NewInt(0),
Fulfilled: false,
} }
} }
// Coordinator is the details of the Coordinator identified by the forger address // Coordinator is the details of the Coordinator identified by the forger address
type Coordinator struct { type Coordinator struct {
WithdrawalAddress ethCommon.Address Forger ethCommon.Address
URL string URL string
} }
@@ -94,7 +94,7 @@ type AuctionState struct {
type AuctionEventNewBid struct { type AuctionEventNewBid struct {
Slot int64 Slot int64
BidAmount *big.Int BidAmount *big.Int
CoordinatorForger ethCommon.Address Bidder ethCommon.Address
} }
// AuctionEventNewSlotDeadline is an event of the Auction Smart Contract // AuctionEventNewSlotDeadline is an event of the Auction Smart Contract
@@ -132,24 +132,18 @@ type AuctionEventNewAllocationRatio struct {
NewAllocationRatio [3]uint16 NewAllocationRatio [3]uint16
} }
// AuctionEventNewCoordinator is an event of the Auction Smart Contract // AuctionEventSetCoordinator is an event of the Auction Smart Contract
type AuctionEventNewCoordinator struct { type AuctionEventSetCoordinator struct {
BidderAddress ethCommon.Address
ForgerAddress ethCommon.Address ForgerAddress ethCommon.Address
WithdrawalAddress ethCommon.Address
CoordinatorURL string
}
// AuctionEventCoordinatorUpdated is an event of the Auction Smart Contract
type AuctionEventCoordinatorUpdated struct {
ForgerAddress ethCommon.Address
WithdrawalAddress ethCommon.Address
CoordinatorURL string CoordinatorURL string
} }
// AuctionEventNewForgeAllocated is an event of the Auction Smart Contract // AuctionEventNewForgeAllocated is an event of the Auction Smart Contract
type AuctionEventNewForgeAllocated struct { type AuctionEventNewForgeAllocated struct {
Bidder ethCommon.Address
Forger ethCommon.Address Forger ethCommon.Address
CurrentSlot int64 SlotToForge int64
BurnAmount *big.Int BurnAmount *big.Int
DonationAmount *big.Int DonationAmount *big.Int
GovernanceAmount *big.Int GovernanceAmount *big.Int
@@ -164,7 +158,7 @@ type AuctionEventNewDefaultSlotSetBid struct {
// AuctionEventNewForge is an event of the Auction Smart Contract // AuctionEventNewForge is an event of the Auction Smart Contract
type AuctionEventNewForge struct { type AuctionEventNewForge struct {
Forger ethCommon.Address Forger ethCommon.Address
CurrentSlot int64 SlotToForge int64
} }
// AuctionEventHEZClaimed is an event of the Auction Smart Contract // AuctionEventHEZClaimed is an event of the Auction Smart Contract
@@ -183,8 +177,7 @@ type AuctionEvents struct { //nolint:structcheck
NewBootCoordinator []AuctionEventNewBootCoordinator NewBootCoordinator []AuctionEventNewBootCoordinator
NewOpenAuctionSlots []AuctionEventNewOpenAuctionSlots NewOpenAuctionSlots []AuctionEventNewOpenAuctionSlots
NewAllocationRatio []AuctionEventNewAllocationRatio NewAllocationRatio []AuctionEventNewAllocationRatio
NewCoordinator []AuctionEventNewCoordinator SetCoordinator []AuctionEventSetCoordinator
CoordinatorUpdated []AuctionEventCoordinatorUpdated
NewForgeAllocated []AuctionEventNewForgeAllocated NewForgeAllocated []AuctionEventNewForgeAllocated
NewDefaultSlotSetBid []AuctionEventNewDefaultSlotSetBid NewDefaultSlotSetBid []AuctionEventNewDefaultSlotSetBid
NewForge []AuctionEventNewForge NewForge []AuctionEventNewForge
@@ -202,8 +195,7 @@ func NewAuctionEvents() AuctionEvents {
NewBootCoordinator: make([]AuctionEventNewBootCoordinator, 0), NewBootCoordinator: make([]AuctionEventNewBootCoordinator, 0),
NewOpenAuctionSlots: make([]AuctionEventNewOpenAuctionSlots, 0), NewOpenAuctionSlots: make([]AuctionEventNewOpenAuctionSlots, 0),
NewAllocationRatio: make([]AuctionEventNewAllocationRatio, 0), NewAllocationRatio: make([]AuctionEventNewAllocationRatio, 0),
NewCoordinator: make([]AuctionEventNewCoordinator, 0), SetCoordinator: make([]AuctionEventSetCoordinator, 0),
CoordinatorUpdated: make([]AuctionEventCoordinatorUpdated, 0),
NewForgeAllocated: make([]AuctionEventNewForgeAllocated, 0), NewForgeAllocated: make([]AuctionEventNewForgeAllocated, 0),
NewDefaultSlotSetBid: make([]AuctionEventNewDefaultSlotSetBid, 0), NewDefaultSlotSetBid: make([]AuctionEventNewDefaultSlotSetBid, 0),
NewForge: make([]AuctionEventNewForge, 0), NewForge: make([]AuctionEventNewForge, 0),
@@ -235,9 +227,7 @@ type AuctionInterface interface {
AuctionChangeDefaultSlotSetBid(slotSet int64, newInitialMinBid *big.Int) (*types.Transaction, error) AuctionChangeDefaultSlotSetBid(slotSet int64, newInitialMinBid *big.Int) (*types.Transaction, error)
// Coordinator Management // Coordinator Management
AuctionRegisterCoordinator(forgerAddress ethCommon.Address, URL string) (*types.Transaction, error) AuctionSetCoordinator(forger ethCommon.Address, coordinatorURL string) (*types.Transaction, error)
AuctionIsRegisteredCoordinator(forgerAddress ethCommon.Address) (bool, error)
AuctionUpdateCoordinatorInfo(forgerAddress ethCommon.Address, newWithdrawAddress ethCommon.Address, newURL string) (*types.Transaction, error)
// Slot Info // Slot Info
AuctionGetSlotNumber(blockNum int64) (int64, error) AuctionGetSlotNumber(blockNum int64) (int64, error)
@@ -247,17 +237,16 @@ type AuctionInterface interface {
AuctionGetSlotSet(slot int64) (*big.Int, error) AuctionGetSlotSet(slot int64) (*big.Int, error)
// Bidding // Bidding
// AuctionTokensReceived(operator, from, to ethCommon.Address, amount *big.Int, AuctionBid(slot int64, bidAmount *big.Int) (*types.Transaction, error)
// userData, operatorData []byte) error // Only called from another smart contract AuctionMultiBid(startingSlot int64, endingSlot int64, slotSet [6]bool, maxBid, closedMinBid, budget *big.Int) (*types.Transaction, error)
AuctionBid(slot int64, bidAmount *big.Int, forger ethCommon.Address) (*types.Transaction, error)
AuctionMultiBid(startingSlot int64, endingSlot int64, slotSet [6]bool, maxBid, closedMinBid, budget *big.Int, forger ethCommon.Address) (*types.Transaction, error)
// Forge // Forge
AuctionCanForge(forger ethCommon.Address, blockNum int64) (bool, error) AuctionCanForge(forger ethCommon.Address, blockNum int64) (bool, error)
// AuctionForge(forger ethCommon.Address) (bool, error) // Only called from another smart contract AuctionForge(forger ethCommon.Address) (*types.Transaction, error)
// Fees // Fees
AuctionClaimHEZ(claimAddress ethCommon.Address) (*types.Transaction, error) AuctionClaimHEZ() (*types.Transaction, error)
AuctionGetClaimableHEZ(bidder ethCommon.Address) (*big.Int, error)
// //
// Smart Contract Status // Smart Contract Status
@@ -576,8 +565,8 @@ func (c *AuctionClient) AuctionGetClaimableHEZ(claimAddress ethCommon.Address) (
return claimableHEZ, nil return claimableHEZ, nil
} }
// AuctionRegisterCoordinator is the interface to call the smart contract function // AuctionSetCoordinator is the interface to call the smart contract function
func (c *AuctionClient) AuctionRegisterCoordinator(forgerAddress ethCommon.Address, URL string) (*types.Transaction, error) { func (c *AuctionClient) AuctionSetCoordinator(forger ethCommon.Address, coordinatorURL string) (*types.Transaction, error) {
var tx *types.Transaction var tx *types.Transaction
var err error var err error
if tx, err = c.client.CallAuth( if tx, err = c.client.CallAuth(
@@ -587,45 +576,10 @@ func (c *AuctionClient) AuctionRegisterCoordinator(forgerAddress ethCommon.Addre
if err != nil { if err != nil {
return nil, err return nil, err
} }
return auction.RegisterCoordinator(auth, forgerAddress, URL) return auction.SetCoordinator(auth, forger, coordinatorURL)
}, },
); err != nil { ); err != nil {
return nil, fmt.Errorf("Failed register coordinator: %w", err) return nil, fmt.Errorf("Failed set coordinator: %w", err)
}
return tx, nil
}
// AuctionIsRegisteredCoordinator is the interface to call the smart contract function
func (c *AuctionClient) AuctionIsRegisteredCoordinator(forgerAddress ethCommon.Address) (bool, error) {
var registered bool
if err := c.client.Call(func(ec *ethclient.Client) error {
auction, err := HermezAuctionProtocol.NewHermezAuctionProtocol(c.address, ec)
if err != nil {
return err
}
registered, err = auction.IsRegisteredCoordinator(nil, forgerAddress)
return err
}); err != nil {
return false, err
}
return registered, nil
}
// AuctionUpdateCoordinatorInfo is the interface to call the smart contract function
func (c *AuctionClient) AuctionUpdateCoordinatorInfo(forgerAddress ethCommon.Address, newWithdrawAddress ethCommon.Address, newURL string) (*types.Transaction, error) {
var tx *types.Transaction
var err error
if tx, err = c.client.CallAuth(
c.gasLimit,
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.UpdateCoordinatorInfo(auth, forgerAddress, newWithdrawAddress, newURL)
},
); err != nil {
return nil, fmt.Errorf("Failed update coordinator info: %w", err)
} }
return tx, nil return tx, nil
} }
@@ -715,7 +669,7 @@ func (c *AuctionClient) AuctionGetSlotNumber(blockNum int64) (int64, error) {
} }
// AuctionBid is the interface to call the smart contract function // AuctionBid is the interface to call the smart contract function
func (c *AuctionClient) AuctionBid(slot int64, bidAmount *big.Int, forger ethCommon.Address) (*types.Transaction, error) { func (c *AuctionClient) AuctionBid(slot int64, bidAmount *big.Int) (*types.Transaction, error) {
var tx *types.Transaction var tx *types.Transaction
var err error var err error
if tx, err = c.client.CallAuth( if tx, err = c.client.CallAuth(
@@ -725,7 +679,7 @@ func (c *AuctionClient) AuctionBid(slot int64, bidAmount *big.Int, forger ethCom
if err != nil { if err != nil {
return nil, err return nil, err
} }
bidFnSignature := []byte("bid(uint128,uint128,address)") bidFnSignature := []byte("bid(uint128,uint128)")
hash := sha3.NewLegacyKeccak256() hash := sha3.NewLegacyKeccak256()
_, err = hash.Write(bidFnSignature) _, err = hash.Write(bidFnSignature)
if err != nil { if err != nil {
@@ -736,12 +690,10 @@ func (c *AuctionClient) AuctionBid(slot int64, bidAmount *big.Int, forger ethCom
binary.BigEndian.PutUint64(slotBytes, uint64(slot)) binary.BigEndian.PutUint64(slotBytes, uint64(slot))
paddedSlot := ethCommon.LeftPadBytes(slotBytes, 32) paddedSlot := ethCommon.LeftPadBytes(slotBytes, 32)
paddedAmount := ethCommon.LeftPadBytes(bidAmount.Bytes(), 32) paddedAmount := ethCommon.LeftPadBytes(bidAmount.Bytes(), 32)
paddedAddress := ethCommon.LeftPadBytes(forger.Bytes(), 32)
var userData []byte var userData []byte
userData = append(userData, methodID...) userData = append(userData, methodID...)
userData = append(userData, paddedSlot...) userData = append(userData, paddedSlot...)
userData = append(userData, paddedAmount...) userData = append(userData, paddedAmount...)
userData = append(userData, paddedAddress...)
return tokens.Send(auth, c.address, bidAmount, userData) return tokens.Send(auth, c.address, bidAmount, userData)
}, },
); err != nil { ); err != nil {
@@ -751,7 +703,7 @@ func (c *AuctionClient) AuctionBid(slot int64, bidAmount *big.Int, forger ethCom
} }
// AuctionMultiBid is the interface to call the smart contract function // 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, forger ethCommon.Address) (*types.Transaction, error) { func (c *AuctionClient) AuctionMultiBid(startingSlot int64, endingSlot int64, slotSet [6]bool, maxBid, closedMinBid, budget *big.Int) (*types.Transaction, error) {
var tx *types.Transaction var tx *types.Transaction
var err error var err error
if tx, err = c.client.CallAuth( if tx, err = c.client.CallAuth(
@@ -761,7 +713,7 @@ func (c *AuctionClient) AuctionMultiBid(startingSlot int64, endingSlot int64, sl
if err != nil { if err != nil {
return nil, err return nil, err
} }
multiBidFnSignature := []byte("multiBid(uint128,uint128,bool[6],uint128,uint128,address)") multiBidFnSignature := []byte("multiBid(uint128,uint128,bool[6],uint128,uint128)")
hash := sha3.NewLegacyKeccak256() hash := sha3.NewLegacyKeccak256()
_, err = hash.Write(multiBidFnSignature) _, err = hash.Write(multiBidFnSignature)
if err != nil { if err != nil {
@@ -776,7 +728,6 @@ func (c *AuctionClient) AuctionMultiBid(startingSlot int64, endingSlot int64, sl
paddedEndingSlot := ethCommon.LeftPadBytes(endingSlotBytes, 32) paddedEndingSlot := ethCommon.LeftPadBytes(endingSlotBytes, 32)
paddedMinBid := ethCommon.LeftPadBytes(closedMinBid.Bytes(), 32) paddedMinBid := ethCommon.LeftPadBytes(closedMinBid.Bytes(), 32)
paddedMaxBid := ethCommon.LeftPadBytes(maxBid.Bytes(), 32) paddedMaxBid := ethCommon.LeftPadBytes(maxBid.Bytes(), 32)
paddedAddress := ethCommon.LeftPadBytes(forger.Bytes(), 32)
var userData []byte var userData []byte
userData = append(userData, methodID...) userData = append(userData, methodID...)
userData = append(userData, paddedStartingSlot...) userData = append(userData, paddedStartingSlot...)
@@ -792,7 +743,6 @@ func (c *AuctionClient) AuctionMultiBid(startingSlot int64, endingSlot int64, sl
} }
userData = append(userData, paddedMaxBid...) userData = append(userData, paddedMaxBid...)
userData = append(userData, paddedMinBid...) userData = append(userData, paddedMinBid...)
userData = append(userData, paddedAddress...)
return tokens.Send(auth, c.address, budget, userData) return tokens.Send(auth, c.address, budget, userData)
}, },
); err != nil { ); err != nil {
@@ -817,13 +767,8 @@ func (c *AuctionClient) AuctionCanForge(forger ethCommon.Address, blockNum int64
return canForge, nil return canForge, nil
} }
// AuctionForge is the interface to call the smart contract function
// func (c *AuctionClient) AuctionForge(forger ethCommon.Address) (bool, error) {
// return false, errTODO
// }
// AuctionClaimHEZ is the interface to call the smart contract function // AuctionClaimHEZ is the interface to call the smart contract function
func (c *AuctionClient) AuctionClaimHEZ(claimAddress ethCommon.Address) (*types.Transaction, error) { func (c *AuctionClient) AuctionClaimHEZ() (*types.Transaction, error) {
var tx *types.Transaction var tx *types.Transaction
var err error var err error
if tx, err = c.client.CallAuth( if tx, err = c.client.CallAuth(
@@ -833,7 +778,7 @@ func (c *AuctionClient) AuctionClaimHEZ(claimAddress ethCommon.Address) (*types.
if err != nil { if err != nil {
return nil, err return nil, err
} }
return auction.ClaimHEZ(auth, claimAddress) return auction.ClaimHEZ(auth)
}, },
); err != nil { ); err != nil {
return nil, fmt.Errorf("Failed claim HEZ: %w", err) return nil, fmt.Errorf("Failed claim HEZ: %w", err)
@@ -942,20 +887,19 @@ func (c *AuctionClient) AuctionVariables() (*AuctionVariables, error) {
} }
var ( var (
logNewBid = crypto.Keccak256Hash([]byte("NewBid(uint128,uint128,address)")) logAuctionNewBid = crypto.Keccak256Hash([]byte("NewBid(uint128,uint128,address)"))
logNewSlotDeadline = crypto.Keccak256Hash([]byte("NewSlotDeadline(uint8)")) logAuctionNewSlotDeadline = crypto.Keccak256Hash([]byte("NewSlotDeadline(uint8)"))
logNewClosedAuctionSlots = crypto.Keccak256Hash([]byte("NewClosedAuctionSlots(uint16)")) logAuctionNewClosedAuctionSlots = crypto.Keccak256Hash([]byte("NewClosedAuctionSlots(uint16)"))
logNewOutbidding = crypto.Keccak256Hash([]byte("NewOutbidding(uint16)")) logAuctionNewOutbidding = crypto.Keccak256Hash([]byte("NewOutbidding(uint16)"))
logNewDonationAddress = crypto.Keccak256Hash([]byte("NewDonationAddress(address)")) logAuctionNewDonationAddress = crypto.Keccak256Hash([]byte("NewDonationAddress(address)"))
logNewBootCoordinator = crypto.Keccak256Hash([]byte("NewBootCoordinator(address)")) logAuctionNewBootCoordinator = crypto.Keccak256Hash([]byte("NewBootCoordinator(address)"))
logNewOpenAuctionSlots = crypto.Keccak256Hash([]byte("NewOpenAuctionSlots(uint16)")) logAuctionNewOpenAuctionSlots = crypto.Keccak256Hash([]byte("NewOpenAuctionSlots(uint16)"))
logNewAllocationRatio = crypto.Keccak256Hash([]byte("NewAllocationRatio(uint16[3])")) logAuctionNewAllocationRatio = crypto.Keccak256Hash([]byte("NewAllocationRatio(uint16[3])"))
logNewCoordinator = crypto.Keccak256Hash([]byte("NewCoordinator(address,address,string)")) logAuctionSetCoordinator = crypto.Keccak256Hash([]byte("SetCoordinator(address,address,string)"))
logCoordinatorUpdated = crypto.Keccak256Hash([]byte("CoordinatorUpdated(address,address,string)")) logAuctionNewForgeAllocated = crypto.Keccak256Hash([]byte("NewForgeAllocated(address,address,uint128,uint128,uint128,uint128)"))
logNewForgeAllocated = crypto.Keccak256Hash([]byte("NewForgeAllocated(address,uint128,uint128,uint128,uint128)")) logAuctionNewDefaultSlotSetBid = crypto.Keccak256Hash([]byte("NewDefaultSlotSetBid(uint128,uint128)"))
logNewDefaultSlotSetBid = crypto.Keccak256Hash([]byte("NewDefaultSlotSetBid(uint128,uint128)")) logAuctionNewForge = crypto.Keccak256Hash([]byte("NewForge(address,uint128)"))
logNewForge = crypto.Keccak256Hash([]byte("NewForge(address,uint128)")) logAuctionHEZClaimed = crypto.Keccak256Hash([]byte("HEZClaimed(address,uint128)"))
logHEZClaimed = crypto.Keccak256Hash([]byte("HEZClaimed(address,uint128)"))
) )
// AuctionEventsByBlock returns the events in a block that happened in the // AuctionEventsByBlock returns the events in a block that happened in the
@@ -986,7 +930,7 @@ func (c *AuctionClient) AuctionEventsByBlock(blockNum int64) (*AuctionEvents, *e
return nil, nil, ErrBlockHashMismatchEvent return nil, nil, ErrBlockHashMismatchEvent
} }
switch vLog.Topics[0] { switch vLog.Topics[0] {
case logNewBid: case logAuctionNewBid:
var auxNewBid struct { var auxNewBid struct {
Slot *big.Int Slot *big.Int
BidAmount *big.Int BidAmount *big.Int
@@ -998,71 +942,64 @@ func (c *AuctionClient) AuctionEventsByBlock(blockNum int64) (*AuctionEvents, *e
} }
newBid.BidAmount = auxNewBid.BidAmount newBid.BidAmount = auxNewBid.BidAmount
newBid.Slot = new(big.Int).SetBytes(vLog.Topics[1][:]).Int64() newBid.Slot = new(big.Int).SetBytes(vLog.Topics[1][:]).Int64()
newBid.CoordinatorForger = ethCommon.BytesToAddress(vLog.Topics[2].Bytes()) newBid.Bidder = ethCommon.BytesToAddress(vLog.Topics[2].Bytes())
auctionEvents.NewBid = append(auctionEvents.NewBid, newBid) auctionEvents.NewBid = append(auctionEvents.NewBid, newBid)
case logNewSlotDeadline: case logAuctionNewSlotDeadline:
var newSlotDeadline AuctionEventNewSlotDeadline var newSlotDeadline AuctionEventNewSlotDeadline
if err := c.contractAbi.Unpack(&newSlotDeadline, "NewSlotDeadline", vLog.Data); err != nil { if err := c.contractAbi.Unpack(&newSlotDeadline, "NewSlotDeadline", vLog.Data); err != nil {
return nil, nil, err return nil, nil, err
} }
auctionEvents.NewSlotDeadline = append(auctionEvents.NewSlotDeadline, newSlotDeadline) auctionEvents.NewSlotDeadline = append(auctionEvents.NewSlotDeadline, newSlotDeadline)
case logNewClosedAuctionSlots: case logAuctionNewClosedAuctionSlots:
var newClosedAuctionSlots AuctionEventNewClosedAuctionSlots var newClosedAuctionSlots AuctionEventNewClosedAuctionSlots
if err := c.contractAbi.Unpack(&newClosedAuctionSlots, "NewClosedAuctionSlots", vLog.Data); err != nil { if err := c.contractAbi.Unpack(&newClosedAuctionSlots, "NewClosedAuctionSlots", vLog.Data); err != nil {
return nil, nil, err return nil, nil, err
} }
auctionEvents.NewClosedAuctionSlots = append(auctionEvents.NewClosedAuctionSlots, newClosedAuctionSlots) auctionEvents.NewClosedAuctionSlots = append(auctionEvents.NewClosedAuctionSlots, newClosedAuctionSlots)
case logNewOutbidding: case logAuctionNewOutbidding:
var newOutbidding AuctionEventNewOutbidding var newOutbidding AuctionEventNewOutbidding
if err := c.contractAbi.Unpack(&newOutbidding, "NewOutbidding", vLog.Data); err != nil { if err := c.contractAbi.Unpack(&newOutbidding, "NewOutbidding", vLog.Data); err != nil {
return nil, nil, err return nil, nil, err
} }
auctionEvents.NewOutbidding = append(auctionEvents.NewOutbidding, newOutbidding) auctionEvents.NewOutbidding = append(auctionEvents.NewOutbidding, newOutbidding)
case logNewDonationAddress: case logAuctionNewDonationAddress:
var newDonationAddress AuctionEventNewDonationAddress var newDonationAddress AuctionEventNewDonationAddress
if err := c.contractAbi.Unpack(&newDonationAddress, "NewDonationAddress", vLog.Data); err != nil { newDonationAddress.NewDonationAddress = ethCommon.BytesToAddress(vLog.Topics[1].Bytes())
return nil, nil, err
}
auctionEvents.NewDonationAddress = append(auctionEvents.NewDonationAddress, newDonationAddress) auctionEvents.NewDonationAddress = append(auctionEvents.NewDonationAddress, newDonationAddress)
case logNewBootCoordinator: case logAuctionNewBootCoordinator:
var newBootCoordinator AuctionEventNewBootCoordinator var newBootCoordinator AuctionEventNewBootCoordinator
if err := c.contractAbi.Unpack(&newBootCoordinator, "NewBootCoordinator", vLog.Data); err != nil { newBootCoordinator.NewBootCoordinator = ethCommon.BytesToAddress(vLog.Topics[1].Bytes())
return nil, nil, err
}
auctionEvents.NewBootCoordinator = append(auctionEvents.NewBootCoordinator, newBootCoordinator) auctionEvents.NewBootCoordinator = append(auctionEvents.NewBootCoordinator, newBootCoordinator)
case logNewOpenAuctionSlots: case logAuctionNewOpenAuctionSlots:
var newOpenAuctionSlots AuctionEventNewOpenAuctionSlots var newOpenAuctionSlots AuctionEventNewOpenAuctionSlots
if err := c.contractAbi.Unpack(&newOpenAuctionSlots, "NewOpenAuctionSlots", vLog.Data); err != nil { if err := c.contractAbi.Unpack(&newOpenAuctionSlots, "NewOpenAuctionSlots", vLog.Data); err != nil {
return nil, nil, err return nil, nil, err
} }
auctionEvents.NewOpenAuctionSlots = append(auctionEvents.NewOpenAuctionSlots, newOpenAuctionSlots) auctionEvents.NewOpenAuctionSlots = append(auctionEvents.NewOpenAuctionSlots, newOpenAuctionSlots)
case logNewAllocationRatio: case logAuctionNewAllocationRatio:
var newAllocationRatio AuctionEventNewAllocationRatio var newAllocationRatio AuctionEventNewAllocationRatio
if err := c.contractAbi.Unpack(&newAllocationRatio, "NewAllocationRatio", vLog.Data); err != nil { if err := c.contractAbi.Unpack(&newAllocationRatio, "NewAllocationRatio", vLog.Data); err != nil {
return nil, nil, err return nil, nil, err
} }
auctionEvents.NewAllocationRatio = append(auctionEvents.NewAllocationRatio, newAllocationRatio) auctionEvents.NewAllocationRatio = append(auctionEvents.NewAllocationRatio, newAllocationRatio)
case logNewCoordinator: case logAuctionSetCoordinator:
var newCoordinator AuctionEventNewCoordinator var setCoordinator AuctionEventSetCoordinator
if err := c.contractAbi.Unpack(&newCoordinator, "NewCoordinator", vLog.Data); err != nil { if err := c.contractAbi.Unpack(&setCoordinator, "SetCoordinator", vLog.Data); err != nil {
return nil, nil, err return nil, nil, err
} }
auctionEvents.NewCoordinator = append(auctionEvents.NewCoordinator, newCoordinator) setCoordinator.BidderAddress = ethCommon.BytesToAddress(vLog.Topics[1].Bytes())
case logCoordinatorUpdated: setCoordinator.ForgerAddress = ethCommon.BytesToAddress(vLog.Topics[2].Bytes())
var coordinatorUpdated AuctionEventCoordinatorUpdated auctionEvents.SetCoordinator = append(auctionEvents.SetCoordinator, setCoordinator)
if err := c.contractAbi.Unpack(&coordinatorUpdated, "CoordinatorUpdated", vLog.Data); err != nil { case logAuctionNewForgeAllocated:
return nil, nil, err
}
auctionEvents.CoordinatorUpdated = append(auctionEvents.CoordinatorUpdated, coordinatorUpdated)
case logNewForgeAllocated:
var newForgeAllocated AuctionEventNewForgeAllocated var newForgeAllocated AuctionEventNewForgeAllocated
if err := c.contractAbi.Unpack(&newForgeAllocated, "NewForgeAllocated", vLog.Data); err != nil { if err := c.contractAbi.Unpack(&newForgeAllocated, "NewForgeAllocated", vLog.Data); err != nil {
return nil, nil, err return nil, nil, err
} }
newForgeAllocated.Forger = ethCommon.BytesToAddress(vLog.Topics[1].Bytes()) newForgeAllocated.Bidder = ethCommon.BytesToAddress(vLog.Topics[1].Bytes())
newForgeAllocated.CurrentSlot = new(big.Int).SetBytes(vLog.Topics[2][:]).Int64() newForgeAllocated.Forger = ethCommon.BytesToAddress(vLog.Topics[2].Bytes())
newForgeAllocated.SlotToForge = new(big.Int).SetBytes(vLog.Topics[3][:]).Int64()
auctionEvents.NewForgeAllocated = append(auctionEvents.NewForgeAllocated, newForgeAllocated) auctionEvents.NewForgeAllocated = append(auctionEvents.NewForgeAllocated, newForgeAllocated)
case logNewDefaultSlotSetBid: case logAuctionNewDefaultSlotSetBid:
var auxNewDefaultSlotSetBid struct { var auxNewDefaultSlotSetBid struct {
SlotSet *big.Int SlotSet *big.Int
NewInitialMinBid *big.Int NewInitialMinBid *big.Int
@@ -1074,12 +1011,12 @@ func (c *AuctionClient) AuctionEventsByBlock(blockNum int64) (*AuctionEvents, *e
newDefaultSlotSetBid.NewInitialMinBid = auxNewDefaultSlotSetBid.NewInitialMinBid newDefaultSlotSetBid.NewInitialMinBid = auxNewDefaultSlotSetBid.NewInitialMinBid
newDefaultSlotSetBid.SlotSet = auxNewDefaultSlotSetBid.SlotSet.Int64() newDefaultSlotSetBid.SlotSet = auxNewDefaultSlotSetBid.SlotSet.Int64()
auctionEvents.NewDefaultSlotSetBid = append(auctionEvents.NewDefaultSlotSetBid, newDefaultSlotSetBid) auctionEvents.NewDefaultSlotSetBid = append(auctionEvents.NewDefaultSlotSetBid, newDefaultSlotSetBid)
case logNewForge: case logAuctionNewForge:
var newForge AuctionEventNewForge var newForge AuctionEventNewForge
newForge.Forger = ethCommon.BytesToAddress(vLog.Topics[1].Bytes()) newForge.Forger = ethCommon.BytesToAddress(vLog.Topics[1].Bytes())
newForge.CurrentSlot = new(big.Int).SetBytes(vLog.Topics[2][:]).Int64() newForge.SlotToForge = new(big.Int).SetBytes(vLog.Topics[2][:]).Int64()
auctionEvents.NewForge = append(auctionEvents.NewForge, newForge) auctionEvents.NewForge = append(auctionEvents.NewForge, newForge)
case logHEZClaimed: case logAuctionHEZClaimed:
var HEZClaimed AuctionEventHEZClaimed var HEZClaimed AuctionEventHEZClaimed
if err := c.contractAbi.Unpack(&HEZClaimed, "HEZClaimed", vLog.Data); err != nil { if err := c.contractAbi.Unpack(&HEZClaimed, "HEZClaimed", vLog.Data); err != nil {
return nil, nil, err return nil, nil, err

View File

@@ -16,10 +16,10 @@ const currentSlotConst = 0
var allocationRatioConst [3]uint16 = [3]uint16{4000, 4000, 2000} var allocationRatioConst [3]uint16 = [3]uint16{4000, 4000, 2000}
var auctionClient *AuctionClient var auctionClientTest *AuctionClient
//var genesisBlock = 91 //var genesisBlock = 93
var genesisBlock = 98 var genesisBlock = 100
var minBidStr = "10000000000000000000" var minBidStr = "10000000000000000000"
var URL = "http://localhost:3000" var URL = "http://localhost:3000"
@@ -27,7 +27,7 @@ var newURL = "http://localhost:3002"
var BLOCKSPERSLOT = uint8(40) var BLOCKSPERSLOT = uint8(40)
func TestAuctionGetCurrentSlotNumber(t *testing.T) { func TestAuctionGetCurrentSlotNumber(t *testing.T) {
currentSlot, err := auctionClient.AuctionGetCurrentSlotNumber() currentSlot, err := auctionClientTest.AuctionGetCurrentSlotNumber()
require.Nil(t, err) require.Nil(t, err)
currentSlotInt := int(currentSlot) currentSlotInt := int(currentSlot)
assert.Equal(t, currentSlotConst, currentSlotInt) assert.Equal(t, currentSlotConst, currentSlotInt)
@@ -37,13 +37,13 @@ func TestAuctionConstants(t *testing.T) {
INITMINBID := new(big.Int) INITMINBID := new(big.Int)
INITMINBID.SetString(minBidStr, 10) INITMINBID.SetString(minBidStr, 10)
auctionConstants, err := auctionClient.AuctionConstants() auctionConstants, err := auctionClientTest.AuctionConstants()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, auctionConstants.BlocksPerSlot, BLOCKSPERSLOT) assert.Equal(t, auctionConstants.BlocksPerSlot, BLOCKSPERSLOT)
// assert.Equal(t, auctionConstants.GenesisBlockNum, GENESISBLOCKNUM) assert.Equal(t, auctionConstants.GenesisBlockNum, int64(genesisBlock))
assert.Equal(t, auctionConstants.HermezRollup, hermezRollupAddressTestConst) assert.Equal(t, auctionConstants.HermezRollup, hermezRollupAddressTestConst)
assert.Equal(t, auctionConstants.InitialMinimalBidding, INITMINBID) assert.Equal(t, auctionConstants.InitialMinimalBidding, INITMINBID)
assert.Equal(t, auctionConstants.TokenHEZ, tokenHezAddressConst) assert.Equal(t, auctionConstants.TokenHEZ, tokenERC777AddressConst)
} }
func TestAuctionVariables(t *testing.T) { func TestAuctionVariables(t *testing.T) {
@@ -51,7 +51,7 @@ func TestAuctionVariables(t *testing.T) {
INITMINBID.SetString(minBidStr, 10) INITMINBID.SetString(minBidStr, 10)
defaultSlotSetBid := [6]*big.Int{INITMINBID, INITMINBID, INITMINBID, INITMINBID, INITMINBID, INITMINBID} defaultSlotSetBid := [6]*big.Int{INITMINBID, INITMINBID, INITMINBID, INITMINBID, INITMINBID, INITMINBID}
auctionVariables, err := auctionClient.AuctionVariables() auctionVariables, err := auctionClientTest.AuctionVariables()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, auctionVariables.AllocationRatio, allocationRatioConst) assert.Equal(t, auctionVariables.AllocationRatio, allocationRatioConst)
assert.Equal(t, auctionVariables.BootCoordinator, bootCoordinatorAddressConst) assert.Equal(t, auctionVariables.BootCoordinator, bootCoordinatorAddressConst)
@@ -64,7 +64,7 @@ func TestAuctionVariables(t *testing.T) {
} }
func TestAuctionGetSlotDeadline(t *testing.T) { func TestAuctionGetSlotDeadline(t *testing.T) {
slotDeadline, err := auctionClient.AuctionGetSlotDeadline() slotDeadline, err := auctionClientTest.AuctionGetSlotDeadline()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, slotDeadlineConst, slotDeadline) assert.Equal(t, slotDeadlineConst, slotDeadline)
} }
@@ -72,18 +72,18 @@ func TestAuctionGetSlotDeadline(t *testing.T) {
func TestAuctionSetSlotDeadline(t *testing.T) { func TestAuctionSetSlotDeadline(t *testing.T) {
newSlotDeadline := uint8(25) newSlotDeadline := uint8(25)
_, err := auctionClient.AuctionSetSlotDeadline(newSlotDeadline) _, err := auctionClientTest.AuctionSetSlotDeadline(newSlotDeadline)
require.Nil(t, err) require.Nil(t, err)
slotDeadline, err := auctionClient.AuctionGetSlotDeadline() slotDeadline, err := auctionClientTest.AuctionGetSlotDeadline()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, newSlotDeadline, slotDeadline) assert.Equal(t, newSlotDeadline, slotDeadline)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, newSlotDeadline, auctionEvents.NewSlotDeadline[0].NewSlotDeadline) assert.Equal(t, newSlotDeadline, auctionEvents.NewSlotDeadline[0].NewSlotDeadline)
} }
func TestAuctionGetOpenAuctionSlots(t *testing.T) { func TestAuctionGetOpenAuctionSlots(t *testing.T) {
openAuctionSlots, err := auctionClient.AuctionGetOpenAuctionSlots() openAuctionSlots, err := auctionClientTest.AuctionGetOpenAuctionSlots()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, openAuctionSlotsConst, openAuctionSlots) assert.Equal(t, openAuctionSlotsConst, openAuctionSlots)
} }
@@ -91,18 +91,18 @@ func TestAuctionGetOpenAuctionSlots(t *testing.T) {
func TestAuctionSetOpenAuctionSlots(t *testing.T) { func TestAuctionSetOpenAuctionSlots(t *testing.T) {
newOpenAuctionSlots := uint16(4500) newOpenAuctionSlots := uint16(4500)
_, err := auctionClient.AuctionSetOpenAuctionSlots(newOpenAuctionSlots) _, err := auctionClientTest.AuctionSetOpenAuctionSlots(newOpenAuctionSlots)
require.Nil(t, err) require.Nil(t, err)
openAuctionSlots, err := auctionClient.AuctionGetOpenAuctionSlots() openAuctionSlots, err := auctionClientTest.AuctionGetOpenAuctionSlots()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, newOpenAuctionSlots, openAuctionSlots) assert.Equal(t, newOpenAuctionSlots, openAuctionSlots)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, newOpenAuctionSlots, auctionEvents.NewOpenAuctionSlots[0].NewOpenAuctionSlots) assert.Equal(t, newOpenAuctionSlots, auctionEvents.NewOpenAuctionSlots[0].NewOpenAuctionSlots)
} }
func TestAuctionGetClosedAuctionSlots(t *testing.T) { func TestAuctionGetClosedAuctionSlots(t *testing.T) {
closedAuctionSlots, err := auctionClient.AuctionGetClosedAuctionSlots() closedAuctionSlots, err := auctionClientTest.AuctionGetClosedAuctionSlots()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, closedAuctionSlotsConst, closedAuctionSlots) assert.Equal(t, closedAuctionSlotsConst, closedAuctionSlots)
} }
@@ -110,20 +110,20 @@ func TestAuctionGetClosedAuctionSlots(t *testing.T) {
func TestAuctionSetClosedAuctionSlots(t *testing.T) { func TestAuctionSetClosedAuctionSlots(t *testing.T) {
newClosedAuctionSlots := uint16(1) newClosedAuctionSlots := uint16(1)
_, err := auctionClient.AuctionSetClosedAuctionSlots(newClosedAuctionSlots) _, err := auctionClientTest.AuctionSetClosedAuctionSlots(newClosedAuctionSlots)
require.Nil(t, err) require.Nil(t, err)
closedAuctionSlots, err := auctionClient.AuctionGetClosedAuctionSlots() closedAuctionSlots, err := auctionClientTest.AuctionGetClosedAuctionSlots()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, newClosedAuctionSlots, closedAuctionSlots) assert.Equal(t, newClosedAuctionSlots, closedAuctionSlots)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, newClosedAuctionSlots, auctionEvents.NewClosedAuctionSlots[0].NewClosedAuctionSlots) assert.Equal(t, newClosedAuctionSlots, auctionEvents.NewClosedAuctionSlots[0].NewClosedAuctionSlots)
_, err = auctionClient.AuctionSetClosedAuctionSlots(closedAuctionSlots) _, err = auctionClientTest.AuctionSetClosedAuctionSlots(closedAuctionSlots)
require.Nil(t, err) require.Nil(t, err)
} }
func TestAuctionGetOutbidding(t *testing.T) { func TestAuctionGetOutbidding(t *testing.T) {
outbidding, err := auctionClient.AuctionGetOutbidding() outbidding, err := auctionClientTest.AuctionGetOutbidding()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, outbiddingConst, outbidding) assert.Equal(t, outbiddingConst, outbidding)
} }
@@ -131,20 +131,20 @@ func TestAuctionGetOutbidding(t *testing.T) {
func TestAuctionSetOutbidding(t *testing.T) { func TestAuctionSetOutbidding(t *testing.T) {
newOutbidding := uint16(0xb) newOutbidding := uint16(0xb)
_, err := auctionClient.AuctionSetOutbidding(newOutbidding) _, err := auctionClientTest.AuctionSetOutbidding(newOutbidding)
require.Nil(t, err) require.Nil(t, err)
outbidding, err := auctionClient.AuctionGetOutbidding() outbidding, err := auctionClientTest.AuctionGetOutbidding()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, newOutbidding, outbidding) assert.Equal(t, newOutbidding, outbidding)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, newOutbidding, auctionEvents.NewOutbidding[0].NewOutbidding) assert.Equal(t, newOutbidding, auctionEvents.NewOutbidding[0].NewOutbidding)
_, err = auctionClient.AuctionSetOutbidding(outbiddingConst) _, err = auctionClientTest.AuctionSetOutbidding(outbiddingConst)
require.Nil(t, err) require.Nil(t, err)
} }
func TestAuctionGetAllocationRatio(t *testing.T) { func TestAuctionGetAllocationRatio(t *testing.T) {
allocationRatio, err := auctionClient.AuctionGetAllocationRatio() allocationRatio, err := auctionClientTest.AuctionGetAllocationRatio()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, allocationRatioConst, allocationRatio) assert.Equal(t, allocationRatioConst, allocationRatio)
} }
@@ -152,26 +152,26 @@ func TestAuctionGetAllocationRatio(t *testing.T) {
func TestAuctionSetAllocationRatio(t *testing.T) { func TestAuctionSetAllocationRatio(t *testing.T) {
newAllocationRatio := [3]uint16{3000, 3000, 4000} newAllocationRatio := [3]uint16{3000, 3000, 4000}
_, err := auctionClient.AuctionSetAllocationRatio(newAllocationRatio) _, err := auctionClientTest.AuctionSetAllocationRatio(newAllocationRatio)
require.Nil(t, err) require.Nil(t, err)
allocationRatio, err := auctionClient.AuctionGetAllocationRatio() allocationRatio, err := auctionClientTest.AuctionGetAllocationRatio()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, newAllocationRatio, allocationRatio) assert.Equal(t, newAllocationRatio, allocationRatio)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, newAllocationRatio, auctionEvents.NewAllocationRatio[0].NewAllocationRatio) assert.Equal(t, newAllocationRatio, auctionEvents.NewAllocationRatio[0].NewAllocationRatio)
_, err = auctionClient.AuctionSetAllocationRatio(allocationRatioConst) _, err = auctionClientTest.AuctionSetAllocationRatio(allocationRatioConst)
require.Nil(t, err) require.Nil(t, err)
} }
func TestAuctionGetDonationAddress(t *testing.T) { func TestAuctionGetDonationAddress(t *testing.T) {
donationAddress, err := auctionClient.AuctionGetDonationAddress() donationAddress, err := auctionClientTest.AuctionGetDonationAddress()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, &donationAddressConst, donationAddress) assert.Equal(t, &donationAddressConst, donationAddress)
} }
func TestAuctionGetBootCoordinator(t *testing.T) { func TestAuctionGetBootCoordinator(t *testing.T) {
bootCoordinator, err := auctionClient.AuctionGetBootCoordinator() bootCoordinator, err := auctionClientTest.AuctionGetBootCoordinator()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, &bootCoordinatorAddressConst, bootCoordinator) assert.Equal(t, &bootCoordinatorAddressConst, bootCoordinator)
} }
@@ -179,37 +179,37 @@ func TestAuctionGetBootCoordinator(t *testing.T) {
func TestAuctionSetDonationAddress(t *testing.T) { func TestAuctionSetDonationAddress(t *testing.T) {
newDonationAddress := governanceAddressConst newDonationAddress := governanceAddressConst
_, err := auctionClient.AuctionSetDonationAddress(newDonationAddress) _, err := auctionClientTest.AuctionSetDonationAddress(newDonationAddress)
require.Nil(t, err) require.Nil(t, err)
donationAddress, err := auctionClient.AuctionGetDonationAddress() donationAddress, err := auctionClientTest.AuctionGetDonationAddress()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, &newDonationAddress, donationAddress) assert.Equal(t, &newDonationAddress, donationAddress)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, newDonationAddress, auctionEvents.NewDonationAddress[0].NewDonationAddress) assert.Equal(t, newDonationAddress, auctionEvents.NewDonationAddress[0].NewDonationAddress)
_, err = auctionClient.AuctionSetDonationAddress(donationAddressConst) _, err = auctionClientTest.AuctionSetDonationAddress(donationAddressConst)
require.Nil(t, err) require.Nil(t, err)
} }
func TestAuctionSetBootCoordinator(t *testing.T) { func TestAuctionSetBootCoordinator(t *testing.T) {
newBootCoordinator := governanceAddressConst newBootCoordinator := governanceAddressConst
_, err := auctionClient.AuctionSetBootCoordinator(newBootCoordinator) _, err := auctionClientTest.AuctionSetBootCoordinator(newBootCoordinator)
require.Nil(t, err) require.Nil(t, err)
bootCoordinator, err := auctionClient.AuctionGetBootCoordinator() bootCoordinator, err := auctionClientTest.AuctionGetBootCoordinator()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, &newBootCoordinator, bootCoordinator) assert.Equal(t, &newBootCoordinator, bootCoordinator)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, newBootCoordinator, auctionEvents.NewBootCoordinator[0].NewBootCoordinator) assert.Equal(t, newBootCoordinator, auctionEvents.NewBootCoordinator[0].NewBootCoordinator)
_, err = auctionClient.AuctionSetBootCoordinator(bootCoordinatorAddressConst) _, err = auctionClientTest.AuctionSetBootCoordinator(bootCoordinatorAddressConst)
require.Nil(t, err) require.Nil(t, err)
} }
func TestAuctionGetSlotSet(t *testing.T) { func TestAuctionGetSlotSet(t *testing.T) {
slot := int64(10) slot := int64(10)
slotSet, err := auctionClient.AuctionGetSlotSet(slot) slotSet, err := auctionClientTest.AuctionGetSlotSet(slot)
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, slotSet, big.NewInt(4)) assert.Equal(t, slotSet, big.NewInt(4))
} }
@@ -217,7 +217,7 @@ func TestAuctionGetSlotSet(t *testing.T) {
func TestAuctionGetDefaultSlotSetBid(t *testing.T) { func TestAuctionGetDefaultSlotSetBid(t *testing.T) {
slotSet := uint8(3) slotSet := uint8(3)
minBid, err := auctionClient.AuctionGetDefaultSlotSetBid(slotSet) minBid, err := auctionClientTest.AuctionGetDefaultSlotSetBid(slotSet)
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, minBid.String(), minBidStr) assert.Equal(t, minBid.String(), minBidStr)
} }
@@ -228,81 +228,53 @@ func TestAuctionChangeDefaultSlotSetBid(t *testing.T) {
newInitialMinBid := new(big.Int) newInitialMinBid := new(big.Int)
newInitialMinBid.SetString("20000000000000000000", 10) newInitialMinBid.SetString("20000000000000000000", 10)
_, err := auctionClient.AuctionChangeDefaultSlotSetBid(slotSet, newInitialMinBid) _, err := auctionClientTest.AuctionChangeDefaultSlotSetBid(slotSet, newInitialMinBid)
require.Nil(t, err) require.Nil(t, err)
minBid, err := auctionClient.AuctionGetDefaultSlotSetBid(set) minBid, err := auctionClientTest.AuctionGetDefaultSlotSetBid(set)
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, minBid, newInitialMinBid) assert.Equal(t, minBid, newInitialMinBid)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, slotSet, auctionEvents.NewDefaultSlotSetBid[0].SlotSet) assert.Equal(t, slotSet, auctionEvents.NewDefaultSlotSetBid[0].SlotSet)
assert.Equal(t, newInitialMinBid, auctionEvents.NewDefaultSlotSetBid[0].NewInitialMinBid) assert.Equal(t, newInitialMinBid, auctionEvents.NewDefaultSlotSetBid[0].NewInitialMinBid)
newMinBid := new(big.Int) newMinBid := new(big.Int)
newMinBid.SetString("10000000000000000000", 10) newMinBid.SetString("10000000000000000000", 10)
_, err = auctionClient.AuctionChangeDefaultSlotSetBid(slotSet, newMinBid) _, err = auctionClientTest.AuctionChangeDefaultSlotSetBid(slotSet, newMinBid)
require.Nil(t, err) require.Nil(t, err)
} }
func TestAuctionGetClaimableHEZ(t *testing.T) { func TestAuctionGetClaimableHEZ(t *testing.T) {
forgerAddress := governanceAddressConst forgerAddress := governanceAddressConst
claimableHEZ, err := auctionClient.AuctionGetClaimableHEZ(forgerAddress) claimableHEZ, err := auctionClientTest.AuctionGetClaimableHEZ(forgerAddress)
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, claimableHEZ.Int64(), int64(0)) assert.Equal(t, claimableHEZ.Int64(), int64(0))
} }
func TestAuctionIsRegisteredCoordinator(t *testing.T) {
forgerAddress := governanceAddressConst
registered, err := auctionClient.AuctionIsRegisteredCoordinator(forgerAddress)
require.Nil(t, err)
assert.Equal(t, registered, false)
}
func TestAuctionRegisterCoordinator(t *testing.T) { func TestAuctionRegisterCoordinator(t *testing.T) {
forgerAddress := governanceAddressConst forgerAddress := governanceAddressConst
_, err := auctionClient.AuctionRegisterCoordinator(forgerAddress, URL) _, err := auctionClientTest.AuctionSetCoordinator(forgerAddress, URL)
require.Nil(t, err) require.Nil(t, err)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, forgerAddress, auctionEvents.NewCoordinator[0].ForgerAddress) assert.Equal(t, forgerAddress, auctionEvents.SetCoordinator[0].ForgerAddress)
assert.Equal(t, forgerAddress, auctionEvents.NewCoordinator[0].WithdrawalAddress) assert.Equal(t, forgerAddress, auctionEvents.SetCoordinator[0].BidderAddress)
assert.Equal(t, URL, auctionEvents.NewCoordinator[0].CoordinatorURL) assert.Equal(t, URL, auctionEvents.SetCoordinator[0].CoordinatorURL)
}
func TestAuctionIsRegisteredCoordinatorTrue(t *testing.T) {
forgerAddress := governanceAddressConst
registered, err := auctionClient.AuctionIsRegisteredCoordinator(forgerAddress)
require.Nil(t, err)
assert.Equal(t, registered, true)
}
func TestAuctionUpdateCoordinatorInfo(t *testing.T) {
forgerAddress := governanceAddressConst
_, err := auctionClient.AuctionUpdateCoordinatorInfo(forgerAddress, forgerAddress, newURL)
require.Nil(t, err)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, forgerAddress, auctionEvents.CoordinatorUpdated[0].ForgerAddress)
assert.Equal(t, forgerAddress, auctionEvents.CoordinatorUpdated[0].WithdrawalAddress)
assert.Equal(t, newURL, auctionEvents.CoordinatorUpdated[0].CoordinatorURL)
} }
func TestAuctionBid(t *testing.T) { func TestAuctionBid(t *testing.T) {
currentSlot, err := auctionClient.AuctionGetCurrentSlotNumber() currentSlot, err := auctionClientTest.AuctionGetCurrentSlotNumber()
require.Nil(t, err) require.Nil(t, err)
bidAmount := new(big.Int) bidAmount := new(big.Int)
bidAmount.SetString("12000000000000000000", 10) bidAmount.SetString("12000000000000000000", 10)
forgerAddress := governanceAddressConst forgerAddress := governanceAddressConst
_, err = auctionClient.AuctionBid(currentSlot+4, bidAmount, forgerAddress) _, err = auctionClientTest.AuctionBid(currentSlot+4, bidAmount)
require.Nil(t, err) require.Nil(t, err)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, bidAmount, auctionEvents.NewBid[0].BidAmount) assert.Equal(t, bidAmount, auctionEvents.NewBid[0].BidAmount)
assert.Equal(t, forgerAddress, auctionEvents.NewBid[0].CoordinatorForger) assert.Equal(t, forgerAddress, auctionEvents.NewBid[0].Bidder)
assert.Equal(t, currentSlot+4, auctionEvents.NewBid[0].Slot) assert.Equal(t, currentSlot+4, auctionEvents.NewBid[0].Slot)
} }
@@ -310,22 +282,22 @@ func TestAuctionGetSlotNumber(t *testing.T) {
slotConst := 4 slotConst := 4
blockNum := int(BLOCKSPERSLOT)*slotConst + genesisBlock blockNum := int(BLOCKSPERSLOT)*slotConst + genesisBlock
slot, err := auctionClient.AuctionGetSlotNumber(int64(blockNum)) slot, err := auctionClientTest.AuctionGetSlotNumber(int64(blockNum))
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, slot, big.NewInt(int64(slotConst))) assert.Equal(t, slot, int64(slotConst))
} }
func TestAuctionCanForge(t *testing.T) { func TestAuctionCanForge(t *testing.T) {
slotConst := 4 slotConst := 4
blockNum := int(BLOCKSPERSLOT)*slotConst + genesisBlock blockNum := int(BLOCKSPERSLOT)*slotConst + genesisBlock
canForge, err := auctionClient.AuctionCanForge(governanceAddressConst, int64(blockNum)) canForge, err := auctionClientTest.AuctionCanForge(governanceAddressConst, int64(blockNum))
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, canForge, true) assert.Equal(t, canForge, true)
} }
func TestAuctionMultiBid(t *testing.T) { func TestAuctionMultiBid(t *testing.T) {
currentSlot, err := auctionClient.AuctionGetCurrentSlotNumber() currentSlot, err := auctionClientTest.AuctionGetCurrentSlotNumber()
require.Nil(t, err) require.Nil(t, err)
slotSet := [6]bool{true, false, true, false, true, false} slotSet := [6]bool{true, false, true, false, true, false}
maxBid := new(big.Int) maxBid := new(big.Int)
@@ -335,17 +307,17 @@ func TestAuctionMultiBid(t *testing.T) {
budget := new(big.Int) budget := new(big.Int)
budget.SetString("45200000000000000000", 10) budget.SetString("45200000000000000000", 10)
forgerAddress := governanceAddressConst forgerAddress := governanceAddressConst
_, err = auctionClient.AuctionMultiBid(currentSlot+4, currentSlot+10, slotSet, maxBid, minBid, budget, forgerAddress) _, err = auctionClientTest.AuctionMultiBid(currentSlot+4, currentSlot+10, slotSet, maxBid, minBid, budget)
require.Nil(t, err) require.Nil(t, err)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, forgerAddress, auctionEvents.NewBid[0].CoordinatorForger) assert.Equal(t, forgerAddress, auctionEvents.NewBid[0].Bidder)
assert.Equal(t, currentSlot+4, auctionEvents.NewBid[0].Slot) assert.Equal(t, currentSlot+4, auctionEvents.NewBid[0].Slot)
assert.Equal(t, forgerAddress, auctionEvents.NewBid[1].CoordinatorForger) assert.Equal(t, forgerAddress, auctionEvents.NewBid[1].Bidder)
assert.Equal(t, currentSlot+6, auctionEvents.NewBid[1].Slot) assert.Equal(t, currentSlot+6, auctionEvents.NewBid[1].Slot)
assert.Equal(t, forgerAddress, auctionEvents.NewBid[2].CoordinatorForger) assert.Equal(t, forgerAddress, auctionEvents.NewBid[2].Bidder)
assert.Equal(t, currentSlot+8, auctionEvents.NewBid[2].Slot) assert.Equal(t, currentSlot+8, auctionEvents.NewBid[2].Slot)
assert.Equal(t, forgerAddress, auctionEvents.NewBid[3].CoordinatorForger) assert.Equal(t, forgerAddress, auctionEvents.NewBid[3].Bidder)
assert.Equal(t, currentSlot+10, auctionEvents.NewBid[3].Slot) assert.Equal(t, currentSlot+10, auctionEvents.NewBid[3].Slot)
} }
@@ -354,7 +326,7 @@ func TestAuctionGetClaimableHEZ2(t *testing.T) {
amount := new(big.Int) amount := new(big.Int)
amount.SetString("11000000000000000000", 10) amount.SetString("11000000000000000000", 10)
claimableHEZ, err := auctionClient.AuctionGetClaimableHEZ(forgerAddress) claimableHEZ, err := auctionClientTest.AuctionGetClaimableHEZ(forgerAddress)
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, claimableHEZ, amount) assert.Equal(t, claimableHEZ, amount)
} }
@@ -363,26 +335,26 @@ func TestAuctionClaimHEZ(t *testing.T) {
amount := new(big.Int) amount := new(big.Int)
amount.SetString("11000000000000000000", 10) amount.SetString("11000000000000000000", 10)
_, err := auctionClient.AuctionClaimHEZ(governanceAddressConst) _, err := auctionClientTest.AuctionClaimHEZ()
require.Nil(t, err) require.Nil(t, err)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
auctionEvents, _, _ := auctionClient.AuctionEventsByBlock(currentBlockNum) auctionEvents, _, _ := auctionClientTest.AuctionEventsByBlock(currentBlockNum)
assert.Equal(t, amount, auctionEvents.HEZClaimed[0].Amount) assert.Equal(t, amount, auctionEvents.HEZClaimed[0].Amount)
assert.Equal(t, governanceAddressConst, auctionEvents.HEZClaimed[0].Owner) assert.Equal(t, governanceAddressConst, auctionEvents.HEZClaimed[0].Owner)
} }
func TestAuctionForge(t *testing.T) { func TestAuctionForge(t *testing.T) {
auctionClientHermez, err := NewAuctionClient(ethereumClientHermez, auctionAddressConst, tokenHezAddressConst) auctionClientTestHermez, err := NewAuctionClient(ethereumClientHermez, auctionTestAddressConst, tokenERC777AddressConst)
require.Nil(t, err) require.Nil(t, err)
slotConst := 4 slotConst := 4
blockNum := int64(int(BLOCKSPERSLOT)*slotConst + genesisBlock) blockNum := int64(int(BLOCKSPERSLOT)*slotConst + genesisBlock)
currentBlockNum, _ := auctionClient.client.EthCurrentBlock() currentBlockNum, _ := auctionClientTest.client.EthCurrentBlock()
blocksToAdd := blockNum - currentBlockNum blocksToAdd := blockNum - currentBlockNum
addBlocks(blocksToAdd, ethClientDialURL) addBlocks(blocksToAdd, ethClientDialURL)
currentBlockNum, _ = auctionClient.client.EthCurrentBlock() currentBlockNum, _ = auctionClientTest.client.EthCurrentBlock()
assert.Equal(t, currentBlockNum, blockNum) assert.Equal(t, currentBlockNum, blockNum)
_, err = auctionClientHermez.AuctionForge(bootCoordinatorAddressConst) _, err = auctionClientTestHermez.AuctionForge(bootCoordinatorAddressConst)
require.Contains(t, err.Error(), "Can't forge") require.Contains(t, err.Error(), "Can't forge")
_, err = auctionClientHermez.AuctionForge(governanceAddressConst) _, err = auctionClientTestHermez.AuctionForge(governanceAddressConst)
require.Nil(t, err) require.Nil(t, err)
} }

View File

@@ -6,9 +6,10 @@ The go code of the contracts has been generated with the following command:
abigen --abi=WithdrawalDelayer.abi --bin=WithdrawalDelayer.bin --pkg=WithdrawalDelayer --out=WithdrawalDelayer.go abigen --abi=WithdrawalDelayer.abi --bin=WithdrawalDelayer.bin --pkg=WithdrawalDelayer --out=WithdrawalDelayer.go
abigen --abi=Hermez.abi --bin=Hermez.bin --pkg=Hermez --out=Hermez.go abigen --abi=Hermez.abi --bin=Hermez.bin --pkg=Hermez --out=Hermez.go
abigen --abi=HermezAuctionProtocol.abi --bin=HermezAuctionProtocol.bin --pkg=HermezAuctionProtocol --out=HermezAuctionProtocol.go abigen --abi=HermezAuctionProtocol.abi --bin=HermezAuctionProtocol.bin --pkg=HermezAuctionProtocol --out=HermezAuctionProtocol.go
abigen --abi=ERC777.abi --bin=ERC777.bin --pkg=ERC777 --out=ERC777.go
``` ```
You must compile the contracts to get the `.bin` and `.abi` files. The contracts used are in the repo: https://github.com/hermeznetwork/contracts-circuits You must compile the contracts to get the `.bin` and `.abi` files. The contracts used are in the repo: https://github.com/hermeznetwork/contracts
Specifically they have been processed in the commit with hash: `745e8d588496d7762d4084a54bafd4435061ae35` Specifically they have been processed in the commit with hash: `60e03e981f1ce607c27d405952bfc98de376f0c5`
> abigen version 1.9.21 > abigen version 1.9.21

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -25,20 +25,26 @@ var password = "pass"
// Smart Contract Addresses // Smart Contract Addresses
var ( var (
// auctionAddressStr = "0x3619DbE27d7c1e7E91aA738697Ae7Bc5FC3eACA5" auctionAddressStr = "0x500D1d6A4c7D8Ae28240b47c8FCde034D827fD5e"
// wdelayerAddressStr = "0x1A1FEe7EeD918BD762173e4dc5EfDB8a78C924A8"
auctionAddressStr = "0x8B5B7a6055E54a36fF574bbE40cf2eA68d5554b3"
auctionAddressConst = ethCommon.HexToAddress(auctionAddressStr) auctionAddressConst = ethCommon.HexToAddress(auctionAddressStr)
auctionTestAddressStr = "0x1d80315fac6aBd3EfeEbE97dEc44461ba7556160"
auctionTestAddressConst = ethCommon.HexToAddress(auctionTestAddressStr)
donationAddressStr = "0x6c365935CA8710200C7595F0a72EB6023A7706Cd" donationAddressStr = "0x6c365935CA8710200C7595F0a72EB6023A7706Cd"
donationAddressConst = ethCommon.HexToAddress(donationAddressStr) donationAddressConst = ethCommon.HexToAddress(donationAddressStr)
bootCoordinatorAddressStr = "0xc783df8a850f42e7f7e57013759c285caa701eb6" bootCoordinatorAddressStr = "0xc783df8a850f42e7f7e57013759c285caa701eb6"
bootCoordinatorAddressConst = ethCommon.HexToAddress(bootCoordinatorAddressStr) bootCoordinatorAddressConst = ethCommon.HexToAddress(bootCoordinatorAddressStr)
tokenHezAddressStr = "0xf4e77E5Da47AC3125140c470c71cBca77B5c638c" //nolint:gosec tokenERC777AddressStr = "0xf784709d2317D872237C4bC22f867d1BAe2913AB" //nolint:gosec
tokenHezAddressConst = ethCommon.HexToAddress(tokenHezAddressStr) tokenERC777AddressConst = ethCommon.HexToAddress(tokenERC777AddressStr)
hermezRollupAddressStr = "0xc4905364b78a742ccce7B890A89514061E47068D" tokenERC20AddressStr = "0x3619DbE27d7c1e7E91aA738697Ae7Bc5FC3eACA5"
tokenERC20AddressConst = ethCommon.HexToAddress(tokenERC20AddressStr)
hermezRollupAddressStr = "0xEcc0a6dbC0bb4D51E4F84A315a9e5B0438cAD4f0"
hermezRollupAddressConst = ethCommon.HexToAddress(hermezRollupAddressStr) hermezRollupAddressConst = ethCommon.HexToAddress(hermezRollupAddressStr)
wdelayerAddressStr = "0x20Ce94F404343aD2752A2D01b43fa407db9E0D00" wdelayerAddressStr = "0xD6C850aeBFDC46D7F4c207e445cC0d6B0919BDBe"
wdelayerAddressConst = ethCommon.HexToAddress(wdelayerAddressStr) wdelayerAddressConst = ethCommon.HexToAddress(wdelayerAddressStr)
wdelayerTestAddressStr = "0x52d3b94181f8654db2530b0fEe1B19173f519C52"
wdelayerTestAddressConst = ethCommon.HexToAddress(wdelayerTestAddressStr)
safetyAddressStr = "0xE5904695748fe4A84b40b3fc79De2277660BD1D3"
safetyAddressConst = ethCommon.HexToAddress(safetyAddressStr)
) )
// Ethereum Accounts // Ethereum Accounts
@@ -126,15 +132,22 @@ func TestMain(m *testing.M) {
// Controllable Governance Address // Controllable Governance Address
ethereumClientGov := NewEthereumClient(ethClient, accountGov, ks, nil) ethereumClientGov := NewEthereumClient(ethClient, accountGov, ks, nil)
auctionClient, err = NewAuctionClient(ethereumClientGov, auctionAddressConst, tokenHezAddressConst) auctionClientTest, err = NewAuctionClient(ethereumClientGov, auctionTestAddressConst, tokenERC777AddressConst)
if err != nil {
panic(err)
}
rollupClient, err = NewRollupClient(ethereumClientGov, hermezRollupAddressConst)
if err != nil { if err != nil {
panic(err) panic(err)
} }
rollupClient = NewRollupClient(ethereumClientGov, hermezRollupAddressConst)
wdelayerClient, err = NewWDelayerClient(ethereumClientGov, wdelayerAddressConst) wdelayerClient, err = NewWDelayerClient(ethereumClientGov, wdelayerAddressConst)
if err != nil { if err != nil {
panic(err) panic(err)
} }
wdelayerClientTest, err = NewWDelayerClient(ethereumClientGov, wdelayerTestAddressConst)
if err != nil {
panic(err)
}
ethereumClientKep = NewEthereumClient(ethClient, accountKep, ks, nil) ethereumClientKep = NewEthereumClient(ethClient, accountKep, ks, nil)
ethereumClientWhite = NewEthereumClient(ethClient, accountWhite, ks, nil) ethereumClientWhite = NewEthereumClient(ethClient, accountWhite, ks, nil)

View File

@@ -1,27 +1,103 @@
package eth package eth
import ( import (
"context"
"math/big" "math/big"
"strings"
Hermez "github.com/hermeznetwork/hermez-node/eth/contracts/hermez"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethclient"
ethCommon "github.com/ethereum/go-ethereum/common" ethCommon "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/hermeznetwork/hermez-node/common" "github.com/hermeznetwork/hermez-node/common"
Hermez "github.com/hermeznetwork/hermez-node/eth/contracts/hermez"
"github.com/hermeznetwork/hermez-node/log" "github.com/hermeznetwork/hermez-node/log"
"github.com/iden3/go-iden3-crypto/babyjub" "github.com/iden3/go-iden3-crypto/babyjub"
) )
const ( const (
// FeeIdxCoordinatorLen is the number of tokens the coordinator can use // RollupConstFeeIdxCoordinatorLen is the number of tokens the coordinator can use
// to collect fees (determines the number of tokens that the // to collect fees (determines the number of tokens that the
// coordinator can collect fees from). This value is determined by the // coordinator can collect fees from). This value is determined by the
// circuit. // circuit.
FeeIdxCoordinatorLen = 64 RollupConstFeeIdxCoordinatorLen = 64
// RollupConstReservedIDx First 256 indexes reserved, first user index will be the 256
RollupConstReservedIDx = 255
// RollupConstExitIDx IDX 1 is reserved for exits
RollupConstExitIDx = 1
// RollupConstLimitLoadAmount Max load amount allowed (loadAmount: L1 --> L2)
RollupConstLimitLoadAmount = (1 << 128)
// RollupConstLimitL2TransferAmount Max amount allowed (amount L2 --> L2)
RollupConstLimitL2TransferAmount = (1 << 192)
// RollupConstLimitTokens Max number of tokens allowed to be registered inside the rollup
RollupConstLimitTokens = (1 << 32)
// RollupConstL1CoordinatorTotalBytes [4 bytes] token + [32 bytes] babyjub + [65 bytes] compressedSignature
RollupConstL1CoordinatorTotalBytes = 101
// RollupConstL1UserTotalBytes [20 bytes] fromEthAddr + [32 bytes] fromBjj-compressed + [6 bytes] fromIdx +
// [2 bytes] loadAmountFloat16 + [2 bytes] amountFloat16 + [4 bytes] tokenId + [6 bytes] toIdx
RollupConstL1UserTotalBytes = 72
// RollupConstMaxL1UserTX Maximum L1-user transactions allowed to be queued in a batch
RollupConstMaxL1UserTX = 128
// RollupConstMaxL1TX Maximum L1 transactions allowed to be queued in a batch
RollupConstMaxL1TX = 256
// RollupConstRfield Modulus zkSNARK
RollupConstRfield = 21888242871839275222246405745257275088548364400416034343698204186575808495617
// RollupConstInputSHAConstantBytes [6 bytes] lastIdx + [6 bytes] newLastIdx + [32 bytes] stateRoot + [32 bytes] newStRoot + [32 bytes] newExitRoot +
// [_MAX_L1_TX * _L1_USER_TOTALBYTES bytes] l1TxsData + totalL2TxsDataLength + feeIdxCoordinatorLength + [2 bytes] chainID =
// 18542 bytes + totalL2TxsDataLength + feeIdxCoordinatorLength
RollupConstInputSHAConstantBytes = 18542
// RollupConstNumBuckets Number of buckets
RollupConstNumBuckets = 5
// RollupConstMaxWithdrawalDelay max withdrawal delay in seconds
RollupConstMaxWithdrawalDelay = 2 * 7 * 24 * 60 * 60
// RollupConstExchangeMultiplier exchange multiplier
RollupConstExchangeMultiplier = 1e14
// LenVerifiers number of Rollup Smart Contract Verifiers
LenVerifiers = 1
)
var (
// RollupConstEthAddressInternalOnly This ethereum address is used internally for rollup accounts that don't have ethereum address, only Babyjubjub
// This non-ethereum accounts can be created by the coordinator and allow users to have a rollup
// account without needing an ethereum address
RollupConstEthAddressInternalOnly = ethCommon.HexToAddress("0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF")
// RollupConstERC1820 ERC1820Registry address
RollupConstERC1820 = ethCommon.HexToAddress("0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24")
// ERC777 tokens signatures
// RollupConstRecipientInterfaceHash ERC777 recipient interface hash
RollupConstRecipientInterfaceHash = crypto.Keccak256([]byte("ERC777TokensRecipient"))
// RollupConstPerformL1UserTXSignature the signature of the function that can be called thru an ERC777 `send`
RollupConstPerformL1UserTXSignature = crypto.Keccak256([]byte("addL1Transaction(uint256,uint48,uint16,uint16,uint32,uint48)"))
// RollupConstAddTokenSignature the signature of the function that can be called thru an ERC777 `send`
RollupConstAddTokenSignature = crypto.Keccak256([]byte("addToken(address)"))
// RollupConstSendSignature ERC777 Signature
RollupConstSendSignature = crypto.Keccak256([]byte("send(address,uint256,bytes)"))
// RollupConstERC777Granularity ERC777 Signature
RollupConstERC777Granularity = crypto.Keccak256([]byte("granularity()"))
// RollupConstWithdrawalDelayerDeposit This constant are used to deposit tokens from ERC77 tokens into withdrawal delayer
RollupConstWithdrawalDelayerDeposit = crypto.Keccak256([]byte("deposit(address,address,uint192)"))
// ERC20 signature
// RollupConstTransferSignature This constant is used in the _safeTransfer internal method in order to safe GAS.
RollupConstTransferSignature = crypto.Keccak256([]byte("transfer(address,uint256)"))
// RollupConstTransferFromSignature This constant is used in the _safeTransfer internal method in order to safe GAS.
RollupConstTransferFromSignature = crypto.Keccak256([]byte("transferFrom(address,address,uint256)"))
// RollupConstApproveSignature This constant is used in the _safeTransfer internal method in order to safe GAS.
RollupConstApproveSignature = crypto.Keccak256([]byte("approve(address,uint256)"))
// RollupConstERC20Signature ERC20 decimals signature
RollupConstERC20Signature = crypto.Keccak256([]byte("decimals()"))
) )
// RollupConstants are the constants of the Rollup Smart Contract // RollupConstants are the constants of the Rollup Smart Contract
type RollupConstants struct { /* type RollupConstants struct {
// Maxim Deposit allowed // Maxim Deposit allowed
MaxAmountDeposit *big.Int MaxAmountDeposit *big.Int
MaxAmountL2 *big.Int MaxAmountL2 *big.Int
@@ -50,12 +126,24 @@ type RollupConstants struct {
NoLimitToken int NoLimitToken int
NumBuckets int NumBuckets int
MaxWDelay int64 MaxWDelay int64
}*/
// RollupPublicConstants are the constants of the Rollup Smart Contract
type RollupPublicConstants struct {
AbsoluteMaxL1L2BatchTimeout uint8
TokenHEZ ethCommon.Address
Verifiers []RollupVerifierStruct
HermezAuctionContract ethCommon.Address
HermezGovernanceDAOAddress ethCommon.Address
SafetyAddress ethCommon.Address
WithdrawDelayerContract ethCommon.Address
} }
// RollupVariables are the variables of the Rollup Smart Contract // RollupVariables are the variables of the Rollup Smart Contract
type RollupVariables struct { type RollupVariables struct {
FeeAddToken *big.Int FeeAddToken *big.Int
ForgeL1Timeout int64 ForgeL1L2BatchTimeout int64
WithdrawalDelay uint64
} }
// QueueStruct is the queue of L1Txs for a batch // QueueStruct is the queue of L1Txs for a batch
@@ -73,6 +161,12 @@ func NewQueueStruct() *QueueStruct {
} }
} }
// RollupVerifierStruct is the information about verifiers of the Rollup Smart Contract
type RollupVerifierStruct struct {
MaxTx *big.Int
NLevels *big.Int
}
// RollupState represents the state of the Rollup in the Smart Contract // RollupState represents the state of the Rollup in the Smart Contract
//nolint:structcheck,unused //nolint:structcheck,unused
type RollupState struct { type RollupState struct {
@@ -90,9 +184,16 @@ type RollupState struct {
// RollupEventL1UserTx is an event of the Rollup Smart Contract // RollupEventL1UserTx is an event of the Rollup Smart Contract
type RollupEventL1UserTx struct { type RollupEventL1UserTx struct {
ToForgeL1TxsNum uint64 // QueueIndex *big.Int
Position uint8 // TransactionIndex *big.Int
L1Tx common.L1Tx L1Tx common.L1Tx
ToForgeL1TxsNum int64 // QueueIndex *big.Int }
Position int // TransactionIndex *big.Int
// RollupEventL1UserTxAux is an event of the Rollup Smart Contract
type RollupEventL1UserTxAux struct {
ToForgeL1TxsNum uint64 // QueueIndex *big.Int
Position uint8 // TransactionIndex *big.Int
L1Tx []byte
} }
// RollupEventAddToken is an event of the Rollup Smart Contract // RollupEventAddToken is an event of the Rollup Smart Contract
@@ -109,7 +210,7 @@ type RollupEventForgeBatch struct {
// RollupEventUpdateForgeL1L2BatchTimeout is an event of the Rollup Smart Contract // RollupEventUpdateForgeL1L2BatchTimeout is an event of the Rollup Smart Contract
type RollupEventUpdateForgeL1L2BatchTimeout struct { type RollupEventUpdateForgeL1L2BatchTimeout struct {
ForgeL1Timeout *big.Int ForgeL1L2BatchTimeout uint8
} }
// RollupEventUpdateFeeAddToken is an event of the Rollup Smart Contract // RollupEventUpdateFeeAddToken is an event of the Rollup Smart Contract
@@ -119,8 +220,8 @@ type RollupEventUpdateFeeAddToken struct {
// RollupEventWithdrawEvent is an event of the Rollup Smart Contract // RollupEventWithdrawEvent is an event of the Rollup Smart Contract
type RollupEventWithdrawEvent struct { type RollupEventWithdrawEvent struct {
Idx *big.Int Idx uint64
NumExitRoot *big.Int NumExitRoot uint64
InstantWithdraw bool InstantWithdraw bool
} }
@@ -149,19 +250,35 @@ func NewRollupEvents() RollupEvents {
// RollupForgeBatchArgs are the arguments to the ForgeBatch function in the Rollup Smart Contract // RollupForgeBatchArgs are the arguments to the ForgeBatch function in the Rollup Smart Contract
//nolint:structcheck,unused //nolint:structcheck,unused
type RollupForgeBatchArgs struct { type RollupForgeBatchArgs struct {
ProofA [2]*big.Int NewLastIdx uint64
ProofB [2][2]*big.Int
ProofC [2]*big.Int
NewLastIdx int64
NewStRoot *big.Int NewStRoot *big.Int
NewExitRoot *big.Int NewExitRoot *big.Int
L1CoordinatorTxs []*common.L1Tx L1CoordinatorTxs []*common.L1Tx
L1CoordinatorTxsAuths [][]byte // Authorization for accountCreations for each L1CoordinatorTxs L2TxsData []*common.L2Tx
L2Txs []*common.L2Tx
FeeIdxCoordinator []common.Idx FeeIdxCoordinator []common.Idx
// Circuit selector // Circuit selector
VerifierIdx int64 VerifierIdx uint8
L1Batch bool L1Batch bool
ProofA [2]*big.Int
ProofB [2][2]*big.Int
ProofC [2]*big.Int
}
// RollupForgeBatchArgsAux are the arguments to the ForgeBatch function in the Rollup Smart Contract
//nolint:structcheck,unused
type RollupForgeBatchArgsAux struct {
NewLastIdx uint64
NewStRoot *big.Int
NewExitRoot *big.Int
L1CoordinatorTxs []byte
L2TxsData []byte
FeeIdxCoordinator []byte
// Circuit selector
VerifierIdx uint8
L1Batch bool
ProofA [2]*big.Int
ProofB [2][2]*big.Int
ProofC [2]*big.Int
} }
// RollupInterface is the inteface to to Rollup Smart Contract // RollupInterface is the inteface to to Rollup Smart Contract
@@ -201,7 +318,7 @@ type RollupInterface interface {
// Smart Contract Status // Smart Contract Status
// //
RollupConstants() (*RollupConstants, error) RollupConstants() (*RollupPublicConstants, error)
RollupEventsByBlock(blockNum int64) (*RollupEvents, *ethCommon.Hash, error) RollupEventsByBlock(blockNum int64) (*RollupEvents, *ethCommon.Hash, error)
RollupForgeBatchArgs(ethCommon.Hash) (*RollupForgeBatchArgs, error) RollupForgeBatchArgs(ethCommon.Hash) (*RollupForgeBatchArgs, error)
} }
@@ -214,14 +331,20 @@ type RollupInterface interface {
type RollupClient struct { type RollupClient struct {
client *EthereumClient client *EthereumClient
address ethCommon.Address address ethCommon.Address
contractAbi abi.ABI
} }
// NewRollupClient creates a new RollupClient // NewRollupClient creates a new RollupClient
func NewRollupClient(client *EthereumClient, address ethCommon.Address) *RollupClient { func NewRollupClient(client *EthereumClient, address ethCommon.Address) (*RollupClient, error) {
contractAbi, err := abi.JSON(strings.NewReader(string(Hermez.HermezABI)))
if err != nil {
return nil, err
}
return &RollupClient{ return &RollupClient{
client: client, client: client,
address: address, address: address,
} contractAbi: contractAbi,
}, nil
} }
// RollupForgeBatch is the interface to call the smart contract function // RollupForgeBatch is the interface to call the smart contract function
@@ -323,99 +446,205 @@ func (c *RollupClient) RollupUpdateFeeAddToken(newFeeAddToken *big.Int) (*types.
} }
// RollupConstants returns the Constants of the Rollup Smart Contract // RollupConstants returns the Constants of the Rollup Smart Contract
func (c *RollupClient) RollupConstants() (*RollupConstants, error) { func (c *RollupClient) RollupConstants() (*RollupPublicConstants, error) {
rollupConstants := new(RollupConstants) rollupConstants := new(RollupPublicConstants)
if err := c.client.Call(func(ec *ethclient.Client) error { if err := c.client.Call(func(ec *ethclient.Client) error {
rollup, err := Hermez.NewHermez(c.address, ec) hermez, err := Hermez.NewHermez(c.address, ec)
if err != nil { if err != nil {
return err return err
} }
// rollupConstants.GovernanceAddress := rollupConstants.AbsoluteMaxL1L2BatchTimeout, err = hermez.ABSOLUTEMAXL1L2BATCHTIMEOUT(nil)
l1CoordinatorBytes, err := rollup.L1COORDINATORBYTES(nil)
if err != nil { if err != nil {
return err return err
} }
rollupConstants.L1CoordinatorBytes = int(l1CoordinatorBytes.Int64()) rollupConstants.TokenHEZ, err = hermez.TokenHEZ(nil)
l1UserBytes, err := rollup.L1USERBYTES(nil)
if err != nil { if err != nil {
return err return err
} }
rollupConstants.L1UserBytes = int(l1UserBytes.Int64()) for i := int64(0); i < int64(LenVerifiers); i++ {
l2Bytes, err := rollup.L2BYTES(nil) newRollupVerifier := new(RollupVerifierStruct)
rollupVerifier, err := hermez.RollupVerifiers(nil, big.NewInt(i))
if err != nil { if err != nil {
return err return err
} }
rollupConstants.L2Bytes = int(l2Bytes.Int64()) newRollupVerifier.MaxTx = rollupVerifier.MaxTx
rollupConstants.LastIDx, err = rollup.LASTIDX(nil) newRollupVerifier.NLevels = rollupVerifier.NLevels
rollupConstants.Verifiers = append(rollupConstants.Verifiers, *newRollupVerifier)
}
rollupConstants.HermezAuctionContract, err = hermez.HermezAuctionContract(nil)
if err != nil { if err != nil {
return err return err
} }
rollupConstants.MaxAmountDeposit, err = rollup.MAXLOADAMOUNT(nil) rollupConstants.HermezGovernanceDAOAddress, err = hermez.HermezGovernanceDAOAddress(nil)
if err != nil { if err != nil {
return err return err
} }
rollupConstants.MaxAmountL2, err = rollup.MAXAMOUNT(nil) rollupConstants.SafetyAddress, err = hermez.SafetyAddress(nil)
if err != nil { if err != nil {
return err return err
} }
maxL1Tx, err := rollup.MAXL1TX(nil) rollupConstants.WithdrawDelayerContract, err = hermez.WithdrawDelayerContract(nil)
if err != nil {
return err return err
}
rollupConstants.MaxL1Tx = int(maxL1Tx.Int64())
maxL1UserTx, err := rollup.MAXL1USERTX(nil)
if err != nil {
return err
}
rollupConstants.MaxL1UserTx = int(maxL1UserTx.Int64())
maxTokens, err := rollup.MAXTOKENS(nil)
if err != nil {
return err
}
rollupConstants.MaxTokens = maxTokens.Int64()
maxWDelay, err := rollup.MAXWITHDRAWALDELAY(nil)
if err != nil {
return err
}
rollupConstants.MaxWDelay = maxWDelay.Int64()
noLimitToken, err := rollup.NOLIMIT(nil)
if err != nil {
return err
}
rollupConstants.NoLimitToken = int(noLimitToken.Int64())
numBuckets, err := rollup.NUMBUCKETS(nil)
if err != nil {
return err
}
rollupConstants.NumBuckets = int(numBuckets.Int64())
// rollupConstants.ReservedIDx =
rollupConstants.Rfield, err = rollup.RFIELD(nil)
if err != nil {
return err
}
// rollupConstants.SafetyBot =
// rollupConstants.TokenHEZ =
// rollupConstants.WithdrawalContract =
return nil
}); err != nil { }); err != nil {
return nil, err return nil, err
} }
return rollupConstants, nil return rollupConstants, nil
} }
var (
logHermezL1UserTXEvent = crypto.Keccak256Hash([]byte("L1UserTxEvent(uint64,uint8,bytes)"))
logHermezAddToken = crypto.Keccak256Hash([]byte("AddToken(address,uint32)"))
logHermezForgeBatch = crypto.Keccak256Hash([]byte("ForgeBatch(uint64)"))
logHermezUpdateForgeL1L2BatchTimeout = crypto.Keccak256Hash([]byte("UpdateForgeL1L2BatchTimeout(uint8)"))
logHermezUpdateFeeAddToken = crypto.Keccak256Hash([]byte("UpdateFeeAddToken(uint256)"))
logHermezWithdrawEvent = crypto.Keccak256Hash([]byte("WithdrawEvent(uint48,uint48,bool)"))
)
// RollupEventsByBlock returns the events in a block that happened in the Rollup Smart Contract // RollupEventsByBlock returns the events in a block that happened in the Rollup Smart Contract
func (c *RollupClient) RollupEventsByBlock(blockNum int64) (*RollupEvents, *ethCommon.Hash, error) { func (c *RollupClient) RollupEventsByBlock(blockNum int64) (*RollupEvents, *ethCommon.Hash, error) {
log.Error("TODO") var rollupEvents RollupEvents
return nil, nil, errTODO var blockHash ethCommon.Hash
query := ethereum.FilterQuery{
FromBlock: big.NewInt(blockNum),
ToBlock: big.NewInt(blockNum),
Addresses: []ethCommon.Address{
c.address,
},
BlockHash: nil,
Topics: [][]ethCommon.Hash{},
}
logs, err := c.client.client.FilterLogs(context.Background(), query)
if err != nil {
return nil, nil, err
}
if len(logs) > 0 {
blockHash = logs[0].BlockHash
}
for _, vLog := range logs {
if vLog.BlockHash != blockHash {
return nil, nil, ErrBlockHashMismatchEvent
}
switch vLog.Topics[0] {
case logHermezL1UserTXEvent:
var L1UserTxAux RollupEventL1UserTxAux
var L1UserTx RollupEventL1UserTx
err := c.contractAbi.Unpack(&L1UserTxAux, "L1UserTxEvent", vLog.Data)
if err != nil {
return nil, nil, err
}
L1Tx, err := common.L1TxFromBytes(L1UserTxAux.L1Tx)
if err != nil {
return nil, nil, err
}
L1UserTx.ToForgeL1TxsNum = new(big.Int).SetBytes(vLog.Topics[1][:]).Uint64()
L1UserTx.Position = uint8(new(big.Int).SetBytes(vLog.Topics[2][:]).Uint64())
L1UserTx.L1Tx = *L1Tx
rollupEvents.L1UserTx = append(rollupEvents.L1UserTx, L1UserTx)
case logHermezAddToken:
var addToken RollupEventAddToken
err := c.contractAbi.Unpack(&addToken, "AddToken", vLog.Data)
if err != nil {
return nil, nil, err
}
addToken.Address = ethCommon.BytesToAddress(vLog.Topics[1].Bytes())
rollupEvents.AddToken = append(rollupEvents.AddToken, addToken)
case logHermezForgeBatch:
var forgeBatch RollupEventForgeBatch
forgeBatch.BatchNum = new(big.Int).SetBytes(vLog.Topics[1][:]).Int64()
rollupEvents.ForgeBatch = append(rollupEvents.ForgeBatch, forgeBatch)
case logHermezUpdateForgeL1L2BatchTimeout:
var updateForgeL1L2BatchTimeout RollupEventUpdateForgeL1L2BatchTimeout
err := c.contractAbi.Unpack(&updateForgeL1L2BatchTimeout, "UpdateForgeL1L2BatchTimeout", vLog.Data)
if err != nil {
return nil, nil, err
}
rollupEvents.UpdateForgeL1L2BatchTimeout = append(rollupEvents.UpdateForgeL1L2BatchTimeout, updateForgeL1L2BatchTimeout)
case logHermezUpdateFeeAddToken:
var updateFeeAddToken RollupEventUpdateFeeAddToken
err := c.contractAbi.Unpack(&updateFeeAddToken, "UpdateFeeAddToken", vLog.Data)
if err != nil {
return nil, nil, err
}
rollupEvents.UpdateFeeAddToken = append(rollupEvents.UpdateFeeAddToken, updateFeeAddToken)
case logHermezWithdrawEvent:
var withdraw RollupEventWithdrawEvent
err := c.contractAbi.Unpack(&withdraw, "WithdrawEvent", vLog.Data)
if err != nil {
return nil, nil, err
}
withdraw.Idx = new(big.Int).SetBytes(vLog.Topics[1][:]).Uint64()
withdraw.NumExitRoot = new(big.Int).SetBytes(vLog.Topics[2][:]).Uint64()
rollupEvents.WithdrawEvent = append(rollupEvents.WithdrawEvent, withdraw)
}
}
return &rollupEvents, &blockHash, nil
} }
// RollupForgeBatchArgs returns the arguments used in a ForgeBatch call in the Rollup Smart Contract in the given transaction // 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) { func (c *RollupClient) RollupForgeBatchArgs(ethTxHash ethCommon.Hash) (*RollupForgeBatchArgs, error) {
tx, _, err := c.client.client.TransactionByHash(context.Background(), ethTxHash)
if err != nil {
return nil, err
}
txData := tx.Data()
method, err := c.contractAbi.MethodById(txData)
if err != nil {
return nil, err
}
aux := new(RollupForgeBatchArgsAux)
method.Inputs.Unpack(aux, txData)
rollupForgeBatchArgs := new(RollupForgeBatchArgs)
rollupForgeBatchArgs.L1Batch = aux.L1Batch
rollupForgeBatchArgs.NewExitRoot = aux.NewExitRoot
rollupForgeBatchArgs.NewLastIdx = aux.NewLastIdx
rollupForgeBatchArgs.NewStRoot = aux.NewStRoot
rollupForgeBatchArgs.ProofA = aux.ProofA
rollupForgeBatchArgs.ProofB = aux.ProofB
rollupForgeBatchArgs.ProofC = aux.ProofC
rollupForgeBatchArgs.VerifierIdx = aux.VerifierIdx
numTxsL1 := len(aux.L1CoordinatorTxs) / common.L1TxBytesLen
for i := 0; i < numTxsL1; i++ {
L1Tx, err := common.L1TxFromCoordinatorBytes(aux.L1CoordinatorTxs[i*common.L1CoordinatorTxBytesLen : (i+1)*common.L1CoordinatorTxBytesLen])
if err != nil {
return nil, err
}
rollupForgeBatchArgs.L1CoordinatorTxs = append(rollupForgeBatchArgs.L1CoordinatorTxs, L1Tx)
}
rollupConsts, err := c.RollupConstants()
if err != nil {
return nil, err
}
nLevels := rollupConsts.Verifiers[rollupForgeBatchArgs.VerifierIdx].NLevels.Int64()
lenL2TxsBytes := int((nLevels/8)*2 + 2 + 1)
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
}
rollupForgeBatchArgs.L2TxsData = append(rollupForgeBatchArgs.L2TxsData, L2Tx)
}
lenFeeIdxCoordinatorBytes := int(nLevels / 8)
numFeeIdxCoordinator := len(aux.FeeIdxCoordinator) / lenFeeIdxCoordinatorBytes
for i := 0; i < numFeeIdxCoordinator; i++ {
var paddedFeeIdx [6]byte
if lenFeeIdxCoordinatorBytes < common.IdxBytesLen {
copy(paddedFeeIdx[6-lenFeeIdxCoordinatorBytes:], aux.FeeIdxCoordinator[i*lenFeeIdxCoordinatorBytes:(i+1)*lenFeeIdxCoordinatorBytes])
} else {
copy(paddedFeeIdx[:], aux.FeeIdxCoordinator[i*lenFeeIdxCoordinatorBytes:(i+1)*lenFeeIdxCoordinatorBytes])
}
FeeIdxCoordinator, err := common.IdxFromBytes(paddedFeeIdx[:])
if err != nil {
return nil, err
}
rollupForgeBatchArgs.FeeIdxCoordinator = append(rollupForgeBatchArgs.FeeIdxCoordinator, FeeIdxCoordinator)
}
return rollupForgeBatchArgs, nil
// tx := client.TransactionByHash(ethTxHash) -> types.Transaction // tx := client.TransactionByHash(ethTxHash) -> types.Transaction
// txData := types.Transaction -> Data() // txData := types.Transaction -> Data()
// m := abi.MethodById(txData) -> Method // m := abi.MethodById(txData) -> Method
// m.Inputs.Unpack(txData) -> Args // m.Inputs.Unpack(txData) -> Args
// client.TransactionReceipt()? // client.TransactionReceipt()?
log.Error("TODO")
return nil, errTODO
} }

View File

@@ -1,16 +1,28 @@
package eth package eth
import ( import (
"math/big"
"testing" "testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
var rollupClient *RollupClient var rollupClient *RollupClient
var absoluteMaxL1L2BatchTimeout = uint8(240)
var maxTx = big.NewInt(512)
var nLevels = big.NewInt(32)
func TestRollupConstants(t *testing.T) { func TestRollupConstants(t *testing.T) {
if rollupClient != nil { rollupConstants, err := rollupClient.RollupConstants()
_, err := rollupClient.RollupConstants()
require.Nil(t, err) require.Nil(t, err)
} assert.Equal(t, absoluteMaxL1L2BatchTimeout, rollupConstants.AbsoluteMaxL1L2BatchTimeout)
assert.Equal(t, auctionAddressConst, rollupConstants.HermezAuctionContract)
assert.Equal(t, tokenERC777AddressConst, rollupConstants.TokenHEZ)
assert.Equal(t, maxTx, rollupConstants.Verifiers[0].MaxTx)
assert.Equal(t, nLevels, rollupConstants.Verifiers[0].NLevels)
assert.Equal(t, governanceAddressConst, rollupConstants.HermezGovernanceDAOAddress)
assert.Equal(t, safetyAddressConst, rollupConstants.SafetyAddress)
assert.Equal(t, wdelayerAddressConst, rollupConstants.WithdrawDelayerContract)
} }

View File

@@ -61,6 +61,7 @@ type WDelayerEventEscapeHatchWithdrawal struct {
Who ethCommon.Address Who ethCommon.Address
To ethCommon.Address To ethCommon.Address
Token ethCommon.Address Token ethCommon.Address
Amount *big.Int
} }
// WDelayerEventNewHermezKeeperAddress an event of the WithdrawalDelayer Smart Contract // WDelayerEventNewHermezKeeperAddress an event of the WithdrawalDelayer Smart Contract
@@ -124,7 +125,7 @@ type WDelayerInterface interface {
WDelayerDepositInfo(owner, token ethCommon.Address) (*big.Int, uint64) WDelayerDepositInfo(owner, token ethCommon.Address) (*big.Int, uint64)
WDelayerDeposit(onwer, token ethCommon.Address, amount *big.Int) (*types.Transaction, error) WDelayerDeposit(onwer, token ethCommon.Address, amount *big.Int) (*types.Transaction, error)
WDelayerWithdrawal(owner, token ethCommon.Address) (*types.Transaction, error) WDelayerWithdrawal(owner, token ethCommon.Address) (*types.Transaction, error)
WDelayerEscapeHatchWithdrawal(to, token ethCommon.Address) (*types.Transaction, error) WDelayerEscapeHatchWithdrawal(to, token ethCommon.Address, amount *big.Int) (*types.Transaction, error)
} }
// //
@@ -401,7 +402,7 @@ func (c *WDelayerClient) WDelayerWithdrawal(owner, token ethCommon.Address) (*ty
} }
// WDelayerEscapeHatchWithdrawal is the interface to call the smart contract function // WDelayerEscapeHatchWithdrawal is the interface to call the smart contract function
func (c *WDelayerClient) WDelayerEscapeHatchWithdrawal(to, token ethCommon.Address) (*types.Transaction, error) { func (c *WDelayerClient) WDelayerEscapeHatchWithdrawal(to, token ethCommon.Address, amount *big.Int) (*types.Transaction, error) {
var tx *types.Transaction var tx *types.Transaction
var err error var err error
if tx, err = c.client.CallAuth( if tx, err = c.client.CallAuth(
@@ -411,7 +412,7 @@ func (c *WDelayerClient) WDelayerEscapeHatchWithdrawal(to, token ethCommon.Addre
if err != nil { if err != nil {
return nil, err return nil, err
} }
return wdelayer.EscapeHatchWithdrawal(auth, to, token) return wdelayer.EscapeHatchWithdrawal(auth, to, token, amount)
}, },
); err != nil { ); err != nil {
return nil, fmt.Errorf("Failed escapeHatchWithdrawal: %w", err) return nil, fmt.Errorf("Failed escapeHatchWithdrawal: %w", err)
@@ -420,14 +421,14 @@ func (c *WDelayerClient) WDelayerEscapeHatchWithdrawal(to, token ethCommon.Addre
} }
var ( var (
logDeposit = crypto.Keccak256Hash([]byte("Deposit(address,address,uint192,uint64)")) logWDelayerDeposit = crypto.Keccak256Hash([]byte("Deposit(address,address,uint192,uint64)"))
logWithdraw = crypto.Keccak256Hash([]byte("Withdraw(address,address,uint192)")) logWDelayerWithdraw = crypto.Keccak256Hash([]byte("Withdraw(address,address,uint192)"))
logEmergencyModeEnabled = crypto.Keccak256Hash([]byte("EmergencyModeEnabled()")) logWDelayerEmergencyModeEnabled = crypto.Keccak256Hash([]byte("EmergencyModeEnabled()"))
logNewWithdrawalDelay = crypto.Keccak256Hash([]byte("NewWithdrawalDelay(uint64)")) logWDelayerNewWithdrawalDelay = crypto.Keccak256Hash([]byte("NewWithdrawalDelay(uint64)"))
logEscapeHatchWithdrawal = crypto.Keccak256Hash([]byte("EscapeHatchWithdrawal(address,address,address)")) logWDelayerEscapeHatchWithdrawal = crypto.Keccak256Hash([]byte("EscapeHatchWithdrawal(address,address,address,uint256)"))
logNewHermezKeeperAddress = crypto.Keccak256Hash([]byte("NewHermezKeeperAddress(address)")) logWDelayerNewHermezKeeperAddress = crypto.Keccak256Hash([]byte("NewHermezKeeperAddress(address)"))
logNewWhiteHackGroupAddress = crypto.Keccak256Hash([]byte("NewWhiteHackGroupAddress(address)")) logWDelayerNewWhiteHackGroupAddress = crypto.Keccak256Hash([]byte("NewWhiteHackGroupAddress(address)"))
logNewHermezGovernanceDAOAddress = crypto.Keccak256Hash([]byte("NewHermezGovernanceDAOAddress(address)")) logWDelayerNewHermezGovernanceDAOAddress = crypto.Keccak256Hash([]byte("NewHermezGovernanceDAOAddress(address)"))
) )
// WDelayerEventsByBlock returns the events in a block that happened in the // WDelayerEventsByBlock returns the events in a block that happened in the
@@ -459,7 +460,7 @@ func (c *WDelayerClient) WDelayerEventsByBlock(blockNum int64) (*WDelayerEvents,
return nil, nil, ErrBlockHashMismatchEvent return nil, nil, ErrBlockHashMismatchEvent
} }
switch vLog.Topics[0] { switch vLog.Topics[0] {
case logDeposit: case logWDelayerDeposit:
var deposit WDelayerEventDeposit var deposit WDelayerEventDeposit
err := c.contractAbi.Unpack(&deposit, "Deposit", vLog.Data) err := c.contractAbi.Unpack(&deposit, "Deposit", vLog.Data)
if err != nil { if err != nil {
@@ -469,7 +470,7 @@ func (c *WDelayerClient) WDelayerEventsByBlock(blockNum int64) (*WDelayerEvents,
deposit.Token = ethCommon.BytesToAddress(vLog.Topics[2].Bytes()) deposit.Token = ethCommon.BytesToAddress(vLog.Topics[2].Bytes())
wdelayerEvents.Deposit = append(wdelayerEvents.Deposit, deposit) wdelayerEvents.Deposit = append(wdelayerEvents.Deposit, deposit)
case logWithdraw: case logWDelayerWithdraw:
var withdraw WDelayerEventWithdraw var withdraw WDelayerEventWithdraw
err := c.contractAbi.Unpack(&withdraw, "Withdraw", vLog.Data) err := c.contractAbi.Unpack(&withdraw, "Withdraw", vLog.Data)
if err != nil { if err != nil {
@@ -479,11 +480,11 @@ func (c *WDelayerClient) WDelayerEventsByBlock(blockNum int64) (*WDelayerEvents,
withdraw.Owner = ethCommon.BytesToAddress(vLog.Topics[2].Bytes()) withdraw.Owner = ethCommon.BytesToAddress(vLog.Topics[2].Bytes())
wdelayerEvents.Withdraw = append(wdelayerEvents.Withdraw, withdraw) wdelayerEvents.Withdraw = append(wdelayerEvents.Withdraw, withdraw)
case logEmergencyModeEnabled: case logWDelayerEmergencyModeEnabled:
var emergencyModeEnabled WDelayerEventEmergencyModeEnabled var emergencyModeEnabled WDelayerEventEmergencyModeEnabled
wdelayerEvents.EmergencyModeEnabled = append(wdelayerEvents.EmergencyModeEnabled, emergencyModeEnabled) wdelayerEvents.EmergencyModeEnabled = append(wdelayerEvents.EmergencyModeEnabled, emergencyModeEnabled)
case logNewWithdrawalDelay: case logWDelayerNewWithdrawalDelay:
var withdrawalDelay WDelayerEventNewWithdrawalDelay var withdrawalDelay WDelayerEventNewWithdrawalDelay
err := c.contractAbi.Unpack(&withdrawalDelay, "NewWithdrawalDelay", vLog.Data) err := c.contractAbi.Unpack(&withdrawalDelay, "NewWithdrawalDelay", vLog.Data)
if err != nil { if err != nil {
@@ -491,14 +492,18 @@ func (c *WDelayerClient) WDelayerEventsByBlock(blockNum int64) (*WDelayerEvents,
} }
wdelayerEvents.NewWithdrawalDelay = append(wdelayerEvents.NewWithdrawalDelay, withdrawalDelay) wdelayerEvents.NewWithdrawalDelay = append(wdelayerEvents.NewWithdrawalDelay, withdrawalDelay)
case logEscapeHatchWithdrawal: case logWDelayerEscapeHatchWithdrawal:
var escapeHatchWithdrawal WDelayerEventEscapeHatchWithdrawal var escapeHatchWithdrawal WDelayerEventEscapeHatchWithdrawal
err := c.contractAbi.Unpack(&escapeHatchWithdrawal, "EscapeHatchWithdrawal", vLog.Data)
if err != nil {
return nil, nil, err
}
escapeHatchWithdrawal.Who = ethCommon.BytesToAddress(vLog.Topics[1].Bytes()) escapeHatchWithdrawal.Who = ethCommon.BytesToAddress(vLog.Topics[1].Bytes())
escapeHatchWithdrawal.To = ethCommon.BytesToAddress(vLog.Topics[2].Bytes()) escapeHatchWithdrawal.To = ethCommon.BytesToAddress(vLog.Topics[2].Bytes())
escapeHatchWithdrawal.Token = ethCommon.BytesToAddress(vLog.Topics[3].Bytes()) escapeHatchWithdrawal.Token = ethCommon.BytesToAddress(vLog.Topics[3].Bytes())
wdelayerEvents.EscapeHatchWithdrawal = append(wdelayerEvents.EscapeHatchWithdrawal, escapeHatchWithdrawal) wdelayerEvents.EscapeHatchWithdrawal = append(wdelayerEvents.EscapeHatchWithdrawal, escapeHatchWithdrawal)
case logNewHermezKeeperAddress: case logWDelayerNewHermezKeeperAddress:
var keeperAddress WDelayerEventNewHermezKeeperAddress var keeperAddress WDelayerEventNewHermezKeeperAddress
err := c.contractAbi.Unpack(&keeperAddress, "NewHermezKeeperAddress", vLog.Data) err := c.contractAbi.Unpack(&keeperAddress, "NewHermezKeeperAddress", vLog.Data)
if err != nil { if err != nil {
@@ -506,7 +511,7 @@ func (c *WDelayerClient) WDelayerEventsByBlock(blockNum int64) (*WDelayerEvents,
} }
wdelayerEvents.NewHermezKeeperAddress = append(wdelayerEvents.NewHermezKeeperAddress, keeperAddress) wdelayerEvents.NewHermezKeeperAddress = append(wdelayerEvents.NewHermezKeeperAddress, keeperAddress)
case logNewWhiteHackGroupAddress: case logWDelayerNewWhiteHackGroupAddress:
var whiteHackGroupAddress WDelayerEventNewWhiteHackGroupAddress var whiteHackGroupAddress WDelayerEventNewWhiteHackGroupAddress
err := c.contractAbi.Unpack(&whiteHackGroupAddress, "NewWhiteHackGroupAddress", vLog.Data) err := c.contractAbi.Unpack(&whiteHackGroupAddress, "NewWhiteHackGroupAddress", vLog.Data)
if err != nil { if err != nil {
@@ -514,7 +519,7 @@ func (c *WDelayerClient) WDelayerEventsByBlock(blockNum int64) (*WDelayerEvents,
} }
wdelayerEvents.NewWhiteHackGroupAddress = append(wdelayerEvents.NewWhiteHackGroupAddress, whiteHackGroupAddress) wdelayerEvents.NewWhiteHackGroupAddress = append(wdelayerEvents.NewWhiteHackGroupAddress, whiteHackGroupAddress)
case logNewHermezGovernanceDAOAddress: case logWDelayerNewHermezGovernanceDAOAddress:
var governanceDAOAddress WDelayerEventNewHermezGovernanceDAOAddress var governanceDAOAddress WDelayerEventNewHermezGovernanceDAOAddress
err := c.contractAbi.Unpack(&governanceDAOAddress, "NewHermezGovernanceDAOAddress", vLog.Data) err := c.contractAbi.Unpack(&governanceDAOAddress, "NewHermezGovernanceDAOAddress", vLog.Data)
if err != nil { if err != nil {

View File

@@ -10,6 +10,7 @@ import (
) )
var wdelayerClient *WDelayerClient var wdelayerClient *WDelayerClient
var wdelayerClientTest *WDelayerClient
// var wdelayerClientKep *WDelayerClient // var wdelayerClientKep *WDelayerClient
@@ -18,117 +19,117 @@ var newWithdrawalDelay = big.NewInt(79)
var maxEmergencyModeTime = time.Hour * 24 * 7 * 26 var maxEmergencyModeTime = time.Hour * 24 * 7 * 26
func TestWDelayerGetHermezGovernanceDAOAddress(t *testing.T) { func TestWDelayerGetHermezGovernanceDAOAddress(t *testing.T) {
governanceAddress, err := wdelayerClient.WDelayerGetHermezGovernanceDAOAddress() governanceAddress, err := wdelayerClientTest.WDelayerGetHermezGovernanceDAOAddress()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, &hermezGovernanceDAOAddressConst, governanceAddress) assert.Equal(t, &hermezGovernanceDAOAddressConst, governanceAddress)
} }
func TestWDelayerSetHermezGovernanceDAOAddress(t *testing.T) { func TestWDelayerSetHermezGovernanceDAOAddress(t *testing.T) {
wdelayerClientGov, err := NewWDelayerClient(ethereumClientGovDAO, wdelayerAddressConst) wdelayerClientGov, err := NewWDelayerClient(ethereumClientGovDAO, wdelayerTestAddressConst)
require.Nil(t, err) require.Nil(t, err)
_, err = wdelayerClientGov.WDelayerSetHermezGovernanceDAOAddress(auxAddressConst) _, err = wdelayerClientGov.WDelayerSetHermezGovernanceDAOAddress(auxAddressConst)
require.Nil(t, err) require.Nil(t, err)
auxAddress, err := wdelayerClient.WDelayerGetHermezGovernanceDAOAddress() auxAddress, err := wdelayerClientTest.WDelayerGetHermezGovernanceDAOAddress()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, &auxAddressConst, auxAddress) assert.Equal(t, &auxAddressConst, auxAddress)
currentBlockNum, _ := wdelayerClient.client.EthCurrentBlock() currentBlockNum, _ := wdelayerClientTest.client.EthCurrentBlock()
wdelayerEvents, _, _ := wdelayerClient.WDelayerEventsByBlock(currentBlockNum) wdelayerEvents, _, _ := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
assert.Equal(t, auxAddressConst, wdelayerEvents.NewHermezGovernanceDAOAddress[0].NewHermezGovernanceDAOAddress) assert.Equal(t, auxAddressConst, wdelayerEvents.NewHermezGovernanceDAOAddress[0].NewHermezGovernanceDAOAddress)
wdelayerClientAux, err := NewWDelayerClient(ethereumClientAux, wdelayerAddressConst) wdelayerClientAux, err := NewWDelayerClient(ethereumClientAux, wdelayerTestAddressConst)
require.Nil(t, err) require.Nil(t, err)
_, err = wdelayerClientAux.WDelayerSetHermezGovernanceDAOAddress(hermezGovernanceDAOAddressConst) _, err = wdelayerClientAux.WDelayerSetHermezGovernanceDAOAddress(hermezGovernanceDAOAddressConst)
require.Nil(t, err) require.Nil(t, err)
} }
func TestWDelayerGetHermezKeeperAddress(t *testing.T) { func TestWDelayerGetHermezKeeperAddress(t *testing.T) {
keeperAddress, err := wdelayerClient.WDelayerGetHermezKeeperAddress() keeperAddress, err := wdelayerClientTest.WDelayerGetHermezKeeperAddress()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, &hermezKeeperAddressConst, keeperAddress) assert.Equal(t, &hermezKeeperAddressConst, keeperAddress)
} }
func TestWDelayerSetHermezKeeperAddress(t *testing.T) { func TestWDelayerSetHermezKeeperAddress(t *testing.T) {
wdelayerClientKep, err := NewWDelayerClient(ethereumClientKep, wdelayerAddressConst) wdelayerClientKep, err := NewWDelayerClient(ethereumClientKep, wdelayerTestAddressConst)
require.Nil(t, err) require.Nil(t, err)
_, err = wdelayerClientKep.WDelayerSetHermezKeeperAddress(auxAddressConst) _, err = wdelayerClientKep.WDelayerSetHermezKeeperAddress(auxAddressConst)
require.Nil(t, err) require.Nil(t, err)
auxAddress, err := wdelayerClient.WDelayerGetHermezKeeperAddress() auxAddress, err := wdelayerClientTest.WDelayerGetHermezKeeperAddress()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, &auxAddressConst, auxAddress) assert.Equal(t, &auxAddressConst, auxAddress)
currentBlockNum, _ := wdelayerClient.client.EthCurrentBlock() currentBlockNum, _ := wdelayerClientTest.client.EthCurrentBlock()
wdelayerEvents, _, _ := wdelayerClient.WDelayerEventsByBlock(currentBlockNum) wdelayerEvents, _, _ := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
assert.Equal(t, auxAddressConst, wdelayerEvents.NewHermezKeeperAddress[0].NewHermezKeeperAddress) assert.Equal(t, auxAddressConst, wdelayerEvents.NewHermezKeeperAddress[0].NewHermezKeeperAddress)
wdelayerClientAux, err := NewWDelayerClient(ethereumClientAux, wdelayerAddressConst) wdelayerClientAux, err := NewWDelayerClient(ethereumClientAux, wdelayerTestAddressConst)
require.Nil(t, err) require.Nil(t, err)
_, err = wdelayerClientAux.WDelayerSetHermezKeeperAddress(hermezKeeperAddressConst) _, err = wdelayerClientAux.WDelayerSetHermezKeeperAddress(hermezKeeperAddressConst)
require.Nil(t, err) require.Nil(t, err)
} }
func TestWDelayerGetWhiteHackGroupAddress(t *testing.T) { func TestWDelayerGetWhiteHackGroupAddress(t *testing.T) {
whiteHackGroupAddress, err := wdelayerClient.WDelayerGetWhiteHackGroupAddress() whiteHackGroupAddress, err := wdelayerClientTest.WDelayerGetWhiteHackGroupAddress()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, &whiteHackGroupAddressConst, whiteHackGroupAddress) assert.Equal(t, &whiteHackGroupAddressConst, whiteHackGroupAddress)
} }
func TestWDelayerSetWhiteHackGroupAddress(t *testing.T) { func TestWDelayerSetWhiteHackGroupAddress(t *testing.T) {
wdelayerClientWhite, err := NewWDelayerClient(ethereumClientWhite, wdelayerAddressConst) wdelayerClientWhite, err := NewWDelayerClient(ethereumClientWhite, wdelayerTestAddressConst)
require.Nil(t, err) require.Nil(t, err)
_, err = wdelayerClientWhite.WDelayerSetWhiteHackGroupAddress(auxAddressConst) _, err = wdelayerClientWhite.WDelayerSetWhiteHackGroupAddress(auxAddressConst)
require.Nil(t, err) require.Nil(t, err)
auxAddress, err := wdelayerClient.WDelayerGetWhiteHackGroupAddress() auxAddress, err := wdelayerClientTest.WDelayerGetWhiteHackGroupAddress()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, &auxAddressConst, auxAddress) assert.Equal(t, &auxAddressConst, auxAddress)
currentBlockNum, _ := wdelayerClient.client.EthCurrentBlock() currentBlockNum, _ := wdelayerClientTest.client.EthCurrentBlock()
wdelayerEvents, _, _ := wdelayerClient.WDelayerEventsByBlock(currentBlockNum) wdelayerEvents, _, _ := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
assert.Equal(t, auxAddressConst, wdelayerEvents.NewWhiteHackGroupAddress[0].NewWhiteHackGroupAddress) assert.Equal(t, auxAddressConst, wdelayerEvents.NewWhiteHackGroupAddress[0].NewWhiteHackGroupAddress)
wdelayerClientAux, err := NewWDelayerClient(ethereumClientAux, wdelayerAddressConst) wdelayerClientAux, err := NewWDelayerClient(ethereumClientAux, wdelayerTestAddressConst)
require.Nil(t, err) require.Nil(t, err)
_, err = wdelayerClientAux.WDelayerSetWhiteHackGroupAddress(whiteHackGroupAddressConst) _, err = wdelayerClientAux.WDelayerSetWhiteHackGroupAddress(whiteHackGroupAddressConst)
require.Nil(t, err) require.Nil(t, err)
} }
func TestWDelayerIsEmergencyMode(t *testing.T) { func TestWDelayerIsEmergencyMode(t *testing.T) {
emergencyMode, err := wdelayerClient.WDelayerIsEmergencyMode() emergencyMode, err := wdelayerClientTest.WDelayerIsEmergencyMode()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, false, emergencyMode) assert.Equal(t, false, emergencyMode)
} }
func TestWDelayerGetWithdrawalDelay(t *testing.T) { func TestWDelayerGetWithdrawalDelay(t *testing.T) {
withdrawalDelay, err := wdelayerClient.WDelayerGetWithdrawalDelay() withdrawalDelay, err := wdelayerClientTest.WDelayerGetWithdrawalDelay()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, initWithdrawalDelay, withdrawalDelay) assert.Equal(t, initWithdrawalDelay, withdrawalDelay)
} }
func TestWDelayerChangeWithdrawalDelay(t *testing.T) { func TestWDelayerChangeWithdrawalDelay(t *testing.T) {
wdelayerClientKep, err := NewWDelayerClient(ethereumClientKep, wdelayerAddressConst) wdelayerClientKep, err := NewWDelayerClient(ethereumClientKep, wdelayerTestAddressConst)
require.Nil(t, err) require.Nil(t, err)
_, err = wdelayerClientKep.WDelayerChangeWithdrawalDelay(newWithdrawalDelay.Uint64()) _, err = wdelayerClientKep.WDelayerChangeWithdrawalDelay(newWithdrawalDelay.Uint64())
require.Nil(t, err) require.Nil(t, err)
withdrawalDelay, err := wdelayerClient.WDelayerGetWithdrawalDelay() withdrawalDelay, err := wdelayerClientTest.WDelayerGetWithdrawalDelay()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, newWithdrawalDelay, withdrawalDelay) assert.Equal(t, newWithdrawalDelay, withdrawalDelay)
currentBlockNum, _ := wdelayerClient.client.EthCurrentBlock() currentBlockNum, _ := wdelayerClientTest.client.EthCurrentBlock()
wdelayerEvents, _, _ := wdelayerClient.WDelayerEventsByBlock(currentBlockNum) wdelayerEvents, _, _ := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
assert.Equal(t, newWithdrawalDelay.Uint64(), wdelayerEvents.NewWithdrawalDelay[0].WithdrawalDelay) assert.Equal(t, newWithdrawalDelay.Uint64(), wdelayerEvents.NewWithdrawalDelay[0].WithdrawalDelay)
} }
func TestWDelayerDeposit(t *testing.T) { func TestWDelayerDeposit(t *testing.T) {
amount := new(big.Int) amount := new(big.Int)
amount.SetString("1100000000000000000", 10) amount.SetString("1100000000000000000", 10)
wdelayerClientHermez, err := NewWDelayerClient(ethereumClientHermez, wdelayerAddressConst) wdelayerClientHermez, err := NewWDelayerClient(ethereumClientHermez, wdelayerTestAddressConst)
require.Nil(t, err) require.Nil(t, err)
_, err = wdelayerClientHermez.WDelayerDeposit(auxAddressConst, tokenHezAddressConst, amount) _, err = wdelayerClientHermez.WDelayerDeposit(auxAddressConst, tokenERC20AddressConst, amount)
require.Nil(t, err) require.Nil(t, err)
currentBlockNum, _ := wdelayerClient.client.EthCurrentBlock() currentBlockNum, _ := wdelayerClientTest.client.EthCurrentBlock()
wdelayerEvents, _, _ := wdelayerClient.WDelayerEventsByBlock(currentBlockNum) wdelayerEvents, _, _ := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
assert.Equal(t, amount, wdelayerEvents.Deposit[0].Amount) assert.Equal(t, amount, wdelayerEvents.Deposit[0].Amount)
assert.Equal(t, auxAddressConst, wdelayerEvents.Deposit[0].Owner) assert.Equal(t, auxAddressConst, wdelayerEvents.Deposit[0].Owner)
assert.Equal(t, tokenHezAddressConst, wdelayerEvents.Deposit[0].Token) assert.Equal(t, tokenERC20AddressConst, wdelayerEvents.Deposit[0].Token)
} }
func TestWDelayerDepositInfo(t *testing.T) { func TestWDelayerDepositInfo(t *testing.T) {
amount := new(big.Int) amount := new(big.Int)
amount.SetString("1100000000000000000", 10) amount.SetString("1100000000000000000", 10)
state, err := wdelayerClient.WDelayerDepositInfo(auxAddressConst, tokenHezAddressConst) state, err := wdelayerClientTest.WDelayerDepositInfo(auxAddressConst, tokenERC20AddressConst)
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, state.Amount, amount) assert.Equal(t, state.Amount, amount)
} }
@@ -136,34 +137,48 @@ func TestWDelayerDepositInfo(t *testing.T) {
func TestWDelayerWithdrawal(t *testing.T) { func TestWDelayerWithdrawal(t *testing.T) {
amount := new(big.Int) amount := new(big.Int)
amount.SetString("1100000000000000000", 10) amount.SetString("1100000000000000000", 10)
_, err := wdelayerClient.WDelayerWithdrawal(auxAddressConst, tokenHezAddressConst) _, err := wdelayerClientTest.WDelayerWithdrawal(auxAddressConst, tokenERC20AddressConst)
require.Contains(t, err.Error(), "Withdrawal not allowed yet") require.Contains(t, err.Error(), "Withdrawal not allowed yet")
addBlocks(newWithdrawalDelay.Int64(), ethClientDialURL) addBlocks(newWithdrawalDelay.Int64(), ethClientDialURL)
_, err = wdelayerClient.WDelayerWithdrawal(auxAddressConst, tokenHezAddressConst) _, err = wdelayerClientTest.WDelayerWithdrawal(auxAddressConst, tokenERC20AddressConst)
require.Nil(t, err) require.Nil(t, err)
currentBlockNum, _ := wdelayerClient.client.EthCurrentBlock() currentBlockNum, _ := wdelayerClientTest.client.EthCurrentBlock()
wdelayerEvents, _, _ := wdelayerClient.WDelayerEventsByBlock(currentBlockNum) wdelayerEvents, _, _ := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
assert.Equal(t, amount, wdelayerEvents.Withdraw[0].Amount) assert.Equal(t, amount, wdelayerEvents.Withdraw[0].Amount)
assert.Equal(t, auxAddressConst, wdelayerEvents.Withdraw[0].Owner) assert.Equal(t, auxAddressConst, wdelayerEvents.Withdraw[0].Owner)
assert.Equal(t, tokenHezAddressConst, wdelayerEvents.Withdraw[0].Token) assert.Equal(t, tokenERC20AddressConst, wdelayerEvents.Withdraw[0].Token)
}
func TestWDelayerSecondDeposit(t *testing.T) {
amount := new(big.Int)
amount.SetString("1100000000000000000", 10)
wdelayerClientHermez, err := NewWDelayerClient(ethereumClientHermez, wdelayerTestAddressConst)
require.Nil(t, err)
_, err = wdelayerClientHermez.WDelayerDeposit(auxAddressConst, tokenERC20AddressConst, amount)
require.Nil(t, err)
currentBlockNum, _ := wdelayerClientTest.client.EthCurrentBlock()
wdelayerEvents, _, _ := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
assert.Equal(t, amount, wdelayerEvents.Deposit[0].Amount)
assert.Equal(t, auxAddressConst, wdelayerEvents.Deposit[0].Owner)
assert.Equal(t, tokenERC20AddressConst, wdelayerEvents.Deposit[0].Token)
} }
func TestWDelayerEnableEmergencyMode(t *testing.T) { func TestWDelayerEnableEmergencyMode(t *testing.T) {
wdelayerClientKep, err := NewWDelayerClient(ethereumClientKep, wdelayerAddressConst) wdelayerClientKep, err := NewWDelayerClient(ethereumClientKep, wdelayerTestAddressConst)
require.Nil(t, err) require.Nil(t, err)
_, err = wdelayerClientKep.WDelayerEnableEmergencyMode() _, err = wdelayerClientKep.WDelayerEnableEmergencyMode()
require.Nil(t, err) require.Nil(t, err)
emergencyMode, err := wdelayerClient.WDelayerIsEmergencyMode() emergencyMode, err := wdelayerClientTest.WDelayerIsEmergencyMode()
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, true, emergencyMode) assert.Equal(t, true, emergencyMode)
currentBlockNum, _ := wdelayerClient.client.EthCurrentBlock() currentBlockNum, _ := wdelayerClientTest.client.EthCurrentBlock()
wdelayerEvents, _, _ := wdelayerClient.WDelayerEventsByBlock(currentBlockNum) wdelayerEvents, _, _ := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
auxEvent := new(WDelayerEventEmergencyModeEnabled) auxEvent := new(WDelayerEventEmergencyModeEnabled)
assert.Equal(t, auxEvent, &wdelayerEvents.EmergencyModeEnabled[0]) assert.Equal(t, auxEvent, &wdelayerEvents.EmergencyModeEnabled[0])
} }
func TestWDelayerGetEmergencyModeStartingTime(t *testing.T) { func TestWDelayerGetEmergencyModeStartingTime(t *testing.T) {
emergencyModeStartingTime, err := wdelayerClient.WDelayerGetEmergencyModeStartingTime() emergencyModeStartingTime, err := wdelayerClientTest.WDelayerGetEmergencyModeStartingTime()
require.Nil(t, err) require.Nil(t, err)
// `emergencyModeStartingTime` is initialized to 0 in the smart // `emergencyModeStartingTime` is initialized to 0 in the smart
// contract construction. Since we called WDelayerEnableEmergencyMode // contract construction. Since we called WDelayerEnableEmergencyMode
@@ -173,17 +188,20 @@ func TestWDelayerGetEmergencyModeStartingTime(t *testing.T) {
} }
func TestWDelayerEscapeHatchWithdrawal(t *testing.T) { func TestWDelayerEscapeHatchWithdrawal(t *testing.T) {
wdelayerClientWhite, err := NewWDelayerClient(ethereumClientWhite, wdelayerAddressConst) amount := new(big.Int)
amount.SetString("10000000000000000", 10)
wdelayerClientWhite, err := NewWDelayerClient(ethereumClientWhite, wdelayerTestAddressConst)
require.Nil(t, err) require.Nil(t, err)
_, err = wdelayerClientWhite.WDelayerEscapeHatchWithdrawal(governanceAddressConst, tokenHezAddressConst) _, err = wdelayerClientWhite.WDelayerEscapeHatchWithdrawal(governanceAddressConst, tokenERC20AddressConst, amount)
require.Contains(t, err.Error(), "NO MAX_EMERGENCY_MODE_TIME") require.Contains(t, err.Error(), "NO MAX_EMERGENCY_MODE_TIME")
seconds := maxEmergencyModeTime.Seconds() seconds := maxEmergencyModeTime.Seconds()
addTime(seconds, ethClientDialURL) addTime(seconds, ethClientDialURL)
_, err = wdelayerClientWhite.WDelayerEscapeHatchWithdrawal(governanceAddressConst, tokenHezAddressConst) _, err = wdelayerClientWhite.WDelayerEscapeHatchWithdrawal(governanceAddressConst, tokenERC20AddressConst, amount)
require.Nil(t, err) require.Nil(t, err)
currentBlockNum, _ := wdelayerClient.client.EthCurrentBlock() currentBlockNum, _ := wdelayerClientTest.client.EthCurrentBlock()
wdelayerEvents, _, _ := wdelayerClient.WDelayerEventsByBlock(currentBlockNum) wdelayerEvents, _, _ := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
assert.Equal(t, tokenHezAddressConst, wdelayerEvents.EscapeHatchWithdrawal[0].Token) assert.Equal(t, tokenERC20AddressConst, wdelayerEvents.EscapeHatchWithdrawal[0].Token)
assert.Equal(t, governanceAddressConst, wdelayerEvents.EscapeHatchWithdrawal[0].To) assert.Equal(t, governanceAddressConst, wdelayerEvents.EscapeHatchWithdrawal[0].To)
assert.Equal(t, whiteHackGroupAddressConst, wdelayerEvents.EscapeHatchWithdrawal[0].Who) assert.Equal(t, whiteHackGroupAddressConst, wdelayerEvents.EscapeHatchWithdrawal[0].Who)
assert.Equal(t, amount, wdelayerEvents.EscapeHatchWithdrawal[0].Amount)
} }