From 51fd10ebcf4021ffc205457c5d644391ea37592d Mon Sep 17 00:00:00 2001 From: Siddharth Suresh Date: Fri, 26 Jun 2026 22:57:53 -0700 Subject: [PATCH 1/5] Add Protocol 28 (CAP-0084) muxed contract address support Re-pin go-stellar-sdk to the CAP-0084 regen (sisuresh/go@318bde14) which adds the SC_ADDRESS_TYPE_MUXED_CONTRACT arm. The SAC host de-muxes the destination and emits to_muxed_id as a uint64 (mirroring CAP-67 muxed accounts) for both transfer and mint, so horizon's existing V4 contractevents path already handles it; this documents that and adds regression tests. --- go.mod | 2 + go.sum | 4 +- internal/ingest/contractevents/events.go | 21 +++++--- internal/ingest/contractevents/events_test.go | 54 +++++++++++++++++++ 4 files changed, 72 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 152ffc76..021f2e09 100644 --- a/go.mod +++ b/go.mod @@ -170,3 +170,5 @@ require ( google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 // indirect ) + +replace github.com/stellar/go-stellar-sdk => github.com/sisuresh/go v0.0.0-20260627053858-318bde14b520 diff --git a/go.sum b/go.sum index 75a8c147..53c66b7a 100644 --- a/go.sum +++ b/go.sum @@ -413,6 +413,8 @@ github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+Yg github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sisuresh/go v0.0.0-20260627053858-318bde14b520 h1:Dvv5T93Qfj1VBmxqdvWf92xFv8BFg0TFFl4gMSR7QPI= +github.com/sisuresh/go v0.0.0-20260627053858-318bde14b520/go.mod h1:IkcqcrE9UQi7n/1y+MxKB+7qzdjG1T2kGOD7Ss8dqjw= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= @@ -429,8 +431,6 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= -github.com/stellar/go-stellar-sdk v0.6.1-0.20260616165505-26fec7c0e891 h1:Y/PtLm4L4ZHLDI1dXIflRjI5pY+m+KD7FUVFM07tV+E= -github.com/stellar/go-stellar-sdk v0.6.1-0.20260616165505-26fec7c0e891/go.mod h1:IkcqcrE9UQi7n/1y+MxKB+7qzdjG1T2kGOD7Ss8dqjw= github.com/stellar/go-xdr v0.0.0-20260529210834-0bf8f4956364 h1:gOKrfuWdZ92LFlv0TAwgZ7OsWKeBsOMDlGLyFgduI1w= github.com/stellar/go-xdr v0.0.0-20260529210834-0bf8f4956364/go.mod h1:If+U9Z1W5xU97VrOgJandQT+2dN7/iOpkCrxBJEyF80= github.com/stellar/throttled v2.2.3-0.20190823235211-89d75816f59d+incompatible h1:jMXXAcz6xTarGDQ4VtVbtERogcmDQw4RaE85Cr9CgoQ= diff --git a/internal/ingest/contractevents/events.go b/internal/ingest/contractevents/events.go index a1b31940..15e6a1e2 100644 --- a/internal/ingest/contractevents/events.go +++ b/internal/ingest/contractevents/events.go @@ -317,10 +317,15 @@ func parseSacEventFromTxMetaV4(event *xdr.ContractEvent, networkPassphrase strin } // parseSacEventMap parses the ScMap data format used in V4 SAC events. -// For SAC events, to_muxed_id represents the muxed account ID from -// MuxedAddressObject - which is always a uint64. ScvBytes and ScvString are NOT -// valid for SAC events (those are only used for classic transaction memo mappings -// per CAP-67, which are processed through a different code path). +// For SAC events, to_muxed_id is always a uint64. It carries either the muxed +// account ID from a MuxedAddressObject (CAP-67) or, under CAP-0084, the muxed +// contract ID from a MUXED_CONTRACT ScAddress. In both cases the SAC host +// de-muxes the destination before emitting the event: the `to` topic holds the +// base (account or contract) address and the mux id is surfaced separately as a +// uint64, so the two are byte-identical in shape and indistinguishable from the +// event alone. This holds for both transfer and mint. ScvBytes and ScvString are +// NOT valid for SAC events (those are only used for classic transaction memo +// mappings per CAP-67, which are processed through a different code path). func parseSacEventMap(mapData xdr.ScMap) (xdr.Int128Parts, xdr.Memo, error) { var foundAmount, foundMuxedId bool var amount xdr.Int128Parts @@ -346,9 +351,11 @@ func parseSacEventMap(mapData xdr.ScMap) (xdr.Int128Parts, xdr.Memo, error) { case "to_muxed_id": foundMuxedId = true - // SAC events only emit uint64 for to_muxed_id (muxed account ID). - // ScvBytes/ScvString are NOT valid here - those are only for classic - // transaction memo mappings which use a different code path. + // SAC events only emit uint64 for to_muxed_id (muxed account ID under + // CAP-67, or muxed contract ID under CAP-0084 - both de-muxed by the + // host to a uint64). ScvBytes/ScvString are NOT valid here - those are + // only for classic transaction memo mappings which use a different + // code path. switch entry.Val.Type { case xdr.ScValTypeScvU64: if val, ok := entry.Val.GetU64(); ok { diff --git a/internal/ingest/contractevents/events_test.go b/internal/ingest/contractevents/events_test.go index e5118b98..fd6b44da 100644 --- a/internal/ingest/contractevents/events_test.go +++ b/internal/ingest/contractevents/events_test.go @@ -21,6 +21,11 @@ var ( randomAccount = keypair.MustRandom().Address() zeroContractHash = xdr.Hash([32]byte{}) zeroContract = strkey.MustEncode(strkey.VersionByteContract, zeroContractHash[:]) + // muxedContractHash stands in for the base contract a CAP-0084 + // MUXED_CONTRACT address de-muxes to. The host emits this base contract in + // the `to` topic and surfaces the mux id separately as a uint64. + muxedContractHash = xdr.Hash([32]byte{0xCA, 0xFE, 0xBA, 0xBE}) + muxedContract = strkey.MustEncode(strkey.VersionByteContract, muxedContractHash[:]) ) // Test fixture structure @@ -242,6 +247,55 @@ func TestStellarAssetContractEventParsing(t *testing.T) { DestinationMemo: xdr.MemoID(12345), }, }, + { + // CAP-0084: a transfer to a muxed contract destination. The host + // de-muxes the MUXED_CONTRACT address, emitting the base contract in + // the `to` topic and the mux id as a uint64 to_muxed_id - byte-identical + // in shape to the CAP-67 muxed-account case above, by design. + name: "V4 transfer to muxed contract (CAP-0084)", + txMetaVersion: 4, + eventType: EventTypeTransfer, + topics: []xdr.ScVal{ + makeSymbol("transfer"), + makeAddress(randomAccount), + makeAddress(muxedContract), + makeAsset(randomAsset), + }, + data: makeV4MapData(big.NewInt(1000), xdr.MemoID(67890)), + asset: randomAsset, + contractID: mustGetContractID(randomAsset), + expectedResult: &StellarAssetContractEvent{ + Type: EventTypeTransfer, + Asset: randomAsset, + From: randomAccount, + To: muxedContract, + Amount: xdr.Int128Parts{Lo: 1000, Hi: 0}, + DestinationMemo: xdr.MemoID(67890), + }, + }, + { + // CAP-0084: a mint to a muxed contract destination. The mint path + // de-muxes the destination identically to transfer, so the muxed + // contract id surfaces as a uint64 to_muxed_id as well. + name: "V4 mint to muxed contract (CAP-0084)", + txMetaVersion: 4, + eventType: EventTypeMint, + topics: []xdr.ScVal{ + makeSymbol("mint"), + makeAddress(muxedContract), // to (no admin in V4) + makeAsset(randomAsset), + }, + data: makeV4MapData(big.NewInt(2000), xdr.MemoID(67890)), + asset: randomAsset, + contractID: mustGetContractID(randomAsset), + expectedResult: &StellarAssetContractEvent{ + Type: EventTypeMint, + Asset: randomAsset, + To: muxedContract, + Amount: xdr.Int128Parts{Lo: 2000, Hi: 0}, + DestinationMemo: xdr.MemoID(67890), + }, + }, { name: "V4 SAC event rejects ScvString for to_muxed_id", txMetaVersion: 4, From 7ebefc4c0254bce5180da02f379bd52f9fe54106 Mon Sep 17 00:00:00 2001 From: Siddharth Suresh Date: Wed, 1 Jul 2026 15:32:50 -0700 Subject: [PATCH 2/5] Bump go-sdk replace to 51284c1e (drop #304 comment) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 021f2e09..af6dabdd 100644 --- a/go.mod +++ b/go.mod @@ -171,4 +171,4 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect ) -replace github.com/stellar/go-stellar-sdk => github.com/sisuresh/go v0.0.0-20260627053858-318bde14b520 +replace github.com/stellar/go-stellar-sdk => github.com/sisuresh/go v0.0.0-20260701222026-51284c1e7418 diff --git a/go.sum b/go.sum index 53c66b7a..70b3f7a4 100644 --- a/go.sum +++ b/go.sum @@ -413,8 +413,8 @@ github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+Yg github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sisuresh/go v0.0.0-20260627053858-318bde14b520 h1:Dvv5T93Qfj1VBmxqdvWf92xFv8BFg0TFFl4gMSR7QPI= -github.com/sisuresh/go v0.0.0-20260627053858-318bde14b520/go.mod h1:IkcqcrE9UQi7n/1y+MxKB+7qzdjG1T2kGOD7Ss8dqjw= +github.com/sisuresh/go v0.0.0-20260701222026-51284c1e7418 h1:t6BNG0+6IXmRxMXtREQQuH5yu85bsGE7GQbYbSAMwUE= +github.com/sisuresh/go v0.0.0-20260701222026-51284c1e7418/go.mod h1:IkcqcrE9UQi7n/1y+MxKB+7qzdjG1T2kGOD7Ss8dqjw= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= From b4efbfc57c801c33de12851f1b134e6db2779229 Mon Sep 17 00:00:00 2001 From: Siddharth Suresh Date: Thu, 2 Jul 2026 17:46:20 -0700 Subject: [PATCH 3/5] Re-pin go-stellar-sdk to #5961 head eeca7aa4 (CAP-0084) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index af6dabdd..07222c46 100644 --- a/go.mod +++ b/go.mod @@ -171,4 +171,4 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect ) -replace github.com/stellar/go-stellar-sdk => github.com/sisuresh/go v0.0.0-20260701222026-51284c1e7418 +replace github.com/stellar/go-stellar-sdk => github.com/sisuresh/go v0.0.0-20260701230520-eeca7aa4a3bc diff --git a/go.sum b/go.sum index 70b3f7a4..a28227b7 100644 --- a/go.sum +++ b/go.sum @@ -413,8 +413,8 @@ github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+Yg github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sisuresh/go v0.0.0-20260701222026-51284c1e7418 h1:t6BNG0+6IXmRxMXtREQQuH5yu85bsGE7GQbYbSAMwUE= -github.com/sisuresh/go v0.0.0-20260701222026-51284c1e7418/go.mod h1:IkcqcrE9UQi7n/1y+MxKB+7qzdjG1T2kGOD7Ss8dqjw= +github.com/sisuresh/go v0.0.0-20260701230520-eeca7aa4a3bc h1:WVa7+1/bWNhqwKTBIZ+yHdANMwmXDb4VOym4bn2YpME= +github.com/sisuresh/go v0.0.0-20260701230520-eeca7aa4a3bc/go.mod h1:IkcqcrE9UQi7n/1y+MxKB+7qzdjG1T2kGOD7Ss8dqjw= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= From a3e28b6ac277cd885ced803300e5ad55803fa4cd Mon Sep 17 00:00:00 2001 From: Siddharth Suresh Date: Thu, 2 Jul 2026 20:20:58 -0700 Subject: [PATCH 4/5] Add CAP-0084 changelog entry; capture muxed-contract LCM fixture - CHANGELOG: note Protocol 28 (CAP-0084) muxed-contract ingestion under Unreleased. - test-lcms: re-capture InvokeHostFunctionTests native/custom-asset LCM from a CAP-0084 vnext core build so TestCoreLCMIngestion exercises real muxed-contract SAC transfer/mint ledgers (surfacing to_muxed_id) end-to-end, not just P27 data. - horizon.yml: relabel the P28 leg CAP-0083 -> CAP-0084 and refresh the RPC tracking ref to stellar-rpc#837. Note: fixture captured from core #5337 built at 389ee9ee5 (one commit behind HEAD 4cdd2fc9e; delta is a host-submodule env re-pin). Muxed-id semantics still want human review - TestCoreLCMIngestion only asserts non-error. --- .github/workflows/horizon.yml | 15 ++++++++++----- CHANGELOG.md | 6 ++++++ .../221f1cad327fb891.xdr | Bin 74924 -> 80356 bytes .../efd47464023e9e55.xdr | Bin 75940 -> 86516 bytes 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.github/workflows/horizon.yml b/.github/workflows/horizon.yml index 5bb9c443..3d9767d1 100644 --- a/.github/workflows/horizon.yml +++ b/.github/workflows/horizon.yml @@ -35,13 +35,18 @@ jobs: PROTOCOL_27_CORE_DOCKER_IMG: stellar/stellar-core:27.0.0-3288.7696c069d.jammy PROTOCOL_27_CORE_DEBIAN_PKG_VERSION: 27.0.0-3288.7696c069d.jammy~buildtests PROTOCOL_27_STELLAR_RPC_DOCKER_IMG: stellar/stellar-rpc:27.0.0-preview-190 - # Protocol 28 (CAP-0083) runs against the vnext (next-protocol-enabled) core build. - # Pinned to 3367 (3589a696b), which includes stellar-core#5329 — the fix - # for the QueryServer.cpp:124 contiguous-snapshot assertion that aborted - # captive-core catchup on builds 3313..3366. + # Protocol 28 (CAP-0084) runs against the vnext (next-protocol-enabled) core build. + # Still pinned to the CAP-0083-era vnext build 3367 (3589a696b): no -vnext + # image/deb matching CAP-0084 core (stellar-core#5337, HEAD 4cdd2fc9e) is + # published yet, and horizon's integration matrix does not exercise + # muxed-contract SAC behavior (covered by contractevents/events_test.go and + # the captured InvokeHostFunctionTests CAP-0084 test-lcms fixture). 3589a696b + # includes stellar-core#5329 — the fix for the QueryServer.cpp:124 + # contiguous-snapshot assertion that aborted captive-core catchup on builds + # 3313..3366. Re-pin once a CAP-0084 -vnext image/deb publishes. PROTOCOL_28_CORE_DOCKER_IMG: stellar/unsafe-stellar-core:27.0.1-3367.3589a696b.jammy-vnext PROTOCOL_28_CORE_DEBIAN_PKG_VERSION: 27.0.1-3367.3589a696b.jammy~vnext~buildtests - # No Protocol 28 stellar-rpc image is published yet (tracked: stellar-rpc#789). + # No Protocol 28 stellar-rpc image is published yet (tracked: stellar-rpc#837). # Leave EMPTY on purpose: the P27 RPC image bundles a P27 captive-core that # cannot ingest a protocol-28 network, so bringing it up makes every # EnableStellarRPC test hang in waitForStellarRPC() ("DB is empty") until the diff --git a/CHANGELOG.md b/CHANGELOG.md index 903e4e88..049aa0a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased +### Added +- Added Protocol 28 ingestion support for CAP-0084 (Muxed Contract Addresses): + SAC transfer/mint events to a muxed-contract destination surface the base + contract in the `to` topic and the mux id via `to_muxed_id`, and bumped + `MaxSupportedProtocolVersion` to 28 ([#203](https://github.com/stellar/stellar-horizon/pull/203)). + ## 27.0.0 **This release adds support for Protocol 27** diff --git a/internal/ingest/testdata/test-lcms/InvokeHostFunctionTests/221f1cad327fb891.xdr b/internal/ingest/testdata/test-lcms/InvokeHostFunctionTests/221f1cad327fb891.xdr index fffe8d032a00726b81086665caf69e0cecc2a184..0680d2ec9e3903cb47c4d472fd7c543a1a41ebfa 100644 GIT binary patch delta 8680 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 diff --git a/internal/ingest/testdata/test-lcms/InvokeHostFunctionTests/efd47464023e9e55.xdr b/internal/ingest/testdata/test-lcms/InvokeHostFunctionTests/efd47464023e9e55.xdr index 961bd7029e1064af3859dac510e9cc937625503f..047bf34f94a4214cbc9b11cde150ff15049d0aa5 100644 GIT binary patch delta 9652 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 delta 7705 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 Date: Mon, 6 Jul 2026 12:54:43 -0700 Subject: [PATCH 5/5] CAP-0084: re-pin P28 core image/deb to vnext build 3395 (4cdd2fc9e) The -vnext artifact matching stellar-core#5337 HEAD (4cdd2fc9e) has published, so the P28 integration leg now runs against a CAP-0084-capable core instead of the deferred CAP-0083-era build. Variant preserved (plain -vnext docker, ~vnext~buildtests deb). --- .github/workflows/horizon.yml | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/.github/workflows/horizon.yml b/.github/workflows/horizon.yml index 3d9767d1..957bb34c 100644 --- a/.github/workflows/horizon.yml +++ b/.github/workflows/horizon.yml @@ -36,16 +36,11 @@ jobs: PROTOCOL_27_CORE_DEBIAN_PKG_VERSION: 27.0.0-3288.7696c069d.jammy~buildtests PROTOCOL_27_STELLAR_RPC_DOCKER_IMG: stellar/stellar-rpc:27.0.0-preview-190 # Protocol 28 (CAP-0084) runs against the vnext (next-protocol-enabled) core build. - # Still pinned to the CAP-0083-era vnext build 3367 (3589a696b): no -vnext - # image/deb matching CAP-0084 core (stellar-core#5337, HEAD 4cdd2fc9e) is - # published yet, and horizon's integration matrix does not exercise - # muxed-contract SAC behavior (covered by contractevents/events_test.go and - # the captured InvokeHostFunctionTests CAP-0084 test-lcms fixture). 3589a696b - # includes stellar-core#5329 — the fix for the QueryServer.cpp:124 - # contiguous-snapshot assertion that aborted captive-core catchup on builds - # 3313..3366. Re-pin once a CAP-0084 -vnext image/deb publishes. - PROTOCOL_28_CORE_DOCKER_IMG: stellar/unsafe-stellar-core:27.0.1-3367.3589a696b.jammy-vnext - PROTOCOL_28_CORE_DEBIAN_PKG_VERSION: 27.0.1-3367.3589a696b.jammy~vnext~buildtests + # Pinned to build 3395 (4cdd2fc9e) — the -vnext image/deb matching CAP-0084 + # core (stellar-core#5337, HEAD 4cdd2fc9e). Variant preserved from the p27 leg: + # plain -vnext docker + ~vnext~buildtests deb. + PROTOCOL_28_CORE_DOCKER_IMG: stellar/unsafe-stellar-core:27.1.1-3395.4cdd2fc9e.jammy-vnext + PROTOCOL_28_CORE_DEBIAN_PKG_VERSION: 27.1.1-3395.4cdd2fc9e.jammy~vnext~buildtests # No Protocol 28 stellar-rpc image is published yet (tracked: stellar-rpc#837). # Leave EMPTY on purpose: the P27 RPC image bundles a P27 captive-core that # cannot ingest a protocol-28 network, so bringing it up makes every