From d14567918f036284279cd9b805d587fa31eb3104 Mon Sep 17 00:00:00 2001 From: hopeyen <60078528+hopeyen@users.noreply.github.com> Date: Fri, 14 Feb 2025 16:20:38 -0600 Subject: [PATCH] refactor: api rm Salt, reservationPeriod->timestamp (#1254) --- api/clients/v2/accountant.go | 34 +++--- api/clients/v2/accountant_test.go | 81 ++++++++------ api/clients/v2/disperser_client.go | 10 +- api/clients/v2/disperser_client_test.go | 15 ++- api/clients/v2/payload_disperser.go | 6 +- .../v2/verification/conversion_utils.go | 1 - api/clients/v2/verification/eigenda_cert.go | 2 +- api/docs/common_v2.html | 27 ++--- api/docs/common_v2.md | 5 +- api/docs/disperser_v2.html | 2 +- api/docs/disperser_v2.md | 2 +- api/docs/eigenda-protos.html | 36 +++--- api/docs/eigenda-protos.md | 9 +- api/docs/node_v2.html | 7 +- api/docs/node_v2.md | 2 +- api/grpc/common/v2/common_v2.pb.go | 104 ++++++++---------- api/grpc/disperser/v2/disperser_v2.pb.go | 2 +- api/grpc/validator/node_v2.pb.go | 7 +- api/hashing/node_hashing.go | 3 +- api/hashing/utils.go | 7 ++ api/proto/common/v2/common_v2.proto | 18 +-- api/proto/disperser/v2/disperser_v2.proto | 2 +- api/proto/validator/node_v2.proto | 7 +- .../bindings/EigenDACertVerifier/binding.go | 41 ++++--- .../EigenDADisperserRegistry/binding.go | 2 +- .../bindings/EigenDARelayRegistry/binding.go | 2 +- .../bindings/EigenDAServiceManager/binding.go | 2 +- .../EigenDAThresholdRegistry/binding.go | 2 +- contracts/bindings/MockRollup/binding.go | 2 +- contracts/src/interfaces/IEigenDAStructs.sol | 1 - contracts/src/libraries/EigenDAHasher.sol | 3 +- .../test/unit/EigenDACertVerifierV2Unit.t.sol | 3 +- core/auth/v2/auth_test.go | 2 +- core/auth/v2/signer_test.go | 2 +- core/data.go | 33 +++--- core/meterer/meterer.go | 43 +++++--- core/meterer/meterer_test.go | 65 ++++++----- core/v2/serialization.go | 11 +- core/v2/serialization_test.go | 22 ++-- core/v2/types.go | 5 - core/v2/types_test.go | 8 +- disperser/apiserver/disperse_blob_v2.go | 12 +- disperser/apiserver/server_v2.go | 2 +- disperser/apiserver/server_v2_test.go | 28 ++--- .../v2/blobstore/dynamo_metadata_store.go | 1 + .../blobstore/dynamo_metadata_store_test.go | 15 ++- disperser/controller/controller_test.go | 4 +- disperser/controller/dispatcher_test.go | 4 +- disperser/dataapi/docs/v2/V2_swagger.json | 4 - disperser/dataapi/docs/v2/V2_swagger.yaml | 4 - disperser/dataapi/v2/server_v2_test.go | 9 +- disperser/encoder/server_v2_test.go | 2 +- inabox/tests/integration_v2_test.go | 5 +- node/auth/request_signing_test.go | 11 +- node/auth/request_signing_test_utils.go | 3 +- node/mock/testdata.go | 6 +- relay/relay_test_utils.go | 2 +- test/v2/client/test_client.go | 8 +- test/v2/correctness/correctness_test.go | 14 +-- test/v2/load/load_generator.go | 6 +- tools/traffic/workers/blob_writer.go | 1 - tools/traffic/workers/blob_writer_test.go | 1 - tools/traffic/workers/mock_disperser.go | 4 +- 63 files changed, 387 insertions(+), 397 deletions(-) diff --git a/api/clients/v2/accountant.go b/api/clients/v2/accountant.go index 2e3a216c22..e6c74c05bf 100644 --- a/api/clients/v2/accountant.go +++ b/api/clients/v2/accountant.go @@ -6,7 +6,6 @@ import ( "math/big" "slices" "sync" - "time" disperser_rpc "github.com/Layr-Labs/eigenda/api/grpc/disperser/v2" "github.com/Layr-Labs/eigenda/core" @@ -61,14 +60,15 @@ func NewAccountant(accountID string, reservation *core.ReservedPayment, onDemand // BlobPaymentInfo calculates and records payment information. The accountant // will attempt to use the active reservation first and check for quorum settings, -// then on-demand if the reservation is not available. The returned values are -// reservation period for reservation payments and cumulative payment for on-demand payments, -// and both fields are used to create the payment header and signature. +// then on-demand if the reservation is not available. It takes in a timestamp at +// the current UNIX time in nanoseconds, and returns a cumulative payment for on- +// demand payments in units of wei. Both timestamp and cumulative payment are used +// to create the payment header and signature, with non-zero cumulative payment +// indicating on-demand payment. // These generated values are used to create the payment header and signature, as specified in // api/proto/common/v2/common_v2.proto -func (a *Accountant) BlobPaymentInfo(ctx context.Context, numSymbols uint32, quorumNumbers []uint8) (uint32, *big.Int, error) { - now := time.Now().Unix() - currentReservationPeriod := meterer.GetReservationPeriod(uint64(now), a.reservationWindow) +func (a *Accountant) BlobPaymentInfo(ctx context.Context, numSymbols uint32, quorumNumbers []uint8, timestamp int64) (*big.Int, error) { + currentReservationPeriod := meterer.GetReservationPeriodByNanosecond(timestamp, a.reservationWindow) symbolUsage := uint64(a.SymbolsCharged(numSymbols)) a.usageLock.Lock() @@ -80,9 +80,9 @@ func (a *Accountant) BlobPaymentInfo(ctx context.Context, numSymbols uint32, quo binLimit := a.reservation.SymbolsPerSecond * uint64(a.reservationWindow) if relativePeriodRecord.Usage <= binLimit { if err := QuorumCheck(quorumNumbers, a.reservation.QuorumNumbers); err != nil { - return 0, big.NewInt(0), err + return big.NewInt(0), err } - return currentReservationPeriod, big.NewInt(0), nil + return big.NewInt(0), nil } overflowPeriodRecord := a.GetRelativePeriodRecord(currentReservationPeriod + 2) @@ -90,9 +90,9 @@ func (a *Accountant) BlobPaymentInfo(ctx context.Context, numSymbols uint32, quo if overflowPeriodRecord.Usage == 0 && relativePeriodRecord.Usage-symbolUsage < binLimit && symbolUsage <= binLimit { overflowPeriodRecord.Usage += relativePeriodRecord.Usage - binLimit if err := QuorumCheck(quorumNumbers, a.reservation.QuorumNumbers); err != nil { - return 0, big.NewInt(0), err + return big.NewInt(0), err } - return currentReservationPeriod, big.NewInt(0), nil + return big.NewInt(0), nil } // reservation not available, rollback reservation records, attempt on-demand @@ -102,24 +102,24 @@ func (a *Accountant) BlobPaymentInfo(ctx context.Context, numSymbols uint32, quo a.cumulativePayment.Add(a.cumulativePayment, incrementRequired) if a.cumulativePayment.Cmp(a.onDemand.CumulativePayment) <= 0 { if err := QuorumCheck(quorumNumbers, requiredQuorums); err != nil { - return 0, big.NewInt(0), err + return big.NewInt(0), err } - return 0, a.cumulativePayment, nil + return a.cumulativePayment, nil } - return 0, big.NewInt(0), fmt.Errorf("neither reservation nor on-demand payment is available") + return big.NewInt(0), fmt.Errorf("neither reservation nor on-demand payment is available") } // AccountBlob accountant provides and records payment information -func (a *Accountant) AccountBlob(ctx context.Context, numSymbols uint32, quorums []uint8) (*core.PaymentMetadata, error) { - reservationPeriod, cumulativePayment, err := a.BlobPaymentInfo(ctx, numSymbols, quorums) +func (a *Accountant) AccountBlob(ctx context.Context, timestamp int64, numSymbols uint32, quorums []uint8) (*core.PaymentMetadata, error) { + cumulativePayment, err := a.BlobPaymentInfo(ctx, numSymbols, quorums, timestamp) if err != nil { return nil, err } pm := &core.PaymentMetadata{ AccountID: a.accountID, - ReservationPeriod: reservationPeriod, + Timestamp: timestamp, CumulativePayment: cumulativePayment, } diff --git a/api/clients/v2/accountant_test.go b/api/clients/v2/accountant_test.go index 5087a87944..37a564f410 100644 --- a/api/clients/v2/accountant_test.go +++ b/api/clients/v2/accountant_test.go @@ -69,28 +69,31 @@ func TestAccountBlob_Reservation(t *testing.T) { ctx := context.Background() symbolLength := uint32(500) quorums := []uint8{0, 1} + now := time.Now().UnixNano() - header, err := accountant.AccountBlob(ctx, symbolLength, quorums) + header, err := accountant.AccountBlob(ctx, now, symbolLength, quorums) assert.NoError(t, err) - assert.Equal(t, meterer.GetReservationPeriod(uint64(time.Now().Unix()), reservationWindow), header.ReservationPeriod) + assert.Equal(t, meterer.GetReservationPeriod(time.Now().Unix(), reservationWindow), meterer.GetReservationPeriodByNanosecond(header.Timestamp, reservationWindow)) assert.Equal(t, big.NewInt(0), header.CumulativePayment) assert.Equal(t, isRotation([]uint64{500, 0, 0}, mapRecordUsage(accountant.periodRecords)), true) symbolLength = uint32(700) - header, err = accountant.AccountBlob(ctx, symbolLength, quorums) + now = time.Now().UnixNano() + header, err = accountant.AccountBlob(ctx, now, symbolLength, quorums) assert.NoError(t, err) - assert.NotEqual(t, 0, header.ReservationPeriod) + assert.NotEqual(t, uint64(0), header.Timestamp) assert.Equal(t, big.NewInt(0), header.CumulativePayment) assert.Equal(t, isRotation([]uint64{1200, 0, 200}, mapRecordUsage(accountant.periodRecords)), true) // Second call should use on-demand payment - header, err = accountant.AccountBlob(ctx, 300, quorums) + now = time.Now().UnixNano() + header, err = accountant.AccountBlob(ctx, now, 300, quorums) assert.NoError(t, err) - assert.Equal(t, uint32(0), header.ReservationPeriod) + assert.NotEqual(t, uint64(0), header.Timestamp) assert.Equal(t, big.NewInt(300), header.CumulativePayment) } @@ -117,12 +120,12 @@ func TestAccountBlob_OnDemand(t *testing.T) { ctx := context.Background() numSymbols := uint32(1500) quorums := []uint8{0, 1} - - header, err := accountant.AccountBlob(ctx, numSymbols, quorums) + now := time.Now().UnixNano() + header, err := accountant.AccountBlob(ctx, now, numSymbols, quorums) assert.NoError(t, err) expectedPayment := big.NewInt(int64(numSymbols * pricePerSymbol)) - assert.Equal(t, uint32(0), header.ReservationPeriod) + assert.NotEqual(t, uint64(0), header.Timestamp) assert.Equal(t, expectedPayment, header.CumulativePayment) assert.Equal(t, isRotation([]uint64{0, 0, 0}, mapRecordUsage(accountant.periodRecords)), true) assert.Equal(t, expectedPayment, accountant.cumulativePayment) @@ -145,8 +148,8 @@ func TestAccountBlob_InsufficientOnDemand(t *testing.T) { ctx := context.Background() numSymbols := uint32(2000) quorums := []uint8{0, 1} - - _, err = accountant.AccountBlob(ctx, numSymbols, quorums) + now := time.Now().UnixNano() + _, err = accountant.AccountBlob(ctx, now, numSymbols, quorums) assert.Contains(t, err.Error(), "neither reservation nor on-demand payment is available") } @@ -172,28 +175,33 @@ func TestAccountBlobCallSeries(t *testing.T) { ctx := context.Background() quorums := []uint8{0, 1} - now := time.Now().Unix() + now := time.Now().UnixNano() // First call: Use reservation - header, err := accountant.AccountBlob(ctx, 800, quorums) + header, err := accountant.AccountBlob(ctx, now, 800, quorums) assert.NoError(t, err) - assert.Equal(t, meterer.GetReservationPeriod(uint64(now), reservationWindow), header.ReservationPeriod) + timestamp := (time.Duration(header.Timestamp) * time.Nanosecond).Seconds() + assert.Equal(t, uint64(meterer.GetReservationPeriodByNanosecond(now, reservationWindow)), uint64(timestamp)/uint64(reservationWindow)) assert.Equal(t, big.NewInt(0), header.CumulativePayment) // Second call: Use remaining reservation + overflow - header, err = accountant.AccountBlob(ctx, 300, quorums) + now = time.Now().UnixNano() + header, err = accountant.AccountBlob(ctx, now, 300, quorums) assert.NoError(t, err) - assert.Equal(t, meterer.GetReservationPeriod(uint64(now), reservationWindow), header.ReservationPeriod) + timestamp = (time.Duration(header.Timestamp) * time.Nanosecond).Seconds() + assert.Equal(t, uint64(meterer.GetReservationPeriodByNanosecond(now, reservationWindow)), uint64(timestamp)/uint64(reservationWindow)) assert.Equal(t, big.NewInt(0), header.CumulativePayment) // Third call: Use on-demand - header, err = accountant.AccountBlob(ctx, 500, quorums) + now = time.Now().UnixNano() + header, err = accountant.AccountBlob(ctx, now, 500, quorums) assert.NoError(t, err) - assert.Equal(t, uint32(0), header.ReservationPeriod) + assert.NotEqual(t, uint64(0), header.Timestamp) assert.Equal(t, big.NewInt(500), header.CumulativePayment) // Fourth call: Insufficient on-demand - _, err = accountant.AccountBlob(ctx, 600, quorums) + now = time.Now().UnixNano() + _, err = accountant.AccountBlob(ctx, now, 600, quorums) assert.Error(t, err) assert.Contains(t, err.Error(), "neither reservation nor on-demand payment is available") } @@ -222,7 +230,8 @@ func TestAccountBlob_BinRotation(t *testing.T) { quorums := []uint8{0, 1} // First call - _, err = accountant.AccountBlob(ctx, 800, quorums) + now := time.Now().UnixNano() + _, err = accountant.AccountBlob(ctx, now, 800, quorums) assert.NoError(t, err) assert.Equal(t, isRotation([]uint64{800, 0, 0}, mapRecordUsage(accountant.periodRecords)), true) @@ -230,12 +239,14 @@ func TestAccountBlob_BinRotation(t *testing.T) { time.Sleep(1000 * time.Millisecond) // Second call - _, err = accountant.AccountBlob(ctx, 300, quorums) + now = time.Now().UnixNano() + _, err = accountant.AccountBlob(ctx, now, 300, quorums) assert.NoError(t, err) assert.Equal(t, isRotation([]uint64{800, 300, 0}, mapRecordUsage(accountant.periodRecords)), true) // Third call - _, err = accountant.AccountBlob(ctx, 500, quorums) + now = time.Now().UnixNano() + _, err = accountant.AccountBlob(ctx, now, 500, quorums) assert.NoError(t, err) assert.Equal(t, isRotation([]uint64{800, 800, 0}, mapRecordUsage(accountant.periodRecords)), true) } @@ -269,7 +280,8 @@ func TestConcurrentBinRotationAndAccountBlob(t *testing.T) { wg.Add(1) go func() { defer wg.Done() - _, err := accountant.AccountBlob(ctx, 100, quorums) + now := time.Now().UnixNano() + _, err := accountant.AccountBlob(ctx, now, 100, quorums) assert.NoError(t, err) }() } @@ -304,25 +316,27 @@ func TestAccountBlob_ReservationWithOneOverflow(t *testing.T) { ctx := context.Background() quorums := []uint8{0, 1} - now := time.Now().Unix() + now := time.Now().UnixNano() // Okay reservation - header, err := accountant.AccountBlob(ctx, 800, quorums) + header, err := accountant.AccountBlob(ctx, now, 800, quorums) assert.NoError(t, err) - assert.Equal(t, meterer.GetReservationPeriod(uint64(now), reservationWindow), header.ReservationPeriod) + timestamp := (time.Duration(header.Timestamp) * time.Nanosecond).Seconds() + assert.Equal(t, uint64(meterer.GetReservationPeriodByNanosecond(now, reservationWindow)), uint64(timestamp)/uint64(reservationWindow)) assert.Equal(t, big.NewInt(0), header.CumulativePayment) assert.Equal(t, isRotation([]uint64{800, 0, 0}, mapRecordUsage(accountant.periodRecords)), true) // Second call: Allow one overflow - header, err = accountant.AccountBlob(ctx, 500, quorums) + header, err = accountant.AccountBlob(ctx, now, 500, quorums) assert.NoError(t, err) assert.Equal(t, big.NewInt(0), header.CumulativePayment) assert.Equal(t, isRotation([]uint64{1300, 0, 300}, mapRecordUsage(accountant.periodRecords)), true) // Third call: Should use on-demand payment - header, err = accountant.AccountBlob(ctx, 200, quorums) + now = time.Now().UnixNano() + header, err = accountant.AccountBlob(ctx, now, 200, quorums) assert.NoError(t, err) - assert.Equal(t, uint32(0), header.ReservationPeriod) + assert.NotEqual(t, uint64(0), header.Timestamp) assert.Equal(t, big.NewInt(200), header.CumulativePayment) assert.Equal(t, isRotation([]uint64{1300, 0, 300}, mapRecordUsage(accountant.periodRecords)), true) } @@ -351,12 +365,14 @@ func TestAccountBlob_ReservationOverflowReset(t *testing.T) { quorums := []uint8{0, 1} // full reservation - _, err = accountant.AccountBlob(ctx, 1000, quorums) + now := time.Now().UnixNano() + _, err = accountant.AccountBlob(ctx, now, 1000, quorums) assert.NoError(t, err) assert.Equal(t, isRotation([]uint64{1000, 0, 0}, mapRecordUsage(accountant.periodRecords)), true) // no overflow - header, err := accountant.AccountBlob(ctx, 500, quorums) + now = time.Now().UnixNano() + header, err := accountant.AccountBlob(ctx, now, 500, quorums) assert.NoError(t, err) assert.Equal(t, isRotation([]uint64{1000, 0, 0}, mapRecordUsage(accountant.periodRecords)), true) assert.Equal(t, big.NewInt(500), header.CumulativePayment) @@ -365,7 +381,8 @@ func TestAccountBlob_ReservationOverflowReset(t *testing.T) { time.Sleep(time.Duration(reservationWindow) * time.Second) // Third call: Should use new bin and allow overflow again - _, err = accountant.AccountBlob(ctx, 500, quorums) + now = time.Now().UnixNano() + _, err = accountant.AccountBlob(ctx, now, 500, quorums) assert.NoError(t, err) assert.Equal(t, isRotation([]uint64{1000, 500, 0}, mapRecordUsage(accountant.periodRecords)), true) } diff --git a/api/clients/v2/disperser_client.go b/api/clients/v2/disperser_client.go index 4cc4cf49fc..23e24c47e7 100644 --- a/api/clients/v2/disperser_client.go +++ b/api/clients/v2/disperser_client.go @@ -3,8 +3,10 @@ package clients import ( "context" "fmt" - "github.com/docker/go-units" "sync" + "time" + + "github.com/docker/go-units" "github.com/Layr-Labs/eigenda/api" disperser_rpc "github.com/Layr-Labs/eigenda/api/grpc/disperser/v2" @@ -24,7 +26,7 @@ type DisperserClientConfig struct { type DisperserClient interface { Close() error - DisperseBlob(ctx context.Context, data []byte, blobVersion corev2.BlobVersion, quorums []core.QuorumID, salt uint32) (*dispv2.BlobStatus, corev2.BlobKey, error) + DisperseBlob(ctx context.Context, data []byte, blobVersion corev2.BlobVersion, quorums []core.QuorumID) (*dispv2.BlobStatus, corev2.BlobKey, error) GetBlobStatus(ctx context.Context, blobKey corev2.BlobKey) (*disperser_rpc.BlobStatusReply, error) GetBlobCommitment(ctx context.Context, data []byte) (*disperser_rpc.BlobCommitmentReply, error) } @@ -125,7 +127,6 @@ func (c *disperserClient) DisperseBlob( data []byte, blobVersion corev2.BlobVersion, quorums []core.QuorumID, - salt uint32, ) (*dispv2.BlobStatus, corev2.BlobKey, error) { err := c.initOnceGrpcConnection() if err != nil { @@ -141,7 +142,7 @@ func (c *disperserClient) DisperseBlob( } symbolLength := encoding.GetBlobLengthPowerOf2(uint(len(data))) - payment, err := c.accountant.AccountBlob(ctx, uint32(symbolLength), quorums) + payment, err := c.accountant.AccountBlob(ctx, time.Now().UnixNano(), uint32(symbolLength), quorums) if err != nil { return nil, [32]byte{}, fmt.Errorf("error accounting blob: %w", err) } @@ -188,7 +189,6 @@ func (c *disperserClient) DisperseBlob( BlobCommitments: blobCommitments, QuorumNumbers: quorums, PaymentMetadata: *payment, - Salt: salt, } sig, err := c.signer.SignBlobRequest(blobHeader) diff --git a/api/clients/v2/disperser_client_test.go b/api/clients/v2/disperser_client_test.go index 997ee64ba5..6961abd906 100644 --- a/api/clients/v2/disperser_client_test.go +++ b/api/clients/v2/disperser_client_test.go @@ -13,27 +13,26 @@ import ( func TestVerifyReceivedBlobKey(t *testing.T) { blobCommitments := encoding.BlobCommitments{ - Commitment: &encoding.G1Commitment{}, + Commitment: &encoding.G1Commitment{}, LengthCommitment: &encoding.G2Commitment{}, - LengthProof: &encoding.LengthProof{}, - Length: 4, + LengthProof: &encoding.LengthProof{}, + Length: 4, } quorumNumbers := make([]core.QuorumID, 1) quorumNumbers[0] = 8 paymentMetadata := core.PaymentMetadata{ - AccountID: "asdf", - ReservationPeriod: 5, + AccountID: "asdf", + Timestamp: 5, CumulativePayment: big.NewInt(6), } blobHeader := &corev2.BlobHeader{ - BlobVersion: 0, + BlobVersion: 0, BlobCommitments: blobCommitments, - QuorumNumbers: quorumNumbers, + QuorumNumbers: quorumNumbers, PaymentMetadata: paymentMetadata, - Salt: 9, } realKey, err := blobHeader.BlobKey() diff --git a/api/clients/v2/payload_disperser.go b/api/clients/v2/payload_disperser.go index 1bfe4ffa7e..6f7d49ef87 100644 --- a/api/clients/v2/payload_disperser.go +++ b/api/clients/v2/payload_disperser.go @@ -138,10 +138,6 @@ func (pd *PayloadDisperser) SendPayload( ctx context.Context, // payload is the raw data to be stored on eigenDA payload []byte, - // salt is added while constructing the blob header - // This salt should be utilized if a blob dispersal fails, in order to retry dispersing the same payload under a - // different blob key, when using reserved bandwidth payments. - salt uint32, ) (*verification.EigenDACert, error) { blobBytes, err := pd.codec.EncodeBlob(payload) @@ -157,7 +153,7 @@ func (pd *PayloadDisperser) SendPayload( blobBytes, pd.config.BlobVersion, pd.config.Quorums, - salt) + ) if err != nil { return nil, fmt.Errorf("disperse blob: %w", err) } diff --git a/api/clients/v2/verification/conversion_utils.go b/api/clients/v2/verification/conversion_utils.go index f37b4631c6..04cc055a42 100644 --- a/api/clients/v2/verification/conversion_utils.go +++ b/api/clients/v2/verification/conversion_utils.go @@ -174,7 +174,6 @@ func blobHeaderProtoToBinding(inputHeader *commonv2.BlobHeader) (*contractEigenD QuorumNumbers: quorumNumbers, Commitment: *convertedBlobCommitment, PaymentHeaderHash: paymentHeaderHash, - Salt: inputHeader.GetSalt(), }, nil } diff --git a/api/clients/v2/verification/eigenda_cert.go b/api/clients/v2/verification/eigenda_cert.go index eac3a1c0b6..315279995f 100644 --- a/api/clients/v2/verification/eigenda_cert.go +++ b/api/clients/v2/verification/eigenda_cert.go @@ -54,7 +54,7 @@ func (c *EigenDACert) ComputeBlobKey() (*v2.BlobKey, error) { *blobCommitments, blobHeader.QuorumNumbers, blobHeader.PaymentHeaderHash, - blobHeader.Salt) + ) if err != nil { return nil, fmt.Errorf("compute blob key: %w", err) diff --git a/api/docs/common_v2.html b/api/docs/common_v2.html index d6bbcdbce3..a7a2cd2ced 100644 --- a/api/docs/common_v2.html +++ b/api/docs/common_v2.html @@ -370,15 +370,6 @@

BlobHeader

payment_header contains payment information for the blob

- - salt - uint32 - -

salt is used to ensure that the dispersal request is intentionally unique. This is currently only useful for -reserved payments when the same blob is submitted multiple times within the same reservation period. On-demand -payments already have unique cumulative_payment values for intentionally unique dispersal requests.

- - @@ -405,10 +396,14 @@

PaymentHeader

- reservation_period - uint32 + timestamp + int64 -

The reservation period of the dispersal request is used for rate-limiting the user's account against their dedicated +

The timestamp should be set as the UNIX timestamp in units of nanoseconds at the time of the dispersal request, +and will be used to determine the reservation period, and compared against the reservation active start and end timestamps +On-chain reservation timestamps are in units of seconds, while the payment header timestamp is in nanoseconds for greater precision. +If the timestamp is not set or is not part of the previous or current reservation period, the request will be rejected. +The reservation period of the dispersal request is used for rate-limiting the user's account against their dedicated bandwidth. This method requires users to set up reservation accounts with EigenDA team, and the team will set up an on-chain record of reserved bandwidth for the user for some period of time. The dispersal client's accountant will set this value to the current timestamp divided by the on-chain configured reservation period interval, mapping each request @@ -418,12 +413,14 @@

PaymentHeader

Example Usage Flow: 1. The user sets up a reservation with the EigenDA team, including throughput (symbolsPerSecond), startTimestamp, endTimestamp, and reservationPeriodInterval. - 2. When sending a dispersal request at time t, the client computes reservation_period = floor(t / reservationPeriodInterval). - 3. The request includes this reservation_period index. The disperser checks: + 2. When sending a dispersal request at time t, the client fill in the timestamp field with t. + 3. The disperser take timestamp t and checks the reservation period and the user's bandwidth capacity: - If the reservation is active (t >= startTimestamp and t < endTimestamp). - After rounding up to the nearest multiple of `minNumSymbols` defined by the payment vault contract, the user still has enough bandwidth capacity (hasn’t exceeded symbolsPerSecond * reservationPeriodInterval). - 4. Server always go ahead with recording the received request, and then categorize the scenarios + - The request is ratelimited against the current reservation period, and calculated as reservation_period = t / reservationPeriodInterval. + the request's reservation period must either be the disperser server's current reservation period or the previous reservation period. + 4. Server always go ahead with recording the received request in the current reservation period, and then categorize the scenarios - If the remaining bandwidth is sufficient for the request, the dispersal request proceeds. - If the remaining bandwidth is not enough for the request, server fills up the current bin and overflowing the extra to a future bin. - If the bandwidth has already been exhausted, the request is rejected. diff --git a/api/docs/common_v2.md b/api/docs/common_v2.md index bb33ceb089..ce49025e95 100644 --- a/api/docs/common_v2.md +++ b/api/docs/common_v2.md @@ -89,7 +89,6 @@ On-demand dispersal is currently limited to using a subset of the following quor Reserved-bandwidth dispersal is free to use multiple quorums, however those must be reserved ahead of time. The quorum_numbers specified here must be a subset of the ones allowed by the on-chain reservation. Check the allowed quorum numbers by looking up reservation struct: https://github.com/Layr-Labs/eigenda/blob/1430d56258b4e814b388e497320fd76354bfb478/contracts/src/interfaces/IPaymentVault.sol#L10 | | commitment | [common.BlobCommitment](#common-BlobCommitment) | | commitment is the KZG commitment to the blob | | payment_header | [PaymentHeader](#common-v2-PaymentHeader) | | payment_header contains payment information for the blob | -| salt | [uint32](#uint32) | | salt is used to ensure that the dispersal request is intentionally unique. This is currently only useful for reserved payments when the same blob is submitted multiple times within the same reservation period. On-demand payments already have unique cumulative_payment values for intentionally unique dispersal requests. | @@ -113,9 +112,9 @@ multiple of `minNumSymbols` (https://github.com/Layr-Labs/eigenda/blob/1430d5625 | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | account_id | [string](#string) | | The account ID of the disperser client. This account ID is an eth wallet address of the user, corresponding to the key used by the client to sign the BlobHeader. | -| reservation_period | [uint32](#uint32) | | The reservation period of the dispersal request is used for rate-limiting the user's account against their dedicated bandwidth. This method requires users to set up reservation accounts with EigenDA team, and the team will set up an on-chain record of reserved bandwidth for the user for some period of time. The dispersal client's accountant will set this value to the current timestamp divided by the on-chain configured reservation period interval, mapping each request to a time-based window and is serialized and parsed as a uint32. The disperser server then validates that it matches either the current or the previous period. +| timestamp | [int64](#int64) | | The timestamp should be set as the UNIX timestamp in units of nanoseconds at the time of the dispersal request, and will be used to determine the reservation period, and compared against the reservation active start and end timestamps On-chain reservation timestamps are in units of seconds, while the payment header timestamp is in nanoseconds for greater precision. If the timestamp is not set or is not part of the previous or current reservation period, the request will be rejected. The reservation period of the dispersal request is used for rate-limiting the user's account against their dedicated bandwidth. This method requires users to set up reservation accounts with EigenDA team, and the team will set up an on-chain record of reserved bandwidth for the user for some period of time. The dispersal client's accountant will set this value to the current timestamp divided by the on-chain configured reservation period interval, mapping each request to a time-based window and is serialized and parsed as a uint32. The disperser server then validates that it matches either the current or the previous period. -Example Usage Flow: 1. The user sets up a reservation with the EigenDA team, including throughput (symbolsPerSecond), startTimestamp, endTimestamp, and reservationPeriodInterval. 2. When sending a dispersal request at time t, the client computes reservation_period = floor(t / reservationPeriodInterval). 3. The request includes this reservation_period index. The disperser checks: - If the reservation is active (t >= startTimestamp and t < endTimestamp). - After rounding up to the nearest multiple of `minNumSymbols` defined by the payment vault contract, the user still has enough bandwidth capacity (hasn’t exceeded symbolsPerSecond * reservationPeriodInterval). 4. Server always go ahead with recording the received request, and then categorize the scenarios - If the remaining bandwidth is sufficient for the request, the dispersal request proceeds. - If the remaining bandwidth is not enough for the request, server fills up the current bin and overflowing the extra to a future bin. - If the bandwidth has already been exhausted, the request is rejected. 5. Once the dispersal request signature has been verified, the server will not roll back the payment or the usage records. Users should be aware of this when planning their usage. The dispersal client written by EigenDA team takes account of this. 6. When the reservation ends or usage is exhausted, the client must wait for the next reservation period or switch to on-demand. | +Example Usage Flow: 1. The user sets up a reservation with the EigenDA team, including throughput (symbolsPerSecond), startTimestamp, endTimestamp, and reservationPeriodInterval. 2. When sending a dispersal request at time t, the client fill in the timestamp field with t. 3. The disperser take timestamp t and checks the reservation period and the user's bandwidth capacity: - If the reservation is active (t >= startTimestamp and t < endTimestamp). - After rounding up to the nearest multiple of `minNumSymbols` defined by the payment vault contract, the user still has enough bandwidth capacity (hasn’t exceeded symbolsPerSecond * reservationPeriodInterval). - The request is ratelimited against the current reservation period, and calculated as reservation_period = t / reservationPeriodInterval. the request's reservation period must either be the disperser server's current reservation period or the previous reservation period. 4. Server always go ahead with recording the received request in the current reservation period, and then categorize the scenarios - If the remaining bandwidth is sufficient for the request, the dispersal request proceeds. - If the remaining bandwidth is not enough for the request, server fills up the current bin and overflowing the extra to a future bin. - If the bandwidth has already been exhausted, the request is rejected. 5. Once the dispersal request signature has been verified, the server will not roll back the payment or the usage records. Users should be aware of this when planning their usage. The dispersal client written by EigenDA team takes account of this. 6. When the reservation ends or usage is exhausted, the client must wait for the next reservation period or switch to on-demand. | | cumulative_payment | [bytes](#bytes) | | Cumulative payment is the total amount of tokens paid by the requesting account, including the current request. This value is serialized as an uint256 and parsed as a big integer, and must match the user’s on-chain deposit limits as well as the recorded payments for all previous requests. Because it is a cumulative (not incremental) total, requests can arrive out of order and still unambiguously declare how much of the on-chain deposit can be deducted. Example Decision Flow: 1. In the set up phase, the user must deposit tokens into the EigenDA PaymentVault contract. The payment vault contract specifies the minimum number of symbols charged per dispersal, the pricing per symbol, and the maximum global rate for on-demand dispersals. The user should calculate the amount of tokens they would like to deposit based on their usage. The first time a user make a request, server will immediate read the contract for the on-chain balance. When user runs out of on-chain balance, the server will reject the request and not proceed with dispersal. When a user top up on-chain, the server will only refresh every few minutes for the top-up to take effect. 2. The disperser client accounts how many tokens they’ve already paid (previousCumPmt). 3. They should calculate the payment by rounding up blob size to the nearest multiple of `minNumSymbols` defined by the payment vault contract, and calculate the incremental amount of tokens needed for the current request needs based on protocol defined pricing. 4. They take the sum of previousCumPmt + new incremental payment and place it in the “cumulative_payment” field. 5. The disperser checks this new cumulative total against on-chain deposits and prior records (largest previous payment and smallest later payment if exists). 6. If the payment number is valid, the request is confirmed and disperser proceeds with dispersal; otherwise it’s rejected. | diff --git a/api/docs/disperser_v2.html b/api/docs/disperser_v2.html index 036323ece3..a44dec84ab 100644 --- a/api/docs/disperser_v2.html +++ b/api/docs/disperser_v2.html @@ -876,7 +876,7 @@

BlobStatus

FAILED 5

FAILED means that the blob has failed permanently. Note that this is a terminal state, and in order to -retry the blob, the client must submit the blob again with different salt (blob key is required to be unique).

+retry the blob, the client must submit the blob again (blob key is required to be unique).

diff --git a/api/docs/disperser_v2.md b/api/docs/disperser_v2.md index f98e757482..4d77abfd11 100644 --- a/api/docs/disperser_v2.md +++ b/api/docs/disperser_v2.md @@ -309,7 +309,7 @@ This status is functionally equivalent to FAILED, but is used to indicate that t | ENCODED | 2 | ENCODED means that the blob has been Reed-Solomon encoded into chunks and is ready to be dispersed to DA Nodes. | | GATHERING_SIGNATURES | 3 | GATHERING_SIGNATURES means that the blob chunks are currently actively being transmitted to validators, and in doing so requesting that the validators sign to acknowledge receipt of the blob. Requests that timeout or receive errors are resubmitted to DA nodes for some period of time set by the disperser, after which the BlobStatus becomes COMPLETE. | | COMPLETE | 4 | COMPLETE means the blob has been dispersed to DA nodes, and the GATHERING_SIGNATURES period of time has completed. This status does not guarantee any signer percentage, so a client should check that the signature has met its required threshold, and resubmit a new blob dispersal request if not. | -| FAILED | 5 | FAILED means that the blob has failed permanently. Note that this is a terminal state, and in order to retry the blob, the client must submit the blob again with different salt (blob key is required to be unique). | +| FAILED | 5 | FAILED means that the blob has failed permanently. Note that this is a terminal state, and in order to retry the blob, the client must submit the blob again (blob key is required to be unique). | diff --git a/api/docs/eigenda-protos.html b/api/docs/eigenda-protos.html index ed20f7d76d..838bd70c1c 100644 --- a/api/docs/eigenda-protos.html +++ b/api/docs/eigenda-protos.html @@ -1126,15 +1126,6 @@

BlobHeader

payment_header contains payment information for the blob

- - salt - uint32 - -

salt is used to ensure that the dispersal request is intentionally unique. This is currently only useful for -reserved payments when the same blob is submitted multiple times within the same reservation period. On-demand -payments already have unique cumulative_payment values for intentionally unique dispersal requests.

- - @@ -1161,10 +1152,14 @@

PaymentHeader

- reservation_period - uint32 + timestamp + int64 -

The reservation period of the dispersal request is used for rate-limiting the user's account against their dedicated +

The timestamp should be set as the UNIX timestamp in units of nanoseconds at the time of the dispersal request, +and will be used to determine the reservation period, and compared against the reservation active start and end timestamps +On-chain reservation timestamps are in units of seconds, while the payment header timestamp is in nanoseconds for greater precision. +If the timestamp is not set or is not part of the previous or current reservation period, the request will be rejected. +The reservation period of the dispersal request is used for rate-limiting the user's account against their dedicated bandwidth. This method requires users to set up reservation accounts with EigenDA team, and the team will set up an on-chain record of reserved bandwidth for the user for some period of time. The dispersal client's accountant will set this value to the current timestamp divided by the on-chain configured reservation period interval, mapping each request @@ -1174,12 +1169,14 @@

PaymentHeader

Example Usage Flow: 1. The user sets up a reservation with the EigenDA team, including throughput (symbolsPerSecond), startTimestamp, endTimestamp, and reservationPeriodInterval. - 2. When sending a dispersal request at time t, the client computes reservation_period = floor(t / reservationPeriodInterval). - 3. The request includes this reservation_period index. The disperser checks: + 2. When sending a dispersal request at time t, the client fill in the timestamp field with t. + 3. The disperser take timestamp t and checks the reservation period and the user's bandwidth capacity: - If the reservation is active (t >= startTimestamp and t < endTimestamp). - After rounding up to the nearest multiple of `minNumSymbols` defined by the payment vault contract, the user still has enough bandwidth capacity (hasn’t exceeded symbolsPerSecond * reservationPeriodInterval). - 4. Server always go ahead with recording the received request, and then categorize the scenarios + - The request is ratelimited against the current reservation period, and calculated as reservation_period = t / reservationPeriodInterval. + the request's reservation period must either be the disperser server's current reservation period or the previous reservation period. + 4. Server always go ahead with recording the received request in the current reservation period, and then categorize the scenarios - If the remaining bandwidth is sufficient for the request, the dispersal request proceeds. - If the remaining bandwidth is not enough for the request, server fills up the current bin and overflowing the extra to a future bin. - If the bandwidth has already been exhausted, the request is rejected. @@ -2583,7 +2580,7 @@

BlobStatus

FAILED 5

FAILED means that the blob has failed permanently. Note that this is a terminal state, and in order to -retry the blob, the client must submit the blob again with different salt (blob key is required to be unique).

+retry the blob, the client must submit the blob again (blob key is required to be unique).

@@ -4100,11 +4097,10 @@

StoreChunksRequest

e. digest certificate.BlobHeader.Commitment.LengthProof f. digest certificate.BlobHeader.Commitment.Length (4 bytes, unsigned big endian) g. digest certificate.BlobHeader.PaymentHeader.AccountId - h. digest certificate.BlobHeader.PaymentHeader.ReservationPeriod (4 bytes, unsigned big endian) + h. digest certificate.BlobHeader.PaymentHeader.Timestamp (4 bytes, signed big endian) i. digest certificate.BlobHeader.PaymentHeader.CumulativePayment - j. digest certificate.BlobHeader.PaymentHeader.Salt (4 bytes, unsigned big endian) - k. digest certificate.BlobHeader.Signature - l. for each relay in certificate.Relays: + j. digest certificate.BlobHeader.Signature + k. for each relay in certificate.Relays: i. digest relay (4 bytes, unsigned big endian) 4. digest disperserID (4 bytes, unsigned big endian) diff --git a/api/docs/eigenda-protos.md b/api/docs/eigenda-protos.md index 16128845bc..1b7daaedc9 100644 --- a/api/docs/eigenda-protos.md +++ b/api/docs/eigenda-protos.md @@ -361,7 +361,6 @@ On-demand dispersal is currently limited to using a subset of the following quor Reserved-bandwidth dispersal is free to use multiple quorums, however those must be reserved ahead of time. The quorum_numbers specified here must be a subset of the ones allowed by the on-chain reservation. Check the allowed quorum numbers by looking up reservation struct: https://github.com/Layr-Labs/eigenda/blob/1430d56258b4e814b388e497320fd76354bfb478/contracts/src/interfaces/IPaymentVault.sol#L10 | | commitment | [common.BlobCommitment](#common-BlobCommitment) | | commitment is the KZG commitment to the blob | | payment_header | [PaymentHeader](#common-v2-PaymentHeader) | | payment_header contains payment information for the blob | -| salt | [uint32](#uint32) | | salt is used to ensure that the dispersal request is intentionally unique. This is currently only useful for reserved payments when the same blob is submitted multiple times within the same reservation period. On-demand payments already have unique cumulative_payment values for intentionally unique dispersal requests. | @@ -385,9 +384,9 @@ multiple of `minNumSymbols` (https://github.com/Layr-Labs/eigenda/blob/1430d5625 | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | account_id | [string](#string) | | The account ID of the disperser client. This account ID is an eth wallet address of the user, corresponding to the key used by the client to sign the BlobHeader. | -| reservation_period | [uint32](#uint32) | | The reservation period of the dispersal request is used for rate-limiting the user's account against their dedicated bandwidth. This method requires users to set up reservation accounts with EigenDA team, and the team will set up an on-chain record of reserved bandwidth for the user for some period of time. The dispersal client's accountant will set this value to the current timestamp divided by the on-chain configured reservation period interval, mapping each request to a time-based window and is serialized and parsed as a uint32. The disperser server then validates that it matches either the current or the previous period. +| timestamp | [int64](#int64) | | The timestamp should be set as the UNIX timestamp in units of nanoseconds at the time of the dispersal request, and will be used to determine the reservation period, and compared against the reservation active start and end timestamps On-chain reservation timestamps are in units of seconds, while the payment header timestamp is in nanoseconds for greater precision. If the timestamp is not set or is not part of the previous or current reservation period, the request will be rejected. The reservation period of the dispersal request is used for rate-limiting the user's account against their dedicated bandwidth. This method requires users to set up reservation accounts with EigenDA team, and the team will set up an on-chain record of reserved bandwidth for the user for some period of time. The dispersal client's accountant will set this value to the current timestamp divided by the on-chain configured reservation period interval, mapping each request to a time-based window and is serialized and parsed as a uint32. The disperser server then validates that it matches either the current or the previous period. -Example Usage Flow: 1. The user sets up a reservation with the EigenDA team, including throughput (symbolsPerSecond), startTimestamp, endTimestamp, and reservationPeriodInterval. 2. When sending a dispersal request at time t, the client computes reservation_period = floor(t / reservationPeriodInterval). 3. The request includes this reservation_period index. The disperser checks: - If the reservation is active (t >= startTimestamp and t < endTimestamp). - After rounding up to the nearest multiple of `minNumSymbols` defined by the payment vault contract, the user still has enough bandwidth capacity (hasn’t exceeded symbolsPerSecond * reservationPeriodInterval). 4. Server always go ahead with recording the received request, and then categorize the scenarios - If the remaining bandwidth is sufficient for the request, the dispersal request proceeds. - If the remaining bandwidth is not enough for the request, server fills up the current bin and overflowing the extra to a future bin. - If the bandwidth has already been exhausted, the request is rejected. 5. Once the dispersal request signature has been verified, the server will not roll back the payment or the usage records. Users should be aware of this when planning their usage. The dispersal client written by EigenDA team takes account of this. 6. When the reservation ends or usage is exhausted, the client must wait for the next reservation period or switch to on-demand. | +Example Usage Flow: 1. The user sets up a reservation with the EigenDA team, including throughput (symbolsPerSecond), startTimestamp, endTimestamp, and reservationPeriodInterval. 2. When sending a dispersal request at time t, the client fill in the timestamp field with t. 3. The disperser take timestamp t and checks the reservation period and the user's bandwidth capacity: - If the reservation is active (t >= startTimestamp and t < endTimestamp). - After rounding up to the nearest multiple of `minNumSymbols` defined by the payment vault contract, the user still has enough bandwidth capacity (hasn’t exceeded symbolsPerSecond * reservationPeriodInterval). - The request is ratelimited against the current reservation period, and calculated as reservation_period = t / reservationPeriodInterval. the request's reservation period must either be the disperser server's current reservation period or the previous reservation period. 4. Server always go ahead with recording the received request in the current reservation period, and then categorize the scenarios - If the remaining bandwidth is sufficient for the request, the dispersal request proceeds. - If the remaining bandwidth is not enough for the request, server fills up the current bin and overflowing the extra to a future bin. - If the bandwidth has already been exhausted, the request is rejected. 5. Once the dispersal request signature has been verified, the server will not roll back the payment or the usage records. Users should be aware of this when planning their usage. The dispersal client written by EigenDA team takes account of this. 6. When the reservation ends or usage is exhausted, the client must wait for the next reservation period or switch to on-demand. | | cumulative_payment | [bytes](#bytes) | | Cumulative payment is the total amount of tokens paid by the requesting account, including the current request. This value is serialized as an uint256 and parsed as a big integer, and must match the user’s on-chain deposit limits as well as the recorded payments for all previous requests. Because it is a cumulative (not incremental) total, requests can arrive out of order and still unambiguously declare how much of the on-chain deposit can be deducted. Example Decision Flow: 1. In the set up phase, the user must deposit tokens into the EigenDA PaymentVault contract. The payment vault contract specifies the minimum number of symbols charged per dispersal, the pricing per symbol, and the maximum global rate for on-demand dispersals. The user should calculate the amount of tokens they would like to deposit based on their usage. The first time a user make a request, server will immediate read the contract for the on-chain balance. When user runs out of on-chain balance, the server will reject the request and not proceed with dispersal. When a user top up on-chain, the server will only refresh every few minutes for the top-up to take effect. 2. The disperser client accounts how many tokens they’ve already paid (previousCumPmt). 3. They should calculate the payment by rounding up blob size to the nearest multiple of `minNumSymbols` defined by the payment vault contract, and calculate the incremental amount of tokens needed for the current request needs based on protocol defined pricing. 4. They take the sum of previousCumPmt + new incremental payment and place it in the “cumulative_payment” field. 5. The disperser checks this new cumulative total against on-chain deposits and prior records (largest previous payment and smallest later payment if exists). 6. If the payment number is valid, the request is confirmed and disperser proceeds with dispersal; otherwise it’s rejected. | @@ -1017,7 +1016,7 @@ This status is functionally equivalent to FAILED, but is used to indicate that t | ENCODED | 2 | ENCODED means that the blob has been Reed-Solomon encoded into chunks and is ready to be dispersed to DA Nodes. | | GATHERING_SIGNATURES | 3 | GATHERING_SIGNATURES means that the blob chunks are currently actively being transmitted to validators, and in doing so requesting that the validators sign to acknowledge receipt of the blob. Requests that timeout or receive errors are resubmitted to DA nodes for some period of time set by the disperser, after which the BlobStatus becomes COMPLETE. | | COMPLETE | 4 | COMPLETE means the blob has been dispersed to DA nodes, and the GATHERING_SIGNATURES period of time has completed. This status does not guarantee any signer percentage, so a client should check that the signature has met its required threshold, and resubmit a new blob dispersal request if not. | -| FAILED | 5 | FAILED means that the blob has failed permanently. Note that this is a terminal state, and in order to retry the blob, the client must submit the blob again with different salt (blob key is required to be unique). | +| FAILED | 5 | FAILED means that the blob has failed permanently. Note that this is a terminal state, and in order to retry the blob, the client must submit the blob again (blob key is required to be unique). | @@ -1795,7 +1794,7 @@ Request that the Node store a batch of chunks. Algorithm for computing the hash is as follows. All integer values are serialized in big-endian order (unsigned). A reference implementation (golang) can be found at https://github.com/Layr-Labs/eigenda/blob/master/disperser/auth/request_signing.go -1. digest batch.BatchHeader.BatchRoot 2. digest batch.BatchHeader.ReferenceBlockNumber (8 bytes, unsigned big endian) 3. for each certificate in batch.BlobCertificates: a. digest certificate.BlobHeader.Version (4 bytes, unsigned big endian) b. for each quorum_number in certificate.BlobHeader.QuorumNumbers: i. digest quorum_number (4 bytes, unsigned big endian) c. digest certificate.BlobHeader.Commitment.Commitment d. digest certificate.BlobHeader.Commitment.LengthCommitment e. digest certificate.BlobHeader.Commitment.LengthProof f. digest certificate.BlobHeader.Commitment.Length (4 bytes, unsigned big endian) g. digest certificate.BlobHeader.PaymentHeader.AccountId h. digest certificate.BlobHeader.PaymentHeader.ReservationPeriod (4 bytes, unsigned big endian) i. digest certificate.BlobHeader.PaymentHeader.CumulativePayment j. digest certificate.BlobHeader.PaymentHeader.Salt (4 bytes, unsigned big endian) k. digest certificate.BlobHeader.Signature l. for each relay in certificate.Relays: i. digest relay (4 bytes, unsigned big endian) 4. digest disperserID (4 bytes, unsigned big endian) +1. digest batch.BatchHeader.BatchRoot 2. digest batch.BatchHeader.ReferenceBlockNumber (8 bytes, unsigned big endian) 3. for each certificate in batch.BlobCertificates: a. digest certificate.BlobHeader.Version (4 bytes, unsigned big endian) b. for each quorum_number in certificate.BlobHeader.QuorumNumbers: i. digest quorum_number (4 bytes, unsigned big endian) c. digest certificate.BlobHeader.Commitment.Commitment d. digest certificate.BlobHeader.Commitment.LengthCommitment e. digest certificate.BlobHeader.Commitment.LengthProof f. digest certificate.BlobHeader.Commitment.Length (4 bytes, unsigned big endian) g. digest certificate.BlobHeader.PaymentHeader.AccountId h. digest certificate.BlobHeader.PaymentHeader.Timestamp (4 bytes, signed big endian) i. digest certificate.BlobHeader.PaymentHeader.CumulativePayment j. digest certificate.BlobHeader.Signature k. for each relay in certificate.Relays: i. digest relay (4 bytes, unsigned big endian) 4. digest disperserID (4 bytes, unsigned big endian) Note that this signature is not included in the hash for obvious reasons. | diff --git a/api/docs/node_v2.html b/api/docs/node_v2.html index 0712fdc6e9..c13f01d956 100644 --- a/api/docs/node_v2.html +++ b/api/docs/node_v2.html @@ -416,11 +416,10 @@

StoreChunksRequest

e. digest certificate.BlobHeader.Commitment.LengthProof f. digest certificate.BlobHeader.Commitment.Length (4 bytes, unsigned big endian) g. digest certificate.BlobHeader.PaymentHeader.AccountId - h. digest certificate.BlobHeader.PaymentHeader.ReservationPeriod (4 bytes, unsigned big endian) + h. digest certificate.BlobHeader.PaymentHeader.Timestamp (4 bytes, signed big endian) i. digest certificate.BlobHeader.PaymentHeader.CumulativePayment - j. digest certificate.BlobHeader.PaymentHeader.Salt (4 bytes, unsigned big endian) - k. digest certificate.BlobHeader.Signature - l. for each relay in certificate.Relays: + j. digest certificate.BlobHeader.Signature + k. for each relay in certificate.Relays: i. digest relay (4 bytes, unsigned big endian) 4. digest disperserID (4 bytes, unsigned big endian) diff --git a/api/docs/node_v2.md b/api/docs/node_v2.md index cecd6634e5..edb34b84b9 100644 --- a/api/docs/node_v2.md +++ b/api/docs/node_v2.md @@ -114,7 +114,7 @@ Request that the Node store a batch of chunks. Algorithm for computing the hash is as follows. All integer values are serialized in big-endian order (unsigned). A reference implementation (golang) can be found at https://github.com/Layr-Labs/eigenda/blob/master/disperser/auth/request_signing.go -1. digest batch.BatchHeader.BatchRoot 2. digest batch.BatchHeader.ReferenceBlockNumber (8 bytes, unsigned big endian) 3. for each certificate in batch.BlobCertificates: a. digest certificate.BlobHeader.Version (4 bytes, unsigned big endian) b. for each quorum_number in certificate.BlobHeader.QuorumNumbers: i. digest quorum_number (4 bytes, unsigned big endian) c. digest certificate.BlobHeader.Commitment.Commitment d. digest certificate.BlobHeader.Commitment.LengthCommitment e. digest certificate.BlobHeader.Commitment.LengthProof f. digest certificate.BlobHeader.Commitment.Length (4 bytes, unsigned big endian) g. digest certificate.BlobHeader.PaymentHeader.AccountId h. digest certificate.BlobHeader.PaymentHeader.ReservationPeriod (4 bytes, unsigned big endian) i. digest certificate.BlobHeader.PaymentHeader.CumulativePayment j. digest certificate.BlobHeader.PaymentHeader.Salt (4 bytes, unsigned big endian) k. digest certificate.BlobHeader.Signature l. for each relay in certificate.Relays: i. digest relay (4 bytes, unsigned big endian) 4. digest disperserID (4 bytes, unsigned big endian) +1. digest batch.BatchHeader.BatchRoot 2. digest batch.BatchHeader.ReferenceBlockNumber (8 bytes, unsigned big endian) 3. for each certificate in batch.BlobCertificates: a. digest certificate.BlobHeader.Version (4 bytes, unsigned big endian) b. for each quorum_number in certificate.BlobHeader.QuorumNumbers: i. digest quorum_number (4 bytes, unsigned big endian) c. digest certificate.BlobHeader.Commitment.Commitment d. digest certificate.BlobHeader.Commitment.LengthCommitment e. digest certificate.BlobHeader.Commitment.LengthProof f. digest certificate.BlobHeader.Commitment.Length (4 bytes, unsigned big endian) g. digest certificate.BlobHeader.PaymentHeader.AccountId h. digest certificate.BlobHeader.PaymentHeader.Timestamp (4 bytes, signed big endian) i. digest certificate.BlobHeader.PaymentHeader.CumulativePayment j. digest certificate.BlobHeader.Signature k. for each relay in certificate.Relays: i. digest relay (4 bytes, unsigned big endian) 4. digest disperserID (4 bytes, unsigned big endian) Note that this signature is not included in the hash for obvious reasons. | diff --git a/api/grpc/common/v2/common_v2.pb.go b/api/grpc/common/v2/common_v2.pb.go index c95bf327b1..8ffd2b139b 100644 --- a/api/grpc/common/v2/common_v2.pb.go +++ b/api/grpc/common/v2/common_v2.pb.go @@ -46,10 +46,6 @@ type BlobHeader struct { Commitment *common.BlobCommitment `protobuf:"bytes,3,opt,name=commitment,proto3" json:"commitment,omitempty"` // payment_header contains payment information for the blob PaymentHeader *PaymentHeader `protobuf:"bytes,4,opt,name=payment_header,json=paymentHeader,proto3" json:"payment_header,omitempty"` - // salt is used to ensure that the dispersal request is intentionally unique. This is currently only useful for - // reserved payments when the same blob is submitted multiple times within the same reservation period. On-demand - // payments already have unique cumulative_payment values for intentionally unique dispersal requests. - Salt uint32 `protobuf:"varint,5,opt,name=salt,proto3" json:"salt,omitempty"` } func (x *BlobHeader) Reset() { @@ -112,13 +108,6 @@ func (x *BlobHeader) GetPaymentHeader() *PaymentHeader { return nil } -func (x *BlobHeader) GetSalt() uint32 { - if x != nil { - return x.Salt - } - return 0 -} - // BlobCertificate contains a full description of a blob and how it is dispersed. Part of the certificate // is provided by the blob submitter (i.e. the blob header), and part is provided by the disperser (i.e. the relays). // Validator nodes eventually sign the blob certificate once they are in custody of the required chunks @@ -327,6 +316,10 @@ type PaymentHeader struct { // The account ID of the disperser client. This account ID is an eth wallet address of the user, // corresponding to the key used by the client to sign the BlobHeader. AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + // The timestamp should be set as the UNIX timestamp in units of nanoseconds at the time of the dispersal request, + // and will be used to determine the reservation period, and compared against the reservation active start and end timestamps + // On-chain reservation timestamps are in units of seconds, while the payment header timestamp is in nanoseconds for greater precision. + // If the timestamp is not set or is not part of the previous or current reservation period, the request will be rejected. // The reservation period of the dispersal request is used for rate-limiting the user's account against their dedicated // bandwidth. This method requires users to set up reservation accounts with EigenDA team, and the team will set up an // on-chain record of reserved bandwidth for the user for some period of time. The dispersal client's accountant will set @@ -337,19 +330,21 @@ type PaymentHeader struct { // Example Usage Flow: // 1. The user sets up a reservation with the EigenDA team, including throughput (symbolsPerSecond), startTimestamp, // endTimestamp, and reservationPeriodInterval. - // 2. When sending a dispersal request at time t, the client computes reservation_period = floor(t / reservationPeriodInterval). - // 3. The request includes this reservation_period index. The disperser checks: + // 2. When sending a dispersal request at time t, the client fill in the timestamp field with t. + // 3. The disperser take timestamp t and checks the reservation period and the user's bandwidth capacity: // - If the reservation is active (t >= startTimestamp and t < endTimestamp). // - After rounding up to the nearest multiple of `minNumSymbols` defined by the payment vault contract, the user still has enough bandwidth capacity // (hasn’t exceeded symbolsPerSecond * reservationPeriodInterval). - // 4. Server always go ahead with recording the received request, and then categorize the scenarios + // - The request is ratelimited against the current reservation period, and calculated as reservation_period = t / reservationPeriodInterval. + // the request's reservation period must either be the disperser server's current reservation period or the previous reservation period. + // 4. Server always go ahead with recording the received request in the current reservation period, and then categorize the scenarios // - If the remaining bandwidth is sufficient for the request, the dispersal request proceeds. // - If the remaining bandwidth is not enough for the request, server fills up the current bin and overflowing the extra to a future bin. // - If the bandwidth has already been exhausted, the request is rejected. // 5. Once the dispersal request signature has been verified, the server will not roll back the payment or the usage records. // Users should be aware of this when planning their usage. The dispersal client written by EigenDA team takes account of this. // 6. When the reservation ends or usage is exhausted, the client must wait for the next reservation period or switch to on-demand. - ReservationPeriod uint32 `protobuf:"varint,2,opt,name=reservation_period,json=reservationPeriod,proto3" json:"reservation_period,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Cumulative payment is the total amount of tokens paid by the requesting account, including the current request. // This value is serialized as an uint256 and parsed as a big integer, and must match the user’s on-chain deposit limits // as well as the recorded payments for all previous requests. Because it is a cumulative (not incremental) total, @@ -412,9 +407,9 @@ func (x *PaymentHeader) GetAccountId() string { return "" } -func (x *PaymentHeader) GetReservationPeriod() uint32 { +func (x *PaymentHeader) GetTimestamp() int64 { if x != nil { - return x.ReservationPeriod + return x.Timestamp } return 0 } @@ -432,7 +427,7 @@ var file_common_v2_common_v2_proto_rawDesc = []byte{ 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x1a, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xda, 0x01, 0x0a, 0x0a, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc6, 0x01, 0x0a, 0x0a, 0x42, 0x6c, 0x6f, 0x62, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x5f, 0x6e, @@ -445,44 +440,41 @@ var file_common_v2_common_v2_proto_rawDesc = []byte{ 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0d, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x73, 0x61, 0x6c, 0x74, 0x22, 0x86, 0x01, 0x0a, 0x0f, 0x42, 0x6c, 0x6f, - 0x62, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x0b, - 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, - 0x6f, 0x62, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x62, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x4b, 0x65, 0x79, - 0x73, 0x22, 0x62, 0x0a, 0x0b, 0x42, 0x61, 0x74, 0x63, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x12, - 0x34, 0x0a, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x14, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x80, 0x01, 0x0a, 0x05, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, - 0x2e, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x47, 0x0a, 0x11, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x10, 0x62, 0x6c, 0x6f, 0x62, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x0d, 0x50, 0x61, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x75, 0x6d, 0x75, - 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4c, 0x61, 0x79, 0x72, 0x2d, 0x4c, 0x61, 0x62, 0x73, 0x2f, - 0x65, 0x69, 0x67, 0x65, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x86, 0x01, 0x0a, 0x0f, 0x42, 0x6c, 0x6f, 0x62, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x62, + 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x62, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x62, 0x0a, + 0x0b, 0x42, 0x61, 0x74, 0x63, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, + 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x80, 0x01, 0x0a, 0x05, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x2e, 0x0a, 0x06, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x11, 0x62, + 0x6c, 0x6f, 0x62, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x52, 0x10, 0x62, 0x6c, 0x6f, 0x62, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x7b, 0x0a, 0x0d, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, + 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x4c, 0x61, 0x79, 0x72, 0x2d, 0x4c, 0x61, 0x62, 0x73, 0x2f, 0x65, 0x69, 0x67, 0x65, 0x6e, 0x64, + 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2f, 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/grpc/disperser/v2/disperser_v2.pb.go b/api/grpc/disperser/v2/disperser_v2.pb.go index 81aefea382..ffbffc7baf 100644 --- a/api/grpc/disperser/v2/disperser_v2.pb.go +++ b/api/grpc/disperser/v2/disperser_v2.pb.go @@ -58,7 +58,7 @@ const ( // its required threshold, and resubmit a new blob dispersal request if not. BlobStatus_COMPLETE BlobStatus = 4 // FAILED means that the blob has failed permanently. Note that this is a terminal state, and in order to - // retry the blob, the client must submit the blob again with different salt (blob key is required to be unique). + // retry the blob, the client must submit the blob again (blob key is required to be unique). BlobStatus_FAILED BlobStatus = 5 ) diff --git a/api/grpc/validator/node_v2.pb.go b/api/grpc/validator/node_v2.pb.go index eff2c38661..81ad57cb60 100644 --- a/api/grpc/validator/node_v2.pb.go +++ b/api/grpc/validator/node_v2.pb.go @@ -49,11 +49,10 @@ type StoreChunksRequest struct { // e. digest certificate.BlobHeader.Commitment.LengthProof // f. digest certificate.BlobHeader.Commitment.Length (4 bytes, unsigned big endian) // g. digest certificate.BlobHeader.PaymentHeader.AccountId - // h. digest certificate.BlobHeader.PaymentHeader.ReservationPeriod (4 bytes, unsigned big endian) + // h. digest certificate.BlobHeader.PaymentHeader.Timestamp (4 bytes, signed big endian) // i. digest certificate.BlobHeader.PaymentHeader.CumulativePayment - // j. digest certificate.BlobHeader.PaymentHeader.Salt (4 bytes, unsigned big endian) - // k. digest certificate.BlobHeader.Signature - // l. for each relay in certificate.Relays: + // j. digest certificate.BlobHeader.Signature + // k. for each relay in certificate.Relays: // i. digest relay (4 bytes, unsigned big endian) // 4. digest disperserID (4 bytes, unsigned big endian) // diff --git a/api/hashing/node_hashing.go b/api/hashing/node_hashing.go index 5d17b49aca..975c42db1d 100644 --- a/api/hashing/node_hashing.go +++ b/api/hashing/node_hashing.go @@ -39,7 +39,6 @@ func hashBlobHeader(hasher hash.Hash, header *common.BlobHeader) { } hashBlobCommitment(hasher, header.Commitment) hashPaymentHeader(hasher, header.PaymentHeader) - hashUint32(hasher, header.Salt) } func hashBatchHeader(hasher hash.Hash, header *common.BatchHeader) { @@ -56,6 +55,6 @@ func hashBlobCommitment(hasher hash.Hash, commitment *commonv1.BlobCommitment) { func hashPaymentHeader(hasher hash.Hash, header *common.PaymentHeader) { hasher.Write([]byte(header.AccountId)) - hashUint32(hasher, header.ReservationPeriod) + hashInt64(hasher, header.Timestamp) hasher.Write(header.CumulativePayment) } diff --git a/api/hashing/utils.go b/api/hashing/utils.go index bc6f8d289e..c463454fbd 100644 --- a/api/hashing/utils.go +++ b/api/hashing/utils.go @@ -18,3 +18,10 @@ func hashUint64(hasher hash.Hash, value uint64) { binary.BigEndian.PutUint64(bytes, value) hasher.Write(bytes) } + +// hashInt64 hashes the given int64 value. +func hashInt64(hasher hash.Hash, value int64) { + bytes := make([]byte, 8) + binary.BigEndian.PutUint64(bytes, uint64(value)) + hasher.Write(bytes) +} diff --git a/api/proto/common/v2/common_v2.proto b/api/proto/common/v2/common_v2.proto index 3f8f56638f..8d9dd5be54 100644 --- a/api/proto/common/v2/common_v2.proto +++ b/api/proto/common/v2/common_v2.proto @@ -24,10 +24,6 @@ message BlobHeader { common.BlobCommitment commitment = 3; // payment_header contains payment information for the blob PaymentHeader payment_header = 4; - // salt is used to ensure that the dispersal request is intentionally unique. This is currently only useful for - // reserved payments when the same blob is submitted multiple times within the same reservation period. On-demand - // payments already have unique cumulative_payment values for intentionally unique dispersal requests. - uint32 salt = 5; } // BlobCertificate contains a full description of a blob and how it is dispersed. Part of the certificate @@ -78,6 +74,10 @@ message PaymentHeader { // corresponding to the key used by the client to sign the BlobHeader. string account_id = 1; + // The timestamp should be set as the UNIX timestamp in units of nanoseconds at the time of the dispersal request, + // and will be used to determine the reservation period, and compared against the reservation active start and end timestamps + // On-chain reservation timestamps are in units of seconds, while the payment header timestamp is in nanoseconds for greater precision. + // If the timestamp is not set or is not part of the previous or current reservation period, the request will be rejected. // The reservation period of the dispersal request is used for rate-limiting the user's account against their dedicated // bandwidth. This method requires users to set up reservation accounts with EigenDA team, and the team will set up an // on-chain record of reserved bandwidth for the user for some period of time. The dispersal client's accountant will set @@ -88,19 +88,21 @@ message PaymentHeader { // Example Usage Flow: // 1. The user sets up a reservation with the EigenDA team, including throughput (symbolsPerSecond), startTimestamp, // endTimestamp, and reservationPeriodInterval. - // 2. When sending a dispersal request at time t, the client computes reservation_period = floor(t / reservationPeriodInterval). - // 3. The request includes this reservation_period index. The disperser checks: + // 2. When sending a dispersal request at time t, the client fill in the timestamp field with t. + // 3. The disperser take timestamp t and checks the reservation period and the user's bandwidth capacity: // - If the reservation is active (t >= startTimestamp and t < endTimestamp). // - After rounding up to the nearest multiple of `minNumSymbols` defined by the payment vault contract, the user still has enough bandwidth capacity // (hasn’t exceeded symbolsPerSecond * reservationPeriodInterval). - // 4. Server always go ahead with recording the received request, and then categorize the scenarios + // - The request is ratelimited against the current reservation period, and calculated as reservation_period = t / reservationPeriodInterval. + // the request's reservation period must either be the disperser server's current reservation period or the previous reservation period. + // 4. Server always go ahead with recording the received request in the current reservation period, and then categorize the scenarios // - If the remaining bandwidth is sufficient for the request, the dispersal request proceeds. // - If the remaining bandwidth is not enough for the request, server fills up the current bin and overflowing the extra to a future bin. // - If the bandwidth has already been exhausted, the request is rejected. // 5. Once the dispersal request signature has been verified, the server will not roll back the payment or the usage records. // Users should be aware of this when planning their usage. The dispersal client written by EigenDA team takes account of this. // 6. When the reservation ends or usage is exhausted, the client must wait for the next reservation period or switch to on-demand. - uint32 reservation_period = 2; + int64 timestamp = 2; // Cumulative payment is the total amount of tokens paid by the requesting account, including the current request. // This value is serialized as an uint256 and parsed as a big integer, and must match the user’s on-chain deposit limits diff --git a/api/proto/disperser/v2/disperser_v2.proto b/api/proto/disperser/v2/disperser_v2.proto index 49edda557d..9945cf66c3 100644 --- a/api/proto/disperser/v2/disperser_v2.proto +++ b/api/proto/disperser/v2/disperser_v2.proto @@ -165,7 +165,7 @@ enum BlobStatus { COMPLETE = 4; // FAILED means that the blob has failed permanently. Note that this is a terminal state, and in order to - // retry the blob, the client must submit the blob again with different salt (blob key is required to be unique). + // retry the blob, the client must submit the blob again (blob key is required to be unique). FAILED = 5; } diff --git a/api/proto/validator/node_v2.proto b/api/proto/validator/node_v2.proto index d8897a304c..294168ef5f 100644 --- a/api/proto/validator/node_v2.proto +++ b/api/proto/validator/node_v2.proto @@ -55,11 +55,10 @@ message StoreChunksRequest { // e. digest certificate.BlobHeader.Commitment.LengthProof // f. digest certificate.BlobHeader.Commitment.Length (4 bytes, unsigned big endian) // g. digest certificate.BlobHeader.PaymentHeader.AccountId - // h. digest certificate.BlobHeader.PaymentHeader.ReservationPeriod (4 bytes, unsigned big endian) + // h. digest certificate.BlobHeader.PaymentHeader.Timestamp (4 bytes, signed big endian) // i. digest certificate.BlobHeader.PaymentHeader.CumulativePayment - // j. digest certificate.BlobHeader.PaymentHeader.Salt (4 bytes, unsigned big endian) - // k. digest certificate.BlobHeader.Signature - // l. for each relay in certificate.Relays: + // j. digest certificate.BlobHeader.Signature + // k. for each relay in certificate.Relays: // i. digest relay (4 bytes, unsigned big endian) // 4. digest disperserID (4 bytes, unsigned big endian) // diff --git a/contracts/bindings/EigenDACertVerifier/binding.go b/contracts/bindings/EigenDACertVerifier/binding.go index 24036b702a..118805196b 100644 --- a/contracts/bindings/EigenDACertVerifier/binding.go +++ b/contracts/bindings/EigenDACertVerifier/binding.go @@ -99,7 +99,6 @@ type BlobHeaderV2 struct { QuorumNumbers []byte Commitment BlobCommitment PaymentHeaderHash [32]byte - Salt uint32 } // BlobInclusionInfo is an auto generated low-level Go binding around an user-defined struct. @@ -159,8 +158,8 @@ type VersionedBlobParams struct { // ContractEigenDACertVerifierMetaData contains all meta data concerning the ContractEigenDACertVerifier contract. var ContractEigenDACertVerifierMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_eigenDAThresholdRegistry\",\"type\":\"address\",\"internalType\":\"contractIEigenDAThresholdRegistry\"},{\"name\":\"_eigenDABatchMetadataStorage\",\"type\":\"address\",\"internalType\":\"contractIEigenDABatchMetadataStorage\"},{\"name\":\"_eigenDASignatureVerifier\",\"type\":\"address\",\"internalType\":\"contractIEigenDASignatureVerifier\"},{\"name\":\"_eigenDARelayRegistry\",\"type\":\"address\",\"internalType\":\"contractIEigenDARelayRegistry\"},{\"name\":\"_operatorStateRetriever\",\"type\":\"address\",\"internalType\":\"contractOperatorStateRetriever\"},{\"name\":\"_registryCoordinator\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"},{\"name\":\"_securityThresholdsV2\",\"type\":\"tuple\",\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"_quorumNumbersRequiredV2\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenDABatchMetadataStorage\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDABatchMetadataStorage\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenDARelayRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDARelayRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenDASignatureVerifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDASignatureVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenDAThresholdRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDAThresholdRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlobParams\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structVersionedBlobParams\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getIsQuorumRequired\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNonSignerStakesAndSignature\",\"inputs\":[{\"name\":\"signedBatch\",\"type\":\"tuple\",\"internalType\":\"structSignedBatch\",\"components\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeaderV2\",\"components\":[{\"name\":\"batchRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"attestation\",\"type\":\"tuple\",\"internalType\":\"structAttestation\",\"components\":[{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"quorumNumbers\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structNonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQuorumAdversaryThresholdPercentage\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQuorumConfirmationThresholdPercentage\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorStateRetriever\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOperatorStateRetriever\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumAdversaryThresholdPercentages\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumConfirmationThresholdPercentages\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumNumbersRequired\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumNumbersRequiredV2\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registryCoordinator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"securityThresholdsV2\",\"inputs\":[],\"outputs\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertSecurityParams\",\"inputs\":[{\"name\":\"blobParams\",\"type\":\"tuple\",\"internalType\":\"structVersionedBlobParams\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"securityThresholds\",\"type\":\"tuple\",\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertSecurityParams\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"securityThresholds\",\"type\":\"tuple\",\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertV1\",\"inputs\":[{\"name\":\"blobHeader\",\"type\":\"tuple\",\"internalType\":\"structBlobHeader\",\"components\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"dataLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"quorumBlobParams\",\"type\":\"tuple[]\",\"internalType\":\"structQuorumBlobParam[]\",\"components\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"confirmationThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"chunkLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]},{\"name\":\"blobVerificationProof\",\"type\":\"tuple\",\"internalType\":\"structBlobVerificationProof\",\"components\":[{\"name\":\"batchId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"batchMetadata\",\"type\":\"tuple\",\"internalType\":\"structBatchMetadata\",\"components\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeader\",\"components\":[{\"name\":\"blobHeadersRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signedStakeForQuorums\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"signatoryRecordHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"confirmationBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"inclusionProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"quorumIndices\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertV2\",\"inputs\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeaderV2\",\"components\":[{\"name\":\"batchRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"blobInclusionInfo\",\"type\":\"tuple\",\"internalType\":\"structBlobInclusionInfo\",\"components\":[{\"name\":\"blobCertificate\",\"type\":\"tuple\",\"internalType\":\"structBlobCertificate\",\"components\":[{\"name\":\"blobHeader\",\"type\":\"tuple\",\"internalType\":\"structBlobHeaderV2\",\"components\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBlobCommitment\",\"components\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"lengthCommitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"lengthProof\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"length\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"paymentHeaderHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"salt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayKeys\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]},{\"name\":\"blobIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"inclusionProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonSignerStakesAndSignature\",\"type\":\"tuple\",\"internalType\":\"structNonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertV2ForZKProof\",\"inputs\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeaderV2\",\"components\":[{\"name\":\"batchRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"blobInclusionInfo\",\"type\":\"tuple\",\"internalType\":\"structBlobInclusionInfo\",\"components\":[{\"name\":\"blobCertificate\",\"type\":\"tuple\",\"internalType\":\"structBlobCertificate\",\"components\":[{\"name\":\"blobHeader\",\"type\":\"tuple\",\"internalType\":\"structBlobHeaderV2\",\"components\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBlobCommitment\",\"components\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"lengthCommitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"lengthProof\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"length\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"paymentHeaderHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"salt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayKeys\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]},{\"name\":\"blobIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"inclusionProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonSignerStakesAndSignature\",\"type\":\"tuple\",\"internalType\":\"structNonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertV2FromSignedBatch\",\"inputs\":[{\"name\":\"signedBatch\",\"type\":\"tuple\",\"internalType\":\"structSignedBatch\",\"components\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeaderV2\",\"components\":[{\"name\":\"batchRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"attestation\",\"type\":\"tuple\",\"internalType\":\"structAttestation\",\"components\":[{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"quorumNumbers\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}]},{\"name\":\"blobInclusionInfo\",\"type\":\"tuple\",\"internalType\":\"structBlobInclusionInfo\",\"components\":[{\"name\":\"blobCertificate\",\"type\":\"tuple\",\"internalType\":\"structBlobCertificate\",\"components\":[{\"name\":\"blobHeader\",\"type\":\"tuple\",\"internalType\":\"structBlobHeaderV2\",\"components\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBlobCommitment\",\"components\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"lengthCommitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"lengthProof\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"length\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"paymentHeaderHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"salt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayKeys\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]},{\"name\":\"blobIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"inclusionProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertsV1\",\"inputs\":[{\"name\":\"blobHeaders\",\"type\":\"tuple[]\",\"internalType\":\"structBlobHeader[]\",\"components\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"dataLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"quorumBlobParams\",\"type\":\"tuple[]\",\"internalType\":\"structQuorumBlobParam[]\",\"components\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"confirmationThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"chunkLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]},{\"name\":\"blobVerificationProofs\",\"type\":\"tuple[]\",\"internalType\":\"structBlobVerificationProof[]\",\"components\":[{\"name\":\"batchId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"batchMetadata\",\"type\":\"tuple\",\"internalType\":\"structBatchMetadata\",\"components\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeader\",\"components\":[{\"name\":\"blobHeadersRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signedStakeForQuorums\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"signatoryRecordHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"confirmationBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"inclusionProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"quorumIndices\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DefaultSecurityThresholdsV2Updated\",\"inputs\":[{\"name\":\"previousDefaultSecurityThresholdsV2\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"newDefaultSecurityThresholdsV2\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumAdversaryThresholdPercentagesUpdated\",\"inputs\":[{\"name\":\"previousQuorumAdversaryThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumAdversaryThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumConfirmationThresholdPercentagesUpdated\",\"inputs\":[{\"name\":\"previousQuorumConfirmationThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumConfirmationThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumNumbersRequiredUpdated\",\"inputs\":[{\"name\":\"previousQuorumNumbersRequired\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumNumbersRequired\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VersionedBlobParamsAdded\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint16\",\"indexed\":true,\"internalType\":\"uint16\"},{\"name\":\"versionedBlobParams\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structVersionedBlobParams\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"anonymous\":false}]", - Bin: "0x6101406040523480156200001257600080fd5b506040516200517638038062005176833981016040819052620000359162000265565b6001600160a01b0388811660805287811660a05286811660c05285811660e0528481166101009081529084166101205282516000805460208087015160ff94851661ffff1990931692909217939091169093029190911790558151620000a29160019190840190620000b1565b505050505050505050620003c7565b828054620000bf906200038a565b90600052602060002090601f016020900481019282620000e357600085556200012e565b82601f10620000fe57805160ff19168380011785556200012e565b828001600101855582156200012e579182015b828111156200012e57825182559160200191906001019062000111565b506200013c92915062000140565b5090565b5b808211156200013c576000815560010162000141565b6001600160a01b03811681146200016d57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620001b157620001b162000170565b604052919050565b805160ff81168114620001cb57600080fd5b919050565b600082601f830112620001e257600080fd5b81516001600160401b03811115620001fe57620001fe62000170565b602062000214601f8301601f1916820162000186565b82815285828487010111156200022957600080fd5b60005b83811015620002495785810183015182820184015282016200022c565b838111156200025b5760008385840101525b5095945050505050565b600080600080600080600080888a036101208112156200028457600080fd5b8951620002918162000157565b60208b0151909950620002a48162000157565b60408b0151909850620002b78162000157565b60608b0151909750620002ca8162000157565b60808b0151909650620002dd8162000157565b60a08b0151909550620002f08162000157565b9350604060bf19820112156200030557600080fd5b50604080519081016001600160401b0380821183831017156200032c576200032c62000170565b816040526200033e60c08d01620001b9565b83526200034e60e08d01620001b9565b60208401526101008c0151929450808311156200036a57600080fd5b50506200037a8b828c01620001d0565b9150509295985092959890939650565b600181811c908216806200039f57607f821691505b60208210811415620003c157634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051614cb7620004bf600039600081816102ae015281816105b50152610c7d015260008181610248015281816105940152610c5c0152600081816102d501528181610573015281816106dd015261084801526000818161039201528181610552015281816106bc01526108260152600081816102870152818161098601526109e20152600081816103d901528181610416015281816104aa015281816105310152818161069b01528181610804015281816108f501528181610965015281816109c101528181610a1401528181610b2f01528181610ba10152610c180152614cb76000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806372276443116100c3578063e15234ff1161007c578063e15234ff14610342578063ed0450ae1461034a578063ee6c3bcf1461037a578063efd4532b1461038d578063f25de3f8146103b4578063f8c66814146103d457600080fd5b806372276443146102d05780637d644cad146102f75780638687feae1461030a578063b74d78711461031f578063bafa910714610327578063ccb7cd0d1461032f57600080fd5b806318fc76f01161011557806318fc76f0146101da5780632ecfe72b146101ed57806331a3479a146102305780634ca22c3f14610243578063640f65d9146102825780636d14a987146102a957600080fd5b8063048886d2146101525780631429c7c21461017a578063143eb4d91461019f5780631520cf8d146101b457806315e7dcbf146101c7575b600080fd5b610165610160366004612c7a565b6103fb565b60405190151581526020015b60405180910390f35b61018d610188366004612c7a565b61048f565b60405160ff9091168152602001610171565b6101b26101ad366004612df2565b61051e565b005b6101b26101c2366004612e80565b61052c565b6101b26101d5366004612ee3565b610696565b6101656101e8366004612ee3565b6107d2565b6102006101fb366004612f78565b6108bb565b60408051825163ffffffff9081168252602080850151909116908201529181015160ff1690820152606001610171565b6101b261023e366004612fde565b610960565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b6101b2610305366004613049565b6109bc565b610312610a10565b6040516101719190613113565b610312610a9d565b610312610b2b565b6101b261033d366004613126565b610b8b565b610312610b9d565b6000546103609060ff8082169161010090041682565b6040805160ff938416815292909116602083015201610171565b61018d610388366004612c7a565b610bfd565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b6103c76103c2366004613151565b610c4f565b6040516101719190613374565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b604051630244436960e11b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063048886d290602401602060405180830381865afa158015610465573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104899190613387565b92915050565b604051630a14e3e160e11b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631429c7c2906024015b602060405180830381865afa1580156104fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048991906133a9565b6105288282610caa565b5050565b6105287f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006105dd886135a4565b6105e688613713565b6040805180820190915260005460ff808216835261010090910416602082015260018054610613906138d0565b80601f016020809104026020016040519081016040528092919081815260200182805461063f906138d0565b801561068c5780601f106106615761010080835404028352916020019161068c565b820191906000526020600020905b81548152906001019060200180831161066f57829003601f168201915b5050505050610e68565b6107cd7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061070b36889003880188613905565b61071487613713565b61071d876139a0565b6040805180820190915260005460ff80821683526101009091041660208201526001805461074a906138d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610776906138d0565b80156107c35780601f10610798576101008083540402835291602001916107c3565b820191906000526020600020905b8154815290600101906020018083116107a657829003601f168201915b5050505050610e97565b505050565b604051635a6d12c360e01b815260009073__$b5e4fc231d81cbd1f60cac3db25e9b5865$__90635a6d12c39061087b907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a90600190600401613e5f565b60006040518083038186803b15801561089357600080fd5b505af49250505080156108a4575060015b6108b0575060006108b4565b5060015b9392505050565b60408051606081018252600080825260208201819052818301529051632ecfe72b60e01b815261ffff831660048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632ecfe72b90602401606060405180830381865afa15801561093c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104899190614091565b6109b67f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000868686866109b1610b9d565b6112bb565b50505050565b6105287f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008484610a0b610b9d565b611d7d565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638687feae6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a70573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a989190810190614102565b905090565b60018054610aaa906138d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad6906138d0565b8015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b505050505081565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bafa91076040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a70573d6000803e3d6000fd5b610528610b97836108bb565b82610caa565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e15234ff6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a70573d6000803e3d6000fd5b60405163ee6c3bcf60e01b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ee6c3bcf906024016104dd565b610c57612bbf565b6104897f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610ca5856135a4565b612482565b806020015160ff16816000015160ff1611610d6c5760405162461bcd60e51b81526020600482015260776024820152600080516020614c6283398151915260448201527f726966794441436572745365637572697479506172616d733a20636f6e66697260648201527f6d6174696f6e5468726573686f6c64206d75737420626520677265617465722060848201527f7468616e206164766572736172795468726573686f6c6400000000000000000060a482015260c4015b60405180910390fd5b60208101518151600091610d7f91614185565b60ff1690506000836020015163ffffffff16846040015160ff1683620f4240610da891906141be565b610db291906141be565b610dbe906127106141d2565b610dc891906141e9565b8451909150610dd990612710614208565b63ffffffff168110156109b65760405162461bcd60e51b815260206004820152605a6024820152600080516020614c6283398151915260448201527f726966794441436572745365637572697479506172616d733a2073656375726960648201527f747920617373756d7074696f6e7320617265206e6f74206d6574000000000000608482015260a401610d63565b6000610e75878787612482565b9050610e8b8a8a8a886000015188868989610e97565b50505050505050505050565b610ee984604001518660000151610eb18760000151612698565b604051602001610ec391815260200190565b60405160208183030381529060405280519060200120876020015163ffffffff166126dd565b610f645760405162461bcd60e51b81526020600482015260526024820152600080516020614c6283398151915260448201527f726966794441436572745632466f7251756f72756d733a20696e636c7573696f6064820152711b881c1c9bdbd9881a5cc81a5b9d985b1a5960721b608482015260a401610d63565b600080886001600160a01b0316636efb4636610f7f896126f5565b885151602090810151908b01516040516001600160e01b031960e086901b168152610fb1939291908b90600401614234565b600060405180830381865afa158015610fce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ff691908101906142dc565b9150915061100c88876000015160400151612720565b85515151604051632ecfe72b60e01b815261ffff9091166004820152611087906001600160a01b038c1690632ecfe72b90602401606060405180830381865afa15801561105d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110819190614091565b85610caa565b6000805b87515160200151518110156111f957856000015160ff16846020015182815181106110b8576110b8614378565b60200260200101516110ca919061438e565b6001600160601b03166064856000015183815181106110eb576110eb614378565b60200260200101516001600160601b031661110691906141e9565b10156111b45760405162461bcd60e51b81526020600482015260786024820152600080516020614c6283398151915260448201527f726966794441436572745632466f7251756f72756d733a207369676e61746f7260648201527f69657320646f206e6f74206f776e206174206c65617374207468726573686f6c60848201527f642070657263656e74616765206f6620612071756f72756d000000000000000060a482015260c401610d63565b8751516020015180516111e5918491849081106111d3576111d3614378565b0160200151600160f89190911c1b1790565b9150806111f1816143b4565b91505061108b565b5061120d61120685612853565b8281161490565b6112ae5760405162461bcd60e51b81526020600482015260726024820152600080516020614c6283398151915260448201527f726966794441436572745632466f7251756f72756d733a20726571756972656460648201527f2071756f72756d7320617265206e6f74206120737562736574206f662074686560848201527120636f6e6669726d65642071756f72756d7360701b60a482015260c401610d63565b5050505050505050505050565b83821461135a5760405162461bcd60e51b815260206004820152606d6024820152600080516020614c6283398151915260448201527f7269667944414365727473466f7251756f72756d733a20626c6f62486561646560648201527f727320616e6420626c6f62566572696669636174696f6e50726f6f6673206c6560848201526c0dccee8d040dad2e6dac2e8c6d609b1b60a482015260c401610d63565b6000876001600160a01b031663bafa91076040518163ffffffff1660e01b8152600401600060405180830381865afa15801561139a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113c29190810190614102565b905060005b85811015611d7257876001600160a01b031663eccbbfc98686848181106113f0576113f0614378565b905060200281019061140291906143cf565b6114109060208101906143ef565b6040516001600160e01b031960e084901b16815263ffffffff919091166004820152602401602060405180830381865afa158015611452573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611476919061440c565b6114b986868481811061148b5761148b614378565b905060200281019061149d91906143cf565b6114ab906040810190614425565b6114b49061443b565b6129e0565b1461154c5760405162461bcd60e51b81526020600482015260636024820152600080516020614c6283398151915260448201527f7269667944414365727473466f7251756f72756d733a2062617463684d65746160648201527f6461746120646f6573206e6f74206d617463682073746f726564206d6574616460848201526261746160e81b60a482015260c401610d63565b61169285858381811061156157611561614378565b905060200281019061157391906143cf565b611581906060810190614512565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508992508891508590508181106115ca576115ca614378565b90506020028101906115dc91906143cf565b6115ea906040810190614425565b6115f49080614558565b3561162a8a8a8681811061160a5761160a614378565b905060200281019061161c9190614558565b6116259061456e565b612a51565b60405160200161163c91815260200190565b6040516020818303038152906040528051906020012088888681811061166457611664614378565b905060200281019061167691906143cf565b6116879060408101906020016143ef565b63ffffffff166126dd565b61170c5760405162461bcd60e51b81526020600482015260516024820152600080516020614c6283398151915260448201527f7269667944414365727473466f7251756f72756d733a20696e636c7573696f6e606482015270081c1c9bdbd9881a5cc81a5b9d985b1a59607a1b608482015260a401610d63565b6000805b88888481811061172257611722614378565b90506020028101906117349190614558565b61174290606081019061468d565b9050811015611cb45788888481811061175d5761175d614378565b905060200281019061176f9190614558565b61177d90606081019061468d565b8281811061178d5761178d614378565b6117a39260206080909202019081019150612c7a565b60ff168787858181106117b8576117b8614378565b90506020028101906117ca91906143cf565b6117d8906040810190614425565b6117e29080614558565b6117f0906020810190614512565b89898781811061180257611802614378565b905060200281019061181491906143cf565b611822906080810190614512565b8581811061183257611832614378565b919091013560f81c905081811061184b5761184b614378565b9050013560f81c60f81b60f81c60ff16146118d75760405162461bcd60e51b81526020600482015260526024820152600080516020614c6283398151915260448201527f7269667944414365727473466f7251756f72756d733a2071756f72756d4e756d6064820152710c4cae440c8decae640dcdee840dac2e8c6d60731b608482015260a401610d63565b8888848181106118e9576118e9614378565b90506020028101906118fb9190614558565b61190990606081019061468d565b8281811061191957611919614378565b90506080020160200160208101906119319190612c7a565b60ff1689898581811061194657611946614378565b90506020028101906119589190614558565b61196690606081019061468d565b8381811061197657611976614378565b905060800201604001602081019061198e9190612c7a565b60ff1611611a185760405162461bcd60e51b815260206004820152605a6024820152600080516020614c6283398151915260448201527f7269667944414365727473466f7251756f72756d733a207468726573686f6c6460648201527f2070657263656e746167657320617265206e6f742076616c6964000000000000608482015260a401610d63565b83898985818110611a2b57611a2b614378565b9050602002810190611a3d9190614558565b611a4b90606081019061468d565b83818110611a5b57611a5b614378565b611a719260206080909202019081019150612c7a565b60ff1681518110611a8457611a84614378565b016020015160f81c898985818110611a9e57611a9e614378565b9050602002810190611ab09190614558565b611abe90606081019061468d565b83818110611ace57611ace614378565b9050608002016040016020810190611ae69190612c7a565b60ff161015611b075760405162461bcd60e51b8152600401610d63906146d6565b888884818110611b1957611b19614378565b9050602002810190611b2b9190614558565b611b3990606081019061468d565b82818110611b4957611b49614378565b9050608002016040016020810190611b619190612c7a565b60ff16878785818110611b7657611b76614378565b9050602002810190611b8891906143cf565b611b96906040810190614425565b611ba09080614558565b611bae906040810190614512565b898987818110611bc057611bc0614378565b9050602002810190611bd291906143cf565b611be0906080810190614512565b85818110611bf057611bf0614378565b919091013560f81c9050818110611c0957611c09614378565b9050013560f81c60f81b60f81c60ff161015611c375760405162461bcd60e51b8152600401610d63906146d6565b611ca0828a8a86818110611c4d57611c4d614378565b9050602002810190611c5f9190614558565b611c6d90606081019061468d565b84818110611c7d57611c7d614378565b611c939260206080909202019081019150612c7a565b600160ff919091161b1790565b915080611cac816143b4565b915050611710565b50611cc161120685612853565b611d615760405162461bcd60e51b81526020600482015260716024820152600080516020614c6283398151915260448201527f7269667944414365727473466f7251756f72756d733a2072657175697265642060648201527f71756f72756d7320617265206e6f74206120737562736574206f662074686520608482015270636f6e6669726d65642071756f72756d7360781b60a482015260c401610d63565b50611d6b816143b4565b90506113c7565b505050505050505050565b6001600160a01b03841663eccbbfc9611d9960208501856143ef565b6040516001600160e01b031960e084901b16815263ffffffff919091166004820152602401602060405180830381865afa158015611ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dff919061440c565b611e0f6114ab6040850185614425565b14611ea15760405162461bcd60e51b81526020600482015260626024820152600080516020614c6283398151915260448201527f72696679444143657274466f7251756f72756d733a2062617463684d6574616460648201527f61746120646f6573206e6f74206d617463682073746f726564206d6574616461608482015261746160f01b60a482015260c401610d63565b611f45611eb16060840184614512565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ef3925050506040850185614425565b611efd9080614558565b35611f0a6116258761456e565b604051602001611f1c91815260200190565b6040516020818303038152906040528051906020012085602001602081019061168791906143ef565b611fbe5760405162461bcd60e51b81526020600482015260506024820152600080516020614c6283398151915260448201527f72696679444143657274466f7251756f72756d733a20696e636c7573696f6e2060648201526f1c1c9bdbd9881a5cc81a5b9d985b1a5960821b608482015260a401610d63565b6000805b611fcf606086018661468d565b90508110156123ce57611fe5606086018661468d565b82818110611ff557611ff5614378565b61200b9260206080909202019081019150612c7a565b60ff1661201b6040860186614425565b6120259080614558565b612033906020810190614512565b6120406080880188614512565b8581811061205057612050614378565b919091013560f81c905081811061206957612069614378565b9050013560f81c60f81b60f81c60ff16146120f45760405162461bcd60e51b81526020600482015260516024820152600080516020614c6283398151915260448201527f72696679444143657274466f7251756f72756d733a2071756f72756d4e756d626064820152700cae440c8decae640dcdee840dac2e8c6d607b1b608482015260a401610d63565b612101606086018661468d565b8281811061211157612111614378565b90506080020160200160208101906121299190612c7a565b60ff16612139606087018761468d565b8381811061214957612149614378565b90506080020160400160208101906121619190612c7a565b60ff16116121eb5760405162461bcd60e51b81526020600482015260596024820152600080516020614c6283398151915260448201527f72696679444143657274466f7251756f72756d733a207468726573686f6c642060648201527f70657263656e746167657320617265206e6f742076616c696400000000000000608482015260a401610d63565b6001600160a01b038716631429c7c2612207606088018861468d565b8481811061221757612217614378565b61222d9260206080909202019081019150612c7a565b6040516001600160e01b031960e084901b16815260ff9091166004820152602401602060405180830381865afa15801561226b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228f91906133a9565b60ff1661229f606087018761468d565b838181106122af576122af614378565b90506080020160400160208101906122c79190612c7a565b60ff1610156122e85760405162461bcd60e51b8152600401610d6390614751565b6122f5606086018661468d565b8281811061230557612305614378565b905060800201604001602081019061231d9190612c7a565b60ff1661232d6040860186614425565b6123379080614558565b612345906040810190614512565b6123526080880188614512565b8581811061236257612362614378565b919091013560f81c905081811061237b5761237b614378565b9050013560f81c60f81b60f81c60ff1610156123a95760405162461bcd60e51b8152600401610d6390614751565b6123ba82611c6d606088018861468d565b9150806123c6816143b4565b915050611fc2565b506123db61120683612853565b61247a5760405162461bcd60e51b81526020600482015260706024820152600080516020614c6283398151915260448201527f72696679444143657274466f7251756f72756d733a207265717569726564207160648201527f756f72756d7320617265206e6f74206120737562736574206f6620746865206360848201526f6f6e6669726d65642071756f72756d7360801b60a482015260c401610d63565b505050505050565b61248a612bbf565b602082015151516000906001600160401b038111156124ab576124ab612c97565b6040519080825280602002602001820160405280156124d4578160200160208202803683370190505b50905060005b6020840151515181101561255157612524846020015160000151828151811061250557612505614378565b6020026020010151805160009081526020918201519091526040902090565b82828151811061253657612536614378565b602090810291909101015261254a816143b4565b90506124da565b50606060005b846020015160800151518110156125be5781856020015160800151828151811061258357612583614378565b602002602001015160405160200161259c9291906147c3565b6040516020818303038152906040529150806125b7906143b4565b9050612557565b508351602001516040516313dce7dd60e21b81526000916001600160a01b03891691634f739f74916125f9918a9190879089906004016147f5565b600060405180830381865afa158015612616573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261263e9190810190614948565b805185526020958601805151878701528051870151604080880191909152815160609081015181890152915181015160808801529682015160a08701529581015160c0860152949094015160e08401525090949350505050565b60006126a78260000151612a64565b60208084015160408086015190516126c0949301614a20565b604051602081830303815290604052805190602001209050919050565b6000836126eb868585612abc565b1495945050505050565b6000816040516020016126c091908151815260209182015163ffffffff169181019190915260400190565b60005b81518110156107cd5760006001600160a01b0316836001600160a01b031663b5a872da84848151811061275857612758614378565b60200260200101516040518263ffffffff1660e01b8152600401612788919063ffffffff91909116815260200190565b602060405180830381865afa1580156127a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c99190614a81565b6001600160a01b031614156128435760405162461bcd60e51b81526020600482015260466024820152600080516020614c6283398151915260448201527f7269667952656c61794b6579735365743a2072656c6179206b6579206973206e6064820152651bdd081cd95d60d21b608482015260a401610d63565b61284c816143b4565b9050612723565b6000610100825111156128dc5760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a401610d63565b81516128ea57506000919050565b6000808360008151811061290057612900614378565b0160200151600160f89190911c81901b92505b84518110156129d75784818151811061292e5761292e614378565b0160200151600160f89190911c1b91508282116129c35760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a401610d63565b918117916129d0816143b4565b9050612913565b50909392505050565b600061048982600001516040516020016129fa9190614aaa565b60408051808303601f1901815282825280516020918201208682015187840151838601929092528484015260e01b6001600160e01b0319166060840152815160448185030181526064909301909152815191012090565b6000816040516020016126c09190614b0a565b60008160000151826020015183604001518460800151604051602001612a8d9493929190614baf565b60408051601f1981840301815282825280516020918201206060808701519285019190915291830152016126c0565b600060208451612acc9190614c35565b15612b535760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610d63565b8260205b85518111612bb657612b6a600285614c35565b612b8b57816000528086015160205260406000209150600284049350612ba4565b8086015160005281602052604060002091506002840493505b612baf602082614c49565b9050612b57565b50949350505050565b604051806101000160405280606081526020016060815260200160608152602001612be8612c25565b8152602001612c0a604051806040016040528060008152602001600081525090565b81526020016060815260200160608152602001606081525090565b6040518060400160405280612c38612c4a565b8152602001612c45612c4a565b905290565b60405180604001604052806002906020820280368337509192915050565b60ff81168114612c7757600080fd5b50565b600060208284031215612c8c57600080fd5b81356108b481612c68565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612ccf57612ccf612c97565b60405290565b604051606081016001600160401b0381118282101715612ccf57612ccf612c97565b60405160a081016001600160401b0381118282101715612ccf57612ccf612c97565b604051608081016001600160401b0381118282101715612ccf57612ccf612c97565b60405161010081016001600160401b0381118282101715612ccf57612ccf612c97565b604051601f8201601f191681016001600160401b0381118282101715612d8657612d86612c97565b604052919050565b63ffffffff81168114612c7757600080fd5b8035612dab81612d8e565b919050565b600060408284031215612dc257600080fd5b612dca612cad565b90508135612dd781612c68565b81526020820135612de781612c68565b602082015292915050565b60008082840360a0811215612e0657600080fd5b6060811215612e1457600080fd5b50612e1d612cd5565b8335612e2881612d8e565b81526020840135612e3881612d8e565b60208201526040840135612e4b81612c68565b60408201529150612e5f8460608501612db0565b90509250929050565b600060608284031215612e7a57600080fd5b50919050565b60008060408385031215612e9357600080fd5b82356001600160401b0380821115612eaa57600080fd5b612eb686838701612e68565b93506020850135915080821115612ecc57600080fd5b50612ed985828601612e68565b9150509250929050565b60008060008385036080811215612ef957600080fd5b6040811215612f0757600080fd5b5083925060408401356001600160401b0380821115612f2557600080fd5b612f3187838801612e68565b93506060860135915080821115612f4757600080fd5b5084016101808187031215612f5b57600080fd5b809150509250925092565b803561ffff81168114612dab57600080fd5b600060208284031215612f8a57600080fd5b6108b482612f66565b60008083601f840112612fa557600080fd5b5081356001600160401b03811115612fbc57600080fd5b6020830191508360208260051b8501011115612fd757600080fd5b9250929050565b60008060008060408587031215612ff457600080fd5b84356001600160401b038082111561300b57600080fd5b61301788838901612f93565b9096509450602087013591508082111561303057600080fd5b5061303d87828801612f93565b95989497509550505050565b6000806040838503121561305c57600080fd5b82356001600160401b038082111561307357600080fd5b908401906080828703121561308757600080fd5b9092506020840135908082111561309d57600080fd5b50830160a081860312156130b057600080fd5b809150509250929050565b60005b838110156130d65781810151838201526020016130be565b838111156109b65750506000910152565b600081518084526130ff8160208601602086016130bb565b601f01601f19169290920160200192915050565b6020815260006108b460208301846130e7565b6000806060838503121561313957600080fd5b61314283612f66565b9150612e5f8460208501612db0565b60006020828403121561316357600080fd5b81356001600160401b0381111561317957600080fd5b61318584828501612e68565b949350505050565b600081518084526020808501945080840160005b838110156131c357815163ffffffff16875295820195908201906001016131a1565b509495945050505050565b600081518084526020808501945080840160005b838110156131c3576131ff87835180518252602090810151910152565b60409690960195908201906001016131e2565b8060005b60028110156109b6578151845260209384019390910190600101613216565b613240828251613212565b60208101516107cd6040840182613212565b600081518084526020808501808196508360051b8101915082860160005b8581101561329a57828403895261328884835161318d565b98850198935090840190600101613270565b5091979650505050505050565b600061018082518185526132bd8286018261318d565b915050602083015184820360208601526132d782826131ce565b915050604083015184820360408601526132f182826131ce565b91505060608301516133066060860182613235565b506080830151805160e08601526020015161010085015260a0830151848203610120860152613335828261318d565b91505060c0830151848203610140860152613350828261318d565b91505060e083015184820361016086015261336b8282613252565b95945050505050565b6020815260006108b460208301846132a7565b60006020828403121561339957600080fd5b815180151581146108b457600080fd5b6000602082840312156133bb57600080fd5b81516108b481612c68565b6000604082840312156133d857600080fd5b6133e0612cad565b9050813581526020820135612de781612d8e565b60006001600160401b0382111561340d5761340d612c97565b5060051b60200190565b60006040828403121561342957600080fd5b613431612cad565b9050813581526020820135602082015292915050565b600082601f83011261345857600080fd5b8135602061346d613468836133f4565b612d5e565b82815260069290921b8401810191818101908684111561348c57600080fd5b8286015b848110156134b0576134a28882613417565b835291830191604001613490565b509695505050505050565b600082601f8301126134cc57600080fd5b6134d4612cad565b8060408401858111156134e657600080fd5b845b818110156135005780358452602093840193016134e8565b509095945050505050565b60006080828403121561351d57600080fd5b613525612cad565b905061353183836134bb565b8152612de783604084016134bb565b600082601f83011261355157600080fd5b81356020613561613468836133f4565b82815260059290921b8401810191818101908684111561358057600080fd5b8286015b848110156134b057803561359781612d8e565b8352918301918301613584565b6000606082360312156135b657600080fd5b6135be612cad565b6135c836846133c6565b815260408301356001600160401b03808211156135e457600080fd5b818501915061012082360312156135fa57600080fd5b613602612cf7565b82358281111561361157600080fd5b61361d36828601613447565b82525060208301358281111561363257600080fd5b61363e36828601613447565b6020830152506136513660408501613417565b6040820152613663366080850161350b565b60608201526101008301358281111561367b57600080fd5b61368736828601613540565b608083015250602084015250909392505050565b60006001600160401b038211156136b4576136b4612c97565b50601f01601f191660200190565b600082601f8301126136d357600080fd5b81356136e16134688261369b565b8181528460208386010111156136f657600080fd5b816020850160208301376000918101602001919091529392505050565b60006060823603121561372557600080fd5b61372d612cd5565b82356001600160401b038082111561374457600080fd5b81850191506060823603121561375957600080fd5b613761612cd5565b82358281111561377057600080fd5b8301368190036101e081121561378557600080fd5b61378d612cf7565b61379683612f66565b8152602080840135868111156137ab57600080fd5b6137b7368287016136c2565b83830152506040610160603f19850112156137d157600080fd5b6137d9612d19565b93506137e736828701613417565b84526137f6366080870161350b565b8285015261380836610100870161350b565b8185015261018085013561381b81612d8e565b8060608601525083818401526101a0850135606084015261383f6101c08601612da0565b60808401528286528188013594508685111561385a57600080fd5b61386636868a016136c2565b828701528088013594508685111561387d57600080fd5b61388936868a01613540565b8187015285895261389b828c01612da0565b828a0152808b01359750868811156138b257600080fd5b6138be36898d016136c2565b90890152509598975050505050505050565b600181811c908216806138e457607f821691505b60208210811415612e7a57634e487b7160e01b600052602260045260246000fd5b60006040828403121561391757600080fd5b6108b483836133c6565b600082601f83011261393257600080fd5b81356020613942613468836133f4565b82815260059290921b8401810191818101908684111561396157600080fd5b8286015b848110156134b05780356001600160401b038111156139845760008081fd5b6139928986838b0101613540565b845250918301918301613965565b600061018082360312156139b357600080fd5b6139bb612d3b565b82356001600160401b03808211156139d257600080fd5b6139de36838701613540565b835260208501359150808211156139f457600080fd5b613a0036838701613447565b60208401526040850135915080821115613a1957600080fd5b613a2536838701613447565b6040840152613a37366060870161350b565b6060840152613a493660e08701613417565b6080840152610120850135915080821115613a6357600080fd5b613a6f36838701613540565b60a0840152610140850135915080821115613a8957600080fd5b613a9536838701613540565b60c0840152610160850135915080821115613aaf57600080fd5b50613abc36828601613921565b60e08301525092915050565b6000808335601e19843603018112613adf57600080fd5b83016020810192503590506001600160401b03811115613afe57600080fd5b803603831315612fd757600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081833760408201600081526040808301823750600060808301525050565b6000808335601e19843603018112613b6d57600080fd5b83016020810192503590506001600160401b03811115613b8c57600080fd5b8060051b3603831315612fd757600080fd5b8183526000602080850194508260005b858110156131c3578135613bc181612d8e565b63ffffffff1687529582019590820190600101613bae565b6000808335601e19843603018112613bf057600080fd5b83016020810192503590506001600160401b03811115613c0f57600080fd5b8060061b3603831315612fd757600080fd5b81835260208301925060008160005b84811015613c5857813586526020808301359087015260409586019590910190600101613c30565b5093949350505050565b81835260006020808501808196508560051b810191508460005b8781101561329a578284038952613c938288613b56565b613c9e868284613b9e565b9a87019a9550505090840190600101613c7c565b6000610180613cc18384613b56565b828652613cd18387018284613b9e565b92505050613ce26020840184613bd9565b8583036020870152613cf5838284613c21565b92505050613d066040840184613bd9565b8583036040870152613d19838284613c21565b92505050613d2d6060850160608501613b36565b613d4760e0850160e0850180358252602090810135910152565b610120613d5681850185613b56565b86840383880152613d68848284613b9e565b9350505050610140613d7c81850185613b56565b86840383880152613d8e848284613b9e565b9350505050610160613da281850185613b56565b86840383880152613db4848284613c62565b979650505050505050565b8054600090600181811c9080831680613dd957607f831692505b6020808410821415613dfb57634e487b7160e01b600052602260045260246000fd5b83885260208801828015613e165760018114613e2757613e52565b60ff19871682528282019750613e52565b60008981526020902060005b87811015613e4c57815484820152908601908401613e33565b83019850505b5050505050505092915050565b600061014060018060a01b03808c168452808b166020850152808a16604085015250873560608401526020880135613e9681612d8e565b63ffffffff80821660808601528260a08601526101a091508835605e198a3603018112613ec257600080fd5b8981019050606084870152803593506101de19813603018412613ee457600080fd5b6060868401529283019261ffff613efa85612f66565b16610200870152613f0e6020850185613ac8565b6101e0806102208a0152613f276103e08a018385613b0d565b60408801356102408b015260608801356102608b01529250613f506102808a0160808901613b36565b613f626103008a016101008901613b36565b610180915081870135613f7481612d8e565b85166103808a0152948601356103a08901526101c094613f95868801612da0565b63ffffffff81166103c08b01529650613fb16020850185613ac8565b9750945061019f19808a850301878b0152613fcd848988613b0d565b9750613fdc6040860186613b56565b97509550808a890301828b01525050613ff6868686613b9e565b955061400460208d01612da0565b63ffffffff81166101608a0152945061402060408d018d613ac8565b9550935061013f19888703018189015250505061403e838383613b0d565b9250505082810360c08401526140548187613cb2565b855460ff80821660e087015260089190911c1661010085015290508281036101208401526140828185613dbf565b9b9a5050505050505050505050565b6000606082840312156140a357600080fd5b604051606081018181106001600160401b03821117156140c5576140c5612c97565b60405282516140d381612d8e565b815260208301516140e381612d8e565b602082015260408301516140f681612c68565b60408201529392505050565b60006020828403121561411457600080fd5b81516001600160401b0381111561412a57600080fd5b8201601f8101841361413b57600080fd5b80516141496134688261369b565b81815285602083850101111561415e57600080fd5b61336b8260208301602086016130bb565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff84168082101561419f5761419f61416f565b90039392505050565b634e487b7160e01b600052601260045260246000fd5b6000826141cd576141cd6141a8565b500490565b6000828210156141e4576141e461416f565b500390565b60008160001904831182151516156142035761420361416f565b500290565b600063ffffffff8083168185168183048111821515161561422b5761422b61416f565b02949350505050565b84815260806020820152600061424d60808301866130e7565b63ffffffff851660408401528281036060840152613db481856132a7565b600082601f83011261427c57600080fd5b8151602061428c613468836133f4565b82815260059290921b840181019181810190868411156142ab57600080fd5b8286015b848110156134b05780516001600160601b03811681146142cf5760008081fd5b83529183019183016142af565b600080604083850312156142ef57600080fd5b82516001600160401b038082111561430657600080fd5b908401906040828703121561431a57600080fd5b614322612cad565b82518281111561433157600080fd5b61433d8882860161426b565b82525060208301518281111561435257600080fd5b61435e8882860161426b565b602083015250809450505050602083015190509250929050565b634e487b7160e01b600052603260045260246000fd5b60006001600160601b038083168185168183048111821515161561422b5761422b61416f565b60006000198214156143c8576143c861416f565b5060010190565b60008235609e198336030181126143e557600080fd5b9190910192915050565b60006020828403121561440157600080fd5b81356108b481612d8e565b60006020828403121561441e57600080fd5b5051919050565b60008235605e198336030181126143e557600080fd5b60006060823603121561444d57600080fd5b614455612cd5565b82356001600160401b038082111561446c57600080fd5b81850191506080823603121561448157600080fd5b614489612d19565b8235815260208301358281111561449f57600080fd5b6144ab368286016136c2565b6020830152506040830135828111156144c357600080fd5b6144cf368286016136c2565b604083015250606083013592506144e583612d8e565b8260608201528084525050506020830135602082015261450760408401612da0565b604082015292915050565b6000808335601e1984360301811261452957600080fd5b8301803591506001600160401b0382111561454357600080fd5b602001915036819003821315612fd757600080fd5b60008235607e198336030181126143e557600080fd5b6000608080833603121561458157600080fd5b614589612cd5565b6145933685613417565b81526040808501356145a481612d8e565b6020818185015260609150818701356001600160401b038111156145c757600080fd5b870136601f8201126145d857600080fd5b80356145e6613468826133f4565b81815260079190911b8201830190838101903683111561460557600080fd5b928401925b82841015614679578884360312156146225760008081fd5b61462a612d19565b843561463581612c68565b81528486013561464481612c68565b818701528488013561465581612c68565b818901528487013561466681612d8e565b818801528252928801929084019061460a565b958701959095525093979650505050505050565b6000808335601e198436030181126146a457600080fd5b8301803591506001600160401b038211156146be57600080fd5b6020019150600781901b3603821315612fd757600080fd5b6020808252606190820152600080516020614c6283398151915260408201527f7269667944414365727473466f7251756f72756d733a20636f6e6669726d617460608201527f696f6e5468726573686f6c6450657263656e74616765206973206e6f74206d656080820152601d60fa1b60a082015260c00190565b60208082526060908201819052600080516020614c6283398151915260408301527f72696679444143657274466f7251756f72756d733a20636f6e6669726d617469908201527f6f6e5468726573686f6c6450657263656e74616765206973206e6f74206d6574608082015260a00190565b600083516147d58184602088016130bb565b60f89390931b6001600160f81b0319169190920190815260010192915050565b60018060a01b03851681526000602063ffffffff8616818401526080604084015261482360808401866130e7565b838103606085015284518082528286019183019060005b818110156148565783518352928401929184019160010161483a565b50909998505050505050505050565b600082601f83011261487657600080fd5b81516020614886613468836133f4565b82815260059290921b840181019181810190868411156148a557600080fd5b8286015b848110156134b05780516148bc81612d8e565b83529183019183016148a9565b600082601f8301126148da57600080fd5b815160206148ea613468836133f4565b82815260059290921b8401810191818101908684111561490957600080fd5b8286015b848110156134b05780516001600160401b0381111561492c5760008081fd5b61493a8986838b0101614865565b84525091830191830161490d565b60006020828403121561495a57600080fd5b81516001600160401b038082111561497157600080fd5b908301906080828603121561498557600080fd5b61498d612d19565b82518281111561499c57600080fd5b6149a887828601614865565b8252506020830151828111156149bd57600080fd5b6149c987828601614865565b6020830152506040830151828111156149e157600080fd5b6149ed87828601614865565b604083015250606083015182811115614a0557600080fd5b614a11878286016148c9565b60608301525095945050505050565b83815260006020606081840152614a3a60608401866130e7565b838103604085015284518082528286019183019060005b81811015614a7357835163ffffffff1683529284019291840191600101614a51565b509098975050505050505050565b600060208284031215614a9357600080fd5b81516001600160a01b03811681146108b457600080fd5b60208152815160208201526000602083015160806040840152614ad060a08401826130e7565b90506040840151601f19848303016060850152614aed82826130e7565b91505063ffffffff60608501511660808401528091505092915050565b60208082528251805183830152810151604083015260009060a0830181850151606063ffffffff808316828801526040925082880151608080818a015285825180885260c08b0191508884019750600093505b80841015614ba0578751805160ff90811684528a82015181168b850152888201511688840152860151851686830152968801966001939093019290820190614b5d565b509a9950505050505050505050565b60006101c061ffff87168352806020840152614bcd818401876130e7565b8551805160408601526020015160608501529150614be89050565b6020840151614bfa6080840182613235565b506040840151614c0e610100840182613235565b506060939093015163ffffffff908116610180830152919091166101a09091015292915050565b600082614c4457614c446141a8565b500690565b60008219821115614c5c57614c5c61416f565b50019056fe456967656e444143657274566572696669636174696f6e5574696c732e5f7665a26469706673582212204829f097b8f3259db7233df0da178911697516db734318fae5e91a8ff0284c7f64736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_eigenDAThresholdRegistry\",\"type\":\"address\",\"internalType\":\"contractIEigenDAThresholdRegistry\"},{\"name\":\"_eigenDABatchMetadataStorage\",\"type\":\"address\",\"internalType\":\"contractIEigenDABatchMetadataStorage\"},{\"name\":\"_eigenDASignatureVerifier\",\"type\":\"address\",\"internalType\":\"contractIEigenDASignatureVerifier\"},{\"name\":\"_eigenDARelayRegistry\",\"type\":\"address\",\"internalType\":\"contractIEigenDARelayRegistry\"},{\"name\":\"_operatorStateRetriever\",\"type\":\"address\",\"internalType\":\"contractOperatorStateRetriever\"},{\"name\":\"_registryCoordinator\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"},{\"name\":\"_securityThresholdsV2\",\"type\":\"tuple\",\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"_quorumNumbersRequiredV2\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenDABatchMetadataStorage\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDABatchMetadataStorage\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenDARelayRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDARelayRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenDASignatureVerifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDASignatureVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenDAThresholdRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDAThresholdRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlobParams\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structVersionedBlobParams\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getIsQuorumRequired\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNonSignerStakesAndSignature\",\"inputs\":[{\"name\":\"signedBatch\",\"type\":\"tuple\",\"internalType\":\"structSignedBatch\",\"components\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeaderV2\",\"components\":[{\"name\":\"batchRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"attestation\",\"type\":\"tuple\",\"internalType\":\"structAttestation\",\"components\":[{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"quorumNumbers\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structNonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQuorumAdversaryThresholdPercentage\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQuorumConfirmationThresholdPercentage\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorStateRetriever\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOperatorStateRetriever\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumAdversaryThresholdPercentages\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumConfirmationThresholdPercentages\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumNumbersRequired\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumNumbersRequiredV2\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registryCoordinator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"securityThresholdsV2\",\"inputs\":[],\"outputs\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertSecurityParams\",\"inputs\":[{\"name\":\"blobParams\",\"type\":\"tuple\",\"internalType\":\"structVersionedBlobParams\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"securityThresholds\",\"type\":\"tuple\",\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertSecurityParams\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"securityThresholds\",\"type\":\"tuple\",\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertV1\",\"inputs\":[{\"name\":\"blobHeader\",\"type\":\"tuple\",\"internalType\":\"structBlobHeader\",\"components\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"dataLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"quorumBlobParams\",\"type\":\"tuple[]\",\"internalType\":\"structQuorumBlobParam[]\",\"components\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"confirmationThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"chunkLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]},{\"name\":\"blobVerificationProof\",\"type\":\"tuple\",\"internalType\":\"structBlobVerificationProof\",\"components\":[{\"name\":\"batchId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"batchMetadata\",\"type\":\"tuple\",\"internalType\":\"structBatchMetadata\",\"components\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeader\",\"components\":[{\"name\":\"blobHeadersRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signedStakeForQuorums\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"signatoryRecordHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"confirmationBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"inclusionProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"quorumIndices\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertV2\",\"inputs\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeaderV2\",\"components\":[{\"name\":\"batchRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"blobInclusionInfo\",\"type\":\"tuple\",\"internalType\":\"structBlobInclusionInfo\",\"components\":[{\"name\":\"blobCertificate\",\"type\":\"tuple\",\"internalType\":\"structBlobCertificate\",\"components\":[{\"name\":\"blobHeader\",\"type\":\"tuple\",\"internalType\":\"structBlobHeaderV2\",\"components\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBlobCommitment\",\"components\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"lengthCommitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"lengthProof\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"length\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"paymentHeaderHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayKeys\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]},{\"name\":\"blobIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"inclusionProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonSignerStakesAndSignature\",\"type\":\"tuple\",\"internalType\":\"structNonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertV2ForZKProof\",\"inputs\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeaderV2\",\"components\":[{\"name\":\"batchRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"blobInclusionInfo\",\"type\":\"tuple\",\"internalType\":\"structBlobInclusionInfo\",\"components\":[{\"name\":\"blobCertificate\",\"type\":\"tuple\",\"internalType\":\"structBlobCertificate\",\"components\":[{\"name\":\"blobHeader\",\"type\":\"tuple\",\"internalType\":\"structBlobHeaderV2\",\"components\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBlobCommitment\",\"components\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"lengthCommitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"lengthProof\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"length\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"paymentHeaderHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayKeys\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]},{\"name\":\"blobIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"inclusionProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonSignerStakesAndSignature\",\"type\":\"tuple\",\"internalType\":\"structNonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertV2FromSignedBatch\",\"inputs\":[{\"name\":\"signedBatch\",\"type\":\"tuple\",\"internalType\":\"structSignedBatch\",\"components\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeaderV2\",\"components\":[{\"name\":\"batchRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"attestation\",\"type\":\"tuple\",\"internalType\":\"structAttestation\",\"components\":[{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"quorumNumbers\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}]},{\"name\":\"blobInclusionInfo\",\"type\":\"tuple\",\"internalType\":\"structBlobInclusionInfo\",\"components\":[{\"name\":\"blobCertificate\",\"type\":\"tuple\",\"internalType\":\"structBlobCertificate\",\"components\":[{\"name\":\"blobHeader\",\"type\":\"tuple\",\"internalType\":\"structBlobHeaderV2\",\"components\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBlobCommitment\",\"components\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"lengthCommitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"lengthProof\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"length\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"paymentHeaderHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayKeys\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]},{\"name\":\"blobIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"inclusionProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyDACertsV1\",\"inputs\":[{\"name\":\"blobHeaders\",\"type\":\"tuple[]\",\"internalType\":\"structBlobHeader[]\",\"components\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"dataLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"quorumBlobParams\",\"type\":\"tuple[]\",\"internalType\":\"structQuorumBlobParam[]\",\"components\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"confirmationThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"chunkLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]},{\"name\":\"blobVerificationProofs\",\"type\":\"tuple[]\",\"internalType\":\"structBlobVerificationProof[]\",\"components\":[{\"name\":\"batchId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"batchMetadata\",\"type\":\"tuple\",\"internalType\":\"structBatchMetadata\",\"components\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeader\",\"components\":[{\"name\":\"blobHeadersRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signedStakeForQuorums\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"signatoryRecordHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"confirmationBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"inclusionProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"quorumIndices\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DefaultSecurityThresholdsV2Updated\",\"inputs\":[{\"name\":\"previousDefaultSecurityThresholdsV2\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"newDefaultSecurityThresholdsV2\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumAdversaryThresholdPercentagesUpdated\",\"inputs\":[{\"name\":\"previousQuorumAdversaryThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumAdversaryThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumConfirmationThresholdPercentagesUpdated\",\"inputs\":[{\"name\":\"previousQuorumConfirmationThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumConfirmationThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumNumbersRequiredUpdated\",\"inputs\":[{\"name\":\"previousQuorumNumbersRequired\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumNumbersRequired\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VersionedBlobParamsAdded\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint16\",\"indexed\":true,\"internalType\":\"uint16\"},{\"name\":\"versionedBlobParams\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structVersionedBlobParams\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"anonymous\":false}]", + Bin: "0x6101406040523480156200001257600080fd5b506040516200513638038062005136833981016040819052620000359162000265565b6001600160a01b0388811660805287811660a05286811660c05285811660e0528481166101009081529084166101205282516000805460208087015160ff94851661ffff1990931692909217939091169093029190911790558151620000a29160019190840190620000b1565b505050505050505050620003c7565b828054620000bf906200038a565b90600052602060002090601f016020900481019282620000e357600085556200012e565b82601f10620000fe57805160ff19168380011785556200012e565b828001600101855582156200012e579182015b828111156200012e57825182559160200191906001019062000111565b506200013c92915062000140565b5090565b5b808211156200013c576000815560010162000141565b6001600160a01b03811681146200016d57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620001b157620001b162000170565b604052919050565b805160ff81168114620001cb57600080fd5b919050565b600082601f830112620001e257600080fd5b81516001600160401b03811115620001fe57620001fe62000170565b602062000214601f8301601f1916820162000186565b82815285828487010111156200022957600080fd5b60005b83811015620002495785810183015182820184015282016200022c565b838111156200025b5760008385840101525b5095945050505050565b600080600080600080600080888a036101208112156200028457600080fd5b8951620002918162000157565b60208b0151909950620002a48162000157565b60408b0151909850620002b78162000157565b60608b0151909750620002ca8162000157565b60808b0151909650620002dd8162000157565b60a08b0151909550620002f08162000157565b9350604060bf19820112156200030557600080fd5b50604080519081016001600160401b0380821183831017156200032c576200032c62000170565b816040526200033e60c08d01620001b9565b83526200034e60e08d01620001b9565b60208401526101008c0151929450808311156200036a57600080fd5b50506200037a8b828c01620001d0565b9150509295985092959890939650565b600181811c908216806200039f57607f821691505b60208210811415620003c157634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051614c77620004bf60003960008181610288015281816106b60152610b41015260008181610222015281816106950152610b200152600081816102af01528181610674015281816109dc0152610bb501526000818161037f01528181610653015281816109ba0152610b94015260008181610261015281816105f701526107bd0152600081816103d901528181610416015281816104aa01528181610566015281816105d6015281816106320152818161079c015281816107ef0152818161090a0152818161099801528181610a6501528181610adc0152610b730152614c776000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80638687feae116100c3578063ed0450ae1161007c578063ed0450ae14610337578063ee6c3bcf14610367578063efd4532b1461037a578063f25de3f8146103a1578063f628bfd2146103c1578063f8c66814146103d457600080fd5b80638687feae146102e4578063b74d7871146102f9578063bafa910714610301578063c779871514610309578063ccb7cd0d1461031c578063e15234ff1461032f57600080fd5b8063421c022211610115578063421c02221461020a5780634ca22c3f1461021d578063640f65d91461025c5780636d14a9871461028357806372276443146102aa5780637d644cad146102d157600080fd5b8063048886d2146101525780631429c7c21461017a578063143eb4d91461019f5780632ecfe72b146101b457806331a3479a146101f7575b600080fd5b610165610160366004612c74565b6103fb565b60405190151581526020015b60405180910390f35b61018d610188366004612c74565b61048f565b60405160ff9091168152602001610171565b6101b26101ad366004612dec565b61051e565b005b6101c76101c2366004612e74565b61052c565b60408051825163ffffffff9081168252602080850151909116908201529181015160ff1690820152606001610171565b6101b2610205366004612eda565b6105d1565b6101b2610218366004612f5d565b61062d565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b6101b26102df366004612fc0565b610797565b6102ec6107eb565b604051610171919061308a565b6102ec610878565b6102ec610906565b61016561031736600461309d565b610966565b6101b261032a366004613120565b610a4f565b6102ec610a61565b60005461034d9060ff8082169161010090041682565b6040805160ff938416815292909116602083015201610171565b61018d610375366004612c74565b610ac1565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b6103b46103af36600461314b565b610b13565b604051610171919061336e565b6101b26103cf36600461309d565b610b6e565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b604051630244436960e11b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063048886d290602401602060405180830381865afa158015610465573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104899190613381565b92915050565b604051630a14e3e160e11b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631429c7c2906024015b602060405180830381865afa1580156104fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048991906133a3565b6105288282610caa565b5050565b60408051606081018252600080825260208201819052818301529051632ecfe72b60e01b815261ffff831660048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632ecfe72b90602401606060405180830381865afa1580156105ad573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048991906133c0565b6106277f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000086868686610622610a61565b610e68565b50505050565b6105287f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006106de8861360f565b6106e78861377e565b6040805180820190915260005460ff80821683526101009091041660208201526001805461071490613929565b80601f016020809104026020016040519081016040528092919081815260200182805461074090613929565b801561078d5780601f106107625761010080835404028352916020019161078d565b820191906000526020600020905b81548152906001019060200180831161077057829003601f168201915b5050505050611931565b6105287f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000084846107e6610a61565b611960565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638687feae6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561084b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610873919081019061395e565b905090565b6001805461088590613929565b80601f01602080910402602001604051908101604052809291908181526020018280546108b190613929565b80156108fe5780601f106108d3576101008083540402835291602001916108fe565b820191906000526020600020905b8154815290600101906020018083116108e157829003601f168201915b505050505081565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bafa91076040518163ffffffff1660e01b8152600401600060405180830381865afa15801561084b573d6000803e3d6000fd5b604051635a6d12c360e01b815260009073__$b5e4fc231d81cbd1f60cac3db25e9b5865$__90635a6d12c390610a0f907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a90600190600401613d62565b60006040518083038186803b158015610a2757600080fd5b505af4925050508015610a38575060015b610a4457506000610a48565b5060015b9392505050565b610528610a5b8361052c565b82610caa565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e15234ff6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561084b573d6000803e3d6000fd5b60405163ee6c3bcf60e01b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ee6c3bcf906024016104dd565b610b1b612bb9565b6104897f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610b698561360f565b612065565b610ca57f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610be336889003880188613f79565b610bec8761377e565b610bf587614014565b6040805180820190915260005460ff808216835261010090910416602082015260018054610c2290613929565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4e90613929565b8015610c9b5780601f10610c7057610100808354040283529160200191610c9b565b820191906000526020600020905b815481529060010190602001808311610c7e57829003601f168201915b505050505061227b565b505050565b806020015160ff16816000015160ff1611610d6c5760405162461bcd60e51b81526020600482015260776024820152600080516020614c2283398151915260448201527f726966794441436572745365637572697479506172616d733a20636f6e66697260648201527f6d6174696f6e5468726573686f6c64206d75737420626520677265617465722060848201527f7468616e206164766572736172795468726573686f6c6400000000000000000060a482015260c4015b60405180910390fd5b60208101518151600091610d7f91614152565b60ff1690506000836020015163ffffffff16846040015160ff1683620f4240610da8919061418b565b610db2919061418b565b610dbe9061271061419f565b610dc891906141b6565b8451909150610dd9906127106141d5565b63ffffffff168110156106275760405162461bcd60e51b815260206004820152605a6024820152600080516020614c2283398151915260448201527f726966794441436572745365637572697479506172616d733a2073656375726960648201527f747920617373756d7074696f6e7320617265206e6f74206d6574000000000000608482015260a401610d63565b838214610f075760405162461bcd60e51b815260206004820152606d6024820152600080516020614c2283398151915260448201527f7269667944414365727473466f7251756f72756d733a20626c6f62486561646560648201527f727320616e6420626c6f62566572696669636174696f6e50726f6f6673206c6560848201526c0dccee8d040dad2e6dac2e8c6d609b1b60a482015260c401610d63565b6000876001600160a01b031663bafa91076040518163ffffffff1660e01b8152600401600060405180830381865afa158015610f47573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f6f919081019061395e565b905060005b8581101561192657876001600160a01b031663eccbbfc9868684818110610f9d57610f9d614201565b9050602002810190610faf9190614217565b610fbd906020810190614237565b6040516001600160e01b031960e084901b16815263ffffffff919091166004820152602401602060405180830381865afa158015610fff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110239190614254565b61106686868481811061103857611038614201565b905060200281019061104a9190614217565b61105890604081019061426d565b61106190614283565b612698565b146110f95760405162461bcd60e51b81526020600482015260636024820152600080516020614c2283398151915260448201527f7269667944414365727473466f7251756f72756d733a2062617463684d65746160648201527f6461746120646f6573206e6f74206d617463682073746f726564206d6574616460848201526261746160e81b60a482015260c401610d63565b61123f85858381811061110e5761110e614201565b90506020028101906111209190614217565b61112e90606081019061435a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925088915085905081811061117757611177614201565b90506020028101906111899190614217565b61119790604081019061426d565b6111a190806143a0565b356111d78a8a868181106111b7576111b7614201565b90506020028101906111c991906143a0565b6111d2906143b6565b612709565b6040516020016111e991815260200190565b6040516020818303038152906040528051906020012088888681811061121157611211614201565b90506020028101906112239190614217565b611234906040810190602001614237565b63ffffffff16612739565b6112b95760405162461bcd60e51b81526020600482015260516024820152600080516020614c2283398151915260448201527f7269667944414365727473466f7251756f72756d733a20696e636c7573696f6e606482015270081c1c9bdbd9881a5cc81a5b9d985b1a59607a1b608482015260a401610d63565b6000805b8888848181106112cf576112cf614201565b90506020028101906112e191906143a0565b6112ef9060608101906144d5565b90508110156118615788888481811061130a5761130a614201565b905060200281019061131c91906143a0565b61132a9060608101906144d5565b8281811061133a5761133a614201565b6113509260206080909202019081019150612c74565b60ff1687878581811061136557611365614201565b90506020028101906113779190614217565b61138590604081019061426d565b61138f90806143a0565b61139d90602081019061435a565b8989878181106113af576113af614201565b90506020028101906113c19190614217565b6113cf90608081019061435a565b858181106113df576113df614201565b919091013560f81c90508181106113f8576113f8614201565b9050013560f81c60f81b60f81c60ff16146114845760405162461bcd60e51b81526020600482015260526024820152600080516020614c2283398151915260448201527f7269667944414365727473466f7251756f72756d733a2071756f72756d4e756d6064820152710c4cae440c8decae640dcdee840dac2e8c6d60731b608482015260a401610d63565b88888481811061149657611496614201565b90506020028101906114a891906143a0565b6114b69060608101906144d5565b828181106114c6576114c6614201565b90506080020160200160208101906114de9190612c74565b60ff168989858181106114f3576114f3614201565b905060200281019061150591906143a0565b6115139060608101906144d5565b8381811061152357611523614201565b905060800201604001602081019061153b9190612c74565b60ff16116115c55760405162461bcd60e51b815260206004820152605a6024820152600080516020614c2283398151915260448201527f7269667944414365727473466f7251756f72756d733a207468726573686f6c6460648201527f2070657263656e746167657320617265206e6f742076616c6964000000000000608482015260a401610d63565b838989858181106115d8576115d8614201565b90506020028101906115ea91906143a0565b6115f89060608101906144d5565b8381811061160857611608614201565b61161e9260206080909202019081019150612c74565b60ff168151811061163157611631614201565b016020015160f81c89898581811061164b5761164b614201565b905060200281019061165d91906143a0565b61166b9060608101906144d5565b8381811061167b5761167b614201565b90506080020160400160208101906116939190612c74565b60ff1610156116b45760405162461bcd60e51b8152600401610d639061451e565b8888848181106116c6576116c6614201565b90506020028101906116d891906143a0565b6116e69060608101906144d5565b828181106116f6576116f6614201565b905060800201604001602081019061170e9190612c74565b60ff1687878581811061172357611723614201565b90506020028101906117359190614217565b61174390604081019061426d565b61174d90806143a0565b61175b90604081019061435a565b89898781811061176d5761176d614201565b905060200281019061177f9190614217565b61178d90608081019061435a565b8581811061179d5761179d614201565b919091013560f81c90508181106117b6576117b6614201565b9050013560f81c60f81b60f81c60ff1610156117e45760405162461bcd60e51b8152600401610d639061451e565b61184d828a8a868181106117fa576117fa614201565b905060200281019061180c91906143a0565b61181a9060608101906144d5565b8481811061182a5761182a614201565b6118409260206080909202019081019150612c74565b600160ff919091161b1790565b91508061185981614599565b9150506112bd565b5061187561186e85612751565b8281161490565b6119155760405162461bcd60e51b81526020600482015260716024820152600080516020614c2283398151915260448201527f7269667944414365727473466f7251756f72756d733a2072657175697265642060648201527f71756f72756d7320617265206e6f74206120737562736574206f662074686520608482015270636f6e6669726d65642071756f72756d7360781b60a482015260c401610d63565b5061191f81614599565b9050610f74565b505050505050505050565b600061193e878787612065565b90506119548a8a8a88600001518886898961227b565b50505050505050505050565b6001600160a01b03841663eccbbfc961197c6020850185614237565b6040516001600160e01b031960e084901b16815263ffffffff919091166004820152602401602060405180830381865afa1580156119be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e29190614254565b6119f2611058604085018561426d565b14611a845760405162461bcd60e51b81526020600482015260626024820152600080516020614c2283398151915260448201527f72696679444143657274466f7251756f72756d733a2062617463684d6574616460648201527f61746120646f6573206e6f74206d617463682073746f726564206d6574616461608482015261746160f01b60a482015260c401610d63565b611b28611a94606084018461435a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ad692505050604085018561426d565b611ae090806143a0565b35611aed6111d2876143b6565b604051602001611aff91815260200190565b604051602081830303815290604052805190602001208560200160208101906112349190614237565b611ba15760405162461bcd60e51b81526020600482015260506024820152600080516020614c2283398151915260448201527f72696679444143657274466f7251756f72756d733a20696e636c7573696f6e2060648201526f1c1c9bdbd9881a5cc81a5b9d985b1a5960821b608482015260a401610d63565b6000805b611bb260608601866144d5565b9050811015611fb157611bc860608601866144d5565b82818110611bd857611bd8614201565b611bee9260206080909202019081019150612c74565b60ff16611bfe604086018661426d565b611c0890806143a0565b611c1690602081019061435a565b611c23608088018861435a565b85818110611c3357611c33614201565b919091013560f81c9050818110611c4c57611c4c614201565b9050013560f81c60f81b60f81c60ff1614611cd75760405162461bcd60e51b81526020600482015260516024820152600080516020614c2283398151915260448201527f72696679444143657274466f7251756f72756d733a2071756f72756d4e756d626064820152700cae440c8decae640dcdee840dac2e8c6d607b1b608482015260a401610d63565b611ce460608601866144d5565b82818110611cf457611cf4614201565b9050608002016020016020810190611d0c9190612c74565b60ff16611d1c60608701876144d5565b83818110611d2c57611d2c614201565b9050608002016040016020810190611d449190612c74565b60ff1611611dce5760405162461bcd60e51b81526020600482015260596024820152600080516020614c2283398151915260448201527f72696679444143657274466f7251756f72756d733a207468726573686f6c642060648201527f70657263656e746167657320617265206e6f742076616c696400000000000000608482015260a401610d63565b6001600160a01b038716631429c7c2611dea60608801886144d5565b84818110611dfa57611dfa614201565b611e109260206080909202019081019150612c74565b6040516001600160e01b031960e084901b16815260ff9091166004820152602401602060405180830381865afa158015611e4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7291906133a3565b60ff16611e8260608701876144d5565b83818110611e9257611e92614201565b9050608002016040016020810190611eaa9190612c74565b60ff161015611ecb5760405162461bcd60e51b8152600401610d63906145b4565b611ed860608601866144d5565b82818110611ee857611ee8614201565b9050608002016040016020810190611f009190612c74565b60ff16611f10604086018661426d565b611f1a90806143a0565b611f2890604081019061435a565b611f35608088018861435a565b85818110611f4557611f45614201565b919091013560f81c9050818110611f5e57611f5e614201565b9050013560f81c60f81b60f81c60ff161015611f8c5760405162461bcd60e51b8152600401610d63906145b4565b611f9d8261181a60608801886144d5565b915080611fa981614599565b915050611ba5565b50611fbe61186e83612751565b61205d5760405162461bcd60e51b81526020600482015260706024820152600080516020614c2283398151915260448201527f72696679444143657274466f7251756f72756d733a207265717569726564207160648201527f756f72756d7320617265206e6f74206120737562736574206f6620746865206360848201526f6f6e6669726d65642071756f72756d7360801b60a482015260c401610d63565b505050505050565b61206d612bb9565b602082015151516000906001600160401b0381111561208e5761208e612c91565b6040519080825280602002602001820160405280156120b7578160200160208202803683370190505b50905060005b602084015151518110156121345761210784602001516000015182815181106120e8576120e8614201565b6020026020010151805160009081526020918201519091526040902090565b82828151811061211957612119614201565b602090810291909101015261212d81614599565b90506120bd565b50606060005b846020015160800151518110156121a15781856020015160800151828151811061216657612166614201565b602002602001015160405160200161217f929190614626565b60405160208183030381529060405291508061219a90614599565b905061213a565b508351602001516040516313dce7dd60e21b81526000916001600160a01b03891691634f739f74916121dc918a919087908990600401614658565b600060405180830381865afa1580156121f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261222191908101906147ab565b805185526020958601805151878701528051870151604080880191909152815160609081015181890152915181015160808801529682015160a08701529581015160c0860152949094015160e08401525090949350505050565b6122cd8460400151866000015161229587600001516128de565b6040516020016122a791815260200190565b60405160208183030381529060405280519060200120876020015163ffffffff16612739565b6123485760405162461bcd60e51b81526020600482015260526024820152600080516020614c2283398151915260448201527f726966794441436572745632466f7251756f72756d733a20696e636c7573696f6064820152711b881c1c9bdbd9881a5cc81a5b9d985b1a5960721b608482015260a401610d63565b600080886001600160a01b0316636efb463661236389612906565b885151602090810151908b01516040516001600160e01b031960e086901b168152612395939291908b90600401614883565b600060405180830381865afa1580156123b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123da919081019061492b565b915091506123f088876000015160400151612931565b85515151604051632ecfe72b60e01b815261ffff909116600482015261246b906001600160a01b038c1690632ecfe72b90602401606060405180830381865afa158015612441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246591906133c0565b85610caa565b6000805b87515160200151518110156125dd57856000015160ff168460200151828151811061249c5761249c614201565b60200260200101516124ae91906149c7565b6001600160601b03166064856000015183815181106124cf576124cf614201565b60200260200101516001600160601b03166124ea91906141b6565b10156125985760405162461bcd60e51b81526020600482015260786024820152600080516020614c2283398151915260448201527f726966794441436572745632466f7251756f72756d733a207369676e61746f7260648201527f69657320646f206e6f74206f776e206174206c65617374207468726573686f6c60848201527f642070657263656e74616765206f6620612071756f72756d000000000000000060a482015260c401610d63565b8751516020015180516125c9918491849081106125b7576125b7614201565b0160200151600160f89190911c1b1790565b9150806125d581614599565b91505061246f565b506125ea61186e85612751565b61268b5760405162461bcd60e51b81526020600482015260726024820152600080516020614c2283398151915260448201527f726966794441436572745632466f7251756f72756d733a20726571756972656460648201527f2071756f72756d7320617265206e6f74206120737562736574206f662074686560848201527120636f6e6669726d65642071756f72756d7360701b60a482015260c401610d63565b5050505050505050505050565b600061048982600001516040516020016126b291906149ed565b60408051808303601f1901815282825280516020918201208682015187840151838601929092528484015260e01b6001600160e01b0319166060840152815160448185030181526064909301909152815191012090565b60008160405160200161271c9190614a4d565b604051602081830303815290604052805190602001209050919050565b600083612747868585612a64565b1495945050505050565b6000610100825111156127da5760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a401610d63565b81516127e857506000919050565b600080836000815181106127fe576127fe614201565b0160200151600160f89190911c81901b92505b84518110156128d55784818151811061282c5761282c614201565b0160200151600160f89190911c1b91508282116128c15760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a401610d63565b918117916128ce81614599565b9050612811565b50909392505050565b60006128ed8260000151612b67565b602080840151604080860151905161271c949301614af2565b60008160405160200161271c91908151815260209182015163ffffffff169181019190915260400190565b60005b8151811015610ca55760006001600160a01b0316836001600160a01b031663b5a872da84848151811061296957612969614201565b60200260200101516040518263ffffffff1660e01b8152600401612999919063ffffffff91909116815260200190565b602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190614b53565b6001600160a01b03161415612a545760405162461bcd60e51b81526020600482015260466024820152600080516020614c2283398151915260448201527f7269667952656c61794b6579735365743a2072656c6179206b6579206973206e6064820152651bdd081cd95d60d21b608482015260a401610d63565b612a5d81614599565b9050612934565b600060208451612a749190614b7c565b15612afb5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610d63565b8260205b85518111612b5e57612b12600285614b7c565b612b3357816000528086015160205260406000209150600284049350612b4c565b8086015160005281602052604060002091506002840493505b612b57602082614b90565b9050612aff565b50949350505050565b6000816000015182602001518360400151604051602001612b8a93929190614ba8565b60408051601f19818403018152828252805160209182012060608087015192850191909152918301520161271c565b604051806101000160405280606081526020016060815260200160608152602001612be2612c1f565b8152602001612c04604051806040016040528060008152602001600081525090565b81526020016060815260200160608152602001606081525090565b6040518060400160405280612c32612c44565b8152602001612c3f612c44565b905290565b60405180604001604052806002906020820280368337509192915050565b60ff81168114612c7157600080fd5b50565b600060208284031215612c8657600080fd5b8135610a4881612c62565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612cc957612cc9612c91565b60405290565b604051606081016001600160401b0381118282101715612cc957612cc9612c91565b60405160a081016001600160401b0381118282101715612cc957612cc9612c91565b604051608081016001600160401b0381118282101715612cc957612cc9612c91565b60405161010081016001600160401b0381118282101715612cc957612cc9612c91565b604051601f8201601f191681016001600160401b0381118282101715612d8057612d80612c91565b604052919050565b63ffffffff81168114612c7157600080fd5b8035612da581612d88565b919050565b600060408284031215612dbc57600080fd5b612dc4612ca7565b90508135612dd181612c62565b81526020820135612de181612c62565b602082015292915050565b60008082840360a0811215612e0057600080fd5b6060811215612e0e57600080fd5b50612e17612ccf565b8335612e2281612d88565b81526020840135612e3281612d88565b60208201526040840135612e4581612c62565b60408201529150612e598460608501612daa565b90509250929050565b803561ffff81168114612da557600080fd5b600060208284031215612e8657600080fd5b610a4882612e62565b60008083601f840112612ea157600080fd5b5081356001600160401b03811115612eb857600080fd5b6020830191508360208260051b8501011115612ed357600080fd5b9250929050565b60008060008060408587031215612ef057600080fd5b84356001600160401b0380821115612f0757600080fd5b612f1388838901612e8f565b90965094506020870135915080821115612f2c57600080fd5b50612f3987828801612e8f565b95989497509550505050565b600060608284031215612f5757600080fd5b50919050565b60008060408385031215612f7057600080fd5b82356001600160401b0380821115612f8757600080fd5b612f9386838701612f45565b93506020850135915080821115612fa957600080fd5b50612fb685828601612f45565b9150509250929050565b60008060408385031215612fd357600080fd5b82356001600160401b0380821115612fea57600080fd5b9084019060808287031215612ffe57600080fd5b9092506020840135908082111561301457600080fd5b50830160a0818603121561302757600080fd5b809150509250929050565b60005b8381101561304d578181015183820152602001613035565b838111156106275750506000910152565b60008151808452613076816020860160208601613032565b601f01601f19169290920160200192915050565b602081526000610a48602083018461305e565b600080600083850360808112156130b357600080fd5b60408112156130c157600080fd5b5083925060408401356001600160401b03808211156130df57600080fd5b6130eb87838801612f45565b9350606086013591508082111561310157600080fd5b508401610180818703121561311557600080fd5b809150509250925092565b6000806060838503121561313357600080fd5b61313c83612e62565b9150612e598460208501612daa565b60006020828403121561315d57600080fd5b81356001600160401b0381111561317357600080fd5b61317f84828501612f45565b949350505050565b600081518084526020808501945080840160005b838110156131bd57815163ffffffff168752958201959082019060010161319b565b509495945050505050565b600081518084526020808501945080840160005b838110156131bd576131f987835180518252602090810151910152565b60409690960195908201906001016131dc565b8060005b6002811015610627578151845260209384019390910190600101613210565b61323a82825161320c565b6020810151610ca5604084018261320c565b600081518084526020808501808196508360051b8101915082860160005b85811015613294578284038952613282848351613187565b9885019893509084019060010161326a565b5091979650505050505050565b600061018082518185526132b782860182613187565b915050602083015184820360208601526132d182826131c8565b915050604083015184820360408601526132eb82826131c8565b9150506060830151613300606086018261322f565b506080830151805160e08601526020015161010085015260a083015184820361012086015261332f8282613187565b91505060c083015184820361014086015261334a8282613187565b91505060e0830151848203610160860152613365828261324c565b95945050505050565b602081526000610a4860208301846132a1565b60006020828403121561339357600080fd5b81518015158114610a4857600080fd5b6000602082840312156133b557600080fd5b8151610a4881612c62565b6000606082840312156133d257600080fd5b604051606081018181106001600160401b03821117156133f4576133f4612c91565b604052825161340281612d88565b8152602083015161341281612d88565b6020820152604083015161342581612c62565b60408201529392505050565b60006040828403121561344357600080fd5b61344b612ca7565b9050813581526020820135612de181612d88565b60006001600160401b0382111561347857613478612c91565b5060051b60200190565b60006040828403121561349457600080fd5b61349c612ca7565b9050813581526020820135602082015292915050565b600082601f8301126134c357600080fd5b813560206134d86134d38361345f565b612d58565b82815260069290921b840181019181810190868411156134f757600080fd5b8286015b8481101561351b5761350d8882613482565b8352918301916040016134fb565b509695505050505050565b600082601f83011261353757600080fd5b61353f612ca7565b80604084018581111561355157600080fd5b845b8181101561356b578035845260209384019301613553565b509095945050505050565b60006080828403121561358857600080fd5b613590612ca7565b905061359c8383613526565b8152612de18360408401613526565b600082601f8301126135bc57600080fd5b813560206135cc6134d38361345f565b82815260059290921b840181019181810190868411156135eb57600080fd5b8286015b8481101561351b57803561360281612d88565b83529183019183016135ef565b60006060823603121561362157600080fd5b613629612ca7565b6136333684613431565b815260408301356001600160401b038082111561364f57600080fd5b8185019150610120823603121561366557600080fd5b61366d612cf1565b82358281111561367c57600080fd5b613688368286016134b2565b82525060208301358281111561369d57600080fd5b6136a9368286016134b2565b6020830152506136bc3660408501613482565b60408201526136ce3660808501613576565b6060820152610100830135828111156136e657600080fd5b6136f2368286016135ab565b608083015250602084015250909392505050565b60006001600160401b0382111561371f5761371f612c91565b50601f01601f191660200190565b600082601f83011261373e57600080fd5b813561374c6134d382613706565b81815284602083860101111561376157600080fd5b816020850160208301376000918101602001919091529392505050565b60006060823603121561379057600080fd5b613798612ccf565b82356001600160401b03808211156137af57600080fd5b8185019150606082360312156137c457600080fd5b6137cc612ccf565b8235828111156137db57600080fd5b8301368190036101c08112156137f057600080fd5b6137f8612d13565b61380183612e62565b81526020808401358681111561381657600080fd5b6138223682870161372d565b83830152506040610160603f198501121561383c57600080fd5b613844612d13565b935061385236828701613482565b84526138613660808701613576565b82850152613873366101008701613576565b8185015261018085013561388681612d88565b8060608601525083818401526101a08501356060840152828652818801359450868511156138b357600080fd5b6138bf36868a0161372d565b82870152808801359450868511156138d657600080fd5b6138e236868a016135ab565b818701528589526138f4828c01612d9a565b828a0152808b013597508688111561390b57600080fd5b61391736898d0161372d565b90890152509598975050505050505050565b600181811c9082168061393d57607f821691505b60208210811415612f5757634e487b7160e01b600052602260045260246000fd5b60006020828403121561397057600080fd5b81516001600160401b0381111561398657600080fd5b8201601f8101841361399757600080fd5b80516139a56134d382613706565b8181528560208385010111156139ba57600080fd5b613365826020830160208601613032565b6000808335601e198436030181126139e257600080fd5b83016020810192503590506001600160401b03811115613a0157600080fd5b803603831315612ed357600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081833760408201600081526040808301823750600060808301525050565b6000808335601e19843603018112613a7057600080fd5b83016020810192503590506001600160401b03811115613a8f57600080fd5b8060051b3603831315612ed357600080fd5b8183526000602080850194508260005b858110156131bd578135613ac481612d88565b63ffffffff1687529582019590820190600101613ab1565b6000808335601e19843603018112613af357600080fd5b83016020810192503590506001600160401b03811115613b1257600080fd5b8060061b3603831315612ed357600080fd5b81835260208301925060008160005b84811015613b5b57813586526020808301359087015260409586019590910190600101613b33565b5093949350505050565b81835260006020808501808196508560051b810191508460005b87811015613294578284038952613b968288613a59565b613ba1868284613aa1565b9a87019a9550505090840190600101613b7f565b6000610180613bc48384613a59565b828652613bd48387018284613aa1565b92505050613be56020840184613adc565b8583036020870152613bf8838284613b24565b92505050613c096040840184613adc565b8583036040870152613c1c838284613b24565b92505050613c306060850160608501613a39565b613c4a60e0850160e0850180358252602090810135910152565b610120613c5981850185613a59565b86840383880152613c6b848284613aa1565b9350505050610140613c7f81850185613a59565b86840383880152613c91848284613aa1565b9350505050610160613ca581850185613a59565b86840383880152613cb7848284613b65565b979650505050505050565b8054600090600181811c9080831680613cdc57607f831692505b6020808410821415613cfe57634e487b7160e01b600052602260045260246000fd5b83885260208801828015613d195760018114613d2a57613d55565b60ff19871682528282019750613d55565b60008981526020902060005b87811015613d4f57815484820152908601908401613d36565b83019850505b5050505050505092915050565b600061014060018060a01b03808c168452808b166020850152808a16604085015250873560608401526020880135613d9981612d88565b63ffffffff80821660808601528260a08601526101a091508835605e198a3603018112613dc557600080fd5b8981019050606084870152803593506101be19813603018412613de757600080fd5b6060868401529283019261ffff613dfd85612e62565b16610200870152613e1160208501856139cb565b6101c0806102208a0152613e2a6103c08a018385613a10565b60408801356102408b015260608801356102608b01529250613e536102808a0160808901613a39565b613e656103008a016101008901613a39565b610180915081870135613e7781612d88565b85166103808a0152868601356103a08a0152613e9660208501856139cb565b9750955061019f1994508489840301818a015250613eb5828787613a10565b9550613ec46040840184613a59565b9550925083888703016101e0890152613ede868685613aa1565b9550613eec60208d01612d9a565b63ffffffff81166101608a01529450613f0860408d018d6139cb565b9550935061013f198887030181890152505050613f26838383613a10565b9250505082810360c0840152613f3c8187613bb5565b855460ff80821660e087015260089190911c166101008501529050828103610120840152613f6a8185613cc2565b9b9a5050505050505050505050565b600060408284031215613f8b57600080fd5b610a488383613431565b600082601f830112613fa657600080fd5b81356020613fb66134d38361345f565b82815260059290921b84018101918181019086841115613fd557600080fd5b8286015b8481101561351b5780356001600160401b03811115613ff85760008081fd5b6140068986838b01016135ab565b845250918301918301613fd9565b6000610180823603121561402757600080fd5b61402f612d35565b82356001600160401b038082111561404657600080fd5b614052368387016135ab565b8352602085013591508082111561406857600080fd5b614074368387016134b2565b6020840152604085013591508082111561408d57600080fd5b614099368387016134b2565b60408401526140ab3660608701613576565b60608401526140bd3660e08701613482565b60808401526101208501359150808211156140d757600080fd5b6140e3368387016135ab565b60a08401526101408501359150808211156140fd57600080fd5b614109368387016135ab565b60c084015261016085013591508082111561412357600080fd5b5061413036828601613f95565b60e08301525092915050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff84168082101561416c5761416c61413c565b90039392505050565b634e487b7160e01b600052601260045260246000fd5b60008261419a5761419a614175565b500490565b6000828210156141b1576141b161413c565b500390565b60008160001904831182151516156141d0576141d061413c565b500290565b600063ffffffff808316818516818304811182151516156141f8576141f861413c565b02949350505050565b634e487b7160e01b600052603260045260246000fd5b60008235609e1983360301811261422d57600080fd5b9190910192915050565b60006020828403121561424957600080fd5b8135610a4881612d88565b60006020828403121561426657600080fd5b5051919050565b60008235605e1983360301811261422d57600080fd5b60006060823603121561429557600080fd5b61429d612ccf565b82356001600160401b03808211156142b457600080fd5b8185019150608082360312156142c957600080fd5b6142d1612d13565b823581526020830135828111156142e757600080fd5b6142f33682860161372d565b60208301525060408301358281111561430b57600080fd5b6143173682860161372d565b6040830152506060830135925061432d83612d88565b8260608201528084525050506020830135602082015261434f60408401612d9a565b604082015292915050565b6000808335601e1984360301811261437157600080fd5b8301803591506001600160401b0382111561438b57600080fd5b602001915036819003821315612ed357600080fd5b60008235607e1983360301811261422d57600080fd5b600060808083360312156143c957600080fd5b6143d1612ccf565b6143db3685613482565b81526040808501356143ec81612d88565b6020818185015260609150818701356001600160401b0381111561440f57600080fd5b870136601f82011261442057600080fd5b803561442e6134d38261345f565b81815260079190911b8201830190838101903683111561444d57600080fd5b928401925b828410156144c15788843603121561446a5760008081fd5b614472612d13565b843561447d81612c62565b81528486013561448c81612c62565b818701528488013561449d81612c62565b81890152848701356144ae81612d88565b8188015282529288019290840190614452565b958701959095525093979650505050505050565b6000808335601e198436030181126144ec57600080fd5b8301803591506001600160401b0382111561450657600080fd5b6020019150600781901b3603821315612ed357600080fd5b6020808252606190820152600080516020614c2283398151915260408201527f7269667944414365727473466f7251756f72756d733a20636f6e6669726d617460608201527f696f6e5468726573686f6c6450657263656e74616765206973206e6f74206d656080820152601d60fa1b60a082015260c00190565b60006000198214156145ad576145ad61413c565b5060010190565b60208082526060908201819052600080516020614c2283398151915260408301527f72696679444143657274466f7251756f72756d733a20636f6e6669726d617469908201527f6f6e5468726573686f6c6450657263656e74616765206973206e6f74206d6574608082015260a00190565b60008351614638818460208801613032565b60f89390931b6001600160f81b0319169190920190815260010192915050565b60018060a01b03851681526000602063ffffffff86168184015260806040840152614686608084018661305e565b838103606085015284518082528286019183019060005b818110156146b95783518352928401929184019160010161469d565b50909998505050505050505050565b600082601f8301126146d957600080fd5b815160206146e96134d38361345f565b82815260059290921b8401810191818101908684111561470857600080fd5b8286015b8481101561351b57805161471f81612d88565b835291830191830161470c565b600082601f83011261473d57600080fd5b8151602061474d6134d38361345f565b82815260059290921b8401810191818101908684111561476c57600080fd5b8286015b8481101561351b5780516001600160401b0381111561478f5760008081fd5b61479d8986838b01016146c8565b845250918301918301614770565b6000602082840312156147bd57600080fd5b81516001600160401b03808211156147d457600080fd5b90830190608082860312156147e857600080fd5b6147f0612d13565b8251828111156147ff57600080fd5b61480b878286016146c8565b82525060208301518281111561482057600080fd5b61482c878286016146c8565b60208301525060408301518281111561484457600080fd5b614850878286016146c8565b60408301525060608301518281111561486857600080fd5b6148748782860161472c565b60608301525095945050505050565b84815260806020820152600061489c608083018661305e565b63ffffffff851660408401528281036060840152613cb781856132a1565b600082601f8301126148cb57600080fd5b815160206148db6134d38361345f565b82815260059290921b840181019181810190868411156148fa57600080fd5b8286015b8481101561351b5780516001600160601b038116811461491e5760008081fd5b83529183019183016148fe565b6000806040838503121561493e57600080fd5b82516001600160401b038082111561495557600080fd5b908401906040828703121561496957600080fd5b614971612ca7565b82518281111561498057600080fd5b61498c888286016148ba565b8252506020830151828111156149a157600080fd5b6149ad888286016148ba565b602083015250809450505050602083015190509250929050565b60006001600160601b03808316818516818304811182151516156141f8576141f861413c565b60208152815160208201526000602083015160806040840152614a1360a084018261305e565b90506040840151601f19848303016060850152614a30828261305e565b91505063ffffffff60608501511660808401528091505092915050565b60208082528251805183830152810151604083015260009060a0830181850151606063ffffffff808316828801526040925082880151608080818a015285825180885260c08b0191508884019750600093505b80841015614ae3578751805160ff90811684528a82015181168b850152888201511688840152860151851686830152968801966001939093019290820190614aa0565b509a9950505050505050505050565b83815260006020606081840152614b0c606084018661305e565b838103604085015284518082528286019183019060005b81811015614b4557835163ffffffff1683529284019291840191600101614b23565b509098975050505050505050565b600060208284031215614b6557600080fd5b81516001600160a01b0381168114610a4857600080fd5b600082614b8b57614b8b614175565b500690565b60008219821115614ba357614ba361413c565b500190565b60006101a061ffff86168352806020840152614bc68184018661305e565b8451805160408601526020015160608501529150614be19050565b6020830151614bf3608084018261322f565b506040830151614c0761010084018261322f565b5063ffffffff60608401511661018083015294935050505056fe456967656e444143657274566572696669636174696f6e5574696c732e5f7665a26469706673582212201aee0f8a7e4b6786537affe6cdb20236a474d20ddb89eb4b321a984ec89da71e64736f6c634300080c0033", } // ContractEigenDACertVerifierABI is the input ABI used to generate the binding from. @@ -927,9 +926,9 @@ func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierCallerSession) Ve return _ContractEigenDACertVerifier.Contract.VerifyDACertV1(&_ContractEigenDACertVerifier.CallOpts, blobHeader, blobVerificationProof) } -// VerifyDACertV2 is a free data retrieval call binding the contract method 0x15e7dcbf. +// VerifyDACertV2 is a free data retrieval call binding the contract method 0xf628bfd2. // -// Solidity: function verifyDACertV2((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32,uint32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns() +// Solidity: function verifyDACertV2((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns() func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierCaller) VerifyDACertV2(opts *bind.CallOpts, batchHeader BatchHeaderV2, blobInclusionInfo BlobInclusionInfo, nonSignerStakesAndSignature NonSignerStakesAndSignature) error { var out []interface{} err := _ContractEigenDACertVerifier.contract.Call(opts, &out, "verifyDACertV2", batchHeader, blobInclusionInfo, nonSignerStakesAndSignature) @@ -942,23 +941,23 @@ func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierCaller) VerifyDAC } -// VerifyDACertV2 is a free data retrieval call binding the contract method 0x15e7dcbf. +// VerifyDACertV2 is a free data retrieval call binding the contract method 0xf628bfd2. // -// Solidity: function verifyDACertV2((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32,uint32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns() +// Solidity: function verifyDACertV2((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns() func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierSession) VerifyDACertV2(batchHeader BatchHeaderV2, blobInclusionInfo BlobInclusionInfo, nonSignerStakesAndSignature NonSignerStakesAndSignature) error { return _ContractEigenDACertVerifier.Contract.VerifyDACertV2(&_ContractEigenDACertVerifier.CallOpts, batchHeader, blobInclusionInfo, nonSignerStakesAndSignature) } -// VerifyDACertV2 is a free data retrieval call binding the contract method 0x15e7dcbf. +// VerifyDACertV2 is a free data retrieval call binding the contract method 0xf628bfd2. // -// Solidity: function verifyDACertV2((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32,uint32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns() +// Solidity: function verifyDACertV2((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns() func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierCallerSession) VerifyDACertV2(batchHeader BatchHeaderV2, blobInclusionInfo BlobInclusionInfo, nonSignerStakesAndSignature NonSignerStakesAndSignature) error { return _ContractEigenDACertVerifier.Contract.VerifyDACertV2(&_ContractEigenDACertVerifier.CallOpts, batchHeader, blobInclusionInfo, nonSignerStakesAndSignature) } -// VerifyDACertV2ForZKProof is a free data retrieval call binding the contract method 0x18fc76f0. +// VerifyDACertV2ForZKProof is a free data retrieval call binding the contract method 0xc7798715. // -// Solidity: function verifyDACertV2ForZKProof((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32,uint32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns(bool) +// Solidity: function verifyDACertV2ForZKProof((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns(bool) func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierCaller) VerifyDACertV2ForZKProof(opts *bind.CallOpts, batchHeader BatchHeaderV2, blobInclusionInfo BlobInclusionInfo, nonSignerStakesAndSignature NonSignerStakesAndSignature) (bool, error) { var out []interface{} err := _ContractEigenDACertVerifier.contract.Call(opts, &out, "verifyDACertV2ForZKProof", batchHeader, blobInclusionInfo, nonSignerStakesAndSignature) @@ -973,23 +972,23 @@ func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierCaller) VerifyDAC } -// VerifyDACertV2ForZKProof is a free data retrieval call binding the contract method 0x18fc76f0. +// VerifyDACertV2ForZKProof is a free data retrieval call binding the contract method 0xc7798715. // -// Solidity: function verifyDACertV2ForZKProof((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32,uint32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns(bool) +// Solidity: function verifyDACertV2ForZKProof((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns(bool) func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierSession) VerifyDACertV2ForZKProof(batchHeader BatchHeaderV2, blobInclusionInfo BlobInclusionInfo, nonSignerStakesAndSignature NonSignerStakesAndSignature) (bool, error) { return _ContractEigenDACertVerifier.Contract.VerifyDACertV2ForZKProof(&_ContractEigenDACertVerifier.CallOpts, batchHeader, blobInclusionInfo, nonSignerStakesAndSignature) } -// VerifyDACertV2ForZKProof is a free data retrieval call binding the contract method 0x18fc76f0. +// VerifyDACertV2ForZKProof is a free data retrieval call binding the contract method 0xc7798715. // -// Solidity: function verifyDACertV2ForZKProof((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32,uint32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns(bool) +// Solidity: function verifyDACertV2ForZKProof((bytes32,uint32) batchHeader, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32),bytes,uint32[]),uint32,bytes) blobInclusionInfo, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) view returns(bool) func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierCallerSession) VerifyDACertV2ForZKProof(batchHeader BatchHeaderV2, blobInclusionInfo BlobInclusionInfo, nonSignerStakesAndSignature NonSignerStakesAndSignature) (bool, error) { return _ContractEigenDACertVerifier.Contract.VerifyDACertV2ForZKProof(&_ContractEigenDACertVerifier.CallOpts, batchHeader, blobInclusionInfo, nonSignerStakesAndSignature) } -// VerifyDACertV2FromSignedBatch is a free data retrieval call binding the contract method 0x1520cf8d. +// VerifyDACertV2FromSignedBatch is a free data retrieval call binding the contract method 0x421c0222. // -// Solidity: function verifyDACertV2FromSignedBatch(((bytes32,uint32),((uint256,uint256)[],(uint256,uint256)[],(uint256,uint256),(uint256[2],uint256[2]),uint32[])) signedBatch, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32,uint32),bytes,uint32[]),uint32,bytes) blobInclusionInfo) view returns() +// Solidity: function verifyDACertV2FromSignedBatch(((bytes32,uint32),((uint256,uint256)[],(uint256,uint256)[],(uint256,uint256),(uint256[2],uint256[2]),uint32[])) signedBatch, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32),bytes,uint32[]),uint32,bytes) blobInclusionInfo) view returns() func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierCaller) VerifyDACertV2FromSignedBatch(opts *bind.CallOpts, signedBatch SignedBatch, blobInclusionInfo BlobInclusionInfo) error { var out []interface{} err := _ContractEigenDACertVerifier.contract.Call(opts, &out, "verifyDACertV2FromSignedBatch", signedBatch, blobInclusionInfo) @@ -1002,16 +1001,16 @@ func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierCaller) VerifyDAC } -// VerifyDACertV2FromSignedBatch is a free data retrieval call binding the contract method 0x1520cf8d. +// VerifyDACertV2FromSignedBatch is a free data retrieval call binding the contract method 0x421c0222. // -// Solidity: function verifyDACertV2FromSignedBatch(((bytes32,uint32),((uint256,uint256)[],(uint256,uint256)[],(uint256,uint256),(uint256[2],uint256[2]),uint32[])) signedBatch, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32,uint32),bytes,uint32[]),uint32,bytes) blobInclusionInfo) view returns() +// Solidity: function verifyDACertV2FromSignedBatch(((bytes32,uint32),((uint256,uint256)[],(uint256,uint256)[],(uint256,uint256),(uint256[2],uint256[2]),uint32[])) signedBatch, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32),bytes,uint32[]),uint32,bytes) blobInclusionInfo) view returns() func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierSession) VerifyDACertV2FromSignedBatch(signedBatch SignedBatch, blobInclusionInfo BlobInclusionInfo) error { return _ContractEigenDACertVerifier.Contract.VerifyDACertV2FromSignedBatch(&_ContractEigenDACertVerifier.CallOpts, signedBatch, blobInclusionInfo) } -// VerifyDACertV2FromSignedBatch is a free data retrieval call binding the contract method 0x1520cf8d. +// VerifyDACertV2FromSignedBatch is a free data retrieval call binding the contract method 0x421c0222. // -// Solidity: function verifyDACertV2FromSignedBatch(((bytes32,uint32),((uint256,uint256)[],(uint256,uint256)[],(uint256,uint256),(uint256[2],uint256[2]),uint32[])) signedBatch, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32,uint32),bytes,uint32[]),uint32,bytes) blobInclusionInfo) view returns() +// Solidity: function verifyDACertV2FromSignedBatch(((bytes32,uint32),((uint256,uint256)[],(uint256,uint256)[],(uint256,uint256),(uint256[2],uint256[2]),uint32[])) signedBatch, (((uint16,bytes,((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),uint32),bytes32),bytes,uint32[]),uint32,bytes) blobInclusionInfo) view returns() func (_ContractEigenDACertVerifier *ContractEigenDACertVerifierCallerSession) VerifyDACertV2FromSignedBatch(signedBatch SignedBatch, blobInclusionInfo BlobInclusionInfo) error { return _ContractEigenDACertVerifier.Contract.VerifyDACertV2FromSignedBatch(&_ContractEigenDACertVerifier.CallOpts, signedBatch, blobInclusionInfo) } diff --git a/contracts/bindings/EigenDADisperserRegistry/binding.go b/contracts/bindings/EigenDADisperserRegistry/binding.go index c512809337..3c3e6f78d6 100644 --- a/contracts/bindings/EigenDADisperserRegistry/binding.go +++ b/contracts/bindings/EigenDADisperserRegistry/binding.go @@ -37,7 +37,7 @@ type DisperserInfo struct { // ContractEigenDADisperserRegistryMetaData contains all meta data concerning the ContractEigenDADisperserRegistry contract. var ContractEigenDADisperserRegistryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"disperserKeyToAddress\",\"inputs\":[{\"name\":\"_key\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disperserKeyToInfo\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"disperserAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDisperserInfo\",\"inputs\":[{\"name\":\"_disperserKey\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_disperserInfo\",\"type\":\"tuple\",\"internalType\":\"structDisperserInfo\",\"components\":[{\"name\":\"disperserAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DisperserAdded\",\"inputs\":[{\"name\":\"key\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"disperser\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", - Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100de565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100dc576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610526806100ed6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80638da5cb5b1161005b5780638da5cb5b146101005780639a0f62a014610111578063c4d66de814610124578063f2fde38b1461013757600080fd5b806307d69fad146100825780631e0bf73c146100cd578063715018a6146100f6575b600080fd5b6100b161009036600461041d565b63ffffffff166000908152606560205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200160405180910390f35b6100b16100db36600461041d565b6065602052600090815260409020546001600160a01b031681565b6100fe61014a565b005b6033546001600160a01b03166100b1565b6100fe61011f366004610456565b61015e565b6100fe6101323660046104d5565b6101c7565b6100fe6101453660046104d5565b6102df565b610152610358565b61015c60006103b2565b565b610166610358565b63ffffffff8216600081815260656020526040808220845181546001600160a01b0319166001600160a01b0390911690811790915590519092917f97fb4432fef273711f9ccc876095cf8e22b00f159658bbd807a8ea80a4c3c85991a35050565b600054610100900460ff16158080156101e75750600054600160ff909116105b806102015750303b158015610201575060005460ff166001145b6102695760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801561028c576000805461ff0019166101001790555b610295826103b2565b80156102db576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6102e7610358565b6001600160a01b03811661034c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610260565b610355816103b2565b50565b6033546001600160a01b0316331461015c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610260565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b803563ffffffff8116811461041857600080fd5b919050565b60006020828403121561042f57600080fd5b61043882610404565b9392505050565b80356001600160a01b038116811461041857600080fd5b600080828403604081121561046a57600080fd5b61047384610404565b92506020601f198201121561048757600080fd5b506040516020810181811067ffffffffffffffff821117156104b957634e487b7160e01b600052604160045260246000fd5b6040526104c86020850161043f565b8152809150509250929050565b6000602082840312156104e757600080fd5b6104388261043f56fea26469706673582212207bcf08bdc4cd44da2ff02ab84081458f55821f1497f01a7614e0ee445b227a4a64736f6c634300080c0033", + Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100de565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100dc576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610526806100ed6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80638da5cb5b1161005b5780638da5cb5b146101005780639a0f62a014610111578063c4d66de814610124578063f2fde38b1461013757600080fd5b806307d69fad146100825780631e0bf73c146100cd578063715018a6146100f6575b600080fd5b6100b161009036600461041d565b63ffffffff166000908152606560205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200160405180910390f35b6100b16100db36600461041d565b6065602052600090815260409020546001600160a01b031681565b6100fe61014a565b005b6033546001600160a01b03166100b1565b6100fe61011f366004610456565b61015e565b6100fe6101323660046104d5565b6101c7565b6100fe6101453660046104d5565b6102df565b610152610358565b61015c60006103b2565b565b610166610358565b63ffffffff8216600081815260656020526040808220845181546001600160a01b0319166001600160a01b0390911690811790915590519092917f97fb4432fef273711f9ccc876095cf8e22b00f159658bbd807a8ea80a4c3c85991a35050565b600054610100900460ff16158080156101e75750600054600160ff909116105b806102015750303b158015610201575060005460ff166001145b6102695760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801561028c576000805461ff0019166101001790555b610295826103b2565b80156102db576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6102e7610358565b6001600160a01b03811661034c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610260565b610355816103b2565b50565b6033546001600160a01b0316331461015c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610260565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b803563ffffffff8116811461041857600080fd5b919050565b60006020828403121561042f57600080fd5b61043882610404565b9392505050565b80356001600160a01b038116811461041857600080fd5b600080828403604081121561046a57600080fd5b61047384610404565b92506020601f198201121561048757600080fd5b506040516020810181811067ffffffffffffffff821117156104b957634e487b7160e01b600052604160045260246000fd5b6040526104c86020850161043f565b8152809150509250929050565b6000602082840312156104e757600080fd5b6104388261043f56fea2646970667358221220b18174e55f58ae450cb208ce3723b078527f4dadfe8cc15df57cdd4b7351f48c64736f6c634300080c0033", } // ContractEigenDADisperserRegistryABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/EigenDARelayRegistry/binding.go b/contracts/bindings/EigenDARelayRegistry/binding.go index 2b02642f7e..4048cb9dd1 100644 --- a/contracts/bindings/EigenDARelayRegistry/binding.go +++ b/contracts/bindings/EigenDARelayRegistry/binding.go @@ -38,7 +38,7 @@ type RelayInfo struct { // ContractEigenDARelayRegistryMetaData contains all meta data concerning the ContractEigenDARelayRegistry contract. var ContractEigenDARelayRegistryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRelayInfo\",\"inputs\":[{\"name\":\"relayInfo\",\"type\":\"tuple\",\"internalType\":\"structRelayInfo\",\"components\":[{\"name\":\"relayAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"relayURL\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nextRelayKey\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"relayKeyToAddress\",\"inputs\":[{\"name\":\"key\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"relayKeyToInfo\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"relayAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"relayURL\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"relayKeyToUrl\",\"inputs\":[{\"name\":\"key\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RelayAdded\",\"inputs\":[{\"name\":\"relay\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"key\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"relayURL\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false}]", - Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100de565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100dc576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610998806100ed6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063841f6a2e11610066578063841f6a2e146100ff5780638da5cb5b14610120578063b5a872da14610145578063c4d66de814610174578063f2fde38b1461018757600080fd5b806315ddaa5d146100985780632fc35013146100c2578063631eabb8146100d5578063715018a6146100f5575b600080fd5b6066546100a89063ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b6100a86100d0366004610753565b61019a565b6100e86100e3366004610821565b610287565b6040516100b9919061089b565b6100fd610333565b005b61011261010d366004610821565b610347565b6040516100b99291906108ae565b6033546001600160a01b03165b6040516001600160a01b0390911681526020016100b9565b61012d610153366004610821565b63ffffffff166000908152606560205260409020546001600160a01b031690565b6100fd6101823660046108da565b6103f6565b6100fd6101953660046108da565b61050e565b60006101a4610587565b60665463ffffffff166000908152606560209081526040909120835181546001600160a01b0319166001600160a01b0390911617815583820151805185936101f3926001850192910190610633565b50506066548351602085015160405163ffffffff90931693506001600160a01b03909116917f01c289e409d41a712a615bf286126433da55c193bbe64fc8e77af5f1ff13db99916102439161089b565b60405180910390a36066805463ffffffff16906000610261836108f5565b91906101000a81548163ffffffff021916908363ffffffff16021790555090505b919050565b63ffffffff811660009081526065602052604090206001018054606091906102ae90610927565b80601f01602080910402602001604051908101604052809291908181526020018280546102da90610927565b80156103275780601f106102fc57610100808354040283529160200191610327565b820191906000526020600020905b81548152906001019060200180831161030a57829003601f168201915b50505050509050919050565b61033b610587565b61034560006105e1565b565b606560205260009081526040902080546001820180546001600160a01b03909216929161037390610927565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610927565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905082565b600054610100900460ff16158080156104165750600054600160ff909116105b806104305750303b158015610430575060005460ff166001145b6104985760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156104bb576000805461ff0019166101001790555b6104c4826105e1565b801561050a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610516610587565b6001600160a01b03811661057b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161048f565b610584816105e1565b50565b6033546001600160a01b031633146103455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805461063f90610927565b90600052602060002090601f01602090048101928261066157600085556106a7565b82601f1061067a57805160ff19168380011785556106a7565b828001600101855582156106a7579182015b828111156106a757825182559160200191906001019061068c565b506106b39291506106b7565b5090565b5b808211156106b357600081556001016106b8565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610705576107056106cc565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610734576107346106cc565b604052919050565b80356001600160a01b038116811461028257600080fd5b6000602080838503121561076657600080fd5b823567ffffffffffffffff8082111561077e57600080fd5b908401906040828703121561079257600080fd5b61079a6106e2565b6107a38361073c565b815283830135828111156107b657600080fd5b80840193505086601f8401126107cb57600080fd5b8235828111156107dd576107dd6106cc565b6107ef601f8201601f1916860161070b565b9250808352878582860101111561080557600080fd5b8085850186850137600090830185015292830152509392505050565b60006020828403121561083357600080fd5b813563ffffffff8116811461084757600080fd5b9392505050565b6000815180845260005b8181101561087457602081850181015186830182015201610858565b81811115610886576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610847602083018461084e565b6001600160a01b03831681526040602082018190526000906108d29083018461084e565b949350505050565b6000602082840312156108ec57600080fd5b6108478261073c565b600063ffffffff8083168181141561091d57634e487b7160e01b600052601160045260246000fd5b6001019392505050565b600181811c9082168061093b57607f821691505b6020821081141561095c57634e487b7160e01b600052602260045260246000fd5b5091905056fea26469706673582212205f7adf3aa0194ded9c79c58e9535f00a42f88c9395480c7969bac8ecedcf2b3764736f6c634300080c0033", + Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100de565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100dc576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610998806100ed6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063841f6a2e11610066578063841f6a2e146100ff5780638da5cb5b14610120578063b5a872da14610145578063c4d66de814610174578063f2fde38b1461018757600080fd5b806315ddaa5d146100985780632fc35013146100c2578063631eabb8146100d5578063715018a6146100f5575b600080fd5b6066546100a89063ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b6100a86100d0366004610753565b61019a565b6100e86100e3366004610821565b610287565b6040516100b9919061089b565b6100fd610333565b005b61011261010d366004610821565b610347565b6040516100b99291906108ae565b6033546001600160a01b03165b6040516001600160a01b0390911681526020016100b9565b61012d610153366004610821565b63ffffffff166000908152606560205260409020546001600160a01b031690565b6100fd6101823660046108da565b6103f6565b6100fd6101953660046108da565b61050e565b60006101a4610587565b60665463ffffffff166000908152606560209081526040909120835181546001600160a01b0319166001600160a01b0390911617815583820151805185936101f3926001850192910190610633565b50506066548351602085015160405163ffffffff90931693506001600160a01b03909116917f01c289e409d41a712a615bf286126433da55c193bbe64fc8e77af5f1ff13db99916102439161089b565b60405180910390a36066805463ffffffff16906000610261836108f5565b91906101000a81548163ffffffff021916908363ffffffff16021790555090505b919050565b63ffffffff811660009081526065602052604090206001018054606091906102ae90610927565b80601f01602080910402602001604051908101604052809291908181526020018280546102da90610927565b80156103275780601f106102fc57610100808354040283529160200191610327565b820191906000526020600020905b81548152906001019060200180831161030a57829003601f168201915b50505050509050919050565b61033b610587565b61034560006105e1565b565b606560205260009081526040902080546001820180546001600160a01b03909216929161037390610927565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610927565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905082565b600054610100900460ff16158080156104165750600054600160ff909116105b806104305750303b158015610430575060005460ff166001145b6104985760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156104bb576000805461ff0019166101001790555b6104c4826105e1565b801561050a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610516610587565b6001600160a01b03811661057b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161048f565b610584816105e1565b50565b6033546001600160a01b031633146103455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805461063f90610927565b90600052602060002090601f01602090048101928261066157600085556106a7565b82601f1061067a57805160ff19168380011785556106a7565b828001600101855582156106a7579182015b828111156106a757825182559160200191906001019061068c565b506106b39291506106b7565b5090565b5b808211156106b357600081556001016106b8565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610705576107056106cc565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610734576107346106cc565b604052919050565b80356001600160a01b038116811461028257600080fd5b6000602080838503121561076657600080fd5b823567ffffffffffffffff8082111561077e57600080fd5b908401906040828703121561079257600080fd5b61079a6106e2565b6107a38361073c565b815283830135828111156107b657600080fd5b80840193505086601f8401126107cb57600080fd5b8235828111156107dd576107dd6106cc565b6107ef601f8201601f1916860161070b565b9250808352878582860101111561080557600080fd5b8085850186850137600090830185015292830152509392505050565b60006020828403121561083357600080fd5b813563ffffffff8116811461084757600080fd5b9392505050565b6000815180845260005b8181101561087457602081850181015186830182015201610858565b81811115610886576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610847602083018461084e565b6001600160a01b03831681526040602082018190526000906108d29083018461084e565b949350505050565b6000602082840312156108ec57600080fd5b6108478261073c565b600063ffffffff8083168181141561091d57634e487b7160e01b600052601160045260246000fd5b6001019392505050565b600181811c9082168061093b57607f821691505b6020821081141561095c57634e487b7160e01b600052602260045260246000fd5b5091905056fea264697066735822122038adcce0bcf44aa78b4ba2db07e4b025ad59e34a997b10983edef41c4af2dc8d64736f6c634300080c0033", } // ContractEigenDARelayRegistryABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/EigenDAServiceManager/binding.go b/contracts/bindings/EigenDAServiceManager/binding.go index ebd9a2807c..7e4938ed0f 100644 --- a/contracts/bindings/EigenDAServiceManager/binding.go +++ b/contracts/bindings/EigenDAServiceManager/binding.go @@ -121,7 +121,7 @@ type VersionedBlobParams struct { // ContractEigenDAServiceManagerMetaData contains all meta data concerning the ContractEigenDAServiceManager contract. var ContractEigenDAServiceManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"__avsDirectory\",\"type\":\"address\",\"internalType\":\"contractIAVSDirectory\"},{\"name\":\"__rewardsCoordinator\",\"type\":\"address\",\"internalType\":\"contractIRewardsCoordinator\"},{\"name\":\"__registryCoordinator\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"},{\"name\":\"__stakeRegistry\",\"type\":\"address\",\"internalType\":\"contractIStakeRegistry\"},{\"name\":\"__eigenDAThresholdRegistry\",\"type\":\"address\",\"internalType\":\"contractIEigenDAThresholdRegistry\"},{\"name\":\"__eigenDARelayRegistry\",\"type\":\"address\",\"internalType\":\"contractIEigenDARelayRegistry\"},{\"name\":\"__paymentVault\",\"type\":\"address\",\"internalType\":\"contractIPaymentVault\"},{\"name\":\"__eigenDADisperserRegistry\",\"type\":\"address\",\"internalType\":\"contractIEigenDADisperserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BLOCK_STALE_MEASURE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STORE_DURATION_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"THRESHOLD_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsDirectory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"batchId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"batchIdToBatchMetadataHash\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blsApkRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBLSApkRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkSignatures\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIBLSSignatureChecker.NonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIBLSSignatureChecker.QuorumStakeTotals\",\"components\":[{\"name\":\"signedStakeForQuorum\",\"type\":\"uint96[]\",\"internalType\":\"uint96[]\"},{\"name\":\"totalStakeForQuorum\",\"type\":\"uint96[]\",\"internalType\":\"uint96[]\"}]},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"confirmBatch\",\"inputs\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeader\",\"components\":[{\"name\":\"blobHeadersRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signedStakeForQuorums\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"nonSignerStakesAndSignature\",\"type\":\"tuple\",\"internalType\":\"structIBLSSignatureChecker.NonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenDADisperserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDADisperserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenDARelayRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDARelayRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenDAThresholdRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDAThresholdRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlobParams\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structVersionedBlobParams\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getIsQuorumRequired\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorRestakedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQuorumAdversaryThresholdPercentage\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQuorumConfirmationThresholdPercentage\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRestakeableStrategies\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_batchConfirmers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_rewardsInitiator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBatchConfirmer\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestServeUntilBlock\",\"inputs\":[{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paymentVault\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPaymentVault\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumAdversaryThresholdPercentages\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumConfirmationThresholdPercentages\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumNumbersRequired\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registryCoordinator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsInitiator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setBatchConfirmer\",\"inputs\":[{\"name\":\"_batchConfirmer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsInitiator\",\"inputs\":[{\"name\":\"newRewardsInitiator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStaleStakesForbidden\",\"inputs\":[{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakeRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStakeRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"staleStakesForbidden\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"taskNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"trySignatureAndApkVerification\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"pairingSuccessful\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"siganatureIsValid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"_metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BatchConfirmed\",\"inputs\":[{\"name\":\"batchHeaderHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"batchId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BatchConfirmerStatusChanged\",\"inputs\":[{\"name\":\"batchConfirmer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultSecurityThresholdsV2Updated\",\"inputs\":[{\"name\":\"previousDefaultSecurityThresholdsV2\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"newDefaultSecurityThresholdsV2\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumAdversaryThresholdPercentagesUpdated\",\"inputs\":[{\"name\":\"previousQuorumAdversaryThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumAdversaryThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumConfirmationThresholdPercentagesUpdated\",\"inputs\":[{\"name\":\"previousQuorumConfirmationThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumConfirmationThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumNumbersRequiredUpdated\",\"inputs\":[{\"name\":\"previousQuorumNumbersRequired\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumNumbersRequired\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsInitiatorUpdated\",\"inputs\":[{\"name\":\"prevRewardsInitiator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRewardsInitiator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaleStakesForbiddenUpdate\",\"inputs\":[{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VersionedBlobParamsAdded\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint16\",\"indexed\":true,\"internalType\":\"uint16\"},{\"name\":\"versionedBlobParams\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structVersionedBlobParams\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"anonymous\":false}]", - Bin: "0x6102006040523480156200001257600080fd5b506040516200643238038062006432833981016040819052620000359162000305565b6001600160a01b0380851660805280841660a05280831660c05280821660e05280891661010052808816610120528087166101405285166101605285888882886200007f6200022a565b50505050806001600160a01b0316610180816001600160a01b031681525050806001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001039190620003c6565b6001600160a01b03166101a0816001600160a01b031681525050806001600160a01b0316635df459466040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200015c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001829190620003c6565b6001600160a01b03166101c0816001600160a01b0316815250506101a0516001600160a01b031663df5cf7236040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002049190620003c6565b6001600160a01b03166101e052506200021c6200022a565b5050505050505050620003ed565b603254610100900460ff1615620002975760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60325460ff9081161015620002ea576032805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200030257600080fd5b50565b600080600080600080600080610100898b0312156200032357600080fd5b88516200033081620002ec565b60208a01519098506200034381620002ec565b60408a01519097506200035681620002ec565b60608a01519096506200036981620002ec565b60808a01519095506200037c81620002ec565b60a08a01519094506200038f81620002ec565b60c08a0151909350620003a281620002ec565b60e08a0151909250620003b581620002ec565b809150509295985092959890939650565b600060208284031215620003d957600080fd5b8151620003e681620002ec565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e051615ecc620005666000396000818161069f0152611b060152600081816104850152611ce80152600081816104d701528181611ebe015261208001526000818161052401528181611222015281816117d1015281816119690152611ba3015260008181610f3a015281816110950152818161112c01528181612f830152818161310601526131a5015260008181610d6501528181610df401528181610e74015281816129fd01528181612d1c01528181612ec10152613061015260008181612add01528181612c4a01528181612cd80152818161353e01526135d10152600081816104fb01528181612a5101528181612d780152612dc60152600061074301526000610709015260006105740152600081816107980152818161080e01528181610a9d01528181610cd50152818161296901528181612dff01528181612e5f01526132bb0152615ecc6000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c80638687feae1161019d578063e481af9d116100e9578063ef024458116100a2578063f8c668141161007c578063f8c6681414610793578063fabc1cbc146107ba578063fc299dee146107cd578063fce36c7d146107e057600080fd5b8063ef02445814610765578063f12209831461076d578063f2fde38b1461078057600080fd5b8063e481af9d146106c9578063eaefd27d146106d1578063eccbbfc9146106e4578063ed3916f714610704578063ee6c3bcf1461072b578063eeae17f61461073e57600080fd5b8063a364f4da11610156578063b98d090811610130578063b98d090814610685578063bafa910714610692578063df5cf7231461069a578063e15234ff146106c157600080fd5b8063a364f4da1461063c578063a5b7890a1461064f578063a98fb3551461067257600080fd5b80638687feae146105ca578063886f1195146105df5780638da5cb5b146105f25780639926ee7d14610603578063a0169ddd14610616578063a20b99bf1461062957600080fd5b80635c975abb1161025c5780636d14a9871161021557806372276443116101ef578063722764431461056f57806372d18e8d14610596578063775bbcb5146105a45780637794965a146105b757600080fd5b80636d14a9871461051f5780636efb463614610546578063715018a61461056757600080fd5b80635c975abb1461046e5780635df45946146104805780635e033476146104bf5780635e8b3f2d146104c957806368304835146104d25780636b3aa72e146104f957600080fd5b806333cfb7b7116102ae57806333cfb7b7146103d85780633bc28c8c146103f8578063416c7e5e1461040b5780634972134a1461041e578063595c6a67146104435780635ac86ab71461044b57600080fd5b8063048886d2146102f657806310d67a2f1461031e578063136439dd146103335780631429c7c214610346578063171f1d5b1461036b5780632ecfe72b14610395575b600080fd5b610309610304366004614983565b6107f3565b60405190151581526020015b60405180910390f35b61033161032c3660046149b5565b610887565b005b6103316103413660046149d2565b610943565b610359610354366004614983565b610a82565b60405160ff9091168152602001610315565b61037e610379366004614b3c565b610b11565b604080519215158352901515602083015201610315565b6103a86103a3366004614b8d565b610c9b565b60408051825163ffffffff9081168252602080850151909116908201529181015160ff1690820152606001610315565b6103eb6103e63660046149b5565b610d40565b6040516103159190614bbc565b6103316104063660046149b5565b61120f565b610331610419366004614c17565b611220565b60005461042e9063ffffffff1681565b60405163ffffffff9091168152602001610315565b610331611357565b610309610459366004614983565b60fc54600160ff9092169190911b9081161490565b60fc545b604051908152602001610315565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610315565b61042e620189c081565b61042e61012c81565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b7f00000000000000000000000000000000000000000000000000000000000000006104a7565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b610559610554366004614ef5565b61141e565b604051610315929190614fe8565b610331612335565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b60005463ffffffff1661042e565b6103316105b2366004615031565b612349565b6103316105c536600461510c565b6124b2565b6105d2612965565b60405161031591906151cf565b60fb546104a7906001600160a01b031681565b6065546001600160a01b03166104a7565b610331610611366004615262565b6129f2565b6103316106243660046149b5565b612ab6565b610331610637366004615358565b612b3d565b61033161064a3660046149b5565b612d11565b61030961065d3660046149b5565b60026020526000908152604090205460ff1681565b610331610680366004615399565b612da7565b60c9546103099060ff1681565b6105d2612dfb565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b6105d2612e5b565b6103eb612ebb565b61042e6106df3660046153e1565b613284565b6104726106f23660046153e1565b60016020526000908152604090205481565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b610359610739366004614983565b6132a0565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b610472606481565b61033161077b3660046149b5565b6132f2565b61033161078e3660046149b5565b613303565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b6103316107c83660046149d2565b613379565b6097546104a7906001600160a01b031681565b6103316107ee366004615358565b6134d5565b604051630244436960e11b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063048886d290602401602060405180830381865afa15801561085d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088191906153fe565b92915050565b60fb60009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fe919061541b565b6001600160a01b0316336001600160a01b0316146109375760405162461bcd60e51b815260040161092e90615438565b60405180910390fd5b61094081613608565b50565b60fb5460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561098b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109af91906153fe565b6109cb5760405162461bcd60e51b815260040161092e90615482565b60fc5481811614610a445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161092e565b60fc81905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b604051630a14e3e160e11b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631429c7c2906024015b602060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088191906154ca565b60008060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000187876000015188602001518860000151600060028110610b5957610b596154e7565b60200201518951600160200201518a60200151600060028110610b7e57610b7e6154e7565b60200201518b60200151600160028110610b9a57610b9a6154e7565b602090810291909101518c518d830151604051610bf79a99989796959401988952602089019790975260408801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200190565b6040516020818303038152906040528051906020012060001c610c1a91906154fd565b9050610c8d610c33610c2c88846136ff565b8690613796565b610c3b61382a565b610c83610c7485610c6e604080518082018252600080825260209182015281518083019092526001825260029082015290565b906136ff565b610c7d8c6138ea565b90613796565b886201d4c061397a565b909890975095505050505050565b60408051606081018252600080825260208201819052818301529051632ecfe72b60e01b815261ffff831660048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632ecfe72b90602401606060405180830381865afa158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610881919061551f565b6040516309aa152760e11b81526001600160a01b0382811660048301526060916000917f000000000000000000000000000000000000000000000000000000000000000016906313542a4e90602401602060405180830381865afa158015610dac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd09190615590565b60405163871ef04960e01b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063871ef04990602401602060405180830381865afa158015610e3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5f91906155a9565b90506001600160c01b0381161580610ef957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef491906154ca565b60ff16155b15610f1557505060408051600081526020810190915292915050565b6000610f29826001600160c01b0316613b9e565b90506000805b8251811015610fff577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ca5a5f5848381518110610f7957610f796154e7565b01602001516040516001600160e01b031960e084901b16815260f89190911c6004820152602401602060405180830381865afa158015610fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe19190615590565b610feb90836155e8565b915080610ff781615600565b915050610f2f565b506000816001600160401b0381111561101a5761101a6149eb565b604051908082528060200260200182016040528015611043578160200160208202803683370190505b5090506000805b8451811015611202576000858281518110611067576110676154e7565b0160200151604051633ca5a5f560e01b815260f89190911c6004820181905291506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ca5a5f590602401602060405180830381865afa1580156110dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111009190615590565b905060005b818110156111ec576040516356e4026d60e11b815260ff84166004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063adc804da906044016040805180830381865afa15801561117a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119e9190615630565b600001518686815181106111b4576111b46154e7565b6001600160a01b0390921660209283029190910190910152846111d681615600565b95505080806111e490615600565b915050611105565b50505080806111fa90615600565b91505061104a565b5090979650505050505050565b611217613c60565b61094081613cba565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a2919061541b565b6001600160a01b0316336001600160a01b03161461134e5760405162461bcd60e51b815260206004820152605c60248201527f424c535369676e6174757265436865636b65722e6f6e6c79436f6f7264696e6160448201527f746f724f776e65723a2063616c6c6572206973206e6f7420746865206f776e6560648201527f72206f6620746865207265676973747279436f6f7264696e61746f7200000000608482015260a40161092e565b61094081613d23565b60fb5460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c391906153fe565b6113df5760405162461bcd60e51b815260040161092e90615482565b60001960fc81905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60408051808201909152606080825260208201526000846114955760405162461bcd60e51b81526020600482015260376024820152600080516020615e7783398151915260448201527f7265733a20656d7074792071756f72756d20696e707574000000000000000000606482015260840161092e565b604083015151851480156114ad575060a08301515185145b80156114bd575060c08301515185145b80156114cd575060e08301515185145b6115375760405162461bcd60e51b81526020600482015260416024820152600080516020615e7783398151915260448201527f7265733a20696e7075742071756f72756d206c656e677468206d69736d6174636064820152600d60fb1b608482015260a40161092e565b825151602084015151146115af5760405162461bcd60e51b815260206004820152604460248201819052600080516020615e77833981519152908201527f7265733a20696e707574206e6f6e7369676e6572206c656e677468206d69736d6064820152630c2e8c6d60e31b608482015260a40161092e565b4363ffffffff168463ffffffff161061161e5760405162461bcd60e51b815260206004820152603c6024820152600080516020615e7783398151915260448201527f7265733a20696e76616c6964207265666572656e636520626c6f636b00000000606482015260840161092e565b6040805180820182526000808252602080830191909152825180840190935260608084529083015290866001600160401b0381111561165f5761165f6149eb565b604051908082528060200260200182016040528015611688578160200160208202803683370190505b506020820152866001600160401b038111156116a6576116a66149eb565b6040519080825280602002602001820160405280156116cf578160200160208202803683370190505b50815260408051808201909152606080825260208201528560200151516001600160401b03811115611703576117036149eb565b60405190808252806020026020018201604052801561172c578160200160208202803683370190505b5081526020860151516001600160401b0381111561174c5761174c6149eb565b604051908082528060200260200182016040528015611775578160200160208202803683370190505b50816020018190525060006118478a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051639aa1653d60e01b815290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169350639aa1653d925060048083019260209291908290030181865afa15801561181e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184291906154ca565b613d6b565b905060005b876020015151811015611ae25761189188602001518281518110611872576118726154e7565b6020026020010151805160009081526020918201519091526040902090565b836020015182815181106118a7576118a76154e7565b602090810291909101015280156119675760208301516118c8600183615671565b815181106118d8576118d86154e7565b602002602001015160001c836020015182815181106118f9576118f96154e7565b602002602001015160001c11611967576040805162461bcd60e51b8152602060048201526024810191909152600080516020615e7783398151915260448201527f7265733a206e6f6e5369676e65725075626b657973206e6f7420736f72746564606482015260840161092e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166304ec6351846020015183815181106119ac576119ac6154e7565b60200260200101518b8b6000015185815181106119cb576119cb6154e7565b60200260200101516040518463ffffffff1660e01b8152600401611a089392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4991906155a9565b6001600160c01b031683600001518281518110611a6857611a686154e7565b602002602001018181525050611ace610c2c611aa28486600001518581518110611a9457611a946154e7565b602002602001015116613dfc565b8a602001518481518110611ab857611ab86154e7565b6020026020010151613e2790919063ffffffff16565b945080611ada81615600565b91505061184c565b5050611aed83613f0b565b60c95490935060ff16600081611b04576000611b86565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c448feb86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b869190615590565b905060005b8a811015612204578215611ce6578963ffffffff16827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663249a0c428f8f86818110611be257611be26154e7565b60405160e085901b6001600160e01b031916815292013560f81c600483015250602401602060405180830381865afa158015611c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c469190615590565b611c5091906155e8565b11611ce65760405162461bcd60e51b81526020600482015260666024820152600080516020615e7783398151915260448201527f7265733a205374616b6552656769737472792075706461746573206d7573742060648201527f62652077697468696e207769746864726177616c44656c6179426c6f636b732060848201526577696e646f7760d01b60a482015260c40161092e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166368bccaac8d8d84818110611d2757611d276154e7565b9050013560f81c60f81b60f81c8c8c60a001518581518110611d4b57611d4b6154e7565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa158015611da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcb9190615688565b6001600160401b031916611dee8a604001518381518110611872576118726154e7565b67ffffffffffffffff191614611e8a5760405162461bcd60e51b81526020600482015260616024820152600080516020615e7783398151915260448201527f7265733a2071756f72756d41706b206861736820696e2073746f72616765206460648201527f6f6573206e6f74206d617463682070726f76696465642071756f72756d2061706084820152606b60f81b60a482015260c40161092e565b611eba89604001518281518110611ea357611ea36154e7565b60200260200101518761379690919063ffffffff16565b95507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c8294c568d8d84818110611efd57611efd6154e7565b9050013560f81c60f81b60f81c8c8c60c001518581518110611f2157611f216154e7565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa158015611f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa191906156b3565b85602001518281518110611fb757611fb76154e7565b6001600160601b03909216602092830291909101820152850151805182908110611fe357611fe36154e7565b602002602001015185600001518281518110612001576120016154e7565b60200260200101906001600160601b031690816001600160601b0316815250506000805b8a60200151518110156121ef576120798660000151828151811061204b5761204b6154e7565b60200260200101518f8f86818110612065576120656154e7565b600192013560f81c9290921c811614919050565b156121dd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f2be94ae8f8f868181106120bf576120bf6154e7565b9050013560f81c60f81b60f81c8e896020015185815181106120e3576120e36154e7565b60200260200101518f60e001518881518110612101576121016154e7565b6020026020010151878151811061211a5761211a6154e7565b60209081029190910101516040516001600160e01b031960e087901b16815260ff909416600485015263ffffffff92831660248501526044840191909152166064820152608401602060405180830381865afa15801561217e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a291906156b3565b87518051859081106121b6576121b66154e7565b602002602001018181516121ca91906156d0565b6001600160601b03169052506001909101905b806121e781615600565b915050612025565b505080806121fc90615600565b915050611b8b565b50505060008061221e8c868a606001518b60800151610b11565b915091508161228f5760405162461bcd60e51b81526020600482015260436024820152600080516020615e7783398151915260448201527f7265733a2070616972696e6720707265636f6d70696c652063616c6c206661696064820152621b195960ea1b608482015260a40161092e565b806122f05760405162461bcd60e51b81526020600482015260396024820152600080516020615e7783398151915260448201527f7265733a207369676e617475726520697320696e76616c696400000000000000606482015260840161092e565b5050600087826020015160405160200161230b9291906156f8565b60408051808303601f190181529190528051602090910120929b929a509198505050505050505050565b61233d613c60565b6123476000613fa6565b565b603254610100900460ff16158080156123695750603254600160ff909116105b806123835750303b158015612383575060325460ff166001145b6123e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161092e565b6032805460ff191660011790558015612409576032805461ff0019166101001790555b6124138686613ff8565b61241c84613fa6565b61242582613cba565b60005b835181101561246357612453848281518110612446576124466154e7565b60200260200101516140e2565b61245c81615600565b9050612428565b5080156124aa576032805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60fc546000906001908116141561250b5760405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e6465782069732070617573656400000000000000604482015260640161092e565b3360009081526002602052604090205460ff1661252757600080fd5b32331461258c5760405162461bcd60e51b815260206004820152602d60248201527f68656164657220616e64206e6f6e7369676e65722064617461206d757374206260448201526c6520696e2063616c6c6461746160981b606482015260840161092e565b4361259d60808501606086016153e1565b63ffffffff16106126045760405162461bcd60e51b815260206004820152602b60248201527f737065636966696564207265666572656e6365426c6f636b4e756d626572206960448201526a7320696e2066757475726560a81b606482015260840161092e565b63ffffffff431661012c61261e60808601606087016153e1565b6126289190615740565b63ffffffff1610156126965760405162461bcd60e51b815260206004820152603160248201527f737065636966696564207265666572656e6365426c6f636b4e756d62657220696044820152701cc81d1bdbc819985c881a5b881c185cdd607a1b606482015260840161092e565b6126a36040840184615768565b90506126b26020850185615768565b9050146127275760405162461bcd60e51b815260206004820152603b60248201527f71756f72756d4e756d6265727320616e64207369676e65645374616b65466f7260448201527f51756f72756d73206d7573742062652073616d65206c656e6774680000000000606482015260840161092e565b600061273a612735856157ae565b614145565b9050600080612766836127506020890189615768565b61276060808b0160608c016153e1565b8961141e565b9150915060005b61277a6040880188615768565b905081101561289a576127906040880188615768565b828181106127a0576127a06154e7565b9050013560f81c60f81b60f81c60ff16836020015182815181106127c6576127c66154e7565b60200260200101516127d89190615850565b6001600160601b03166064846000015183815181106127f9576127f96154e7565b60200260200101516001600160601b0316612814919061587f565b10156128885760405162461bcd60e51b815260206004820152603760248201527f7369676e61746f7269657320646f206e6f74206f776e207468726573686f6c6460448201527f2070657263656e74616765206f6620612071756f72756d000000000000000000606482015260840161092e565b8061289281615600565b91505061276d565b506000805463ffffffff16906128af886141c0565b6040805160208082018490528183018790524360e01b6001600160e01b0319166060830152825160448184030181526064830180855281519183019190912063ffffffff881660008181526001909452928590205552905191925086917fc75557c4ad49697e231449688be13ef11cb6be8ed0d18819d8dde074a5a16f8a9181900360840190a2612941826001615740565b6000805463ffffffff191663ffffffff929092169190911790555050505050505050565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638687feae6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156129c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129ed919081019061589e565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612a3a5760405162461bcd60e51b815260040161092e90615914565b604051639926ee7d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639926ee7d90612a88908590859060040161598c565b600060405180830381600087803b158015612aa257600080fd5b505af11580156124aa573d6000803e3d6000fd5b612abe613c60565b60405163a0169ddd60e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a0169ddd906024015b600060405180830381600087803b158015612b2257600080fd5b505af1158015612b36573d6000803e3d6000fd5b5050505050565b612b456141d3565b60005b81811015612cc0576000805b848484818110612b6657612b666154e7565b9050602002810190612b7891906159d7565b612b869060408101906159f7565b9050811015612bf857848484818110612ba157612ba16154e7565b9050602002810190612bb391906159d7565b612bc19060408101906159f7565b82818110612bd157612bd16154e7565b9050604002016020013582612be691906155e8565b9150612bf181615600565b9050612b54565b50612c45333083878787818110612c1157612c116154e7565b9050602002810190612c2391906159d7565b612c349060408101906020016149b5565b6001600160a01b0316929190614268565b612caf7f000000000000000000000000000000000000000000000000000000000000000082868686818110612c7c57612c7c6154e7565b9050602002810190612c8e91906159d7565b612c9f9060408101906020016149b5565b6001600160a01b031691906142d9565b50612cb981615600565b9050612b48565b50604051634e5cd2fd60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639cb9a5fa90612a8890309086908690600401615b51565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612d595760405162461bcd60e51b815260040161092e90615914565b6040516351b27a6d60e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a364f4da90602401612b08565b612daf613c60565b60405163a98fb35560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a98fb35590612b089084906004016151cf565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bafa91076040518163ffffffff1660e01b8152600401600060405180830381865afa1580156129c5573d6000803e3d6000fd5b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e15234ff6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156129c5573d6000803e3d6000fd5b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4191906154ca565b60ff16905080612f5f57505060408051600081526020810190915290565b6000805b8281101561301457604051633ca5a5f560e01b815260ff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633ca5a5f590602401602060405180830381865afa158015612fd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff69190615590565b61300090836155e8565b91508061300c81615600565b915050612f63565b506000816001600160401b0381111561302f5761302f6149eb565b604051908082528060200260200182016040528015613058578160200160208202803683370190505b5090506000805b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e191906154ca565b60ff1681101561327a57604051633ca5a5f560e01b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633ca5a5f590602401602060405180830381865afa158015613155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131799190615590565b905060005b81811015613265576040516356e4026d60e11b815260ff84166004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063adc804da906044016040805180830381865afa1580156131f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132179190615630565b6000015185858151811061322d5761322d6154e7565b6001600160a01b03909216602092830291909101909101528361324f81615600565b945050808061325d90615600565b91505061317e565b5050808061327290615600565b91505061305f565b5090949350505050565b600061012c613296620189c084615740565b6108819190615740565b60405163ee6c3bcf60e01b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ee6c3bcf90602401610ad0565b6132fa613c60565b610940816140e2565b61330b613c60565b6001600160a01b0381166133705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161092e565b61094081613fa6565b60fb60009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f0919061541b565b6001600160a01b0316336001600160a01b0316146134205760405162461bcd60e51b815260040161092e90615438565b60fc5419811960fc5419161461349e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161092e565b60fc81905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a77565b6134dd6141d3565b60005b818110156135b95761353933308585858181106134ff576134ff6154e7565b90506020028101906135119190615cad565b60400135868686818110613527576135276154e7565b9050602002810190612c239190615cad565b6135a97f000000000000000000000000000000000000000000000000000000000000000084848481811061356f5761356f6154e7565b90506020028101906135819190615cad565b60400135858585818110613597576135976154e7565b9050602002810190612c8e9190615cad565b6135b281615600565b90506134e0565b5060405163fce36c7d60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fce36c7d90612a889085908590600401615cc3565b6001600160a01b0381166136965760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161092e565b60fb54604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a160fb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082019091526000808252602082015261371b61489a565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa905080801561374e57613750565bfe5b508061378e5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b604482015260640161092e565b505092915050565b60408051808201909152600080825260208201526137b26148b8565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa905080801561374e57508061378e5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b604482015260640161092e565b6138326148d6565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b60408051808201909152600080825260208201526000808061391a600080516020615e57833981519152866154fd565b90505b6139268161438b565b9093509150600080516020615e57833981519152828309831415613960576040805180820190915290815260208101919091529392505050565b600080516020615e5783398151915260018208905061391d565b6040805180820182528681526020808201869052825180840190935286835282018490526000918291906139ac6148fb565b60005b6002811015613b715760006139c582600661587f565b90508482600281106139d9576139d96154e7565b602002015151836139eb8360006155e8565b600c81106139fb576139fb6154e7565b6020020152848260028110613a1257613a126154e7565b60200201516020015183826001613a2991906155e8565b600c8110613a3957613a396154e7565b6020020152838260028110613a5057613a506154e7565b6020020151515183613a638360026155e8565b600c8110613a7357613a736154e7565b6020020152838260028110613a8a57613a8a6154e7565b6020020151516001602002015183613aa38360036155e8565b600c8110613ab357613ab36154e7565b6020020152838260028110613aca57613aca6154e7565b602002015160200151600060028110613ae557613ae56154e7565b602002015183613af68360046155e8565b600c8110613b0657613b066154e7565b6020020152838260028110613b1d57613b1d6154e7565b602002015160200151600160028110613b3857613b386154e7565b602002015183613b498360056155e8565b600c8110613b5957613b596154e7565b60200201525080613b6981615600565b9150506139af565b50613b7a61491a565b60006020826101808560088cfa9151919c9115159b50909950505050505050505050565b6060600080613bac84613dfc565b61ffff166001600160401b03811115613bc757613bc76149eb565b6040519080825280601f01601f191660200182016040528015613bf1576020820181803683370190505b5090506000805b825182108015613c09575061010081105b1561327a576001811b935085841615613c50578060f81b838381518110613c3257613c326154e7565b60200101906001600160f81b031916908160001a9053508160010191505b613c5981615600565b9050613bf8565b6065546001600160a01b031633146123475760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161092e565b609754604080516001600160a01b03928316815291831660208301527fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e3910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b60c9805460ff19168215159081179091556040519081527f40e4ed880a29e0f6ddce307457fb75cddf4feef7d3ecb0301bfdf4976a0e2dfc906020015b60405180910390a150565b600080613d778461440d565b9050808360ff166001901b11613df55760405162461bcd60e51b815260206004820152603f60248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206269746d61702065786365656473206d61782076616c756500606482015260840161092e565b9392505050565b6000805b821561088157613e11600184615671565b9092169180613e1f81615da4565b915050613e00565b60408051808201909152600080825260208201526102008261ffff1610613e835760405162461bcd60e51b815260206004820152601060248201526f7363616c61722d746f6f2d6c6172676560801b604482015260640161092e565b8161ffff1660011415613e97575081610881565b6040805180820190915260008082526020820181905284906001905b8161ffff168661ffff1610613f0057600161ffff871660ff83161c81161415613ee357613ee08484613796565b93505b613eed8384613796565b92506201fffe600192831b169101613eb3565b509195945050505050565b60408051808201909152600080825260208201528151158015613f3057506020820151155b15613f4e575050604080518082019091526000808252602082015290565b604051806040016040528083600001518152602001600080516020615e578339815191528460200151613f8191906154fd565b613f9990600080516020615e57833981519152615671565b905292915050565b919050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60fb546001600160a01b031615801561401957506001600160a01b03821615155b61409b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161092e565b60fc81905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26140de82613608565b5050565b6001600160a01b038116600081815260026020908152604091829020805460ff8082161560ff1990921682179092558351948552161515908301527f5c3265f5fb462ef4930fe47beaa183647c97f19ba545b761f41bc8cd4621d4149101613d60565b600061418282604080518082019091526000808252602082015250604080518082019091528151815260609091015163ffffffff16602082015290565b6040805182516020808301919091529092015163ffffffff16908201526060015b604051602081830303815290604052805190602001209050919050565b6000816040516020016141a39190615dc6565b6097546001600160a01b031633146123475760405162461bcd60e51b815260206004820152604c60248201527f536572766963654d616e61676572426173652e6f6e6c7952657761726473496e60448201527f69746961746f723a2063616c6c6572206973206e6f742074686520726577617260648201526b32399034b734ba34b0ba37b960a11b608482015260a40161092e565b6040516001600160a01b03808516602483015283166044820152606481018290526142d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261459a565b50505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561432a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434e9190615590565b61435891906155e8565b6040516001600160a01b0385166024820152604481018290529091506142d390859063095ea7b360e01b9060640161429c565b60008080600080516020615e578339815191526003600080516020615e5783398151915286600080516020615e57833981519152888909090890506000614401827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52600080516020615e57833981519152614671565b91959194509092505050565b6000610100825111156144965760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a40161092e565b81516144a457506000919050565b600080836000815181106144ba576144ba6154e7565b0160200151600160f89190911c81901b92505b8451811015614591578481815181106144e8576144e86154e7565b0160200151600160f89190911c1b915082821161457d5760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a40161092e565b9181179161458a81615600565b90506144cd565b50909392505050565b60006145ef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166147199092919063ffffffff16565b80519091501561466c578080602001905181019061460d91906153fe565b61466c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161092e565b505050565b60008061467c61491a565b614684614938565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa925082801561374e57508261470e5760405162461bcd60e51b815260206004820152601a60248201527f424e3235342e6578704d6f643a2063616c6c206661696c757265000000000000604482015260640161092e565b505195945050505050565b60606147288484600085614730565b949350505050565b6060824710156147915760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161092e565b6001600160a01b0385163b6147e85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161092e565b600080866001600160a01b031685876040516148049190615e44565b60006040518083038185875af1925050503d8060008114614841576040519150601f19603f3d011682016040523d82523d6000602084013e614846565b606091505b5091509150614856828286614861565b979650505050505050565b60608315614870575081613df5565b8251156148805782518084602001fd5b8160405162461bcd60e51b815260040161092e91906151cf565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806148e9614956565b81526020016148f6614956565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60ff8116811461094057600080fd5b60006020828403121561499557600080fd5b8135613df581614974565b6001600160a01b038116811461094057600080fd5b6000602082840312156149c757600080fd5b8135613df5816149a0565b6000602082840312156149e457600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715614a2357614a236149eb565b60405290565b60405161010081016001600160401b0381118282101715614a2357614a236149eb565b604051601f8201601f191681016001600160401b0381118282101715614a7457614a746149eb565b604052919050565b600060408284031215614a8e57600080fd5b614a96614a01565b9050813581526020820135602082015292915050565b600082601f830112614abd57600080fd5b614ac5614a01565b806040840185811115614ad757600080fd5b845b81811015614af1578035845260209384019301614ad9565b509095945050505050565b600060808284031215614b0e57600080fd5b614b16614a01565b9050614b228383614aac565b8152614b318360408401614aac565b602082015292915050565b6000806000806101208587031215614b5357600080fd5b84359350614b648660208701614a7c565b9250614b738660608701614afc565b9150614b828660e08701614a7c565b905092959194509250565b600060208284031215614b9f57600080fd5b813561ffff81168114613df557600080fd5b8035613fa1816149a0565b6020808252825182820181905260009190848201906040850190845b81811015614bfd5783516001600160a01b031683529284019291840191600101614bd8565b50909695505050505050565b801515811461094057600080fd5b600060208284031215614c2957600080fd5b8135613df581614c09565b63ffffffff8116811461094057600080fd5b8035613fa181614c34565b60006001600160401b03821115614c6a57614c6a6149eb565b5060051b60200190565b600082601f830112614c8557600080fd5b81356020614c9a614c9583614c51565b614a4c565b82815260059290921b84018101918181019086841115614cb957600080fd5b8286015b84811015614cdd578035614cd081614c34565b8352918301918301614cbd565b509695505050505050565b600082601f830112614cf957600080fd5b81356020614d09614c9583614c51565b82815260069290921b84018101918181019086841115614d2857600080fd5b8286015b84811015614cdd57614d3e8882614a7c565b835291830191604001614d2c565b600082601f830112614d5d57600080fd5b81356020614d6d614c9583614c51565b82815260059290921b84018101918181019086841115614d8c57600080fd5b8286015b84811015614cdd5780356001600160401b03811115614daf5760008081fd5b614dbd8986838b0101614c74565b845250918301918301614d90565b60006101808284031215614dde57600080fd5b614de6614a29565b905081356001600160401b0380821115614dff57600080fd5b614e0b85838601614c74565b83526020840135915080821115614e2157600080fd5b614e2d85838601614ce8565b60208401526040840135915080821115614e4657600080fd5b614e5285838601614ce8565b6040840152614e648560608601614afc565b6060840152614e768560e08601614a7c565b6080840152610120840135915080821115614e9057600080fd5b614e9c85838601614c74565b60a0840152610140840135915080821115614eb657600080fd5b614ec285838601614c74565b60c0840152610160840135915080821115614edc57600080fd5b50614ee984828501614d4c565b60e08301525092915050565b600080600080600060808688031215614f0d57600080fd5b8535945060208601356001600160401b0380821115614f2b57600080fd5b818801915088601f830112614f3f57600080fd5b813581811115614f4e57600080fd5b896020828501011115614f6057600080fd5b6020830196509450614f7460408901614c46565b93506060880135915080821115614f8a57600080fd5b50614f9788828901614dcb565b9150509295509295909350565b600081518084526020808501945080840160005b83811015614fdd5781516001600160601b031687529582019590820190600101614fb8565b509495945050505050565b60408152600083516040808401526150036080840182614fa4565b90506020850151603f198483030160608501526150208282614fa4565b925050508260208301529392505050565b600080600080600060a0868803121561504957600080fd5b8535615054816149a0565b94506020868101359450604087013561506c816149a0565b935060608701356001600160401b0381111561508757600080fd5b8701601f8101891361509857600080fd5b80356150a6614c9582614c51565b81815260059190911b8201830190838101908b8311156150c557600080fd5b928401925b828410156150ec5783356150dd816149a0565b825292840192908401906150ca565b809650505050505061510060808701614bb1565b90509295509295909350565b6000806040838503121561511f57600080fd5b82356001600160401b038082111561513657600080fd5b908401906080828703121561514a57600080fd5b9092506020840135908082111561516057600080fd5b5061516d85828601614dcb565b9150509250929050565b60005b8381101561519257818101518382015260200161517a565b838111156142d35750506000910152565b600081518084526151bb816020860160208601615177565b601f01601f19169290920160200192915050565b602081526000613df560208301846151a3565b60006001600160401b038211156151fb576151fb6149eb565b50601f01601f191660200190565b6000615217614c95846151e2565b905082815283838301111561522b57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261525357600080fd5b613df583833560208501615209565b6000806040838503121561527557600080fd5b8235615280816149a0565b915060208301356001600160401b038082111561529c57600080fd5b90840190606082870312156152b057600080fd5b6040516060810181811083821117156152cb576152cb6149eb565b6040528235828111156152dd57600080fd5b6152e988828601615242565b82525060208301356020820152604083013560408201528093505050509250929050565b60008083601f84011261531f57600080fd5b5081356001600160401b0381111561533657600080fd5b6020830191508360208260051b850101111561535157600080fd5b9250929050565b6000806020838503121561536b57600080fd5b82356001600160401b0381111561538157600080fd5b61538d8582860161530d565b90969095509350505050565b6000602082840312156153ab57600080fd5b81356001600160401b038111156153c157600080fd5b8201601f810184136153d257600080fd5b61472884823560208401615209565b6000602082840312156153f357600080fd5b8135613df581614c34565b60006020828403121561541057600080fd5b8151613df581614c09565b60006020828403121561542d57600080fd5b8151613df5816149a0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000602082840312156154dc57600080fd5b8151613df581614974565b634e487b7160e01b600052603260045260246000fd5b60008261551a57634e487b7160e01b600052601260045260246000fd5b500690565b60006060828403121561553157600080fd5b604051606081018181106001600160401b0382111715615553576155536149eb565b604052825161556181614c34565b8152602083015161557181614c34565b6020820152604083015161558481614974565b60408201529392505050565b6000602082840312156155a257600080fd5b5051919050565b6000602082840312156155bb57600080fd5b81516001600160c01b0381168114613df557600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156155fb576155fb6155d2565b500190565b6000600019821415615614576156146155d2565b5060010190565b6001600160601b038116811461094057600080fd5b60006040828403121561564257600080fd5b61564a614a01565b8251615655816149a0565b815260208301516156658161561b565b60208201529392505050565b600082821015615683576156836155d2565b500390565b60006020828403121561569a57600080fd5b815167ffffffffffffffff1981168114613df557600080fd5b6000602082840312156156c557600080fd5b8151613df58161561b565b60006001600160601b03838116908316818110156156f0576156f06155d2565b039392505050565b63ffffffff60e01b8360e01b1681526000600482018351602080860160005b8381101561573357815185529382019390820190600101615717565b5092979650505050505050565b600063ffffffff80831681851680830382111561575f5761575f6155d2565b01949350505050565b6000808335601e1984360301811261577f57600080fd5b8301803591506001600160401b0382111561579957600080fd5b60200191503681900382131561535157600080fd5b6000608082360312156157c057600080fd5b604051608081016001600160401b0382821081831117156157e3576157e36149eb565b816040528435835260208501359150808211156157ff57600080fd5b61580b36838701615242565b6020840152604085013591508082111561582457600080fd5b5061583136828601615242565b604083015250606083013561584581614c34565b606082015292915050565b60006001600160601b0380831681851681830481118215151615615876576158766155d2565b02949350505050565b6000816000190483118215151615615899576158996155d2565b500290565b6000602082840312156158b057600080fd5b81516001600160401b038111156158c657600080fd5b8201601f810184136158d757600080fd5b80516158e5614c95826151e2565b8181528560208385010111156158fa57600080fd5b61590b826020830160208601615177565b95945050505050565b60208082526052908201527f536572766963654d616e61676572426173652e6f6e6c7952656769737472794360408201527f6f6f7264696e61746f723a2063616c6c6572206973206e6f742074686520726560608201527133b4b9ba393c9031b7b7b93234b730ba37b960711b608082015260a00190565b60018060a01b03831681526040602082015260008251606060408401526159b660a08401826151a3565b90506020840151606084015260408401516080840152809150509392505050565b6000823560be198336030181126159ed57600080fd5b9190910192915050565b6000808335601e19843603018112615a0e57600080fd5b8301803591506001600160401b03821115615a2857600080fd5b6020019150600681901b360382131561535157600080fd5b6000808335601e19843603018112615a5757600080fd5b83016020810192503590506001600160401b03811115615a7657600080fd5b8060061b360383131561535157600080fd5b8183526000602080850194508260005b85811015614fdd578135615aab816149a0565b6001600160a01b0316875281830135615ac38161561b565b6001600160601b0316878401526040968701969190910190600101615a98565b6000808335601e19843603018112615afa57600080fd5b83016020810192503590506001600160401b03811115615b1957600080fd5b80360383131561535157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03848116825260406020808401829052838201859052600092606091828601600588901b8701840189875b8a811015615c9c57898303605f190184528135368d900360be19018112615ba957600080fd5b8c0160c0615bb78280615a40565b828752615bc78388018284615a88565b9250505086820135615bd8816149a0565b881685880152615bea828b0183615a40565b8683038c88015280835290916000919089015b81831015615c2e578335615c10816149a0565b8b168152838a01358a820152928c0192600192909201918c01615bfd565b615c398c8601614c46565b63ffffffff168c89015260809350615c52858501614c46565b63ffffffff811689860152925060a09350615c6f84860186615ae3565b9550925087810384890152615c85818685615b28565b988a01989750505093870193505050600101615b83565b50909b9a5050505050505050505050565b60008235609e198336030181126159ed57600080fd5b60208082528181018390526000906040808401600586901b850182018785805b89811015615d9557888403603f190185528235368c9003609e19018112615d08578283fd5b8b0160a0615d168280615a40565b828852615d268389018284615a88565b9250505088820135615d37816149a0565b6001600160a01b0316868a01528188013588870152606080830135615d5b81614c34565b63ffffffff808216838a015260809250828501359450615d7a85614c34565b93909316960195909552509386019391860191600101615ce3565b50919998505050505050505050565b600061ffff80831681811415615dbc57615dbc6155d2565b6001019392505050565b60208152813560208201526000615de06020840184615ae3565b60806040850152615df560a085018284615b28565b915050615e056040850185615ae3565b848303601f19016060860152615e1c838284615b28565b925050506060840135615e2e81614c34565b63ffffffff166080939093019290925250919050565b600082516159ed81846020870161517756fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47424c535369676e6174757265436865636b65722e636865636b5369676e617475a2646970667358221220d031b5b66e2cd036eff219eef06026f019c064d562e219f7d1f9cf6ff728d10564736f6c634300080c0033", + Bin: "0x6102006040523480156200001257600080fd5b506040516200643238038062006432833981016040819052620000359162000305565b6001600160a01b0380851660805280841660a05280831660c05280821660e05280891661010052808816610120528087166101405285166101605285888882886200007f6200022a565b50505050806001600160a01b0316610180816001600160a01b031681525050806001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001039190620003c6565b6001600160a01b03166101a0816001600160a01b031681525050806001600160a01b0316635df459466040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200015c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001829190620003c6565b6001600160a01b03166101c0816001600160a01b0316815250506101a0516001600160a01b031663df5cf7236040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002049190620003c6565b6001600160a01b03166101e052506200021c6200022a565b5050505050505050620003ed565b603254610100900460ff1615620002975760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60325460ff9081161015620002ea576032805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200030257600080fd5b50565b600080600080600080600080610100898b0312156200032357600080fd5b88516200033081620002ec565b60208a01519098506200034381620002ec565b60408a01519097506200035681620002ec565b60608a01519096506200036981620002ec565b60808a01519095506200037c81620002ec565b60a08a01519094506200038f81620002ec565b60c08a0151909350620003a281620002ec565b60e08a0151909250620003b581620002ec565b809150509295985092959890939650565b600060208284031215620003d957600080fd5b8151620003e681620002ec565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e051615ecc620005666000396000818161069f0152611b060152600081816104850152611ce80152600081816104d701528181611ebe015261208001526000818161052401528181611222015281816117d1015281816119690152611ba3015260008181610f3a015281816110950152818161112c01528181612f830152818161310601526131a5015260008181610d6501528181610df401528181610e74015281816129fd01528181612d1c01528181612ec10152613061015260008181612add01528181612c4a01528181612cd80152818161353e01526135d10152600081816104fb01528181612a5101528181612d780152612dc60152600061074301526000610709015260006105740152600081816107980152818161080e01528181610a9d01528181610cd50152818161296901528181612dff01528181612e5f01526132bb0152615ecc6000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c80638687feae1161019d578063e481af9d116100e9578063ef024458116100a2578063f8c668141161007c578063f8c6681414610793578063fabc1cbc146107ba578063fc299dee146107cd578063fce36c7d146107e057600080fd5b8063ef02445814610765578063f12209831461076d578063f2fde38b1461078057600080fd5b8063e481af9d146106c9578063eaefd27d146106d1578063eccbbfc9146106e4578063ed3916f714610704578063ee6c3bcf1461072b578063eeae17f61461073e57600080fd5b8063a364f4da11610156578063b98d090811610130578063b98d090814610685578063bafa910714610692578063df5cf7231461069a578063e15234ff146106c157600080fd5b8063a364f4da1461063c578063a5b7890a1461064f578063a98fb3551461067257600080fd5b80638687feae146105ca578063886f1195146105df5780638da5cb5b146105f25780639926ee7d14610603578063a0169ddd14610616578063a20b99bf1461062957600080fd5b80635c975abb1161025c5780636d14a9871161021557806372276443116101ef578063722764431461056f57806372d18e8d14610596578063775bbcb5146105a45780637794965a146105b757600080fd5b80636d14a9871461051f5780636efb463614610546578063715018a61461056757600080fd5b80635c975abb1461046e5780635df45946146104805780635e033476146104bf5780635e8b3f2d146104c957806368304835146104d25780636b3aa72e146104f957600080fd5b806333cfb7b7116102ae57806333cfb7b7146103d85780633bc28c8c146103f8578063416c7e5e1461040b5780634972134a1461041e578063595c6a67146104435780635ac86ab71461044b57600080fd5b8063048886d2146102f657806310d67a2f1461031e578063136439dd146103335780631429c7c214610346578063171f1d5b1461036b5780632ecfe72b14610395575b600080fd5b610309610304366004614983565b6107f3565b60405190151581526020015b60405180910390f35b61033161032c3660046149b5565b610887565b005b6103316103413660046149d2565b610943565b610359610354366004614983565b610a82565b60405160ff9091168152602001610315565b61037e610379366004614b3c565b610b11565b604080519215158352901515602083015201610315565b6103a86103a3366004614b8d565b610c9b565b60408051825163ffffffff9081168252602080850151909116908201529181015160ff1690820152606001610315565b6103eb6103e63660046149b5565b610d40565b6040516103159190614bbc565b6103316104063660046149b5565b61120f565b610331610419366004614c17565b611220565b60005461042e9063ffffffff1681565b60405163ffffffff9091168152602001610315565b610331611357565b610309610459366004614983565b60fc54600160ff9092169190911b9081161490565b60fc545b604051908152602001610315565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610315565b61042e620189c081565b61042e61012c81565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b7f00000000000000000000000000000000000000000000000000000000000000006104a7565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b610559610554366004614ef5565b61141e565b604051610315929190614fe8565b610331612335565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b60005463ffffffff1661042e565b6103316105b2366004615031565b612349565b6103316105c536600461510c565b6124b2565b6105d2612965565b60405161031591906151cf565b60fb546104a7906001600160a01b031681565b6065546001600160a01b03166104a7565b610331610611366004615262565b6129f2565b6103316106243660046149b5565b612ab6565b610331610637366004615358565b612b3d565b61033161064a3660046149b5565b612d11565b61030961065d3660046149b5565b60026020526000908152604090205460ff1681565b610331610680366004615399565b612da7565b60c9546103099060ff1681565b6105d2612dfb565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b6105d2612e5b565b6103eb612ebb565b61042e6106df3660046153e1565b613284565b6104726106f23660046153e1565b60016020526000908152604090205481565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b610359610739366004614983565b6132a0565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b610472606481565b61033161077b3660046149b5565b6132f2565b61033161078e3660046149b5565b613303565b6104a77f000000000000000000000000000000000000000000000000000000000000000081565b6103316107c83660046149d2565b613379565b6097546104a7906001600160a01b031681565b6103316107ee366004615358565b6134d5565b604051630244436960e11b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063048886d290602401602060405180830381865afa15801561085d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088191906153fe565b92915050565b60fb60009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fe919061541b565b6001600160a01b0316336001600160a01b0316146109375760405162461bcd60e51b815260040161092e90615438565b60405180910390fd5b61094081613608565b50565b60fb5460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561098b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109af91906153fe565b6109cb5760405162461bcd60e51b815260040161092e90615482565b60fc5481811614610a445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161092e565b60fc81905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b604051630a14e3e160e11b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631429c7c2906024015b602060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088191906154ca565b60008060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000187876000015188602001518860000151600060028110610b5957610b596154e7565b60200201518951600160200201518a60200151600060028110610b7e57610b7e6154e7565b60200201518b60200151600160028110610b9a57610b9a6154e7565b602090810291909101518c518d830151604051610bf79a99989796959401988952602089019790975260408801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200190565b6040516020818303038152906040528051906020012060001c610c1a91906154fd565b9050610c8d610c33610c2c88846136ff565b8690613796565b610c3b61382a565b610c83610c7485610c6e604080518082018252600080825260209182015281518083019092526001825260029082015290565b906136ff565b610c7d8c6138ea565b90613796565b886201d4c061397a565b909890975095505050505050565b60408051606081018252600080825260208201819052818301529051632ecfe72b60e01b815261ffff831660048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632ecfe72b90602401606060405180830381865afa158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610881919061551f565b6040516309aa152760e11b81526001600160a01b0382811660048301526060916000917f000000000000000000000000000000000000000000000000000000000000000016906313542a4e90602401602060405180830381865afa158015610dac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd09190615590565b60405163871ef04960e01b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063871ef04990602401602060405180830381865afa158015610e3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5f91906155a9565b90506001600160c01b0381161580610ef957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef491906154ca565b60ff16155b15610f1557505060408051600081526020810190915292915050565b6000610f29826001600160c01b0316613b9e565b90506000805b8251811015610fff577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ca5a5f5848381518110610f7957610f796154e7565b01602001516040516001600160e01b031960e084901b16815260f89190911c6004820152602401602060405180830381865afa158015610fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe19190615590565b610feb90836155e8565b915080610ff781615600565b915050610f2f565b506000816001600160401b0381111561101a5761101a6149eb565b604051908082528060200260200182016040528015611043578160200160208202803683370190505b5090506000805b8451811015611202576000858281518110611067576110676154e7565b0160200151604051633ca5a5f560e01b815260f89190911c6004820181905291506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ca5a5f590602401602060405180830381865afa1580156110dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111009190615590565b905060005b818110156111ec576040516356e4026d60e11b815260ff84166004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063adc804da906044016040805180830381865afa15801561117a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119e9190615630565b600001518686815181106111b4576111b46154e7565b6001600160a01b0390921660209283029190910190910152846111d681615600565b95505080806111e490615600565b915050611105565b50505080806111fa90615600565b91505061104a565b5090979650505050505050565b611217613c60565b61094081613cba565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a2919061541b565b6001600160a01b0316336001600160a01b03161461134e5760405162461bcd60e51b815260206004820152605c60248201527f424c535369676e6174757265436865636b65722e6f6e6c79436f6f7264696e6160448201527f746f724f776e65723a2063616c6c6572206973206e6f7420746865206f776e6560648201527f72206f6620746865207265676973747279436f6f7264696e61746f7200000000608482015260a40161092e565b61094081613d23565b60fb5460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c391906153fe565b6113df5760405162461bcd60e51b815260040161092e90615482565b60001960fc81905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60408051808201909152606080825260208201526000846114955760405162461bcd60e51b81526020600482015260376024820152600080516020615e7783398151915260448201527f7265733a20656d7074792071756f72756d20696e707574000000000000000000606482015260840161092e565b604083015151851480156114ad575060a08301515185145b80156114bd575060c08301515185145b80156114cd575060e08301515185145b6115375760405162461bcd60e51b81526020600482015260416024820152600080516020615e7783398151915260448201527f7265733a20696e7075742071756f72756d206c656e677468206d69736d6174636064820152600d60fb1b608482015260a40161092e565b825151602084015151146115af5760405162461bcd60e51b815260206004820152604460248201819052600080516020615e77833981519152908201527f7265733a20696e707574206e6f6e7369676e6572206c656e677468206d69736d6064820152630c2e8c6d60e31b608482015260a40161092e565b4363ffffffff168463ffffffff161061161e5760405162461bcd60e51b815260206004820152603c6024820152600080516020615e7783398151915260448201527f7265733a20696e76616c6964207265666572656e636520626c6f636b00000000606482015260840161092e565b6040805180820182526000808252602080830191909152825180840190935260608084529083015290866001600160401b0381111561165f5761165f6149eb565b604051908082528060200260200182016040528015611688578160200160208202803683370190505b506020820152866001600160401b038111156116a6576116a66149eb565b6040519080825280602002602001820160405280156116cf578160200160208202803683370190505b50815260408051808201909152606080825260208201528560200151516001600160401b03811115611703576117036149eb565b60405190808252806020026020018201604052801561172c578160200160208202803683370190505b5081526020860151516001600160401b0381111561174c5761174c6149eb565b604051908082528060200260200182016040528015611775578160200160208202803683370190505b50816020018190525060006118478a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051639aa1653d60e01b815290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169350639aa1653d925060048083019260209291908290030181865afa15801561181e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184291906154ca565b613d6b565b905060005b876020015151811015611ae25761189188602001518281518110611872576118726154e7565b6020026020010151805160009081526020918201519091526040902090565b836020015182815181106118a7576118a76154e7565b602090810291909101015280156119675760208301516118c8600183615671565b815181106118d8576118d86154e7565b602002602001015160001c836020015182815181106118f9576118f96154e7565b602002602001015160001c11611967576040805162461bcd60e51b8152602060048201526024810191909152600080516020615e7783398151915260448201527f7265733a206e6f6e5369676e65725075626b657973206e6f7420736f72746564606482015260840161092e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166304ec6351846020015183815181106119ac576119ac6154e7565b60200260200101518b8b6000015185815181106119cb576119cb6154e7565b60200260200101516040518463ffffffff1660e01b8152600401611a089392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4991906155a9565b6001600160c01b031683600001518281518110611a6857611a686154e7565b602002602001018181525050611ace610c2c611aa28486600001518581518110611a9457611a946154e7565b602002602001015116613dfc565b8a602001518481518110611ab857611ab86154e7565b6020026020010151613e2790919063ffffffff16565b945080611ada81615600565b91505061184c565b5050611aed83613f0b565b60c95490935060ff16600081611b04576000611b86565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c448feb86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b869190615590565b905060005b8a811015612204578215611ce6578963ffffffff16827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663249a0c428f8f86818110611be257611be26154e7565b60405160e085901b6001600160e01b031916815292013560f81c600483015250602401602060405180830381865afa158015611c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c469190615590565b611c5091906155e8565b11611ce65760405162461bcd60e51b81526020600482015260666024820152600080516020615e7783398151915260448201527f7265733a205374616b6552656769737472792075706461746573206d7573742060648201527f62652077697468696e207769746864726177616c44656c6179426c6f636b732060848201526577696e646f7760d01b60a482015260c40161092e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166368bccaac8d8d84818110611d2757611d276154e7565b9050013560f81c60f81b60f81c8c8c60a001518581518110611d4b57611d4b6154e7565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa158015611da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcb9190615688565b6001600160401b031916611dee8a604001518381518110611872576118726154e7565b67ffffffffffffffff191614611e8a5760405162461bcd60e51b81526020600482015260616024820152600080516020615e7783398151915260448201527f7265733a2071756f72756d41706b206861736820696e2073746f72616765206460648201527f6f6573206e6f74206d617463682070726f76696465642071756f72756d2061706084820152606b60f81b60a482015260c40161092e565b611eba89604001518281518110611ea357611ea36154e7565b60200260200101518761379690919063ffffffff16565b95507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c8294c568d8d84818110611efd57611efd6154e7565b9050013560f81c60f81b60f81c8c8c60c001518581518110611f2157611f216154e7565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa158015611f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa191906156b3565b85602001518281518110611fb757611fb76154e7565b6001600160601b03909216602092830291909101820152850151805182908110611fe357611fe36154e7565b602002602001015185600001518281518110612001576120016154e7565b60200260200101906001600160601b031690816001600160601b0316815250506000805b8a60200151518110156121ef576120798660000151828151811061204b5761204b6154e7565b60200260200101518f8f86818110612065576120656154e7565b600192013560f81c9290921c811614919050565b156121dd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f2be94ae8f8f868181106120bf576120bf6154e7565b9050013560f81c60f81b60f81c8e896020015185815181106120e3576120e36154e7565b60200260200101518f60e001518881518110612101576121016154e7565b6020026020010151878151811061211a5761211a6154e7565b60209081029190910101516040516001600160e01b031960e087901b16815260ff909416600485015263ffffffff92831660248501526044840191909152166064820152608401602060405180830381865afa15801561217e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a291906156b3565b87518051859081106121b6576121b66154e7565b602002602001018181516121ca91906156d0565b6001600160601b03169052506001909101905b806121e781615600565b915050612025565b505080806121fc90615600565b915050611b8b565b50505060008061221e8c868a606001518b60800151610b11565b915091508161228f5760405162461bcd60e51b81526020600482015260436024820152600080516020615e7783398151915260448201527f7265733a2070616972696e6720707265636f6d70696c652063616c6c206661696064820152621b195960ea1b608482015260a40161092e565b806122f05760405162461bcd60e51b81526020600482015260396024820152600080516020615e7783398151915260448201527f7265733a207369676e617475726520697320696e76616c696400000000000000606482015260840161092e565b5050600087826020015160405160200161230b9291906156f8565b60408051808303601f190181529190528051602090910120929b929a509198505050505050505050565b61233d613c60565b6123476000613fa6565b565b603254610100900460ff16158080156123695750603254600160ff909116105b806123835750303b158015612383575060325460ff166001145b6123e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161092e565b6032805460ff191660011790558015612409576032805461ff0019166101001790555b6124138686613ff8565b61241c84613fa6565b61242582613cba565b60005b835181101561246357612453848281518110612446576124466154e7565b60200260200101516140e2565b61245c81615600565b9050612428565b5080156124aa576032805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60fc546000906001908116141561250b5760405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e6465782069732070617573656400000000000000604482015260640161092e565b3360009081526002602052604090205460ff1661252757600080fd5b32331461258c5760405162461bcd60e51b815260206004820152602d60248201527f68656164657220616e64206e6f6e7369676e65722064617461206d757374206260448201526c6520696e2063616c6c6461746160981b606482015260840161092e565b4361259d60808501606086016153e1565b63ffffffff16106126045760405162461bcd60e51b815260206004820152602b60248201527f737065636966696564207265666572656e6365426c6f636b4e756d626572206960448201526a7320696e2066757475726560a81b606482015260840161092e565b63ffffffff431661012c61261e60808601606087016153e1565b6126289190615740565b63ffffffff1610156126965760405162461bcd60e51b815260206004820152603160248201527f737065636966696564207265666572656e6365426c6f636b4e756d62657220696044820152701cc81d1bdbc819985c881a5b881c185cdd607a1b606482015260840161092e565b6126a36040840184615768565b90506126b26020850185615768565b9050146127275760405162461bcd60e51b815260206004820152603b60248201527f71756f72756d4e756d6265727320616e64207369676e65645374616b65466f7260448201527f51756f72756d73206d7573742062652073616d65206c656e6774680000000000606482015260840161092e565b600061273a612735856157ae565b614145565b9050600080612766836127506020890189615768565b61276060808b0160608c016153e1565b8961141e565b9150915060005b61277a6040880188615768565b905081101561289a576127906040880188615768565b828181106127a0576127a06154e7565b9050013560f81c60f81b60f81c60ff16836020015182815181106127c6576127c66154e7565b60200260200101516127d89190615850565b6001600160601b03166064846000015183815181106127f9576127f96154e7565b60200260200101516001600160601b0316612814919061587f565b10156128885760405162461bcd60e51b815260206004820152603760248201527f7369676e61746f7269657320646f206e6f74206f776e207468726573686f6c6460448201527f2070657263656e74616765206f6620612071756f72756d000000000000000000606482015260840161092e565b8061289281615600565b91505061276d565b506000805463ffffffff16906128af886141c0565b6040805160208082018490528183018790524360e01b6001600160e01b0319166060830152825160448184030181526064830180855281519183019190912063ffffffff881660008181526001909452928590205552905191925086917fc75557c4ad49697e231449688be13ef11cb6be8ed0d18819d8dde074a5a16f8a9181900360840190a2612941826001615740565b6000805463ffffffff191663ffffffff929092169190911790555050505050505050565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638687feae6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156129c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129ed919081019061589e565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612a3a5760405162461bcd60e51b815260040161092e90615914565b604051639926ee7d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639926ee7d90612a88908590859060040161598c565b600060405180830381600087803b158015612aa257600080fd5b505af11580156124aa573d6000803e3d6000fd5b612abe613c60565b60405163a0169ddd60e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a0169ddd906024015b600060405180830381600087803b158015612b2257600080fd5b505af1158015612b36573d6000803e3d6000fd5b5050505050565b612b456141d3565b60005b81811015612cc0576000805b848484818110612b6657612b666154e7565b9050602002810190612b7891906159d7565b612b869060408101906159f7565b9050811015612bf857848484818110612ba157612ba16154e7565b9050602002810190612bb391906159d7565b612bc19060408101906159f7565b82818110612bd157612bd16154e7565b9050604002016020013582612be691906155e8565b9150612bf181615600565b9050612b54565b50612c45333083878787818110612c1157612c116154e7565b9050602002810190612c2391906159d7565b612c349060408101906020016149b5565b6001600160a01b0316929190614268565b612caf7f000000000000000000000000000000000000000000000000000000000000000082868686818110612c7c57612c7c6154e7565b9050602002810190612c8e91906159d7565b612c9f9060408101906020016149b5565b6001600160a01b031691906142d9565b50612cb981615600565b9050612b48565b50604051634e5cd2fd60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639cb9a5fa90612a8890309086908690600401615b51565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612d595760405162461bcd60e51b815260040161092e90615914565b6040516351b27a6d60e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a364f4da90602401612b08565b612daf613c60565b60405163a98fb35560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a98fb35590612b089084906004016151cf565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bafa91076040518163ffffffff1660e01b8152600401600060405180830381865afa1580156129c5573d6000803e3d6000fd5b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e15234ff6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156129c5573d6000803e3d6000fd5b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4191906154ca565b60ff16905080612f5f57505060408051600081526020810190915290565b6000805b8281101561301457604051633ca5a5f560e01b815260ff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633ca5a5f590602401602060405180830381865afa158015612fd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff69190615590565b61300090836155e8565b91508061300c81615600565b915050612f63565b506000816001600160401b0381111561302f5761302f6149eb565b604051908082528060200260200182016040528015613058578160200160208202803683370190505b5090506000805b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e191906154ca565b60ff1681101561327a57604051633ca5a5f560e01b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633ca5a5f590602401602060405180830381865afa158015613155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131799190615590565b905060005b81811015613265576040516356e4026d60e11b815260ff84166004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063adc804da906044016040805180830381865afa1580156131f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132179190615630565b6000015185858151811061322d5761322d6154e7565b6001600160a01b03909216602092830291909101909101528361324f81615600565b945050808061325d90615600565b91505061317e565b5050808061327290615600565b91505061305f565b5090949350505050565b600061012c613296620189c084615740565b6108819190615740565b60405163ee6c3bcf60e01b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ee6c3bcf90602401610ad0565b6132fa613c60565b610940816140e2565b61330b613c60565b6001600160a01b0381166133705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161092e565b61094081613fa6565b60fb60009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f0919061541b565b6001600160a01b0316336001600160a01b0316146134205760405162461bcd60e51b815260040161092e90615438565b60fc5419811960fc5419161461349e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161092e565b60fc81905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a77565b6134dd6141d3565b60005b818110156135b95761353933308585858181106134ff576134ff6154e7565b90506020028101906135119190615cad565b60400135868686818110613527576135276154e7565b9050602002810190612c239190615cad565b6135a97f000000000000000000000000000000000000000000000000000000000000000084848481811061356f5761356f6154e7565b90506020028101906135819190615cad565b60400135858585818110613597576135976154e7565b9050602002810190612c8e9190615cad565b6135b281615600565b90506134e0565b5060405163fce36c7d60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fce36c7d90612a889085908590600401615cc3565b6001600160a01b0381166136965760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161092e565b60fb54604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a160fb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082019091526000808252602082015261371b61489a565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa905080801561374e57613750565bfe5b508061378e5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b604482015260640161092e565b505092915050565b60408051808201909152600080825260208201526137b26148b8565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa905080801561374e57508061378e5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b604482015260640161092e565b6138326148d6565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b60408051808201909152600080825260208201526000808061391a600080516020615e57833981519152866154fd565b90505b6139268161438b565b9093509150600080516020615e57833981519152828309831415613960576040805180820190915290815260208101919091529392505050565b600080516020615e5783398151915260018208905061391d565b6040805180820182528681526020808201869052825180840190935286835282018490526000918291906139ac6148fb565b60005b6002811015613b715760006139c582600661587f565b90508482600281106139d9576139d96154e7565b602002015151836139eb8360006155e8565b600c81106139fb576139fb6154e7565b6020020152848260028110613a1257613a126154e7565b60200201516020015183826001613a2991906155e8565b600c8110613a3957613a396154e7565b6020020152838260028110613a5057613a506154e7565b6020020151515183613a638360026155e8565b600c8110613a7357613a736154e7565b6020020152838260028110613a8a57613a8a6154e7565b6020020151516001602002015183613aa38360036155e8565b600c8110613ab357613ab36154e7565b6020020152838260028110613aca57613aca6154e7565b602002015160200151600060028110613ae557613ae56154e7565b602002015183613af68360046155e8565b600c8110613b0657613b066154e7565b6020020152838260028110613b1d57613b1d6154e7565b602002015160200151600160028110613b3857613b386154e7565b602002015183613b498360056155e8565b600c8110613b5957613b596154e7565b60200201525080613b6981615600565b9150506139af565b50613b7a61491a565b60006020826101808560088cfa9151919c9115159b50909950505050505050505050565b6060600080613bac84613dfc565b61ffff166001600160401b03811115613bc757613bc76149eb565b6040519080825280601f01601f191660200182016040528015613bf1576020820181803683370190505b5090506000805b825182108015613c09575061010081105b1561327a576001811b935085841615613c50578060f81b838381518110613c3257613c326154e7565b60200101906001600160f81b031916908160001a9053508160010191505b613c5981615600565b9050613bf8565b6065546001600160a01b031633146123475760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161092e565b609754604080516001600160a01b03928316815291831660208301527fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e3910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b60c9805460ff19168215159081179091556040519081527f40e4ed880a29e0f6ddce307457fb75cddf4feef7d3ecb0301bfdf4976a0e2dfc906020015b60405180910390a150565b600080613d778461440d565b9050808360ff166001901b11613df55760405162461bcd60e51b815260206004820152603f60248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206269746d61702065786365656473206d61782076616c756500606482015260840161092e565b9392505050565b6000805b821561088157613e11600184615671565b9092169180613e1f81615da4565b915050613e00565b60408051808201909152600080825260208201526102008261ffff1610613e835760405162461bcd60e51b815260206004820152601060248201526f7363616c61722d746f6f2d6c6172676560801b604482015260640161092e565b8161ffff1660011415613e97575081610881565b6040805180820190915260008082526020820181905284906001905b8161ffff168661ffff1610613f0057600161ffff871660ff83161c81161415613ee357613ee08484613796565b93505b613eed8384613796565b92506201fffe600192831b169101613eb3565b509195945050505050565b60408051808201909152600080825260208201528151158015613f3057506020820151155b15613f4e575050604080518082019091526000808252602082015290565b604051806040016040528083600001518152602001600080516020615e578339815191528460200151613f8191906154fd565b613f9990600080516020615e57833981519152615671565b905292915050565b919050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60fb546001600160a01b031615801561401957506001600160a01b03821615155b61409b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161092e565b60fc81905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26140de82613608565b5050565b6001600160a01b038116600081815260026020908152604091829020805460ff8082161560ff1990921682179092558351948552161515908301527f5c3265f5fb462ef4930fe47beaa183647c97f19ba545b761f41bc8cd4621d4149101613d60565b600061418282604080518082019091526000808252602082015250604080518082019091528151815260609091015163ffffffff16602082015290565b6040805182516020808301919091529092015163ffffffff16908201526060015b604051602081830303815290604052805190602001209050919050565b6000816040516020016141a39190615dc6565b6097546001600160a01b031633146123475760405162461bcd60e51b815260206004820152604c60248201527f536572766963654d616e61676572426173652e6f6e6c7952657761726473496e60448201527f69746961746f723a2063616c6c6572206973206e6f742074686520726577617260648201526b32399034b734ba34b0ba37b960a11b608482015260a40161092e565b6040516001600160a01b03808516602483015283166044820152606481018290526142d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261459a565b50505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561432a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434e9190615590565b61435891906155e8565b6040516001600160a01b0385166024820152604481018290529091506142d390859063095ea7b360e01b9060640161429c565b60008080600080516020615e578339815191526003600080516020615e5783398151915286600080516020615e57833981519152888909090890506000614401827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52600080516020615e57833981519152614671565b91959194509092505050565b6000610100825111156144965760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a40161092e565b81516144a457506000919050565b600080836000815181106144ba576144ba6154e7565b0160200151600160f89190911c81901b92505b8451811015614591578481815181106144e8576144e86154e7565b0160200151600160f89190911c1b915082821161457d5760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a40161092e565b9181179161458a81615600565b90506144cd565b50909392505050565b60006145ef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166147199092919063ffffffff16565b80519091501561466c578080602001905181019061460d91906153fe565b61466c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161092e565b505050565b60008061467c61491a565b614684614938565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa925082801561374e57508261470e5760405162461bcd60e51b815260206004820152601a60248201527f424e3235342e6578704d6f643a2063616c6c206661696c757265000000000000604482015260640161092e565b505195945050505050565b60606147288484600085614730565b949350505050565b6060824710156147915760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161092e565b6001600160a01b0385163b6147e85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161092e565b600080866001600160a01b031685876040516148049190615e44565b60006040518083038185875af1925050503d8060008114614841576040519150601f19603f3d011682016040523d82523d6000602084013e614846565b606091505b5091509150614856828286614861565b979650505050505050565b60608315614870575081613df5565b8251156148805782518084602001fd5b8160405162461bcd60e51b815260040161092e91906151cf565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806148e9614956565b81526020016148f6614956565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60ff8116811461094057600080fd5b60006020828403121561499557600080fd5b8135613df581614974565b6001600160a01b038116811461094057600080fd5b6000602082840312156149c757600080fd5b8135613df5816149a0565b6000602082840312156149e457600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715614a2357614a236149eb565b60405290565b60405161010081016001600160401b0381118282101715614a2357614a236149eb565b604051601f8201601f191681016001600160401b0381118282101715614a7457614a746149eb565b604052919050565b600060408284031215614a8e57600080fd5b614a96614a01565b9050813581526020820135602082015292915050565b600082601f830112614abd57600080fd5b614ac5614a01565b806040840185811115614ad757600080fd5b845b81811015614af1578035845260209384019301614ad9565b509095945050505050565b600060808284031215614b0e57600080fd5b614b16614a01565b9050614b228383614aac565b8152614b318360408401614aac565b602082015292915050565b6000806000806101208587031215614b5357600080fd5b84359350614b648660208701614a7c565b9250614b738660608701614afc565b9150614b828660e08701614a7c565b905092959194509250565b600060208284031215614b9f57600080fd5b813561ffff81168114613df557600080fd5b8035613fa1816149a0565b6020808252825182820181905260009190848201906040850190845b81811015614bfd5783516001600160a01b031683529284019291840191600101614bd8565b50909695505050505050565b801515811461094057600080fd5b600060208284031215614c2957600080fd5b8135613df581614c09565b63ffffffff8116811461094057600080fd5b8035613fa181614c34565b60006001600160401b03821115614c6a57614c6a6149eb565b5060051b60200190565b600082601f830112614c8557600080fd5b81356020614c9a614c9583614c51565b614a4c565b82815260059290921b84018101918181019086841115614cb957600080fd5b8286015b84811015614cdd578035614cd081614c34565b8352918301918301614cbd565b509695505050505050565b600082601f830112614cf957600080fd5b81356020614d09614c9583614c51565b82815260069290921b84018101918181019086841115614d2857600080fd5b8286015b84811015614cdd57614d3e8882614a7c565b835291830191604001614d2c565b600082601f830112614d5d57600080fd5b81356020614d6d614c9583614c51565b82815260059290921b84018101918181019086841115614d8c57600080fd5b8286015b84811015614cdd5780356001600160401b03811115614daf5760008081fd5b614dbd8986838b0101614c74565b845250918301918301614d90565b60006101808284031215614dde57600080fd5b614de6614a29565b905081356001600160401b0380821115614dff57600080fd5b614e0b85838601614c74565b83526020840135915080821115614e2157600080fd5b614e2d85838601614ce8565b60208401526040840135915080821115614e4657600080fd5b614e5285838601614ce8565b6040840152614e648560608601614afc565b6060840152614e768560e08601614a7c565b6080840152610120840135915080821115614e9057600080fd5b614e9c85838601614c74565b60a0840152610140840135915080821115614eb657600080fd5b614ec285838601614c74565b60c0840152610160840135915080821115614edc57600080fd5b50614ee984828501614d4c565b60e08301525092915050565b600080600080600060808688031215614f0d57600080fd5b8535945060208601356001600160401b0380821115614f2b57600080fd5b818801915088601f830112614f3f57600080fd5b813581811115614f4e57600080fd5b896020828501011115614f6057600080fd5b6020830196509450614f7460408901614c46565b93506060880135915080821115614f8a57600080fd5b50614f9788828901614dcb565b9150509295509295909350565b600081518084526020808501945080840160005b83811015614fdd5781516001600160601b031687529582019590820190600101614fb8565b509495945050505050565b60408152600083516040808401526150036080840182614fa4565b90506020850151603f198483030160608501526150208282614fa4565b925050508260208301529392505050565b600080600080600060a0868803121561504957600080fd5b8535615054816149a0565b94506020868101359450604087013561506c816149a0565b935060608701356001600160401b0381111561508757600080fd5b8701601f8101891361509857600080fd5b80356150a6614c9582614c51565b81815260059190911b8201830190838101908b8311156150c557600080fd5b928401925b828410156150ec5783356150dd816149a0565b825292840192908401906150ca565b809650505050505061510060808701614bb1565b90509295509295909350565b6000806040838503121561511f57600080fd5b82356001600160401b038082111561513657600080fd5b908401906080828703121561514a57600080fd5b9092506020840135908082111561516057600080fd5b5061516d85828601614dcb565b9150509250929050565b60005b8381101561519257818101518382015260200161517a565b838111156142d35750506000910152565b600081518084526151bb816020860160208601615177565b601f01601f19169290920160200192915050565b602081526000613df560208301846151a3565b60006001600160401b038211156151fb576151fb6149eb565b50601f01601f191660200190565b6000615217614c95846151e2565b905082815283838301111561522b57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261525357600080fd5b613df583833560208501615209565b6000806040838503121561527557600080fd5b8235615280816149a0565b915060208301356001600160401b038082111561529c57600080fd5b90840190606082870312156152b057600080fd5b6040516060810181811083821117156152cb576152cb6149eb565b6040528235828111156152dd57600080fd5b6152e988828601615242565b82525060208301356020820152604083013560408201528093505050509250929050565b60008083601f84011261531f57600080fd5b5081356001600160401b0381111561533657600080fd5b6020830191508360208260051b850101111561535157600080fd5b9250929050565b6000806020838503121561536b57600080fd5b82356001600160401b0381111561538157600080fd5b61538d8582860161530d565b90969095509350505050565b6000602082840312156153ab57600080fd5b81356001600160401b038111156153c157600080fd5b8201601f810184136153d257600080fd5b61472884823560208401615209565b6000602082840312156153f357600080fd5b8135613df581614c34565b60006020828403121561541057600080fd5b8151613df581614c09565b60006020828403121561542d57600080fd5b8151613df5816149a0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000602082840312156154dc57600080fd5b8151613df581614974565b634e487b7160e01b600052603260045260246000fd5b60008261551a57634e487b7160e01b600052601260045260246000fd5b500690565b60006060828403121561553157600080fd5b604051606081018181106001600160401b0382111715615553576155536149eb565b604052825161556181614c34565b8152602083015161557181614c34565b6020820152604083015161558481614974565b60408201529392505050565b6000602082840312156155a257600080fd5b5051919050565b6000602082840312156155bb57600080fd5b81516001600160c01b0381168114613df557600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156155fb576155fb6155d2565b500190565b6000600019821415615614576156146155d2565b5060010190565b6001600160601b038116811461094057600080fd5b60006040828403121561564257600080fd5b61564a614a01565b8251615655816149a0565b815260208301516156658161561b565b60208201529392505050565b600082821015615683576156836155d2565b500390565b60006020828403121561569a57600080fd5b815167ffffffffffffffff1981168114613df557600080fd5b6000602082840312156156c557600080fd5b8151613df58161561b565b60006001600160601b03838116908316818110156156f0576156f06155d2565b039392505050565b63ffffffff60e01b8360e01b1681526000600482018351602080860160005b8381101561573357815185529382019390820190600101615717565b5092979650505050505050565b600063ffffffff80831681851680830382111561575f5761575f6155d2565b01949350505050565b6000808335601e1984360301811261577f57600080fd5b8301803591506001600160401b0382111561579957600080fd5b60200191503681900382131561535157600080fd5b6000608082360312156157c057600080fd5b604051608081016001600160401b0382821081831117156157e3576157e36149eb565b816040528435835260208501359150808211156157ff57600080fd5b61580b36838701615242565b6020840152604085013591508082111561582457600080fd5b5061583136828601615242565b604083015250606083013561584581614c34565b606082015292915050565b60006001600160601b0380831681851681830481118215151615615876576158766155d2565b02949350505050565b6000816000190483118215151615615899576158996155d2565b500290565b6000602082840312156158b057600080fd5b81516001600160401b038111156158c657600080fd5b8201601f810184136158d757600080fd5b80516158e5614c95826151e2565b8181528560208385010111156158fa57600080fd5b61590b826020830160208601615177565b95945050505050565b60208082526052908201527f536572766963654d616e61676572426173652e6f6e6c7952656769737472794360408201527f6f6f7264696e61746f723a2063616c6c6572206973206e6f742074686520726560608201527133b4b9ba393c9031b7b7b93234b730ba37b960711b608082015260a00190565b60018060a01b03831681526040602082015260008251606060408401526159b660a08401826151a3565b90506020840151606084015260408401516080840152809150509392505050565b6000823560be198336030181126159ed57600080fd5b9190910192915050565b6000808335601e19843603018112615a0e57600080fd5b8301803591506001600160401b03821115615a2857600080fd5b6020019150600681901b360382131561535157600080fd5b6000808335601e19843603018112615a5757600080fd5b83016020810192503590506001600160401b03811115615a7657600080fd5b8060061b360383131561535157600080fd5b8183526000602080850194508260005b85811015614fdd578135615aab816149a0565b6001600160a01b0316875281830135615ac38161561b565b6001600160601b0316878401526040968701969190910190600101615a98565b6000808335601e19843603018112615afa57600080fd5b83016020810192503590506001600160401b03811115615b1957600080fd5b80360383131561535157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03848116825260406020808401829052838201859052600092606091828601600588901b8701840189875b8a811015615c9c57898303605f190184528135368d900360be19018112615ba957600080fd5b8c0160c0615bb78280615a40565b828752615bc78388018284615a88565b9250505086820135615bd8816149a0565b881685880152615bea828b0183615a40565b8683038c88015280835290916000919089015b81831015615c2e578335615c10816149a0565b8b168152838a01358a820152928c0192600192909201918c01615bfd565b615c398c8601614c46565b63ffffffff168c89015260809350615c52858501614c46565b63ffffffff811689860152925060a09350615c6f84860186615ae3565b9550925087810384890152615c85818685615b28565b988a01989750505093870193505050600101615b83565b50909b9a5050505050505050505050565b60008235609e198336030181126159ed57600080fd5b60208082528181018390526000906040808401600586901b850182018785805b89811015615d9557888403603f190185528235368c9003609e19018112615d08578283fd5b8b0160a0615d168280615a40565b828852615d268389018284615a88565b9250505088820135615d37816149a0565b6001600160a01b0316868a01528188013588870152606080830135615d5b81614c34565b63ffffffff808216838a015260809250828501359450615d7a85614c34565b93909316960195909552509386019391860191600101615ce3565b50919998505050505050505050565b600061ffff80831681811415615dbc57615dbc6155d2565b6001019392505050565b60208152813560208201526000615de06020840184615ae3565b60806040850152615df560a085018284615b28565b915050615e056040850185615ae3565b848303601f19016060860152615e1c838284615b28565b925050506060840135615e2e81614c34565b63ffffffff166080939093019290925250919050565b600082516159ed81846020870161517756fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47424c535369676e6174757265436865636b65722e636865636b5369676e617475a26469706673582212200df413fec9ba74b81ab71c2494ec203a3659ba1c6ed67059072b90913653a8b764736f6c634300080c0033", } // ContractEigenDAServiceManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/EigenDAThresholdRegistry/binding.go b/contracts/bindings/EigenDAThresholdRegistry/binding.go index c24575e42d..f3639535cb 100644 --- a/contracts/bindings/EigenDAThresholdRegistry/binding.go +++ b/contracts/bindings/EigenDAThresholdRegistry/binding.go @@ -45,7 +45,7 @@ type VersionedBlobParams struct { // ContractEigenDAThresholdRegistryMetaData contains all meta data concerning the ContractEigenDAThresholdRegistry contract. var ContractEigenDAThresholdRegistryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addVersionedBlobParams\",\"inputs\":[{\"name\":\"_versionedBlobParams\",\"type\":\"tuple\",\"internalType\":\"structVersionedBlobParams\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBlobParams\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structVersionedBlobParams\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getIsQuorumRequired\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQuorumAdversaryThresholdPercentage\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"adversaryThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQuorumConfirmationThresholdPercentage\",\"inputs\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"confirmationThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_quorumAdversaryThresholdPercentages\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_quorumConfirmationThresholdPercentages\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_quorumNumbersRequired\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_versionedBlobParams\",\"type\":\"tuple[]\",\"internalType\":\"structVersionedBlobParams[]\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nextBlobVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumAdversaryThresholdPercentages\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumConfirmationThresholdPercentages\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quorumNumbersRequired\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"versionedBlobParams\",\"inputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DefaultSecurityThresholdsV2Updated\",\"inputs\":[{\"name\":\"previousDefaultSecurityThresholdsV2\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"newDefaultSecurityThresholdsV2\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structSecurityThresholds\",\"components\":[{\"name\":\"confirmationThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumAdversaryThresholdPercentagesUpdated\",\"inputs\":[{\"name\":\"previousQuorumAdversaryThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumAdversaryThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumConfirmationThresholdPercentagesUpdated\",\"inputs\":[{\"name\":\"previousQuorumConfirmationThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumConfirmationThresholdPercentages\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuorumNumbersRequiredUpdated\",\"inputs\":[{\"name\":\"previousQuorumNumbersRequired\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"newQuorumNumbersRequired\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VersionedBlobParamsAdded\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint16\",\"indexed\":true,\"internalType\":\"uint16\"},{\"name\":\"versionedBlobParams\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structVersionedBlobParams\",\"components\":[{\"name\":\"maxNumOperators\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numChunks\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"codingRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"anonymous\":false}]", - Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100de565b603254610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60325460ff90811610156100dc576032805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f1e806100ed6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80638a4769821161008c578063e15234ff11610066578063e15234ff14610265578063ee6c3bcf1461026d578063f2fde38b14610280578063f74e363c1461029357600080fd5b80638a4769821461022f5780638da5cb5b14610242578063bafa91071461025d57600080fd5b806332430f14116100c857806332430f14146101dc578063715018a6146101fd5780638491bad6146102075780638687feae1461021a57600080fd5b8063048886d2146100ef5780631429c7c2146101175780632ecfe72b1461013c575b600080fd5b6101026100fd366004610af5565b6102f8565b60405190151581526020015b60405180910390f35b61012a610125366004610af5565b6103a2565b60405160ff909116815260200161010e565b6101ac61014a366004610b17565b60408051606080820183526000808352602080840182905292840181905261ffff9490941684526004825292829020825193840183525463ffffffff808216855264010000000082041691840191909152600160401b900460ff169082015290565b60408051825163ffffffff9081168252602080850151909116908201529181015160ff169082015260600161010e565b6003546101ea9061ffff1681565b60405161ffff909116815260200161010e565b610205610410565b005b610205610215366004610c8c565b610424565b6102226105bc565b60405161010e9190610db8565b6101ea61023d366004610e0d565b61064a565b6065546040516001600160a01b03909116815260200161010e565b610222610663565b610222610670565b61012a61027b366004610af5565b61067d565b61020561028e366004610e29565b6106a9565b6102d26102a1366004610b17565b60046020526000908152604090205463ffffffff80821691640100000000810490911690600160401b900460ff1683565b6040805163ffffffff948516815293909216602084015260ff169082015260600161010e565b600080600160ff84161b9050806103986002805461031590610e44565b80601f016020809104026020016040519081016040528092919081815260200182805461034190610e44565b801561038e5780601f106103635761010080835404028352916020019161038e565b820191906000526020600020905b81548152906001019060200180831161037157829003601f168201915b5050505050610722565b9091161492915050565b60008160ff16600180546103b590610e44565b9050111561040b5760018260ff1681546103ce90610e44565b81106103dc576103dc610e7f565b8154600116156103fb5790600052602060002090602091828204019190065b9054901a600160f81b0260f81c90505b919050565b6104186108af565b6104226000610909565b565b603254610100900460ff16158080156104445750603254600160ff909116105b8061045e5750303b15801561045e575060325460ff166001145b6104c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6032805460ff1916600117905580156104e9576032805461ff0019166101001790555b6104f286610909565b8451610505906000906020880190610a4b565b508351610519906001906020870190610a4b565b50825161052d906002906020860190610a4b565b5060005b825181101561056d5761055c83828151811061054f5761054f610e7f565b602002602001015161095b565b5061056681610eab565b9050610531565b5080156105b4576032805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b600080546105c990610e44565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590610e44565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b505050505081565b60006106546108af565b61065d8261095b565b92915050565b600180546105c990610e44565b600280546105c990610e44565b60008160ff166000805461069090610e44565b9050111561040b5760008260ff1681546103ce90610e44565b6106b16108af565b6001600160a01b0381166107165760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104bd565b61071f81610909565b50565b6000610100825111156107ab5760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a4016104bd565b81516107b957506000919050565b600080836000815181106107cf576107cf610e7f565b0160200151600160f89190911c81901b92505b84518110156108a6578481815181106107fd576107fd610e7f565b0160200151600160f89190911c1b91508282116108925760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a4016104bd565b9181179161089f81610eab565b90506107e2565b50909392505050565b6065546001600160a01b031633146104225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bd565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6003805461ffff90811660009081526004602090815260408083208651815488850180518a8601805163ffffffff95861667ffffffffffffffff199095168517640100000000938716939093029290921768ff00000000000000001916600160401b60ff9384160217909555985485519283529051909216948101949094529051909516908201529092909116907fdbee9d337a6e5fde30966e157673aaeeb6a0134afaf774a4b6979b7c79d07da49060600160405180910390a26003805461ffff16906000610a2a83610ec6565b91906101000a81548161ffff021916908361ffff1602179055509050919050565b828054610a5790610e44565b90600052602060002090601f016020900481019282610a795760008555610abf565b82601f10610a9257805160ff1916838001178555610abf565b82800160010185558215610abf579182015b82811115610abf578251825591602001919060010190610aa4565b50610acb929150610acf565b5090565b5b80821115610acb5760008155600101610ad0565b803560ff8116811461040b57600080fd5b600060208284031215610b0757600080fd5b610b1082610ae4565b9392505050565b600060208284031215610b2957600080fd5b813561ffff81168114610b1057600080fd5b80356001600160a01b038116811461040b57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610b9157610b91610b52565b604052919050565b600082601f830112610baa57600080fd5b813567ffffffffffffffff811115610bc457610bc4610b52565b610bd7601f8201601f1916602001610b68565b818152846020838601011115610bec57600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff8116811461040b57600080fd5b600060608284031215610c2f57600080fd5b6040516060810181811067ffffffffffffffff82111715610c5257610c52610b52565b604052905080610c6183610c09565b8152610c6f60208401610c09565b6020820152610c8060408401610ae4565b60408201525092915050565b600080600080600060a08688031215610ca457600080fd5b610cad86610b3b565b945060208087013567ffffffffffffffff80821115610ccb57600080fd5b610cd78a838b01610b99565b96506040890135915080821115610ced57600080fd5b610cf98a838b01610b99565b9550606091508189013581811115610d1057600080fd5b610d1c8b828c01610b99565b955050608089013581811115610d3157600080fd5b8901601f81018b13610d4257600080fd5b803582811115610d5457610d54610b52565b610d62858260051b01610b68565b818152858101935090840282018501908c821115610d7f57600080fd5b918501915b81831015610da557610d968d84610c1d565b84529285019291840191610d84565b8096505050505050509295509295909350565b600060208083528351808285015260005b81811015610de557858101830151858201604001528201610dc9565b81811115610df7576000604083870101525b50601f01601f1916929092016040019392505050565b600060608284031215610e1f57600080fd5b610b108383610c1d565b600060208284031215610e3b57600080fd5b610b1082610b3b565b600181811c90821680610e5857607f821691505b60208210811415610e7957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415610ebf57610ebf610e95565b5060010190565b600061ffff80831681811415610ede57610ede610e95565b600101939250505056fea2646970667358221220b52aa0006b7427f5b33eb122f730e88da493f98e0682e87bc55373538b02bbbb64736f6c634300080c0033", + Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100de565b603254610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60325460ff90811610156100dc576032805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f1e806100ed6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80638a4769821161008c578063e15234ff11610066578063e15234ff14610265578063ee6c3bcf1461026d578063f2fde38b14610280578063f74e363c1461029357600080fd5b80638a4769821461022f5780638da5cb5b14610242578063bafa91071461025d57600080fd5b806332430f14116100c857806332430f14146101dc578063715018a6146101fd5780638491bad6146102075780638687feae1461021a57600080fd5b8063048886d2146100ef5780631429c7c2146101175780632ecfe72b1461013c575b600080fd5b6101026100fd366004610af5565b6102f8565b60405190151581526020015b60405180910390f35b61012a610125366004610af5565b6103a2565b60405160ff909116815260200161010e565b6101ac61014a366004610b17565b60408051606080820183526000808352602080840182905292840181905261ffff9490941684526004825292829020825193840183525463ffffffff808216855264010000000082041691840191909152600160401b900460ff169082015290565b60408051825163ffffffff9081168252602080850151909116908201529181015160ff169082015260600161010e565b6003546101ea9061ffff1681565b60405161ffff909116815260200161010e565b610205610410565b005b610205610215366004610c8c565b610424565b6102226105bc565b60405161010e9190610db8565b6101ea61023d366004610e0d565b61064a565b6065546040516001600160a01b03909116815260200161010e565b610222610663565b610222610670565b61012a61027b366004610af5565b61067d565b61020561028e366004610e29565b6106a9565b6102d26102a1366004610b17565b60046020526000908152604090205463ffffffff80821691640100000000810490911690600160401b900460ff1683565b6040805163ffffffff948516815293909216602084015260ff169082015260600161010e565b600080600160ff84161b9050806103986002805461031590610e44565b80601f016020809104026020016040519081016040528092919081815260200182805461034190610e44565b801561038e5780601f106103635761010080835404028352916020019161038e565b820191906000526020600020905b81548152906001019060200180831161037157829003601f168201915b5050505050610722565b9091161492915050565b60008160ff16600180546103b590610e44565b9050111561040b5760018260ff1681546103ce90610e44565b81106103dc576103dc610e7f565b8154600116156103fb5790600052602060002090602091828204019190065b9054901a600160f81b0260f81c90505b919050565b6104186108af565b6104226000610909565b565b603254610100900460ff16158080156104445750603254600160ff909116105b8061045e5750303b15801561045e575060325460ff166001145b6104c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6032805460ff1916600117905580156104e9576032805461ff0019166101001790555b6104f286610909565b8451610505906000906020880190610a4b565b508351610519906001906020870190610a4b565b50825161052d906002906020860190610a4b565b5060005b825181101561056d5761055c83828151811061054f5761054f610e7f565b602002602001015161095b565b5061056681610eab565b9050610531565b5080156105b4576032805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b600080546105c990610e44565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590610e44565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b505050505081565b60006106546108af565b61065d8261095b565b92915050565b600180546105c990610e44565b600280546105c990610e44565b60008160ff166000805461069090610e44565b9050111561040b5760008260ff1681546103ce90610e44565b6106b16108af565b6001600160a01b0381166107165760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104bd565b61071f81610909565b50565b6000610100825111156107ab5760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a4016104bd565b81516107b957506000919050565b600080836000815181106107cf576107cf610e7f565b0160200151600160f89190911c81901b92505b84518110156108a6578481815181106107fd576107fd610e7f565b0160200151600160f89190911c1b91508282116108925760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a4016104bd565b9181179161089f81610eab565b90506107e2565b50909392505050565b6065546001600160a01b031633146104225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bd565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6003805461ffff90811660009081526004602090815260408083208651815488850180518a8601805163ffffffff95861667ffffffffffffffff199095168517640100000000938716939093029290921768ff00000000000000001916600160401b60ff9384160217909555985485519283529051909216948101949094529051909516908201529092909116907fdbee9d337a6e5fde30966e157673aaeeb6a0134afaf774a4b6979b7c79d07da49060600160405180910390a26003805461ffff16906000610a2a83610ec6565b91906101000a81548161ffff021916908361ffff1602179055509050919050565b828054610a5790610e44565b90600052602060002090601f016020900481019282610a795760008555610abf565b82601f10610a9257805160ff1916838001178555610abf565b82800160010185558215610abf579182015b82811115610abf578251825591602001919060010190610aa4565b50610acb929150610acf565b5090565b5b80821115610acb5760008155600101610ad0565b803560ff8116811461040b57600080fd5b600060208284031215610b0757600080fd5b610b1082610ae4565b9392505050565b600060208284031215610b2957600080fd5b813561ffff81168114610b1057600080fd5b80356001600160a01b038116811461040b57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610b9157610b91610b52565b604052919050565b600082601f830112610baa57600080fd5b813567ffffffffffffffff811115610bc457610bc4610b52565b610bd7601f8201601f1916602001610b68565b818152846020838601011115610bec57600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff8116811461040b57600080fd5b600060608284031215610c2f57600080fd5b6040516060810181811067ffffffffffffffff82111715610c5257610c52610b52565b604052905080610c6183610c09565b8152610c6f60208401610c09565b6020820152610c8060408401610ae4565b60408201525092915050565b600080600080600060a08688031215610ca457600080fd5b610cad86610b3b565b945060208087013567ffffffffffffffff80821115610ccb57600080fd5b610cd78a838b01610b99565b96506040890135915080821115610ced57600080fd5b610cf98a838b01610b99565b9550606091508189013581811115610d1057600080fd5b610d1c8b828c01610b99565b955050608089013581811115610d3157600080fd5b8901601f81018b13610d4257600080fd5b803582811115610d5457610d54610b52565b610d62858260051b01610b68565b818152858101935090840282018501908c821115610d7f57600080fd5b918501915b81831015610da557610d968d84610c1d565b84529285019291840191610d84565b8096505050505050509295509295909350565b600060208083528351808285015260005b81811015610de557858101830151858201604001528201610dc9565b81811115610df7576000604083870101525b50601f01601f1916929092016040019392505050565b600060608284031215610e1f57600080fd5b610b108383610c1d565b600060208284031215610e3b57600080fd5b610b1082610b3b565b600181811c90821680610e5857607f821691505b60208210811415610e7957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415610ebf57610ebf610e95565b5060010190565b600061ffff80831681811415610ede57610ede610e95565b600101939250505056fea264697066735822122046a5d6fa11c7f6f1c94623998fd004c3b777c4ab5add6147f6ceccf32425ae1764736f6c634300080c0033", } // ContractEigenDAThresholdRegistryABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/MockRollup/binding.go b/contracts/bindings/MockRollup/binding.go index 9c62865a21..303533ff7a 100644 --- a/contracts/bindings/MockRollup/binding.go +++ b/contracts/bindings/MockRollup/binding.go @@ -83,7 +83,7 @@ type QuorumBlobParam struct { // ContractMockRollupMetaData contains all meta data concerning the ContractMockRollup contract. var ContractMockRollupMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_eigenDAServiceManager\",\"type\":\"address\",\"internalType\":\"contractIEigenDAServiceManager\"},{\"name\":\"_tau\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengeCommitment\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"point\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"challengeValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"commitments\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"confirmer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"dataLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"polynomialCommitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenDAServiceManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenDAServiceManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"postCommitment\",\"inputs\":[{\"name\":\"blobHeader\",\"type\":\"tuple\",\"internalType\":\"structBlobHeader\",\"components\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"dataLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"quorumBlobParams\",\"type\":\"tuple[]\",\"internalType\":\"structQuorumBlobParam[]\",\"components\":[{\"name\":\"quorumNumber\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"adversaryThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"confirmationThresholdPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"chunkLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]},{\"name\":\"blobVerificationProof\",\"type\":\"tuple\",\"internalType\":\"structBlobVerificationProof\",\"components\":[{\"name\":\"batchId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"batchMetadata\",\"type\":\"tuple\",\"internalType\":\"structBatchMetadata\",\"components\":[{\"name\":\"batchHeader\",\"type\":\"tuple\",\"internalType\":\"structBatchHeader\",\"components\":[{\"name\":\"blobHeadersRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signedStakeForQuorums\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"signatoryRecordHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"confirmationBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"inclusionProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"quorumIndices\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tau\",\"inputs\":[],\"outputs\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"}]", - Bin: "0x60806040523480156200001157600080fd5b5060405162001e4938038062001e49833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039390931692909217909155805160015560200151600255620000f9565b60008082840360608112156200007c57600080fd5b83516001600160a01b03811681146200009457600080fd5b92506040601f1982011215620000a957600080fd5b50604080519081016001600160401b0381118282101715620000db57634e487b7160e01b600052604160045260246000fd5b60409081526020858101518352940151938101939093525092909150565b611d4080620001096000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806349ce89971461005c578063b5144c73146100cf578063cfc4af55146100e4578063d2d16eb214610107578063fc30cad01461012a575b600080fd5b6100b761006a3660046114cb565b6003602090815260009182526040918290208054835180850190945260018201548452600290910154918301919091526001600160a01b03811691600160a01b90910463ffffffff169083565b6040516100c6939291906114e4565b60405180910390f35b6100e26100dd36600461181b565b610155565b005b6001546002546100f2919082565b604080519283526020830191909152016100c6565b61011a6101153660046119f8565b6101e8565b60405190151581526020016100c6565b60005461013d906001600160a01b031681565b6040516001600160a01b0390911681526020016100c6565b60005461016d9083906001600160a01b031683610375565b506040805160608101825233815260208381015163ffffffff90811682840190815294518385019081524260009081526003845294909420925183549551909116600160a01b026001600160c01b03199095166001600160a01b03919091161793909317815590518051600183015590910151600290910155565b6000848152600360209081526040808320815160608101835281546001600160a01b038082168352600160a01b90910463ffffffff16828601528351808501855260018401548152600290930154948301949094529182015280519091166102b55760405162461bcd60e51b815260206004820152603560248201527f4d6f636b526f6c6c75702e6368616c6c656e6765436f6d6d69746d656e743a2060448201527410dbdb5b5a5d1b595b9d081b9bdd081c1bdcdd1959605a1b60648201526084015b60405180910390fd5b806020015163ffffffff1685106103405760405162461bcd60e51b815260206004820152604360248201527f4d6f636b526f6c6c75702e6368616c6c656e6765436f6d6d69746d656e743a2060448201527f506f696e74206d757374206265206c657373207468616e2064617461206c656e6064820152620cee8d60eb1b608482015260a4016102ac565b604080518082018252600154815260025460208201529082015161036991879186919088610a35565b9150505b949350505050565b805160405163eccbbfc960e01b815263ffffffff90911660048201526001600160a01b0383169063eccbbfc990602401602060405180830381865afa1580156103c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e69190611a66565b6103f38260400151610ab2565b1461047a5760405162461bcd60e51b815260206004820152604b60248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a206260448201527f617463684d6574616461746120646f6573206e6f74206d617463682073746f7260648201526a6564206d6574616461746160a81b608482015260a4016102ac565b6060810151604082015151516104cc919061049486610b29565b6040516020016104a691815260200190565b60405160208183030381529060405280519060200120846020015163ffffffff16610b59565b61053e5760405162461bcd60e51b815260206004820152603960248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a206960448201527f6e636c7573696f6e2070726f6f6620697320696e76616c69640000000000000060648201526084016102ac565b6000805b84604001515181101561091e578460400151818151811061056557610565611a7f565b60200260200101516000015160ff16836040015160000151602001518460800151838151811061059757610597611a7f565b0160200151815160f89190911c9081106105b3576105b3611a7f565b016020015160f81c1461062e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a207160448201527f756f72756d4e756d62657220646f6573206e6f74206d6174636800000000000060648201526084016102ac565b8460400151818151811061064457610644611a7f565b60200260200101516040015160ff168560400151828151811061066957610669611a7f565b60200260200101516020015160ff16106106fc5760405162461bcd60e51b815260206004820152604860248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a206160448201527f64766572736172795468726573686f6c6450657263656e74616765206973206e6064820152671bdd081d985b1a5960c21b608482015260a4016102ac565b600061072c858760400151848151811061071857610718611a7f565b60200260200101516000015160ff16610b71565b905060ff8116156107e3578060ff168660400151838151811061075157610751611a7f565b60200260200101516020015160ff1610156107e35760405162461bcd60e51b815260206004820152604660248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a206160448201527f64766572736172795468726573686f6c6450657263656e74616765206973206e6064820152651bdd081b595d60d21b608482015260a4016102ac565b856040015182815181106107f9576107f9611a7f565b60200260200101516040015160ff16846040015160000151604001518560800151848151811061082b5761082b611a7f565b0160200151815160f89190911c90811061084757610847611a7f565b016020015160f81c10156108d55760405162461bcd60e51b815260206004820152604960248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a206360448201527f6f6e6669726d6174696f6e5468726573686f6c6450657263656e7461676520696064820152681cc81b9bdd081b595d60ba1b608482015260a4016102ac565b61090883876040015184815181106108ef576108ef611a7f565b602002602001015160000151600160ff919091161b1790565b925050808061091690611aab565b915050610542565b50610997610990846001600160a01b031663e15234ff6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610963573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261098b9190810190611af2565b610c68565b8281161490565b610a2f5760405162461bcd60e51b815260206004820152605960248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a207260448201527f657175697265642071756f72756d7320617265206e6f7420612073756273657460648201527f206f662074686520636f6e6669726d65642071756f72756d7300000000000000608482015260a4016102ac565b50505050565b600080610a6c610a67604080518082018252600080825260209182015281518083019092526001825260029082015290565b610df5565b9050610aa7610a85610a7e838a610eb4565b8790610f4b565b84610a9a610a93858b610eb4565b8890610f4b565b610aa2610fdf565b61109f565b979650505050505050565b6000610b238260000151604051602001610acc9190611b95565b60408051808303601f1901815282825280516020918201208682015187840151838601929092528484015260e01b6001600160e01b0319166060840152815160448185030181526064909301909152815191012090565b92915050565b600081604051602001610b3c9190611bf5565b604051602081830303815290604052805190602001209050919050565b600083610b6786858561130c565b1495945050505050565b600081836001600160a01b0316638687feae6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610bb2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bda9190810190611af2565b511115610b2357826001600160a01b0316638687feae6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c1f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c479190810190611af2565b8281518110610c5857610c58611a7f565b016020015160f81c905092915050565b600061010082511115610cf15760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a4016102ac565b8151610cff57506000919050565b60008083600081518110610d1557610d15611a7f565b0160200151600160f89190911c81901b92505b8451811015610dec57848181518110610d4357610d43611a7f565b0160200151600160f89190911c1b9150828211610dd85760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a4016102ac565b91811791610de581611aab565b9050610d28565b50909392505050565b60408051808201909152600080825260208201528151158015610e1a57506020820151155b15610e38575050604080518082019091526000808252602082015290565b6040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478460200151610e7d9190611c9a565b610ea7907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47611cbc565b905292915050565b919050565b6040805180820190915260008082526020820152610ed061140f565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa9050808015610f0357610f05565bfe5b5080610f435760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b60448201526064016102ac565b505092915050565b6040805180820190915260008082526020820152610f6761142d565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa9050808015610f03575080610f435760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b60448201526064016102ac565b610fe761144b565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528581526020808201859052825180840190935285835282018390526000916110ce611470565b60005b60028110156112935760006110e7826006611cd3565b90508482600281106110fb576110fb611a7f565b6020020151518361110d836000611cf2565b600c811061111d5761111d611a7f565b602002015284826002811061113457611134611a7f565b6020020151602001518382600161114b9190611cf2565b600c811061115b5761115b611a7f565b602002015283826002811061117257611172611a7f565b6020020151515183611185836002611cf2565b600c811061119557611195611a7f565b60200201528382600281106111ac576111ac611a7f565b60200201515160016020020151836111c5836003611cf2565b600c81106111d5576111d5611a7f565b60200201528382600281106111ec576111ec611a7f565b60200201516020015160006002811061120757611207611a7f565b602002015183611218836004611cf2565b600c811061122857611228611a7f565b602002015283826002811061123f5761123f611a7f565b60200201516020015160016002811061125a5761125a611a7f565b60200201518361126b836005611cf2565b600c811061127b5761127b611a7f565b6020020152508061128b81611aab565b9150506110d1565b5061129c61148f565b60006020826101808560086107d05a03fa9050808015610f035750806112fc5760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b60448201526064016102ac565b5051151598975050505050505050565b60006020845161131c9190611c9a565b156113a35760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016102ac565b8260205b85518111611406576113ba600285611c9a565b6113db578160005280860151602052604060002091506002840493506113f4565b8086015160005281602052604060002091506002840493505b6113ff602082611cf2565b90506113a7565b50949350505050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806040016040528061145e6114ad565b815260200161146b6114ad565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b6000602082840312156114dd57600080fd5b5035919050565b6001600160a01b038416815263ffffffff831660208201526080810161036d604083018480518252602090810151910152565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561155057611550611517565b60405290565b6040516080810167ffffffffffffffff8111828210171561155057611550611517565b60405160a0810167ffffffffffffffff8111828210171561155057611550611517565b6040805190810167ffffffffffffffff8111828210171561155057611550611517565b604051601f8201601f1916810167ffffffffffffffff811182821017156115e8576115e8611517565b604052919050565b803563ffffffff81168114610eaf57600080fd5b803560ff81168114610eaf57600080fd5b600067ffffffffffffffff82111561162f5761162f611517565b50601f01601f191660200190565b600082601f83011261164e57600080fd5b813561166161165c82611615565b6115bf565b81815284602083860101111561167657600080fd5b816020850160208301376000918101602001919091529392505050565b6000606082840312156116a557600080fd5b6116ad61152d565b9050813567ffffffffffffffff808211156116c757600080fd5b90830190608082860312156116db57600080fd5b6116e3611556565b823581526020830135828111156116f957600080fd5b6117058782860161163d565b60208301525060408301358281111561171d57600080fd5b6117298782860161163d565b60408301525061173b606084016115f0565b6060820152835250506020828101359082015261175a604083016115f0565b604082015292915050565b600060a0828403121561177757600080fd5b61177f611579565b905061178a826115f0565b8152611798602083016115f0565b6020820152604082013567ffffffffffffffff808211156117b857600080fd5b6117c485838601611693565b604084015260608401359150808211156117dd57600080fd5b6117e98583860161163d565b6060840152608084013591508082111561180257600080fd5b5061180f8482850161163d565b60808301525092915050565b600080604080848603121561182f57600080fd5b833567ffffffffffffffff8082111561184757600080fd5b9085019081870360808082121561185d57600080fd5b61186561152d565b8583121561187257600080fd5b61187a61159c565b925084358352602080860135818501528382526118988787016115f0565b818301526060935083860135858111156118b157600080fd5b8087019650508a601f8701126118c657600080fd5b8535858111156118d8576118d8611517565b6118e6828260051b016115bf565b81815260079190911b8701820190828101908d83111561190557600080fd5b978301975b828910156119715785898f0312156119225760008081fd5b61192a611556565b6119338a611604565b8152611940858b01611604565b8582015261194f8b8b01611604565b8b82015261195e888b016115f0565b818901528252978501979083019061190a565b9884019890985250909750880135945050508083111561199057600080fd5b505061199e85828601611765565b9150509250929050565b600082601f8301126119b957600080fd5b6119c161159c565b8060408401858111156119d357600080fd5b845b818110156119ed5780358452602093840193016119d5565b509095945050505050565b60008060008084860360e0811215611a0f57600080fd5b85359450602086013593506080603f1982011215611a2c57600080fd5b50611a3561159c565b611a4287604088016119a8565b8152611a5187608088016119a8565b60208201529396929550929360c00135925050565b600060208284031215611a7857600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611abf57611abf611a95565b5060010190565b60005b83811015611ae1578181015183820152602001611ac9565b83811115610a2f5750506000910152565b600060208284031215611b0457600080fd5b815167ffffffffffffffff811115611b1b57600080fd5b8201601f81018413611b2c57600080fd5b8051611b3a61165c82611615565b818152856020838501011115611b4f57600080fd5b611b60826020830160208601611ac6565b95945050505050565b60008151808452611b81816020860160208601611ac6565b601f01601f19169290920160200192915050565b60208152815160208201526000602083015160806040840152611bbb60a0840182611b69565b90506040840151601f19848303016060850152611bd88282611b69565b91505063ffffffff60608501511660808401528091505092915050565b60208082528251805183830152810151604083015260009060a0830181850151606063ffffffff808316828801526040925082880151608080818a015285825180885260c08b0191508884019750600093505b80841015611c8b578751805160ff90811684528a82015181168b850152888201511688840152860151851686830152968801966001939093019290820190611c48565b509a9950505050505050505050565b600082611cb757634e487b7160e01b600052601260045260246000fd5b500690565b600082821015611cce57611cce611a95565b500390565b6000816000190483118215151615611ced57611ced611a95565b500290565b60008219821115611d0557611d05611a95565b50019056fea264697066735822122069db0a018ff1712435b41d50f74f90dbef4995fea1a1a9061a4360c8e3321c2864736f6c634300080c0033", + Bin: "0x60806040523480156200001157600080fd5b5060405162001e4938038062001e49833981016040819052620000349162000067565b600080546001600160a01b0319166001600160a01b039390931692909217909155805160015560200151600255620000f9565b60008082840360608112156200007c57600080fd5b83516001600160a01b03811681146200009457600080fd5b92506040601f1982011215620000a957600080fd5b50604080519081016001600160401b0381118282101715620000db57634e487b7160e01b600052604160045260246000fd5b60409081526020858101518352940151938101939093525092909150565b611d4080620001096000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806349ce89971461005c578063b5144c73146100cf578063cfc4af55146100e4578063d2d16eb214610107578063fc30cad01461012a575b600080fd5b6100b761006a3660046114cb565b6003602090815260009182526040918290208054835180850190945260018201548452600290910154918301919091526001600160a01b03811691600160a01b90910463ffffffff169083565b6040516100c6939291906114e4565b60405180910390f35b6100e26100dd36600461181b565b610155565b005b6001546002546100f2919082565b604080519283526020830191909152016100c6565b61011a6101153660046119f8565b6101e8565b60405190151581526020016100c6565b60005461013d906001600160a01b031681565b6040516001600160a01b0390911681526020016100c6565b60005461016d9083906001600160a01b031683610375565b506040805160608101825233815260208381015163ffffffff90811682840190815294518385019081524260009081526003845294909420925183549551909116600160a01b026001600160c01b03199095166001600160a01b03919091161793909317815590518051600183015590910151600290910155565b6000848152600360209081526040808320815160608101835281546001600160a01b038082168352600160a01b90910463ffffffff16828601528351808501855260018401548152600290930154948301949094529182015280519091166102b55760405162461bcd60e51b815260206004820152603560248201527f4d6f636b526f6c6c75702e6368616c6c656e6765436f6d6d69746d656e743a2060448201527410dbdb5b5a5d1b595b9d081b9bdd081c1bdcdd1959605a1b60648201526084015b60405180910390fd5b806020015163ffffffff1685106103405760405162461bcd60e51b815260206004820152604360248201527f4d6f636b526f6c6c75702e6368616c6c656e6765436f6d6d69746d656e743a2060448201527f506f696e74206d757374206265206c657373207468616e2064617461206c656e6064820152620cee8d60eb1b608482015260a4016102ac565b604080518082018252600154815260025460208201529082015161036991879186919088610a35565b9150505b949350505050565b805160405163eccbbfc960e01b815263ffffffff90911660048201526001600160a01b0383169063eccbbfc990602401602060405180830381865afa1580156103c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e69190611a66565b6103f38260400151610ab2565b1461047a5760405162461bcd60e51b815260206004820152604b60248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a206260448201527f617463684d6574616461746120646f6573206e6f74206d617463682073746f7260648201526a6564206d6574616461746160a81b608482015260a4016102ac565b6060810151604082015151516104cc919061049486610b29565b6040516020016104a691815260200190565b60405160208183030381529060405280519060200120846020015163ffffffff16610b59565b61053e5760405162461bcd60e51b815260206004820152603960248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a206960448201527f6e636c7573696f6e2070726f6f6620697320696e76616c69640000000000000060648201526084016102ac565b6000805b84604001515181101561091e578460400151818151811061056557610565611a7f565b60200260200101516000015160ff16836040015160000151602001518460800151838151811061059757610597611a7f565b0160200151815160f89190911c9081106105b3576105b3611a7f565b016020015160f81c1461062e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a207160448201527f756f72756d4e756d62657220646f6573206e6f74206d6174636800000000000060648201526084016102ac565b8460400151818151811061064457610644611a7f565b60200260200101516040015160ff168560400151828151811061066957610669611a7f565b60200260200101516020015160ff16106106fc5760405162461bcd60e51b815260206004820152604860248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a206160448201527f64766572736172795468726573686f6c6450657263656e74616765206973206e6064820152671bdd081d985b1a5960c21b608482015260a4016102ac565b600061072c858760400151848151811061071857610718611a7f565b60200260200101516000015160ff16610b71565b905060ff8116156107e3578060ff168660400151838151811061075157610751611a7f565b60200260200101516020015160ff1610156107e35760405162461bcd60e51b815260206004820152604660248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a206160448201527f64766572736172795468726573686f6c6450657263656e74616765206973206e6064820152651bdd081b595d60d21b608482015260a4016102ac565b856040015182815181106107f9576107f9611a7f565b60200260200101516040015160ff16846040015160000151604001518560800151848151811061082b5761082b611a7f565b0160200151815160f89190911c90811061084757610847611a7f565b016020015160f81c10156108d55760405162461bcd60e51b815260206004820152604960248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a206360448201527f6f6e6669726d6174696f6e5468726573686f6c6450657263656e7461676520696064820152681cc81b9bdd081b595d60ba1b608482015260a4016102ac565b61090883876040015184815181106108ef576108ef611a7f565b602002602001015160000151600160ff919091161b1790565b925050808061091690611aab565b915050610542565b50610997610990846001600160a01b031663e15234ff6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610963573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261098b9190810190611af2565b610c68565b8281161490565b610a2f5760405162461bcd60e51b815260206004820152605960248201527f456967656e4441526f6c6c75705574696c732e766572696679426c6f623a207260448201527f657175697265642071756f72756d7320617265206e6f7420612073756273657460648201527f206f662074686520636f6e6669726d65642071756f72756d7300000000000000608482015260a4016102ac565b50505050565b600080610a6c610a67604080518082018252600080825260209182015281518083019092526001825260029082015290565b610df5565b9050610aa7610a85610a7e838a610eb4565b8790610f4b565b84610a9a610a93858b610eb4565b8890610f4b565b610aa2610fdf565b61109f565b979650505050505050565b6000610b238260000151604051602001610acc9190611b95565b60408051808303601f1901815282825280516020918201208682015187840151838601929092528484015260e01b6001600160e01b0319166060840152815160448185030181526064909301909152815191012090565b92915050565b600081604051602001610b3c9190611bf5565b604051602081830303815290604052805190602001209050919050565b600083610b6786858561130c565b1495945050505050565b600081836001600160a01b0316638687feae6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610bb2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bda9190810190611af2565b511115610b2357826001600160a01b0316638687feae6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c1f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c479190810190611af2565b8281518110610c5857610c58611a7f565b016020015160f81c905092915050565b600061010082511115610cf15760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a4016102ac565b8151610cff57506000919050565b60008083600081518110610d1557610d15611a7f565b0160200151600160f89190911c81901b92505b8451811015610dec57848181518110610d4357610d43611a7f565b0160200151600160f89190911c1b9150828211610dd85760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a4016102ac565b91811791610de581611aab565b9050610d28565b50909392505050565b60408051808201909152600080825260208201528151158015610e1a57506020820151155b15610e38575050604080518082019091526000808252602082015290565b6040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478460200151610e7d9190611c9a565b610ea7907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47611cbc565b905292915050565b919050565b6040805180820190915260008082526020820152610ed061140f565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa9050808015610f0357610f05565bfe5b5080610f435760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b60448201526064016102ac565b505092915050565b6040805180820190915260008082526020820152610f6761142d565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa9050808015610f03575080610f435760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b60448201526064016102ac565b610fe761144b565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528581526020808201859052825180840190935285835282018390526000916110ce611470565b60005b60028110156112935760006110e7826006611cd3565b90508482600281106110fb576110fb611a7f565b6020020151518361110d836000611cf2565b600c811061111d5761111d611a7f565b602002015284826002811061113457611134611a7f565b6020020151602001518382600161114b9190611cf2565b600c811061115b5761115b611a7f565b602002015283826002811061117257611172611a7f565b6020020151515183611185836002611cf2565b600c811061119557611195611a7f565b60200201528382600281106111ac576111ac611a7f565b60200201515160016020020151836111c5836003611cf2565b600c81106111d5576111d5611a7f565b60200201528382600281106111ec576111ec611a7f565b60200201516020015160006002811061120757611207611a7f565b602002015183611218836004611cf2565b600c811061122857611228611a7f565b602002015283826002811061123f5761123f611a7f565b60200201516020015160016002811061125a5761125a611a7f565b60200201518361126b836005611cf2565b600c811061127b5761127b611a7f565b6020020152508061128b81611aab565b9150506110d1565b5061129c61148f565b60006020826101808560086107d05a03fa9050808015610f035750806112fc5760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b60448201526064016102ac565b5051151598975050505050505050565b60006020845161131c9190611c9a565b156113a35760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016102ac565b8260205b85518111611406576113ba600285611c9a565b6113db578160005280860151602052604060002091506002840493506113f4565b8086015160005281602052604060002091506002840493505b6113ff602082611cf2565b90506113a7565b50949350505050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806040016040528061145e6114ad565b815260200161146b6114ad565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b6000602082840312156114dd57600080fd5b5035919050565b6001600160a01b038416815263ffffffff831660208201526080810161036d604083018480518252602090810151910152565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561155057611550611517565b60405290565b6040516080810167ffffffffffffffff8111828210171561155057611550611517565b60405160a0810167ffffffffffffffff8111828210171561155057611550611517565b6040805190810167ffffffffffffffff8111828210171561155057611550611517565b604051601f8201601f1916810167ffffffffffffffff811182821017156115e8576115e8611517565b604052919050565b803563ffffffff81168114610eaf57600080fd5b803560ff81168114610eaf57600080fd5b600067ffffffffffffffff82111561162f5761162f611517565b50601f01601f191660200190565b600082601f83011261164e57600080fd5b813561166161165c82611615565b6115bf565b81815284602083860101111561167657600080fd5b816020850160208301376000918101602001919091529392505050565b6000606082840312156116a557600080fd5b6116ad61152d565b9050813567ffffffffffffffff808211156116c757600080fd5b90830190608082860312156116db57600080fd5b6116e3611556565b823581526020830135828111156116f957600080fd5b6117058782860161163d565b60208301525060408301358281111561171d57600080fd5b6117298782860161163d565b60408301525061173b606084016115f0565b6060820152835250506020828101359082015261175a604083016115f0565b604082015292915050565b600060a0828403121561177757600080fd5b61177f611579565b905061178a826115f0565b8152611798602083016115f0565b6020820152604082013567ffffffffffffffff808211156117b857600080fd5b6117c485838601611693565b604084015260608401359150808211156117dd57600080fd5b6117e98583860161163d565b6060840152608084013591508082111561180257600080fd5b5061180f8482850161163d565b60808301525092915050565b600080604080848603121561182f57600080fd5b833567ffffffffffffffff8082111561184757600080fd5b9085019081870360808082121561185d57600080fd5b61186561152d565b8583121561187257600080fd5b61187a61159c565b925084358352602080860135818501528382526118988787016115f0565b818301526060935083860135858111156118b157600080fd5b8087019650508a601f8701126118c657600080fd5b8535858111156118d8576118d8611517565b6118e6828260051b016115bf565b81815260079190911b8701820190828101908d83111561190557600080fd5b978301975b828910156119715785898f0312156119225760008081fd5b61192a611556565b6119338a611604565b8152611940858b01611604565b8582015261194f8b8b01611604565b8b82015261195e888b016115f0565b818901528252978501979083019061190a565b9884019890985250909750880135945050508083111561199057600080fd5b505061199e85828601611765565b9150509250929050565b600082601f8301126119b957600080fd5b6119c161159c565b8060408401858111156119d357600080fd5b845b818110156119ed5780358452602093840193016119d5565b509095945050505050565b60008060008084860360e0811215611a0f57600080fd5b85359450602086013593506080603f1982011215611a2c57600080fd5b50611a3561159c565b611a4287604088016119a8565b8152611a5187608088016119a8565b60208201529396929550929360c00135925050565b600060208284031215611a7857600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611abf57611abf611a95565b5060010190565b60005b83811015611ae1578181015183820152602001611ac9565b83811115610a2f5750506000910152565b600060208284031215611b0457600080fd5b815167ffffffffffffffff811115611b1b57600080fd5b8201601f81018413611b2c57600080fd5b8051611b3a61165c82611615565b818152856020838501011115611b4f57600080fd5b611b60826020830160208601611ac6565b95945050505050565b60008151808452611b81816020860160208601611ac6565b601f01601f19169290920160200192915050565b60208152815160208201526000602083015160806040840152611bbb60a0840182611b69565b90506040840151601f19848303016060850152611bd88282611b69565b91505063ffffffff60608501511660808401528091505092915050565b60208082528251805183830152810151604083015260009060a0830181850151606063ffffffff808316828801526040925082880151608080818a015285825180885260c08b0191508884019750600093505b80841015611c8b578751805160ff90811684528a82015181168b850152888201511688840152860151851686830152968801966001939093019290820190611c48565b509a9950505050505050505050565b600082611cb757634e487b7160e01b600052601260045260246000fd5b500690565b600082821015611cce57611cce611a95565b500390565b6000816000190483118215151615611ced57611ced611a95565b500290565b60008219821115611d0557611d05611a95565b50019056fea2646970667358221220b18154e0c7938048da719d3e0d955a9712005276545a07283e05ead90292796564736f6c634300080c0033", } // ContractMockRollupABI is the input ABI used to generate the binding from. diff --git a/contracts/src/interfaces/IEigenDAStructs.sol b/contracts/src/interfaces/IEigenDAStructs.sol index cc3a700c87..31b7ad60cd 100644 --- a/contracts/src/interfaces/IEigenDAStructs.sol +++ b/contracts/src/interfaces/IEigenDAStructs.sol @@ -83,7 +83,6 @@ struct BlobHeaderV2 { bytes quorumNumbers; BlobCommitment commitment; bytes32 paymentHeaderHash; - uint32 salt; } struct BlobCommitment { diff --git a/contracts/src/libraries/EigenDAHasher.sol b/contracts/src/libraries/EigenDAHasher.sol index eee5f7730c..c0857840d3 100644 --- a/contracts/src/libraries/EigenDAHasher.sol +++ b/contracts/src/libraries/EigenDAHasher.sol @@ -123,8 +123,7 @@ library EigenDAHasher { abi.encode( blobHeader.version, blobHeader.quorumNumbers, - blobHeader.commitment, - blobHeader.salt + blobHeader.commitment ) ), blobHeader.paymentHeaderHash diff --git a/contracts/test/unit/EigenDACertVerifierV2Unit.t.sol b/contracts/test/unit/EigenDACertVerifierV2Unit.t.sol index 438234e450..79fa8d7768 100644 --- a/contracts/test/unit/EigenDACertVerifierV2Unit.t.sol +++ b/contracts/test/unit/EigenDACertVerifierV2Unit.t.sol @@ -230,8 +230,7 @@ contract EigenDACertVerifierV2Unit is MockEigenDADeployer { lengthProof: BN254.G2Point(lengthProofX, lengthProofY), length: uint32(uint256(keccak256(abi.encode(psuedoRandomNumber, "blobHeader.length")))) }), - paymentHeaderHash: keccak256(abi.encode(psuedoRandomNumber, "blobHeader.paymentHeaderHash")), - salt: uint32(uint256(keccak256(abi.encode(psuedoRandomNumber, "blobHeader.salt")))) + paymentHeaderHash: keccak256(abi.encode(psuedoRandomNumber, "blobHeader.paymentHeaderHash")) }); return blobHeader; diff --git a/core/auth/v2/auth_test.go b/core/auth/v2/auth_test.go index da8dedeea6..d830fdf642 100644 --- a/core/auth/v2/auth_test.go +++ b/core/auth/v2/auth_test.go @@ -109,7 +109,7 @@ func testHeader(t *testing.T, accountID string) *corev2.BlobHeader { QuorumNumbers: []core.QuorumID{0, 1}, PaymentMetadata: core.PaymentMetadata{ AccountID: accountID, - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100), }, } diff --git a/core/auth/v2/signer_test.go b/core/auth/v2/signer_test.go index 0fa0f99a8e..3a16f60f6b 100644 --- a/core/auth/v2/signer_test.go +++ b/core/auth/v2/signer_test.go @@ -77,7 +77,7 @@ func TestSignBlobRequest(t *testing.T) { PaymentMetadata: corev1.PaymentMetadata{ AccountID: accountID, CumulativePayment: big.NewInt(100), - ReservationPeriod: 100, + Timestamp: 100, }, } diff --git a/core/data.go b/core/data.go index 6d036dbdee..6b8adc84a5 100644 --- a/core/data.go +++ b/core/data.go @@ -6,6 +6,7 @@ import ( "fmt" "math/big" "strconv" + "time" commonpbv2 "github.com/Layr-Labs/eigenda/api/grpc/common/v2" "github.com/Layr-Labs/eigenda/common" @@ -497,8 +498,8 @@ type PaymentMetadata struct { // AccountID is the ETH account address for the payer AccountID string `json:"account_id"` - // ReservationPeriod represents the range of time at which the dispersal is made - ReservationPeriod uint32 `json:"reservation_period"` + // Timestamp represents the nanosecond of the dispersal request creation + Timestamp int64 `json:"timestamp"` // CumulativePayment represents the total amount of payment (in wei) made by the user up to this point CumulativePayment *big.Int `json:"cumulative_payment"` } @@ -514,8 +515,8 @@ func (pm *PaymentMetadata) Hash() ([32]byte, error) { Type: "string", }, { - Name: "reservationPeriod", - Type: "uint32", + Name: "timestamp", + Type: "int64", }, { Name: "cumulativePayment", @@ -552,8 +553,8 @@ func (pm *PaymentMetadata) MarshalDynamoDBAttributeValue() (types.AttributeValue return &types.AttributeValueMemberM{ Value: map[string]types.AttributeValue{ - "AccountID": &types.AttributeValueMemberS{Value: pm.AccountID}, - "ReservationPeriod": &types.AttributeValueMemberN{Value: fmt.Sprintf("%d", pm.ReservationPeriod)}, + "AccountID": &types.AttributeValueMemberS{Value: pm.AccountID}, + "Timestamp": &types.AttributeValueMemberN{Value: fmt.Sprintf("%d", pm.Timestamp)}, "CumulativePayment": &types.AttributeValueMemberN{ Value: pm.CumulativePayment.String(), }, @@ -571,15 +572,15 @@ func (pm *PaymentMetadata) UnmarshalDynamoDBAttributeValue(av types.AttributeVal return fmt.Errorf("expected *types.AttributeValueMemberS for AccountID, got %T", m.Value["AccountID"]) } pm.AccountID = accountID.Value - rp, ok := m.Value["ReservationPeriod"].(*types.AttributeValueMemberN) + rp, ok := m.Value["Timestamp"].(*types.AttributeValueMemberN) if !ok { - return fmt.Errorf("expected *types.AttributeValueMemberN for ReservationPeriod, got %T", m.Value["ReservationPeriod"]) + return fmt.Errorf("expected *types.AttributeValueMemberN for Timestamp, got %T", m.Value["Timestamp"]) } - reservationPeriod, err := strconv.ParseUint(rp.Value, 10, 32) + timestamp, err := strconv.ParseInt(rp.Value, 10, 64) if err != nil { - return fmt.Errorf("failed to parse ReservationPeriod: %w", err) + return fmt.Errorf("failed to parse Timestamp: %w", err) } - pm.ReservationPeriod = uint32(reservationPeriod) + pm.Timestamp = timestamp cp, ok := m.Value["CumulativePayment"].(*types.AttributeValueMemberN) if !ok { return fmt.Errorf("expected *types.AttributeValueMemberN for CumulativePayment, got %T", m.Value["CumulativePayment"]) @@ -594,7 +595,7 @@ func (pm *PaymentMetadata) ToProtobuf() *commonpbv2.PaymentHeader { } return &commonpbv2.PaymentHeader{ AccountId: pm.AccountID, - ReservationPeriod: pm.ReservationPeriod, + Timestamp: pm.Timestamp, CumulativePayment: pm.CumulativePayment.Bytes(), } } @@ -607,7 +608,7 @@ func ConvertToPaymentMetadata(ph *commonpbv2.PaymentHeader) *PaymentMetadata { return &PaymentMetadata{ AccountID: ph.AccountId, - ReservationPeriod: ph.ReservationPeriod, + Timestamp: ph.Timestamp, CumulativePayment: new(big.Int).SetBytes(ph.CumulativePayment), } } @@ -642,3 +643,9 @@ type BlobVersionParameters struct { func (ar *ReservedPayment) IsActive(currentTimestamp uint64) bool { return ar.StartTimestamp <= currentTimestamp && ar.EndTimestamp >= currentTimestamp } + +// IsActive returns true if the reservation is active at the given timestamp +func (ar *ReservedPayment) IsActiveByNanosecond(currentTimestamp int64) bool { + timestamp := uint64((time.Duration(currentTimestamp) * time.Nanosecond).Seconds()) + return ar.StartTimestamp <= timestamp && ar.EndTimestamp >= timestamp +} diff --git a/core/meterer/meterer.go b/core/meterer/meterer.go index c4a1e23a09..9a32732a75 100644 --- a/core/meterer/meterer.go +++ b/core/meterer/meterer.go @@ -23,7 +23,7 @@ type Config struct { } // Meterer handles payment accounting across different accounts. Disperser API server receives requests from clients and each request contains a blob header -// with payments information (CumulativePayments, ReservationPeriod, Salt, and Signature). Disperser will pass the blob header to the meterer, which will check if the +// with payments information (CumulativePayments, Timestamp, and Signature). Disperser will pass the blob header to the meterer, which will check if the // payments information is valid. type Meterer struct { Config @@ -102,18 +102,20 @@ func (m *Meterer) MeterRequest(ctx context.Context, header core.PaymentMetadata, // ServeReservationRequest handles the rate limiting logic for incoming requests func (m *Meterer) ServeReservationRequest(ctx context.Context, header core.PaymentMetadata, reservation *core.ReservedPayment, symbolsCharged uint32, quorumNumbers []uint8) error { m.logger.Info("Recording and validating reservation usage", "header", header, "reservation", reservation) - if !reservation.IsActive(uint64(time.Now().Unix())) { + if !reservation.IsActiveByNanosecond(header.Timestamp) { return fmt.Errorf("reservation not active") } if err := m.ValidateQuorum(quorumNumbers, reservation.QuorumNumbers); err != nil { return fmt.Errorf("invalid quorum for reservation: %w", err) } - if !m.ValidateReservationPeriod(header, reservation) { + reservationWindow := m.ChainPaymentState.GetReservationWindow() + requestReservationPeriod := GetReservationPeriodByNanosecond(header.Timestamp, reservationWindow) + if !m.ValidateReservationPeriod(reservation, requestReservationPeriod) { return fmt.Errorf("invalid reservation period for reservation") } // Update bin usage atomically and check against reservation's data rate as the bin limit - if err := m.IncrementBinUsage(ctx, header, reservation, symbolsCharged); err != nil { + if err := m.IncrementBinUsage(ctx, header, reservation, symbolsCharged, requestReservationPeriod); err != nil { return fmt.Errorf("bin overflows: %w", err) } @@ -140,20 +142,24 @@ func (m *Meterer) ValidateQuorum(headerQuorums []uint8, allowedQuorums []uint8) } // ValidateReservationPeriod checks if the provided reservation period is valid -func (m *Meterer) ValidateReservationPeriod(header core.PaymentMetadata, reservation *core.ReservedPayment) bool { - now := uint64(time.Now().Unix()) +func (m *Meterer) ValidateReservationPeriod(reservation *core.ReservedPayment, requestReservationPeriod uint32) bool { + now := time.Now().Unix() reservationWindow := m.ChainPaymentState.GetReservationWindow() currentReservationPeriod := GetReservationPeriod(now, reservationWindow) // Valid reservation periodes are either the current bin or the previous bin - if (header.ReservationPeriod != currentReservationPeriod && header.ReservationPeriod != (currentReservationPeriod-1)) || (GetReservationPeriod(reservation.StartTimestamp, reservationWindow) > header.ReservationPeriod || header.ReservationPeriod > GetReservationPeriod(reservation.EndTimestamp, reservationWindow)) { + isCurrentOrPreviousPeriod := requestReservationPeriod == currentReservationPeriod || requestReservationPeriod == (currentReservationPeriod-1) + startPeriod := GetReservationPeriod(int64(reservation.StartTimestamp), reservationWindow) + endPeriod := GetReservationPeriod(int64(reservation.EndTimestamp), reservationWindow) + isWithinReservationWindow := startPeriod <= requestReservationPeriod && requestReservationPeriod <= endPeriod + if !isCurrentOrPreviousPeriod || !isWithinReservationWindow { return false } return true } // IncrementBinUsage increments the bin usage atomically and checks for overflow -func (m *Meterer) IncrementBinUsage(ctx context.Context, header core.PaymentMetadata, reservation *core.ReservedPayment, symbolsCharged uint32) error { - newUsage, err := m.OffchainStore.UpdateReservationBin(ctx, header.AccountID, uint64(header.ReservationPeriod), uint64(symbolsCharged)) +func (m *Meterer) IncrementBinUsage(ctx context.Context, header core.PaymentMetadata, reservation *core.ReservedPayment, symbolsCharged uint32, requestReservationPeriod uint32) error { + newUsage, err := m.OffchainStore.UpdateReservationBin(ctx, header.AccountID, uint64(requestReservationPeriod), uint64(symbolsCharged)) if err != nil { return fmt.Errorf("failed to increment bin usage: %w", err) } @@ -166,8 +172,8 @@ func (m *Meterer) IncrementBinUsage(ctx context.Context, header core.PaymentMeta // metered usage before updating the size already exceeded the limit return fmt.Errorf("bin has already been filled") } - if newUsage <= 2*usageLimit && header.ReservationPeriod+2 <= GetReservationPeriod(reservation.EndTimestamp, m.ChainPaymentState.GetReservationWindow()) { - _, err := m.OffchainStore.UpdateReservationBin(ctx, header.AccountID, uint64(header.ReservationPeriod+2), newUsage-usageLimit) + if newUsage <= 2*usageLimit && requestReservationPeriod+2 <= GetReservationPeriod(int64(reservation.EndTimestamp), m.ChainPaymentState.GetReservationWindow()) { + _, err := m.OffchainStore.UpdateReservationBin(ctx, header.AccountID, uint64(requestReservationPeriod+2), newUsage-usageLimit) if err != nil { return err } @@ -176,13 +182,22 @@ func (m *Meterer) IncrementBinUsage(ctx context.Context, header core.PaymentMeta return fmt.Errorf("overflow usage exceeds bin limit") } +// GetReservationPeriodByNanosecondTimestamp returns the current reservation period by chunking nanosecond timestamp by the bin interval; +// bin interval used by the disperser should be public information +func GetReservationPeriodByNanosecond(nanosecondTimestamp int64, binInterval uint32) uint32 { + if nanosecondTimestamp < 0 { + return 0 + } + return GetReservationPeriod(int64((time.Duration(nanosecondTimestamp) * time.Nanosecond).Seconds()), binInterval) +} + // GetReservationPeriod returns the current reservation period by chunking time by the bin interval; // bin interval used by the disperser should be public information -func GetReservationPeriod(timestamp uint64, binInterval uint32) uint32 { +func GetReservationPeriod(timestamp int64, binInterval uint32) uint32 { if binInterval == 0 { return 0 } - return uint32(timestamp) / binInterval + return uint32(timestamp / int64(binInterval)) } // ServeOnDemandRequest handles the rate limiting logic for incoming requests @@ -271,7 +286,7 @@ func (m *Meterer) SymbolsCharged(numSymbols uint) uint32 { // IncrementBinUsage increments the bin usage atomically and checks for overflow func (m *Meterer) IncrementGlobalBinUsage(ctx context.Context, symbolsCharged uint64) error { - globalPeriod := GetReservationPeriod(uint64(time.Now().Unix()), m.ChainPaymentState.GetGlobalRatePeriodInterval()) + globalPeriod := GetReservationPeriod(time.Now().Unix(), m.ChainPaymentState.GetGlobalRatePeriodInterval()) newUsage, err := m.OffchainStore.UpdateGlobalBin(ctx, globalPeriod, symbolsCharged) if err != nil { diff --git a/core/meterer/meterer_test.go b/core/meterer/meterer_test.go index a4cd7f8d9c..35fd0097f5 100644 --- a/core/meterer/meterer_test.go +++ b/core/meterer/meterer_test.go @@ -133,9 +133,9 @@ func setup(_ *testing.M) { accountID1 = crypto.PubkeyToAddress(privateKey1.PublicKey) accountID2 = crypto.PubkeyToAddress(privateKey2.PublicKey) accountID3 = crypto.PubkeyToAddress(privateKey3.PublicKey) - account1Reservations = &core.ReservedPayment{SymbolsPerSecond: 100, StartTimestamp: now - 120, EndTimestamp: now + 180, QuorumSplits: []byte{50, 50}, QuorumNumbers: []uint8{0, 1}} - account2Reservations = &core.ReservedPayment{SymbolsPerSecond: 200, StartTimestamp: now - 120, EndTimestamp: now + 180, QuorumSplits: []byte{30, 70}, QuorumNumbers: []uint8{0, 1}} - account3Reservations = &core.ReservedPayment{SymbolsPerSecond: 200, StartTimestamp: now + 120, EndTimestamp: now + 180, QuorumSplits: []byte{30, 70}, QuorumNumbers: []uint8{0, 1}} + account1Reservations = &core.ReservedPayment{SymbolsPerSecond: 20, StartTimestamp: now - 120, EndTimestamp: now + 180, QuorumSplits: []byte{50, 50}, QuorumNumbers: []uint8{0, 1}} + account2Reservations = &core.ReservedPayment{SymbolsPerSecond: 40, StartTimestamp: now - 120, EndTimestamp: now + 180, QuorumSplits: []byte{30, 70}, QuorumNumbers: []uint8{0, 1}} + account3Reservations = &core.ReservedPayment{SymbolsPerSecond: 40, StartTimestamp: now + 120, EndTimestamp: now + 180, QuorumSplits: []byte{30, 70}, QuorumNumbers: []uint8{0, 1}} account1OnDemandPayments = &core.OnDemandPayment{CumulativePayment: big.NewInt(3864)} account2OnDemandPayments = &core.OnDemandPayment{CumulativePayment: big.NewInt(2000)} @@ -177,12 +177,13 @@ func teardown() { func TestMetererReservations(t *testing.T) { ctx := context.Background() - paymentChainState.On("GetReservationWindow", testifymock.Anything).Return(uint32(1), nil) + paymentChainState.On("GetReservationWindow", testifymock.Anything).Return(uint32(5), nil) paymentChainState.On("GetGlobalSymbolsPerSecond", testifymock.Anything).Return(uint64(1009), nil) paymentChainState.On("GetGlobalRatePeriodInterval", testifymock.Anything).Return(uint32(1), nil) paymentChainState.On("GetMinNumSymbols", testifymock.Anything).Return(uint32(3), nil) - reservationPeriod := meterer.GetReservationPeriod(uint64(time.Now().Unix()), mt.ChainPaymentState.GetReservationWindow()) + now := time.Now().UnixNano() + reservationPeriod := meterer.GetReservationPeriodByNanosecond(now, mt.ChainPaymentState.GetReservationWindow()) quoromNumbers := []uint8{0, 1} paymentChainState.On("GetReservedPaymentByAccount", testifymock.Anything, testifymock.MatchedBy(func(account gethcommon.Address) bool { @@ -196,17 +197,22 @@ func TestMetererReservations(t *testing.T) { })).Return(account3Reservations, nil) paymentChainState.On("GetReservedPaymentByAccount", testifymock.Anything, testifymock.Anything).Return(&core.ReservedPayment{}, fmt.Errorf("reservation not found")) - // test invalid quorom ID + // test not active reservation header := createPaymentHeader(1, big.NewInt(0), accountID1) _, err := mt.MeterRequest(ctx, *header, 1000, []uint8{0, 1, 2}) - assert.ErrorContains(t, err, "quorum number mismatch") + assert.ErrorContains(t, err, "reservation not active") - // overwhelming bin overflow for empty bins - header = createPaymentHeader(reservationPeriod-1, big.NewInt(0), accountID2) + // test invalid quorom ID + header = createPaymentHeader(now, big.NewInt(0), accountID1) + _, err = mt.MeterRequest(ctx, *header, 1000, []uint8{0, 1, 2}) + assert.ErrorContains(t, err, "invalid quorum for reservation") + + // overwhelming bin overflow for empty bin + header = createPaymentHeader(now-int64(mt.ChainPaymentState.GetReservationWindow())*1e9, big.NewInt(0), accountID2) _, err = mt.MeterRequest(ctx, *header, 10, quoromNumbers) assert.NoError(t, err) // overwhelming bin overflow for empty bins - header = createPaymentHeader(reservationPeriod-1, big.NewInt(0), accountID2) + header = createPaymentHeader(now-int64(mt.ChainPaymentState.GetReservationWindow())*1e9, big.NewInt(0), accountID2) _, err = mt.MeterRequest(ctx, *header, 1000, quoromNumbers) assert.ErrorContains(t, err, "overflow usage exceeds bin limit") @@ -221,12 +227,12 @@ func TestMetererReservations(t *testing.T) { assert.ErrorContains(t, err, "failed to get active reservation by account: reservation not found") // test inactive reservation - header = createPaymentHeader(reservationPeriod, big.NewInt(0), accountID3) + header = createPaymentHeader(now, big.NewInt(0), accountID3) _, err = mt.MeterRequest(ctx, *header, 1000, []uint8{0}) assert.ErrorContains(t, err, "reservation not active") // test invalid reservation period - header = createPaymentHeader(reservationPeriod-3, big.NewInt(0), accountID1) + header = createPaymentHeader(now-2*int64(mt.ChainPaymentState.GetReservationWindow())*1e9, big.NewInt(0), accountID1) _, err = mt.MeterRequest(ctx, *header, 2000, quoromNumbers) assert.ErrorContains(t, err, "invalid reservation period for reservation") @@ -234,7 +240,9 @@ func TestMetererReservations(t *testing.T) { symbolLength := uint(20) requiredLength := uint(21) // 21 should be charged for length of 20 since minNumSymbols is 3 for i := 0; i < 9; i++ { - header = createPaymentHeader(reservationPeriod, big.NewInt(0), accountID2) + now = time.Now().UnixNano() + reservationPeriod = meterer.GetReservationPeriodByNanosecond(now, mt.ChainPaymentState.GetReservationWindow()) + header = createPaymentHeader(now, big.NewInt(0), accountID2) symbolsCharged, err := mt.MeterRequest(ctx, *header, symbolLength, quoromNumbers) assert.NoError(t, err) item, err := dynamoClient.GetItem(ctx, reservationTableName, commondynamodb.Key{ @@ -246,10 +254,9 @@ func TestMetererReservations(t *testing.T) { assert.Equal(t, accountID2.Hex(), item["AccountID"].(*types.AttributeValueMemberS).Value) assert.Equal(t, strconv.Itoa(int(reservationPeriod)), item["ReservationPeriod"].(*types.AttributeValueMemberN).Value) assert.Equal(t, strconv.Itoa((i+1)*int(requiredLength)), item["BinUsage"].(*types.AttributeValueMemberN).Value) - } // first over flow is allowed - header = createPaymentHeader(reservationPeriod, big.NewInt(0), accountID2) + header = createPaymentHeader(now, big.NewInt(0), accountID2) symbolsCharged, err := mt.MeterRequest(ctx, *header, 25, quoromNumbers) assert.NoError(t, err) assert.Equal(t, uint32(27), symbolsCharged) @@ -265,7 +272,7 @@ func TestMetererReservations(t *testing.T) { assert.Equal(t, strconv.Itoa(int(16)), item["BinUsage"].(*types.AttributeValueMemberN).Value) // second over flow - header = createPaymentHeader(reservationPeriod, big.NewInt(0), accountID2) + header = createPaymentHeader(now, big.NewInt(0), accountID2) assert.NoError(t, err) _, err = mt.MeterRequest(ctx, *header, 1, quoromNumbers) assert.ErrorContains(t, err, "bin has already been filled") @@ -276,7 +283,7 @@ func TestMetererOnDemand(t *testing.T) { quorumNumbers := []uint8{0, 1} paymentChainState.On("GetPricePerSymbol", testifymock.Anything).Return(uint32(2), nil) paymentChainState.On("GetMinNumSymbols", testifymock.Anything).Return(uint32(3), nil) - reservationPeriod := uint32(0) // this field doesn't matter for on-demand payments wrt global rate limit + now := time.Now().Unix() paymentChainState.On("GetOnDemandPaymentByAccount", testifymock.Anything, testifymock.MatchedBy(func(account gethcommon.Address) bool { return account == accountID1 @@ -292,18 +299,18 @@ func TestMetererOnDemand(t *testing.T) { if err != nil { t.Fatalf("Failed to generate key: %v", err) } - header := createPaymentHeader(reservationPeriod, big.NewInt(2), crypto.PubkeyToAddress(unregisteredUser.PublicKey)) + header := createPaymentHeader(now, big.NewInt(2), crypto.PubkeyToAddress(unregisteredUser.PublicKey)) assert.NoError(t, err) _, err = mt.MeterRequest(ctx, *header, 1000, quorumNumbers) assert.ErrorContains(t, err, "failed to get on-demand payment by account: payment not found") // test invalid quorom ID - header = createPaymentHeader(reservationPeriod, big.NewInt(2), accountID1) + header = createPaymentHeader(now, big.NewInt(2), accountID1) _, err = mt.MeterRequest(ctx, *header, 1000, []uint8{0, 1, 2}) assert.ErrorContains(t, err, "invalid quorum for On-Demand Request") // test insufficient cumulative payment - header = createPaymentHeader(reservationPeriod, big.NewInt(1), accountID1) + header = createPaymentHeader(now, big.NewInt(1), accountID1) _, err = mt.MeterRequest(ctx, *header, 1000, quorumNumbers) assert.ErrorContains(t, err, "insufficient cumulative payment increment") // No rollback after meter request @@ -318,24 +325,24 @@ func TestMetererOnDemand(t *testing.T) { symbolLength := uint(100) priceCharged := mt.PaymentCharged(symbolLength) assert.Equal(t, big.NewInt(int64(102*mt.ChainPaymentState.GetPricePerSymbol())), priceCharged) - header = createPaymentHeader(reservationPeriod, priceCharged, accountID2) + header = createPaymentHeader(now, priceCharged, accountID2) symbolsCharged, err := mt.MeterRequest(ctx, *header, symbolLength, quorumNumbers) assert.NoError(t, err) assert.Equal(t, uint32(102), symbolsCharged) - header = createPaymentHeader(reservationPeriod, priceCharged, accountID2) + header = createPaymentHeader(now, priceCharged, accountID2) _, err = mt.MeterRequest(ctx, *header, symbolLength, quorumNumbers) assert.ErrorContains(t, err, "exact payment already exists") // test valid payments for i := 1; i < 9; i++ { - header = createPaymentHeader(reservationPeriod, new(big.Int).Mul(priceCharged, big.NewInt(int64(i+1))), accountID2) + header = createPaymentHeader(now, new(big.Int).Mul(priceCharged, big.NewInt(int64(i+1))), accountID2) symbolsCharged, err = mt.MeterRequest(ctx, *header, symbolLength, quorumNumbers) assert.NoError(t, err) assert.Equal(t, uint32(102), symbolsCharged) } // test cumulative payment on-chain constraint - header = createPaymentHeader(reservationPeriod, big.NewInt(2023), accountID2) + header = createPaymentHeader(now, big.NewInt(2023), accountID2) _, err = mt.MeterRequest(ctx, *header, 1, quorumNumbers) assert.ErrorContains(t, err, "invalid on-demand payment: request claims a cumulative payment greater than the on-chain deposit") @@ -343,13 +350,13 @@ func TestMetererOnDemand(t *testing.T) { previousCumulativePayment := priceCharged.Mul(priceCharged, big.NewInt(9)) symbolLength = uint(2) priceCharged = mt.PaymentCharged(symbolLength) - header = createPaymentHeader(reservationPeriod, big.NewInt(0).Add(previousCumulativePayment, big.NewInt(0).Sub(priceCharged, big.NewInt(1))), accountID2) + header = createPaymentHeader(now, big.NewInt(0).Add(previousCumulativePayment, big.NewInt(0).Sub(priceCharged, big.NewInt(1))), accountID2) _, err = mt.MeterRequest(ctx, *header, symbolLength, quorumNumbers) assert.ErrorContains(t, err, "invalid on-demand payment: insufficient cumulative payment increment") previousCumulativePayment = big.NewInt(0).Add(previousCumulativePayment, priceCharged) // test cannot insert cumulative payment in out of order - header = createPaymentHeader(reservationPeriod, mt.PaymentCharged(50), accountID2) + header = createPaymentHeader(now, mt.PaymentCharged(50), accountID2) _, err = mt.MeterRequest(ctx, *header, 50, quorumNumbers) assert.ErrorContains(t, err, "invalid on-demand payment: breaking cumulative payment invariants") @@ -361,7 +368,7 @@ func TestMetererOnDemand(t *testing.T) { assert.NoError(t, err) assert.Equal(t, numPrevRecords, len(result)) // test failed global rate limit (previously payment recorded: 2, global limit: 1009) - header = createPaymentHeader(reservationPeriod, big.NewInt(0).Add(previousCumulativePayment, mt.PaymentCharged(1010)), accountID1) + header = createPaymentHeader(now, big.NewInt(0).Add(previousCumulativePayment, mt.PaymentCharged(1010)), accountID1) _, err = mt.MeterRequest(ctx, *header, 1010, quorumNumbers) assert.ErrorContains(t, err, "failed global rate limiting") // Correct rollback @@ -484,10 +491,10 @@ func TestMeterer_symbolsCharged(t *testing.T) { } } -func createPaymentHeader(reservationPeriod uint32, cumulativePayment *big.Int, accountID gethcommon.Address) *core.PaymentMetadata { +func createPaymentHeader(timestamp int64, cumulativePayment *big.Int, accountID gethcommon.Address) *core.PaymentMetadata { return &core.PaymentMetadata{ AccountID: accountID.Hex(), - ReservationPeriod: reservationPeriod, + Timestamp: timestamp, CumulativePayment: cumulativePayment, } } diff --git a/core/v2/serialization.go b/core/v2/serialization.go index 420936b361..1b27ae9cda 100644 --- a/core/v2/serialization.go +++ b/core/v2/serialization.go @@ -41,7 +41,6 @@ func ComputeBlobKey( blobCommitments encoding.BlobCommitments, quorumNumbers []core.QuorumID, paymentMetadataHash [32]byte, - salt uint32, ) ([32]byte, error) { versionType, err := abi.NewType("uint16", "", nil) if err != nil { @@ -51,10 +50,6 @@ func ComputeBlobKey( if err != nil { return [32]byte{}, err } - saltType, err := abi.NewType("uint32", "", nil) - if err != nil { - return [32]byte{}, err - } commitmentType, err := abi.NewType( "tuple", "", []abi.ArgumentMarshaling{ { @@ -117,9 +112,6 @@ func ComputeBlobKey( { Type: commitmentType, }, - { - Type: saltType, - }, } // Sort the quorum numbers to ensure the hash is consistent sortedQuorums := make([]core.QuorumID, len(quorumNumbers)) @@ -162,7 +154,6 @@ func ComputeBlobKey( }, DataLength: uint32(blobCommitments.Length), }, - salt, ) if err != nil { return [32]byte{}, err @@ -228,7 +219,7 @@ func (b *BlobHeader) BlobKey() (BlobKey, error) { b.BlobCommitments, b.QuorumNumbers, paymentMetadataHash, - b.Salt) + ) } func (c *BlobCertificate) Hash() ([32]byte, error) { diff --git a/core/v2/serialization_test.go b/core/v2/serialization_test.go index 69725edccb..b12784f32c 100644 --- a/core/v2/serialization_test.go +++ b/core/v2/serialization_test.go @@ -23,7 +23,7 @@ func TestBlobKey(t *testing.T) { func TestPaymentHash(t *testing.T) { pm := core.PaymentMetadata{ AccountID: "0x123", - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100), } hash, err := pm.Hash() @@ -45,15 +45,14 @@ func TestBlobKeyFromHeader(t *testing.T) { QuorumNumbers: []core.QuorumID{0, 1}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x123", - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100), }, - Salt: 42, } blobKey, err := bh.BlobKey() assert.NoError(t, err) - // 0x2bac85c7fc4c21ad02538a7eb44b120efbc64d25b1691470273f84c8cf82187a has verified in solidity with chisel - assert.Equal(t, "2bac85c7fc4c21ad02538a7eb44b120efbc64d25b1691470273f84c8cf82187a", blobKey.Hex()) + // 0xcadcc0498d2b61c069ef1000ce6d7b23370a918a6aa44f73de79973d3fa3120e has verified in solidity with chisel + assert.Equal(t, "cadcc0498d2b61c069ef1000ce6d7b23370a918a6aa44f73de79973d3fa3120e", blobKey.Hex()) // same blob key should be generated for the blob header with shuffled quorum numbers bh2 := v2.BlobHeader{ @@ -62,10 +61,9 @@ func TestBlobKeyFromHeader(t *testing.T) { QuorumNumbers: []core.QuorumID{1, 0}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x123", - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100), }, - Salt: 42, } blobKey2, err := bh2.BlobKey() @@ -116,10 +114,9 @@ func TestBlobCertHash(t *testing.T) { QuorumNumbers: []core.QuorumID{0, 1}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x123", - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100), }, - Salt: 42, }, Signature: []byte{1, 2, 3}, RelayKeys: []v2.RelayKey{4, 5, 6}, @@ -128,8 +125,8 @@ func TestBlobCertHash(t *testing.T) { hash, err := blobCert.Hash() assert.NoError(t, err) - // afa39b4c45197f0254f7e8e2127c797c74578357e9f077eab7a8aa62e1402bec has verified in solidity with chisel - assert.Equal(t, "afa39b4c45197f0254f7e8e2127c797c74578357e9f077eab7a8aa62e1402bec", hex.EncodeToString(hash[:])) + // 36430a6fbf0b99cc86801b6f7254b5f5cb5e838c6b9d83889ad7705165ffa4dc has verified in solidity with chisel + assert.Equal(t, "36430a6fbf0b99cc86801b6f7254b5f5cb5e838c6b9d83889ad7705165ffa4dc", hex.EncodeToString(hash[:])) } func TestBlobCertSerialization(t *testing.T) { @@ -146,10 +143,9 @@ func TestBlobCertSerialization(t *testing.T) { QuorumNumbers: []core.QuorumID{0, 1}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x123", - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100), }, - Salt: 42, }, Signature: []byte{1, 2, 3}, RelayKeys: []v2.RelayKey{4, 5, 6}, diff --git a/core/v2/types.go b/core/v2/types.go index 1a65c87479..5bdf02f65f 100644 --- a/core/v2/types.go +++ b/core/v2/types.go @@ -70,9 +70,6 @@ type BlobHeader struct { // PaymentMetadata contains the payment information for the blob PaymentMetadata core.PaymentMetadata - - // Salt is used to make blob intentionally unique when everything else is the same - Salt uint32 } func BlobHeaderFromProtobuf(proto *commonpb.BlobHeader) (*BlobHeader, error) { @@ -125,7 +122,6 @@ func BlobHeaderFromProtobuf(proto *commonpb.BlobHeader) (*BlobHeader, error) { }, QuorumNumbers: quorumNumbers, PaymentMetadata: *paymentMetadata, - Salt: proto.GetSalt(), }, nil } @@ -145,7 +141,6 @@ func (b *BlobHeader) ToProtobuf() (*commonpb.BlobHeader, error) { QuorumNumbers: quorums, Commitment: commitments, PaymentHeader: b.PaymentMetadata.ToProtobuf(), - Salt: b.Salt, }, nil } diff --git a/core/v2/types_test.go b/core/v2/types_test.go index 06237714c7..eada0a6641 100644 --- a/core/v2/types_test.go +++ b/core/v2/types_test.go @@ -23,7 +23,7 @@ func TestConvertBatchToFromProtobuf(t *testing.T) { QuorumNumbers: []core.QuorumID{0, 1}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x123", - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100), }, } @@ -33,7 +33,7 @@ func TestConvertBatchToFromProtobuf(t *testing.T) { QuorumNumbers: []core.QuorumID{0, 1}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x456", - ReservationPeriod: 6, + Timestamp: 6, CumulativePayment: big.NewInt(200), }, } @@ -77,7 +77,7 @@ func TestConvertBlobHeaderToFromProtobuf(t *testing.T) { QuorumNumbers: []core.QuorumID{0, 1}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x123", - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100), }, } @@ -102,7 +102,7 @@ func TestConvertBlobCertToFromProtobuf(t *testing.T) { QuorumNumbers: []core.QuorumID{0, 1}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x123", - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100), }, } diff --git a/disperser/apiserver/disperse_blob_v2.go b/disperser/apiserver/disperse_blob_v2.go index 1108a831aa..82f34c1400 100644 --- a/disperser/apiserver/disperse_blob_v2.go +++ b/disperser/apiserver/disperse_blob_v2.go @@ -52,6 +52,7 @@ func (s *DispersalServerV2) DisperseBlob(ctx context.Context, req *pb.DisperseBl if err != nil { return nil, err } + s.logger.Debug("stored blob", "blobKey", blobKey.Hex()) s.metrics.reportStoreBlobLatency(time.Since(finishedValidation)) @@ -76,6 +77,7 @@ func (s *DispersalServerV2) StoreBlob(ctx context.Context, data []byte, blobHead return corev2.BlobKey{}, api.NewErrorInternal(fmt.Sprintf("failed to store blob: %v", err)) } + s.logger.Debug("storing blob metadata", "blobHeader", blobHeader) blobMetadata := &dispv2.BlobMetadata{ BlobHeader: blobHeader, Signature: signature, @@ -107,13 +109,13 @@ func (s *DispersalServerV2) checkPaymentMeter(ctx context.Context, req *pb.Dispe blobLength := encoding.GetBlobLengthPowerOf2(uint(len(req.GetBlob()))) // handle payments and check rate limits - reservationPeriod := blobHeaderProto.GetPaymentHeader().GetReservationPeriod() + timestamp := blobHeaderProto.GetPaymentHeader().GetTimestamp() cumulativePayment := new(big.Int).SetBytes(blobHeaderProto.GetPaymentHeader().GetCumulativePayment()) accountID := blobHeaderProto.GetPaymentHeader().GetAccountId() paymentHeader := core.PaymentMetadata{ AccountID: accountID, - ReservationPeriod: reservationPeriod, + Timestamp: timestamp, CumulativePayment: cumulativePayment, } @@ -170,7 +172,11 @@ func (s *DispersalServerV2) validateDispersalRequest( return errors.New("payment metadata is required") } - if len(blobHeader.PaymentMetadata.AccountID) == 0 || (blobHeader.PaymentMetadata.ReservationPeriod == 0 && blobHeader.PaymentMetadata.CumulativePayment.Cmp(big.NewInt(0)) == 0) { + accountIdIsEmpty := len(blobHeader.PaymentMetadata.AccountID) == 0 + timestampIsNegative := blobHeader.PaymentMetadata.Timestamp < 0 + paymentIsNegative := blobHeader.PaymentMetadata.CumulativePayment.Cmp(big.NewInt(0)) == -1 + timestampIsZeroAndPaymentIsZero := blobHeader.PaymentMetadata.Timestamp == 0 && blobHeader.PaymentMetadata.CumulativePayment.Cmp(big.NewInt(0)) == 0 + if accountIdIsEmpty || timestampIsNegative || paymentIsNegative || timestampIsZeroAndPaymentIsZero { return errors.New("invalid payment metadata") } diff --git a/disperser/apiserver/server_v2.go b/disperser/apiserver/server_v2.go index 91e61e7024..2804d37719 100644 --- a/disperser/apiserver/server_v2.go +++ b/disperser/apiserver/server_v2.go @@ -287,7 +287,7 @@ func (s *DispersalServerV2) GetPaymentState(ctx context.Context, req *pb.GetPaym reservationWindow := s.meterer.ChainPaymentState.GetReservationWindow() // off-chain account specific payment state - now := uint64(time.Now().Unix()) + now := time.Now().Unix() currentReservationPeriod := meterer.GetReservationPeriod(now, reservationWindow) periodRecords, err := s.meterer.OffchainStore.GetPeriodRecords(ctx, req.AccountId, currentReservationPeriod) if err != nil { diff --git a/disperser/apiserver/server_v2_test.go b/disperser/apiserver/server_v2_test.go index 84358c8a97..86017dcab3 100644 --- a/disperser/apiserver/server_v2_test.go +++ b/disperser/apiserver/server_v2_test.go @@ -4,13 +4,14 @@ import ( "context" "crypto/rand" "fmt" - "github.com/Layr-Labs/eigenda/common/testutils/random" "math/big" "net" "strings" "testing" "time" + "github.com/Layr-Labs/eigenda/common/testutils/random" + "github.com/prometheus/client_golang/prometheus" "github.com/Layr-Labs/eigenda/common/aws" @@ -68,11 +69,12 @@ func TestV2DisperseBlob(t *testing.T) { Commitment: commitmentProto, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: accountID, - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100).Bytes(), }, } blobHeader, err := corev2.BlobHeaderFromProtobuf(blobHeaderProto) + fmt.Println("blobHeader", blobHeader) assert.NoError(t, err) signer, err := auth.NewLocalBlobRequestSigner(privateKeyHex) assert.NoError(t, err) @@ -137,7 +139,7 @@ func TestV2DisperseBlobRequestValidation(t *testing.T) { QuorumNumbers: []uint32{0, 1}, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: accountID, - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100).Bytes(), }, } @@ -157,7 +159,7 @@ func TestV2DisperseBlobRequestValidation(t *testing.T) { Commitment: commitmentProto, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: accountID, - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100).Bytes(), }, } @@ -175,7 +177,7 @@ func TestV2DisperseBlobRequestValidation(t *testing.T) { Commitment: commitmentProto, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: accountID, - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100).Bytes(), }, } @@ -193,7 +195,7 @@ func TestV2DisperseBlobRequestValidation(t *testing.T) { Commitment: commitmentProto, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: accountID, - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100).Bytes(), }, } @@ -210,7 +212,7 @@ func TestV2DisperseBlobRequestValidation(t *testing.T) { Commitment: commitmentProto, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: accountID, - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100).Bytes(), }, } @@ -229,7 +231,7 @@ func TestV2DisperseBlobRequestValidation(t *testing.T) { Commitment: commitmentProto, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: accountID, - ReservationPeriod: 0, + Timestamp: 0, CumulativePayment: big.NewInt(0).Bytes(), }, } @@ -254,7 +256,7 @@ func TestV2DisperseBlobRequestValidation(t *testing.T) { Commitment: invalidCommitment, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: accountID, - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100).Bytes(), }, } @@ -284,7 +286,7 @@ func TestV2DisperseBlobRequestValidation(t *testing.T) { Commitment: commitmentProto, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: accountID, - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100).Bytes(), }, } @@ -310,7 +312,7 @@ func TestV2GetBlobStatus(t *testing.T) { QuorumNumbers: []core.QuorumID{0}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x1234", - ReservationPeriod: 0, + Timestamp: 0, CumulativePayment: big.NewInt(532), }, } @@ -580,7 +582,7 @@ func TestInvalidLength(t *testing.T) { Commitment: commitmentProto, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: accountID, - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100).Bytes(), }, } @@ -631,7 +633,7 @@ func TestTooShortCommitment(t *testing.T) { Commitment: commitmentProto, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: accountID, - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100).Bytes(), }, } diff --git a/disperser/common/v2/blobstore/dynamo_metadata_store.go b/disperser/common/v2/blobstore/dynamo_metadata_store.go index 7fddb1156b..93624edca4 100644 --- a/disperser/common/v2/blobstore/dynamo_metadata_store.go +++ b/disperser/common/v2/blobstore/dynamo_metadata_store.go @@ -169,6 +169,7 @@ func NewBlobMetadataStore(dynamoDBClient commondynamodb.Client, logger logging.L } func (s *BlobMetadataStore) PutBlobMetadata(ctx context.Context, blobMetadata *v2.BlobMetadata) error { + s.logger.Debug("store put blob metadata", "blobMetadata", blobMetadata) item, err := MarshalBlobMetadata(blobMetadata) if err != nil { return err diff --git a/disperser/common/v2/blobstore/dynamo_metadata_store_test.go b/disperser/common/v2/blobstore/dynamo_metadata_store_test.go index 4f931e3b8d..890022ca81 100644 --- a/disperser/common/v2/blobstore/dynamo_metadata_store_test.go +++ b/disperser/common/v2/blobstore/dynamo_metadata_store_test.go @@ -933,7 +933,7 @@ func TestBlobMetadataStoreCerts(t *testing.T) { BlobCommitments: mockCommitment, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x123", - ReservationPeriod: uint32(i), + Timestamp: int64(i), CumulativePayment: big.NewInt(321), }, }, @@ -951,14 +951,14 @@ func TestBlobMetadataStoreCerts(t *testing.T) { assert.NoError(t, err) assert.Len(t, certs, numCerts) assert.Len(t, fragmentInfos, numCerts) - reservationPeriodes := make(map[uint32]struct{}) + timestamps := make(map[int64]struct{}) for i := 0; i < numCerts; i++ { assert.Equal(t, fragmentInfos[i], fragmentInfo) - reservationPeriodes[certs[i].BlobHeader.PaymentMetadata.ReservationPeriod] = struct{}{} + timestamps[certs[i].BlobHeader.PaymentMetadata.Timestamp] = struct{}{} } - assert.Len(t, reservationPeriodes, numCerts) + assert.Len(t, timestamps, numCerts) for i := 0; i < numCerts; i++ { - assert.Contains(t, reservationPeriodes, uint32(i)) + assert.Contains(t, timestamps, int64(i)) } deleteItems(t, []commondynamodb.Key{ @@ -1376,8 +1376,7 @@ func newBlob(t *testing.T) (corev2.BlobKey, *corev2.BlobHeader) { _, err := rand.Read(accountBytes) require.NoError(t, err) accountID := hex.EncodeToString(accountBytes) - reservationPeriod, err := rand.Int(rand.Reader, big.NewInt(256)) - require.NoError(t, err) + timestamp := time.Now().UnixNano() cumulativePayment, err := rand.Int(rand.Reader, big.NewInt(1024)) require.NoError(t, err) sig := make([]byte, 32) @@ -1389,7 +1388,7 @@ func newBlob(t *testing.T) (corev2.BlobKey, *corev2.BlobHeader) { BlobCommitments: mockCommitment, PaymentMetadata: core.PaymentMetadata{ AccountID: accountID, - ReservationPeriod: uint32(reservationPeriod.Int64()), + Timestamp: timestamp, CumulativePayment: cumulativePayment, }, } diff --git a/disperser/controller/controller_test.go b/disperser/controller/controller_test.go index 1444938d44..6d99cccb79 100644 --- a/disperser/controller/controller_test.go +++ b/disperser/controller/controller_test.go @@ -159,7 +159,7 @@ func newBlob(t *testing.T, quorumNumbers []core.QuorumID) (corev2.BlobKey, *core _, err := rand.Read(accountBytes) require.NoError(t, err) accountID := hex.EncodeToString(accountBytes) - reservationPeriod, err := rand.Int(rand.Reader, big.NewInt(256)) + timestamp, err := rand.Int(rand.Reader, big.NewInt(256)) require.NoError(t, err) cumulativePayment, err := rand.Int(rand.Reader, big.NewInt(1024)) require.NoError(t, err) @@ -172,7 +172,7 @@ func newBlob(t *testing.T, quorumNumbers []core.QuorumID) (corev2.BlobKey, *core BlobCommitments: mockCommitment, PaymentMetadata: core.PaymentMetadata{ AccountID: accountID, - ReservationPeriod: uint32(reservationPeriod.Int64()), + Timestamp: timestamp.Int64(), CumulativePayment: cumulativePayment, }, } diff --git a/disperser/controller/dispatcher_test.go b/disperser/controller/dispatcher_test.go index 436da9a988..dc3e513c57 100644 --- a/disperser/controller/dispatcher_test.go +++ b/disperser/controller/dispatcher_test.go @@ -425,7 +425,7 @@ func TestDispatcherBuildMerkleTree(t *testing.T) { BlobCommitments: mockCommitment, PaymentMetadata: core.PaymentMetadata{ AccountID: "account 1", - ReservationPeriod: 0, + Timestamp: 0, CumulativePayment: big.NewInt(532), }, }, @@ -439,7 +439,7 @@ func TestDispatcherBuildMerkleTree(t *testing.T) { BlobCommitments: mockCommitment, PaymentMetadata: core.PaymentMetadata{ AccountID: "account 2", - ReservationPeriod: 0, + Timestamp: 0, CumulativePayment: big.NewInt(532), }, }, diff --git a/disperser/dataapi/docs/v2/V2_swagger.json b/disperser/dataapi/docs/v2/V2_swagger.json index 53bd7a900e..ebea1f42c1 100644 --- a/disperser/dataapi/docs/v2/V2_swagger.json +++ b/disperser/dataapi/docs/v2/V2_swagger.json @@ -876,10 +876,6 @@ "items": { "type": "integer" } - }, - "salt": { - "description": "Salt is used to make blob intentionally unique when everything else is the same", - "type": "integer" } } }, diff --git a/disperser/dataapi/docs/v2/V2_swagger.yaml b/disperser/dataapi/docs/v2/V2_swagger.yaml index 658db39a49..9d3a4d77f7 100644 --- a/disperser/dataapi/docs/v2/V2_swagger.yaml +++ b/disperser/dataapi/docs/v2/V2_swagger.yaml @@ -156,10 +156,6 @@ definitions: items: type: integer type: array - salt: - description: Salt is used to make blob intentionally unique when everything - else is the same - type: integer type: object github_com_Layr-Labs_eigenda_core_v2.BlobInclusionInfo: properties: diff --git a/disperser/dataapi/v2/server_v2_test.go b/disperser/dataapi/v2/server_v2_test.go index cfeab84810..16030aeaa2 100644 --- a/disperser/dataapi/v2/server_v2_test.go +++ b/disperser/dataapi/v2/server_v2_test.go @@ -259,9 +259,7 @@ func makeBlobHeaderV2(t *testing.T) *corev2.BlobHeader { _, err := rand.Read(accountBytes) require.NoError(t, err) accountID := hex.EncodeToString(accountBytes) - reservationPeriod, err := rand.Int(rand.Reader, big.NewInt(42)) - require.NoError(t, err) - salt, err := rand.Int(rand.Reader, big.NewInt(1000)) + timestamp, err := rand.Int(rand.Reader, big.NewInt(42)) require.NoError(t, err) cumulativePayment, err := rand.Int(rand.Reader, big.NewInt(123)) require.NoError(t, err) @@ -274,10 +272,9 @@ func makeBlobHeaderV2(t *testing.T) *corev2.BlobHeader { BlobCommitments: makeCommitment(t), PaymentMetadata: core.PaymentMetadata{ AccountID: accountID, - ReservationPeriod: uint32(reservationPeriod.Int64()), + Timestamp: timestamp.Int64(), CumulativePayment: cumulativePayment, }, - Salt: uint32(salt.Int64()), } } @@ -359,7 +356,7 @@ func TestFetchBlob(t *testing.T) { assert.Equal(t, "Queued", response.Status) assert.Equal(t, uint16(0), response.BlobHeader.BlobVersion) assert.Equal(t, blobHeader.PaymentMetadata.AccountID, response.BlobHeader.PaymentMetadata.AccountID) - assert.Equal(t, blobHeader.PaymentMetadata.ReservationPeriod, response.BlobHeader.PaymentMetadata.ReservationPeriod) + assert.Equal(t, blobHeader.PaymentMetadata.Timestamp, response.BlobHeader.PaymentMetadata.Timestamp) assert.Equal(t, blobHeader.PaymentMetadata.CumulativePayment, response.BlobHeader.PaymentMetadata.CumulativePayment) } diff --git a/disperser/encoder/server_v2_test.go b/disperser/encoder/server_v2_test.go index 1a08f6daff..349aaa1c60 100644 --- a/disperser/encoder/server_v2_test.go +++ b/disperser/encoder/server_v2_test.go @@ -205,7 +205,7 @@ func createTestBlobHeader(t *testing.T) *corev2.BlobHeader { BlobCommitments: mockCommitment, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x1234", - ReservationPeriod: 0, + Timestamp: 0, CumulativePayment: big.NewInt(532), }, } diff --git a/inabox/tests/integration_v2_test.go b/inabox/tests/integration_v2_test.go index 1487ebd54a..8dfa18abbd 100644 --- a/inabox/tests/integration_v2_test.go +++ b/inabox/tests/integration_v2_test.go @@ -52,13 +52,13 @@ var _ = Describe("Inabox v2 Integration", func() { paddedData1 := codec.ConvertByPaddingEmptyByte(data1) paddedData2 := codec.ConvertByPaddingEmptyByte(data2) - blobStatus1, key1, err := disp.DisperseBlob(ctx, paddedData1, 0, []uint8{0, 1}, 0) + blobStatus1, key1, err := disp.DisperseBlob(ctx, paddedData1, 0, []uint8{0, 1}) Expect(err).To(BeNil()) Expect(key1).To(Not(BeNil())) Expect(blobStatus1).To(Not(BeNil())) Expect(*blobStatus1).To(Equal(dispv2.Queued)) - blobStatus2, key2, err := disp.DisperseBlob(ctx, paddedData2, 0, []uint8{0, 1}, 0) + blobStatus2, key2, err := disp.DisperseBlob(ctx, paddedData2, 0, []uint8{0, 1}) Expect(err).To(BeNil()) Expect(key2).To(Not(BeNil())) Expect(blobStatus2).To(Not(BeNil())) @@ -351,7 +351,6 @@ func convertBlobInclusionInfo(inclusionInfo *disperserpb.BlobInclusionInfo) (*ve Length: uint32(blobCertificate.BlobHeader.BlobCommitments.Length), }, PaymentHeaderHash: paymentHeaderHash, - Salt: blobCertificate.BlobHeader.Salt, }, Signature: blobCertificate.Signature, RelayKeys: blobCertificate.RelayKeys, diff --git a/node/auth/request_signing_test.go b/node/auth/request_signing_test.go index 0244a20acf..94e3f36988 100644 --- a/node/auth/request_signing_test.go +++ b/node/auth/request_signing_test.go @@ -116,10 +116,10 @@ func TestHashing(t *testing.T) { hash = hashing.HashStoreChunksRequest(request) require.NotEqual(t, originalRequestHash, hash) - // within a blob cert, modify the PaymentHeader.ReservationPeriod + // within a blob cert, modify the PaymentHeader.Timestamp rand.Reset() request = RandomStoreChunksRequest(rand) - request.Batch.BlobCertificates[0].BlobHeader.PaymentHeader.ReservationPeriod = rand.Uint32() + request.Batch.BlobCertificates[0].BlobHeader.PaymentHeader.Timestamp = rand.Time().UnixMicro() hash = hashing.HashStoreChunksRequest(request) require.NotEqual(t, originalRequestHash, hash) @@ -130,13 +130,6 @@ func TestHashing(t *testing.T) { hash = hashing.HashStoreChunksRequest(request) require.NotEqual(t, originalRequestHash, hash) - // within a blob cert, modify the PaymentHeader.Salt - rand.Reset() - request = RandomStoreChunksRequest(rand) - request.Batch.BlobCertificates[0].BlobHeader.Salt = rand.Uint32() - hash = hashing.HashStoreChunksRequest(request) - require.NotEqual(t, originalRequestHash, hash) - // within a blob cert, modify the Signature rand.Reset() request = RandomStoreChunksRequest(rand) diff --git a/node/auth/request_signing_test_utils.go b/node/auth/request_signing_test_utils.go index 08c919a4f5..ff9b9a28f4 100644 --- a/node/auth/request_signing_test_utils.go +++ b/node/auth/request_signing_test_utils.go @@ -36,10 +36,9 @@ func RandomStoreChunksRequest(rand *random.TestRandom) *grpc.StoreChunksRequest }, PaymentHeader: &v2.PaymentHeader{ AccountId: rand.String(32), - ReservationPeriod: rand.Uint32(), + Timestamp: rand.Time().UnixMicro(), CumulativePayment: rand.Bytes(32), }, - Salt: rand.Uint32(), }, Signature: rand.Bytes(32), RelayKeys: relays, diff --git a/node/mock/testdata.go b/node/mock/testdata.go index 36d0067f6b..5c6f2f80a1 100644 --- a/node/mock/testdata.go +++ b/node/mock/testdata.go @@ -21,7 +21,7 @@ func MockBatch(t *testing.T) ([]v2.BlobKey, *v2.Batch, []map[core.QuorumID]core. QuorumNumbers: []core.QuorumID{0, 1}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x123", - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100), }, } @@ -31,7 +31,7 @@ func MockBatch(t *testing.T) ([]v2.BlobKey, *v2.Batch, []map[core.QuorumID]core. QuorumNumbers: []core.QuorumID{0, 1}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x456", - ReservationPeriod: 6, + Timestamp: 6, CumulativePayment: big.NewInt(200), }, } @@ -41,7 +41,7 @@ func MockBatch(t *testing.T) ([]v2.BlobKey, *v2.Batch, []map[core.QuorumID]core. QuorumNumbers: []core.QuorumID{1, 2}, PaymentMetadata: core.PaymentMetadata{ AccountID: "0x789", - ReservationPeriod: 7, + Timestamp: 7, CumulativePayment: big.NewInt(300), }, } diff --git a/relay/relay_test_utils.go b/relay/relay_test_utils.go index 956ac74d41..d30d5e1fe8 100644 --- a/relay/relay_test_utils.go +++ b/relay/relay_test_utils.go @@ -211,7 +211,7 @@ func randomBlob(t *testing.T) (*v2.BlobHeader, []byte) { Commitment: commitmentProto, PaymentHeader: &pbcommonv2.PaymentHeader{ AccountId: tu.RandomString(10), - ReservationPeriod: 5, + Timestamp: 5, CumulativePayment: big.NewInt(100).Bytes(), }, } diff --git a/test/v2/client/test_client.go b/test/v2/client/test_client.go index 8082dd90ae..9ae62bd63a 100644 --- a/test/v2/client/test_client.go +++ b/test/v2/client/test_client.go @@ -395,10 +395,10 @@ func (c *TestClient) DisperseAndVerify( ctx context.Context, quorums []core.QuorumID, payload []byte, - salt uint32) error { +) error { start := time.Now() - eigenDACert, err := c.DispersePayload(ctx, quorums, payload, salt) + eigenDACert, err := c.DispersePayload(ctx, quorums, payload) if err != nil { return fmt.Errorf("failed to disperse payload: %w", err) } @@ -459,7 +459,7 @@ func (c *TestClient) DispersePayload( ctx context.Context, quorums []core.QuorumID, payload []byte, - salt uint32) (*verification.EigenDACert, error) { +) (*verification.EigenDACert, error) { c.logger.Debugf("Dispersing payload of length %d", len(payload)) start := time.Now() @@ -468,7 +468,7 @@ func (c *TestClient) DispersePayload( if err != nil { return nil, fmt.Errorf("failed to get payload disperser: %w", err) } - cert, err := payloadDisperser.SendPayload(ctx, payload, salt) + cert, err := payloadDisperser.SendPayload(ctx, payload) if err != nil { return nil, fmt.Errorf("failed to disperse payload: %w", err) diff --git a/test/v2/correctness/correctness_test.go b/test/v2/correctness/correctness_test.go index b44b90af57..0c7c8fd88e 100644 --- a/test/v2/correctness/correctness_test.go +++ b/test/v2/correctness/correctness_test.go @@ -35,7 +35,7 @@ func testBasicDispersal( ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) defer cancel() - err := c.DisperseAndVerify(ctx, quorums, payload, rand.Uint32()) + err := c.DisperseAndVerify(ctx, quorums, payload) if err != nil { return fmt.Errorf("failed to disperse and verify: %v", err) } @@ -46,7 +46,6 @@ func testBasicDispersal( // Disperse a 0 byte blob. // Empty blobs are not allowed by the disperser func TestEmptyBlobDispersal(t *testing.T) { - rand := random.NewTestRandom(t) blobBytes := []byte{} quorums := []core.QuorumID{0, 1} @@ -57,7 +56,7 @@ func TestEmptyBlobDispersal(t *testing.T) { // We have to use the disperser client directly, since it's not possible for the PayloadDisperser to // attempt dispersal of an empty blob // This should fail with "data is empty" error - _, _, err := c.GetDisperserClient().DisperseBlob(ctx, blobBytes, 0, quorums, rand.Uint32()) + _, _, err := c.GetDisperserClient().DisperseBlob(ctx, blobBytes, 0, quorums) require.Error(t, err) require.ErrorContains(t, err, "blob size must be greater than 0") } @@ -162,12 +161,11 @@ func TestDoubleDispersal(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) defer cancel() - salt := rand.Uint32() - err := c.DisperseAndVerify(ctx, quorums, payload, salt) + err := c.DisperseAndVerify(ctx, quorums, payload) require.NoError(t, err) // disperse again - err = c.DisperseAndVerify(ctx, quorums, payload, salt) + err = c.DisperseAndVerify(ctx, quorums, payload) require.Error(t, err) require.True(t, strings.Contains(err.Error(), "blob already exists")) } @@ -182,7 +180,7 @@ func TestUnauthorizedGetChunks(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) defer cancel() - eigenDACert, err := c.DispersePayload(ctx, quorums, payload, rand.Uint32()) + eigenDACert, err := c.DispersePayload(ctx, quorums, payload) require.NoError(t, err) blobKey, err := eigenDACert.ComputeBlobKey() @@ -231,7 +229,7 @@ func TestDispersalWithInvalidSignature(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) defer cancel() - _, _, err = disperserClient.DisperseBlob(ctx, paddedPayload, 0, quorums, rand.Uint32()) + _, _, err = disperserClient.DisperseBlob(ctx, paddedPayload, 0, quorums) require.Error(t, err) require.Contains(t, err.Error(), "error accounting blob") } diff --git a/test/v2/load/load_generator.go b/test/v2/load/load_generator.go index 9d98623ab1..0db3ded9c5 100644 --- a/test/v2/load/load_generator.go +++ b/test/v2/load/load_generator.go @@ -4,12 +4,12 @@ import ( "context" "encoding/json" "fmt" - "github.com/docker/go-units" - "math/rand" "os" "sync/atomic" "time" + "github.com/docker/go-units" + "github.com/Layr-Labs/eigenda/api/clients/v2/verification" "github.com/Layr-Labs/eigenda/common/testutils/random" "github.com/Layr-Labs/eigenda/test/v2/client" @@ -139,7 +139,7 @@ func (l *LoadGenerator) submitBlob() { float64(l.client.GetConfig().MaxBlobSize+1))) payload := l.rand.Bytes(payloadSize) - eigenDACert, err := l.client.DispersePayload(ctx, l.config.Quorums, payload, rand.Uint32()) + eigenDACert, err := l.client.DispersePayload(ctx, l.config.Quorums, payload) if err != nil { fmt.Printf("failed to disperse blob: %v\n", err) return diff --git a/tools/traffic/workers/blob_writer.go b/tools/traffic/workers/blob_writer.go index 03f759cd77..b8d10bf3b0 100644 --- a/tools/traffic/workers/blob_writer.go +++ b/tools/traffic/workers/blob_writer.go @@ -209,7 +209,6 @@ func (writer *BlobWriter) sendRequest(data []byte) (key v2.BlobKey, err error) { data, 0, customQuorums, - 0, ) if err != nil { writer.logger.Error("failed to send blob request", "name", writer.name, "err", err) diff --git a/tools/traffic/workers/blob_writer_test.go b/tools/traffic/workers/blob_writer_test.go index 2d0bfab82d..90808297ed 100644 --- a/tools/traffic/workers/blob_writer_test.go +++ b/tools/traffic/workers/blob_writer_test.go @@ -78,7 +78,6 @@ func TestBlobWriter(t *testing.T) { mock.AnythingOfType("[]uint8"), mock.AnythingOfType("uint16"), mock.AnythingOfType("[]uint8"), - mock.AnythingOfType("uint32"), ).Return(&status, keyToReturn, errorToReturn) // Simulate the advancement of time (i.e. allow the writer to write the next blob). diff --git a/tools/traffic/workers/mock_disperser.go b/tools/traffic/workers/mock_disperser.go index ae0e0f7c29..c1b4758923 100644 --- a/tools/traffic/workers/mock_disperser.go +++ b/tools/traffic/workers/mock_disperser.go @@ -22,9 +22,9 @@ func (m *MockDisperserClient) DisperseBlob( data []byte, blobVersion corev2.BlobVersion, quorums []core.QuorumID, - salt uint32) (*dispv2.BlobStatus, corev2.BlobKey, error) { +) (*dispv2.BlobStatus, corev2.BlobKey, error) { - args := m.mock.Called(ctx, data, blobVersion, quorums, salt) + args := m.mock.Called(ctx, data, blobVersion, quorums) return args.Get(0).(*dispv2.BlobStatus), args.Get(1).(corev2.BlobKey), args.Error(2) }