Skip to content

Commit 349ea43

Browse files
faisal-chainlinkFelixFan1992Copilot
authored
[Chore] Re-enable E2E tests (#401)
* NONEVM-5192: convert source chain decimal for receiver * fix deployment with an init decimal op * address feedback * more feedback * fix test * regenerate bindings * initial draft (w/ replace clauses) * update integration tests dir * add events to grpc response mapping * misc updates to client and packages * remove unnecessary debug logs and update node test helper * fix onramp ccip tests * remove replace clause for MCMS dep in favor of commit hash * re-enable MCMS tests in ./integration-tests in CI * remove replace clause for CLDF dep in favor of commit hash * update go mods in ./deployment * tidy * re-enable ops tests * deps graph * fix op test mock stub * Update bindings/bind/publish.go * re-enable * merge * simplify local node helper * go mod tidy in ./integration-tests * lint * NONEVM-5191: implement receiver abi check (#393) * NONEVM-5191: implement receiver abi check * fix * fix * fix lint * update * addres feedback * fix * update * NONEVM-5015: make broken receiver not blocking relayer and add more tests (#394) * NONEVM-5191: implement receiver abi check * make broken receiver not blocking relayer and add more tests * fix * fix * address feedback and issues * fix * fix lint * update * addres feedback * fix * update * fix lint * fix * more tests * fix tests * fix * fix tests * clean up * fix lint --------- Co-authored-by: Faisal <faisal.altameemi@smartcontract.com> * fix * nonevm-5255: check for errors before memory allocation (#405) * nonevm-5255: check for errors before memory allocation * address feedback * more checks * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Faisal <faisal.altameemi@smartcontract.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * use address deserializing for MCMS reports to handle move structs * use address deserializing for MCMS reports as fallback * update bindings deserializer for MCMS * NONEVM-5258: billing for Sui => Sui (#403) * NONEVM-5258: billing for Sui => Sui * fix tests * fi * fix * nonevm-5017: update dummy receiver and add a new receiver integration guide (#406) * regen binding --------- Co-authored-by: FelixFan1992 <fankejin@gmail.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
1 parent be6ce8f commit 349ea43

48 files changed

Lines changed: 3361 additions & 2228 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/pull-request-develop.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ jobs:
9797
nix develop --command go test -v ./bindings/... -tags="integration"
9898
9999
- name: Run Operations Tests
100-
if: false # disabled until MCMS package is updated for the new Sui gRPC client
101100
env:
102101
TEST_DB_URL: postgres://localhost:5432/chainlink_test?sslmode=disable&user=postgres&password=postgres
103102
run: |
@@ -142,7 +141,6 @@ jobs:
142141
nix develop --command sui genesis --force --with-faucet
143142
144143
- name: Run System Integration Tests
145-
if: false # disabled until MCMS package is updated for the new Sui gRPC client
146144
env:
147145
TEST_DB_URL: postgres://localhost:5432/chainlink_test?sslmode=disable&user=postgres&password=postgres
148146
run: |

bindings/bind/bcs_deserialize.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"errors"
66
"fmt"
7+
"io"
78
"math/big"
89
"reflect"
910
"strings"
@@ -28,7 +29,7 @@ func DeserializeBCS(data []byte, moveTypes []string) ([]any, error) {
2829
deserializer := mystenbcs.NewDecoder(reader)
2930
ret := make([]any, 0, len(moveTypes))
3031
for _, moveType := range moveTypes {
31-
decoded, _, err := bcsDeserializeType(deserializer, moveType)
32+
decoded, _, err := bcsDeserializeType(reader, deserializer, moveType)
3233
if err != nil {
3334
return ret, err
3435
}
@@ -41,11 +42,7 @@ func DeserializeBCS(data []byte, moveTypes []string) ([]any, error) {
4142
return ret, nil
4243
}
4344

44-
func bcsDeserializeType(deserializer *mystenbcs.Decoder, moveType string) (any, reflect.Type, error) {
45-
if _, ok := bcsStructDecoders[moveType]; ok {
46-
return nil, nil, fmt.Errorf("struct decoder path not supported in DeserializeBCS for type %s", moveType)
47-
}
48-
45+
func bcsDeserializeType(reader io.Reader, deserializer *mystenbcs.Decoder, moveType string) (any, reflect.Type, error) {
4946
switch {
5047
case moveType == "bool":
5148
var res bool
@@ -72,15 +69,16 @@ func bcsDeserializeType(deserializer *mystenbcs.Decoder, moveType string) (any,
7269
typ, err := bcsDecode(deserializer, &res)
7370
return res, typ, err
7471
case strings.HasPrefix(moveType, "vector<") && strings.HasSuffix(moveType, ">"):
75-
return bcsDeserializeSlice(deserializer, moveType)
72+
return bcsDeserializeSlice(reader, deserializer, moveType)
7673
case moveType == "address":
7774
return bcsDeserializeAddress(deserializer)
7875
case moveType == "u128":
7976
return bcsDeserializeBigInt(deserializer, moveType, 16)
8077
case moveType == "u256":
8178
return bcsDeserializeBigInt(deserializer, moveType, 32)
8279
default:
83-
return nil, nil, fmt.Errorf("unsupported type for BCS deserialization: %s", moveType)
80+
// custom move structs are decoded by their IDs
81+
return bcsDeserializeAddress(deserializer)
8482
}
8583
}
8684

@@ -91,17 +89,28 @@ func bcsDecode(deserializer *mystenbcs.Decoder, target any) (reflect.Type, error
9189
return reflect.TypeOf(target).Elem(), nil
9290
}
9391

94-
func bcsDeserializeSlice(deserializer *mystenbcs.Decoder, moveType string) (any, reflect.Type, error) {
92+
func bcsDeserializeSlice(reader io.Reader, deserializer *mystenbcs.Decoder, moveType string) (any, reflect.Type, error) {
9593
innerType := moveType[len("vector<") : len(moveType)-1]
96-
var length uint64
97-
if _, err := deserializer.Decode(&length); err != nil {
94+
95+
// vector<u8> uses ULEB128 length + raw bytes; mystenbcs handles this natively.
96+
if innerType == "u8" {
97+
var res []byte
98+
typ, err := bcsDecode(deserializer, &res)
99+
return res, typ, err
100+
}
101+
102+
length, _, err := mystenbcs.ULEB128Decode[uint64](reader)
103+
if err != nil {
98104
return nil, nil, fmt.Errorf("failed to decode vector length: %w", err)
99105
}
106+
if length > uint64(^uint(0)>>1) {
107+
return nil, nil, fmt.Errorf("vector length %d out of range", length)
108+
}
100109

101110
elements := make([]any, length)
102111
var elemType reflect.Type
103112
for i := uint64(0); i < length; i++ {
104-
dec, refT, err := bcsDeserializeType(deserializer, innerType)
113+
dec, refT, err := bcsDeserializeType(reader, deserializer, innerType)
105114
if err != nil {
106115
return nil, nil, err
107116
}

bindings/bind/compile.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ func compilePackageInternal(packageName contracts.Package, namedAddresses map[st
299299
filepath.Join(dstRoot, "ccip", "ccip_offramp"),
300300
filepath.Join(dstRoot, "ccip", "ccip_burn_mint_token"),
301301
filepath.Join(dstRoot, "ccip", "ccip_dummy_receiver"),
302+
filepath.Join(dstRoot, "ccip", "ccip_broken_receiver"),
302303
filepath.Join(dstRoot, "ccip", "managed_token"),
303304
filepath.Join(dstRoot, "ccip", "managed_token_faucet"),
304305
filepath.Join(dstRoot, "ccip", "mock_eth_token"),
@@ -479,7 +480,7 @@ func compilePackageInternal(packageName contracts.Package, namedAddresses map[st
479480
}
480481
}
481482

482-
if packageName == contracts.CCIPDummyReceiver {
483+
if packageName == contracts.CCIPDummyReceiver || packageName == contracts.CCIPBrokenReceiver {
483484
mcmsAddr := namedAddresses["mcms"]
484485
if !isZeroAddress(mcmsAddr) {
485486
mcmsDir := filepath.Join(dstRoot, "mcms", "mcms")

bindings/bind/grpc_response.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,18 @@ func mapExecuteResponseToModels(resp *suirpcv2.ExecuteTransactionResponse) (*mod
3838
result.ObjectChanges = mapChangedObjectsToModels(tx.Effects.GetChangedObjects())
3939
}
4040

41+
if tx.GetEvents() != nil {
42+
events := tx.GetEvents().GetEvents()
43+
for _, event := range events {
44+
result.Events = append(result.Events, models.SuiEventResponse{
45+
PackageId: event.GetPackageId(),
46+
TransactionModule: event.GetModule(),
47+
Type: event.GetEventType(),
48+
ParsedJson: event.GetJson().AsInterface().(map[string]any),
49+
})
50+
}
51+
}
52+
4153
return result, nil
4254
}
4355

@@ -181,6 +193,12 @@ func transactionChangedObjectsReadMaskPaths() []string {
181193
"effects.changed_objects.output_version",
182194
"effects.changed_objects.output_digest",
183195
"effects.changed_objects.input_version",
196+
"events",
197+
"events.events",
198+
"events.events.package_id",
199+
"events.events.module",
200+
"events.events.event_type",
201+
"events.events.json",
184202
}
185203
}
186204

bindings/bind/publish.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func FindObjectIdFromPublishTx(tx models.SuiTransactionBlockResponse, module, ob
134134

135135
// FindCoinObjectIdFromTx finds a coin object ID from a transaction response by looking for created objects of type Coin<T>
136136
func FindCoinObjectIdFromTx(tx models.SuiTransactionBlockResponse, coinType string) (string, error) {
137-
expectedType := fmt.Sprintf("0x2::coin::Coin<%s>", coinType)
137+
expectedType := fmt.Sprintf("0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<%s>", coinType)
138138

139139
for _, change := range tx.ObjectChanges {
140140
if change.Type == "created" && change.ObjectType == expectedType {

bindings/bind/type_converter.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ func convertPureValueToCallArg(typeName string, value any) (*transaction.CallArg
280280
case "vector<u8>":
281281
valueToEncode, err = convertToByteArray(value)
282282

283-
case "0x1::string::String":
283+
case "0x1::string::String", "ascii::String":
284284
str, ok := value.(string)
285285
if !ok {
286286
return nil, fmt.Errorf("expected string, got %T", value)
@@ -554,7 +554,7 @@ func convertVectorToBCS(innerType string, value any) (any, error) {
554554

555555
return result, nil
556556

557-
case "0x1::string::String":
557+
case "0x1::string::String", "ascii::String":
558558
result := make([]string, rv.Len())
559559
for i := range rv.Len() {
560560
elem := rv.Index(i).Interface()

bindings/generated/ccip/ccip_dummy_receiver/ccip_dummy_receiver/dummy_receiver.go

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindings/tests/testenv/testenv.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ var (
5555
refMu sync.Mutex
5656
)
5757

58-
func SetupEnvironment(t *testing.T) (utils.SuiSigner, client.BindingsClient) {
58+
func SetupEnvironment(t *testing.T) (utils.SuiSigner, client.SuiPTBClient) {
5959
t.Helper()
6060

6161
log := logger.Test(t)
@@ -147,7 +147,7 @@ func Cleanup() {
147147

148148
// CreateTestAccount creates a new test account with funding from the faucet.
149149
// This requires the test environment to be set up first (via Setup() or SetupEnvironment()).
150-
func CreateTestAccount(t *testing.T) (utils.SuiSigner, client.BindingsClient) {
150+
func CreateTestAccount(t *testing.T) (utils.SuiSigner, client.SuiPTBClient) {
151151
t.Helper()
152152

153153
refMu.Lock()
@@ -256,7 +256,7 @@ func (te *TestEnvironment) cleanup() {
256256
te.cleanupLocked()
257257
}
258258

259-
func createPTBClient(log logger.Logger) (client.BindingsClient, error) {
259+
func createPTBClient(log logger.Logger) (client.SuiPTBClient, error) {
260260
ptbClient, err := client.NewPTBClient(log, client.PTBClientConfig{
261261
GrpcTarget: fmt.Sprintf("%s:%d", loopbackHost, instance.rpcPort),
262262
GrpcToken: "test",

0 commit comments

Comments
 (0)