Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,24 @@
All notable changes to `citrate-labs-sdk` are documented here. This project adheres to
[Semantic Versioning](https://semver.org/).

## [0.6.4] - 2026-10-06 — Post-reroll address book (r1005)

### Fixed

- Address book re-synced for the 2026-10-06 r1005 reroll (genesis block `0x1dcfc490…`,
citrate-chain bf551422; supersedes the 2026-09-29 book this release first carried).
`citrate_sdk/_generated/federation_contract.json` re-synced verbatim via `scripts/sync_contract.py`
from citrate-federation `contract/federation-contract.json`. Membership now points at
`CitrateMemberSBT 0xf8aD11f6…` / `MembershipStakeVault 0xA93F7f68…`.

### Tests

- `test_federation_contract.py` pins the r1005 membership + AA-stack addresses
(`CitrateWalletFactory 0x9Ac05AD6…`, `CitratePaymaster 0x804a8021…`) and asserts no
pre-reroll address (09-29 or earlier) leaks.
- Wallet-prediction vector `predictAddress(0x4242…)` = `0x6Ef76179…`, re-read from the live
factory on rpc.citrate.ai 2026-10-06, updated in `test_identity_wallet.py` and `test_cli.py`.

## [0.6.3] - 2026-09-25 — Hardening

### Changed
Expand Down
2 changes: 1 addition & 1 deletion citrate_sdk/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
StakingInfo,
)

__version__ = "0.6.3"
__version__ = "0.6.4"
__author__ = "Citrate Team"

