Skip to content

Commit

Permalink
core/capabilities/ccip: update CR config
Browse files Browse the repository at this point in the history
Add MethodNameOffRampLatestConfigDetails to the CR config on the dest
reader so we can read the config digest from the offramp.
  • Loading branch information
makramkd committed Dec 11, 2024
1 parent 9c36587 commit 62811e9
Show file tree
Hide file tree
Showing 12 changed files with 136 additions and 15 deletions.
4 changes: 4 additions & 0 deletions core/capabilities/ccip/configs/evm/contract_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,10 @@ var DestReaderConfig = evmrelaytypes.ChainReaderConfig{
ChainSpecificName: mustGetMethodName("getAllSourceChainConfigs", offrampABI),
ReadType: evmrelaytypes.Method,
},
consts.MethodNameOffRampLatestConfigDetails: {
ChainSpecificName: mustGetMethodName("latestConfigDetails", offrampABI),
ReadType: evmrelaytypes.Method,
},
consts.EventNameCommitReportAccepted: {
ChainSpecificName: mustGetEventName(consts.EventNameCommitReportAccepted, offrampABI),
ReadType: evmrelaytypes.Event,
Expand Down
2 changes: 1 addition & 1 deletion core/scripts/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ require (
github.com/shirou/gopsutil/v3 v3.24.3 // indirect
github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86 // indirect
github.com/smartcontractkit/chain-selectors v1.0.34 // indirect
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44 // indirect
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29 // indirect

Check failure on line 306 in core/scripts/go.mod

View workflow job for this annotation

GitHub Actions / Validate go.mod dependencies

[./core/scripts/go.mod] dependency github.com/smartcontractkit/[email protected] // indirect not on default branch (main). Version(commit): 711365487c29 Tree: https://github.com/smartcontractkit/chainlink-ccip/tree/711365487c29 Commit: https://github.com/smartcontractkit/chainlink-ccip/commit/711365487c29
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e // indirect
github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db // indirect
github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect
Expand Down
4 changes: 2 additions & 2 deletions core/scripts/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1140,8 +1140,8 @@ github.com/smartcontractkit/chain-selectors v1.0.34 h1:MJ17OGu8+jjl426pcKrJkCf3f
github.com/smartcontractkit/chain-selectors v1.0.34/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU=
github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44 h1:+3Uc4x1tDFCddjhmgkphDqWr1N+mzP7NQbXD8Bby6Ck=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29 h1:BbNyUnmxTRzgZjNOD0Baf3xjI5LaLXt7vksjcjRM4DA=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83 h1:NjrU7KOn3Tk+C6QFo9tQBqeotPKytpBwhn/J1s+yiiY=
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83/go.mod h1:bQktEJf7sJ0U3SmIcXvbGUox7SmXcnSEZ4kUbT8R5Nk=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e h1:PRoeby6ZlTuTkv2f+7tVU4+zboTfRzI+beECynF4JQ0=
Expand Down
2 changes: 1 addition & 1 deletion deployment/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ require (
github.com/sethvargo/go-retry v0.2.4
github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86
github.com/smartcontractkit/chain-selectors v1.0.34
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29

Check failure on line 31 in deployment/go.mod

View workflow job for this annotation

GitHub Actions / Validate go.mod dependencies

[./deployment/go.mod] dependency github.com/smartcontractkit/[email protected] not on default branch (main). Version(commit): 711365487c29 Tree: https://github.com/smartcontractkit/chainlink-ccip/tree/711365487c29 Commit: https://github.com/smartcontractkit/chainlink-ccip/commit/711365487c29
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0
github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.13
Expand Down
4 changes: 2 additions & 2 deletions deployment/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1409,8 +1409,8 @@ github.com/smartcontractkit/chain-selectors v1.0.34 h1:MJ17OGu8+jjl426pcKrJkCf3f
github.com/smartcontractkit/chain-selectors v1.0.34/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU=
github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44 h1:+3Uc4x1tDFCddjhmgkphDqWr1N+mzP7NQbXD8Bby6Ck=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29 h1:BbNyUnmxTRzgZjNOD0Baf3xjI5LaLXt7vksjcjRM4DA=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83 h1:NjrU7KOn3Tk+C6QFo9tQBqeotPKytpBwhn/J1s+yiiY=
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83/go.mod h1:bQktEJf7sJ0U3SmIcXvbGUox7SmXcnSEZ4kUbT8R5Nk=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e h1:PRoeby6ZlTuTkv2f+7tVU4+zboTfRzI+beECynF4JQ0=
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ require (
github.com/shopspring/decimal v1.4.0
github.com/smartcontractkit/chain-selectors v1.0.34
github.com/smartcontractkit/chainlink-automation v0.8.1
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29

Check failure on line 81 in go.mod

View workflow job for this annotation

GitHub Actions / Validate go.mod dependencies

[./go.mod] dependency github.com/smartcontractkit/[email protected] not on default branch (main). Version(commit): 711365487c29 Tree: https://github.com/smartcontractkit/chainlink-ccip/tree/711365487c29 Commit: https://github.com/smartcontractkit/chainlink-ccip/commit/711365487c29
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e
github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1123,8 +1123,8 @@ github.com/smartcontractkit/chain-selectors v1.0.34 h1:MJ17OGu8+jjl426pcKrJkCf3f
github.com/smartcontractkit/chain-selectors v1.0.34/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU=
github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44 h1:+3Uc4x1tDFCddjhmgkphDqWr1N+mzP7NQbXD8Bby6Ck=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29 h1:BbNyUnmxTRzgZjNOD0Baf3xjI5LaLXt7vksjcjRM4DA=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83 h1:NjrU7KOn3Tk+C6QFo9tQBqeotPKytpBwhn/J1s+yiiY=
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83/go.mod h1:bQktEJf7sJ0U3SmIcXvbGUox7SmXcnSEZ4kUbT8R5Nk=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e h1:PRoeby6ZlTuTkv2f+7tVU4+zboTfRzI+beECynF4JQ0=
Expand Down
117 changes: 117 additions & 0 deletions integration-tests/contracts/ccipreader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,123 @@ func emitCommitReports(ctx context.Context, t *testing.T, s *testSetupData, numR
return firstReportTs
}

func TestCCIPReader_GetOffRampConfigDigest(t *testing.T) {
t.Parallel()
ctx := tests.Context(t)
sb, auth := setupSimulatedBackendAndAuth(t)

addr, _, _, err := offramp.DeployOffRamp(auth, sb.Client(), offramp.OffRampStaticConfig{
ChainSelector: uint64(chainD),
GasForCallExactCheck: 5_000,
RmnRemote: utils.RandomAddress(),
TokenAdminRegistry: utils.RandomAddress(),
NonceManager: utils.RandomAddress(),
}, offramp.OffRampDynamicConfig{
FeeQuoter: utils.RandomAddress(),
PermissionLessExecutionThresholdSeconds: 1,
IsRMNVerificationDisabled: true,
MessageInterceptor: utils.RandomAddress(),
}, []offramp.OffRampSourceChainConfigArgs{})
require.NoError(t, err)
sb.Commit()

offRamp, err := offramp.NewOffRamp(addr, sb.Client())
require.NoError(t, err)

commitConfigDigest := utils.RandomBytes32()
execConfigDigest := utils.RandomBytes32()

_, err = offRamp.SetOCR3Configs(auth, []offramp.MultiOCR3BaseOCRConfigArgs{
{
ConfigDigest: commitConfigDigest,
OcrPluginType: consts.PluginTypeCommit,
F: 1,
IsSignatureVerificationEnabled: true,
Signers: []common.Address{utils.RandomAddress(), utils.RandomAddress(), utils.RandomAddress(), utils.RandomAddress()},
Transmitters: []common.Address{utils.RandomAddress(), utils.RandomAddress(), utils.RandomAddress(), utils.RandomAddress()},
},
{
ConfigDigest: execConfigDigest,
OcrPluginType: consts.PluginTypeExecute,
F: 1,
IsSignatureVerificationEnabled: false,
Signers: []common.Address{utils.RandomAddress(), utils.RandomAddress(), utils.RandomAddress(), utils.RandomAddress()},
Transmitters: []common.Address{utils.RandomAddress(), utils.RandomAddress(), utils.RandomAddress(), utils.RandomAddress()},
},
})
require.NoError(t, err)
sb.Commit()

commitConfigDetails, err := offRamp.LatestConfigDetails(&bind.CallOpts{
Context: ctx,
}, consts.PluginTypeCommit)
require.NoError(t, err)
require.Equal(t, commitConfigDigest, commitConfigDetails.ConfigInfo.ConfigDigest)

execConfigDetails, err := offRamp.LatestConfigDetails(&bind.CallOpts{
Context: ctx,
}, consts.PluginTypeExecute)
require.NoError(t, err)
require.Equal(t, execConfigDigest, execConfigDetails.ConfigInfo.ConfigDigest)

db := pgtest.NewSqlxDB(t)
lggr := logger.TestLogger(t)
lggr.SetLogLevel(zapcore.ErrorLevel)
lpOpts := logpoller.Opts{
PollPeriod: time.Millisecond,
FinalityDepth: 1,
BackfillBatchSize: 10,
RpcBatchSize: 10,
KeepFinalizedBlocksDepth: 100000,
}
cl := client.NewSimulatedBackendClient(t, sb, big.NewInt(1337))
headTracker := headtracker.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth)
orm := logpoller.NewORM(big.NewInt(1337), db, lggr)
lp := logpoller.NewLogPoller(
orm,
cl,
lggr,
headTracker,
lpOpts,
)
require.NoError(t, lp.Start(ctx))
t.Cleanup(func() { require.NoError(t, lp.Close()) })

cr, err := evm.NewChainReaderService(ctx, lggr, lp, headTracker, cl, evmconfig.DestReaderConfig)
require.NoError(t, err)
err = cr.Start(ctx)
require.NoError(t, err)
t.Cleanup(func() { require.NoError(t, cr.Close()) })

extendedCr := contractreader.NewExtendedContractReader(cr)
err = extendedCr.Bind(ctx, []types.BoundContract{
{
Address: addr.Hex(),
Name: consts.ContractNameOffRamp,
},
})
require.NoError(t, err)

reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(
ctx,
lggr,
map[cciptypes.ChainSelector]contractreader.Extended{
chainD: extendedCr,
},
nil,
chainD,
addr.Bytes(),
)

ccipReaderCommitDigest, err := reader.GetOffRampConfigDigest(ctx, consts.PluginTypeCommit)
require.NoError(t, err)
require.Equal(t, commitConfigDigest, ccipReaderCommitDigest)

ccipReaderExecDigest, err := reader.GetOffRampConfigDigest(ctx, consts.PluginTypeExecute)
require.NoError(t, err)
require.Equal(t, execConfigDigest, ccipReaderExecDigest)
}

func TestCCIPReader_CommitReportsGTETimestamp(t *testing.T) {
t.Parallel()
ctx := tests.Context(t)
Expand Down
2 changes: 1 addition & 1 deletion integration-tests/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ require (
github.com/slack-go/slack v0.15.0
github.com/smartcontractkit/chain-selectors v1.0.34
github.com/smartcontractkit/chainlink-automation v0.8.1
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29

Check failure on line 49 in integration-tests/go.mod

View workflow job for this annotation

GitHub Actions / Validate go.mod dependencies

[./integration-tests/go.mod] dependency github.com/smartcontractkit/[email protected] not on default branch (main). Version(commit): 711365487c29 Tree: https://github.com/smartcontractkit/chainlink-ccip/tree/711365487c29 Commit: https://github.com/smartcontractkit/chainlink-ccip/commit/711365487c29
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0
github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2
Expand Down
4 changes: 2 additions & 2 deletions integration-tests/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1430,8 +1430,8 @@ github.com/smartcontractkit/chain-selectors v1.0.34 h1:MJ17OGu8+jjl426pcKrJkCf3f
github.com/smartcontractkit/chain-selectors v1.0.34/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU=
github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44 h1:+3Uc4x1tDFCddjhmgkphDqWr1N+mzP7NQbXD8Bby6Ck=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29 h1:BbNyUnmxTRzgZjNOD0Baf3xjI5LaLXt7vksjcjRM4DA=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83 h1:NjrU7KOn3Tk+C6QFo9tQBqeotPKytpBwhn/J1s+yiiY=
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83/go.mod h1:bQktEJf7sJ0U3SmIcXvbGUox7SmXcnSEZ4kUbT8R5Nk=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e h1:PRoeby6ZlTuTkv2f+7tVU4+zboTfRzI+beECynF4JQ0=
Expand Down
2 changes: 1 addition & 1 deletion integration-tests/load/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ require (
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/smartcontractkit/chain-selectors v1.0.34 // indirect
github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44 // indirect
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29 // indirect

Check failure on line 409 in integration-tests/load/go.mod

View workflow job for this annotation

GitHub Actions / Validate go.mod dependencies

[./integration-tests/load/go.mod] dependency github.com/smartcontractkit/[email protected] // indirect not on default branch (main). Version(commit): 711365487c29 Tree: https://github.com/smartcontractkit/chainlink-ccip/tree/711365487c29 Commit: https://github.com/smartcontractkit/chainlink-ccip/commit/711365487c29
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e // indirect
github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db // indirect
github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect
Expand Down
4 changes: 2 additions & 2 deletions integration-tests/load/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1421,8 +1421,8 @@ github.com/smartcontractkit/chain-selectors v1.0.34 h1:MJ17OGu8+jjl426pcKrJkCf3f
github.com/smartcontractkit/chain-selectors v1.0.34/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU=
github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44 h1:+3Uc4x1tDFCddjhmgkphDqWr1N+mzP7NQbXD8Bby6Ck=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241210163448-e683c0b91a44/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29 h1:BbNyUnmxTRzgZjNOD0Baf3xjI5LaLXt7vksjcjRM4DA=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211113021-711365487c29/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83 h1:NjrU7KOn3Tk+C6QFo9tQBqeotPKytpBwhn/J1s+yiiY=
github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83/go.mod h1:bQktEJf7sJ0U3SmIcXvbGUox7SmXcnSEZ4kUbT8R5Nk=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e h1:PRoeby6ZlTuTkv2f+7tVU4+zboTfRzI+beECynF4JQ0=
Expand Down

0 comments on commit 62811e9

Please sign in to comment.