62 lines
2.3 KiB
Python
62 lines
2.3 KiB
Python
"""US-006 tests: Solana contract boundary for stake, payment, and settlement."""
|
|
|
|
from meshnet_contracts import LocalSolanaContracts
|
|
|
|
|
|
def test_node_stake_is_reflected_in_registry():
|
|
"""A node can submit stake and read the updated registry balance."""
|
|
contracts = LocalSolanaContracts()
|
|
|
|
receipt = contracts.registry.submit_stake("node-wallet-a", 500)
|
|
|
|
assert receipt["cluster"] == "local-test-validator"
|
|
assert contracts.registry.get_wallet("node-wallet-a").stake_balance == 500
|
|
assert contracts.registry.has_minimum_stake("node-wallet-a", minimum_stake=100)
|
|
|
|
|
|
def test_client_can_fund_api_key_with_testnet_sol():
|
|
"""A client can fund an API key account and read the available balance."""
|
|
contracts = LocalSolanaContracts()
|
|
|
|
receipt = contracts.payment.fund_api_key("api-key-a", lamports=2_000)
|
|
|
|
assert receipt["cluster"] == "local-test-validator"
|
|
assert contracts.payment.get_balance("api-key-a").lamports == 3_000
|
|
|
|
|
|
def test_epoch_settlement_debits_clients_and_rewards_nodes_and_validator():
|
|
"""Settlement distributes native token rewards according to recorded work."""
|
|
contracts = LocalSolanaContracts(cost_per_layer_token_lamport=2)
|
|
contracts.payment.fund_api_key("api-key-a", lamports=1_000)
|
|
contracts.payment.record_attribution(
|
|
session_id="session-a",
|
|
api_key="api-key-a",
|
|
node_wallet="node-wallet-a",
|
|
layer_start=0,
|
|
layer_end=15,
|
|
tokens=10,
|
|
)
|
|
contracts.payment.record_attribution(
|
|
session_id="session-a",
|
|
api_key="api-key-a",
|
|
node_wallet="node-wallet-b",
|
|
layer_start=16,
|
|
layer_end=31,
|
|
tokens=10,
|
|
speed_score=2.0,
|
|
)
|
|
|
|
result = contracts.settlement.settle_epoch(
|
|
epoch=1,
|
|
validator_wallet="validator-wallet",
|
|
validator_reward_share_bps=1_000,
|
|
)
|
|
|
|
assert result.client_debits == {"api-key-a": 640}
|
|
assert result.node_rewards == {"node-wallet-a": 96, "node-wallet-b": 192}
|
|
assert result.validator_rewards == {"validator-wallet": 32}
|
|
assert contracts.payment.get_balance("api-key-a").lamports == 1_360
|
|
assert contracts.settlement.get_token_balance("node-wallet-a") == 96
|
|
assert contracts.settlement.get_token_balance("node-wallet-b") == 192
|
|
assert contracts.settlement.get_token_balance("validator-wallet") == 32
|