Commit c0e40203 authored by mergify[bot]'s avatar mergify[bot] Committed by GitHub

Merge branch 'develop' into aj/disable-hive

parents ee388c58 a5445a23
...@@ -880,7 +880,7 @@ jobs: ...@@ -880,7 +880,7 @@ jobs:
patterns: indexer patterns: indexer
- run: - run:
name: Lint name: Lint
command: golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint --timeout 2m -e "errors.As" -e "errors.Is" ./... command: golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint --timeout 4m -e "errors.As" -e "errors.Is" ./...
working_directory: indexer working_directory: indexer
- run: - run:
name: install geth name: install geth
......
...@@ -18,8 +18,8 @@ import ( ...@@ -18,8 +18,8 @@ import (
*/ */
type BlockHeader struct { type BlockHeader struct {
Hash common.Hash `gorm:"primaryKey;serializer:json"` Hash common.Hash `gorm:"primaryKey;serializer:bytes"`
ParentHash common.Hash `gorm:"serializer:json"` ParentHash common.Hash `gorm:"serializer:bytes"`
Number U256 Number U256
Timestamp uint64 Timestamp uint64
...@@ -50,14 +50,14 @@ type LegacyStateBatch struct { ...@@ -50,14 +50,14 @@ type LegacyStateBatch struct {
// violating the primary key constraint. // violating the primary key constraint.
Index uint64 `gorm:"primaryKey;default:0"` Index uint64 `gorm:"primaryKey;default:0"`
Root common.Hash `gorm:"serializer:json"` Root common.Hash `gorm:"serializer:bytes"`
Size uint64 Size uint64
PrevTotal uint64 PrevTotal uint64
L1ContractEventGUID uuid.UUID L1ContractEventGUID uuid.UUID
} }
type OutputProposal struct { type OutputProposal struct {
OutputRoot common.Hash `gorm:"primaryKey;serializer:json"` OutputRoot common.Hash `gorm:"primaryKey;serializer:bytes"`
L2OutputIndex U256 L2OutputIndex U256
L2BlockNumber U256 L2BlockNumber U256
......
...@@ -16,7 +16,7 @@ import ( ...@@ -16,7 +16,7 @@ import (
*/ */
type BridgeMessage struct { type BridgeMessage struct {
MessageHash common.Hash `gorm:"primaryKey;serializer:json"` MessageHash common.Hash `gorm:"primaryKey;serializer:bytes"`
Nonce U256 Nonce U256
SentMessageEventGUID uuid.UUID SentMessageEventGUID uuid.UUID
...@@ -28,12 +28,12 @@ type BridgeMessage struct { ...@@ -28,12 +28,12 @@ type BridgeMessage struct {
type L1BridgeMessage struct { type L1BridgeMessage struct {
BridgeMessage `gorm:"embedded"` BridgeMessage `gorm:"embedded"`
TransactionSourceHash common.Hash `gorm:"serializer:json"` TransactionSourceHash common.Hash `gorm:"serializer:bytes"`
} }
type L2BridgeMessage struct { type L2BridgeMessage struct {
BridgeMessage `gorm:"embedded"` BridgeMessage `gorm:"embedded"`
TransactionWithdrawalHash common.Hash `gorm:"serializer:json"` TransactionWithdrawalHash common.Hash `gorm:"serializer:bytes"`
} }
type BridgeMessagesView interface { type BridgeMessagesView interface {
......
...@@ -8,7 +8,6 @@ import ( ...@@ -8,7 +8,6 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
) )
/** /**
...@@ -16,16 +15,16 @@ import ( ...@@ -16,16 +15,16 @@ import (
*/ */
type Transaction struct { type Transaction struct {
FromAddress common.Address `gorm:"serializer:json"` FromAddress common.Address `gorm:"serializer:bytes"`
ToAddress common.Address `gorm:"serializer:json"` ToAddress common.Address `gorm:"serializer:bytes"`
Amount U256 Amount U256
Data hexutil.Bytes `gorm:"serializer:json"` Data Bytes `gorm:"serializer:bytes"`
Timestamp uint64 Timestamp uint64
} }
type L1TransactionDeposit struct { type L1TransactionDeposit struct {
SourceHash common.Hash `gorm:"serializer:json;primaryKey"` SourceHash common.Hash `gorm:"serializer:bytes;primaryKey"`
L2TransactionHash common.Hash `gorm:"serializer:json"` L2TransactionHash common.Hash `gorm:"serializer:bytes"`
InitiatedL1EventGUID uuid.UUID InitiatedL1EventGUID uuid.UUID
Tx Transaction `gorm:"embedded"` Tx Transaction `gorm:"embedded"`
...@@ -33,7 +32,7 @@ type L1TransactionDeposit struct { ...@@ -33,7 +32,7 @@ type L1TransactionDeposit struct {
} }
type L2TransactionWithdrawal struct { type L2TransactionWithdrawal struct {
WithdrawalHash common.Hash `gorm:"serializer:json;primaryKey"` WithdrawalHash common.Hash `gorm:"serializer:bytes;primaryKey"`
Nonce U256 Nonce U256
InitiatedL2EventGUID uuid.UUID InitiatedL2EventGUID uuid.UUID
......
...@@ -19,12 +19,12 @@ var ( ...@@ -19,12 +19,12 @@ var (
*/ */
type TokenPair struct { type TokenPair struct {
LocalTokenAddress common.Address `gorm:"serializer:json"` LocalTokenAddress common.Address `gorm:"serializer:bytes"`
RemoteTokenAddress common.Address `gorm:"serializer:json"` RemoteTokenAddress common.Address `gorm:"serializer:bytes"`
} }
type BridgeTransfer struct { type BridgeTransfer struct {
CrossDomainMessageHash *common.Hash `gorm:"serializer:json"` CrossDomainMessageHash *common.Hash `gorm:"serializer:bytes"`
Tx Transaction `gorm:"embedded"` Tx Transaction `gorm:"embedded"`
TokenPair TokenPair `gorm:"embedded"` TokenPair TokenPair `gorm:"embedded"`
...@@ -32,27 +32,27 @@ type BridgeTransfer struct { ...@@ -32,27 +32,27 @@ type BridgeTransfer struct {
type L1BridgeDeposit struct { type L1BridgeDeposit struct {
BridgeTransfer `gorm:"embedded"` BridgeTransfer `gorm:"embedded"`
TransactionSourceHash common.Hash `gorm:"primaryKey;serializer:json"` TransactionSourceHash common.Hash `gorm:"primaryKey;serializer:bytes"`
} }
type L1BridgeDepositWithTransactionHashes struct { type L1BridgeDepositWithTransactionHashes struct {
L1BridgeDeposit L1BridgeDeposit `gorm:"embedded"` L1BridgeDeposit L1BridgeDeposit `gorm:"embedded"`
L1TransactionHash common.Hash `gorm:"serializer:json"` L1TransactionHash common.Hash `gorm:"serializer:bytes"`
L2TransactionHash common.Hash `gorm:"serializer:json"` L2TransactionHash common.Hash `gorm:"serializer:bytes"`
} }
type L2BridgeWithdrawal struct { type L2BridgeWithdrawal struct {
BridgeTransfer `gorm:"embedded"` BridgeTransfer `gorm:"embedded"`
TransactionWithdrawalHash common.Hash `gorm:"primaryKey;serializer:json"` TransactionWithdrawalHash common.Hash `gorm:"primaryKey;serializer:bytes"`
} }
type L2BridgeWithdrawalWithTransactionHashes struct { type L2BridgeWithdrawalWithTransactionHashes struct {
L2BridgeWithdrawal L2BridgeWithdrawal `gorm:"embedded"` L2BridgeWithdrawal L2BridgeWithdrawal `gorm:"embedded"`
L2TransactionHash common.Hash `gorm:"serializer:json"` L2TransactionHash common.Hash `gorm:"serializer:bytes"`
ProvenL1TransactionHash common.Hash `gorm:"serializer:json"` ProvenL1TransactionHash common.Hash `gorm:"serializer:bytes"`
FinalizedL1TransactionHash common.Hash `gorm:"serializer:json"` FinalizedL1TransactionHash common.Hash `gorm:"serializer:bytes"`
} }
type BridgeTransfersView interface { type BridgeTransfersView interface {
......
...@@ -21,12 +21,12 @@ type ContractEvent struct { ...@@ -21,12 +21,12 @@ type ContractEvent struct {
GUID uuid.UUID `gorm:"primaryKey"` GUID uuid.UUID `gorm:"primaryKey"`
// Some useful derived fields // Some useful derived fields
BlockHash common.Hash `gorm:"serializer:json"` BlockHash common.Hash `gorm:"serializer:bytes"`
ContractAddress common.Address `gorm:"serializer:json"` ContractAddress common.Address `gorm:"serializer:bytes"`
TransactionHash common.Hash `gorm:"serializer:json"` TransactionHash common.Hash `gorm:"serializer:bytes"`
LogIndex uint64 LogIndex uint64
EventSignature common.Hash `gorm:"serializer:json"` EventSignature common.Hash `gorm:"serializer:bytes"`
Timestamp uint64 Timestamp uint64
// NOTE: NOT ALL THE DERIVED FIELDS ON `types.Log` ARE // NOTE: NOT ALL THE DERIVED FIELDS ON `types.Log` ARE
......
...@@ -5,6 +5,8 @@ import ( ...@@ -5,6 +5,8 @@ import (
"fmt" "fmt"
"github.com/ethereum-optimism/optimism/indexer/config" "github.com/ethereum-optimism/optimism/indexer/config"
_ "github.com/ethereum-optimism/optimism/indexer/database/serializers"
"gorm.io/driver/postgres" "gorm.io/driver/postgres"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/logger" "gorm.io/gorm/logger"
......
package serializers
import (
"context"
"fmt"
"reflect"
"github.com/ethereum/go-ethereum/common/hexutil"
"gorm.io/gorm/schema"
)
type BytesSerializer struct{}
type BytesInterface interface{ Bytes() []byte }
type SetBytesInterface interface{ SetBytes([]byte) }
func init() {
schema.RegisterSerializer("bytes", BytesSerializer{})
}
func (BytesSerializer) Scan(ctx context.Context, field *schema.Field, dst reflect.Value, dbValue interface{}) error {
if dbValue == nil {
return nil
}
hexStr, ok := dbValue.(string)
if !ok {
return fmt.Errorf("expected hex string as the database value: %T", dbValue)
}
b, err := hexutil.Decode(hexStr)
if err != nil {
return fmt.Errorf("failed to decode database value: %w", err)
}
fieldValue := reflect.New(field.FieldType)
fieldInterface := fieldValue.Interface()
// Detect if we're deserializing into a pointer. If so, we'll need to
// also allocate memory to where the allocated pointer should point to
if field.FieldType.Kind() == reflect.Pointer {
nestedField := fieldValue.Elem()
if nestedField.Elem().Kind() == reflect.Pointer {
return fmt.Errorf("double pointers are the max depth supported: %T", fieldValue)
}
// We'll want to call `SetBytes` on the pointer to
// the allocated memory and not the double pointer
nestedField.Set(reflect.New(field.FieldType.Elem()))
fieldInterface = nestedField.Interface()
}
fieldSetBytes, ok := fieldInterface.(SetBytesInterface)
if !ok {
return fmt.Errorf("field does not satisfy the `SetBytes([]byte)` interface: %T", fieldInterface)
}
fieldSetBytes.SetBytes(b)
field.ReflectValueOf(ctx, dst).Set(fieldValue.Elem())
return nil
}
func (BytesSerializer) Value(ctx context.Context, field *schema.Field, dst reflect.Value, fieldValue interface{}) (interface{}, error) {
if fieldValue == nil || (field.FieldType.Kind() == reflect.Pointer && reflect.ValueOf(fieldValue).IsNil()) {
return nil, nil
}
fieldBytes, ok := fieldValue.(BytesInterface)
if !ok {
return nil, fmt.Errorf("field does not satisfy the `Bytes() []byte` interface")
}
hexStr := hexutil.Encode(fieldBytes.Bytes())
return hexStr, nil
}
package database package serializers
import ( import (
"context" "context"
...@@ -13,38 +13,28 @@ import ( ...@@ -13,38 +13,28 @@ import (
type RLPSerializer struct{} type RLPSerializer struct{}
type RLPInterface interface {
rlp.Encoder
rlp.Decoder
}
func init() { func init() {
schema.RegisterSerializer("rlp", RLPSerializer{}) schema.RegisterSerializer("rlp", RLPSerializer{})
} }
func (RLPSerializer) Scan(ctx context.Context, field *schema.Field, dst reflect.Value, dbValue interface{}) error { func (RLPSerializer) Scan(ctx context.Context, field *schema.Field, dst reflect.Value, dbValue interface{}) error {
fieldValue := reflect.New(field.FieldType) if dbValue == nil {
if dbValue != nil { return nil
var bytes []byte }
switch v := dbValue.(type) {
case []byte: hexStr, ok := dbValue.(string)
bytes = v if !ok {
case string: return fmt.Errorf("expected hex string as the database value: %T", dbValue)
b, err := hexutil.Decode(v) }
if err != nil {
return err
}
bytes = b
default:
return fmt.Errorf("unrecognized RLP bytes: %#v", dbValue)
}
if len(bytes) > 0 { b, err := hexutil.Decode(hexStr)
err := rlp.DecodeBytes(bytes, fieldValue.Interface()) if err != nil {
if err != nil { return fmt.Errorf("failed to decode database value: %w", err)
return err }
}
} fieldValue := reflect.New(field.FieldType)
if err := rlp.DecodeBytes(b, fieldValue.Interface()); err != nil {
return fmt.Errorf("failed to decode rlp bytes: %w", err)
} }
field.ReflectValueOf(ctx, dst).Set(fieldValue.Elem()) field.ReflectValueOf(ctx, dst).Set(fieldValue.Elem())
...@@ -52,18 +42,15 @@ func (RLPSerializer) Scan(ctx context.Context, field *schema.Field, dst reflect. ...@@ -52,18 +42,15 @@ func (RLPSerializer) Scan(ctx context.Context, field *schema.Field, dst reflect.
} }
func (RLPSerializer) Value(ctx context.Context, field *schema.Field, dst reflect.Value, fieldValue interface{}) (interface{}, error) { func (RLPSerializer) Value(ctx context.Context, field *schema.Field, dst reflect.Value, fieldValue interface{}) (interface{}, error) {
// Even though rlp.Encode takes an interface and will error out if the passed interface does not if fieldValue == nil || (field.FieldType.Kind() == reflect.Pointer && reflect.ValueOf(fieldValue).IsNil()) {
// satisfy the interface, we check here since we also want to make sure this type satisfies the return nil, nil
// rlp.Decoder interface as well
i := reflect.TypeOf(new(RLPInterface)).Elem()
if !reflect.TypeOf(fieldValue).Implements(i) {
return nil, fmt.Errorf("%T does not satisfy RLP Encoder & Decoder interface", fieldValue)
} }
rlpBytes, err := rlp.EncodeToBytes(fieldValue) rlpBytes, err := rlp.EncodeToBytes(fieldValue)
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("failed to encode rlp bytes: %w", err)
} }
return hexutil.Bytes(rlpBytes).MarshalText() hexStr := hexutil.Encode(rlpBytes)
return hexStr, nil
} }
...@@ -93,3 +93,12 @@ func (h *RLPHeader) Header() *types.Header { ...@@ -93,3 +93,12 @@ func (h *RLPHeader) Header() *types.Header {
func (h *RLPHeader) Hash() common.Hash { func (h *RLPHeader) Hash() common.Hash {
return h.Header().Hash() return h.Header().Hash()
} }
type Bytes []byte
func (b Bytes) Bytes() []byte {
return b[:]
}
func (b *Bytes) SetBytes(bytes []byte) {
*b = bytes
}
package main
import (
"bytes"
"compress/flate"
"compress/gzip"
"encoding/json"
"errors"
"fmt"
"os"
"path/filepath"
opservice "github.com/ethereum-optimism/optimism/op-service"
"github.com/ethereum-optimism/optimism/op-service/jsonutil"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
"github.com/mattn/go-isatty"
"github.com/urfave/cli/v2"
)
const EnvPrefix = "OP_CHAIN_OPS_REGISTRY_DATA"
var (
L2GenesisFlag = &cli.PathFlag{
Name: "l2-genesis",
Value: "genesis.json",
Usage: "Path to genesis json (go-ethereum format)",
EnvVars: opservice.PrefixEnvVar(EnvPrefix, "L2_GENESIS"),
}
L2GenesisHeaderFlag = &cli.PathFlag{
Name: "l2-genesis-header",
Value: "genesis-header.json",
Usage: "Alternative to l2-genesis flag, if genesis-state is omitted. Path to block header at genesis",
EnvVars: opservice.PrefixEnvVar(EnvPrefix, "L2_GENESIS_HEADER"),
}
BytecodesDirFlag = &cli.PathFlag{
Name: "bytecodes-dir",
Value: "superchain-registry/superchain/bytecodes",
Usage: "Collection of gzipped L2 bytecodes",
EnvVars: opservice.PrefixEnvVar(EnvPrefix, "BYTECODES_DIR"),
}
OutputFlag = &cli.PathFlag{
Name: "output",
Value: "out.json.gz",
Usage: "output gzipped JSON file path to write to",
EnvVars: opservice.PrefixEnvVar(EnvPrefix, "OUTPUT"),
}
)
func main() {
log.Root().SetHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(isatty.IsTerminal(os.Stderr.Fd()))))
app := &cli.App{
Name: "registry-genesis",
Usage: "Prepare superchain-registry genesis data files based on full genesis dump",
Flags: []cli.Flag{
L2GenesisFlag,
L2GenesisHeaderFlag,
BytecodesDirFlag,
OutputFlag,
},
Action: entrypoint,
}
if err := app.Run(os.Args); err != nil {
log.Crit("error while generating registry data", "err", err)
}
}
type GenesisAccount struct {
CodeHash common.Hash `json:"codeHash,omitempty"`
Storage jsonutil.LazySortedJsonMap[common.Hash, common.Hash] `json:"storage,omitempty"`
Balance *hexutil.Big `json:"balance,omitempty"`
Nonce uint64 `json:"nonce,omitempty"`
}
type Genesis struct {
Nonce uint64 `json:"nonce"`
Timestamp uint64 `json:"timestamp"`
ExtraData []byte `json:"extraData"`
GasLimit uint64 `json:"gasLimit"`
Difficulty *hexutil.Big `json:"difficulty"`
Mixhash common.Hash `json:"mixHash"`
Coinbase common.Address `json:"coinbase"`
Number uint64 `json:"number"`
GasUsed uint64 `json:"gasUsed"`
ParentHash common.Hash `json:"parentHash"`
BaseFee *hexutil.Big `json:"baseFeePerGas"`
Alloc jsonutil.LazySortedJsonMap[common.Address, GenesisAccount] `json:"alloc"`
// For genesis definitions without full state (OP-Mainnet, OP-Goerli)
StateHash *common.Hash `json:"stateHash,omitempty"`
}
func loadJSON[X any](inputPath string) (*X, error) {
if inputPath == "" {
return nil, errors.New("no path specified")
}
f, err := os.OpenFile(inputPath, os.O_RDONLY, 0)
if err != nil {
return nil, fmt.Errorf("failed to open file %q: %w", inputPath, err)
}
defer f.Close()
var obj X
if err := json.NewDecoder(f).Decode(&obj); err != nil {
return nil, fmt.Errorf("failed to decode file %q: %w", inputPath, err)
}
return &obj, nil
}
func writeGzipJSON(outputPath string, value any) error {
f, err := os.OpenFile(outputPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755)
if err != nil {
return fmt.Errorf("failed to open output file: %w", err)
}
defer f.Close()
w, err := gzip.NewWriterLevel(f, flate.BestCompression)
if err != nil {
return fmt.Errorf("failed to create gzip writer: %w", err)
}
defer w.Close()
enc := json.NewEncoder(w)
if err := enc.Encode(value); err != nil {
return fmt.Errorf("failed to encode to JSON: %w", err)
}
return nil
}
func entrypoint(ctx *cli.Context) error {
genesisPath := ctx.Path(L2GenesisFlag.Name)
if genesisPath == "" {
// When the genesis-state is too large, or not meant to be available, only the header data is made available.
// This allows the user to verify the header-chain starting from genesis, and state-sync the latest state,
// skipping the historical state.
// Archive nodes that depend on this historical state should instantiate the chain from a full genesis dump
// with allocation data, or datadir.
genesisHeaderPath := ctx.Path(L2GenesisHeaderFlag.Name)
genesisHeader, err := loadJSON[types.Header](genesisHeaderPath)
if err != nil {
return fmt.Errorf("genesis-header %q failed to load: %w", genesisHeaderPath, err)
}
if genesisHeader.TxHash != types.EmptyTxsHash {
return errors.New("genesis-header based genesis must have no transactions")
}
if genesisHeader.ReceiptHash != types.EmptyReceiptsHash {
return errors.New("genesis-header based genesis must have no receipts")
}
if genesisHeader.UncleHash != types.EmptyUncleHash {
return errors.New("genesis-header based genesis must have no uncle hashes")
}
if genesisHeader.WithdrawalsHash != nil && *genesisHeader.WithdrawalsHash != types.EmptyWithdrawalsHash {
return errors.New("genesis-header based genesis must have no withdrawals")
}
out := Genesis{
Nonce: genesisHeader.Nonce.Uint64(),
Timestamp: genesisHeader.Time,
ExtraData: genesisHeader.Extra,
GasLimit: genesisHeader.GasLimit,
Difficulty: (*hexutil.Big)(genesisHeader.Difficulty),
Mixhash: genesisHeader.MixDigest,
Coinbase: genesisHeader.Coinbase,
Number: genesisHeader.Number.Uint64(),
GasUsed: genesisHeader.GasUsed,
ParentHash: genesisHeader.ParentHash,
BaseFee: (*hexutil.Big)(genesisHeader.BaseFee),
Alloc: make(jsonutil.LazySortedJsonMap[common.Address, GenesisAccount]),
StateHash: &genesisHeader.Root,
}
if err := writeGzipJSON(ctx.Path(OutputFlag.Name), out); err != nil {
return fmt.Errorf("failed to write output: %w", err)
}
return nil
}
genesis, err := loadJSON[core.Genesis](genesisPath)
if err != nil {
return fmt.Errorf("failed to load L2 genesis: %w", err)
}
// export all contract bytecodes, write them to bytecodes collection
bytecodesDir := ctx.Path(BytecodesDirFlag.Name)
if err := os.MkdirAll(bytecodesDir, 0755); err != nil {
return fmt.Errorf("failed to make bytecodes dir: %w", err)
}
for addr, account := range genesis.Alloc {
if len(account.Code) > 0 {
codeHash := crypto.Keccak256Hash(account.Code)
name := filepath.Join(bytecodesDir, fmt.Sprintf("%s.bin.gz", codeHash))
_, err := os.Stat(name)
if err != nil {
if os.IsNotExist(err) {
var buf bytes.Buffer
w, err := gzip.NewWriterLevel(&buf, 9)
if err != nil {
return fmt.Errorf("failed to construct gzip writer for bytecode %s: %w", codeHash, err)
}
if _, err := w.Write(account.Code); err != nil {
return fmt.Errorf("failed to write bytecode %s to gzip writer: %w", codeHash, err)
}
if err := w.Close(); err != nil {
return fmt.Errorf("failed to close gzip writer: %w", err)
}
// new bytecode
if err := os.WriteFile(name, buf.Bytes(), 0755); err != nil {
return fmt.Errorf("failed to write bytecode %s of account %s: %w", codeHash, addr, err)
}
} else {
return fmt.Errorf("failed to check for pre-existing bytecode %s for address %s: %w", codeHash, addr, err)
}
} // else: already exists
}
}
// convert into allocation data
out := Genesis{
Nonce: genesis.Nonce,
Timestamp: genesis.Timestamp,
ExtraData: genesis.ExtraData,
GasLimit: genesis.GasLimit,
Difficulty: (*hexutil.Big)(genesis.Difficulty),
Mixhash: genesis.Mixhash,
Coinbase: genesis.Coinbase,
Number: genesis.Number,
GasUsed: genesis.GasUsed,
ParentHash: genesis.ParentHash,
BaseFee: (*hexutil.Big)(genesis.BaseFee),
Alloc: make(jsonutil.LazySortedJsonMap[common.Address, GenesisAccount]),
}
// write genesis, but only reference code by code-hash, and don't encode the L2 predeploys to save space.
for addr, account := range genesis.Alloc {
var codeHash common.Hash
if len(account.Code) > 0 {
codeHash = crypto.Keccak256Hash(account.Code)
}
outAcc := GenesisAccount{
CodeHash: codeHash,
Nonce: account.Nonce,
}
if account.Balance != nil && account.Balance.Cmp(common.Big0) != 0 {
outAcc.Balance = (*hexutil.Big)(account.Balance)
}
if len(account.Storage) > 0 {
outAcc.Storage = make(jsonutil.LazySortedJsonMap[common.Hash, common.Hash])
for k, v := range account.Storage {
outAcc.Storage[k] = v
}
}
out.Alloc[addr] = outAcc
}
// write genesis alloc
if err := writeGzipJSON(ctx.Path(OutputFlag.Name), out); err != nil {
return fmt.Errorf("failed to write output: %w", err)
}
return nil
}
...@@ -15,12 +15,14 @@ import ( ...@@ -15,12 +15,14 @@ import (
"github.com/ethereum-optimism/optimism/op-challenger/fault/alphabet" "github.com/ethereum-optimism/optimism/op-challenger/fault/alphabet"
"github.com/ethereum-optimism/optimism/op-challenger/fault/cannon" "github.com/ethereum-optimism/optimism/op-challenger/fault/cannon"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
"github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-node/rollup"
"github.com/ethereum-optimism/optimism/op-node/testlog" "github.com/ethereum-optimism/optimism/op-node/testlog"
"github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
...@@ -106,14 +108,9 @@ func (h *FactoryHelper) StartAlphabetGame(ctx context.Context, claimedAlphabet s ...@@ -106,14 +108,9 @@ func (h *FactoryHelper) StartAlphabetGame(ctx context.Context, claimedAlphabet s
extraData := make([]byte, 64) extraData := make([]byte, 64)
binary.BigEndian.PutUint64(extraData[24:], l2BlockNumber) binary.BigEndian.PutUint64(extraData[24:], l2BlockNumber)
binary.BigEndian.PutUint64(extraData[56:], l1Head.Uint64()) binary.BigEndian.PutUint64(extraData[56:], l1Head.Uint64())
h.opts.NoSend = true tx, err := transactions.PadGasEstimate(h.opts, 2, func(opts *bind.TransactOpts) (*types.Transaction, error) {
tx, err := h.factory.Create(h.opts, alphabetGameType, rootClaim, extraData) return h.factory.Create(opts, alphabetGameType, rootClaim, extraData)
h.require.NoError(err, "create fault dispute game (estimate gas)") })
// Now send with increased gas. This provides a buffer if the output oracle search is now more expensive
h.opts.NoSend = false
h.opts.GasLimit = tx.Gas() * 2
tx, err = h.factory.Create(h.opts, alphabetGameType, rootClaim, extraData)
h.require.NoError(err, "create fault dispute game") h.require.NoError(err, "create fault dispute game")
h.opts.GasLimit = 0 h.opts.GasLimit = 0
rcpt, err := wait.ForReceiptOK(ctx, h.client, tx.Hash()) rcpt, err := wait.ForReceiptOK(ctx, h.client, tx.Hash())
...@@ -199,16 +196,10 @@ func (h *FactoryHelper) createCannonGame(ctx context.Context, l2BlockNumber uint ...@@ -199,16 +196,10 @@ func (h *FactoryHelper) createCannonGame(ctx context.Context, l2BlockNumber uint
extraData := make([]byte, 64) extraData := make([]byte, 64)
binary.BigEndian.PutUint64(extraData[24:], l2BlockNumber) binary.BigEndian.PutUint64(extraData[24:], l2BlockNumber)
binary.BigEndian.PutUint64(extraData[56:], l1Head.Uint64()) binary.BigEndian.PutUint64(extraData[56:], l1Head.Uint64())
h.opts.NoSend = true tx, err := transactions.PadGasEstimate(h.opts, 2, func(opts *bind.TransactOpts) (*types.Transaction, error) {
tx, err := h.factory.Create(h.opts, cannonGameType, rootClaim, extraData) return h.factory.Create(opts, cannonGameType, rootClaim, extraData)
h.require.NoError(err, "create fault dispute game (estimate gas)") })
// Now send with increased gas. This provides a buffer if the output oracle search is now more expensive
h.opts.NoSend = false
h.opts.GasLimit = tx.Gas() * 2
tx, err = h.factory.Create(h.opts, cannonGameType, rootClaim, extraData)
h.require.NoError(err, "create fault dispute game") h.require.NoError(err, "create fault dispute game")
h.opts.GasLimit = 0
rcpt, err := wait.ForReceiptOK(ctx, h.client, tx.Hash()) rcpt, err := wait.ForReceiptOK(ctx, h.client, tx.Hash())
h.require.NoError(err, "wait for create fault dispute game receipt to be OK") h.require.NoError(err, "wait for create fault dispute game receipt to be OK")
h.require.Len(rcpt.Logs, 1, "should have emitted a single DisputeGameCreated event") h.require.Len(rcpt.Logs, 1, "should have emitted a single DisputeGameCreated event")
......
package transactions
import (
"fmt"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/core/types"
)
// TxBuilder creates and sends a transaction using the supplied bind.TransactOpts.
// Returns the created transaction and any error reported.
type TxBuilder func(opts *bind.TransactOpts) (*types.Transaction, error)
// PadGasEstimate multiplies the gas estimate for a transaction by the specified paddingFactor before sending the
// actual transaction. Useful for cases where the gas required is variable.
// The builder will be invoked twice, first with NoSend=true to estimate the gas and the second time with
// NoSend=false and GasLimit including the requested padding.
func PadGasEstimate(opts *bind.TransactOpts, paddingFactor float64, builder TxBuilder) (*types.Transaction, error) {
// Take a copy of the opts to avoid mutating the original
o := *opts
o.NoSend = true
tx, err := builder(&o)
if err != nil {
return nil, fmt.Errorf("failed to estimate gas: %w", err)
}
gas := float64(tx.Gas()) * paddingFactor
o.GasLimit = uint64(gas)
o.NoSend = false
return builder(&o)
}
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
"time" "time"
"github.com/ethereum-optimism/optimism/op-bindings/bindings" "github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions"
"github.com/ethereum-optimism/optimism/op-node/rollup/derive" "github.com/ethereum-optimism/optimism/op-node/rollup/derive"
"github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
...@@ -29,19 +30,12 @@ func SendDepositTx(t *testing.T, cfg SystemConfig, l1Client *ethclient.Client, l ...@@ -29,19 +30,12 @@ func SendDepositTx(t *testing.T, cfg SystemConfig, l1Client *ethclient.Client, l
require.Nil(t, err) require.Nil(t, err)
// Finally send TX // Finally send TX
l1Opts.NoSend = true
tx, err := depositContract.DepositTransaction(l1Opts, l2Opts.ToAddr, l2Opts.Value, l2Opts.GasLimit, l2Opts.IsCreation, l2Opts.Data)
require.Nil(t, err, "with deposit tx")
l1Opts.NoSend = false
// Add 10% padding for the L1 gas limit because the estimation process can be affected by the 1559 style cost scale // Add 10% padding for the L1 gas limit because the estimation process can be affected by the 1559 style cost scale
// for buying L2 gas in the portal contracts. // for buying L2 gas in the portal contracts.
l1Opts.GasLimit = tx.Gas() + (tx.Gas() / 10) tx, err := transactions.PadGasEstimate(l1Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) {
return depositContract.DepositTransaction(opts, l2Opts.ToAddr, l2Opts.Value, l2Opts.GasLimit, l2Opts.IsCreation, l2Opts.Data)
// Now resend with gas specified })
tx, err = depositContract.DepositTransaction(l1Opts, l2Opts.ToAddr, l2Opts.Value, l2Opts.GasLimit, l2Opts.IsCreation, l2Opts.Data)
require.Nil(t, err, "with deposit tx") require.Nil(t, err, "with deposit tx")
l1Opts.GasLimit = 0
// Wait for transaction on L1 // Wait for transaction on L1
receipt, err := waitForTransaction(tx.Hash(), l1Client, 10*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) receipt, err := waitForTransaction(tx.Hash(), l1Client, 10*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second)
......
...@@ -50,7 +50,8 @@ var ( ...@@ -50,7 +50,8 @@ var (
// Banning Flag - whether or not we want to act on the scoring // Banning Flag - whether or not we want to act on the scoring
Banning = &cli.BoolFlag{ Banning = &cli.BoolFlag{
Name: "p2p.ban.peers", Name: "p2p.ban.peers",
Usage: "Enables peer banning. This should ONLY be enabled once certain peer scoring is working correctly.", Usage: "Enables peer banning.",
Value: true,
Required: false, Required: false,
EnvVars: p2pEnv("PEER_BANNING"), EnvVars: p2pEnv("PEER_BANNING"),
} }
......
package jsonutil
import (
"encoding/json"
"fmt"
"sort"
)
// LazySortedJsonMap provides sorted encoding order for JSON maps.
// The sorting is lazy: in-memory it's just a map, until it sorts just-in-time when the map is encoded to JSON.
// Warning: the just-in-time sorting requires a full allocation of the map structure and keys slice during encoding.
// Sorting order is not enforced when decoding from JSON.
type LazySortedJsonMap[K comparable, V any] map[K]V
func (m LazySortedJsonMap[K, V]) MarshalJSON() ([]byte, error) {
keys := make([]string, 0, len(m))
values := make(map[string]V)
for k, v := range m {
s := fmt.Sprintf("%q", any(k)) // format as quoted string
keys = append(keys, s)
values[s] = v
}
sort.Strings(keys)
var out []byte
out = append(out, '{')
for i, k := range keys {
out = append(out, k...) // quotes are already included
out = append(out, ':')
v, err := json.Marshal(values[k])
if err != nil {
return nil, fmt.Errorf("failed to encode value of %s: %w", k, err)
}
out = append(out, v...)
if i != len(keys)-1 {
out = append(out, ',')
}
}
out = append(out, '}')
return out, nil
}
func (m *LazySortedJsonMap[K, V]) UnmarshalJSON(data []byte) error {
return json.Unmarshal(data, (*map[K]V)(m))
}
package jsonutil
import (
"encoding/json"
"fmt"
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/require"
)
type LazySortedJsonMapTestCase[K comparable, V any] struct {
Object LazySortedJsonMap[K, V]
Json string
}
func (tc *LazySortedJsonMapTestCase[K, V]) Run(t *testing.T) {
t.Run("Marshal", func(t *testing.T) {
got, err := json.Marshal(tc.Object)
require.NoError(t, err)
require.Equal(t, tc.Json, string(got), "json output must match")
})
t.Run("Unmarshal", func(t *testing.T) {
var dest LazySortedJsonMap[K, V]
err := json.Unmarshal([]byte(tc.Json), &dest)
require.NoError(t, err)
require.Equal(t, len(tc.Object), len(dest), "lengths match")
for k, v := range tc.Object {
require.Equal(t, v, dest[k], "values of %q match", k)
}
})
}
func TestLazySortedJsonMap(t *testing.T) {
testCases := []interface{ Run(t *testing.T) }{
&LazySortedJsonMapTestCase[string, int]{Object: LazySortedJsonMap[string, int]{}, Json: `{}`},
&LazySortedJsonMapTestCase[string, int]{Object: LazySortedJsonMap[string, int]{"a": 1, "c": 2, "b": 3}, Json: `{"a":1,"b":3,"c":2}`},
&LazySortedJsonMapTestCase[common.Address, int]{Object: LazySortedJsonMap[common.Address, int]{
common.HexToAddress("0x4100000000000000000000000000000000000000"): 123,
common.HexToAddress("0x4200000000000000000000000000000000000000"): 100,
common.HexToAddress("0x4200000000000000000000000000000000000001"): 100,
},
Json: `{"0x4100000000000000000000000000000000000000":123,` +
`"0x4200000000000000000000000000000000000000":100,` +
`"0x4200000000000000000000000000000000000001":100}`},
}
for i, tc := range testCases {
t.Run(fmt.Sprintf("case %d", i), tc.Run)
}
}
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
"markdownlint-cli2": "0.4.0", "markdownlint-cli2": "0.4.0",
"mkdirp": "^1.0.4", "mkdirp": "^1.0.4",
"mocha": "^10.2.0", "mocha": "^10.2.0",
"nx": "16.7.1", "nx": "16.7.2",
"nyc": "^15.1.0", "nyc": "^15.1.0",
"patch-package": "^8.0.0", "patch-package": "^8.0.0",
"prettier": "^2.8.0", "prettier": "^2.8.0",
......
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
"tsup": "^7.1.0", "tsup": "^7.1.0",
"typescript": "^5.1.6", "typescript": "^5.1.6",
"vite": "^4.4.6", "vite": "^4.4.6",
"vitest": "^0.33.0" "vitest": "^0.34.2"
}, },
"peerDependencies": { "peerDependencies": {
"@wagmi/core": ">1.0.0", "@wagmi/core": ">1.0.0",
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
"typescript": "^5.1.6", "typescript": "^5.1.6",
"viem": "^1.3.1", "viem": "^1.3.1",
"vite": "^4.4.6", "vite": "^4.4.6",
"vitest": "^0.33.0" "vitest": "^0.34.2"
}, },
"peerDependencies": { "peerDependencies": {
"viem": "^0.3.30" "viem": "^0.3.30"
......
...@@ -62,10 +62,10 @@ importers: ...@@ -62,10 +62,10 @@ importers:
version: 8.3.0(eslint@8.47.0) version: 8.3.0(eslint@8.47.0)
eslint-config-standard: eslint-config-standard:
specifier: ^16.0.3 specifier: ^16.0.3
version: 16.0.3(eslint-plugin-import@2.28.0)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.47.0) version: 16.0.3(eslint-plugin-import@2.28.1)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.47.0)
eslint-plugin-import: eslint-plugin-import:
specifier: ^2.26.0 specifier: ^2.26.0
version: 2.28.0(@typescript-eslint/parser@5.60.1)(eslint@8.47.0) version: 2.28.1(@typescript-eslint/parser@5.60.1)(eslint@8.47.0)
eslint-plugin-jsdoc: eslint-plugin-jsdoc:
specifier: ^35.1.2 specifier: ^35.1.2
version: 35.5.1(eslint@8.47.0) version: 35.5.1(eslint@8.47.0)
...@@ -109,8 +109,8 @@ importers: ...@@ -109,8 +109,8 @@ importers:
specifier: ^10.2.0 specifier: ^10.2.0
version: 10.2.0 version: 10.2.0
nx: nx:
specifier: 16.7.1 specifier: 16.7.2
version: 16.7.1 version: 16.7.2
nyc: nyc:
specifier: ^15.1.0 specifier: ^15.1.0
version: 15.1.0 version: 15.1.0
...@@ -312,7 +312,7 @@ importers: ...@@ -312,7 +312,7 @@ importers:
version: 8.1.0 version: 8.1.0
'@vitest/coverage-istanbul': '@vitest/coverage-istanbul':
specifier: ^0.34.1 specifier: ^0.34.1
version: 0.34.1(vitest@0.33.0) version: 0.34.1(vitest@0.34.2)
'@wagmi/cli': '@wagmi/cli':
specifier: ^1.3.0 specifier: ^1.3.0
version: 1.3.0(@wagmi/core@1.3.8)(typescript@5.1.6)(wagmi@1.0.1) version: 1.3.0(@wagmi/core@1.3.8)(typescript@5.1.6)(wagmi@1.0.1)
...@@ -344,8 +344,8 @@ importers: ...@@ -344,8 +344,8 @@ importers:
specifier: ^4.4.6 specifier: ^4.4.6
version: 4.4.6(@types/node@12.20.20) version: 4.4.6(@types/node@12.20.20)
vitest: vitest:
specifier: ^0.33.0 specifier: ^0.34.2
version: 0.33.0(jsdom@22.1.0) version: 0.34.2(jsdom@22.1.0)
packages/core-utils: packages/core-utils:
dependencies: dependencies:
...@@ -412,7 +412,7 @@ importers: ...@@ -412,7 +412,7 @@ importers:
version: 8.0.1(react@17.0.2) version: 8.0.1(react@17.0.2)
'@vitest/coverage-istanbul': '@vitest/coverage-istanbul':
specifier: ^0.34.1 specifier: ^0.34.1
version: 0.34.1(vitest@0.33.0) version: 0.34.1(vitest@0.34.2)
abitype: abitype:
specifier: ^0.9.3 specifier: ^0.9.3
version: 0.9.3(typescript@5.1.6)(zod@3.22.1) version: 0.9.3(typescript@5.1.6)(zod@3.22.1)
...@@ -438,8 +438,8 @@ importers: ...@@ -438,8 +438,8 @@ importers:
specifier: ^4.4.6 specifier: ^4.4.6
version: 4.4.6(@types/node@12.20.20) version: 4.4.6(@types/node@12.20.20)
vitest: vitest:
specifier: ^0.33.0 specifier: ^0.34.2
version: 0.33.0(jsdom@22.1.0) version: 0.34.2(jsdom@22.1.0)
packages/sdk: packages/sdk:
dependencies: dependencies:
...@@ -527,7 +527,7 @@ importers: ...@@ -527,7 +527,7 @@ importers:
version: 1.6.0(typescript@5.1.6)(zod@3.22.1) version: 1.6.0(typescript@5.1.6)(zod@3.22.1)
vitest: vitest:
specifier: ^0.34.2 specifier: ^0.34.2
version: 0.34.2 version: 0.34.2(jsdom@22.1.0)
zod: zod:
specifier: ^3.22.1 specifier: ^3.22.1
version: 3.22.1 version: 3.22.1
...@@ -2517,7 +2517,7 @@ packages: ...@@ -2517,7 +2517,7 @@ packages:
dependencies: dependencies:
'@lerna/child-process': 7.1.5 '@lerna/child-process': 7.1.5
'@npmcli/run-script': 6.0.2 '@npmcli/run-script': 6.0.2
'@nx/devkit': 16.7.1(nx@16.7.1) '@nx/devkit': 16.7.1(nx@16.7.2)
'@octokit/plugin-enterprise-rest': 6.0.1 '@octokit/plugin-enterprise-rest': 6.0.1
'@octokit/rest': 19.0.11 '@octokit/rest': 19.0.11
byte-size: 8.1.1 byte-size: 8.1.1
...@@ -2553,7 +2553,7 @@ packages: ...@@ -2553,7 +2553,7 @@ packages:
npm-packlist: 5.1.1 npm-packlist: 5.1.1
npm-registry-fetch: 14.0.5 npm-registry-fetch: 14.0.5
npmlog: 6.0.2 npmlog: 6.0.2
nx: 16.7.1 nx: 16.7.2
p-map: 4.0.0 p-map: 4.0.0
p-map-series: 2.1.0 p-map-series: 2.1.0
p-queue: 6.6.2 p-queue: 6.6.2
...@@ -2838,10 +2838,10 @@ packages: ...@@ -2838,10 +2838,10 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@nrwl/devkit@16.7.1(nx@16.7.1): /@nrwl/devkit@16.7.1(nx@16.7.2):
resolution: {integrity: sha512-ysAgNju6o7QjG/ZHW0wIRJ8yWxjhErjqQ8GZ2Smqsb1myrr6UbYsuxaXjoOHI56fMmGyNPK04zzyNXXWQw/UAA==} resolution: {integrity: sha512-ysAgNju6o7QjG/ZHW0wIRJ8yWxjhErjqQ8GZ2Smqsb1myrr6UbYsuxaXjoOHI56fMmGyNPK04zzyNXXWQw/UAA==}
dependencies: dependencies:
'@nx/devkit': 16.7.1(nx@16.7.1) '@nx/devkit': 16.7.1(nx@16.7.2)
transitivePeerDependencies: transitivePeerDependencies:
- nx - nx
dev: true dev: true
...@@ -2854,11 +2854,11 @@ packages: ...@@ -2854,11 +2854,11 @@ packages:
- debug - debug
dev: true dev: true
/@nrwl/tao@16.7.1: /@nrwl/tao@16.7.2:
resolution: {integrity: sha512-oIjph3gm+FOB8mB2OTfCejQykpY+LGKdrGe5RpO3fBZzrkADHTdRWhaqaxktmGcRRt1AwMBofEv3mH4+VUOa/g==} resolution: {integrity: sha512-4Wc3ic5VtZL3t4qqCMJlEad/wWuFxNUX78U5ohEStN3UFFJIjwJJpKZYZDtxhaOLWUdXbk6CI3KfSIpWgwPdbQ==}
hasBin: true hasBin: true
dependencies: dependencies:
nx: 16.7.1 nx: 16.7.2
tslib: 2.6.0 tslib: 2.6.0
transitivePeerDependencies: transitivePeerDependencies:
- '@swc-node/register' - '@swc-node/register'
...@@ -2866,23 +2866,23 @@ packages: ...@@ -2866,23 +2866,23 @@ packages:
- debug - debug
dev: true dev: true
/@nx/devkit@16.7.1(nx@16.7.1): /@nx/devkit@16.7.1(nx@16.7.2):
resolution: {integrity: sha512-PASQGd1YhcAA/hpupCsSakP71Qh1pYle4dtF+wh3KDe2kdeM6BgccClapiGcXAI46JKLUGAbNYJ8pg7GEPY5Nw==} resolution: {integrity: sha512-PASQGd1YhcAA/hpupCsSakP71Qh1pYle4dtF+wh3KDe2kdeM6BgccClapiGcXAI46JKLUGAbNYJ8pg7GEPY5Nw==}
peerDependencies: peerDependencies:
nx: '>= 15 <= 17' nx: '>= 15 <= 17'
dependencies: dependencies:
'@nrwl/devkit': 16.7.1(nx@16.7.1) '@nrwl/devkit': 16.7.1(nx@16.7.2)
ejs: 3.1.9 ejs: 3.1.9
enquirer: 2.3.6 enquirer: 2.3.6
ignore: 5.2.4 ignore: 5.2.4
nx: 16.7.1 nx: 16.7.2
semver: 7.5.3 semver: 7.5.3
tmp: 0.2.1 tmp: 0.2.1
tslib: 2.6.0 tslib: 2.6.0
dev: true dev: true
/@nx/nx-darwin-arm64@16.7.1: /@nx/nx-darwin-arm64@16.7.2:
resolution: {integrity: sha512-g9N0eOYyirOnVZdpzsmby2VX2ovL/QBzjvT5OlLteKE4XmvksgSjQAhQeUUNY772AW6HoIK5MVxS2Jg3PECatQ==} resolution: {integrity: sha512-dkTHAzOTbqRHUQtnw7knEJq4ll6hew11u+9B0fThs9gC/X0iPK0eDXD4TqbIKEbcWAsxpuGiWPzGoNPo7Gwl9A==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
...@@ -2890,8 +2890,8 @@ packages: ...@@ -2890,8 +2890,8 @@ packages:
dev: true dev: true
optional: true optional: true
/@nx/nx-darwin-x64@16.7.1: /@nx/nx-darwin-x64@16.7.2:
resolution: {integrity: sha512-ZoV4J4pR6z7YtBJoxrdNJTYJmjY653iA2M31PZL/WaS/3SHfzf4YYsnbLK5sF6GJI9n0XmOh3mPPHoJMYbQPIQ==} resolution: {integrity: sha512-EKhjX7DCRIA5U8yAxIgGXeIFaq1dhgLJy8OAG4n1Ud8c21px+bBSrcZvv0ww5VoEulhggQ+c6fW1cjKtGgLknQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
...@@ -2899,8 +2899,8 @@ packages: ...@@ -2899,8 +2899,8 @@ packages:
dev: true dev: true
optional: true optional: true
/@nx/nx-freebsd-x64@16.7.1: /@nx/nx-freebsd-x64@16.7.2:
resolution: {integrity: sha512-vpAi4FHtNwcBIjkRf86Oa98r09oN5OirCXT7cInvwCZWRMVUxT5WHs6gEMY1lvMlnTWqAVdWPcec5VipI9EhQA==} resolution: {integrity: sha512-3QhXZq0wxvi4lg1MJqwq72F7PE/d0Hcl3uwheenYQtwUvAFAmijC/Z4AVPSqbKJ+QaoqASnXRim9z3EIfeD+DQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
...@@ -2908,8 +2908,8 @@ packages: ...@@ -2908,8 +2908,8 @@ packages:
dev: true dev: true
optional: true optional: true
/@nx/nx-linux-arm-gnueabihf@16.7.1: /@nx/nx-linux-arm-gnueabihf@16.7.2:
resolution: {integrity: sha512-In9qaTpUPsle1jf20lBV/c0WrfSo4Qy64OleweZwIea3RW1TsQg4xxORoULtkU+6KB85XOb5Xd5G/zXpLRMykw==} resolution: {integrity: sha512-7bny8NvE9iyfwRfq9/mOZjzMNWthT70Ce1N9suB2zdbgbLUEDPQQhBNbg969yT6/LbWMWuWZXeIbz/Fwndf9zA==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
...@@ -2917,8 +2917,8 @@ packages: ...@@ -2917,8 +2917,8 @@ packages:
dev: true dev: true
optional: true optional: true
/@nx/nx-linux-arm64-gnu@16.7.1: /@nx/nx-linux-arm64-gnu@16.7.2:
resolution: {integrity: sha512-+RXFQqGl5SLrcFl0zKAZOZ4pgA3yhXZnI2xYnuhlPOvuNT4Flc6cdPPz12uKhkWIg0nEBnbvsLDyD1PXDNxKJg==} resolution: {integrity: sha512-+UdeFB1HY/3GU2+mflydFWpztghFRQiVzJV6MTcjtOzE3jfgXzz9TP580pDxozTvNSRPlblH07X+iB8DhVcB9w==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
...@@ -2926,8 +2926,8 @@ packages: ...@@ -2926,8 +2926,8 @@ packages:
dev: true dev: true
optional: true optional: true
/@nx/nx-linux-arm64-musl@16.7.1: /@nx/nx-linux-arm64-musl@16.7.2:
resolution: {integrity: sha512-DiJ6Vpq9w2vaE9JgQs9M7K04QF75jAcqpuSlo25TYGU/GLiSZM6QpiAzsXhwZwFHfUjv0mL3iTmAcBmO1z9PBw==} resolution: {integrity: sha512-YfkWu+4GKXageuYiH5a77gIDAXnit5SIyfI+RWe/j04uFy171KnUt167DC417fv/fTGxeXY1tzOu112Y+x5ixw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
...@@ -2935,8 +2935,8 @@ packages: ...@@ -2935,8 +2935,8 @@ packages:
dev: true dev: true
optional: true optional: true
/@nx/nx-linux-x64-gnu@16.7.1: /@nx/nx-linux-x64-gnu@16.7.2:
resolution: {integrity: sha512-fc/2whXm4ao91LFQ5++2rgYeTIitQKXkfTrHLKLuMynou2Qd+jMUZVcVk+avaHVPKKu6ALbCUQ0YSTGdEfEx3Q==} resolution: {integrity: sha512-/TtSa2rHR+1gNuALR1yafl4fzBK2/GAhosf+skn00OgwsJ0c8ie9tuuftlMo+2n3LcXY/IaPDaD7t6fln4qsQg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
...@@ -2944,8 +2944,8 @@ packages: ...@@ -2944,8 +2944,8 @@ packages:
dev: true dev: true
optional: true optional: true
/@nx/nx-linux-x64-musl@16.7.1: /@nx/nx-linux-x64-musl@16.7.2:
resolution: {integrity: sha512-3CzyUg5+/q83g/Pln71HPdkfjpU3dIBriiyuvJan8LwjKuhAdTFubAmu3CUp3ht1gZOdnwBQW1cdG1vx9EuBww==} resolution: {integrity: sha512-VC638hxdWSA8VTDU9rAXjr60mmMP3ZyCUbSkJ+8ydEe83StMDY3PAXS5Hw3n/ouxDfCF9r1kWIGFe4g+emvfBw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
...@@ -2953,8 +2953,8 @@ packages: ...@@ -2953,8 +2953,8 @@ packages:
dev: true dev: true
optional: true optional: true
/@nx/nx-win32-arm64-msvc@16.7.1: /@nx/nx-win32-arm64-msvc@16.7.2:
resolution: {integrity: sha512-1uhQGwWEa76jQyEVohcB4g4H5Wn4YNLx49eJe1SHLwMgbPZZZ5PgnSzwECu+I9E/ZCRaCJk2sHiuRGxDa29Dzg==} resolution: {integrity: sha512-sSUqgANLgQFFzKTvyMczh5D6xiqTQnB8daJTLX+QUCv5vO5+ZSwuVDyNfr6g/HV2+ak0M9/wVQUae11TgUIPYw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
...@@ -2962,8 +2962,8 @@ packages: ...@@ -2962,8 +2962,8 @@ packages:
dev: true dev: true
optional: true optional: true
/@nx/nx-win32-x64-msvc@16.7.1: /@nx/nx-win32-x64-msvc@16.7.2:
resolution: {integrity: sha512-DLyME4yJKVhNTMgR3gDx7wVQ6ov6d9j2inGbTwoGoigMvzdaSqeoceMR5CSLOAeq9YBnH8FCbugTccg0iyZtvw==} resolution: {integrity: sha512-+n01cT9/P3o95x+FlRWYf9sFZ29ooxYD/WLcmxACeXN0V1bdbnZxKVSuJqrXZhmpHe7P+/+IRmniv9cdpkxz7g==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
...@@ -4526,7 +4526,7 @@ packages: ...@@ -4526,7 +4526,7 @@ packages:
resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==}
dev: true dev: true
/@vitest/coverage-istanbul@0.34.1(vitest@0.33.0): /@vitest/coverage-istanbul@0.34.1(vitest@0.34.1):
resolution: {integrity: sha512-5GprlyY2t1g6+RrssWcN/w5RnZV3qIOM0eoaSDJw3jXbHpBpMvAfTg791zXo7PIqNYs5ORUqBWXIIU0gyAfZxA==} resolution: {integrity: sha512-5GprlyY2t1g6+RrssWcN/w5RnZV3qIOM0eoaSDJw3jXbHpBpMvAfTg791zXo7PIqNYs5ORUqBWXIIU0gyAfZxA==}
peerDependencies: peerDependencies:
vitest: '>=0.32.0 <1' vitest: '>=0.32.0 <1'
...@@ -4537,12 +4537,12 @@ packages: ...@@ -4537,12 +4537,12 @@ packages:
istanbul-lib-source-maps: 4.0.1 istanbul-lib-source-maps: 4.0.1
istanbul-reports: 3.1.5 istanbul-reports: 3.1.5
test-exclude: 6.0.0 test-exclude: 6.0.0
vitest: 0.33.0(jsdom@22.1.0) vitest: 0.34.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
/@vitest/coverage-istanbul@0.34.1(vitest@0.34.1): /@vitest/coverage-istanbul@0.34.1(vitest@0.34.2):
resolution: {integrity: sha512-5GprlyY2t1g6+RrssWcN/w5RnZV3qIOM0eoaSDJw3jXbHpBpMvAfTg791zXo7PIqNYs5ORUqBWXIIU0gyAfZxA==} resolution: {integrity: sha512-5GprlyY2t1g6+RrssWcN/w5RnZV3qIOM0eoaSDJw3jXbHpBpMvAfTg791zXo7PIqNYs5ORUqBWXIIU0gyAfZxA==}
peerDependencies: peerDependencies:
vitest: '>=0.32.0 <1' vitest: '>=0.32.0 <1'
...@@ -4553,19 +4553,11 @@ packages: ...@@ -4553,19 +4553,11 @@ packages:
istanbul-lib-source-maps: 4.0.1 istanbul-lib-source-maps: 4.0.1
istanbul-reports: 3.1.5 istanbul-reports: 3.1.5
test-exclude: 6.0.0 test-exclude: 6.0.0
vitest: 0.34.1 vitest: 0.34.2(jsdom@22.1.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
/@vitest/expect@0.33.0:
resolution: {integrity: sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==}
dependencies:
'@vitest/spy': 0.33.0
'@vitest/utils': 0.33.0
chai: 4.3.7
dev: true
/@vitest/expect@0.34.1: /@vitest/expect@0.34.1:
resolution: {integrity: sha512-q2CD8+XIsQ+tHwypnoCk8Mnv5e6afLFvinVGCq3/BOT4kQdVQmY6rRfyKkwcg635lbliLPqbunXZr+L1ssUWiQ==} resolution: {integrity: sha512-q2CD8+XIsQ+tHwypnoCk8Mnv5e6afLFvinVGCq3/BOT4kQdVQmY6rRfyKkwcg635lbliLPqbunXZr+L1ssUWiQ==}
dependencies: dependencies:
...@@ -4582,14 +4574,6 @@ packages: ...@@ -4582,14 +4574,6 @@ packages:
chai: 4.3.7 chai: 4.3.7
dev: true dev: true
/@vitest/runner@0.33.0:
resolution: {integrity: sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==}
dependencies:
'@vitest/utils': 0.33.0
p-limit: 4.0.0
pathe: 1.1.1
dev: true
/@vitest/runner@0.34.1: /@vitest/runner@0.34.1:
resolution: {integrity: sha512-YfQMpYzDsYB7yqgmlxZ06NI4LurHWfrH7Wy3Pvf/z/vwUSgq1zLAb1lWcItCzQG+NVox+VvzlKQrYEXb47645g==} resolution: {integrity: sha512-YfQMpYzDsYB7yqgmlxZ06NI4LurHWfrH7Wy3Pvf/z/vwUSgq1zLAb1lWcItCzQG+NVox+VvzlKQrYEXb47645g==}
dependencies: dependencies:
...@@ -4606,14 +4590,6 @@ packages: ...@@ -4606,14 +4590,6 @@ packages:
pathe: 1.1.1 pathe: 1.1.1
dev: true dev: true
/@vitest/snapshot@0.33.0:
resolution: {integrity: sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==}
dependencies:
magic-string: 0.30.1
pathe: 1.1.1
pretty-format: 29.6.1
dev: true
/@vitest/snapshot@0.34.1: /@vitest/snapshot@0.34.1:
resolution: {integrity: sha512-0O9LfLU0114OqdF8lENlrLsnn024Tb1CsS9UwG0YMWY2oGTQfPtkW+B/7ieyv0X9R2Oijhi3caB1xgGgEgclSQ==} resolution: {integrity: sha512-0O9LfLU0114OqdF8lENlrLsnn024Tb1CsS9UwG0YMWY2oGTQfPtkW+B/7ieyv0X9R2Oijhi3caB1xgGgEgclSQ==}
dependencies: dependencies:
...@@ -4630,12 +4606,6 @@ packages: ...@@ -4630,12 +4606,6 @@ packages:
pretty-format: 29.6.1 pretty-format: 29.6.1
dev: true dev: true
/@vitest/spy@0.33.0:
resolution: {integrity: sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==}
dependencies:
tinyspy: 2.1.1
dev: true
/@vitest/spy@0.34.1: /@vitest/spy@0.34.1:
resolution: {integrity: sha512-UT4WcI3EAPUNO8n6y9QoEqynGGEPmmRxC+cLzneFFXpmacivjHZsNbiKD88KUScv5DCHVDgdBsLD7O7s1enFcQ==} resolution: {integrity: sha512-UT4WcI3EAPUNO8n6y9QoEqynGGEPmmRxC+cLzneFFXpmacivjHZsNbiKD88KUScv5DCHVDgdBsLD7O7s1enFcQ==}
dependencies: dependencies:
...@@ -4648,14 +4618,6 @@ packages: ...@@ -4648,14 +4618,6 @@ packages:
tinyspy: 2.1.1 tinyspy: 2.1.1
dev: true dev: true
/@vitest/utils@0.33.0:
resolution: {integrity: sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==}
dependencies:
diff-sequences: 29.4.3
loupe: 2.3.6
pretty-format: 29.6.1
dev: true
/@vitest/utils@0.34.1: /@vitest/utils@0.34.1:
resolution: {integrity: sha512-/ql9dsFi4iuEbiNcjNHQWXBum7aL8pyhxvfnD9gNtbjR9fUKAjxhj4AA3yfLXg6gJpMGGecvtF8Au2G9y3q47Q==} resolution: {integrity: sha512-/ql9dsFi4iuEbiNcjNHQWXBum7aL8pyhxvfnD9gNtbjR9fUKAjxhj4AA3yfLXg6gJpMGGecvtF8Au2G9y3q47Q==}
dependencies: dependencies:
...@@ -4794,7 +4756,7 @@ packages: ...@@ -4794,7 +4756,7 @@ packages:
picocolors: 1.0.0 picocolors: 1.0.0
prettier: 2.8.8 prettier: 2.8.8
typescript: 5.1.6 typescript: 5.1.6
viem: 1.3.1(typescript@5.1.6)(zod@3.22.0) viem: 1.6.0(typescript@5.1.6)(zod@3.22.0)
wagmi: 1.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.3.1) wagmi: 1.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(viem@1.3.1)
zod: 3.22.0 zod: 3.22.0
transitivePeerDependencies: transitivePeerDependencies:
...@@ -8061,7 +8023,7 @@ packages: ...@@ -8061,7 +8023,7 @@ packages:
eslint: 8.47.0 eslint: 8.47.0
dev: true dev: true
/eslint-config-standard@16.0.3(eslint-plugin-import@2.28.0)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.47.0): /eslint-config-standard@16.0.3(eslint-plugin-import@2.28.1)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.47.0):
resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==} resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==}
peerDependencies: peerDependencies:
eslint: ^7.12.1 eslint: ^7.12.1
...@@ -8070,7 +8032,7 @@ packages: ...@@ -8070,7 +8032,7 @@ packages:
eslint-plugin-promise: ^4.2.1 || ^5.0.0 eslint-plugin-promise: ^4.2.1 || ^5.0.0
dependencies: dependencies:
eslint: 8.47.0 eslint: 8.47.0
eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.60.1)(eslint@8.47.0) eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.60.1)(eslint@8.47.0)
eslint-plugin-node: 11.1.0(eslint@8.47.0) eslint-plugin-node: 11.1.0(eslint@8.47.0)
eslint-plugin-promise: 5.2.0(eslint@8.47.0) eslint-plugin-promise: 5.2.0(eslint@8.47.0)
dev: true dev: true
...@@ -8125,8 +8087,8 @@ packages: ...@@ -8125,8 +8087,8 @@ packages:
regexpp: 3.2.0 regexpp: 3.2.0
dev: true dev: true
/eslint-plugin-import@2.28.0(@typescript-eslint/parser@5.60.1)(eslint@8.47.0): /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.60.1)(eslint@8.47.0):
resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==}
engines: {node: '>=4'} engines: {node: '>=4'}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': '*' '@typescript-eslint/parser': '*'
...@@ -8152,7 +8114,6 @@ packages: ...@@ -8152,7 +8114,6 @@ packages:
object.fromentries: 2.0.6 object.fromentries: 2.0.6
object.groupby: 1.0.0 object.groupby: 1.0.0
object.values: 1.1.6 object.values: 1.1.6
resolve: 1.22.4
semver: 6.3.1 semver: 6.3.1
tsconfig-paths: 3.14.2 tsconfig-paths: 3.14.2
transitivePeerDependencies: transitivePeerDependencies:
...@@ -9591,7 +9552,7 @@ packages: ...@@ -9591,7 +9552,7 @@ packages:
fs-extra: 10.1.0 fs-extra: 10.1.0
match-all: 1.2.6 match-all: 1.2.6
murmur-128: 0.2.1 murmur-128: 0.2.1
qs: 6.11.0 qs: 6.11.2
zksync-web3: 0.4.0(ethers@5.7.2) zksync-web3: 0.4.0(ethers@5.7.2)
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
...@@ -10904,7 +10865,7 @@ packages: ...@@ -10904,7 +10865,7 @@ packages:
'@lerna/child-process': 7.1.5 '@lerna/child-process': 7.1.5
'@lerna/create': 7.1.5 '@lerna/create': 7.1.5
'@npmcli/run-script': 6.0.2 '@npmcli/run-script': 6.0.2
'@nx/devkit': 16.7.1(nx@16.7.1) '@nx/devkit': 16.7.1(nx@16.7.2)
'@octokit/plugin-enterprise-rest': 6.0.1 '@octokit/plugin-enterprise-rest': 6.0.1
'@octokit/rest': 19.0.11 '@octokit/rest': 19.0.11
byte-size: 8.1.1 byte-size: 8.1.1
...@@ -10947,7 +10908,7 @@ packages: ...@@ -10947,7 +10908,7 @@ packages:
npm-packlist: 5.1.1 npm-packlist: 5.1.1
npm-registry-fetch: 14.0.5 npm-registry-fetch: 14.0.5
npmlog: 6.0.2 npmlog: 6.0.2
nx: 16.7.1 nx: 16.7.2
p-map: 4.0.0 p-map: 4.0.0
p-map-series: 2.1.0 p-map-series: 2.1.0
p-pipe: 3.1.0 p-pipe: 3.1.0
...@@ -12575,8 +12536,8 @@ packages: ...@@ -12575,8 +12536,8 @@ packages:
- debug - debug
dev: true dev: true
/nx@16.7.1: /nx@16.7.2:
resolution: {integrity: sha512-WdzUpoyPMjYyIwYyxiNqGc76HTked/5DiAdVPEjL9MbjNZVwtFE+aMmyf+qS6GV64yNBlUrQphABfP3GiCbuSQ==} resolution: {integrity: sha512-T7cRC97qJ4H9fg498ZGwFQaTzJdLQaRp6DFUwzFo1B9qzR56A2tA3HBvT/huo85THaDX+/pcgLyeixJKEE5RPg==}
hasBin: true hasBin: true
requiresBuild: true requiresBuild: true
peerDependencies: peerDependencies:
...@@ -12588,7 +12549,7 @@ packages: ...@@ -12588,7 +12549,7 @@ packages:
'@swc/core': '@swc/core':
optional: true optional: true
dependencies: dependencies:
'@nrwl/tao': 16.7.1 '@nrwl/tao': 16.7.2
'@parcel/watcher': 2.0.4 '@parcel/watcher': 2.0.4
'@yarnpkg/lockfile': 1.1.0 '@yarnpkg/lockfile': 1.1.0
'@yarnpkg/parsers': 3.0.0-rc.46 '@yarnpkg/parsers': 3.0.0-rc.46
...@@ -12624,16 +12585,16 @@ packages: ...@@ -12624,16 +12585,16 @@ packages:
yargs: 17.7.2 yargs: 17.7.2
yargs-parser: 21.1.1 yargs-parser: 21.1.1
optionalDependencies: optionalDependencies:
'@nx/nx-darwin-arm64': 16.7.1 '@nx/nx-darwin-arm64': 16.7.2
'@nx/nx-darwin-x64': 16.7.1 '@nx/nx-darwin-x64': 16.7.2
'@nx/nx-freebsd-x64': 16.7.1 '@nx/nx-freebsd-x64': 16.7.2
'@nx/nx-linux-arm-gnueabihf': 16.7.1 '@nx/nx-linux-arm-gnueabihf': 16.7.2
'@nx/nx-linux-arm64-gnu': 16.7.1 '@nx/nx-linux-arm64-gnu': 16.7.2
'@nx/nx-linux-arm64-musl': 16.7.1 '@nx/nx-linux-arm64-musl': 16.7.2
'@nx/nx-linux-x64-gnu': 16.7.1 '@nx/nx-linux-x64-gnu': 16.7.2
'@nx/nx-linux-x64-musl': 16.7.1 '@nx/nx-linux-x64-musl': 16.7.2
'@nx/nx-win32-arm64-msvc': 16.7.1 '@nx/nx-win32-arm64-msvc': 16.7.2
'@nx/nx-win32-x64-msvc': 16.7.1 '@nx/nx-win32-x64-msvc': 16.7.2
transitivePeerDependencies: transitivePeerDependencies:
- debug - debug
dev: true dev: true
...@@ -13631,6 +13592,7 @@ packages: ...@@ -13631,6 +13592,7 @@ packages:
engines: {node: '>=0.6'} engines: {node: '>=0.6'}
dependencies: dependencies:
side-channel: 1.0.4 side-channel: 1.0.4
dev: false
/qs@6.11.2: /qs@6.11.2:
resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==}
...@@ -13638,8 +13600,8 @@ packages: ...@@ -13638,8 +13600,8 @@ packages:
dependencies: dependencies:
side-channel: 1.0.4 side-channel: 1.0.4
/qs@6.5.2: /qs@6.5.3:
resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==} resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
engines: {node: '>=0.6'} engines: {node: '>=0.6'}
/query-ast@1.0.4: /query-ast@1.0.4:
...@@ -14043,7 +14005,7 @@ packages: ...@@ -14043,7 +14005,7 @@ packages:
mime-types: 2.1.35 mime-types: 2.1.35
oauth-sign: 0.9.0 oauth-sign: 0.9.0
performance-now: 2.1.0 performance-now: 2.1.0
qs: 6.5.2 qs: 6.5.3
safe-buffer: 5.2.1 safe-buffer: 5.2.1
tough-cookie: 2.5.0 tough-cookie: 2.5.0
tunnel-agent: 0.6.0 tunnel-agent: 0.6.0
...@@ -15220,11 +15182,6 @@ packages: ...@@ -15220,11 +15182,6 @@ packages:
resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==}
dev: true dev: true
/tinypool@0.6.0:
resolution: {integrity: sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==}
engines: {node: '>=14.0.0'}
dev: true
/tinypool@0.7.0: /tinypool@0.7.0:
resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
...@@ -16073,30 +16030,6 @@ packages: ...@@ -16073,30 +16030,6 @@ packages:
- utf-8-validate - utf-8-validate
- zod - zod
/viem@1.3.1(typescript@5.1.6)(zod@3.22.0):
resolution: {integrity: sha512-Yv+y3/exrrEN4EAkVUtUuQxsjF4+3taHY2aSinJnNWtcA4fBZ+WfPJBTywcnFIa/Q5oDcQN85yqPFBbkXqWHdw==}
peerDependencies:
typescript: '>=5.0.4'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@adraffy/ens-normalize': 1.9.0
'@noble/curves': 1.0.0
'@noble/hashes': 1.3.0
'@scure/bip32': 1.3.0
'@scure/bip39': 1.2.0
'@wagmi/chains': 1.6.0(typescript@5.1.6)
abitype: 0.9.3(typescript@5.1.6)(zod@3.22.0)
isomorphic-ws: 5.0.0(ws@8.12.0)
typescript: 5.1.6
ws: 8.12.0
transitivePeerDependencies:
- bufferutil
- utf-8-validate
- zod
dev: true
/viem@1.6.0(typescript@5.1.6)(zod@3.22.0): /viem@1.6.0(typescript@5.1.6)(zod@3.22.0):
resolution: {integrity: sha512-ae9Twkd0q2Qlj4yYpWjb4DzYAhKY0ibEpRH8FJaTywZXNpTjFidSdBaT0CVn1BaH7O7cnX4/O47zvDUMGJD1AA==} resolution: {integrity: sha512-ae9Twkd0q2Qlj4yYpWjb4DzYAhKY0ibEpRH8FJaTywZXNpTjFidSdBaT0CVn1BaH7O7cnX4/O47zvDUMGJD1AA==}
peerDependencies: peerDependencies:
...@@ -16147,28 +16080,6 @@ packages: ...@@ -16147,28 +16080,6 @@ packages:
- zod - zod
dev: true dev: true
/vite-node@0.33.0(@types/node@20.5.0):
resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==}
engines: {node: '>=v14.18.0'}
hasBin: true
dependencies:
cac: 6.7.14
debug: 4.3.4(supports-color@8.1.1)
mlly: 1.4.0
pathe: 1.1.1
picocolors: 1.0.0
vite: 4.4.9(@types/node@20.5.0)
transitivePeerDependencies:
- '@types/node'
- less
- lightningcss
- sass
- stylus
- sugarss
- supports-color
- terser
dev: true
/vite-node@0.34.1(@types/node@20.5.0): /vite-node@0.34.1(@types/node@20.5.0):
resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==} resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==}
engines: {node: '>=v14.18.0'} engines: {node: '>=v14.18.0'}
...@@ -16321,72 +16232,6 @@ packages: ...@@ -16321,72 +16232,6 @@ packages:
fsevents: 2.3.2 fsevents: 2.3.2
dev: true dev: true
/vitest@0.33.0(jsdom@22.1.0):
resolution: {integrity: sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==}
engines: {node: '>=v14.18.0'}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@vitest/browser': '*'
'@vitest/ui': '*'
happy-dom: '*'
jsdom: '*'
playwright: '*'
safaridriver: '*'
webdriverio: '*'
peerDependenciesMeta:
'@edge-runtime/vm':
optional: true
'@vitest/browser':
optional: true
'@vitest/ui':
optional: true
happy-dom:
optional: true
jsdom:
optional: true
playwright:
optional: true
safaridriver:
optional: true
webdriverio:
optional: true
dependencies:
'@types/chai': 4.3.5
'@types/chai-subset': 1.3.3
'@types/node': 20.5.0
'@vitest/expect': 0.33.0
'@vitest/runner': 0.33.0
'@vitest/snapshot': 0.33.0
'@vitest/spy': 0.33.0
'@vitest/utils': 0.33.0
acorn: 8.10.0
acorn-walk: 8.2.0
cac: 6.7.14
chai: 4.3.7
debug: 4.3.4(supports-color@8.1.1)
jsdom: 22.1.0
local-pkg: 0.4.3
magic-string: 0.30.1
pathe: 1.1.1
picocolors: 1.0.0
std-env: 3.3.3
strip-literal: 1.0.1
tinybench: 2.5.0
tinypool: 0.6.0
vite: 4.4.9(@types/node@20.5.0)
vite-node: 0.33.0(@types/node@20.5.0)
why-is-node-running: 2.2.2
transitivePeerDependencies:
- less
- lightningcss
- sass
- stylus
- sugarss
- supports-color
- terser
dev: true
/vitest@0.34.1: /vitest@0.34.1:
resolution: {integrity: sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==} resolution: {integrity: sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==}
engines: {node: '>=v14.18.0'} engines: {node: '>=v14.18.0'}
...@@ -16452,7 +16297,7 @@ packages: ...@@ -16452,7 +16297,7 @@ packages:
- terser - terser
dev: true dev: true
/vitest@0.34.2: /vitest@0.34.2(jsdom@22.1.0):
resolution: {integrity: sha512-WgaIvBbjsSYMq/oiMlXUI7KflELmzM43BEvkdC/8b5CAod4ryAiY2z8uR6Crbi5Pjnu5oOmhKa9sy7uk6paBxQ==} resolution: {integrity: sha512-WgaIvBbjsSYMq/oiMlXUI7KflELmzM43BEvkdC/8b5CAod4ryAiY2z8uR6Crbi5Pjnu5oOmhKa9sy7uk6paBxQ==}
engines: {node: '>=v14.18.0'} engines: {node: '>=v14.18.0'}
hasBin: true hasBin: true
...@@ -16496,6 +16341,7 @@ packages: ...@@ -16496,6 +16341,7 @@ packages:
cac: 6.7.14 cac: 6.7.14
chai: 4.3.7 chai: 4.3.7
debug: 4.3.4(supports-color@8.1.1) debug: 4.3.4(supports-color@8.1.1)
jsdom: 22.1.0
local-pkg: 0.4.3 local-pkg: 0.4.3
magic-string: 0.30.1 magic-string: 0.30.1
pathe: 1.1.1 pathe: 1.1.1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment