Skip to content
Merged
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: 10 additions & 8 deletions service_contracts/test/FWSSDispatcherTransitionScripts.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@ import {JosukeLedger} from "../script/lib/JosukeLedger.sol";
import {JosukeFacetSet} from "../script/lib/JosukeFacetSet.sol";

/// @dev Drives the transition scripts against the deployed mainnet v1.4.0 bytecode, at the mainnet proxy address
/// that deployments.json and josuke.json record for chain 314.
/// that the v1.4.0 deployments.json fixture records for chain 314.
contract FWSSDispatcherTransitionScriptsTest is Test, JosukeFacetSet {
uint256 private constant CHAIN = 314;
string private constant V1_4_0_MAINNET = "test/fixtures/fwss-v1.4.0-mainnet.json";
// deployments.json before the transition: the committed file gains dispatcher records once A1 runs on Mainnet.
string private constant SEED = "test/fixtures/deployments-v1.4.0.json";
string private constant SCRATCH = "out/FWSSDispatcherTransitionScripts";
string private constant DEPLOYMENTS = "out/FWSSDispatcherTransitionScripts/deployments.json";
string private constant SCRATCH_LEDGER = "out/FWSSDispatcherTransitionScripts/josuke.json";
Expand Down Expand Up @@ -152,7 +154,7 @@ contract FWSSDispatcherTransitionScriptsTest is Test, JosukeFacetSet {
assertEq(vm.parseJsonString(json, ".314.metadata.commit"), GIT_COMMIT);
_assertIsoTimestamp(vm.parseJsonString(json, ".314.metadata.deployed_at"));
assertEq(vm.parseJsonString(json, ".314.metadata.fwss_version"), "1.4.0");
string memory original = vm.readFile("deployments.json");
string memory original = vm.readFile(SEED);
assertEq(
vm.parseJsonString(json, ".314.FWSS_PROXY_ADDRESS"), vm.parseJsonString(original, ".314.FWSS_PROXY_ADDRESS")
);
Expand Down Expand Up @@ -236,15 +238,15 @@ contract FWSSDispatcherTransitionScriptsTest is Test, JosukeFacetSet {
deploy.run();

// The commit is checked before anything is written.
assertEq(vm.readFile(DEPLOYMENTS), vm.readFile("deployments.json"));
assertEq(vm.readFile(DEPLOYMENTS), vm.readFile(SEED));
}

function _deployDryRunRecordsNothing() internal {
// A dry run needs no commit, since it records nothing.
vm.setEnv("GIT_COMMIT", "");
new DryRunDeploy().run();

assertEq(vm.readFile(DEPLOYMENTS), vm.readFile("deployments.json"));
assertEq(vm.readFile(DEPLOYMENTS), vm.readFile(SEED));
}

function _deployRefusesBroadcastWithoutWallet() internal {
Expand All @@ -259,7 +261,7 @@ contract FWSSDispatcherTransitionScriptsTest is Test, JosukeFacetSet {
dispatcherDeploy.run();

assertEq(vm.getNonce(DEFAULT_SENDER), nonce);
assertEq(vm.readFile(DEPLOYMENTS), vm.readFile("deployments.json"));
assertEq(vm.readFile(DEPLOYMENTS), vm.readFile(SEED));
}

function _executeChecks() internal {
Expand Down Expand Up @@ -424,7 +426,7 @@ contract FWSSDispatcherTransitionScriptsTest is Test, JosukeFacetSet {
deploy.run();

assertEq(vm.getNonce(DEFAULT_SENDER), nonce);
assertEq(vm.readFile(DEPLOYMENTS), vm.readFile("deployments.json"));
assertEq(vm.readFile(DEPLOYMENTS), vm.readFile(SEED));
}

function _deployHonoursPinned() internal {
Expand Down Expand Up @@ -589,7 +591,7 @@ contract FWSSDispatcherTransitionScriptsTest is Test, JosukeFacetSet {
function _dispatcherDeployRecordsDispatcher() internal {
_writeLedger(proxy, address(0));
vm.setEnv("GIT_COMMIT", "");
string memory original = vm.readFile("deployments.json");
string memory original = vm.readFile(SEED);
_dispatcherDeploy().run();

string memory json = vm.readFile(DEPLOYMENTS);
Expand Down Expand Up @@ -667,7 +669,7 @@ contract FWSSDispatcherTransitionScriptsTest is Test, JosukeFacetSet {
vm.revertToState(clean);

vm.createDir(SCRATCH, true);
vm.copyFile("deployments.json", DEPLOYMENTS);
vm.copyFile(SEED, DEPLOYMENTS);
_writeLedger(proxy, migration);

vm.setEnv("DEPLOYMENTS_JSON_PATH", DEPLOYMENTS);
Expand Down
18 changes: 13 additions & 5 deletions service_contracts/test/FWSSJosukeLedger.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,8 @@ contract FWSSJosukeLedgerTest is Test, JosukeFacetSet {
}

function testLedgerAddresses() public view {
address mainnetAddress = _proxyAddress(MAINNET_INDEX);
address calibnetAddress = _proxyAddress(CALIBNET_INDEX);
// TODO: read these from deployments.json
assertEq(mainnetAddress, 0x8408502033C418E1bbC97cE9ac48E5528F371A9f);
assertEq(calibnetAddress, 0x02925630df557F957f70E112bA06e50965417CA0);
_assertLedgerAddress(MAINNET_INDEX, "314");
_assertLedgerAddress(CALIBNET_INDEX, "314159");
}

function testFacetsProvideDispatcherTransitionRoutes() public view {
Expand All @@ -38,6 +35,17 @@ contract FWSSJosukeLedgerTest is Test, JosukeFacetSet {
assertEq(_owners(facets, IERC8167.selectors.selector), 0);
}

/// @dev From the dispatcher deploy until the transition executes, the ledger lists the proxy under the dispatcher.
function _assertLedgerAddress(uint256 index, string memory chain) private view {
string memory deployments = vm.readFile("deployments.json");
address listed = _proxyAddress(index);
if (listed == vm.parseJsonAddress(deployments, string.concat(".", chain, ".FWSS_PROXY_ADDRESS"))) return;

string memory dispatcherKey = string.concat(".", chain, ".FWSS_DISPATCHER_ADDRESS");
assertTrue(vm.keyExistsJson(deployments, dispatcherKey), "ledger lists neither the proxy nor the dispatcher");
assertEq(listed, vm.parseJsonAddress(deployments, dispatcherKey));
}

function _owners(Facet[] memory facets, bytes4 selector) private pure returns (uint256 owners) {
for (uint256 i; i < facets.length; ++i) {
for (uint256 j; j < facets[i].selectors.length; ++j) {
Expand Down
268 changes: 268 additions & 0 deletions service_contracts/test/fixtures/deployments-v1.4.0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,268 @@
{
"314": {
"metadata": {
"commit": "4cbbea4a4f7da51ad674a1d9d122c6e677acfbec",
"deployed_at": "2026-08-21T16:29:02Z",
"fwss_version": "1.4.0",
"pdp_version": "3.5.0"
},
"FILECOIN_PAY_ADDRESS": "0x23b1e018F08BB982348b15a86ee926eEBf7F4DAa",
"PDP_VERIFIER_PROXY_ADDRESS": "0xBADd0B92C1c71d02E7d520f64c0876538fa2557F",
"PDP_VERIFIER_IMPLEMENTATION_ADDRESS": "0x04D4CdB99E34D7e9a366E7eba7A835e034bc41b1",
"SESSION_KEY_REGISTRY_ADDRESS": "0x74FD50525A958aF5d484601E252271f9625231aB",
"SERVICE_PROVIDER_REGISTRY_PROXY_ADDRESS": "0xf55dDbf63F1b55c3F1D4FA7e339a68AB7b64A5eB",
"SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION_ADDRESS": "0x1Bb676392272313598930FEf8D5B66FFECcE02F0",
"SIGNATURE_VERIFICATION_LIB_ADDRESS": "0x63904443e46cc9F3db35CB4Fe16c76E7ffCA453e",
"RAILS_LIB_ADDRESS": "0x54aC29E68B3C7C5F7F315CeF1a85ECA848B88a9b",
"FWSS_PROXY_ADDRESS": "0x8408502033C418E1bbC97cE9ac48E5528F371A9f",
"FWSS_IMPLEMENTATION_ADDRESS": "0xa874C7333c8e1689C33155AD7bEE980926086e21",
"FWSS_VIEW_ADDRESS": "0xcf184Ab1FD8D1a563054d30Aa1fFb08136998172",
"ENDORSEMENT_SET_ADDRESS": "0x59eFa2e8324E1551d46010d7B0B140eE2F5c726b",
"contracts": {
"SIGNATURE_VERIFICATION_LIB": {
"initcode_hash": "0xddcbe59b3ccf54d3f47c15dd4dda953aaf43d8b004811693aad2f1b3aaedffdc",
"artifact_contract": "src/lib/SignatureVerificationLib.sol:SignatureVerificationLib",
"libraries": {},
"constructor_args": [],
"pinned": true
},
"RAILS_LIB": {
"initcode_hash": "0x67d94fb169bf3563a279a006eb936594c4bef7db610512fb05db306ecbc2b0f4",
"artifact_contract": "src/lib/Rails.sol:Rails",
"libraries": {},
"constructor_args": [],
"pinned": true
},
"FWSS_IMPLEMENTATION": {
"initcode_hash": "0x0e6588ee8d338abe2d311709c7ebf75953d54e4f8cbb209d14692fbbe445fb92",
"artifact_contract": "src/FilecoinWarmStorageService.sol:FilecoinWarmStorageService",
"libraries": {
"src/lib/SignatureVerificationLib.sol:SignatureVerificationLib": "0x63904443e46cc9F3db35CB4Fe16c76E7ffCA453e",
"src/lib/Rails.sol:Rails": "0x54aC29E68B3C7C5F7F315CeF1a85ECA848B88a9b"
},
"constructor_args": [
"0xBADd0B92C1c71d02E7d520f64c0876538fa2557F",
"0x23b1e018F08BB982348b15a86ee926eEBf7F4DAa",
"0x80B98d3aa09ffff255c3ba4A241111Ff1262F045",
"0x1D60d2F5960Af6341e842C539985FA297E10d6eA",
"0xf55dDbf63F1b55c3F1D4FA7e339a68AB7b64A5eB",
"0x74FD50525A958aF5d484601E252271f9625231aB",
"6"
],
"pinned": true
},
"SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION": {
"initcode_hash": "0xd0999d49e64712aa62f6139d4d98c4f1fab903734a713308bab3ef1a6397f542",
"artifact_contract": "src/ServiceProviderRegistry.sol:ServiceProviderRegistry",
"libraries": {},
"constructor_args": [
"3"
],
"pinned": true
},
"FWSS_PROXY": {
"initcode_hash": "0x3e2779ec9d23761f6466083f8c4f938dc2479a0d48037c1803b7b3592c58bd11",
"artifact_contract": "ERC1967Proxy.sol:ERC1967Proxy",
"libraries": {},
"constructor_args": [
"0xaF996097790c17D3C23Cc45A3035a29D293d1492",
"0x"
],
"pinned": true
},
"SERVICE_PROVIDER_REGISTRY_PROXY": {
"initcode_hash": "0x3e2779ec9d23761f6466083f8c4f938dc2479a0d48037c1803b7b3592c58bd11",
"artifact_contract": "ERC1967Proxy.sol:ERC1967Proxy",
"libraries": {},
"constructor_args": [
"0x01293CaFdE24DE89fF26d1A19Bfc4E36CBF74F9B",
"0x"
],
"pinned": true
},
"PDP_VERIFIER_PROXY": {
"initcode_hash": "0x3e2779ec9d23761f6466083f8c4f938dc2479a0d48037c1803b7b3592c58bd11",
"artifact_contract": "ERC1967/ERC1967Proxy.sol:ERC1967Proxy",
"libraries": {},
"constructor_args": [
"0xb41A97FEDD2D9497C639A643ec75E56CbCeDe8BA",
"0x"
],
"pinned": true
},
"FILECOIN_PAY": {
"initcode_hash": "0x7b6cdd8afb8e163aa5b38a930e337d43b1edd2c8e2475f9519cbaf7760af4352",
"artifact_contract": "lib/fws-payments/src/FilecoinPayV1.sol:FilecoinPayV1",
"libraries": {},
"constructor_args": [],
"pinned": true
},
"SESSION_KEY_REGISTRY": {
"initcode_hash": "0x1ff3aaa830f4d7b24a89b622a740a03f0e5772a9725cb2272d57e6d07bf8df3b",
"artifact_contract": "lib/session-key-registry/src/SessionKeyRegistry.sol:SessionKeyRegistry",
"libraries": {},
"constructor_args": [],
"pinned": true
},
"ENDORSEMENT_SET": {
"initcode_hash": "0x8c1e23722c664799417d2921502bd912e21417837519278a52b89d7e6275e5d6",
"artifact_contract": "src/ProviderIdSet.sol:ProviderIdSet",
"libraries": {},
"constructor_args": [],
"pinned": true
},
"FWSS_VIEW": {
"initcode_hash": "0x3daadee16ed5f238f76fd90c913a10c9bb6db2aa6d99e5c02ee29b727b31222c",
"artifact_contract": "src/FilecoinWarmStorageServiceStateView.sol:FilecoinWarmStorageServiceStateView",
"libraries": {},
"constructor_args": [
"0x8408502033C418E1bbC97cE9ac48E5528F371A9f"
],
"pinned": true
},
"PDP_VERIFIER_IMPLEMENTATION": {
"initcode_hash": "0x43f5be1a5e546cfd7200624a02c53fdf46caa8150f16b0663a2e8c67d68e3dfe",
"artifact_contract": "lib/pdp/src/PDPVerifier.sol:PDPVerifier",
"libraries": {},
"constructor_args": [
"4",
"150"
],
"pinned": true
}
}
},
"314159": {
"metadata": {
"commit": "4cbbea4a4f7da51ad674a1d9d122c6e677acfbec",
"deployed_at": "2026-08-21T16:29:31Z",
"fwss_version": "1.4.0",
"pdp_version": "3.5.0"
},
"FILECOIN_PAY_ADDRESS": "0x09a0fDc2723fAd1A7b8e3e00eE5DF73841df55a0",
"PDP_VERIFIER_PROXY_ADDRESS": "0x85e366Cf9DD2c0aE37E963d9556F5f4718d6417C",
"PDP_VERIFIER_IMPLEMENTATION_ADDRESS": "0x04D4CdB99E34D7e9a366E7eba7A835e034bc41b1",
"SESSION_KEY_REGISTRY_ADDRESS": "0x518411c2062E119Aaf7A8B12A2eDf9a939347655",
"SERVICE_PROVIDER_REGISTRY_PROXY_ADDRESS": "0x839e5c9988e4e9977d40708d0094103c0839Ac9D",
"SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION_ADDRESS": "0x0dF90c9a20b3f1E383c7196C06943565396c0956",
"SIGNATURE_VERIFICATION_LIB_ADDRESS": "0xa3c88DD6510f88747742482f0963Bb5aE670b022",
"RAILS_LIB_ADDRESS": "0xee2407847A4ccDdBB7eA6F188F19e998F0c92C2a",
"FWSS_PROXY_ADDRESS": "0x02925630df557F957f70E112bA06e50965417CA0",
"FWSS_IMPLEMENTATION_ADDRESS": "0xF5436B44354735588B20CA18F7D3e95a14FAcA10",
"FWSS_VIEW_ADDRESS": "0x1B68d64f01bAa42014B9774605867BF4eDC0320f",
"ENDORSEMENT_SET_ADDRESS": "0xAA2f7CfC7ecAc616EC9C1f6d700fAd19087FAC84",
"contracts": {
"FILECOIN_PAY": {
"initcode_hash": "0x7b6cdd8afb8e163aa5b38a930e337d43b1edd2c8e2475f9519cbaf7760af4352",
"artifact_contract": "lib/fws-payments/src/FilecoinPayV1.sol:FilecoinPayV1",
"libraries": {},
"constructor_args": [],
"pinned": true
},
"SIGNATURE_VERIFICATION_LIB": {
"initcode_hash": "0xddcbe59b3ccf54d3f47c15dd4dda953aaf43d8b004811693aad2f1b3aaedffdc",
"artifact_contract": "src/lib/SignatureVerificationLib.sol:SignatureVerificationLib",
"libraries": {},
"constructor_args": [],
"pinned": true
},
"SESSION_KEY_REGISTRY": {
"initcode_hash": "0xe86bf04ac10383355fc49667813f42688ed68a92e1d3414773cf34b2a1fd471f",
"artifact_contract": "lib/session-key-registry/src/SessionKeyRegistry.sol:SessionKeyRegistry",
"libraries": {},
"constructor_args": [],
"pinned": true
},
"ENDORSEMENT_SET": {
"initcode_hash": "0x627e10a18cb5c30fdf02ef8886f04b3453b730d89114f28d4aeffd5663bc9d5d",
"artifact_contract": "src/ProviderIdSet.sol:ProviderIdSet",
"libraries": {},
"constructor_args": [],
"pinned": true
},
"RAILS_LIB": {
"initcode_hash": "0x67d94fb169bf3563a279a006eb936594c4bef7db610512fb05db306ecbc2b0f4",
"artifact_contract": "src/lib/Rails.sol:Rails",
"libraries": {},
"constructor_args": [],
"pinned": true
},
"FWSS_VIEW": {
"initcode_hash": "0x3daadee16ed5f238f76fd90c913a10c9bb6db2aa6d99e5c02ee29b727b31222c",
"artifact_contract": "src/FilecoinWarmStorageServiceStateView.sol:FilecoinWarmStorageServiceStateView",
"libraries": {},
"constructor_args": [
"0x02925630df557F957f70E112bA06e50965417CA0"
],
"pinned": true
},
"FWSS_IMPLEMENTATION": {
"initcode_hash": "0x29ced5d5f582d5bac14ab7d090614adf1c0b67ead58f2aae585c73ffcff0846b",
"artifact_contract": "src/FilecoinWarmStorageService.sol:FilecoinWarmStorageService",
"libraries": {
"src/lib/SignatureVerificationLib.sol:SignatureVerificationLib": "0xa3c88DD6510f88747742482f0963Bb5aE670b022",
"src/lib/Rails.sol:Rails": "0xee2407847A4ccDdBB7eA6F188F19e998F0c92C2a"
},
"constructor_args": [
"0x85e366Cf9DD2c0aE37E963d9556F5f4718d6417C",
"0x09a0fDc2723fAd1A7b8e3e00eE5DF73841df55a0",
"0xb3042734b608a1B16e9e86B374A3f3e389B4cDf0",
"0x1D60d2F5960Af6341e842C539985FA297E10d6eA",
"0x839e5c9988e4e9977d40708d0094103c0839Ac9D",
"0x518411c2062E119Aaf7A8B12A2eDf9a939347655",
"10"
],
"pinned": true
},
"PDP_VERIFIER_IMPLEMENTATION": {
"initcode_hash": "0x2ae11470a908b1d8a1a90573d98918e83668b8d350c1d3e2f6bfd6599cfae697",
"artifact_contract": "lib/pdp/src/PDPVerifier.sol:PDPVerifier",
"libraries": {},
"constructor_args": [
"4",
"10"
],
"pinned": true
},
"SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION": {
"initcode_hash": "0xd0999d49e64712aa62f6139d4d98c4f1fab903734a713308bab3ef1a6397f542",
"artifact_contract": "src/ServiceProviderRegistry.sol:ServiceProviderRegistry",
"libraries": {},
"constructor_args": [
"3"
],
"pinned": true
},
"PDP_VERIFIER_PROXY": {
"initcode_hash": "0x460ab109982867b4e11bd02e84d83dfaef4aad379625b07382854b7199beab09",
"artifact_contract": "ERC1967Proxy.sol:MyERC1967Proxy",
"libraries": {},
"constructor_args": [
"0x2355Cb19BA1eFF51673562E1a5fc5eE292AF9D42",
"0x"
],
"pinned": true
},
"SERVICE_PROVIDER_REGISTRY_PROXY": {
"initcode_hash": "0x57cef7b58a4c5e3031590bb81e94f19c519bba5a3f2a5f26d58b76285a3a0868",
"artifact_contract": "ERC1967Proxy.sol:ERC1967Proxy",
"libraries": {},
"constructor_args": [
"0xb32Bb530638d20f1B59B40CDD2Ce4208430f7DE3",
"0x"
],
"pinned": true
},
"FWSS_PROXY": {
"initcode_hash": "0x57cef7b58a4c5e3031590bb81e94f19c519bba5a3f2a5f26d58b76285a3a0868",
"artifact_contract": "ERC1967Proxy.sol:ERC1967Proxy",
"libraries": {},
"constructor_args": [
"0x4BCc752555Bf08A5Bd9a4Ce467a12607277450bA",
"0x"
],
"pinned": true
}
}
}
}
Loading
Loading