@@ -124,31 +124,37 @@ var knownIncompatibilities = map[string]knownIncompat{
124124 // device interface / link commands: --mtu requirement changed from 2048 to 9000.
125125 // Versions before 0.12.0 didn't have these commands; versions 0.12.0–0.15.x send
126126 // the old MTU value which the current program rejects.
127- "write/device_interface_create" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
128- "write/device_interface_create_2" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
129- "write/device_interface_create_3" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
130- "write/device_interface_create_4" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
131- "write/device_interface_set_unlinked" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
132- "write/device_interface_set_unlinked_2" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
133- "write/device_interface_set_unlinked_3" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
134- "write/device_interface_set_unlinked_4" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
135- "write/link_create_wan" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
136- "write/link_create_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
137- "write/link_accept_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
138- "write/link_update" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
139- "write/link_set_health" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
140- "write/link_set_health_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
141- "write/link_get" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
142- "write/link_wait_activated" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
143- "write/link_wait_activated_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
144- "write/link_drain" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
145- "write/link_drain_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
146- "write/link_delete" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
147- "write/link_delete_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
148- "write/device_interface_delete" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
149- "write/device_interface_delete_2" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
150- "write/device_interface_delete_3" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
151- "write/device_interface_delete_4" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}},
127+ //
128+ // Testnet override: extends the incompatible range to cover v0.10.0–v0.16.x. On
129+ // testnet, v0.10.0–v0.11.0 predate the interface/link commands entirely, and
130+ // testnet v0.16.0 was built before the RFC-18 InterfaceV2 (flex_algo_node_segments)
131+ // change, so it can't deserialize the new account format. On mainnet-beta v0.16.0
132+ // was released after RFC-18, so only the 0.12.0–0.15.x range applies there.
133+ "write/device_interface_create" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
134+ "write/device_interface_create_2" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
135+ "write/device_interface_create_3" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
136+ "write/device_interface_create_4" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
137+ "write/device_interface_set_unlinked" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
138+ "write/device_interface_set_unlinked_2" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
139+ "write/device_interface_set_unlinked_3" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
140+ "write/device_interface_set_unlinked_4" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
141+ "write/link_create_wan" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
142+ "write/link_create_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
143+ "write/link_accept_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
144+ "write/link_update" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
145+ "write/link_set_health" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
146+ "write/link_set_health_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
147+ "write/link_get" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
148+ "write/link_wait_activated" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
149+ "write/link_wait_activated_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
150+ "write/link_drain" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
151+ "write/link_drain_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
152+ "write/link_delete" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
153+ "write/link_delete_dzx" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
154+ "write/device_interface_delete" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
155+ "write/device_interface_delete_2" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
156+ "write/device_interface_delete_3" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
157+ "write/device_interface_delete_4" : {ranges : []versionRange {{from : "0.12.0" , before : "0.16.0" }}, envOverride : map [string ][]versionRange {"testnet" : {{from : "0.10.0" , before : "0.17.0" }}}},
152158}
153159
154160// =============================================================================
@@ -781,6 +787,13 @@ func createAndStartVersionDevnet(
781787 _ , _ = dn .Manager .Exec (t .Context (), []string {"bash" , "-c" ,
782788 "doublezero global-config set --multicast-publisher-block 148.51.120.0/21" })
783789
790+ // Ensure the unicast-default topology exists. The link activate processor (RFC-18)
791+ // requires this topology account to be present. Ignore errors — if the topology
792+ // already exists in the cloned state (e.g. testnet after RFC-18 deployment), this
793+ // is a no-op. Use the current CLI since old CLIs don't have topology commands.
794+ _ , _ = dn .Manager .Exec (t .Context (), []string {"bash" , "-c" ,
795+ "doublezero link topology create --name unicast-default --constraint include-any" })
796+
784797 // Start the activator — it needs the PDAs to exist.
785798 // Skip the controller (not exercised in compat tests, saves memory).
786799 _ , err = dn .Activator .StartIfNotRunning (t .Context ())
0 commit comments