Skip to content

Commit ec0a68c

Browse files
e2e/smartcontract: fix CI failures on PR #3474
- interface_test.rs: add admin_group_bits_pda to SetGlobalConfig accounts in test_interface_create_invalid_mtu_{non_cyoa,cyoa}; RFC-18 added AdminGroupBits as a required account for SetGlobalConfig - sdk/go/serviceability/state.go: fix gofmt formatting violation - sdk/rs/client.rs: fix payer deduplication when user_payer==payer; check `a.is_signer` before skipping payer insertion so the payer is added as a signer even when already present as a non-signer - e2e/compatibility_test.go: add testnet envOverride for all interface and link steps covering v0.10.0–v0.16.x (testnet v0.10.0–v0.11.0 predate the commands; testnet v0.16.0 was built before RFC-18 InterfaceV2 change); create unicast-default topology in compat test setup so the activator can activate links (required by RFC-18)
1 parent ad55139 commit ec0a68c

4 files changed

Lines changed: 58 additions & 39 deletions

File tree

e2e/compatibility_test.go

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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())

smartcontract/programs/doublezero-serviceability/tests/interface_test.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,8 @@ async fn test_interface_create_invalid_mtu_non_cyoa() {
14791479
let (multicast_publisher_block_pda, _, _) =
14801480
get_resource_extension_pda(&program_id, ResourceType::MulticastPublisherBlock);
14811481
let (vrf_ids_pda, _, _) = get_resource_extension_pda(&program_id, ResourceType::VrfIds);
1482+
let (admin_group_bits_pda, _, _) =
1483+
get_resource_extension_pda(&program_id, ResourceType::AdminGroupBits);
14821484

14831485
execute_transaction(
14841486
&mut banks_client,
@@ -1503,6 +1505,7 @@ async fn test_interface_create_invalid_mtu_non_cyoa() {
15031505
AccountMeta::new(segment_routing_ids_pda, false),
15041506
AccountMeta::new(multicast_publisher_block_pda, false),
15051507
AccountMeta::new(vrf_ids_pda, false),
1508+
AccountMeta::new(admin_group_bits_pda, false),
15061509
],
15071510
&payer,
15081511
)
@@ -1671,6 +1674,8 @@ async fn test_interface_create_invalid_mtu_cyoa() {
16711674
let (multicast_publisher_block_pda, _, _) =
16721675
get_resource_extension_pda(&program_id, ResourceType::MulticastPublisherBlock);
16731676
let (vrf_ids_pda, _, _) = get_resource_extension_pda(&program_id, ResourceType::VrfIds);
1677+
let (admin_group_bits_pda, _, _) =
1678+
get_resource_extension_pda(&program_id, ResourceType::AdminGroupBits);
16741679

16751680
execute_transaction(
16761681
&mut banks_client,
@@ -1695,6 +1700,7 @@ async fn test_interface_create_invalid_mtu_cyoa() {
16951700
AccountMeta::new(segment_routing_ids_pda, false),
16961701
AccountMeta::new(multicast_publisher_block_pda, false),
16971702
AccountMeta::new(vrf_ids_pda, false),
1703+
AccountMeta::new(admin_group_bits_pda, false),
16981704
],
16991705
&payer,
17001706
)

smartcontract/sdk/go/serviceability/state.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -392,19 +392,19 @@ type FlexAlgoNodeSegment struct {
392392
}
393393

394394
type Interface struct {
395-
Version uint8
396-
Status InterfaceStatus
397-
Name string
398-
InterfaceType InterfaceType
399-
InterfaceCYOA InterfaceCYOA
400-
InterfaceDIA InterfaceDIA
401-
LoopbackType LoopbackType
402-
Bandwidth uint64
403-
Cir uint64
404-
Mtu uint16
405-
RoutingMode RoutingMode
406-
VlanId uint16
407-
IpNet [5]uint8
395+
Version uint8
396+
Status InterfaceStatus
397+
Name string
398+
InterfaceType InterfaceType
399+
InterfaceCYOA InterfaceCYOA
400+
InterfaceDIA InterfaceDIA
401+
LoopbackType LoopbackType
402+
Bandwidth uint64
403+
Cir uint64
404+
Mtu uint16
405+
RoutingMode RoutingMode
406+
VlanId uint16
407+
IpNet [5]uint8
408408
NodeSegmentIdx uint16
409409
UserTunnelEndpoint bool
410410
FlexAlgoNodeSegments []FlexAlgoNodeSegment `json:",omitempty"`

smartcontract/sdk/rs/src/client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ impl DZClient {
146146

147147
let payer_pubkey = payer.pubkey();
148148
let mut all_accounts = accounts;
149-
if !all_accounts.iter().any(|a| a.pubkey == payer_pubkey) {
149+
if !all_accounts.iter().any(|a| a.pubkey == payer_pubkey && a.is_signer) {
150150
all_accounts.push(AccountMeta::new(payer_pubkey, true));
151151
}
152152
all_accounts.push(AccountMeta::new(program::id(), false));

0 commit comments

Comments
 (0)