-
Notifications
You must be signed in to change notification settings - Fork 179
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
Expose minimum required version to cadence interface #6560
Changes from 4 commits
a79c9b8
f82f503
f36aafe
59269e0
fe18d5a
4166e0a
b2fa1c3
2109f64
a72cd52
2ccf370
d9d5ef4
9c47667
456e8a6
58e84cd
b2ee0e9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,190 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
package environment | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"context" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"fmt" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/coreos/go-semver/semver" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/onflow/flow-go/fvm/storage" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/onflow/flow-go/fvm/storage/state" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/onflow/flow-go/fvm/tracing" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/onflow/flow-go/model/convert" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/onflow/flow-go/model/flow" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/onflow/flow-go/module/trace" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// MinimumRequiredVersion returns the minimum required cadence version for the current environment | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// in semver format. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type MinimumRequiredVersion interface { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MinimumRequiredVersion() (string, error) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should we be more specific?
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this one is a bit tricky. This method satisfies the cadence runtime interface (defined by cadence) and from a cadence perspective it does not make sense to name it a I'll add a comment There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see. Maybe we keep the method name as |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type ParseRestrictedMinimumRequiredVersion struct { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
txnState state.NestedTransactionPreparer | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
impl MinimumRequiredVersion | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func NewParseRestrictedMinimumRequiredVersion( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
txnState state.NestedTransactionPreparer, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
impl MinimumRequiredVersion, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) MinimumRequiredVersion { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ParseRestrictedMinimumRequiredVersion{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
txnState: txnState, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
impl: impl, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (p ParseRestrictedMinimumRequiredVersion) MinimumRequiredVersion() (string, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return parseRestrict1Ret( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
p.txnState, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
trace.FVMEnvRandom, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
p.impl.MinimumRequiredVersion) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type minimumRequiredVersion struct { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tracer tracing.TracerSpan | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
meter Meter | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
txnState storage.TransactionPreparer | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
envParams EnvironmentParams | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func NewMinimumRequiredVersion( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tracer tracing.TracerSpan, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
meter Meter, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
txnState storage.TransactionPreparer, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
envParams EnvironmentParams, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) MinimumRequiredVersion { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return minimumRequiredVersion{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tracer: tracer, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
meter: meter, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
txnState: txnState, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
envParams: envParams, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (c minimumRequiredVersion) MinimumRequiredVersion() (string, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tracerSpan := c.tracer.StartExtensiveTracingChildSpan( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
trace.FVMEnvMinimumRequiredVersion) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
defer tracerSpan.End() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
err := c.meter.MeterComputation(ComputationKindMinimumRequiredVersion, 1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "", fmt.Errorf("get MinimumRequiredVersion failed: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
value, err := c.txnState.GetCurrentVersionBoundary( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c.txnState, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
NewCurrentVersionBoundaryComputer( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tracerSpan, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c.envParams, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c.txnState, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "", fmt.Errorf("get MinimumRequiredVersion failed: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
version, err := c.mapToCadenceVersion(value.Version) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "", fmt.Errorf("get MinimumRequiredVersion failed: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return version, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (c minimumRequiredVersion) mapToCadenceVersion(version string) (string, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
semVer, err := semver.NewVersion(version) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// TODO: return a better error | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "", fmt.Errorf("failed to map FVM version to cadence version: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// return 0.0.0 if there is no mapping for the version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var cadenceVersion = semver.Version{} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
greaterThanOrEqualTo := func(version semver.Version, versionToCompare semver.Version) bool { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we can move this pure function outside |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return version.Compare(versionToCompare) >= 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for _, entry := range fvmToCadenceVersionMapping { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if greaterThanOrEqualTo(*semVer, entry.FlowGoVersion) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cadenceVersion = entry.CadenceVersion | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
break | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why It seems we always just look at the very first version entry only, in that case, why not just having one version entry instead of a mapping? If we are going to hardcode a version map entry, I would say we just hard code the default one:
then we can simplify this function into:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return cadenceVersion.String(), nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type VersionMapEntry struct { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FlowGoVersion semver.Version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CadenceVersion semver.Version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Technically the version map doesn't need to know that this is a mapping between minimums. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// FVMToCadenceVersionMapping is a hardcoded mapping between FVM versions and Cadence versions. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Entries are only needed for cadence versions where cadence intends to switch behaviour | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// based on the version. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// This should be ordered. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
janezpodhostnik marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var fvmToCadenceVersionMapping = []VersionMapEntry{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FlowGoVersion: *semver.New("0.37.0"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CadenceVersion: *semver.New("1.0.0"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func SetFVMToCadenceVersionMappingForTestingOnly(mapping []VersionMapEntry) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fvmToCadenceVersionMapping = mapping | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var _ MinimumRequiredVersion = (*minimumRequiredVersion)(nil) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type CurrentVersionBoundaryComputer struct { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tracerSpan tracing.TracerSpan | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
envParams EnvironmentParams | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
txnState storage.TransactionPreparer | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func NewCurrentVersionBoundaryComputer( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tracerSpan tracing.TracerSpan, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
envParams EnvironmentParams, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
txnState storage.TransactionPreparer, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) CurrentVersionBoundaryComputer { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return CurrentVersionBoundaryComputer{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tracerSpan: tracerSpan, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
envParams: envParams, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
txnState: txnState, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (computer CurrentVersionBoundaryComputer) Compute( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_ state.NestedTransactionPreparer, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_ struct{}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
flow.VersionBoundary, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
error, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
env := NewScriptEnv( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
context.Background(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
computer.tracerSpan, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
computer.envParams, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
computer.txnState) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
value, err := env.GetCurrentVersionBoundary() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return flow.VersionBoundary{}, fmt.Errorf("could not get current version boundary: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
boundary, err := convert.VersionBoundary(value) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return flow.VersionBoundary{}, fmt.Errorf("could not parse current version boundary: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return boundary, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added a comment, but this is a different function. This one just exposes the one on
SystemContracts
to theEnvironment
interface