__all__ = [
Expand Down
183 changes: 103 additions & 80 deletions citrate_sdk/_generated/federation_contract.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,87 +8,110 @@
"wsUrl": "wss://rpc.citrate.ai/ws"
},
"contracts": {
"ModelRegistry": "0xba36fa0da9327030bd14351db968c8c43c5a67e4",
"WrappedSALT": "0xaa918302b94a4b0e75e01e019cc6b819b4f7c906",
"AgentDecisionRegistry": "0xd4008e0b4f0bd00d630810d1f7f0f78db0ba837a",
"SpecRegistry": "0x8ce7000c83d0ef5276a70bdc34bf2fa2fe0159ff",
"IPFSIncentives": "0xb79e438bc8c68f7d94cf694eb0ec8eae40525680",
"X402Facilitator": "0xae0d2ddc74732df4424d2a89c0815cba84be37e7",
"X402Paywall": "0xca98b1678a3127a4d605ac3b37454646adbf5453",
"LiquidStakingPool": "0xead6a4a47c528ecea2a86cd9d9af7504d7a5e30e",
"ContributionAccounting": "0xd00d442c735c16d00f04ae31a180c78eec5ec32f",
"NematocystSlashing": "0xfeb23abd20084d36a1145da8a2dc04e8b48f65c7",
"MarketMakerAllocation": "0xfcc747d35d616c48bddef98a31b7e8ebc8786864",
"ModelMarketplace": "0xbd94012b113c81843dc66196d13fe0667651a7f0",
"InferenceRouter": "0x00463e63a5645de75083460f5f1ee108d0870815",
"LoRAFactory": "0xbb7eeb6286a756b0e23af2ead3e03acca72f9e39",
"LearningPool": "0xd973cc744f9fd8da55a8b08cde303d5b59a29771",
"LearningCycleManager": "0xcce506d1f270f954b726c552879ebc19f3719035",
"ClassroomRegistry": "0x124f5f69691e0963c3a7c4d9497d1e224568ffb3",
"MentorMatcher": "0x78ca904036cd144b55f6dd07bc3e36603c6c089b",
"ComputeVerifier": "0x067c16ea5c2b90045607d9b33c127606e67e61da",
"ComputeMarketplace": "0x527e636389a46784b9537690716db00d4ab987d4",
"ComputePool": "0xcd778fc9820ac8cada5cd95aa7cddf6e4ca4d375",
"HeartbeatMonitor": "0xe9eaac272844f342266862bbefc6d117a227ad9b",
"DisputeResolution": "0x4562d2a68063a61b83683aae301fe0f480e4f03a",
"ComputePricingOracle": "0x10b5c17d6f018631fc221594ed8b8bb003c9c975",
"StablecoinTreasury": "0x0e9c5953bd7c77252119e32f989ba94f735c8599",
"BulkComputeGateway": "0xf55f743e4a20557f03fdaa3cc43b0d2354c73c79",
"TestnetFarmingAccounting": "0x220cc378641607df8ff9cff6e985d67331704ca4",
"TreasuryGovernor": "0xab7c486db6377225453a04a0bf7161291f2611b1",
"InstitutionalVault": "0xb38a64922fad87e86e36254dc2fd65a971eb211e",
"ClassroomClusterV1": "0xdd6bad78e88147a46f502e02ff56808916c8c4b8",
"BudgetAllocation": "0x220a8dbb48ba3dfbe2c4f5ae162c5e5b6dc2351e",
"CashoutRequest": "0xaeb938bf9eedcffb14ab2db1e8787e591b539700",
"AIModelRegistryPortable": "0xda30a0408b1690afa739fb63901a6608547f4da6",
"AIInferenceRouterPortable": "0x85b04c554ee0137818a0e9acbe6d5f8f4b6ef1d7",
"AILearningCycleCorePortable": "0x615297a23f954681ef4b648eaaf722455eca925c",
"ModelAccessControl": "0xc68f19c4f3e1fae734ca0a053af8a5b34ed98c63",
"TEEAttestationRegistry": "0x0834a05a5607af5ff10dade01e1c96cd6e83bd8b",
"ComputePoolTraining": "0x0858b110dfa9c61df34b9d57576e751229b900b7",
"KYCRegistry": "0xf72248f5dfe5c8dab3047ae52958aa65b216be8f",
"IPFSIncentivesV2": "0x951ddc6316efbeda36dcb940e4d81747415b8500",
"IPFSIncentivesV3": "0xc27a867b8d076d77cf17981f235c64a0d0203a68",
"AggregationChallenge": "0xe7d7ebe1242feec29d514b00c9272fbffc9e69be",
"ComputePoolPipeline": "0xc05a38141bb095275f8dc24dfbbcf69722cd1a3b",
"ValidatorRegistry": "0x2655d9fbbe599e75ff6e53790f99ebc9a20c93bf",
"EduForwarder": "0xe4c6aa7afd77e24c838f8a490aae6f34b286faff",
"AnchorRegistry": "0x84a2857a293dd1fb5a0e74aaa14788b0324e408c",
"MeetingRegistry": "0x2a433b487175d1be14d2b91979d69a21e11af8eb",
"GovernanceTemplateRegistry": "0xecedd7a64f88f577a9c5d6b501291454f2bba3a6",
"GovernanceProtocolFactory": "0xb0e474647bd2f74da0d90c010234b9e9a7d2b048",
"PolicyBinding": "0xe9dd5756d2c01a262caed433f67f36ae2a73d3be",
"CapabilityGrant": "0x260ffedd17cd05a2e4daa41e1339c19a083f9e57",
"VoteAllowance": "0x1dc147b73863b1fc662bc9172b19193b4865af5f",
"Sortition": "0xadc2e3849d10cfdc3b83e5c3fe650b29f0478e54",
"PatronageLedger": "0x726f2c8a0bfa4145dca7c154577705803c8dafa3",
"ModelCooperative": "0x54b70368373b0b22ac8ad9882961228d790133bf",
"FacilitySBTImpl": "0xa8ad418a0be3877a797f183bade8dc52b1608ad0",
"NetworkSBTImpl": "0x3a6ff326f83cd77ed936dcb1620ece2f5b41d7af",
"FacilitySBT": "0x2520b5307752318b03047cf547b38b99311f65fb",
"NetworkSBT": "0x062b355f67b8252054ad59c220b3aac1cd0a0ff6",
"CitrateMemberSBT": "0xf0badd9eed5a81871a2f0d309b1f0a225646448a",
"MemberBond": "0x7d6b92757e928ab4207be3b54166ecd2c491aa92",
"MembershipStakeVaultImpl": "0x72035977f3ec295c70e2a734acbdffb0c98e6f0b",
"MembershipStakeVault": "0x53fb4badffaceedd575d47d0e74bb721504f786e",
"CitrateCooperativeFactory": "0x3b88731d65f044cc43c5d4589212c0f32a8c1667",
"CoopDeployer": "0xd7cbaeb1c1d3a3a12707297a96ae454b37ec56fe",
"CoopMembershipSBT": "0xb455c14880aca8eeddf95f6e1dcfddb13d8b6a83",
"ContributionRewardPool": "0x2aee5a81e0fa056d2e6949d71aaf96456218b6c8",
"CoopGovernor": "0x8046c10f1bb4bf58cedb4a7a55ebfa7f8b09e64b"
"ValidatorRegistry": "0xde4F679632be7810D915F637Cc6a72bf076A3BD9",
"ModelRegistry": "0x086F13745C53b460512eA2A0367EcdB62A2875eF",
"WrappedSALT": "0xAa918302B94a4B0E75E01e019cc6b819B4F7c906",
"AgentDecisionRegistry": "0x40A34010347C75c85F1EC990B1607a51FFDBE79d",
"SpecRegistry": "0xA7d848e4104B5dCac0dE081e92Eb1E93e43D6a1a",
"IPFSIncentives": "0x003563c0EE71FA2C69c6EB6440EE3c0fC8e1a467",
"X402Facilitator": "0x0D36F6e2a186436f4E4Cc78Bbc7DA2a1aC37aadb",
"X402Paywall": "0x5e833f530Dc09CaA0631AB2A50532025C0c0C0F0",
"LiquidStakingPool": "0x73270e9818530d9C141596411Ef58730C1eB9f0D",
"ContributionAccounting": "0x97Affbd04813Ea9a63DA0Cb659EE9b06E6BE6CdF",
"NematocystSlashing": "0x594C4110F0B23752cad0B1622193132d223c3595",
"MarketMakerAllocation": "0x6E01671D2D3dbF719EE1C5d6929111027aEc316A",
"ModelMarketplace": "0x6A93B6e99BfaBfb4e655c6fC15DB4d98192D040f",
"InferenceRouter": "0x42Ae16Dae5D7Bf535b5cce9d5b6521c504500896",
"LoRAFactory": "0x9BF27858C9Ece2eC13fAEa3e6BD356A20E9C5185",
"LearningPool": "0xBA5C9c886d65a969d02e40d7FBbADe316AD81E66",
"LearningCycleManager": "0x594b6EDD65EE13262cEddE14f3DeA5d62527615b",
"ClassroomRegistry": "0xe2b56b2BFcaeB3c8d14400184eAb01BBC980cC05",
"MentorMatcher": "0x19fc5C7f005c8416C5b6bddbBA634b20d9Dd56c7",
"ComputeVerifier": "0x55C3febF3c57e7f679CC773b1Cd87A5eE8a2c679",
"ComputeMarketplace": "0xA96a891b9a060788FBc93997D61A8a98D02e621d",
"ComputePool": "0x3e5969bDb10dD62ce48E84ad5FBe9CFE6F7D8AD4",
"HeartbeatMonitor": "0xBEaC9b2955D17fe14b5514CCb61aB58ac9089F65",
"DisputeResolution": "0xac5004C3282A6715712061bE7A1037362E9171f8",
"ComputePricingOracle": "0xdE15b71a7bD85499CAe26DF82407ee0bd0c3445D",
"StablecoinTreasury": "0x131fc17A9Df7c9e7B08c51B122D320018356A232",
"BulkComputeGateway": "0x244474F2E5fA35592ef60A873D356F9FEB4cb8Fa",
"TestnetFarmingAccounting": "0x19AaDBb6EDC2B9a2AF4B7f437c4E4bBD3778e487",
"TreasuryGovernor": "0x3848b933691d6dcd535D1a704E50657Fdb8C4604",
"ModelAccessControl": "0xaE0fC1a3E21afC38e781d9fB12F194dD71F53AA0",
"TEEAttestationRegistry": "0xDAC8b840A2e98A4cBEAfC413fad7DCd447D79Fb1",
"ComputePoolTraining": "0x17F0b25b8d8893f77bc5b55375BCdBd66F4cB8f3",
"InstitutionalVault": "0x3ec6473CF73bd8d4f8bC8Fb22aC923C5e0A09771",
"ClassroomClusterV1": "0x6b94b96485f789c8dDc4102A171bDafab41CE0b0",
"EduForwarder": "0x840e011A30e9082998e2094E83BeC7dC0E019bE3",
"BudgetAllocation": "0x8dC786BE442FF0A36794DDD201e7D220A97F733f",
"CashoutRequest": "0xBd8b17E21132B2bEaFdCf6FC2CbA998B33430517",
"AIModelRegistryPortable": "0xdA30A0408b1690AfA739fB63901a6608547F4dA6",
"AIInferenceRouterPortable": "0x5375785324843e8eAF024A6D2cf8CEE63496f0f1",
"AILearningCycleCorePortable": "0x197A32842aFA3775055f6F04da0c5aCaa09E0E72",
"CitrateMemberSBT": "0xf8aD11f6d3AeFA605e2EBF7C81ED08A2b38B3A3c",
"MemberBond": "0x7D6B92757e928ab4207Be3B54166Ecd2C491Aa92",
"MembershipStakeVaultImpl": "0x72035977F3Ec295C70e2A734AcbDFfB0C98E6F0b",
"MembershipStakeVault": "0xA93F7f688A8F212E0caD59eDBd1F7D3592151751",
"InstitutionTreeV1": "0xac4694986FE8E593A48D3f427E08Ac12Cc463c8F",
"ComplianceRegistry": "0xe3635aAE0B03e3c751b9E6375226E35995aD9154",
"FacilitySBTImpl": "0x58ac5816c42a3d293552Fe368C4db53b89edB02c",
"FacilitySBT": "0x47a65E700fdFBb5ccBCd64e0592D2EE58f1a8808",
"NetworkSBTImpl": "0x01D34046343a171ec7cd4DB8978adbaB095EF955",
"NetworkSBT": "0x82A14fA278055BFf7A50A82Acd00486a091E2C17",
"TenantHierarchy": "0xdf841E8C5F57fB18DE127c0223E98cE179C02c0d",
"ClassificationRegistry": "0x0084e573Bb22c3D72dc018A4d7bAC669828Ffa53",
"RoleEscalation": "0xCCbC5B7E8E3fe9a7C4cD3fe657800c58C42a4D4d",
"MultiSigEnvelope": "0xA32d82817c38Cf9baA052a9670050fece06Ddea2",
"AgentDecisionRegistryV2": "0x5F82681f959C9F1417bf59A18052CD2FEE9787eD",
"ContradictionLedger": "0x026BFbd2b9c7040BA40FD61Bdf893a72Ae8edCDb",
"QuorumAnchorRegistry": "0x9b743B49b1f7FEE8896C7BD0D1A8cE49652fe1e3",
"MeetingRegistry": "0x9A6Cdc2482730593b9E08D386157E0d41f129d4f",
"GovernanceTemplateRegistry": "0xd83eEa8e9C82a5E0ADdDd5b1aF5f646a8fa1489D",
"GovernanceProtocolFactory": "0xF6D1bf22317a7C986338d393243A33855eF28fB8",
"PolicyBinding": "0xCfCc444e54Ea3C855bDE630f0063D736d8E0ff90",
"CapabilityGrant": "0x250Ec3D18D9F0a7d99541A0B9C7Ae51469D7150a",
"VoteAllowance": "0x9E47dC72F831E6eb7304C77B3a6b26e41671F6fc",
"Sortition": "0xcdef59da0f6364959a79134b9c7421d98bB59bdC",
"PartProvenanceRegistry": "0x418D258AC8725C2048Ef3707aD22292387E5a072",
"SupplierRegistry": "0x391F6909Bc3DDc5dE73D4aFcaA7eb8800ACd7F0C",
"MoqRegistry": "0x58353A3b463Fc7aA1fAD167D793cD1A00126c252",
"DefensePrimeFLScopeIndex": "0xdcDf39d46E42BEB0C83f8847733E57Eda472b6F0",
"AppRegistry": "0x520AfE4F405B7501FBCCa8d2F13fb29a0946f963",
"CrossOrgIndex": "0x899DDb0663477A3Cd2b5D863d1334e73BA82913c",
"AuditBundleRegistry": "0xd21f20C8616D173704d0eF50967d1C3e7Ae04542",
"DefensePrimeComplianceRegistry": "0x0a320720cB00CEC119260058d1DBAFF3c6AFdE37",
"RoleGrantTenantIndex": "0x399193F404EA49a1bFeeB420Ec35A5bE9A2c9955",
"EntityRegistry": "0x34098cF54a3a3EB5324B079f83D424F178402f77",
"TinaWorkpaperRegistry": "0xfe13A08593fc91EADdeDbD26b4f381fEA0386a9A",
"CrossOrgEnvelope": "0x641E2F1AD7a30DeeF51c9596B3c32177d603ab7B",
"TripwireRegistry": "0x1aC7a2e53758ECB5eCaA2584eBF0428dC3b57Ba8",
"SponsorEvidenceRegistry": "0xE77e584c91196B7f3DE1090FA57ff9cAAe56098E",
"ReleaseManifestRegistry": "0x2C36d78F30207431EC641Fcc4D32e01F29c573E3",
"KYCRegistry": "0xCBd3e3DF59Ac1A710d1637A5A718ba42d4d63125",
"IPFSIncentivesV2": "0xF753903DAB5f891D9593c9c713374A923E80f930",
"IPFSIncentivesV3": "0xF5c115E6d88A960CC4f48129524C01004f067135",
"AggregationChallenge": "0x115a144495bE3fB4f426352BfB784BAea274603A",
"ComputePoolPipeline": "0x9A1A558AaA4a392FA1809F2767A2F5E6cb099551",
"OrganizationSBT": "0x423E4552E918A0bBCAe907A4109cc2E497C0FB1e",
"AgentSBT": "0x7c95195cfDF1F5D9444E7Cfb8B9C9869d9Fdc559",
"CapsuleRegistry": "0x88010Cc0778b9F48FeE167C86918aec8d9Ab46B2",
"AnchorRegistry": "0xAB87534EF027B52bb6233E889F758767127Bf47A",
"BenchmarkRegistry": "0x1231B7629D7FEBD3Bf24B0ce8788B944B10242c5",
"SkillRegistry": "0xbeDaD7a474785eCB27fc0Aa02ca583bdb3761A49",
"CitAgentTimelock": "0xC93d648F9D01D6c4D63F20F75E4d3e6910AeeFA4"
},
"aaStack": {
"EntryPoint": "0x97d5391a647429233e202f99231743c53a648f3c",
"CitrateWallet": "0x2d742b98d867fc7363f530dd6d756622e4eb768d",
"CitrateWalletFactory": "0x86486d1de9f256e2cba327c46ac11120df0aa51a",
"CitratePaymaster": "0xfdc9f7a72163b5d45becdb8a9d8d44b970f77318",
"WebAuthnP256Validator": "0x0f421a99a0b8f6138dea12f45a523cb896d09fc7",
"CitrateECDSAValidator": "0xd2d35421379ae5b461e216bfcdd1b7e6a64bbc40",
"GuardianRecoveryModule": "0x0a909769160c1945401b8f37a9310d37dbb6a891"
"EntryPoint": "0x97d5391a647429233E202f99231743C53a648f3c",
"WebAuthnP256Validator": "0x0f421a99A0b8F6138Dea12F45A523Cb896D09fc7",
"CitrateECDSAValidator": "0xD2d35421379Ae5b461e216BFcdD1B7e6a64BBC40",
"GuardianRecoveryModule": "0x0A909769160C1945401b8f37a9310d37DbB6a891",
"CitrateWallet": "0x2D742B98D867Fc7363F530DD6d756622e4Eb768D",
"CitrateWalletFactory": "0x9Ac05AD65C9E8E48Fbb41dDE029512afA5346C85",
"CitratePaymaster": "0x804a8021cc1212798180bC9330f6467f883C392c"
},
"membership": {
"CitrateMemberSBT": "0xf0badd9eed5a81871a2f0d309b1f0a225646448a",
"MembershipStakeVault": "0x53fb4badffaceedd575d47d0e74bb721504f786e"
"CitrateMemberSBT": "0xf8aD11f6d3AeFA605e2EBF7C81ED08A2b38B3A3c",
"MembershipStakeVault": "0xA93F7f688A8F212E0caD59eDBd1F7D3592151751"
},
"precompiles": {
"ModelDeploy": "0x0000000000000000000000000000000000000100",
Expand Down Expand Up @@ -141,10 +164,10 @@
"keyPrefix": "cgk_"
},
"provenance": {
"deployer": "0x4fAB35c8c5033c80b3a0452A873B81e6ED4ED732",
"deployedAt": "2026-09-07T20:37:05Z",
"deployer": "0x7DAbC319867fCcA7dE8A20809EfBd39BbF17Acdf",
"deployedAt": "2026-10-06T05:43:04Z",
"sourceHashes": {
"chainAddresses": "20d0963261cd422e60f2a43b54c285fdff734e45b8166246779fc775cf46ccf0",
"chainAddresses": "4ae8828a85c23b5a0b0d3652948e20b0705f35c4c1cd8a684be7d2ea8f405419",
"entitlements": "d7c1167466eafbc3d2f8233c2adc32d310b4c73026b998e46e1b4f0c1fa461a1"
}
}
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "citrate-labs-sdk"
version = "0.6.3"
version = "0.6.4"
description = "Python SDK for the Citrate distributed AI network (chain 40204). The canonical TypeScript SDK is @citratelabs/sdk on npm; this Python client is opt-in and may lag it."
readme = "README.md"
requires-python = ">=3.10"
Expand Down
2 changes: 1 addition & 1 deletion tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def test_entry_point_resolves_and_help_returns():
def test_wallet_predict_matches_onchain_vector():
rc, out = _run(["wallet", "predict", "--user-id", "0x" + "42" * 32])
assert rc == 0
assert "0xfb43484CDbA25C6457C2775C1d6dfeD71cE4e720" in out
assert "0x6Ef7617980a1fe91D3449315E8D48f99A68Bb5eA" in out


