@kungfu-tech/buildchain 3.0.9-alpha.0 → 3.0.9-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-perspective.json +16 -0
- package/contracts/fixtures/kfd-adopter-release-v1/kfd-4-replay.json +57 -0
- package/contracts/release-cut-v1.schema.json +1 -0
- package/contracts/release-train-transition-v1.schema.json +1 -0
- package/dist/site/buildchain-contract.json +27 -28
- package/dist/site/buildchain-site.json +37 -27
- package/dist/site/controller-registry.json +8 -4
- package/dist/site/kfd-claims.json +3 -3
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +7 -7
- package/dist/site/node-api-registry.json +370 -73
- package/dist/site/page-registry.json +26 -16
- package/dist/site/public-surface-audit.json +2 -2
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/site-manifest.json +11 -11
- package/dist/site/workflow-registry.json +4 -4
- package/docs/dev-delivery-warrant.md +12 -2
- package/docs/node-api-reference.md +116 -106
- package/docs/release-governance.md +5 -3
- package/docs/release-passport.md +7 -0
- package/docs/release-train.md +46 -4
- package/docs/reusable-build-surface.md +26 -9
- package/docs/runtime-train-validation.md +6 -0
- package/docs/versioning.md +3 -2
- package/package.json +1 -1
- package/packages/core/buildchain-channel-identity.js +119 -0
- package/packages/core/buildchain-compatibility-proof.js +32 -0
- package/packages/core/buildchain-contract.js +7 -0
- package/packages/core/controller-evidence.js +2 -1
- package/packages/core/dev-delivery-warrant.js +15 -4
- package/packages/core/kfd-adopter-manifest.js +3 -3
- package/packages/core/release-blocker-priority.js +192 -0
- package/packages/core/release-train.js +220 -0
- package/scripts/buildchain-channel-router.mjs +18 -2
- package/scripts/buildchain-contract-lock.mjs +11 -1
- package/scripts/check-inventory.mjs +2 -2
- package/scripts/generate-buildchain-kfd-witnesses.mjs +88 -94
- package/scripts/generate-channel-build-workflow.mjs +78 -31
- package/scripts/promotion-channel-router.mjs +5 -3
- package/scripts/release-train-self-dogfood.mjs +579 -0
- package/scripts/runtime-ref-core.mjs +4 -17
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"contract": "kfd-4-observer-perspective",
|
|
4
|
+
"standard": "kfd-4",
|
|
5
|
+
"id": "buildchain-release-maintainer-view",
|
|
6
|
+
"observer": { "id": "buildchain-release-maintainer", "kind": "human" },
|
|
7
|
+
"acceptedFacts": [
|
|
8
|
+
{ "sourceId": "kungfu-systems/buildchain@{{SOURCE_SHA}}", "sourceKind": "repository" }
|
|
9
|
+
],
|
|
10
|
+
"projectionPolicy": {
|
|
11
|
+
"policyVersion": "1",
|
|
12
|
+
"causalDominance": true,
|
|
13
|
+
"tieBreaker": "source-coordinate"
|
|
14
|
+
},
|
|
15
|
+
"verification": { "result": "pass" }
|
|
16
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"contract": "kfd-4-perspective-replay",
|
|
4
|
+
"standard": "kfd-4",
|
|
5
|
+
"replayId": "buildchain-release-product-contrast",
|
|
6
|
+
"mode": "contrastive",
|
|
7
|
+
"sourceViews": [
|
|
8
|
+
{
|
|
9
|
+
"id": "maintainer",
|
|
10
|
+
"kind": "observer-view",
|
|
11
|
+
"coordinate": "git://kungfu-systems/buildchain@{{SOURCE_SHA}}",
|
|
12
|
+
"observer": "buildchain-release-maintainer",
|
|
13
|
+
"perspective": "release-integrity",
|
|
14
|
+
"acceptedFactCut": "git://kungfu-systems/buildchain@{{SOURCE_SHA}}",
|
|
15
|
+
"naturalObjects": ["release"],
|
|
16
|
+
"consequences": ["published artifact"],
|
|
17
|
+
"knownGaps": []
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "consumer",
|
|
21
|
+
"kind": "observer-view",
|
|
22
|
+
"coordinate": "npm://@kungfu-tech/buildchain@{{SOURCE_SHA}}",
|
|
23
|
+
"observer": "buildchain-release-consumer",
|
|
24
|
+
"perspective": "artifact-consumption",
|
|
25
|
+
"acceptedFactCut": "artifact://published-package",
|
|
26
|
+
"naturalObjects": ["installed package"],
|
|
27
|
+
"consequences": ["local build execution"],
|
|
28
|
+
"knownGaps": ["consumer runtime state"]
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"replayObserver": {
|
|
32
|
+
"id": "buildchain",
|
|
33
|
+
"kind": "service",
|
|
34
|
+
"purpose": "retain source and artifact fact boundaries"
|
|
35
|
+
},
|
|
36
|
+
"reconstruction": {
|
|
37
|
+
"policyVersion": "1",
|
|
38
|
+
"sharedContext": "same source-bound release",
|
|
39
|
+
"preservedElements": ["observer", "accepted-fact-cut", "evidence-boundary"],
|
|
40
|
+
"declaredLoss": ["consumer runtime state"],
|
|
41
|
+
"degradedState": "none"
|
|
42
|
+
},
|
|
43
|
+
"contrast": {
|
|
44
|
+
"dimensions": ["evidence-boundary"],
|
|
45
|
+
"mismatches": [
|
|
46
|
+
{
|
|
47
|
+
"sourceViewIds": ["maintainer", "consumer"],
|
|
48
|
+
"observation": "source and installed artifact evidence have different custody",
|
|
49
|
+
"primitiveSignal": "inconclusive"
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"verification": {
|
|
54
|
+
"result": "pass",
|
|
55
|
+
"evidence": ["evidence/projection-fsck.json"]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"product": {
|
|
5
5
|
"name": "Buildchain",
|
|
6
6
|
"package": "@kungfu-tech/buildchain",
|
|
7
|
-
"version": "3.0.9-alpha.
|
|
7
|
+
"version": "3.0.9-alpha.2",
|
|
8
8
|
"repository": "https://github.com/kungfu-systems/buildchain"
|
|
9
9
|
},
|
|
10
10
|
"majorLine": "v3",
|
|
@@ -324,7 +324,7 @@
|
|
|
324
324
|
"retryable GitHub fallback fetches use a bounded attempt budget before exact source SHA and tree verification"
|
|
325
325
|
],
|
|
326
326
|
"breakingDigest": "sha256:dfbedd543ae0c067982b5c8c02d98dd2f7f7df88752be97fb330da6b0ba30faa",
|
|
327
|
-
"auditDigest": "sha256:
|
|
327
|
+
"auditDigest": "sha256:a7c836d20ef6a5d22b0099cded80738301d81ef7030dd0ac0eb6df320b4c184e"
|
|
328
328
|
},
|
|
329
329
|
{
|
|
330
330
|
"contractVersion": 1,
|
|
@@ -363,7 +363,7 @@
|
|
|
363
363
|
"alpha and stable channel selections use separate consumer contract locks by default"
|
|
364
364
|
],
|
|
365
365
|
"breakingDigest": "sha256:c4597dfa89e1a58f1023905092b849644f5c080abf150aeba9c7e1cd5ed43962",
|
|
366
|
-
"auditDigest": "sha256:
|
|
366
|
+
"auditDigest": "sha256:789173c7e5508c7e7947a59fbcb3b5bebc3783ed47695d7f5abb468a9b5d4d7d"
|
|
367
367
|
},
|
|
368
368
|
{
|
|
369
369
|
"contractVersion": 1,
|
|
@@ -521,7 +521,7 @@
|
|
|
521
521
|
"resume-from-candidate-run is fail-closed and uses a fresh caller event instead of rerunning a frozen startup graph"
|
|
522
522
|
],
|
|
523
523
|
"breakingDigest": "sha256:9db8dd07152855d03ff30f9c571438593c689d3e8139fa45431d000f548242f5",
|
|
524
|
-
"auditDigest": "sha256:
|
|
524
|
+
"auditDigest": "sha256:d58c6ca74c7ac1defb9dcc35e26b6dde097b82f6aaea4e2c71e90ea15887158e",
|
|
525
525
|
"compatibleBreakingDigests": [
|
|
526
526
|
"sha256:aa30f22e3af0a89841310bdbdc900844dd95a66974db173fa140a71bbd7e82c0"
|
|
527
527
|
],
|
|
@@ -571,7 +571,7 @@
|
|
|
571
571
|
"channel-aware artifact host facts are checked against the deploy plan before adapter side effects"
|
|
572
572
|
],
|
|
573
573
|
"breakingDigest": "sha256:27f0cb9c7d97288850d215be8696b323471c41fd1cdf3a2ff3ebf21f62541960",
|
|
574
|
-
"auditDigest": "sha256:
|
|
574
|
+
"auditDigest": "sha256:748e1d69ca28b631e86788de0ff359b11164b3ac1edda1b146ca49f3ac3856dc"
|
|
575
575
|
},
|
|
576
576
|
{
|
|
577
577
|
"contractVersion": 1,
|
|
@@ -1071,7 +1071,7 @@
|
|
|
1071
1071
|
"manual entries carry source file digests so downstream sites and agents can detect stale hand-written documentation"
|
|
1072
1072
|
],
|
|
1073
1073
|
"breakingDigest": "sha256:7d0d2819e3a3e72989d9c57b5efe9d0bc0a79bc0f2c82a0c7b9d6c5a211a91f2",
|
|
1074
|
-
"auditDigest": "sha256:
|
|
1074
|
+
"auditDigest": "sha256:ee79f1dc576cef9003060e7c0498ddb10fd0a2660d2c58831ddc1fdd104b0792"
|
|
1075
1075
|
},
|
|
1076
1076
|
{
|
|
1077
1077
|
"contractVersion": 1,
|
|
@@ -1093,7 +1093,7 @@
|
|
|
1093
1093
|
"agents can discover supported Node APIs without importing internal file paths"
|
|
1094
1094
|
],
|
|
1095
1095
|
"breakingDigest": "sha256:48f925608d3e2131d90936b07dc2a30341204cae3e6e785c0f77d61ad755c945",
|
|
1096
|
-
"auditDigest": "sha256:
|
|
1096
|
+
"auditDigest": "sha256:60c34924e258b72687367422f5d9afa890535a2e3e0b80a29d90551bab6ebfd9"
|
|
1097
1097
|
},
|
|
1098
1098
|
{
|
|
1099
1099
|
"contractVersion": 1,
|
|
@@ -1144,7 +1144,7 @@
|
|
|
1144
1144
|
"controllerDescriptor": {
|
|
1145
1145
|
"contract": "buildchain.controller-descriptor/v1",
|
|
1146
1146
|
"digest": "sha256:373723a73d188194d389dee04c394d3b79cb0c016a370f2f5d0f60979a02ed48",
|
|
1147
|
-
"registryDigest": "sha256:
|
|
1147
|
+
"registryDigest": "sha256:56d9fd27f8e05f1d5c0f5de354b2dfc1cac62155e8ddc555b16e35e9161459c9",
|
|
1148
1148
|
"inputClassifications": {
|
|
1149
1149
|
"buildchain-ref": {
|
|
1150
1150
|
"classification": "included",
|
|
@@ -1327,7 +1327,7 @@
|
|
|
1327
1327
|
"controllerDescriptor": {
|
|
1328
1328
|
"contract": "buildchain.controller-descriptor/v1",
|
|
1329
1329
|
"digest": "sha256:f986e79241d831f027a0955a35c918f946989176c76555e20f156ed31fb10c94",
|
|
1330
|
-
"registryDigest": "sha256:
|
|
1330
|
+
"registryDigest": "sha256:56d9fd27f8e05f1d5c0f5de354b2dfc1cac62155e8ddc555b16e35e9161459c9",
|
|
1331
1331
|
"inputClassifications": {
|
|
1332
1332
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_DOWNLOAD_ROLE_ARN": {
|
|
1333
1333
|
"classification": "redacted",
|
|
@@ -1718,7 +1718,7 @@
|
|
|
1718
1718
|
"missing receipts are non-qualifying and must not be represented as a successful controller run"
|
|
1719
1719
|
],
|
|
1720
1720
|
"breakingDigest": "sha256:6b8d38e92b2c67b5bc83fae0a3fd95bfa47582fbc176e6cdeebe7630a57534cb",
|
|
1721
|
-
"auditDigest": "sha256:
|
|
1721
|
+
"auditDigest": "sha256:a7c836d20ef6a5d22b0099cded80738301d81ef7030dd0ac0eb6df320b4c184e",
|
|
1722
1722
|
"compatibleBreakingDigests": [
|
|
1723
1723
|
"sha256:30745921541e9b0f70475bb2178c2559f6aef248f6680670ccd44d8c5a69a6b1",
|
|
1724
1724
|
"sha256:e264a79f9f399038c2fcfd21e4168c68c2e1485ee5c651c02242a02b622ac2be"
|
|
@@ -1749,7 +1749,6 @@
|
|
|
1749
1749
|
"workflowPath": ".github/workflows/build.yml",
|
|
1750
1750
|
"requiredStages": [
|
|
1751
1751
|
"resolve-channel",
|
|
1752
|
-
"build",
|
|
1753
1752
|
"aggregate"
|
|
1754
1753
|
],
|
|
1755
1754
|
"capabilities": [
|
|
@@ -1865,8 +1864,8 @@
|
|
|
1865
1864
|
],
|
|
1866
1865
|
"controllerDescriptor": {
|
|
1867
1866
|
"contract": "buildchain.controller-descriptor/v1",
|
|
1868
|
-
"digest": "sha256:
|
|
1869
|
-
"registryDigest": "sha256:
|
|
1867
|
+
"digest": "sha256:6dfa79003f0c92e336c56f07f45f57cc5572921bdb46e432fd809fb19ee823bb",
|
|
1868
|
+
"registryDigest": "sha256:56d9fd27f8e05f1d5c0f5de354b2dfc1cac62155e8ddc555b16e35e9161459c9",
|
|
1870
1869
|
"inputClassifications": {
|
|
1871
1870
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_DOWNLOAD_ROLE_ARN": {
|
|
1872
1871
|
"classification": "redacted",
|
|
@@ -2268,8 +2267,8 @@
|
|
|
2268
2267
|
"redacted input values are never serialized and digest-only input values are never emitted in plaintext",
|
|
2269
2268
|
"missing receipts are non-qualifying and must not be represented as a successful controller run"
|
|
2270
2269
|
],
|
|
2271
|
-
"breakingDigest": "sha256:
|
|
2272
|
-
"auditDigest": "sha256:
|
|
2270
|
+
"breakingDigest": "sha256:30549aa26cd1e1dd81f10fe3529d3c6e3f8438a6efa0100c47ebae4d2f3d71df",
|
|
2271
|
+
"auditDigest": "sha256:789173c7e5508c7e7947a59fbcb3b5bebc3783ed47695d7f5abb468a9b5d4d7d"
|
|
2273
2272
|
},
|
|
2274
2273
|
{
|
|
2275
2274
|
"contractVersion": 1,
|
|
@@ -2339,7 +2338,7 @@
|
|
|
2339
2338
|
"controllerDescriptor": {
|
|
2340
2339
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2341
2340
|
"digest": "sha256:8e42956a2c10fa109500e72b97994f06b3d22a19cc63a46f66410b2e81706e9d",
|
|
2342
|
-
"registryDigest": "sha256:
|
|
2341
|
+
"registryDigest": "sha256:56d9fd27f8e05f1d5c0f5de354b2dfc1cac62155e8ddc555b16e35e9161459c9",
|
|
2343
2342
|
"inputClassifications": {
|
|
2344
2343
|
"artifact-name": {
|
|
2345
2344
|
"classification": "included",
|
|
@@ -2556,7 +2555,7 @@
|
|
|
2556
2555
|
"controllerDescriptor": {
|
|
2557
2556
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2558
2557
|
"digest": "sha256:c5274b37f04d0054559fdc8698c51bd0f0d8ae470baf163e9caa7699aa970575",
|
|
2559
|
-
"registryDigest": "sha256:
|
|
2558
|
+
"registryDigest": "sha256:56d9fd27f8e05f1d5c0f5de354b2dfc1cac62155e8ddc555b16e35e9161459c9",
|
|
2560
2559
|
"inputClassifications": {
|
|
2561
2560
|
"artifact-path": {
|
|
2562
2561
|
"classification": "digest-only",
|
|
@@ -2735,7 +2734,7 @@
|
|
|
2735
2734
|
"missing receipts are non-qualifying and must not be represented as a successful controller run"
|
|
2736
2735
|
],
|
|
2737
2736
|
"breakingDigest": "sha256:f14825324a16b51c2e9ed708ebe64e1932e05b6d5e0866f83aea8439decb4a27",
|
|
2738
|
-
"auditDigest": "sha256:
|
|
2737
|
+
"auditDigest": "sha256:748e1d69ca28b631e86788de0ff359b11164b3ac1edda1b146ca49f3ac3856dc"
|
|
2739
2738
|
},
|
|
2740
2739
|
{
|
|
2741
2740
|
"contractVersion": 1,
|
|
@@ -2800,7 +2799,7 @@
|
|
|
2800
2799
|
"controllerDescriptor": {
|
|
2801
2800
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2802
2801
|
"digest": "sha256:6b132790b9798e8a5dfbe095701d8e024c160a08bc7c4bd477ee79feef7a9cfd",
|
|
2803
|
-
"registryDigest": "sha256:
|
|
2802
|
+
"registryDigest": "sha256:56d9fd27f8e05f1d5c0f5de354b2dfc1cac62155e8ddc555b16e35e9161459c9",
|
|
2804
2803
|
"inputClassifications": {
|
|
2805
2804
|
"artifact-name": {
|
|
2806
2805
|
"classification": "included",
|
|
@@ -2895,7 +2894,7 @@
|
|
|
2895
2894
|
"missing receipts are non-qualifying and must not be represented as a successful controller run"
|
|
2896
2895
|
],
|
|
2897
2896
|
"breakingDigest": "sha256:3f76502666069c2727d23efcfdb08fb80f89ced1955a69e29f11525ae88aca1d",
|
|
2898
|
-
"auditDigest": "sha256:
|
|
2897
|
+
"auditDigest": "sha256:6132e68620355e2a4d491172bc5eab58121369265baab0dee72a99218efa559a"
|
|
2899
2898
|
},
|
|
2900
2899
|
{
|
|
2901
2900
|
"contractVersion": 1,
|
|
@@ -2982,7 +2981,7 @@
|
|
|
2982
2981
|
"controllerDescriptor": {
|
|
2983
2982
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2984
2983
|
"digest": "sha256:6d71409659fbf8543c7e520b0c493d8afe86bdf60286b860bb917f0041ebc173",
|
|
2985
|
-
"registryDigest": "sha256:
|
|
2984
|
+
"registryDigest": "sha256:56d9fd27f8e05f1d5c0f5de354b2dfc1cac62155e8ddc555b16e35e9161459c9",
|
|
2986
2985
|
"inputClassifications": {
|
|
2987
2986
|
"artifact-name": {
|
|
2988
2987
|
"classification": "included",
|
|
@@ -3145,7 +3144,7 @@
|
|
|
3145
3144
|
"missing receipts are non-qualifying and must not be represented as a successful controller run"
|
|
3146
3145
|
],
|
|
3147
3146
|
"breakingDigest": "sha256:0eb318df455ef9cb737a7c2515a2411b685d34ed0bde7b5f5b173a7a42513114",
|
|
3148
|
-
"auditDigest": "sha256:
|
|
3147
|
+
"auditDigest": "sha256:43eaedc62a6e9ab4658fee9a3fb0ad729af2ca60426143543b938e725bbbfa2e"
|
|
3149
3148
|
},
|
|
3150
3149
|
{
|
|
3151
3150
|
"contractVersion": 1,
|
|
@@ -3315,7 +3314,7 @@
|
|
|
3315
3314
|
"controllerDescriptor": {
|
|
3316
3315
|
"contract": "buildchain.controller-descriptor/v1",
|
|
3317
3316
|
"digest": "sha256:4d44d0f729fbc112aa309ed22e74b9f1401b0470b99c1e6061c278babe5e4b8b",
|
|
3318
|
-
"registryDigest": "sha256:
|
|
3317
|
+
"registryDigest": "sha256:56d9fd27f8e05f1d5c0f5de354b2dfc1cac62155e8ddc555b16e35e9161459c9",
|
|
3319
3318
|
"inputClassifications": {
|
|
3320
3319
|
"BUILDCHAIN_ISSUE_APP_ID": {
|
|
3321
3320
|
"classification": "redacted",
|
|
@@ -3810,7 +3809,7 @@
|
|
|
3810
3809
|
"missing receipts are non-qualifying and must not be represented as a successful controller run"
|
|
3811
3810
|
],
|
|
3812
3811
|
"breakingDigest": "sha256:015d8de793adbd4c539416be7d7512e18cc92097e629b0203fa06d2c183e98bd",
|
|
3813
|
-
"auditDigest": "sha256:
|
|
3812
|
+
"auditDigest": "sha256:d58c6ca74c7ac1defb9dcc35e26b6dde097b82f6aaea4e2c71e90ea15887158e"
|
|
3814
3813
|
},
|
|
3815
3814
|
{
|
|
3816
3815
|
"contractVersion": 1,
|
|
@@ -3875,7 +3874,7 @@
|
|
|
3875
3874
|
"controllerDescriptor": {
|
|
3876
3875
|
"contract": "buildchain.controller-descriptor/v1",
|
|
3877
3876
|
"digest": "sha256:660579b5561e8e33375a3f3b1fefbb8a5bd8241a55ba43374d786fb772c24a12",
|
|
3878
|
-
"registryDigest": "sha256:
|
|
3877
|
+
"registryDigest": "sha256:56d9fd27f8e05f1d5c0f5de354b2dfc1cac62155e8ddc555b16e35e9161459c9",
|
|
3879
3878
|
"inputClassifications": {
|
|
3880
3879
|
"agent-work-context-json": {
|
|
3881
3880
|
"classification": "digest-only",
|
|
@@ -4010,7 +4009,7 @@
|
|
|
4010
4009
|
"controllerDescriptor": {
|
|
4011
4010
|
"contract": "buildchain.controller-descriptor/v1",
|
|
4012
4011
|
"digest": "sha256:b6f53563c0adc859bc586c05fce560a5094d7d9666438d63c5fd3e1fc4774555",
|
|
4013
|
-
"registryDigest": "sha256:
|
|
4012
|
+
"registryDigest": "sha256:56d9fd27f8e05f1d5c0f5de354b2dfc1cac62155e8ddc555b16e35e9161459c9",
|
|
4014
4013
|
"inputClassifications": {}
|
|
4015
4014
|
},
|
|
4016
4015
|
"guarantees": [
|
|
@@ -4024,6 +4023,6 @@
|
|
|
4024
4023
|
}
|
|
4025
4024
|
],
|
|
4026
4025
|
"compatibilityProofRegistryRoot": "sha256:f11b62ce69cfb0ff25b66861474b99a75148192c0474c9d1cc2067e347b05abd",
|
|
4027
|
-
"compatibilityDigest": "sha256:
|
|
4028
|
-
"contractDigest": "sha256:
|
|
4026
|
+
"compatibilityDigest": "sha256:80f65cc191b1f771475184edf8a1bf9c10dd69bb58060aa09313d0e1e57f508a",
|
|
4027
|
+
"contractDigest": "sha256:a67cf7f6bcfe9c0afb1969735a09d77225ad1252ff161fa156da8deaf5863a0e"
|
|
4029
4028
|
}
|