Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sync Stable Cadence branch with master #2701

Merged
merged 27 commits into from
Aug 8, 2023

Conversation

turbolent
Copy link
Member

Description

Conflict resolution:
git log -1 -p -w --remerge-diff 06d81ef55ebe040387118b2aee28a8f941513f8f
commit 06d81ef55ebe040387118b2aee28a8f941513f8f
Merge: 9bdde37e9 96403f2fe
Author: Bastian Müller <[email protected]>
Date:   Tue Aug 8 11:34:55 2023 -0700

    Merge branch 'master' into bastian/sync-stable-cadence-5

diff --git a/runtime/interpreter/interpreter.go b/runtime/interpreter/interpreter.go
remerge CONFLICT (content): Merge conflict in runtime/interpreter/interpreter.go
index c25956c08..4f3822719 100644
--- a/runtime/interpreter/interpreter.go
+++ b/runtime/interpreter/interpreter.go
@@ -4125,37 +4125,38 @@ func (interpreter *Interpreter) checkValue(
 		}
 	}()
 
-	// Here, the value at the path could be either:
-	//	1) The actual stored value (storage path)
-	//	2) A link to the value at the storage (private/public paths)
+	// TODO:
+	//// Here, the value at the path could be either:
+	////	1) The actual stored value (storage path)
+	////	2) A link to the value at the storage (private/public paths)
+	////
+	//// Therefore, try to find the final path, and try loading the value.
 	//
-	// Therefore, try to find the final path, and try loading the value.
-
-	// However, borrow type is not statically known.
-	// So take the borrow type from the value itself
-
-	var borrowType StaticType
-	if _, ok := value.(LinkValue); ok {
-		// Link values always have a `CapabilityStaticType` static type.
-		borrowType = staticType.(CapabilityStaticType).BorrowType
-	} else {
-		// Reference type with value's type (i.e. `staticType`) as both the borrow type and the referenced type.
-		borrowType = NewReferenceStaticType(interpreter, false, staticType, staticType)
-	}
-
-	var semaType sema.Type
-	semaType, valueError = interpreter.ConvertStaticToSemaType(borrowType)
-	if valueError != nil {
-		return valueError
-	}
-
-	// This is guaranteed to be a reference type, because `borrowType` is always a reference.
-	referenceType, ok := semaType.(*sema.ReferenceType)
-	if !ok {
-		panic(errors.NewUnreachableError())
-	}
-
-	_, valueError = interpreter.checkValueAtPath(address, path, referenceType, locationRange)
+	//// However, borrow type is not statically known.
+	//// So take the borrow type from the value itself
+	//
+	//var borrowType StaticType
+	//if _, ok := value.(LinkValue); ok {
+	//	// Link values always have a `CapabilityStaticType` static type.
+	//	borrowType = staticType.(CapabilityStaticType).BorrowType
+	//} else {
+	//	// Reference type with value's type (i.e. `staticType`) as both the borrow type and the referenced type.
+	//	borrowType = NewReferenceStaticType(interpreter, false, staticType, staticType)
+	//}
+	//
+	//var semaType sema.Type
+	//semaType, valueError = interpreter.ConvertStaticToSemaType(borrowType)
+	//if valueError != nil {
+	//	return valueError
+	//}
+	//
+	//// This is guaranteed to be a reference type, because `borrowType` is always a reference.
+	//referenceType, ok := semaType.(*sema.ReferenceType)
+	//if !ok {
+	//	panic(errors.NewUnreachableError())
+	//}
+	//
+	//_, valueError = interpreter.checkValueAtPath(address, path, referenceType, locationRange)
 
 	return
 }
