-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'origin/main' into revert-custom-errors
- Loading branch information
Showing
23 changed files
with
283 additions
and
67 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
## ABI Bindings | ||
|
||
This directory contains ABI bindings for the Solidity contracts in the `contracts/src/CrossChainApplications` and `contracts/src/Teleporter` directories. The files with the same name as the Solidity source files are automatically generated by the `scripts/abi_bindings.sh` script. Other files in this directory (such as the packing utilities) are manually created and maintained. |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
119 changes: 119 additions & 0 deletions
119
abi-bindings/go/Teleporter/TeleporterMessenger/packing.go
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,119 @@ | ||
package teleportermessenger | ||
|
||
import ( | ||
"fmt" | ||
"math/big" | ||
|
||
"github.com/ava-labs/avalanchego/ids" | ||
"github.com/ava-labs/subnet-evm/accounts/abi" | ||
"github.com/ethereum/go-ethereum/common" | ||
"github.com/pkg/errors" | ||
) | ||
|
||
var teleporterMessageType abi.Type | ||
|
||
func init() { | ||
// Create an ABI binding for TeleporterMessage, defined in ITeleporterMessenger.sol | ||
// abigen does not support ABI bindings for standalone structs, only methods and events, | ||
// so we must manually keep this up-to-date with the struct defined in the contract. | ||
var err error | ||
teleporterMessageType, err = abi.NewType("tuple", "struct Overloader.F", []abi.ArgumentMarshaling{ | ||
{Name: "messageID", Type: "uint256"}, | ||
{Name: "senderAddress", Type: "address"}, | ||
{Name: "destinationAddress", Type: "address"}, | ||
{Name: "requiredGasLimit", Type: "uint256"}, | ||
{Name: "allowedRelayerAddresses", Type: "address[]"}, | ||
{Name: "receipts", Type: "tuple[]", Components: []abi.ArgumentMarshaling{ | ||
{Name: "receivedMessageID", Type: "uint256"}, | ||
{Name: "relayerRewardAddress", Type: "address"}, | ||
}}, | ||
{Name: "message", Type: "bytes"}, | ||
}) | ||
if err != nil { | ||
panic(fmt.Sprintf("failed to create TeleporterMessage ABI type: %v", err)) | ||
} | ||
} | ||
|
||
func UnpackTeleporterMessage(messageBytes []byte) (*TeleporterMessage, error) { | ||
args := abi.Arguments{ | ||
{ | ||
Name: "teleporterMessage", | ||
Type: teleporterMessageType, | ||
}, | ||
} | ||
unpacked, err := args.Unpack(messageBytes) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to unpack to teleporter message with err: %v", err) | ||
} | ||
type teleporterMessageArg struct { | ||
TeleporterMessage TeleporterMessage `json:"teleporterMessage"` | ||
} | ||
var teleporterMessage teleporterMessageArg | ||
err = args.Copy(&teleporterMessage, unpacked) | ||
if err != nil { | ||
return nil, err | ||
} | ||
return &teleporterMessage.TeleporterMessage, nil | ||
} | ||
|
||
func PackSendCrossChainMessage(input TeleporterMessageInput) ([]byte, error) { | ||
abi, err := TeleporterMessengerMetaData.GetAbi() | ||
if err != nil { | ||
return nil, errors.Wrap(err, "failed to get abi") | ||
} | ||
|
||
return abi.Pack("sendCrossChainMessage", input) | ||
} | ||
|
||
// PackReceiveCrossChainMessage packs a ReceiveCrossChainMessageInput to form a call to the receiveCrossChainMessage function | ||
func PackReceiveCrossChainMessage(messageIndex uint32, relayerRewardAddress common.Address) ([]byte, error) { | ||
abi, err := TeleporterMessengerMetaData.GetAbi() | ||
if err != nil { | ||
return nil, errors.Wrap(err, "failed to get abi") | ||
} | ||
|
||
return abi.Pack("receiveCrossChainMessage", messageIndex, relayerRewardAddress) | ||
} | ||
|
||
// PackMessageReceived packs a MessageReceivedInput to form a call to the messageReceived function | ||
func PackMessageReceived(originChainID ids.ID, messageID *big.Int) ([]byte, error) { | ||
abi, err := TeleporterMessengerMetaData.GetAbi() | ||
if err != nil { | ||
return nil, errors.Wrap(err, "failed to get abi") | ||
} | ||
return abi.Pack("messageReceived", originChainID, messageID) | ||
} | ||
|
||
// UnpackMessageReceivedResult attempts to unpack result bytes to a bool indicating whether the message was received | ||
func UnpackMessageReceivedResult(result []byte) (bool, error) { | ||
abi, err := TeleporterMessengerMetaData.GetAbi() | ||
if err != nil { | ||
return false, errors.Wrap(err, "failed to get abi") | ||
} | ||
|
||
var success bool | ||
err = abi.UnpackIntoInterface(&success, "messageReceived", result) | ||
return success, err | ||
} | ||
|
||
func PackMessageReceivedOutput(success bool) ([]byte, error) { | ||
abi, err := TeleporterMessengerMetaData.GetAbi() | ||
if err != nil { | ||
return nil, errors.Wrap(err, "failed to get abi") | ||
} | ||
|
||
return abi.PackOutput("messageReceived", success) | ||
} | ||
|
||
// CAUTION: PackEvent is documented as not supporting struct types, so this should only be used for testing purposes. | ||
// In a real setting, the Teleporter contract should pack the event. | ||
// PackSendCrossChainMessageEvent packs the SendCrossChainMessage event type. | ||
func PackSendCrossChainMessageEvent(destinationChainID common.Hash, message TeleporterMessage, feeInfo TeleporterFeeInfo) ([]byte, error) { | ||
abi, err := TeleporterMessengerMetaData.GetAbi() | ||
if err != nil { | ||
return nil, errors.Wrap(err, "failed to get abi") | ||
} | ||
|
||
_, hashes, err := abi.PackEvent("SendCrossChainMessage", destinationChainID, message.MessageID, message, feeInfo) | ||
return hashes, err | ||
} |
66 changes: 66 additions & 0 deletions
66
abi-bindings/go/Teleporter/TeleporterMessenger/packing_test.go
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,66 @@ | ||
// Copyright (C) 2023, Ava Labs, Inc. All rights reserved. | ||
// See the file LICENSE for licensing terms. | ||
|
||
package teleportermessenger | ||
|
||
import ( | ||
"bytes" | ||
"math/big" | ||
"testing" | ||
|
||
"github.com/ethereum/go-ethereum/common" | ||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func createTestTeleporterMessage(messageID int64) TeleporterMessage { | ||
m := TeleporterMessage{ | ||
MessageID: big.NewInt(messageID), | ||
SenderAddress: common.HexToAddress("0x0123456789abcdef0123456789abcdef01234567"), | ||
DestinationAddress: common.HexToAddress("0x0123456789abcdef0123456789abcdef01234567"), | ||
RequiredGasLimit: big.NewInt(2), | ||
AllowedRelayerAddresses: []common.Address{ | ||
common.HexToAddress("0x0123456789abcdef0123456789abcdef01234567"), | ||
}, | ||
Receipts: []TeleporterMessageReceipt{ | ||
{ | ||
ReceivedMessageID: big.NewInt(1), | ||
RelayerRewardAddress: common.HexToAddress("0x0123456789abcdef0123456789abcdef01234567"), | ||
}, | ||
}, | ||
Message: []byte{1, 2, 3, 4}, | ||
} | ||
return m | ||
} | ||
|
||
func TestPackUnpackTeleporterMessage(t *testing.T) { | ||
var ( | ||
messageID int64 = 4 | ||
) | ||
message := createTestTeleporterMessage(messageID) | ||
|
||
b, err := PackSendCrossChainMessageEvent(common.HexToHash("0x03"), message, TeleporterFeeInfo{ | ||
ContractAddress: common.HexToAddress("0x0123456789abcdef0123456789abcdef01234567"), | ||
Amount: big.NewInt(1), | ||
}) | ||
if err != nil { | ||
t.Errorf("failed to pack teleporter message: %v", err) | ||
t.FailNow() | ||
} | ||
|
||
unpacked, err := UnpackTeleporterMessage(b) | ||
if err != nil { | ||
t.Errorf("failed to unpack teleporter message: %v", err) | ||
t.FailNow() | ||
} | ||
|
||
for i := 0; i < len(message.AllowedRelayerAddresses); i++ { | ||
require.Equal(t, unpacked.AllowedRelayerAddresses[i], message.AllowedRelayerAddresses[i]) | ||
} | ||
|
||
for i := 0; i < len(message.Receipts); i++ { | ||
require.Equal(t, message.Receipts[i].ReceivedMessageID, unpacked.Receipts[i].ReceivedMessageID) | ||
require.Equal(t, message.Receipts[i].RelayerRewardAddress, unpacked.Receipts[i].RelayerRewardAddress) | ||
} | ||
|
||
require.True(t, bytes.Equal(message.Message, unpacked.Message)) | ||
} |
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
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
Oops, something went wrong.