def test_entitlement_capabilities():
Expand Down
24 changes: 20 additions & 4 deletions tests/test_federation_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ def test_chain_id_is_40204():
def test_aa_stack_pins_the_live_addresses():
aa = contract.aa_stack()
assert aa["EntryPoint"].lower() == "0x97d5391a647429233e202f99231743c53a648f3c"
assert aa["CitrateWalletFactory"].lower() == "0x86486d1de9f256e2cba327c46ac11120df0aa51a"
assert aa["CitratePaymaster"].lower() == "0xfdc9f7a72163b5d45becdb8a9d8d44b970f77318"
assert aa["CitrateWalletFactory"].lower() == "0x9ac05ad65c9e8e48fbb41dde029512afa5346c85"
assert aa["CitratePaymaster"].lower() == "0x804a8021cc1212798180bc9330f6467f883c392c"


def test_membership_addresses_present():
m = contract.membership()
assert m["CitrateMemberSBT"].lower() == "0xf0badd9eed5a81871a2f0d309b1f0a225646448a"
assert m["MembershipStakeVault"].lower() == "0x53fb4badffaceedd575d47d0e74bb721504f786e"
assert m["CitrateMemberSBT"].lower() == "0xf8ad11f6d3aefa605e2ebf7c81ed08a2b38b3a3c"
assert m["MembershipStakeVault"].lower() == "0xa93f7f688a8f212e0cad59edbd1f7d3592151751"