@@ -4448,493 +4449,12 @@ var AuthAccountReferenceStaticType = ReferenceStaticType{
 	Authorization:  UnauthorizedAccess,
 }
 
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
 func (interpreter *Interpreter) getEntitlement(typeID common.TypeID) (*sema.EntitlementType, error) {
 	location, _, _ := common.DecodeTypeID(interpreter, string(typeID))
 	elaboration := interpreter.getElaboration(location)
 	if elaboration == nil {
 		return nil, TypeLoadingError{
 			TypeID: typeID,
-=======
-// Linking
-//
-// When linking to a path with the `AuthAccount.link function`,
-// an interpreter.PathLink (formerly Link) is stored in storage.
-//
-// When linking to an account with the new AuthAccount.linkAccount function,
-// an interpreter.AccountLink is stored in the account.
-//
-// In both cases, when acquiring a capability, e.g. using getCapability,
-// a PathCapabilityValue is returned.
-// This is because in both cases, we are looking up a path in an account.
-// Depending on what is stored in the path, PathLink or AccountLink,
-// we return a respective reference value, a StorageReferenceValue for PathLink
-// (after following the links to the final target),
-// or an AccountReferenceValue for an AccountLink.
-//
-// Again, in both cases for StorageReferenceValue and AccountReferenceValue,
-// for each use, e.g. member access,
-// we dereference/check that the link still exists after the capability was borrowed.
-
-func (interpreter *Interpreter) authAccountLinkAccountFunction(addressValue AddressValue) *HostFunctionValue {
-
-	// Converted addresses can be cached and don't have to be recomputed on each function invocation
-	address := addressValue.ToAddress()
-
-	return NewHostFunctionValue(
-		interpreter,
-		sema.AuthAccountTypeLinkAccountFunctionType,
-		func(invocation Invocation) Value {
-			interpreter := invocation.Interpreter
-
-			if !interpreter.SharedState.Config.AccountLinkingAllowed {
-				panic(AccountLinkingForbiddenError{
-					LocationRange: invocation.LocationRange,
-				})
-			}
-
-			newCapabilityPath, ok := invocation.Arguments[0].(PathValue)
-			if !ok {
-				panic(errors.NewUnreachableError())
-			}
-
-			newCapabilityDomain := newCapabilityPath.Domain.Identifier()
-			newCapabilityIdentifier := newCapabilityPath.Identifier
-
-			storageMapKey := StringStorageMapKey(newCapabilityIdentifier)
-
-			if interpreter.StoredValueExists(
-				address,
-				newCapabilityDomain,
-				storageMapKey,
-			) {
-				return Nil
-			}
-
-			accountLinkValue := NewAccountLinkValue(interpreter)
-
-			interpreter.WriteStored(
-				address,
-				newCapabilityDomain,
-				storageMapKey,
-				accountLinkValue,
-			)
-
-			onAccountLinked := interpreter.SharedState.Config.OnAccountLinked
-			if onAccountLinked != nil {
-				err := onAccountLinked(
-					interpreter,
-					invocation.LocationRange,
-					addressValue,
-					newCapabilityPath,
-				)
-				if err != nil {
-					panic(err)
-				}
-			}
-
-			return NewSomeValueNonCopying(
-				interpreter,
-				NewPathCapabilityValue(
-					interpreter,
-					addressValue,
-					newCapabilityPath,
-					AuthAccountReferenceStaticType,
-				),
-			)
-
-		},
-	)
-}
-
-func (interpreter *Interpreter) accountGetLinkTargetFunction(
-	functionType *sema.FunctionType,
-	addressValue AddressValue,
-) *HostFunctionValue {
-
-	// Converted addresses can be cached and don't have to be recomputed on each function invocation
-	address := addressValue.ToAddress()
-
-	return NewHostFunctionValue(
-		interpreter,
-		functionType,
-		func(invocation Invocation) Value {
-			interpreter := invocation.Interpreter
-
-			capabilityPath, ok := invocation.Arguments[0].(PathValue)
-			if !ok {
-				panic(errors.NewUnreachableError())
-			}
-
-			domain := capabilityPath.Domain.Identifier()
-			identifier := capabilityPath.Identifier
-
-			storageMapKey := StringStorageMapKey(identifier)
-
-			value := interpreter.ReadStored(address, domain, storageMapKey)
-
-			if value == nil {
-				return Nil
-			}
-
-			link, ok := value.(PathLinkValue)
-			if !ok {
-				return Nil
-			}
-
-			return NewSomeValueNonCopying(
-				interpreter,
-				link.TargetPath,
-			)
-		},
-	)
-}
-
-func (interpreter *Interpreter) authAccountUnlinkFunction(addressValue AddressValue) *HostFunctionValue {
-
-	// Converted addresses can be cached and don't have to be recomputed on each function invocation
-	address := addressValue.ToAddress()
-
-	return NewHostFunctionValue(
-		interpreter,
-		sema.AuthAccountTypeUnlinkFunctionType,
-		func(invocation Invocation) Value {
-			interpreter := invocation.Interpreter
-
-			capabilityPath, ok := invocation.Arguments[0].(PathValue)
-			if !ok {
-				panic(errors.NewUnreachableError())
-			}
-
-			domain := capabilityPath.Domain.Identifier()
-			identifier := capabilityPath.Identifier
-
-			// Write new value
-
-			storageMapKey := StringStorageMapKey(identifier)
-
-			interpreter.WriteStored(
-				address,
-				domain,
-				storageMapKey,
-				nil,
-			)
-
-			return Void
-		},
-	)
-}
-
-func (interpreter *Interpreter) pathCapabilityBorrowFunction(
-	addressValue AddressValue,
-	pathValue PathValue,
-	borrowType *sema.ReferenceType,
-) *HostFunctionValue {
-
-	// Converted addresses can be cached and don't have to be recomputed on each function invocation
-	address := addressValue.ToAddress()
-
-	return NewHostFunctionValue(
-		interpreter,
-		sema.CapabilityTypeBorrowFunctionType(borrowType),
-		func(invocation Invocation) Value {
-
-			interpreter := invocation.Interpreter
-			locationRange := invocation.LocationRange
-
-			// NOTE: if a type argument is provided for the function,
-			// use it *instead* of the type of the value (if any)
-
-			typeParameterPair := invocation.TypeParameterTypes.Oldest()
-			if typeParameterPair != nil {
-				ty := typeParameterPair.Value
-				var ok bool
-				borrowType, ok = ty.(*sema.ReferenceType)
-				if !ok {
-					panic(errors.NewUnreachableError())
-				}
-			}
-
-			if borrowType == nil {
-				panic(errors.NewUnreachableError())
-			}
-
-			target, authorized, err :=
-				interpreter.GetPathCapabilityFinalTarget(
-					address,
-					pathValue,
-					borrowType,
-					true,
-					locationRange,
-				)
-			if err != nil {
-				panic(err)
-			}
-
-			var reference ReferenceValue
-
-			switch target := target.(type) {
-			case nil:
-				reference = nil
-
-			case AccountCapabilityTarget:
-				reference = NewAccountReferenceValue(
-					interpreter,
-					address,
-					pathValue,
-					borrowType.Type,
-				)
-
-			case PathCapabilityTarget:
-				targetPath := PathValue(target)
-
-				storageReference := NewStorageReferenceValue(
-					interpreter,
-					authorized,
-					address,
-					targetPath,
-					borrowType.Type,
-				)
-
-				// Attempt to dereference,
-				// which reads the stored value
-				// and performs a dynamic type check
-
-				value, err := storageReference.dereference(interpreter, locationRange)
-				if err != nil {
-					panic(err)
-				}
-				if value != nil {
-					reference = storageReference
-				}
-
-			default:
-				panic(errors.NewUnreachableError())
-			}
-
-			if reference == nil {
-				return Nil
-			}
-			return NewSomeValueNonCopying(interpreter, reference)
-		},
-	)
-}
-
-func (interpreter *Interpreter) pathCapabilityCheckFunction(
-	addressValue AddressValue,
-	pathValue PathValue,
-	borrowType *sema.ReferenceType,
-) *HostFunctionValue {
-
-	// Converted addresses can be cached and don't have to be recomputed on each function invocation
-	address := addressValue.ToAddress()
-
-	return NewHostFunctionValue(
-		interpreter,
-		sema.CapabilityTypeCheckFunctionType(borrowType),
-		func(invocation Invocation) Value {
-
-			interpreter := invocation.Interpreter
-			locationRange := invocation.LocationRange
-
-			// NOTE: if a type argument is provided for the function,
-			// use it *instead* of the type of the value (if any)
-
-			typeParameterPair := invocation.TypeParameterTypes.Oldest()
-			if typeParameterPair != nil {
-				ty := typeParameterPair.Value
-				var ok bool
-				borrowType, ok = ty.(*sema.ReferenceType)
-				if !ok {
-					panic(errors.NewUnreachableError())
-				}
-			}
-
-			if borrowType == nil {
-				panic(errors.NewUnreachableError())
-			}
-
-			valid, err := interpreter.checkValueAtPath(address, pathValue, borrowType, locationRange)
-			if err != nil {
-				panic(err)
-			}
-
-			return AsBoolValue(valid)
-		},
-	)
-}
-
-func (interpreter *Interpreter) checkValueAtPath(
-	address common.Address,
-	pathValue PathValue,
-	borrowType *sema.ReferenceType,
-	locationRange LocationRange,
-) (bool, error) {
-
-	target, authorized, err := interpreter.GetPathCapabilityFinalTarget(
-		address,
-		pathValue,
-		borrowType,
-		true,
-		locationRange,
-	)
-
-	if err != nil {
-		return false, err
-	}
-
-	if target == nil {
-		return false, nil
-	}
-
-	switch target := target.(type) {
-	case AccountCapabilityTarget:
-		return true, nil
-
-	case PathCapabilityTarget:
-		targetPath := PathValue(target)
-
-		reference := NewStorageReferenceValue(
-			interpreter,
-			authorized,
-			address,
-			targetPath,
-			borrowType.Type,
-		)
-
-		// Attempt to dereference,
-		// which reads the stored value
-		// and performs a dynamic type check
-
-		return reference.ReferencedValue(interpreter, locationRange, false) != nil, nil
-
-	default:
-		panic(errors.NewUnreachableError())
-	}
-}
-
-func (interpreter *Interpreter) GetPathCapabilityFinalTarget(
-	address common.Address,
-	path PathValue,
-	wantedBorrowType *sema.ReferenceType,
-	checkTargetExists bool,
-	locationRange LocationRange,
-) (
-	target CapabilityTarget,
-	authorized bool,
-	err error,
-) {
-	wantedReferenceType := wantedBorrowType
-
-	seenPaths := map[PathValue]struct{}{}
-	paths := []PathValue{path}
-
-	for {
-		// Detect cyclic links
-
-		if _, ok := seenPaths[path]; ok {
-			return nil, false, CyclicLinkError{
-				Address:       address,
-				Paths:         paths,
-				LocationRange: locationRange,
-			}
-		} else {
-			seenPaths[path] = struct{}{}
-		}
-
-		domain := path.Domain.Identifier()
-		identifier := path.Identifier
-
-		storageMapKey := StringStorageMapKey(identifier)
-
-		switch path.Domain {
-		case common.PathDomainStorage:
-
-			if checkTargetExists &&
-				!interpreter.StoredValueExists(address, domain, storageMapKey) {
-
-				return nil, false, nil
-			}
-
-			return PathCapabilityTarget(path),
-				wantedReferenceType.Authorized,
-				nil
-
-		case common.PathDomainPublic,
-			common.PathDomainPrivate:
-
-			value := interpreter.ReadStored(address, domain, storageMapKey)
-			if value == nil {
-				return nil, false, nil
-			}
-
-			switch value := value.(type) {
-			case PathLinkValue:
-				allowedType := interpreter.MustConvertStaticToSemaType(value.Type)
-
-				if !sema.IsSubType(allowedType, wantedBorrowType) {
-					return nil, false, nil
-				}
-
-				targetPath := value.TargetPath
-				paths = append(paths, targetPath)
-				path = targetPath
-
-			case AccountLinkValue:
-				if !interpreter.IsSubTypeOfSemaType(
-					AuthAccountReferenceStaticType,
-					wantedBorrowType,
-				) {
-					return nil, false, nil
-				}
-
-				return AccountCapabilityTarget(address),
-					false,
-					nil
-
-			case *IDCapabilityValue:
-
-				// For backwards-compatibility, follow ID capability values
-				// which are published in the public or private domain
-
-				capabilityBorrowType, ok :=
-					interpreter.MustConvertStaticToSemaType(value.BorrowType).(*sema.ReferenceType)
-				if !ok {
-					panic(errors.NewUnreachableError())
-				}
-
-				reference := interpreter.SharedState.Config.IDCapabilityBorrowHandler(
-					interpreter,
-					locationRange,
-					value.Address,
-					value.ID,
-					wantedBorrowType,
-					capabilityBorrowType,
-				)
-				if reference == nil {
-					return nil, false, nil
-				}
-
-				switch reference := reference.(type) {
-				case *StorageReferenceValue:
-					address = reference.TargetStorageAddress
-					targetPath := reference.TargetPath
-					paths = append(paths, targetPath)
-					path = targetPath
-
-				case *AccountReferenceValue:
-					return AccountCapabilityTarget(reference.Address),
-						false,
-						nil
-
-				default:
-					return nil, false, nil
-				}
-
-			default:
-				panic(errors.NewUnreachableError())
-			}
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 		}
 	}
 
diff --git a/runtime/interpreter/value.go b/runtime/interpreter/value.go
remerge CONFLICT (content): Merge conflict in runtime/interpreter/value.go
index 87303a2c2..9a290a02f 100644
--- a/runtime/interpreter/value.go
+++ b/runtime/interpreter/value.go
@@ -17479,8 +17479,7 @@ func attachmentBaseAndSelfValues(
 	interpreter *Interpreter,
 	v *CompositeValue,
 ) (base *EphemeralReferenceValue, self *EphemeralReferenceValue) {
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
-	base = v.getBaseValue(interpreter, locationRange)
+	base = v.getBaseValue()
 
 	attachmentType := interpreter.MustSemaTypeOfValue(v).(*sema.CompositeType)
 
@@ -17489,9 +17488,6 @@ func attachmentBaseAndSelfValues(
 		attachmentReferenceAuth = ConvertSemaAccesstoStaticAuthorization(interpreter, attachmentType.AttachmentEntitlementAccess.Codomain())
 	}
 
-=======
-	base = v.getBaseValue()
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 	// in attachment functions, self is a reference value
 	self = NewEphemeralReferenceValue(interpreter, attachmentReferenceAuth, v, interpreter.MustSemaTypeOfValue(v))
 	interpreter.trackReferencedResourceKindedValue(v.StorageID(), v)
diff --git a/runtime/literal.go b/runtime/literal.go
remerge CONFLICT (content): Merge conflict in runtime/literal.go
index 76015b087..06e0e0da8 100644
--- a/runtime/literal.go
+++ b/runtime/literal.go
@@ -108,11 +108,7 @@ func ParseLiteralArgumentList(
 		value, err := LiteralValue(inter, argument.Expression, parameterType)
 		if err != nil {
 			return nil, parser.NewSyntaxError(
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
-				ast.Position{Line: 1},
-=======
 				argument.Expression.StartPosition(),
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 				"invalid argument at index %d: %v", i, err,
 			)
 		}
diff --git a/runtime/parser/errors.go b/runtime/parser/errors.go
remerge CONFLICT (content): Merge conflict in runtime/parser/errors.go
index 5e4868a20..90dff88f4 100644
--- a/runtime/parser/errors.go
+++ b/runtime/parser/errors.go
@@ -72,16 +72,6 @@ func NewSyntaxError(pos ast.Position, message string, params ...any) *SyntaxErro
 	}
 }
 
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
-=======
-func NewUnpositionedSyntaxError(message string, params ...any) *SyntaxError {
-	return &SyntaxError{
-		Pos:     ast.Position{Line: 1},
-		Message: fmt.Sprintf(message, params...),
-	}
-}
-
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 var _ ParseError = &SyntaxError{}
 var _ errors.UserError = &SyntaxError{}
 
diff --git a/runtime/parser/type.go b/runtime/parser/type.go
remerge CONFLICT (content): Merge conflict in runtime/parser/type.go
index 50fe14ea3..67b3fb2df 100644
--- a/runtime/parser/type.go
+++ b/runtime/parser/type.go
@@ -80,20 +80,6 @@ func setTypeLeftDenotation(tokenType lexer.TokenType, leftDenotation typeLeftDen
 	typeLeftDenotations[tokenType] = leftDenotation
 }
 
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
-=======
-func setTypeMetaLeftDenotation(tokenType lexer.TokenType, metaLeftDenotation typeMetaLeftDenotationFunc) {
-	current := typeMetaLeftDenotations[tokenType]
-	if current != nil {
-		panic(errors.NewUnexpectedError(
-			"type meta left denotation for token %s already exists",
-			tokenType,
-		))
-	}
-	typeMetaLeftDenotations[tokenType] = metaLeftDenotation
-}
-
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 type prefixTypeFunc func(parser *parser, right ast.Type, tokenRange ast.Range) ast.Type
 type postfixTypeFunc func(parser *parser, left ast.Type, tokenRange ast.Range) ast.Type
 
diff --git a/runtime/runtime_test.go b/runtime/runtime_test.go
index a863bee16..a54aaa029 100644
--- a/runtime/runtime_test.go
+++ b/runtime/runtime_test.go
@@ -8957,7 +8957,7 @@ func TestRuntimeComputationMeteringError(t *testing.T) {
 		script := []byte(`
             access(all) fun foo() {}
 
-            pub fun main() {
+            access(all) fun main() {
                 foo()
             }
         `)
@@ -8992,7 +8992,7 @@ func TestRuntimeComputationMeteringError(t *testing.T) {
 		script := []byte(`
             access(all) fun foo() {}
 
-            pub fun main() {
+            access(all) fun main() {
                 foo()
             }
         `)
@@ -9027,7 +9027,7 @@ func TestRuntimeComputationMeteringError(t *testing.T) {
 		script := []byte(`
             access(all) fun foo() {}
 
-            pub fun main() {
+            access(all) fun main() {
                 foo()
             }
         `)
@@ -9064,7 +9064,7 @@ func TestRuntimeComputationMeteringError(t *testing.T) {
 		script := []byte(`
             access(all) fun foo() {}
 
-            pub fun main() {
+            access(all) fun main() {
                 foo()
             }
         `)
@@ -9147,7 +9147,8 @@ func TestRuntimeWrappedErrorHandling(t *testing.T) {
         transaction {
             prepare(signer: AuthAccount) {
                 signer.save(<- Foo.createR(), to: /storage/r)
-                signer.link<&Foo.R>(/private/r, target:/storage/r)
+                let cap = signer.capabilities.storage.issue<&Foo.R>(/storage/r)
+                signer.capabilities.publish(cap, at: /public/r)
             }
         }
     `)
@@ -9155,7 +9156,7 @@ func TestRuntimeWrappedErrorHandling(t *testing.T) {
 	tx2 := []byte(`
         transaction {
             prepare(signer: AuthAccount) {
-                var cap = signer.getCapability<&AnyStruct>(/private/r)
+                let cap = signer.capabilities.get<&AnyStruct>(/public/r)!
 				cap.check()
             }
         }
diff --git a/runtime/sema/authaccount.cdc b/runtime/sema/authaccount.cdc
remerge CONFLICT (content): Merge conflict in runtime/sema/authaccount.cdc
index 237fa2a06..14bf6f0f5 100644
--- a/runtime/sema/authaccount.cdc
+++ b/runtime/sema/authaccount.cdc
@@ -121,47 +121,8 @@ struct AuthAccount {
     /// The given type must not necessarily be exactly the same as the type of the borrowed object.
     ///
     /// The path must be a storage path, i.e., only the domain `storage` is allowed.
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
     access(all)
     view fun check<T: Any>(from: StoragePath): Bool
-=======
-    pub fun check<T: Any>(from: StoragePath): Bool
-
-    /// Creates a capability at the given public or private path,
-    /// which targets the given public, private, or storage path.
-    ///
-    /// The target path leads to the object that will provide the functionality defined by this capability.
-    ///
-    /// The given type defines how the capability can be borrowed, i.e., how the stored value can be accessed.
-    ///
-    /// Returns nil if a link for the given capability path already exists, or the newly created capability if not.
-    ///
-    /// It is not necessary for the target path to lead to a valid object; the target path could be empty,
-    /// or could lead to an object which does not provide the necessary type interface:
-    /// The link function does **not** check if the target path is valid/exists at the time the capability is created
-    /// and does **not** check if the target value conforms to the given type.
-    ///
-    /// The link is latent.
-    ///
-    /// The target value might be stored after the link is created,
-    /// and the target value might be moved out after the link has been created.
-    pub fun link<T: &Any>(_ newCapabilityPath: CapabilityPath, target: Path): Capability<T>?
-
-    /// Creates a capability at the given public or private path which targets this account.
-    ///
-    /// Returns nil if a link for the given capability path already exists, or the newly created capability if not.
-    pub fun linkAccount(_ newCapabilityPath: PrivatePath): Capability<&AuthAccount>?
-
-    /// Returns the capability at the given private or public path.
-    pub fun getCapability<T: &Any>(_ path: CapabilityPath): Capability<T>
-
-    /// Returns the target path of the capability at the given public or private path,
-    /// or nil if there exists no capability at the given path.
-    pub fun getLinkTarget(_ path: CapabilityPath): Path?
-
-    /// Removes the capability at the given public or private path.
-    pub fun unlink(_ path: CapabilityPath)
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 
     /// Iterate over all the public paths of an account,
     /// passing each path and type in turn to the provided callback function.
diff --git a/runtime/sema/authaccount.gen.go b/runtime/sema/authaccount.gen.go
remerge CONFLICT (content): Merge conflict in runtime/sema/authaccount.gen.go
index 61f253d22..1314fbcf5 100644
--- a/runtime/sema/authaccount.gen.go
+++ b/runtime/sema/authaccount.gen.go
@@ -353,169 +353,6 @@ The given type must not necessarily be exactly the same as the type of the borro
 The path must be a storage path, i.e., only the domain ` + "`storage`" + ` is allowed.
 `
 
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
-=======
-const AuthAccountTypeLinkFunctionName = "link"
-
-var AuthAccountTypeLinkFunctionTypeParameterT = &TypeParameter{
-	Name: "T",
-	TypeBound: &ReferenceType{
-		Type: AnyType,
-	},
-}
-
-var AuthAccountTypeLinkFunctionType = &FunctionType{
-	TypeParameters: []*TypeParameter{
-		AuthAccountTypeLinkFunctionTypeParameterT,
-	},
-	Parameters: []Parameter{
-		{
-			Label:          ArgumentLabelNotRequired,
-			Identifier:     "newCapabilityPath",
-			TypeAnnotation: NewTypeAnnotation(CapabilityPathType),
-		},
-		{
-			Identifier:     "target",
-			TypeAnnotation: NewTypeAnnotation(PathType),
-		},
-	},
-	ReturnTypeAnnotation: NewTypeAnnotation(
-		&OptionalType{
-			Type: MustInstantiate(
-				&CapabilityType{},
-				&GenericType{
-					TypeParameter: AuthAccountTypeLinkFunctionTypeParameterT,
-				},
-			),
-		},
-	),
-}
-
-const AuthAccountTypeLinkFunctionDocString = `
-Creates a capability at the given public or private path,
-which targets the given public, private, or storage path.
-
-The target path leads to the object that will provide the functionality defined by this capability.
-
-The given type defines how the capability can be borrowed, i.e., how the stored value can be accessed.
-
-Returns nil if a link for the given capability path already exists, or the newly created capability if not.
-
-It is not necessary for the target path to lead to a valid object; the target path could be empty,
-or could lead to an object which does not provide the necessary type interface:
-The link function does **not** check if the target path is valid/exists at the time the capability is created
-and does **not** check if the target value conforms to the given type.
-
-The link is latent.
-
-The target value might be stored after the link is created,
-and the target value might be moved out after the link has been created.
-`
-
-const AuthAccountTypeLinkAccountFunctionName = "linkAccount"
-
-var AuthAccountTypeLinkAccountFunctionType = &FunctionType{
-	Parameters: []Parameter{
-		{
-			Label:          ArgumentLabelNotRequired,
-			Identifier:     "newCapabilityPath",
-			TypeAnnotation: NewTypeAnnotation(PrivatePathType),
-		},
-	},
-	ReturnTypeAnnotation: NewTypeAnnotation(
-		&OptionalType{
-			Type: MustInstantiate(
-				&CapabilityType{},
-				&ReferenceType{
-					Type: AuthAccountType,
-				},
-			),
-		},
-	),
-}
-
-const AuthAccountTypeLinkAccountFunctionDocString = `
-Creates a capability at the given public or private path which targets this account.
-
-Returns nil if a link for the given capability path already exists, or the newly created capability if not.
-`
-
-const AuthAccountTypeGetCapabilityFunctionName = "getCapability"
-
-var AuthAccountTypeGetCapabilityFunctionTypeParameterT = &TypeParameter{
-	Name: "T",
-	TypeBound: &ReferenceType{
-		Type: AnyType,
-	},
-}
-
-var AuthAccountTypeGetCapabilityFunctionType = &FunctionType{
-	TypeParameters: []*TypeParameter{
-		AuthAccountTypeGetCapabilityFunctionTypeParameterT,
-	},
-	Parameters: []Parameter{
-		{
-			Label:          ArgumentLabelNotRequired,
-			Identifier:     "path",
-			TypeAnnotation: NewTypeAnnotation(CapabilityPathType),
-		},
-	},
-	ReturnTypeAnnotation: NewTypeAnnotation(
-		MustInstantiate(
-			&CapabilityType{},
-			&GenericType{
-				TypeParameter: AuthAccountTypeGetCapabilityFunctionTypeParameterT,
-			},
-		),
-	),
-}
-
-const AuthAccountTypeGetCapabilityFunctionDocString = `
-Returns the capability at the given private or public path.
-`
-
-const AuthAccountTypeGetLinkTargetFunctionName = "getLinkTarget"
-
-var AuthAccountTypeGetLinkTargetFunctionType = &FunctionType{
-	Parameters: []Parameter{
-		{
-			Label:          ArgumentLabelNotRequired,
-			Identifier:     "path",
-			TypeAnnotation: NewTypeAnnotation(CapabilityPathType),
-		},
-	},
-	ReturnTypeAnnotation: NewTypeAnnotation(
-		&OptionalType{
-			Type: PathType,
-		},
-	),
-}
-
-const AuthAccountTypeGetLinkTargetFunctionDocString = `
-Returns the target path of the capability at the given public or private path,
-or nil if there exists no capability at the given path.
-`
-
-const AuthAccountTypeUnlinkFunctionName = "unlink"
-
-var AuthAccountTypeUnlinkFunctionType = &FunctionType{
-	Parameters: []Parameter{
-		{
-			Label:          ArgumentLabelNotRequired,
-			Identifier:     "path",
-			TypeAnnotation: NewTypeAnnotation(CapabilityPathType),
-		},
-	},
-	ReturnTypeAnnotation: NewTypeAnnotation(
-		VoidType,
-	),
-}
-
-const AuthAccountTypeUnlinkFunctionDocString = `
-Removes the capability at the given public or private path.
-`
-
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 const AuthAccountTypeForEachPublicFunctionName = "forEachPublic"
 
 var AuthAccountTypeForEachPublicFunctionType = &FunctionType{
diff --git a/runtime/sema/publicaccount.cdc b/runtime/sema/publicaccount.cdc
remerge CONFLICT (content): Merge conflict in runtime/sema/publicaccount.cdc
index 4e16b0b6f..0667c836d 100644
--- a/runtime/sema/publicaccount.cdc
+++ b/runtime/sema/publicaccount.cdc
@@ -35,19 +35,8 @@ struct PublicAccount {
     let capabilities: PublicAccount.Capabilities
 
     /// All public paths of this account.
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
     access(all)
     let publicPaths: [PublicPath]
-=======
-    pub let publicPaths: [PublicPath]
-
-    /// Returns the capability at the given public path.
-    pub fun getCapability<T: &Any>(_ path: PublicPath): Capability<T>
-
-    /// Returns the target path of the capability at the given public or private path,
-    /// or nil if there exists no capability at the given path.
-    pub fun getLinkTarget(_ path: CapabilityPath): Path?
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 
     /// Iterate over all the public paths of an account.
     /// passing each path and type in turn to the provided callback function.
diff --git a/runtime/sema/publicaccount.gen.go b/runtime/sema/publicaccount.gen.go
remerge CONFLICT (content): Merge conflict in runtime/sema/publicaccount.gen.go
index d9608e629..f55c5947c 100644
--- a/runtime/sema/publicaccount.gen.go
+++ b/runtime/sema/publicaccount.gen.go
@@ -98,65 +98,6 @@ const PublicAccountTypePublicPathsFieldDocString = `
 All public paths of this account.
 `
 
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
-=======
-const PublicAccountTypeGetCapabilityFunctionName = "getCapability"
-
-var PublicAccountTypeGetCapabilityFunctionTypeParameterT = &TypeParameter{
-	Name: "T",
-	TypeBound: &ReferenceType{
-		Type: AnyType,
-	},
-}
-
-var PublicAccountTypeGetCapabilityFunctionType = &FunctionType{
-	TypeParameters: []*TypeParameter{
-		PublicAccountTypeGetCapabilityFunctionTypeParameterT,
-	},
-	Parameters: []Parameter{
-		{
-			Label:          ArgumentLabelNotRequired,
-			Identifier:     "path",
-			TypeAnnotation: NewTypeAnnotation(PublicPathType),
-		},
-	},
-	ReturnTypeAnnotation: NewTypeAnnotation(
-		MustInstantiate(
-			&CapabilityType{},
-			&GenericType{
-				TypeParameter: PublicAccountTypeGetCapabilityFunctionTypeParameterT,
-			},
-		),
-	),
-}
-
-const PublicAccountTypeGetCapabilityFunctionDocString = `
-Returns the capability at the given public path.
-`
-
-const PublicAccountTypeGetLinkTargetFunctionName = "getLinkTarget"
-
-var PublicAccountTypeGetLinkTargetFunctionType = &FunctionType{
-	Parameters: []Parameter{
-		{
-			Label:          ArgumentLabelNotRequired,
-			Identifier:     "path",
-			TypeAnnotation: NewTypeAnnotation(CapabilityPathType),
-		},
-	},
-	ReturnTypeAnnotation: NewTypeAnnotation(
-		&OptionalType{
-			Type: PathType,
-		},
-	),
-}
-
-const PublicAccountTypeGetLinkTargetFunctionDocString = `
-Returns the target path of the capability at the given public or private path,
-or nil if there exists no capability at the given path.
-`
-
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 const PublicAccountTypeForEachPublicFunctionName = "forEachPublic"
 
 var PublicAccountTypeForEachPublicFunctionType = &FunctionType{
diff --git a/runtime/stdlib/account.go b/runtime/stdlib/account.go
remerge CONFLICT (content): Merge conflict in runtime/stdlib/account.go
index 04b66d758..ae1553e42 100644
--- a/runtime/stdlib/account.go
+++ b/runtime/stdlib/account.go
@@ -457,120 +457,6 @@ func newStorageCapacityGetFunction(
 	}
 }
 
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
-=======
-type AccountEncodedKeyAdditionHandler interface {
-	EventEmitter
-	// AddEncodedAccountKey appends an encoded key to an account.
-	AddEncodedAccountKey(address common.Address, key []byte) error
-}
-
-func newAddPublicKeyFunction(
-	gauge common.MemoryGauge,
-	handler AccountEncodedKeyAdditionHandler,
-	addressValue interpreter.AddressValue,
-) *interpreter.HostFunctionValue {
-
-	// Converted addresses can be cached and don't have to be recomputed on each function invocation
-	address := addressValue.ToAddress()
-
-	return interpreter.NewHostFunctionValue(
-		gauge,
-		sema.AuthAccountTypeAddPublicKeyFunctionType,
-		func(invocation interpreter.Invocation) interpreter.Value {
-			publicKeyValue, ok := invocation.Arguments[0].(*interpreter.ArrayValue)
-			if !ok {
-				panic(errors.NewUnreachableError())
-			}
-
-			locationRange := invocation.LocationRange
-
-			inter := invocation.Interpreter
-
-			publicKey, err := interpreter.ByteArrayValueToByteSlice(inter, publicKeyValue, locationRange)
-			if err != nil {
-				panic("addPublicKey requires the first argument to be a byte array")
-			}
-
-			errors.WrapPanic(func() {
-				err = handler.AddEncodedAccountKey(address, publicKey)
-			})
-			if err != nil {
-				panic(interpreter.WrappedExternalError(err))
-			}
-
-			handler.EmitEvent(
-				inter,
-				AccountKeyAddedFromByteArrayEventType,
-				[]interpreter.Value{
-					addressValue,
-					publicKeyValue,
-				},
-				locationRange,
-			)
-
-			return interpreter.Void
-		},
-	)
-}
-
-type AccountEncodedKeyRevocationHandler interface {
-	EventEmitter
-	// RevokeEncodedAccountKey removes a key from an account by index, add returns the encoded key.
-	RevokeEncodedAccountKey(address common.Address, index int) ([]byte, error)
-}
-
-func newRemovePublicKeyFunction(
-	gauge common.MemoryGauge,
-	handler AccountEncodedKeyRevocationHandler,
-	addressValue interpreter.AddressValue,
-) *interpreter.HostFunctionValue {
-
-	// Converted addresses can be cached and don't have to be recomputed on each function invocation
-	address := addressValue.ToAddress()
-
-	return interpreter.NewHostFunctionValue(
-		gauge,
-		sema.AuthAccountTypeRemovePublicKeyFunctionType,
-		func(invocation interpreter.Invocation) interpreter.Value {
-			index, ok := invocation.Arguments[0].(interpreter.IntValue)
-			if !ok {
-				panic(errors.NewUnreachableError())
-			}
-
-			var publicKey []byte
-			var err error
-			errors.WrapPanic(func() {
-				publicKey, err = handler.RevokeEncodedAccountKey(address, index.ToInt(invocation.LocationRange))
-			})
-			if err != nil {
-				panic(interpreter.WrappedExternalError(err))
-			}
-
-			inter := invocation.Interpreter
-			locationRange := invocation.LocationRange
-
-			publicKeyValue := interpreter.ByteSliceToByteArrayValue(
-				inter,
-				publicKey,
-			)
-
-			handler.EmitEvent(
-				inter,
-				AccountKeyRemovedFromByteArrayEventType,
-				[]interpreter.Value{
-					addressValue,
-					publicKeyValue,
-				},
-				locationRange,
-			)
-
-			return interpreter.Void
-		},
-	)
-}
-
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 type AccountKeyAdditionHandler interface {
 	EventEmitter
 	PublicKeyValidator
diff --git a/runtime/storage_test.go b/runtime/storage_test.go
index b1093fdc8..65b0b2b59 100644
--- a/runtime/storage_test.go
+++ b/runtime/storage_test.go
@@ -3700,18 +3700,18 @@ func TestRuntimeStorageIteration(t *testing.T) {
 		contractIsBroken := false
 
 		deployFoo := DeploymentTransaction("Foo", []byte(`
-            pub contract Foo {
-                pub resource interface Collection {}
+            access(all) contract Foo {
+                access(all) resource interface Collection {}
             }
         `))
 
 		deployBar := DeploymentTransaction("Bar", []byte(`
             import Foo from 0x1
 
-            pub contract Bar {
-                pub resource CollectionImpl: Foo.Collection {}
+            access(all) contract Bar {
+                access(all) resource CollectionImpl: Foo.Collection {}
 
-                pub fun getCollection(): @Bar.CollectionImpl {
+                access(all) fun getCollection(): @Bar.CollectionImpl {
                     return <- create Bar.CollectionImpl()
                 }
             }
@@ -3734,9 +3734,9 @@ func TestRuntimeStorageIteration(t *testing.T) {
 						return []byte(`
                         import Foo from 0x1
 
-                        pub contract Bar {
-                            pub resource CollectionImpl: Foo.Collection {
-                                pub var mismatch: Int
+                        access(all) contract Bar {
+                            access(all) resource CollectionImpl: Foo.Collection {
+                                access(all) var mismatch: Int
 
                                 init() {
                                     self.mismatch = "hello"
@@ -3925,18 +3925,18 @@ func TestRuntimeStorageIteration(t *testing.T) {
 			contractIsBroken := false
 
 			deployFoo := DeploymentTransaction("Foo", []byte(`
-            pub contract Foo {
-                pub resource interface Collection {}
+            access(all) contract Foo {
+                access(all) resource interface Collection {}
             }
         `))
 
 			deployBar := DeploymentTransaction("Bar", []byte(`
             import Foo from 0x1
 
-            pub contract Bar {
-                pub resource CollectionImpl: Foo.Collection {}
+            access(all) contract Bar {
+                access(all) resource CollectionImpl: Foo.Collection {}
 
-                pub fun getCollection(): @Bar.CollectionImpl {
+                access(all) fun getCollection(): @Bar.CollectionImpl {
                     return <- create Bar.CollectionImpl()
                 }
             }
@@ -3959,9 +3959,9 @@ func TestRuntimeStorageIteration(t *testing.T) {
 							return []byte(`
                         import Foo from 0x1
 
-                        pub contract Bar {
-                            pub resource CollectionImpl: Foo.Collection {
-                                pub var mismatch: Int
+                        access(all) contract Bar {
+                            access(all) resource CollectionImpl: Foo.Collection {
+                                access(all) var mismatch: Int
 
                                 init() {
                                     self.mismatch = "hello"
diff --git a/runtime/tests/checker/reference_test.go b/runtime/tests/checker/reference_test.go
remerge CONFLICT (content): Merge conflict in runtime/tests/checker/reference_test.go
index 4b208cde0..e804153e9 100644
--- a/runtime/tests/checker/reference_test.go
+++ b/runtime/tests/checker/reference_test.go
@@ -1421,7 +1421,6 @@ func TestCheckReferenceTypeImplicitConformance(t *testing.T) {
 	})
 }
 
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
 func TestCheckInvalidatedReferenceUse(t *testing.T) {
 
 	t.Parallel()
@@ -2813,7 +2812,7 @@ func TestCheckResourceReferenceMethodInvocationAfterMove(t *testing.T) {
 	invalidatedRefError := &sema.InvalidatedResourceReferenceError{}
 	assert.ErrorAs(t, errs[0], &invalidatedRefError)
 }
-=======
+
 func TestCheckReferenceCreationWithInvalidType(t *testing.T) {
 
 	t.Parallel()
@@ -2850,4 +2849,3 @@ func TestCheckReferenceCreationWithInvalidType(t *testing.T) {
 		require.ErrorAs(t, errs[0], &nonReferenceTypeReferenceError)
 	})
 }
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
diff --git a/runtime/tests/interpreter/values_test.go b/runtime/tests/interpreter/values_test.go
remerge CONFLICT (content): Merge conflict in runtime/tests/interpreter/values_test.go
index 94d46994b..2289379cb 100644
--- a/runtime/tests/interpreter/values_test.go
+++ b/runtime/tests/interpreter/values_test.go
@@ -1154,15 +1154,6 @@ func (r randomValueGenerator) randomStorableValue(inter *interpreter.Interpreter
 		return interpreter.Void
 	case randomValueKindNil:
 		return interpreter.Nil
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
-	case Dictionary_1, Dictionary_2:
-		return randomDictionaryValue(inter, currentDepth)
-	case Array_1, Array_2:
-		return randomArrayValue(inter, currentDepth)
-	case Composite:
-		return randomCompositeValue(inter, common.CompositeKindStructure, currentDepth)
-	case IDCapability:
-=======
 	case randomValueKindDictionaryVariant1,
 		randomValueKindDictionaryVariant2:
 		return r.randomDictionaryValue(inter, currentDepth)
@@ -1173,17 +1164,7 @@ func (r randomValueGenerator) randomStorableValue(inter *interpreter.Interpreter
 		fieldsCount := r.randomInt(compositeMaxFields)
 		v, _ := r.randomCompositeValue(common.ZeroAddress, fieldsCount, inter, currentDepth)
 		return v
-	case randomValueKindPathCapability:
-		return interpreter.NewUnmeteredPathCapabilityValue(
-			r.randomAddressValue(),
-			r.randomPathValue(),
-			interpreter.ReferenceStaticType{
-				Authorized:   false,
-				BorrowedType: interpreter.PrimitiveStaticTypeAnyStruct,
-			},
-		)
 	case randomValueKindIDCapability:
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 		return interpreter.NewUnmeteredIDCapabilityValue(
 			interpreter.UInt64Value(r.randomInt(math.MaxInt-1)),
 			r.randomAddressValue(),
@@ -1528,17 +1509,9 @@ const (
 	randomValueKindEnum
 
 	// Non-hashable values
-<<<<<<< 9bdde37e9 (Merge pull request #2699 from onflow/bastian/2698-improve-account-functions-view-annotations)
-
-	Void
-	Nil // `Never?`
-	IDCapability
-=======
 	randomValueKindVoid
 	randomValueKindNil // `Never?`
-	randomValueKindPathCapability
 	randomValueKindIDCapability
->>>>>>> 96403f2fe (Merge pull request #2695 from onflow/release/v0.40.0)
 
 	// Containers
 	randomValueKindSome

Mostly re-removed old linking-based capabiltity API.

Many storage iteration tests (TestRuntimeStorageIteration) are currently failing, because the value check used the linking API and needs to be updated. I commented it out temporarily.

@SupunS could you maybe please also have a look at what needs to be done to restore the value check / error handling? 🙏


  • Targeted PR against master branch
  • Linked to Github issue with discussion and accepted design OR link to spec that describes this work
  • Code follows the standards mentioned here
  • Updated relevant documentation
  • Re-reviewed Files changed in the Github PR explorer
  • Added appropriate labels

SupunS and others added 25 commits July 20, 2023 17:46
Wrap host env errors with external errors
Fix storage iteration and error misclassification
Fix error on reference creation with invalid type
@turbolent turbolent added the Chore label Aug 8, 2023
@turbolent turbolent self-assigned this Aug 8, 2023
@github-actions
Copy link

github-actions bot commented Aug 8, 2023

Cadence Benchstat comparison

This branch with compared with the base branch onflow:feature/stable-cadence commit 9bdde37
The command for i in {1..N}; do go test ./... -run=XXX -bench=. -benchmem -shuffle=on; done was used.
Bench tests were run a total of 7 times on each branch.

Collapsed results for better readability

old.txtnew.txt
time/opdelta
CheckContractInterfaceFungibleTokenConformance-2138µs ± 0%137µs ± 0%~(p=1.000 n=1+1)
ContractInterfaceFungibleToken-254.6µs ± 0%53.6µs ± 0%~(p=1.000 n=1+1)
DecodeBatchEventsCCF-2192ms ± 0%198ms ± 0%~(p=1.000 n=1+1)
DecodeBatchEventsJSON-2598ms ± 0%595ms ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.FeesDeducted-24.08µs ± 0%6.62µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.TokensWithdrawn-23.19µs ± 0%4.67µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-24.65µs ± 0%5.73µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-24.51µs ± 0%5.67µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.NewWeeklyPayout-23.23µs ± 0%3.31µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.RewardsPaid-23.83µs ± 0%3.81µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensDeposited-23.84µs ± 0%3.94µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensDeposited_with_nil_receiver-23.72µs ± 0%3.77µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensMinted-23.19µs ± 0%3.20µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensWithdrawn-23.90µs ± 0%3.95µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowFees.FeesDeducted-214.9µs ± 0%14.8µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowFees.TokensWithdrawn-28.52µs ± 0%8.35µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-213.3µs ± 0%14.1µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-218.6µs ± 0%18.4µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.NewWeeklyPayout-28.59µs ± 0%8.49µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.RewardsPaid-211.7µs ± 0%11.1µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensDeposited-211.7µs ± 0%11.8µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensDeposited_with_nil_receiver-210.6µs ± 0%10.6µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensMinted-28.55µs ± 0%8.45µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensWithdrawn-211.8µs ± 0%12.0µs ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsCCF-290.9ms ± 0%124.3ms ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsJSON-2154ms ± 0%198ms ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowFees.FeesDeducted-21.93µs ± 0%1.93µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowFees.TokensWithdrawn-21.64µs ± 0%1.53µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-21.88µs ± 0%1.89µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-22.20µs ± 0%2.17µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.NewWeeklyPayout-21.50µs ± 0%1.53µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.RewardsPaid-21.71µs ± 0%1.72µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensDeposited-21.87µs ± 0%1.88µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensDeposited_with_nil_receiver-21.81µs ± 0%1.83µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensMinted-21.52µs ± 0%1.51µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensWithdrawn-21.84µs ± 0%1.95µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowFees.FeesDeducted-25.05µs ± 0%3.75µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowFees.TokensWithdrawn-22.52µs ± 0%2.03µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-24.24µs ± 0%3.31µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-24.83µs ± 0%4.78µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.NewWeeklyPayout-22.08µs ± 0%2.06µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.RewardsPaid-22.77µs ± 0%2.79µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensDeposited-23.17µs ± 0%3.25µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensDeposited_with_nil_receiver-22.40µs ± 0%2.47µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensMinted-22.01µs ± 0%2.03µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensWithdrawn-23.11µs ± 0%3.18µs ± 0%~(p=1.000 n=1+1)
ExportType/composite_type-2431ns ± 0%431ns ± 0%~(p=1.000 n=1+1)
ExportType/simple_type-2102ns ± 0%112ns ± 0%~(p=1.000 n=1+1)
InterpretRecursionFib-22.86ms ± 0%2.83ms ± 0%~(p=1.000 n=1+1)
NewInterpreter/new_interpreter-21.60µs ± 0%1.57µs ± 0%~(p=1.000 n=1+1)
NewInterpreter/new_sub-interpreter-2820ns ± 0%799ns ± 0%~(p=1.000 n=1+1)
ParseArray-29.86ms ± 0%9.79ms ± 0%~(p=1.000 n=1+1)
ParseDeploy/byte_array-214.7ms ± 0%15.2ms ± 0%~(p=1.000 n=1+1)
ParseDeploy/decode_hex-21.62ms ± 0%1.54ms ± 0%~(p=1.000 n=1+1)
ParseFungibleToken/With_memory_metering-2244µs ± 0%249µs ± 0%~(p=1.000 n=1+1)
ParseFungibleToken/Without_memory_metering-2191µs ± 0%190µs ± 0%~(p=1.000 n=1+1)
ParseInfix-28.40µs ± 0%8.47µs ± 0%~(p=1.000 n=1+1)
QualifiedIdentifierCreation/One_level-22.81ns ± 0%2.85ns ± 0%~(p=1.000 n=1+1)
QualifiedIdentifierCreation/Three_levels-2151ns ± 0%151ns ± 0%~(p=1.000 n=1+1)
RuntimeResourceDictionaryValues-26.21ms ± 0%6.27ms ± 0%~(p=1.000 n=1+1)
RuntimeScriptNoop-25.47µs ± 0%5.58µs ± 0%~(p=1.000 n=1+1)
SuperTypeInference/arrays-2426ns ± 0%426ns ± 0%~(p=1.000 n=1+1)
SuperTypeInference/composites-2176ns ± 0%176ns ± 0%~(p=1.000 n=1+1)
SuperTypeInference/integers-2192ns ± 0%191ns ± 0%~(p=1.000 n=1+1)
ValueIsSubtypeOfSemaType-2114ns ± 0%117ns ± 0%~(p=1.000 n=1+1)
 
alloc/opdelta
CheckContractInterfaceFungibleTokenConformance-253.6kB ± 0%53.6kB ± 0%~(p=1.000 n=1+1)
ContractInterfaceFungibleToken-226.0kB ± 0%26.0kB ± 0%~(all equal)
DecodeBatchEventsCCF-267.3MB ± 0%67.3MB ± 0%~(p=1.000 n=1+1)
DecodeBatchEventsJSON-2246MB ± 0%246MB ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.FeesDeducted-21.41kB ± 0%1.41kB ± 0%~(all equal)
DecodeCCF/FlowFees.TokensWithdrawn-21.22kB ± 0%1.22kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-21.49kB ± 0%1.49kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-21.50kB ± 0%1.50kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.NewWeeklyPayout-21.26kB ± 0%1.26kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.RewardsPaid-21.38kB ± 0%1.38kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited-21.34kB ± 0%1.34kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited_with_nil_receiver-21.33kB ± 0%1.33kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensMinted-21.22kB ± 0%1.22kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensWithdrawn-21.35kB ± 0%1.35kB ± 0%~(all equal)
DecodeJSON/FlowFees.FeesDeducted-26.02kB ± 0%6.02kB ± 0%~(all equal)
DecodeJSON/FlowFees.TokensWithdrawn-23.62kB ± 0%3.62kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-25.45kB ± 0%5.45kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-27.37kB ± 0%7.37kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.NewWeeklyPayout-23.66kB ± 0%3.66kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.RewardsPaid-24.55kB ± 0%4.55kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited-24.91kB ± 0%4.91kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited_with_nil_receiver-24.49kB ± 0%4.49kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensMinted-23.62kB ± 0%3.62kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensWithdrawn-24.91kB ± 0%4.91kB ± 0%~(all equal)
EncodeBatchEventsCCF-237.1MB ± 0%37.1MB ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsJSON-234.0MB ± 0%34.0MB ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowFees.FeesDeducted-2736B ± 0%736B ± 0%~(all equal)
EncodeCCF/FlowFees.TokensWithdrawn-2688B ± 0%688B ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-2800B ± 0%800B ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-2768B ± 0%768B ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.NewWeeklyPayout-2704B ± 0%704B ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.RewardsPaid-2784B ± 0%784B ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited-2752B ± 0%752B ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited_with_nil_receiver-2736B ± 0%736B ± 0%~(all equal)
EncodeCCF/FlowToken.TokensMinted-2688B ± 0%688B ± 0%~(all equal)
EncodeCCF/FlowToken.TokensWithdrawn-2752B ± 0%752B ± 0%~(all equal)
EncodeJSON/FlowFees.FeesDeducted-2768B ± 0%768B ± 0%~(all equal)
EncodeJSON/FlowFees.TokensWithdrawn-2408B ± 0%408B ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-2760B ± 0%760B ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-2952B ± 0%952B ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.NewWeeklyPayout-2424B ± 0%424B ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.RewardsPaid-2624B ± 0%624B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited-2680B ± 0%680B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited_with_nil_receiver-2544B ± 0%544B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensMinted-2416B ± 0%416B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensWithdrawn-2672B ± 0%672B ± 0%~(all equal)
ExportType/composite_type-2136B ± 0%136B ± 0%~(all equal)
ExportType/simple_type-20.00B 0.00B ~(all equal)
InterpretRecursionFib-21.00MB ± 0%1.00MB ± 0%~(all equal)
NewInterpreter/new_interpreter-2976B ± 0%976B ± 0%~(all equal)
NewInterpreter/new_sub-interpreter-2200B ± 0%200B ± 0%~(all equal)
ParseArray-22.65MB ± 0%2.74MB ± 0%~(p=1.000 n=1+1)
ParseDeploy/byte_array-24.09MB ± 0%4.31MB ± 0%~(p=1.000 n=1+1)
ParseDeploy/decode_hex-2214kB ± 0%214kB ± 0%~(p=1.000 n=1+1)
ParseFungibleToken/With_memory_metering-229.7kB ± 0%29.7kB ± 0%~(p=1.000 n=1+1)
ParseFungibleToken/Without_memory_metering-229.7kB ± 0%29.7kB ± 0%~(all equal)
ParseInfix-21.91kB ± 0%1.91kB ± 0%~(all equal)
QualifiedIdentifierCreation/One_level-20.00B 0.00B ~(all equal)
QualifiedIdentifierCreation/Three_levels-264.0B ± 0%64.0B ± 0%~(all equal)
RuntimeResourceDictionaryValues-22.29MB ± 0%2.30MB ± 0%~(p=1.000 n=1+1)
RuntimeScriptNoop-23.21kB ± 0%3.21kB ± 0%~(all equal)
SuperTypeInference/arrays-296.0B ± 0%96.0B ± 0%~(all equal)
SuperTypeInference/composites-20.00B 0.00B ~(all equal)
SuperTypeInference/integers-20.00B 0.00B ~(all equal)
ValueIsSubtypeOfSemaType-248.0B ± 0%48.0B ± 0%~(all equal)
 
allocs/opdelta
CheckContractInterfaceFungibleTokenConformance-2853 ± 0%853 ± 0%~(all equal)
ContractInterfaceFungibleToken-2393 ± 0%393 ± 0%~(all equal)
DecodeBatchEventsCCF-21.48M ± 0%1.48M ± 0%~(p=1.000 n=1+1)
DecodeBatchEventsJSON-24.70M ± 0%4.70M ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.FeesDeducted-230.0 ± 0%30.0 ± 0%~(all equal)
DecodeCCF/FlowFees.TokensWithdrawn-226.0 ± 0%26.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-230.0 ± 0%30.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-232.0 ± 0%32.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.NewWeeklyPayout-226.0 ± 0%26.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.RewardsPaid-229.0 ± 0%29.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited-231.0 ± 0%31.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited_with_nil_receiver-229.0 ± 0%29.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensMinted-226.0 ± 0%26.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensWithdrawn-231.0 ± 0%31.0 ± 0%~(all equal)
DecodeJSON/FlowFees.FeesDeducted-2126 ± 0%126 ± 0%~(all equal)
DecodeJSON/FlowFees.TokensWithdrawn-271.0 ± 0%71.0 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-2102 ± 0%102 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-2159 ± 0%159 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.NewWeeklyPayout-270.0 ± 0%70.0 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.RewardsPaid-287.0 ± 0%87.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited-295.0 ± 0%95.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited_with_nil_receiver-286.0 ± 0%86.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensMinted-271.0 ± 0%71.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensWithdrawn-295.0 ± 0%95.0 ± 0%~(all equal)
EncodeBatchEventsCCF-2467k ± 0%467k ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsJSON-2757k ± 0%757k ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowFees.FeesDeducted-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowFees.TokensWithdrawn-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.NewWeeklyPayout-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.RewardsPaid-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited-210.0 ± 0%10.0 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited_with_nil_receiver-210.0 ± 0%10.0 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensMinted-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensWithdrawn-210.0 ± 0%10.0 ± 0%~(all equal)
EncodeJSON/FlowFees.FeesDeducted-217.0 ± 0%17.0 ± 0%~(all equal)
EncodeJSON/FlowFees.TokensWithdrawn-210.0 ± 0%10.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-214.0 ± 0%14.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-223.0 ± 0%23.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.NewWeeklyPayout-210.0 ± 0%10.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.RewardsPaid-213.0 ± 0%13.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited-217.0 ± 0%17.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited_with_nil_receiver-212.0 ± 0%12.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensMinted-211.0 ± 0%11.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensWithdrawn-216.0 ± 0%16.0 ± 0%~(all equal)
ExportType/composite_type-23.00 ± 0%3.00 ± 0%~(all equal)
ExportType/simple_type-20.00 0.00 ~(all equal)
InterpretRecursionFib-218.9k ± 0%18.9k ± 0%~(all equal)
NewInterpreter/new_interpreter-216.0 ± 0%16.0 ± 0%~(all equal)
NewInterpreter/new_sub-interpreter-24.00 ± 0%4.00 ± 0%~(all equal)
ParseArray-259.6k ± 0%59.6k ± 0%~(p=1.000 n=1+1)
ParseDeploy/byte_array-289.4k ± 0%89.4k ± 0%~(p=1.000 n=1+1)
ParseDeploy/decode_hex-263.0 ± 0%63.0 ± 0%~(all equal)
ParseFungibleToken/With_memory_metering-2778 ± 0%778 ± 0%~(all equal)
ParseFungibleToken/Without_memory_metering-2778 ± 0%778 ± 0%~(all equal)
ParseInfix-248.0 ± 0%48.0 ± 0%~(all equal)
QualifiedIdentifierCreation/One_level-20.00 0.00 ~(all equal)
QualifiedIdentifierCreation/Three_levels-22.00 ± 0%2.00 ± 0%~(all equal)
RuntimeResourceDictionaryValues-237.7k ± 0%37.7k ± 0%~(all equal)
RuntimeScriptNoop-251.0 ± 0%51.0 ± 0%~(all equal)
SuperTypeInference/arrays-23.00 ± 0%3.00 ± 0%~(all equal)
SuperTypeInference/composites-20.00 0.00 ~(all equal)
SuperTypeInference/integers-20.00 0.00 ~(all equal)
ValueIsSubtypeOfSemaType-21.00 ± 0%1.00 ± 0%~(all equal)
 

@SupunS
Copy link
Member

SupunS commented Aug 8, 2023

@turbolent Having a look. OK if I push the changes to the same PR? I'll open a PR against this branch.

Update storage iteration value check and related tests
@codecov
Copy link

codecov bot commented Aug 8, 2023

Codecov Report

Merging #2701 (8cce6bb) into feature/stable-cadence (9bdde37) will increase coverage by 0.51%.
The diff coverage is 60.52%.

@@                    Coverage Diff                     @@
##           feature/stable-cadence    #2701      +/-   ##
==========================================================
+ Coverage                   78.87%   79.39%   +0.51%     
==========================================================
  Files                         341      336       -5     
  Lines                       80168    80145      -23     
==========================================================
+ Hits                        63232    63628     +396     
+ Misses                      14641    14215     -426     
- Partials                     2295     2302       +7     
Flag Coverage Δ
unittests 79.39% <60.52%> (+0.51%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files Changed Coverage Δ
runtime/events.go 70.27% <0.00%> (ø)
runtime/interpreter/location.go 100.00% <ø> (ø)
runtime/interpreter/value.go 66.96% <ø> (-2.04%) ⬇️
runtime/runtime.go 88.19% <ø> (ø)
runtime/stdlib/account.go 89.48% <0.00%> (ø)
runtime/stdlib/block.go 88.17% <0.00%> (ø)
runtime/stdlib/hashalgorithm.go 90.09% <0.00%> (ø)
runtime/stdlib/log.go 88.88% <0.00%> (ø)
runtime/stdlib/random.go 88.23% <0.00%> (ø)
runtime/storage.go 82.60% <0.00%> (ø)
... and 6 more

... and 8 files with indirect coverage changes

@turbolent turbolent merged commit 07f5125 into feature/stable-cadence Aug 8, 2023
8 of 11 checks passed
@turbolent turbolent deleted the bastian/sync-stable-cadence-5 branch August 8, 2023 21:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants