Files
Jędrzej Stuczyński a21a01cf1a node families (#6715)
* start node families topic branch

* start node families topic branch

* initialise node families contract

* define contract storage

* registering new family in storage

* accepting family invitation

* add_pending_invitation

* revoke_pending_invitation

* remove_family_member

* reject_pending_invitation

* disband_family

* added unit tests for the storage methods

* added restriction on uniquness of family names

* update rustc version for node families contract common

* clippy

* basic queries by id

* query_families_paged

* change family membership storage and expose query for all members of a family

* queries for pending invitations

* queries for past invitations

* queries for past data per node

* queries for past family members

* query_past_members_for_node_paged

* queries for family by name and by owner

* fixup family name normalisation

* fixed incorrect lower bound for queries for past data

* implement contract and storage initialisation

* stubbing tx messages that are to be exposed by the contract

* handler for updating config

* removed partial fee return

* wip: create family

* move mixnet contract interaction traits to shared location

* store original family name alongside the normalised variant

* prevent family creation if owner has a node in another family

* try_disband_family

* try_invite_to_family + shared helpers

* try_revoke_family_invitation

* accept_family_invitation

* stub method for node unbonding

* try_reject_family_invitation

* unit tests for family name normalisation

* try_leave_family

* try_kick_from_family

* fix outdated comments and add paid fee event attribute

* feat: NMv3: leave family upon node unbonding

* NF contract handling of unbonding

* lints

* init node families contract when creating performance contract tester

* clippy

* avoid self-dep in the contract dev deps

* introduced client traits for interacting with the node families contract

* add node families contract to cache refresher

* added query for all node family members (globally) and started scaffolding nym-api caches

* docs and cache -> api conversion

* calculating average node age based on individual timestamps

* wire up node families cache

* http stubs

* filled in the implementation

* route tests + extracting shared code

* review fixes

* feat: expose family information for all dvpn gateway endpoints within NS API

* expose family information for explorer v3 route

* clippy

* review comments and optimise db family update

* feat: Node Families: expose stake information inside DVpnGateway

* chore: update lock files after rebase

* chore: sort workspace members

* explicitly require providing node families contract address for mixnet contract migration

* fix missing node families contract address env export

* dont swallow cache overwrite failures in fixture

* pin network-defaults rustc version due to contracts dep

* further version pinning

* chore: update mixnet contract schema
2026-05-19 10:36:20 +01:00

292 lines
7.6 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "InstantiateMsg",
"type": "object",
"required": [
"current_nym_node_version",
"epoch_duration",
"epochs_in_interval",
"initial_rewarding_params",
"node_families_contract_address",
"rewarding_denom",
"rewarding_validator_address",
"vesting_contract_address"
],
"properties": {
"current_nym_node_version": {
"type": "string"
},
"epoch_duration": {
"$ref": "#/definitions/Duration"
},
"epochs_in_interval": {
"type": "integer",
"format": "uint32",
"minimum": 0.0
},
"initial_rewarding_params": {
"$ref": "#/definitions/InitialRewardingParams"
},
"interval_operating_cost": {
"default": {
"maximum": "1000000000000000",
"minimum": "0"
},
"allOf": [
{
"$ref": "#/definitions/RangedValue_for_Uint128"
}
]
},
"key_validity_in_epochs": {
"default": null,
"type": [
"integer",
"null"
],
"format": "uint32",
"minimum": 0.0
},
"node_families_contract_address": {
"type": "string"
},
"profit_margin": {
"default": {
"maximum": "1",
"minimum": "0"
},
"allOf": [
{
"$ref": "#/definitions/RangedValue_for_Percent"
}
]
},
"rewarding_denom": {
"type": "string"
},
"rewarding_validator_address": {
"type": "string"
},
"version_score_params": {
"default": {
"penalty": "0.995",
"penalty_scaling": "1.65"
},
"allOf": [
{
"$ref": "#/definitions/VersionScoreFormulaParams"
}
]
},
"version_score_weights": {
"default": {
"major": 100,
"minor": 10,
"patch": 1,
"prerelease": 1
},
"allOf": [
{
"$ref": "#/definitions/OutdatedVersionWeights"
}
]
},
"vesting_contract_address": {
"type": "string"
}
},
"additionalProperties": false,
"definitions": {
"Decimal": {
"description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)",
"type": "string"
},
"Duration": {
"type": "object",
"required": [
"nanos",
"secs"
],
"properties": {
"nanos": {
"type": "integer",
"format": "uint32",
"minimum": 0.0
},
"secs": {
"type": "integer",
"format": "uint64",
"minimum": 0.0
}
},
"additionalProperties": false
},
"InitialRewardingParams": {
"type": "object",
"required": [
"active_set_work_factor",
"initial_reward_pool",
"initial_staking_supply",
"interval_pool_emission",
"rewarded_set_params",
"staking_supply_scale_factor",
"sybil_resistance"
],
"properties": {
"active_set_work_factor": {
"$ref": "#/definitions/Decimal"
},
"initial_reward_pool": {
"$ref": "#/definitions/Decimal"
},
"initial_staking_supply": {
"$ref": "#/definitions/Decimal"
},
"interval_pool_emission": {
"$ref": "#/definitions/Percent"
},
"rewarded_set_params": {
"$ref": "#/definitions/RewardedSetParams"
},
"staking_supply_scale_factor": {
"$ref": "#/definitions/Percent"
},
"sybil_resistance": {
"$ref": "#/definitions/Percent"
}
},
"additionalProperties": false
},
"OutdatedVersionWeights": {
"description": "Defines weights for calculating numbers of versions behind the current release.",
"type": "object",
"required": [
"major",
"minor",
"patch",
"prerelease"
],
"properties": {
"major": {
"type": "integer",
"format": "uint32",
"minimum": 0.0
},
"minor": {
"type": "integer",
"format": "uint32",
"minimum": 0.0
},
"patch": {
"type": "integer",
"format": "uint32",
"minimum": 0.0
},
"prerelease": {
"type": "integer",
"format": "uint32",
"minimum": 0.0
}
},
"additionalProperties": false
},
"Percent": {
"description": "Percent represents a value between 0 and 100% (i.e. between 0.0 and 1.0)",
"allOf": [
{
"$ref": "#/definitions/Decimal"
}
]
},
"RangedValue_for_Percent": {
"type": "object",
"required": [
"maximum",
"minimum"
],
"properties": {
"maximum": {
"$ref": "#/definitions/Percent"
},
"minimum": {
"$ref": "#/definitions/Percent"
}
},
"additionalProperties": false
},
"RangedValue_for_Uint128": {
"type": "object",
"required": [
"maximum",
"minimum"
],
"properties": {
"maximum": {
"$ref": "#/definitions/Uint128"
},
"minimum": {
"$ref": "#/definitions/Uint128"
}
},
"additionalProperties": false
},
"RewardedSetParams": {
"type": "object",
"required": [
"entry_gateways",
"exit_gateways",
"mixnodes",
"standby"
],
"properties": {
"entry_gateways": {
"description": "The expected number of nodes assigned entry gateway role (i.e. [`Role::EntryGateway`])",
"type": "integer",
"format": "uint32",
"minimum": 0.0
},
"exit_gateways": {
"description": "The expected number of nodes assigned exit gateway role (i.e. [`Role::ExitGateway`])",
"type": "integer",
"format": "uint32",
"minimum": 0.0
},
"mixnodes": {
"description": "The expected number of nodes assigned the 'mixnode' role, i.e. total of [`Role::Layer1`], [`Role::Layer2`] and [`Role::Layer3`].",
"type": "integer",
"format": "uint32",
"minimum": 0.0
},
"standby": {
"description": "Number of nodes in the 'standby' set. (i.e. [`Role::Standby`])",
"type": "integer",
"format": "uint32",
"minimum": 0.0
}
},
"additionalProperties": false
},
"Uint128": {
"description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```",
"type": "string"
},
"VersionScoreFormulaParams": {
"description": "Given the formula of version_score = penalty ^ (versions_behind_factor ^ penalty_scaling) define the relevant parameters",
"type": "object",
"required": [
"penalty",
"penalty_scaling"
],
"properties": {
"penalty": {
"$ref": "#/definitions/Decimal"
},
"penalty_scaling": {
"$ref": "#/definitions/Decimal"
}
},
"additionalProperties": false
}
}
}