def test_entitlement_vocabulary():
Expand All @@ -43,3 +43,19 @@ def test_no_dead_dcp1_addresses_leak():
blob = json.dumps(contract.federation_contract()).lower()
for dead in ("0x5a45b6f8", "0xf14f56e8", "0x149e85a3", "0x0aceb7b4"):
assert dead not in blob, f"stale D-CP-1 address {dead} leaked into the artifact"


def test_no_pre_reroll_addresses_leak():
"""Fresh-keys reroll 2026-09-29 (citrate-chain 0aab474b) retired these."""
import json
blob = json.dumps(contract.federation_contract()).lower()
for dead in ("0xf0badd9e", "0x53fb4bad", "0x2655d9fb", "0xf42a1919"):
assert dead not in blob, f"pre-reroll address {dead} leaked into the artifact"


def test_no_r0929_addresses_leak():
"""r1005 reroll 2026-10-06 (genesis 0x1dcfc490…, citrate-chain bf551422) retired the 09-29 book."""
import json
blob = json.dumps(contract.federation_contract()).lower()
for dead in ("0xa24aa35f", "0x4c0f8b27", "0xba4abd4f", "0x915fada6", "0xa3512be8", "0x24e2a41e", "0x8e65bff9"):
assert dead not in blob, f"09-29 address {dead} leaked into the artifact"
5 changes: 3 additions & 2 deletions tests/test_identity_wallet.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""DEVX-S1 / F2 — embedded wallet prediction (Python parity with JS + on-chain factory).

Pinned to the on-chain CitrateWalletFactory.predictAddress(0x4242…)=0x1615Af12… (2026-07-25),
Pinned to the on-chain CitrateWalletFactory.predictAddress(0x4242…)=0x6Ef76179… (2026-10-06,
live factory 0x9Ac05AD6… after the 2026-10-06 r1005 re-roll, genesis 0x1dcfc490…),
the SAME value the JS SDK produces — cross-language byte parity (risk R-2).
"""
from __future__ import annotations
Expand All @@ -19,7 +20,7 @@ def _raises(exc, fn):


def test_predict_matches_onchain_and_js():
assert wallet.predict_wallet_address(USER_ID_4242) == "0xfb43484CDbA25C6457C2775C1d6dfeD71cE4e720"
assert wallet.predict_wallet_address(USER_ID_4242) == "0x6Ef7617980a1fe91D3449315E8D48f99A68Bb5eA"


def test_predict_uses_artifact_factory_and_impl_by_default():
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading