mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-07 19:36:44 +01:00
Reorganize smart contract types, udate eth tests, etc.
- Move smart contract constants and structs for variables to
common/{ethrollup.go, ethauction.go, ethwdelayer.go}:
- This removes repeated code of the structs for variables
- Allows reusing the constants and variables from all modules without
import cycles
- Remove unused common/scvars.go
- In common.BlockData, split data from each smart contract into a sepparate
field (Rollup, Auction, WDelayer). This affects the structures that til uses
as output, and HistoryDB in the AddBlockSCData.
- In Synchronizer:
- Pass starting block of each smart contract as config, instead of
incorrectly using the genesis block found in the acution constant (which
has a very different meaning)
- Use variable structs from common instead of an internal copy
- Synchronize more stuff (resolve some TODOs)
- Fix some issues found after initial testing with ganache
- In eth:
- In auction.go: Add method to get constants
- Update README to use ganache instead of buidlerevm as local blockchain
for testing
- Update env variables and test vectors to pass the tests with the
deployment in the ganache testnet.
- Use ethereum keys derived from paths (hdwallet) in testing to avoid
hardcoding private keys and generate the same keys from a mnemonic used
in the ganache tesnet.
This commit is contained in:
@@ -14,20 +14,61 @@ type Block struct {
|
||||
ParentHash ethCommon.Hash `meddler:"-"`
|
||||
}
|
||||
|
||||
// BlockData contains the information of a Block
|
||||
type BlockData struct {
|
||||
Block Block
|
||||
// Rollup
|
||||
// RollupData contains information returned by the Rollup smart contract
|
||||
type RollupData struct {
|
||||
// L1UserTxs that were submitted in the block
|
||||
L1UserTxs []L1Tx
|
||||
Batches []BatchData
|
||||
AddedTokens []Token
|
||||
RollupVars *RollupVars
|
||||
// Auction
|
||||
Bids []Bid
|
||||
Coordinators []Coordinator
|
||||
AuctionVars *AuctionVars
|
||||
WithdrawDelayerVars *WithdrawDelayerVars
|
||||
Withdrawals []WithdrawInfo
|
||||
Vars *RollupVariables
|
||||
}
|
||||
|
||||
// NewRollupData creates an empty RollupData with the slices initialized.
|
||||
func NewRollupData() RollupData {
|
||||
return RollupData{
|
||||
L1UserTxs: make([]L1Tx, 0),
|
||||
Batches: make([]BatchData, 0),
|
||||
AddedTokens: make([]Token, 0),
|
||||
Withdrawals: make([]WithdrawInfo, 0),
|
||||
Vars: nil,
|
||||
}
|
||||
}
|
||||
|
||||
// AuctionData contains information returned by the Action smart contract
|
||||
type AuctionData struct {
|
||||
Bids []Bid
|
||||
Coordinators []Coordinator
|
||||
Vars *AuctionVariables
|
||||
}
|
||||
|
||||
// NewAuctionData creates an empty AuctionData with the slices initialized.
|
||||
func NewAuctionData() AuctionData {
|
||||
return AuctionData{
|
||||
Bids: make([]Bid, 0),
|
||||
Coordinators: make([]Coordinator, 0),
|
||||
Vars: nil,
|
||||
}
|
||||
}
|
||||
|
||||
// WDelayerData contains information returned by the WDelayer smart contract
|
||||
type WDelayerData struct {
|
||||
Vars *WDelayerVariables
|
||||
}
|
||||
|
||||
// NewWDelayerData creates an empty WDelayerData.
|
||||
func NewWDelayerData() WDelayerData {
|
||||
return WDelayerData{
|
||||
Vars: nil,
|
||||
}
|
||||
}
|
||||
|
||||
// BlockData contains the information of a Block
|
||||
type BlockData struct {
|
||||
Block Block
|
||||
Rollup RollupData
|
||||
Auction AuctionData
|
||||
WDelayer WDelayerData
|
||||
// TODO: enable when common.WithdrawalDelayerVars is Merged from Synchronizer PR
|
||||
// WithdrawalDelayerVars *common.WithdrawalDelayerVars
|
||||
}
|
||||
|
||||
44
common/ethauction.go
Normal file
44
common/ethauction.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"math/big"
|
||||
|
||||
ethCommon "github.com/ethereum/go-ethereum/common"
|
||||
)
|
||||
|
||||
// AuctionConstants are the constants of the Rollup Smart Contract
|
||||
type AuctionConstants struct {
|
||||
// Blocks per slot
|
||||
BlocksPerSlot uint8 `json:"blocksPerSlot"`
|
||||
// Minimum bid when no one has bid yet
|
||||
InitialMinimalBidding *big.Int `json:"initialMinimalBidding"`
|
||||
// First block where the first slot begins
|
||||
GenesisBlockNum int64 `json:"genesisBlockNum"`
|
||||
// ERC777 token with which the bids will be made
|
||||
TokenHEZ ethCommon.Address `json:"tokenHEZ"`
|
||||
// HermezRollup smartcontract address
|
||||
HermezRollup ethCommon.Address `json:"hermezRollup"`
|
||||
// Hermez Governanze Token smartcontract address who controls some parameters and collects HEZ fee
|
||||
// Only for test
|
||||
GovernanceAddress ethCommon.Address `json:"governanceAddress"`
|
||||
}
|
||||
|
||||
// AuctionVariables are the variables of the Auction Smart Contract
|
||||
type AuctionVariables struct {
|
||||
// Boot Coordinator Address
|
||||
DonationAddress ethCommon.Address `json:"donationAddress" meddler:"donation_address"`
|
||||
// Boot Coordinator Address
|
||||
BootCoordinator ethCommon.Address `json:"bootCoordinator" meddler:"boot_coordinator"`
|
||||
// The minimum bid value in a series of 6 slots
|
||||
DefaultSlotSetBid [6]*big.Int `json:"defaultSlotSetBid" meddler:"default_slot_set_bid,json"`
|
||||
// Distance (#slots) to the closest slot to which you can bid ( 2 Slots = 2 * 40 Blocks = 20 min )
|
||||
ClosedAuctionSlots uint16 `json:"closedAuctionSlots" meddler:"closed_auction_slots"`
|
||||
// Distance (#slots) to the farthest slot to which you can bid (30 days = 4320 slots )
|
||||
OpenAuctionSlots uint16 `json:"openAuctionSlots" meddler:"open_auction_slots"`
|
||||
// How the HEZ tokens deposited by the slot winner are distributed (Burn: 40% - Donation: 40% - HGT: 20%)
|
||||
AllocationRatio [3]uint16 `json:"allocationRatio" meddler:"allocation_ratio,json"`
|
||||
// Minimum outbid (percentage) over the previous one to consider it valid
|
||||
Outbidding uint16 `json:"outbidding" meddler:"outbidding"`
|
||||
// Number of blocks at the end of a slot in which any coordinator can forge if the winner has not forged one before
|
||||
SlotDeadline uint8 `json:"slotDeadline" meddler:"slot_deadline"`
|
||||
}
|
||||
164
common/ethrollup.go
Normal file
164
common/ethrollup.go
Normal file
@@ -0,0 +1,164 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"math/big"
|
||||
|
||||
ethCommon "github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
)
|
||||
|
||||
// RollupVars contain the Rollup smart contract variables
|
||||
// type RollupVars struct {
|
||||
// EthBlockNum uint64
|
||||
// ForgeL1Timeout *big.Int
|
||||
// FeeL1UserTx *big.Int
|
||||
// FeeAddToken *big.Int
|
||||
// TokensHEZ eth.Address
|
||||
// Governance eth.Address
|
||||
// }
|
||||
|
||||
// AuctionVars contain the Auction smart contract variables
|
||||
// type AuctionVars struct {
|
||||
// EthBlockNum uint64
|
||||
// SlotDeadline uint
|
||||
// CloseAuctionSlots uint
|
||||
// OpenAuctionSlots uint
|
||||
// Governance eth.Address
|
||||
// MinBidSlots MinBidSlots
|
||||
// Outbidding int
|
||||
// DonationAddress eth.Address
|
||||
// GovernanceAddress eth.Address
|
||||
// AllocationRatio AllocationRatio
|
||||
// }
|
||||
|
||||
// WithdrawDelayerVars contains the Withdrawal Delayer smart contract variables
|
||||
// type WithdrawDelayerVars struct {
|
||||
// HermezRollupAddress eth.Address
|
||||
// HermezGovernanceDAOAddress eth.Address
|
||||
// WhiteHackGroupAddress eth.Address
|
||||
// WithdrawalDelay uint
|
||||
// EmergencyModeStartingTime time.Time
|
||||
// EmergencyModeEnabled bool
|
||||
// }
|
||||
|
||||
// MinBidSlots TODO
|
||||
// type MinBidSlots [6]uint
|
||||
//
|
||||
// // AllocationRatio TODO
|
||||
// type AllocationRatio struct {
|
||||
// Donation uint
|
||||
// Burn uint
|
||||
// Forger uint
|
||||
// }
|
||||
|
||||
const (
|
||||
// RollupConstMaxFeeIdxCoordinator is the maximum number of tokens the
|
||||
// coordinator can use to collect fees (determines the number of tokens
|
||||
// that the coordinator can collect fees from). This value is
|
||||
// determined by the circuit.
|
||||
RollupConstMaxFeeIdxCoordinator = 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
|
||||
// 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")
|
||||
// RollupConstRfield Modulus zkSNARK
|
||||
RollupConstRfield, _ = new(big.Int).SetString(
|
||||
"21888242871839275222246405745257275088548364400416034343698204186575808495617", 10)
|
||||
|
||||
// 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()"))
|
||||
)
|
||||
|
||||
// RollupVerifierStruct is the information about verifiers of the Rollup Smart Contract
|
||||
type RollupVerifierStruct struct {
|
||||
MaxTx int64 `json:"maxTx"`
|
||||
NLevels int64 `json:"nlevels"`
|
||||
}
|
||||
|
||||
// RollupConstants are the constants of the Rollup Smart Contract
|
||||
type RollupConstants struct {
|
||||
AbsoluteMaxL1L2BatchTimeout int64 `json:"absoluteMaxL1L2BatchTimeout"`
|
||||
TokenHEZ ethCommon.Address `json:"tokenHEZ"`
|
||||
Verifiers []RollupVerifierStruct `json:"verifiers"`
|
||||
HermezAuctionContract ethCommon.Address `json:"hermezAuctionContract"`
|
||||
HermezGovernanceDAOAddress ethCommon.Address `json:"hermezGovernanceDAOAddress"`
|
||||
SafetyAddress ethCommon.Address `json:"safetyAddress"`
|
||||
WithdrawDelayerContract ethCommon.Address `json:"withdrawDelayerContract"`
|
||||
}
|
||||
|
||||
// Bucket are the variables of each Bucket of Rollup Smart Contract
|
||||
type Bucket struct {
|
||||
CeilUSD uint64 `json:"ceilUSD"`
|
||||
BlockStamp uint64 `json:"blockStamp"`
|
||||
Withdrawals uint64 `json:"withdrawals"`
|
||||
BlockWithdrawalRate uint64 `json:"blockWithdrawalRate"`
|
||||
MaxWithdrawals uint64 `json:"maxWithdrawals"`
|
||||
}
|
||||
|
||||
// RollupVariables are the variables of the Rollup Smart Contract
|
||||
type RollupVariables struct {
|
||||
FeeAddToken *big.Int `json:"feeAddToken" meddler:"fee_addtoken"`
|
||||
ForgeL1L2BatchTimeout int64 `json:"forgeL1L2BatchTimeout" meddler:"forge_l1l2_timeout"`
|
||||
WithdrawalDelay uint64 `json:"withdrawalDelay" meddler:"withdrawal_delay"`
|
||||
Buckets [RollupConstNumBuckets]Bucket `json:"buckets" meddler:"buckets,json"`
|
||||
}
|
||||
24
common/ethwdelayer.go
Normal file
24
common/ethwdelayer.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package common
|
||||
|
||||
import ethCommon "github.com/ethereum/go-ethereum/common"
|
||||
|
||||
// WDelayerConstants are the constants of the Withdrawal Delayer Smart Contract
|
||||
type WDelayerConstants struct {
|
||||
// Max Withdrawal Delay
|
||||
MaxWithdrawalDelay uint64 `json:"maxWithdrawalDelay"`
|
||||
// Max Emergency mode time
|
||||
MaxEmergencyModeTime uint64 `json:"maxEmergencyModeTime"`
|
||||
// HermezRollup smartcontract address
|
||||
HermezRollup ethCommon.Address `json:"hermezRollup"`
|
||||
}
|
||||
|
||||
// WDelayerVariables are the variables of the Withdrawal Delayer Smart Contract
|
||||
type WDelayerVariables struct {
|
||||
HermezRollupAddress ethCommon.Address `json:"hermezRollupAddress" meddler:"rollup_address"`
|
||||
HermezGovernanceDAOAddress ethCommon.Address `json:"hermezGovernanceDAOAddress" meddler:"govdao_address"`
|
||||
WhiteHackGroupAddress ethCommon.Address `json:"whiteHackGroupAddress" meddler:"whg_address"`
|
||||
HermezKeeperAddress ethCommon.Address `json:"hermezKeeperAddress" meddler:"keeper_address"`
|
||||
WithdrawalDelay uint64 `json:"withdrawalDelay" meddler:"withdrawal_delay"`
|
||||
EmergencyModeStartingTime uint64 `json:"emergencyModeStartingTime" meddler:"emergency_start_time"`
|
||||
EmergencyMode bool `json:"emergencyMode" meddler:"emergency_mode"`
|
||||
}
|
||||
@@ -24,3 +24,10 @@ type ExitInfo struct {
|
||||
// happened.
|
||||
DelayedWithdrawn *int64 `meddler:"delayed_withdrawn"`
|
||||
}
|
||||
|
||||
// WithdrawInfo represents a withdraw action to the rollup
|
||||
type WithdrawInfo struct {
|
||||
Idx Idx
|
||||
NumExitRoot BatchNum
|
||||
InstantWithdraw bool
|
||||
}
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"math/big"
|
||||
"time"
|
||||
|
||||
eth "github.com/ethereum/go-ethereum/common"
|
||||
)
|
||||
|
||||
// RollupVars contain the Rollup smart contract variables
|
||||
type RollupVars struct {
|
||||
EthBlockNum uint64
|
||||
ForgeL1Timeout *big.Int
|
||||
FeeL1UserTx *big.Int
|
||||
FeeAddToken *big.Int
|
||||
TokensHEZ eth.Address
|
||||
Governance eth.Address
|
||||
}
|
||||
|
||||
// AuctionVars contain the Auction smart contract variables
|
||||
type AuctionVars struct {
|
||||
EthBlockNum uint64
|
||||
SlotDeadline uint
|
||||
CloseAuctionSlots uint
|
||||
OpenAuctionSlots uint
|
||||
Governance eth.Address
|
||||
MinBidSlots MinBidSlots
|
||||
Outbidding int
|
||||
DonationAddress eth.Address
|
||||
GovernanceAddress eth.Address
|
||||
AllocationRatio AllocationRatio
|
||||
}
|
||||
|
||||
// WithdrawDelayerVars contains the Withdrawal Delayer smart contract variables
|
||||
type WithdrawDelayerVars struct {
|
||||
HermezRollupAddress eth.Address
|
||||
HermezGovernanceDAOAddress eth.Address
|
||||
WhiteHackGroupAddress eth.Address
|
||||
WithdrawalDelay uint
|
||||
EmergencyModeStartingTime time.Time
|
||||
EmergencyModeEnabled bool
|
||||
}
|
||||
|
||||
// MinBidSlots TODO
|
||||
type MinBidSlots [6]uint
|
||||
|
||||
// AllocationRatio TODO
|
||||
type AllocationRatio struct {
|
||||
Donation uint
|
||||
Burn uint
|
||||
Forger uint
|
||||
}
|
||||
Reference in New Issue
Block a user