-
Notifications
You must be signed in to change notification settings - Fork 33
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(rfq-relayer): fee pricer considers v2 CallValue and CallParams […
…SLT-320] (#3299) * WIP: incorporate call params into fee * WIP: decompose getFee() * Feat: account for CallValue in getDestinationFee() * Fix: build * Feat: test call value and call param calculation in fee pricer * Feat: add context on request body in rpc fwd errs * Fix: zap estimate gas * Cleanup: move gas estimate into own func * Fix: quoter tests * Cleanup: lint * Cleanup: lint * Fix: tests * Cleanup: decompose func * Cleanup: lint * Fix: tests * Cleanup: lint * Feat: always use quote fee multiplier * WIP: abi encode pack relay() * Feat: pass full RawRequest for gas estimation * Cleanup: lint * Fix: pricer tests * Feat: ignore static l2 fee when incorporating call params * Fix: tests * Clarifying comment * Feat: add extra check for call param len * Attempt to fix flake * Cleanup: lint * Fix: build * feat(rfq-relayer): apply zap fee to dest amount for active quotes [SLT-465] (#3395) * Feat: set zap params in supply to fee pricer * Feat: adjust dest amount by fee for active quote * Feat: add TestGenerateActiveRFQ * Feat: add nonzero case * Cleanup: lint * fix(rfq-relayer): gas estimation for zaps (#3413) * WIP: use QuoteData instead of QuoteRequest * WIP: impl conversion * Feat: use QuoteRequest instead of QuoteData for encoding * WIP: another encoding impl * WIP: add bridgetransactionv2 * WIP: regenerate with running test * Working zap e2e * Cleanup: encoding * Cleanup: move to new encoding file * ABIgen from harness instead of lib * Cleanup: lint * Fix: CI build * Fix: deploy harness * Fix: rfq test * Feat: use gofakeit to mock * Cleanup: test structure * Replace: EncodeQuoteRequest -> EncodeBridgeTx * Feat: add Decode func and add to parity test * Fix: eth address mocks * Cleanup: lint * Cleanup: lint --------- Co-authored-by: parodime <[email protected]>
- Loading branch information
Showing
23 changed files
with
4,747 additions
and
72 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4,004 changes: 4,004 additions & 0 deletions
4,004
services/rfq/contracts/bridgetransactionv2/bridgetransactionv2.abigen.go
Large diffs are not rendered by default.
Oops, something went wrong.
1 change: 1 addition & 0 deletions
1
services/rfq/contracts/bridgetransactionv2/bridgetransactionv2.contractinfo.json
Large diffs are not rendered by default.
Oops, something went wrong.
25 changes: 25 additions & 0 deletions
25
services/rfq/contracts/bridgetransactionv2/bridgetransactionv2.metadata.go
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
// Package bridgetransactionv2 is the bridge transaction contract. | ||
package bridgetransactionv2 | ||
|
||
//go:generate go run github.com/synapsecns/sanguine/tools/abigen generate --sol ../../../../packages/contracts-rfq/flattened/BridgeTransactionV2Harness.sol --pkg bridgetransactionv2 --sol-version 0.8.24 --filename bridgetransactionv2 --evm-version istanbul |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
package bridgetransactionv2 | ||
|
||
import ( | ||
"github.com/ethereum/go-ethereum/accounts/abi/bind" | ||
"github.com/ethereum/go-ethereum/common" | ||
"github.com/ethereum/go-ethereum/core/vm" | ||
) | ||
|
||
// BridgeTransactionV2Ref is a bound fast bridge contract that returns the address of the contract. | ||
// | ||
//nolint:golint | ||
type BridgeTransactionV2Ref struct { | ||
*BridgeTransactionV2Harness | ||
address common.Address | ||
} | ||
|
||
// Address gets the ocntract address. | ||
func (f *BridgeTransactionV2Ref) Address() common.Address { | ||
return f.address | ||
} | ||
|
||
// NewBridgeTransactionV2Ref creates a new fast bridge mock contract with a ref. | ||
func NewBridgeTransactionV2Ref(address common.Address, backend bind.ContractBackend) (*BridgeTransactionV2Ref, error) { | ||
bridgetransactionv2, err := NewBridgeTransactionV2Harness(address, backend) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
return &BridgeTransactionV2Ref{ | ||
BridgeTransactionV2Harness: bridgetransactionv2, | ||
address: address, | ||
}, nil | ||
} | ||
|
||
var _ vm.ContractRef = &BridgeTransactionV2Ref{} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
package chain | ||
|
||
import ( | ||
"encoding/binary" | ||
"fmt" | ||
"math/big" | ||
|
||
"github.com/ethereum/go-ethereum/common" | ||
"github.com/synapsecns/sanguine/services/rfq/contracts/fastbridgev2" | ||
) | ||
|
||
const ( | ||
// Field sizes in bytes. | ||
sizeVersion = 2 | ||
sizeChainID = 4 | ||
sizeAddress = 20 | ||
sizeUint256 = 32 | ||
|
||
// Field offsets in bytes. | ||
offsetVersion = 0 | ||
offsetOriginChainID = offsetVersion + sizeVersion | ||
offsetDestChainID = offsetOriginChainID + sizeChainID | ||
offsetOriginSender = offsetDestChainID + sizeChainID | ||
offsetDestRecipient = offsetOriginSender + sizeAddress | ||
offsetOriginToken = offsetDestRecipient + sizeAddress | ||
offsetDestToken = offsetOriginToken + sizeAddress | ||
offsetOriginAmount = offsetDestToken + sizeAddress | ||
offsetDestAmount = offsetOriginAmount + sizeUint256 | ||
offsetOriginFeeAmount = offsetDestAmount + sizeUint256 | ||
offsetDeadline = offsetOriginFeeAmount + sizeUint256 | ||
offsetNonce = offsetDeadline + sizeUint256 | ||
offsetExclusivityRelayer = offsetNonce + sizeUint256 | ||
offsetExclusivityEndTime = offsetExclusivityRelayer + sizeAddress | ||
offsetZapNative = offsetExclusivityEndTime + sizeUint256 | ||
offsetZapData = offsetZapNative + sizeUint256 | ||
) | ||
|
||
// Helper function to properly encode uint256. | ||
func padUint256(b *big.Int) []byte { | ||
// Convert big.Int to bytes | ||
bytes := b.Bytes() | ||
// Create 32-byte array (initialized to zeros) | ||
result := make([]byte, 32) | ||
// Copy bytes to right side of array (left-pad with zeros) | ||
copy(result[32-len(bytes):], bytes) | ||
return result | ||
} | ||
|
||
// EncodeBridgeTx encodes a bridge transaction into a byte array. | ||
func EncodeBridgeTx(tx fastbridgev2.IFastBridgeV2BridgeTransactionV2) ([]byte, error) { | ||
// Initialize with total size including ZapData | ||
result := make([]byte, offsetZapData+len(tx.ZapData)) | ||
|
||
// Version | ||
result[offsetVersion] = 0 | ||
result[offsetVersion+1] = 2 | ||
|
||
// Chain IDs | ||
binary.BigEndian.PutUint32(result[offsetOriginChainID:offsetOriginChainID+sizeChainID], tx.OriginChainId) | ||
binary.BigEndian.PutUint32(result[offsetDestChainID:offsetDestChainID+sizeChainID], tx.DestChainId) | ||
|
||
// Addresses | ||
copy(result[offsetOriginSender:offsetOriginSender+sizeAddress], tx.OriginSender.Bytes()) | ||
copy(result[offsetDestRecipient:offsetDestRecipient+sizeAddress], tx.DestRecipient.Bytes()) | ||
copy(result[offsetOriginToken:offsetOriginToken+sizeAddress], tx.OriginToken.Bytes()) | ||
copy(result[offsetDestToken:offsetDestToken+sizeAddress], tx.DestToken.Bytes()) | ||
|
||
// uint256 values | ||
copy(result[offsetOriginAmount:offsetOriginAmount+sizeUint256], padUint256(tx.OriginAmount)) | ||
copy(result[offsetDestAmount:offsetDestAmount+sizeUint256], padUint256(tx.DestAmount)) | ||
copy(result[offsetOriginFeeAmount:offsetOriginFeeAmount+sizeUint256], padUint256(tx.OriginFeeAmount)) | ||
copy(result[offsetDeadline:offsetDeadline+sizeUint256], padUint256(tx.Deadline)) | ||
copy(result[offsetNonce:offsetNonce+sizeUint256], padUint256(tx.Nonce)) | ||
|
||
// Exclusivity address | ||
copy(result[offsetExclusivityRelayer:offsetExclusivityRelayer+sizeAddress], tx.ExclusivityRelayer.Bytes()) | ||
|
||
// More uint256 values | ||
copy(result[offsetExclusivityEndTime:offsetExclusivityEndTime+sizeUint256], padUint256(tx.ExclusivityEndTime)) | ||
copy(result[offsetZapNative:offsetZapNative+sizeUint256], padUint256(tx.ZapNative)) | ||
|
||
// Replace append with copy for ZapData | ||
copy(result[offsetZapData:], tx.ZapData) | ||
|
||
return result, nil | ||
} | ||
|
||
// DecodeBridgeTx decodes a byte array into a bridge transaction. | ||
func DecodeBridgeTx(data []byte) (fastbridgev2.IFastBridgeV2BridgeTransactionV2, error) { | ||
if len(data) < offsetZapData { | ||
return fastbridgev2.IFastBridgeV2BridgeTransactionV2{}, fmt.Errorf("data too short: got %d bytes, need at least %d", len(data), offsetZapData) | ||
} | ||
|
||
tx := fastbridgev2.IFastBridgeV2BridgeTransactionV2{ | ||
OriginChainId: binary.BigEndian.Uint32(data[offsetOriginChainID:offsetDestChainID]), | ||
DestChainId: binary.BigEndian.Uint32(data[offsetDestChainID:offsetOriginSender]), | ||
OriginSender: common.BytesToAddress(data[offsetOriginSender:offsetDestRecipient]), | ||
DestRecipient: common.BytesToAddress(data[offsetDestRecipient:offsetOriginToken]), | ||
OriginToken: common.BytesToAddress(data[offsetOriginToken:offsetDestToken]), | ||
DestToken: common.BytesToAddress(data[offsetDestToken:offsetOriginAmount]), | ||
OriginAmount: new(big.Int).SetBytes(data[offsetOriginAmount:offsetDestAmount]), | ||
DestAmount: new(big.Int).SetBytes(data[offsetDestAmount:offsetOriginFeeAmount]), | ||
OriginFeeAmount: new(big.Int).SetBytes(data[offsetOriginFeeAmount:offsetDeadline]), | ||
Deadline: new(big.Int).SetBytes(data[offsetDeadline:offsetNonce]), | ||
Nonce: new(big.Int).SetBytes(data[offsetNonce:offsetExclusivityRelayer]), | ||
ExclusivityRelayer: common.BytesToAddress(data[offsetExclusivityRelayer:offsetExclusivityEndTime]), | ||
ExclusivityEndTime: new(big.Int).SetBytes(data[offsetExclusivityEndTime:offsetZapNative]), | ||
ZapNative: new(big.Int).SetBytes(data[offsetZapNative:offsetZapData]), | ||
ZapData: data[offsetZapData:], | ||
} | ||
|
||
return tx, nil | ||
} |
Oops, something went wrong.