From 6a7d39eff52322e62f466ec2c35c165aa08718f6 Mon Sep 17 00:00:00 2001 From: Jinsuk Park Date: Fri, 23 Feb 2024 15:05:40 -0800 Subject: [PATCH 1/5] suave_structs.go: Marshal bytes to hexstring - current: []byte field marshals to base64 string - to be: BuildBlockArgs and DataRecord structs now use hexutil.Big and hexutil.Bytes for uint64 and []byte fields respectively --- core/types/suave_structs.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/core/types/suave_structs.go b/core/types/suave_structs.go index 0307f5fae..ff6838d9f 100755 --- a/core/types/suave_structs.go +++ b/core/types/suave_structs.go @@ -3,21 +3,26 @@ package types import "github.com/ethereum/go-ethereum/common" +import "github.com/ethereum/go-ethereum/common/hexutil" type DataId [16]byte +func (d DataId) MarshalText() ([]byte, error) { + return hexutil.Bytes(d[:]).MarshalText() +} + // Structs type BuildBlockArgs struct { - Slot uint64 - ProposerPubkey []byte + Slot hexutil.Big + ProposerPubkey hexutil.Bytes Parent common.Hash Timestamp uint64 FeeRecipient common.Address GasLimit uint64 Random common.Hash Withdrawals []*Withdrawal - Extra []byte + Extra hexutil.Bytes BeaconRoot common.Hash FillPending bool } @@ -25,7 +30,7 @@ type BuildBlockArgs struct { type DataRecord struct { Id DataId Salt DataId - DecryptionCondition uint64 + DecryptionCondition hexutil.Big AllowedPeekers []common.Address AllowedStores []common.Address Version string From 90c099ec55f1505dd357d37fe01e0b1d1040db17 Mon Sep 17 00:00:00 2001 From: Jinsuk Park Date: Fri, 23 Feb 2024 23:29:41 -0800 Subject: [PATCH 2/5] Json Marshal / Unmarshal for suave_structs --- Makefile | 4 + core/types/gen_build_block_args_json.go | 97 ++++++++++++++++++++++ core/types/gen_data_record_json.go | 67 +++++++++++++++ core/types/gen_http_request_json.go | 60 +++++++++++++ core/types/gen_simulated_log_json.go | 49 +++++++++++ core/types/suave_structs.go | 50 +++++++---- core/types/withdrawal.go | 9 ++ core/vm/contracts_suave_runtime_adapter.go | 2 +- suave/artifacts/SuaveLib.json | 2 +- suave/artifacts/addresses.go | 2 +- suave/gen/main.go | 45 ++++++++-- suave/gen/suave_spec.yaml | 10 --- suave/sol/libraries/Suave.sol | 7 -- 13 files changed, 360 insertions(+), 44 deletions(-) create mode 100644 core/types/gen_build_block_args_json.go create mode 100644 core/types/gen_data_record_json.go create mode 100644 core/types/gen_http_request_json.go create mode 100644 core/types/gen_simulated_log_json.go diff --git a/Makefile b/Makefile index 7b91be935..20cbbc4ed 100644 --- a/Makefile +++ b/Makefile @@ -45,6 +45,10 @@ devtools: suavedevtools: go run ./suave/gen/main.go -write + cd core/types; go run github.com/fjl/gencodec -type BuildBlockArgs -field-override buildBlockArgsMarshaling -out gen_build_block_args_json.go + cd core/types; go run github.com/fjl/gencodec -type DataRecord -field-override dataRecordMarshaling -out gen_data_record_json.go + cd core/types; go run github.com/fjl/gencodec -type HttpRequest -field-override httpRequestMarshaling -out gen_http_request_json.go + cd core/types; go run github.com/fjl/gencodec -type SimulatedLog -field-override simulatedLogMarshaling -out gen_simulated_log_json.go devnet-up: docker-compose -f ./suave/devenv/docker-compose.yml up -d --build diff --git a/core/types/gen_build_block_args_json.go b/core/types/gen_build_block_args_json.go new file mode 100644 index 000000000..6bf4be4a6 --- /dev/null +++ b/core/types/gen_build_block_args_json.go @@ -0,0 +1,97 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package types + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var _ = (*buildBlockArgsMarshaling)(nil) + +// MarshalJSON marshals as JSON. +func (b BuildBlockArgs) MarshalJSON() ([]byte, error) { + type BuildBlockArgs struct { + Slot hexutil.Uint64 + ProposerPubkey hexutil.Bytes + Parent common.Hash + Timestamp hexutil.Uint64 + FeeRecipient common.Address + GasLimit hexutil.Uint64 + Random common.Hash + Withdrawals []*Withdrawal + Extra hexutil.Bytes + BeaconRoot common.Hash + FillPending bool + } + var enc BuildBlockArgs + enc.Slot = hexutil.Uint64(b.Slot) + enc.ProposerPubkey = b.ProposerPubkey + enc.Parent = b.Parent + enc.Timestamp = hexutil.Uint64(b.Timestamp) + enc.FeeRecipient = b.FeeRecipient + enc.GasLimit = hexutil.Uint64(b.GasLimit) + enc.Random = b.Random + enc.Withdrawals = b.Withdrawals + enc.Extra = b.Extra + enc.BeaconRoot = b.BeaconRoot + enc.FillPending = b.FillPending + return json.Marshal(&enc) +} + +// UnmarshalJSON unmarshals from JSON. +func (b *BuildBlockArgs) UnmarshalJSON(input []byte) error { + type BuildBlockArgs struct { + Slot *hexutil.Uint64 + ProposerPubkey *hexutil.Bytes + Parent *common.Hash + Timestamp *hexutil.Uint64 + FeeRecipient *common.Address + GasLimit *hexutil.Uint64 + Random *common.Hash + Withdrawals []*Withdrawal + Extra *hexutil.Bytes + BeaconRoot *common.Hash + FillPending *bool + } + var dec BuildBlockArgs + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.Slot != nil { + b.Slot = uint64(*dec.Slot) + } + if dec.ProposerPubkey != nil { + b.ProposerPubkey = *dec.ProposerPubkey + } + if dec.Parent != nil { + b.Parent = *dec.Parent + } + if dec.Timestamp != nil { + b.Timestamp = uint64(*dec.Timestamp) + } + if dec.FeeRecipient != nil { + b.FeeRecipient = *dec.FeeRecipient + } + if dec.GasLimit != nil { + b.GasLimit = uint64(*dec.GasLimit) + } + if dec.Random != nil { + b.Random = *dec.Random + } + if dec.Withdrawals != nil { + b.Withdrawals = dec.Withdrawals + } + if dec.Extra != nil { + b.Extra = *dec.Extra + } + if dec.BeaconRoot != nil { + b.BeaconRoot = *dec.BeaconRoot + } + if dec.FillPending != nil { + b.FillPending = *dec.FillPending + } + return nil +} diff --git a/core/types/gen_data_record_json.go b/core/types/gen_data_record_json.go new file mode 100644 index 000000000..b2176b6aa --- /dev/null +++ b/core/types/gen_data_record_json.go @@ -0,0 +1,67 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package types + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var _ = (*dataRecordMarshaling)(nil) + +// MarshalJSON marshals as JSON. +func (d DataRecord) MarshalJSON() ([]byte, error) { + type DataRecord struct { + Id DataId + Salt DataId + DecryptionCondition hexutil.Uint64 + AllowedPeekers []common.Address + AllowedStores []common.Address + Version string + } + var enc DataRecord + enc.Id = d.Id + enc.Salt = d.Salt + enc.DecryptionCondition = hexutil.Uint64(d.DecryptionCondition) + enc.AllowedPeekers = d.AllowedPeekers + enc.AllowedStores = d.AllowedStores + enc.Version = d.Version + return json.Marshal(&enc) +} + +// UnmarshalJSON unmarshals from JSON. +func (d *DataRecord) UnmarshalJSON(input []byte) error { + type DataRecord struct { + Id *DataId + Salt *DataId + DecryptionCondition *hexutil.Uint64 + AllowedPeekers []common.Address + AllowedStores []common.Address + Version *string + } + var dec DataRecord + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.Id != nil { + d.Id = *dec.Id + } + if dec.Salt != nil { + d.Salt = *dec.Salt + } + if dec.DecryptionCondition != nil { + d.DecryptionCondition = uint64(*dec.DecryptionCondition) + } + if dec.AllowedPeekers != nil { + d.AllowedPeekers = dec.AllowedPeekers + } + if dec.AllowedStores != nil { + d.AllowedStores = dec.AllowedStores + } + if dec.Version != nil { + d.Version = *dec.Version + } + return nil +} diff --git a/core/types/gen_http_request_json.go b/core/types/gen_http_request_json.go new file mode 100644 index 000000000..4928a4b6f --- /dev/null +++ b/core/types/gen_http_request_json.go @@ -0,0 +1,60 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package types + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var _ = (*httpRequestMarshaling)(nil) + +// MarshalJSON marshals as JSON. +func (h HttpRequest) MarshalJSON() ([]byte, error) { + type HttpRequest struct { + Url string + Method string + Headers []string + Body hexutil.Bytes + WithFlashbotsSignature bool + } + var enc HttpRequest + enc.Url = h.Url + enc.Method = h.Method + enc.Headers = h.Headers + enc.Body = h.Body + enc.WithFlashbotsSignature = h.WithFlashbotsSignature + return json.Marshal(&enc) +} + +// UnmarshalJSON unmarshals from JSON. +func (h *HttpRequest) UnmarshalJSON(input []byte) error { + type HttpRequest struct { + Url *string + Method *string + Headers []string + Body *hexutil.Bytes + WithFlashbotsSignature *bool + } + var dec HttpRequest + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.Url != nil { + h.Url = *dec.Url + } + if dec.Method != nil { + h.Method = *dec.Method + } + if dec.Headers != nil { + h.Headers = dec.Headers + } + if dec.Body != nil { + h.Body = *dec.Body + } + if dec.WithFlashbotsSignature != nil { + h.WithFlashbotsSignature = *dec.WithFlashbotsSignature + } + return nil +} diff --git a/core/types/gen_simulated_log_json.go b/core/types/gen_simulated_log_json.go new file mode 100644 index 000000000..54093f3e6 --- /dev/null +++ b/core/types/gen_simulated_log_json.go @@ -0,0 +1,49 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package types + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var _ = (*simulatedLogMarshaling)(nil) + +// MarshalJSON marshals as JSON. +func (s SimulatedLog) MarshalJSON() ([]byte, error) { + type SimulatedLog struct { + Data hexutil.Bytes + Addr common.Address + Topics []common.Hash + } + var enc SimulatedLog + enc.Data = s.Data + enc.Addr = s.Addr + enc.Topics = s.Topics + return json.Marshal(&enc) +} + +// UnmarshalJSON unmarshals from JSON. +func (s *SimulatedLog) UnmarshalJSON(input []byte) error { + type SimulatedLog struct { + Data *hexutil.Bytes + Addr *common.Address + Topics []common.Hash + } + var dec SimulatedLog + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.Data != nil { + s.Data = *dec.Data + } + if dec.Addr != nil { + s.Addr = *dec.Addr + } + if dec.Topics != nil { + s.Topics = dec.Topics + } + return nil +} diff --git a/core/types/suave_structs.go b/core/types/suave_structs.go index ff6838d9f..720a14f2a 100755 --- a/core/types/suave_structs.go +++ b/core/types/suave_structs.go @@ -1,41 +1,54 @@ // Code generated by suave/gen. DO NOT EDIT. -// Hash: 64563d17acef48bebfc901fe4b887d02b1efc267e269e9b2aec1fd02027a3f1a +// Hash: 9732c21c23a55aace13fb31d9845596592f7d212365c4a23db29a69477911496 package types -import "github.com/ethereum/go-ethereum/common" -import "github.com/ethereum/go-ethereum/common/hexutil" +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) type DataId [16]byte -func (d DataId) MarshalText() ([]byte, error) { - return hexutil.Bytes(d[:]).MarshalText() -} - // Structs type BuildBlockArgs struct { - Slot hexutil.Big - ProposerPubkey hexutil.Bytes + Slot uint64 + ProposerPubkey []byte Parent common.Hash Timestamp uint64 FeeRecipient common.Address GasLimit uint64 Random common.Hash Withdrawals []*Withdrawal - Extra hexutil.Bytes + Extra []byte BeaconRoot common.Hash FillPending bool } +type buildBlockArgsMarshaling struct { + Slot hexutil.Uint64 + ProposerPubkey hexutil.Bytes + + Timestamp hexutil.Uint64 + + GasLimit hexutil.Uint64 + + Extra hexutil.Bytes +} + type DataRecord struct { Id DataId Salt DataId - DecryptionCondition hexutil.Big + DecryptionCondition uint64 AllowedPeekers []common.Address AllowedStores []common.Address Version string } +type dataRecordMarshaling struct { + DecryptionCondition hexutil.Uint64 +} + type HttpRequest struct { Url string Method string @@ -44,6 +57,10 @@ type HttpRequest struct { WithFlashbotsSignature bool } +type httpRequestMarshaling struct { + Body hexutil.Bytes +} + type SimulateTransactionResult struct { Egp uint64 Logs []*SimulatedLog @@ -51,17 +68,18 @@ type SimulateTransactionResult struct { Error string } +type simulateTransactionResultMarshaling struct { + Egp hexutil.Uint64 +} + type SimulatedLog struct { Data []byte Addr common.Address Topics []common.Hash } -type Withdrawal struct { - Index uint64 - Validator uint64 - Address common.Address - Amount uint64 +type simulatedLogMarshaling struct { + Data hexutil.Bytes } type CryptoSignature uint8 diff --git a/core/types/withdrawal.go b/core/types/withdrawal.go index 712d7b6d5..d1ad918f9 100644 --- a/core/types/withdrawal.go +++ b/core/types/withdrawal.go @@ -19,6 +19,7 @@ package types import ( "bytes" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/rlp" ) @@ -26,6 +27,14 @@ import ( //go:generate go run github.com/fjl/gencodec -type Withdrawal -field-override withdrawalMarshaling -out gen_withdrawal_json.go //go:generate go run ../../rlp/rlpgen -type Withdrawal -out gen_withdrawal_rlp.go +// Withdrawal represents a validator withdrawal from the consensus layer. +type Withdrawal struct { + Index uint64 `json:"index"` // monotonically increasing identifier issued by consensus layer + Validator uint64 `json:"validatorIndex"` // index of validator associated with withdrawal + Address common.Address `json:"address"` // target address for withdrawn ether + Amount uint64 `json:"amount"` // value of withdrawal in Gwei +} + // field type overrides for gencodec type withdrawalMarshaling struct { Index hexutil.Uint64 diff --git a/core/vm/contracts_suave_runtime_adapter.go b/core/vm/contracts_suave_runtime_adapter.go index a98582136..9a8ca3d9f 100644 --- a/core/vm/contracts_suave_runtime_adapter.go +++ b/core/vm/contracts_suave_runtime_adapter.go @@ -1,5 +1,5 @@ // Code generated by suave/gen. DO NOT EDIT. -// Hash: 64563d17acef48bebfc901fe4b887d02b1efc267e269e9b2aec1fd02027a3f1a +// Hash: 9732c21c23a55aace13fb31d9845596592f7d212365c4a23db29a69477911496 package vm import ( diff --git a/suave/artifacts/SuaveLib.json b/suave/artifacts/SuaveLib.json index 22ee3ff6a..9856807e3 100644 --- a/suave/artifacts/SuaveLib.json +++ b/suave/artifacts/SuaveLib.json @@ -1 +1 @@ -[{"type":"error","name":"PeekerReverted","inputs":[{"name":"addr","type":"address"},{"name":"err","type":"bytes"}]},{"type":"function","name":"buildEthBlock","inputs":[{"name":"blockArgs","type":"tuple","internalType":"struct Suave.BuildBlockArgs","components":[{"name":"slot","type":"uint64","internalType":"uint64"},{"name":"proposerPubkey","type":"bytes","internalType":"bytes"},{"name":"parent","type":"bytes32","internalType":"bytes32"},{"name":"timestamp","type":"uint64","internalType":"uint64"},{"name":"feeRecipient","type":"address","internalType":"address"},{"name":"gasLimit","type":"uint64","internalType":"uint64"},{"name":"random","type":"bytes32","internalType":"bytes32"},{"name":"withdrawals","type":"tuple[]","internalType":"struct Suave.Withdrawal[]","components":[{"name":"index","type":"uint64","internalType":"uint64"},{"name":"validator","type":"uint64","internalType":"uint64"},{"name":"Address","type":"address","internalType":"address"},{"name":"amount","type":"uint64","internalType":"uint64"}]},{"name":"extra","type":"bytes","internalType":"bytes"},{"name":"beaconRoot","type":"bytes32","internalType":"bytes32"},{"name":"fillPending","type":"bool","internalType":"bool"}]},{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"namespace","type":"string","internalType":"string"}],"outputs":[{"name":"blockBid","type":"bytes","internalType":"bytes"},{"name":"executionPayload","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialInputs","outputs":[{"name":"confindentialData","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialRetrieve","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialStore","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"key","type":"string","internalType":"string"},{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"contextGet","inputs":[{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"doHTTPRequest","inputs":[{"name":"request","type":"tuple","internalType":"struct Suave.HttpRequest","components":[{"name":"url","type":"string","internalType":"string"},{"name":"method","type":"string","internalType":"string"},{"name":"headers","type":"string[]","internalType":"string[]"},{"name":"body","type":"bytes","internalType":"bytes"},{"name":"withFlashbotsSignature","type":"bool","internalType":"bool"}]}],"outputs":[{"name":"httpResponse","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"ethcall","inputs":[{"name":"contractAddr","type":"address","internalType":"address"},{"name":"input1","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"callOutput","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"extractHint","inputs":[{"name":"bundleData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"hints","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"fetchDataRecords","inputs":[{"name":"cond","type":"uint64","internalType":"uint64"},{"name":"namespace","type":"string","internalType":"string"}],"outputs":[{"name":"dataRecords","type":"tuple[]","internalType":"struct Suave.DataRecord[]","components":[{"name":"id","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"salt","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"version","type":"string","internalType":"string"}]}]},{"type":"function","name":"fillMevShareBundle","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"}],"outputs":[{"name":"encodedBundle","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"newBuilder","outputs":[{"name":"sessionid","type":"string","internalType":"string"}]},{"type":"function","name":"newDataRecord","inputs":[{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"dataType","type":"string","internalType":"string"}],"outputs":[{"name":"dataRecord","type":"tuple","internalType":"struct Suave.DataRecord","components":[{"name":"id","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"salt","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"version","type":"string","internalType":"string"}]}]},{"type":"function","name":"privateKeyGen","inputs":[{"name":"crypto","type":"uint8","internalType":"struct Suave.CryptoSignature"}],"outputs":[{"name":"privateKey","type":"string","internalType":"string"}]},{"type":"function","name":"signEthTransaction","inputs":[{"name":"txn","type":"bytes","internalType":"bytes"},{"name":"chainId","type":"string","internalType":"string"},{"name":"signingKey","type":"string","internalType":"string"}],"outputs":[{"name":"signedTxn","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"signMessage","inputs":[{"name":"digest","type":"bytes","internalType":"bytes"},{"name":"crypto","type":"uint8","internalType":"struct Suave.CryptoSignature"},{"name":"signingKey","type":"string","internalType":"string"}],"outputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"simulateBundle","inputs":[{"name":"bundleData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"effectiveGasPrice","type":"uint64","internalType":"uint64"}]},{"type":"function","name":"simulateTransaction","inputs":[{"name":"sessionid","type":"string","internalType":"string"},{"name":"txn","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"simulationResult","type":"tuple","internalType":"struct Suave.SimulateTransactionResult","components":[{"name":"egp","type":"uint64","internalType":"uint64"},{"name":"logs","type":"tuple[]","internalType":"struct Suave.SimulatedLog[]","components":[{"name":"data","type":"bytes","internalType":"bytes"},{"name":"addr","type":"address","internalType":"address"},{"name":"topics","type":"bytes32[]","internalType":"bytes32[]"}]},{"name":"success","type":"bool","internalType":"bool"},{"name":"error","type":"string","internalType":"string"}]}]},{"type":"function","name":"submitBundleJsonRPC","inputs":[{"name":"url","type":"string","internalType":"string"},{"name":"method","type":"string","internalType":"string"},{"name":"params","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"errorMessage","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"submitEthBlockToRelay","inputs":[{"name":"relayUrl","type":"string","internalType":"string"},{"name":"builderBid","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"blockBid","type":"bytes","internalType":"bytes"}]}] \ No newline at end of file +[{"type":"error","name":"PeekerReverted","inputs":[{"name":"addr","type":"address"},{"name":"err","type":"bytes"}]},{"type":"function","name":"buildEthBlock","inputs":[{"name":"blockArgs","type":"tuple","internalType":"struct Suave.BuildBlockArgs","components":[{"name":"slot","type":"uint64","internalType":"uint64"},{"name":"proposerPubkey","type":"bytes","internalType":"bytes"},{"name":"parent","type":"bytes32","internalType":"bytes32"},{"name":"timestamp","type":"uint64","internalType":"uint64"},{"name":"feeRecipient","type":"address","internalType":"address"},{"name":"gasLimit","type":"uint64","internalType":"uint64"},{"name":"random","type":"bytes32","internalType":"bytes32"},{"name":"withdrawals","type":"tuple[]","internalType":"struct Suave.Withdrawal[]"},{"name":"extra","type":"bytes","internalType":"bytes"},{"name":"beaconRoot","type":"bytes32","internalType":"bytes32"},{"name":"fillPending","type":"bool","internalType":"bool"}]},{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"namespace","type":"string","internalType":"string"}],"outputs":[{"name":"blockBid","type":"bytes","internalType":"bytes"},{"name":"executionPayload","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialInputs","outputs":[{"name":"confindentialData","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialRetrieve","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialStore","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"key","type":"string","internalType":"string"},{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"contextGet","inputs":[{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"doHTTPRequest","inputs":[{"name":"request","type":"tuple","internalType":"struct Suave.HttpRequest","components":[{"name":"url","type":"string","internalType":"string"},{"name":"method","type":"string","internalType":"string"},{"name":"headers","type":"string[]","internalType":"string[]"},{"name":"body","type":"bytes","internalType":"bytes"},{"name":"withFlashbotsSignature","type":"bool","internalType":"bool"}]}],"outputs":[{"name":"httpResponse","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"ethcall","inputs":[{"name":"contractAddr","type":"address","internalType":"address"},{"name":"input1","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"callOutput","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"extractHint","inputs":[{"name":"bundleData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"hints","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"fetchDataRecords","inputs":[{"name":"cond","type":"uint64","internalType":"uint64"},{"name":"namespace","type":"string","internalType":"string"}],"outputs":[{"name":"dataRecords","type":"tuple[]","internalType":"struct Suave.DataRecord[]","components":[{"name":"id","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"salt","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"version","type":"string","internalType":"string"}]}]},{"type":"function","name":"fillMevShareBundle","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"}],"outputs":[{"name":"encodedBundle","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"newBuilder","outputs":[{"name":"sessionid","type":"string","internalType":"string"}]},{"type":"function","name":"newDataRecord","inputs":[{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"dataType","type":"string","internalType":"string"}],"outputs":[{"name":"dataRecord","type":"tuple","internalType":"struct Suave.DataRecord","components":[{"name":"id","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"salt","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"version","type":"string","internalType":"string"}]}]},{"type":"function","name":"privateKeyGen","inputs":[{"name":"crypto","type":"uint8","internalType":"struct Suave.CryptoSignature"}],"outputs":[{"name":"privateKey","type":"string","internalType":"string"}]},{"type":"function","name":"signEthTransaction","inputs":[{"name":"txn","type":"bytes","internalType":"bytes"},{"name":"chainId","type":"string","internalType":"string"},{"name":"signingKey","type":"string","internalType":"string"}],"outputs":[{"name":"signedTxn","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"signMessage","inputs":[{"name":"digest","type":"bytes","internalType":"bytes"},{"name":"crypto","type":"uint8","internalType":"struct Suave.CryptoSignature"},{"name":"signingKey","type":"string","internalType":"string"}],"outputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"simulateBundle","inputs":[{"name":"bundleData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"effectiveGasPrice","type":"uint64","internalType":"uint64"}]},{"type":"function","name":"simulateTransaction","inputs":[{"name":"sessionid","type":"string","internalType":"string"},{"name":"txn","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"simulationResult","type":"tuple","internalType":"struct Suave.SimulateTransactionResult","components":[{"name":"egp","type":"uint64","internalType":"uint64"},{"name":"logs","type":"tuple[]","internalType":"struct Suave.SimulatedLog[]","components":[{"name":"data","type":"bytes","internalType":"bytes"},{"name":"addr","type":"address","internalType":"address"},{"name":"topics","type":"bytes32[]","internalType":"bytes32[]"}]},{"name":"success","type":"bool","internalType":"bool"},{"name":"error","type":"string","internalType":"string"}]}]},{"type":"function","name":"submitBundleJsonRPC","inputs":[{"name":"url","type":"string","internalType":"string"},{"name":"method","type":"string","internalType":"string"},{"name":"params","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"errorMessage","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"submitEthBlockToRelay","inputs":[{"name":"relayUrl","type":"string","internalType":"string"},{"name":"builderBid","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"blockBid","type":"bytes","internalType":"bytes"}]}] \ No newline at end of file diff --git a/suave/artifacts/addresses.go b/suave/artifacts/addresses.go index 2f8e71763..9f148e72f 100644 --- a/suave/artifacts/addresses.go +++ b/suave/artifacts/addresses.go @@ -1,5 +1,5 @@ // Code generated by suave/gen. DO NOT EDIT. -// Hash: 64563d17acef48bebfc901fe4b887d02b1efc267e269e9b2aec1fd02027a3f1a +// Hash: 9732c21c23a55aace13fb31d9845596592f7d212365c4a23db29a69477911496 package artifacts import ( diff --git a/suave/gen/main.go b/suave/gen/main.go index 31ff90b0e..85a740f95 100644 --- a/suave/gen/main.go +++ b/suave/gen/main.go @@ -39,10 +39,20 @@ func applyTemplate(templateText string, input desc, out string) error { return hex.EncodeToString(hash) }, "typ2": func(param interface{}) string { - return encodeTypeToGolang(param.(string), false, false) + return encodeTypeToGolang(param.(string), false, false, false) }, "typ3": func(param interface{}) string { - return encodeTypeToGolang(param.(string), true, true) + return encodeTypeToGolang(param.(string), true, true, false) + }, + "hextype": func(param interface{}) string { + return encodeTypeToGolang(param.(string), true, true, true) + }, + "isHex": func(param interface{}) bool { + typ := param.(string) + return typ == "bytes" || typ == "uint64" || typ == "uint256" + }, + "lower": func(param interface{}) string { + return strings.ToLower(param.(string)[0:1]) + param.(string)[1:] }, "title": func(param interface{}) string { return strings.Title(param.(string)) @@ -174,20 +184,26 @@ func main() { } } -func encodeTypeToGolang(str string, insideTypes bool, slicePointers bool) string { +func encodeTypeToGolang(str string, insideTypes bool, slicePointers bool, hexEncode bool) string { typ, err := abi.NewType(str, "", nil) if err == nil { // basic type that has an easy match with Go if typ.T == abi.SliceTy { - return "[]" + encodeTypeToGolang(typ.Elem.String(), insideTypes, slicePointers) + return "[]" + encodeTypeToGolang(typ.Elem.String(), insideTypes, slicePointers, hexEncode) } switch str { case "uint256": + if hexEncode { + return "(*hexutil.Big)" + } return "*big.Int" case "address": return "common.Address" case "bytes": + if hexEncode { + return "hexutil.Bytes" + } return "[]byte" case "bytes32": return "common.Hash" @@ -198,6 +214,9 @@ func encodeTypeToGolang(str string, insideTypes bool, slicePointers bool) string } if strings.HasPrefix(str, "uint") { + if str == "uint64" && hexEncode { + return "hexutil.Uint64" + } // uint8, uint16, uint32, uint64 are encoded the same way in Go return str } @@ -231,7 +250,10 @@ var structsTemplate = `// Code generated by suave/gen. DO NOT EDIT. // Hash: {{hash}} package types -import "github.com/ethereum/go-ethereum/common" +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) {{range .Types}} type {{.Name}} {{typ3 .Typ}} @@ -243,6 +265,13 @@ type {{.Name}} struct { {{range .Fields}}{{title .Name}} {{typ3 .Typ}} {{end}} } + +type {{.Name | lower}}Marshaling struct { +{{range .Fields}} +{{if isHex .Typ}}{{title .Name}} {{hextype .Typ}}{{else}} +{{end}}{{end}} +} + {{end}} {{range .Enums}} @@ -322,7 +351,7 @@ func (b *SuaveRuntimeAdapter) {{.Name}}(input []byte) (res []byte, err error) { var ( {{range .Input}}{{.Name}} {{typ2 .Typ}} {{end}}) - + {{range $index, $item := .Input}}{{ if isComplex .Typ }} if err = mapstructure.Decode(unpacked[{{$index}}], &{{.Name}}); err != nil { err = errFailedToDecodeField @@ -334,7 +363,7 @@ func (b *SuaveRuntimeAdapter) {{.Name}}(input []byte) (res []byte, err error) { var ( {{range .Output.Fields}}{{.Name}} {{typ2 .Typ}} {{end}}) - + if {{range .Output.Fields}}{{.Name}},{{end}} err = b.impl.{{.Name}}({{range .Input}}{{.Name}}, {{end}}); err != nil { return } @@ -407,7 +436,7 @@ struct {{.Name}} { {{end}} } {{end}} -address public constant ANYALLOWED = +address public constant ANYALLOWED = 0xC8df3686b4Afb2BB53e60EAe97EF043FE03Fb829; address public constant IS_CONFIDENTIAL_ADDR = diff --git a/suave/gen/suave_spec.yaml b/suave/gen/suave_spec.yaml index 156c1126f..b9162d260 100644 --- a/suave/gen/suave_spec.yaml +++ b/suave/gen/suave_spec.yaml @@ -19,16 +19,6 @@ structs: type: address[] - name: version type: string - - name: Withdrawal - fields: - - name: index - type: uint64 - - name: validator - type: uint64 - - name: Address - type: address - - name: amount - type: uint64 - name: BuildBlockArgs fields: - name: slot diff --git a/suave/sol/libraries/Suave.sol b/suave/sol/libraries/Suave.sol index 0bc074e9b..b577cd9d8 100644 --- a/suave/sol/libraries/Suave.sol +++ b/suave/sol/libraries/Suave.sol @@ -55,13 +55,6 @@ library Suave { bytes32[] topics; } - struct Withdrawal { - uint64 index; - uint64 validator; - address Address; - uint64 amount; - } - address public constant ANYALLOWED = 0xC8df3686b4Afb2BB53e60EAe97EF043FE03Fb829; address public constant IS_CONFIDENTIAL_ADDR = 0x0000000000000000000000000000000042010000; From ef99fa419c69a120f65d4dac8c99ea4212e681d9 Mon Sep 17 00:00:00 2001 From: Jinsuk Park Date: Fri, 23 Feb 2024 23:32:27 -0800 Subject: [PATCH 3/5] fix failing test --- suave/gen/main_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suave/gen/main_test.go b/suave/gen/main_test.go index 486c97718..1c87b7cfc 100644 --- a/suave/gen/main_test.go +++ b/suave/gen/main_test.go @@ -42,7 +42,7 @@ func TestEncodeTypeToGolang(t *testing.T) { } for _, c := range cases { - actual := encodeTypeToGolang(c.name, true, true) + actual := encodeTypeToGolang(c.name, true, true, false) require.Equal(t, c.expected, actual) } } From ce4994a5539af5f54092404eecec88fecb3b30e1 Mon Sep 17 00:00:00 2001 From: Jinsuk Park Date: Fri, 23 Feb 2024 23:39:09 -0800 Subject: [PATCH 4/5] move withdrawals back --- core/types/suave_structs.go | 16 +++++++++++++++- core/types/withdrawal.go | 17 ----------------- core/vm/contracts_suave_runtime_adapter.go | 2 +- suave/artifacts/SuaveLib.json | 2 +- suave/artifacts/addresses.go | 2 +- suave/gen/suave_spec.yaml | 10 ++++++++++ suave/sol/libraries/Suave.sol | 7 +++++++ 7 files changed, 35 insertions(+), 21 deletions(-) diff --git a/core/types/suave_structs.go b/core/types/suave_structs.go index 720a14f2a..3508c2ab5 100755 --- a/core/types/suave_structs.go +++ b/core/types/suave_structs.go @@ -1,5 +1,5 @@ // Code generated by suave/gen. DO NOT EDIT. -// Hash: 9732c21c23a55aace13fb31d9845596592f7d212365c4a23db29a69477911496 +// Hash: 64563d17acef48bebfc901fe4b887d02b1efc267e269e9b2aec1fd02027a3f1a package types import ( @@ -82,6 +82,20 @@ type simulatedLogMarshaling struct { Data hexutil.Bytes } +type Withdrawal struct { + Index uint64 + Validator uint64 + Address common.Address + Amount uint64 +} + +type withdrawalMarshaling struct { + Index hexutil.Uint64 + Validator hexutil.Uint64 + + Amount hexutil.Uint64 +} + type CryptoSignature uint8 const ( diff --git a/core/types/withdrawal.go b/core/types/withdrawal.go index d1ad918f9..b4db693ad 100644 --- a/core/types/withdrawal.go +++ b/core/types/withdrawal.go @@ -19,29 +19,12 @@ package types import ( "bytes" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/rlp" ) //go:generate go run github.com/fjl/gencodec -type Withdrawal -field-override withdrawalMarshaling -out gen_withdrawal_json.go //go:generate go run ../../rlp/rlpgen -type Withdrawal -out gen_withdrawal_rlp.go -// Withdrawal represents a validator withdrawal from the consensus layer. -type Withdrawal struct { - Index uint64 `json:"index"` // monotonically increasing identifier issued by consensus layer - Validator uint64 `json:"validatorIndex"` // index of validator associated with withdrawal - Address common.Address `json:"address"` // target address for withdrawn ether - Amount uint64 `json:"amount"` // value of withdrawal in Gwei -} - -// field type overrides for gencodec -type withdrawalMarshaling struct { - Index hexutil.Uint64 - Validator hexutil.Uint64 - Amount hexutil.Uint64 -} - // Withdrawals implements DerivableList for withdrawals. type Withdrawals []*Withdrawal diff --git a/core/vm/contracts_suave_runtime_adapter.go b/core/vm/contracts_suave_runtime_adapter.go index 9a8ca3d9f..a98582136 100644 --- a/core/vm/contracts_suave_runtime_adapter.go +++ b/core/vm/contracts_suave_runtime_adapter.go @@ -1,5 +1,5 @@ // Code generated by suave/gen. DO NOT EDIT. -// Hash: 9732c21c23a55aace13fb31d9845596592f7d212365c4a23db29a69477911496 +// Hash: 64563d17acef48bebfc901fe4b887d02b1efc267e269e9b2aec1fd02027a3f1a package vm import ( diff --git a/suave/artifacts/SuaveLib.json b/suave/artifacts/SuaveLib.json index 9856807e3..22ee3ff6a 100644 --- a/suave/artifacts/SuaveLib.json +++ b/suave/artifacts/SuaveLib.json @@ -1 +1 @@ -[{"type":"error","name":"PeekerReverted","inputs":[{"name":"addr","type":"address"},{"name":"err","type":"bytes"}]},{"type":"function","name":"buildEthBlock","inputs":[{"name":"blockArgs","type":"tuple","internalType":"struct Suave.BuildBlockArgs","components":[{"name":"slot","type":"uint64","internalType":"uint64"},{"name":"proposerPubkey","type":"bytes","internalType":"bytes"},{"name":"parent","type":"bytes32","internalType":"bytes32"},{"name":"timestamp","type":"uint64","internalType":"uint64"},{"name":"feeRecipient","type":"address","internalType":"address"},{"name":"gasLimit","type":"uint64","internalType":"uint64"},{"name":"random","type":"bytes32","internalType":"bytes32"},{"name":"withdrawals","type":"tuple[]","internalType":"struct Suave.Withdrawal[]"},{"name":"extra","type":"bytes","internalType":"bytes"},{"name":"beaconRoot","type":"bytes32","internalType":"bytes32"},{"name":"fillPending","type":"bool","internalType":"bool"}]},{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"namespace","type":"string","internalType":"string"}],"outputs":[{"name":"blockBid","type":"bytes","internalType":"bytes"},{"name":"executionPayload","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialInputs","outputs":[{"name":"confindentialData","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialRetrieve","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialStore","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"key","type":"string","internalType":"string"},{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"contextGet","inputs":[{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"doHTTPRequest","inputs":[{"name":"request","type":"tuple","internalType":"struct Suave.HttpRequest","components":[{"name":"url","type":"string","internalType":"string"},{"name":"method","type":"string","internalType":"string"},{"name":"headers","type":"string[]","internalType":"string[]"},{"name":"body","type":"bytes","internalType":"bytes"},{"name":"withFlashbotsSignature","type":"bool","internalType":"bool"}]}],"outputs":[{"name":"httpResponse","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"ethcall","inputs":[{"name":"contractAddr","type":"address","internalType":"address"},{"name":"input1","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"callOutput","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"extractHint","inputs":[{"name":"bundleData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"hints","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"fetchDataRecords","inputs":[{"name":"cond","type":"uint64","internalType":"uint64"},{"name":"namespace","type":"string","internalType":"string"}],"outputs":[{"name":"dataRecords","type":"tuple[]","internalType":"struct Suave.DataRecord[]","components":[{"name":"id","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"salt","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"version","type":"string","internalType":"string"}]}]},{"type":"function","name":"fillMevShareBundle","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"}],"outputs":[{"name":"encodedBundle","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"newBuilder","outputs":[{"name":"sessionid","type":"string","internalType":"string"}]},{"type":"function","name":"newDataRecord","inputs":[{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"dataType","type":"string","internalType":"string"}],"outputs":[{"name":"dataRecord","type":"tuple","internalType":"struct Suave.DataRecord","components":[{"name":"id","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"salt","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"version","type":"string","internalType":"string"}]}]},{"type":"function","name":"privateKeyGen","inputs":[{"name":"crypto","type":"uint8","internalType":"struct Suave.CryptoSignature"}],"outputs":[{"name":"privateKey","type":"string","internalType":"string"}]},{"type":"function","name":"signEthTransaction","inputs":[{"name":"txn","type":"bytes","internalType":"bytes"},{"name":"chainId","type":"string","internalType":"string"},{"name":"signingKey","type":"string","internalType":"string"}],"outputs":[{"name":"signedTxn","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"signMessage","inputs":[{"name":"digest","type":"bytes","internalType":"bytes"},{"name":"crypto","type":"uint8","internalType":"struct Suave.CryptoSignature"},{"name":"signingKey","type":"string","internalType":"string"}],"outputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"simulateBundle","inputs":[{"name":"bundleData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"effectiveGasPrice","type":"uint64","internalType":"uint64"}]},{"type":"function","name":"simulateTransaction","inputs":[{"name":"sessionid","type":"string","internalType":"string"},{"name":"txn","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"simulationResult","type":"tuple","internalType":"struct Suave.SimulateTransactionResult","components":[{"name":"egp","type":"uint64","internalType":"uint64"},{"name":"logs","type":"tuple[]","internalType":"struct Suave.SimulatedLog[]","components":[{"name":"data","type":"bytes","internalType":"bytes"},{"name":"addr","type":"address","internalType":"address"},{"name":"topics","type":"bytes32[]","internalType":"bytes32[]"}]},{"name":"success","type":"bool","internalType":"bool"},{"name":"error","type":"string","internalType":"string"}]}]},{"type":"function","name":"submitBundleJsonRPC","inputs":[{"name":"url","type":"string","internalType":"string"},{"name":"method","type":"string","internalType":"string"},{"name":"params","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"errorMessage","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"submitEthBlockToRelay","inputs":[{"name":"relayUrl","type":"string","internalType":"string"},{"name":"builderBid","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"blockBid","type":"bytes","internalType":"bytes"}]}] \ No newline at end of file +[{"type":"error","name":"PeekerReverted","inputs":[{"name":"addr","type":"address"},{"name":"err","type":"bytes"}]},{"type":"function","name":"buildEthBlock","inputs":[{"name":"blockArgs","type":"tuple","internalType":"struct Suave.BuildBlockArgs","components":[{"name":"slot","type":"uint64","internalType":"uint64"},{"name":"proposerPubkey","type":"bytes","internalType":"bytes"},{"name":"parent","type":"bytes32","internalType":"bytes32"},{"name":"timestamp","type":"uint64","internalType":"uint64"},{"name":"feeRecipient","type":"address","internalType":"address"},{"name":"gasLimit","type":"uint64","internalType":"uint64"},{"name":"random","type":"bytes32","internalType":"bytes32"},{"name":"withdrawals","type":"tuple[]","internalType":"struct Suave.Withdrawal[]","components":[{"name":"index","type":"uint64","internalType":"uint64"},{"name":"validator","type":"uint64","internalType":"uint64"},{"name":"Address","type":"address","internalType":"address"},{"name":"amount","type":"uint64","internalType":"uint64"}]},{"name":"extra","type":"bytes","internalType":"bytes"},{"name":"beaconRoot","type":"bytes32","internalType":"bytes32"},{"name":"fillPending","type":"bool","internalType":"bool"}]},{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"namespace","type":"string","internalType":"string"}],"outputs":[{"name":"blockBid","type":"bytes","internalType":"bytes"},{"name":"executionPayload","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialInputs","outputs":[{"name":"confindentialData","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialRetrieve","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"confidentialStore","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"key","type":"string","internalType":"string"},{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"contextGet","inputs":[{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"doHTTPRequest","inputs":[{"name":"request","type":"tuple","internalType":"struct Suave.HttpRequest","components":[{"name":"url","type":"string","internalType":"string"},{"name":"method","type":"string","internalType":"string"},{"name":"headers","type":"string[]","internalType":"string[]"},{"name":"body","type":"bytes","internalType":"bytes"},{"name":"withFlashbotsSignature","type":"bool","internalType":"bool"}]}],"outputs":[{"name":"httpResponse","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"ethcall","inputs":[{"name":"contractAddr","type":"address","internalType":"address"},{"name":"input1","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"callOutput","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"extractHint","inputs":[{"name":"bundleData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"hints","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"fetchDataRecords","inputs":[{"name":"cond","type":"uint64","internalType":"uint64"},{"name":"namespace","type":"string","internalType":"string"}],"outputs":[{"name":"dataRecords","type":"tuple[]","internalType":"struct Suave.DataRecord[]","components":[{"name":"id","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"salt","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"version","type":"string","internalType":"string"}]}]},{"type":"function","name":"fillMevShareBundle","inputs":[{"name":"dataId","type":"bytes16","internalType":"struct Suave.DataId"}],"outputs":[{"name":"encodedBundle","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"newBuilder","outputs":[{"name":"sessionid","type":"string","internalType":"string"}]},{"type":"function","name":"newDataRecord","inputs":[{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"dataType","type":"string","internalType":"string"}],"outputs":[{"name":"dataRecord","type":"tuple","internalType":"struct Suave.DataRecord","components":[{"name":"id","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"salt","type":"bytes16","internalType":"struct Suave.DataId"},{"name":"decryptionCondition","type":"uint64","internalType":"uint64"},{"name":"allowedPeekers","type":"address[]","internalType":"address[]"},{"name":"allowedStores","type":"address[]","internalType":"address[]"},{"name":"version","type":"string","internalType":"string"}]}]},{"type":"function","name":"privateKeyGen","inputs":[{"name":"crypto","type":"uint8","internalType":"struct Suave.CryptoSignature"}],"outputs":[{"name":"privateKey","type":"string","internalType":"string"}]},{"type":"function","name":"signEthTransaction","inputs":[{"name":"txn","type":"bytes","internalType":"bytes"},{"name":"chainId","type":"string","internalType":"string"},{"name":"signingKey","type":"string","internalType":"string"}],"outputs":[{"name":"signedTxn","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"signMessage","inputs":[{"name":"digest","type":"bytes","internalType":"bytes"},{"name":"crypto","type":"uint8","internalType":"struct Suave.CryptoSignature"},{"name":"signingKey","type":"string","internalType":"string"}],"outputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"simulateBundle","inputs":[{"name":"bundleData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"effectiveGasPrice","type":"uint64","internalType":"uint64"}]},{"type":"function","name":"simulateTransaction","inputs":[{"name":"sessionid","type":"string","internalType":"string"},{"name":"txn","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"simulationResult","type":"tuple","internalType":"struct Suave.SimulateTransactionResult","components":[{"name":"egp","type":"uint64","internalType":"uint64"},{"name":"logs","type":"tuple[]","internalType":"struct Suave.SimulatedLog[]","components":[{"name":"data","type":"bytes","internalType":"bytes"},{"name":"addr","type":"address","internalType":"address"},{"name":"topics","type":"bytes32[]","internalType":"bytes32[]"}]},{"name":"success","type":"bool","internalType":"bool"},{"name":"error","type":"string","internalType":"string"}]}]},{"type":"function","name":"submitBundleJsonRPC","inputs":[{"name":"url","type":"string","internalType":"string"},{"name":"method","type":"string","internalType":"string"},{"name":"params","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"errorMessage","type":"bytes","internalType":"bytes"}]},{"type":"function","name":"submitEthBlockToRelay","inputs":[{"name":"relayUrl","type":"string","internalType":"string"},{"name":"builderBid","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"blockBid","type":"bytes","internalType":"bytes"}]}] \ No newline at end of file diff --git a/suave/artifacts/addresses.go b/suave/artifacts/addresses.go index 9f148e72f..2f8e71763 100644 --- a/suave/artifacts/addresses.go +++ b/suave/artifacts/addresses.go @@ -1,5 +1,5 @@ // Code generated by suave/gen. DO NOT EDIT. -// Hash: 9732c21c23a55aace13fb31d9845596592f7d212365c4a23db29a69477911496 +// Hash: 64563d17acef48bebfc901fe4b887d02b1efc267e269e9b2aec1fd02027a3f1a package artifacts import ( diff --git a/suave/gen/suave_spec.yaml b/suave/gen/suave_spec.yaml index b9162d260..156c1126f 100644 --- a/suave/gen/suave_spec.yaml +++ b/suave/gen/suave_spec.yaml @@ -19,6 +19,16 @@ structs: type: address[] - name: version type: string + - name: Withdrawal + fields: + - name: index + type: uint64 + - name: validator + type: uint64 + - name: Address + type: address + - name: amount + type: uint64 - name: BuildBlockArgs fields: - name: slot diff --git a/suave/sol/libraries/Suave.sol b/suave/sol/libraries/Suave.sol index b577cd9d8..0bc074e9b 100644 --- a/suave/sol/libraries/Suave.sol +++ b/suave/sol/libraries/Suave.sol @@ -55,6 +55,13 @@ library Suave { bytes32[] topics; } + struct Withdrawal { + uint64 index; + uint64 validator; + address Address; + uint64 amount; + } + address public constant ANYALLOWED = 0xC8df3686b4Afb2BB53e60EAe97EF043FE03Fb829; address public constant IS_CONFIDENTIAL_ADDR = 0x0000000000000000000000000000000042010000; From b6f0b6154c47d34d813b7a0093f8efe8a8455470 Mon Sep 17 00:00:00 2001 From: Jinsuk Park Date: Sat, 24 Feb 2024 14:10:44 -0800 Subject: [PATCH 5/5] one liner for suavedevtools command --- Makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 20cbbc4ed..86b608d01 100644 --- a/Makefile +++ b/Makefile @@ -45,10 +45,11 @@ devtools: suavedevtools: go run ./suave/gen/main.go -write - cd core/types; go run github.com/fjl/gencodec -type BuildBlockArgs -field-override buildBlockArgsMarshaling -out gen_build_block_args_json.go - cd core/types; go run github.com/fjl/gencodec -type DataRecord -field-override dataRecordMarshaling -out gen_data_record_json.go - cd core/types; go run github.com/fjl/gencodec -type HttpRequest -field-override httpRequestMarshaling -out gen_http_request_json.go - cd core/types; go run github.com/fjl/gencodec -type SimulatedLog -field-override simulatedLogMarshaling -out gen_simulated_log_json.go + cd core/types && \ + go run github.com/fjl/gencodec -type BuildBlockArgs -field-override buildBlockArgsMarshaling -out gen_build_block_args_json.go && \ + go run github.com/fjl/gencodec -type DataRecord -field-override dataRecordMarshaling -out gen_data_record_json.go && \ + go run github.com/fjl/gencodec -type HttpRequest -field-override httpRequestMarshaling -out gen_http_request_json.go && \ + go run github.com/fjl/gencodec -type SimulatedLog -field-override simulatedLogMarshaling -out gen_simulated_log_json.go devnet-up: docker-compose -f ./suave/devenv/docker-compose.yml up -d --build