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
3 changes: 2 additions & 1 deletion src/lib/LibProdTokenConfig.sol
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ library LibProdTokenConfig {
/// @notice The 28 production token deploy configs, Base table order.
/// @return configs The name/symbol table.
function productionTokenConfigs() internal pure returns (TokenConfig[] memory configs) {
configs = new TokenConfig[](28);
configs = new TokenConfig[](29);
configs[0] = TokenConfig("MSTR", "MicroStrategy Incorporated ST0x", "tMSTR");
configs[1] = TokenConfig("TSLA", "Tesla Inc ST0x", "tTSLA");
configs[2] = TokenConfig("COIN", "Coinbase Global Inc ST0x", "tCOIN");
Expand Down Expand Up @@ -75,5 +75,6 @@ library LibProdTokenConfig {
configs[25] = TokenConfig("AMAT", "Applied Materials, Inc. ST0x", "tAMAT");
configs[26] = TokenConfig("LRCX", "Lam Research Corporation ST0x", "tLRCX");
configs[27] = TokenConfig("TTWO", "Take-Two Interactive Software, Inc. ST0x", "tTTWO");
configs[28] = TokenConfig("RKLB", "Rocket Lab USA Inc ST0x", "tRKLB");
}
}
237 changes: 199 additions & 38 deletions src/lib/LibTokenInvariants.sol
Original file line number Diff line number Diff line change
Expand Up @@ -285,14 +285,22 @@ library LibTokenInvariants {
/// https://basescan.org/address/0x045Fb493D970f94a54FeaF931033622fC82192e6
address internal constant TTWO_WRAPPED_TOKEN_VAULT = address(0x045Fb493D970f94a54FeaF931033622fC82192e6);

/// @notice Returns the 28 production token instance triples on Base, in
// ---- tRKLB / wtRKLB — Rocket Lab USA Inc ST0x ----
/// https://basescan.org/address/0x34Bf3d8DFaa92e554FBCf48135E5d814210DA1dd
address internal constant RKLB_RECEIPT = address(0x34Bf3d8DFaa92e554FBCf48135E5d814210DA1dd);
/// https://basescan.org/address/0xf6744Fd94e27c2f58F6110aa9fDC77A87e41766B
address internal constant RKLB_RECEIPT_VAULT = address(0xf6744Fd94e27c2f58F6110aa9fDC77A87e41766B);
/// https://basescan.org/address/0xF4f8c66085910d583c01f3b4e44Bf731D4e2c565
address internal constant RKLB_WRAPPED_TOKEN_VAULT = address(0xF4f8c66085910d583c01f3b4e44Bf731D4e2c565);

/// @notice Returns the 29 production token instance triples on Base, in
/// the order they were deployed. This is the structured source of truth
/// the flat `productionReceiptVaults()` accessor derives from; consumers
/// that need the receipt / wrapped-vault legs or the underlying join key
/// (cross-chain parity, per-token config checks) iterate this instead.
/// @return tokens The 28 production token instances on Base.
function productionTokensBase() internal pure returns (TokenInstance[] memory tokens) {
tokens = new TokenInstance[](28);
tokens = new TokenInstance[](29);
tokens[0] = TokenInstance("MSTR", MSTR_RECEIPT, MSTR_RECEIPT_VAULT, MSTR_WRAPPED_TOKEN_VAULT);
tokens[1] = TokenInstance("TSLA", TSLA_RECEIPT, TSLA_RECEIPT_VAULT, TSLA_WRAPPED_TOKEN_VAULT);
tokens[2] = TokenInstance("COIN", COIN_RECEIPT, COIN_RECEIPT_VAULT, COIN_WRAPPED_TOKEN_VAULT);
Expand Down Expand Up @@ -321,6 +329,7 @@ library LibTokenInvariants {
tokens[25] = TokenInstance("AMAT", AMAT_RECEIPT, AMAT_RECEIPT_VAULT, AMAT_WRAPPED_TOKEN_VAULT);
tokens[26] = TokenInstance("LRCX", LRCX_RECEIPT, LRCX_RECEIPT_VAULT, LRCX_WRAPPED_TOKEN_VAULT);
tokens[27] = TokenInstance("TTWO", TTWO_RECEIPT, TTWO_RECEIPT_VAULT, TTWO_WRAPPED_TOKEN_VAULT);
tokens[28] = TokenInstance("RKLB", RKLB_RECEIPT, RKLB_RECEIPT_VAULT, RKLB_WRAPPED_TOKEN_VAULT);
}

/// @notice Returns the production token instance triples on Ethereum
Expand All @@ -335,42 +344,194 @@ library LibTokenInvariants {
/// parity suite rejects rather than half-checks.
/// @return tokens The 28 production token instances on Ethereum.
function productionTokensEthereum() internal pure returns (TokenInstance[] memory tokens) {
// PLACEHOLDER TABLE. Every address is `address(0)` until the 28 tokens
// are deployed on Ethereum and their addresses pinned here (the token
// pin PR — a per-row literal swap). Laid out as explicit rows mirroring
// `productionTokensBase()` so the two tables are formatted consistently
// across chains and the pin diff is a clean per-token change. Order and
// underlyings MUST match Base row-for-row (the cross-chain parity pin
// asserts this).
tokens = new TokenInstance[](28);
tokens[0] = TokenInstance("MSTR", address(0), address(0), address(0));
tokens[1] = TokenInstance("TSLA", address(0), address(0), address(0));
tokens[2] = TokenInstance("COIN", address(0), address(0), address(0));
tokens[3] = TokenInstance("SPYM", address(0), address(0), address(0));
tokens[4] = TokenInstance("SIVR", address(0), address(0), address(0));
tokens[5] = TokenInstance("CRCL", address(0), address(0), address(0));
tokens[6] = TokenInstance("NVDA", address(0), address(0), address(0));
tokens[7] = TokenInstance("IAU", address(0), address(0), address(0));
tokens[8] = TokenInstance("PPLT", address(0), address(0), address(0));
tokens[9] = TokenInstance("AMZN", address(0), address(0), address(0));
tokens[10] = TokenInstance("BMNR", address(0), address(0), address(0));
tokens[11] = TokenInstance("IBHG", address(0), address(0), address(0));
tokens[12] = TokenInstance("SGOV", address(0), address(0), address(0));
tokens[13] = TokenInstance("QQQM", address(0), address(0), address(0));
tokens[14] = TokenInstance("VWO", address(0), address(0), address(0));
tokens[15] = TokenInstance("ARKK", address(0), address(0), address(0));
tokens[16] = TokenInstance("SPCX", address(0), address(0), address(0));
tokens[17] = TokenInstance("CEG", address(0), address(0), address(0));
tokens[18] = TokenInstance("DRAM", address(0), address(0), address(0));
tokens[19] = TokenInstance("TSM", address(0), address(0), address(0));
tokens[20] = TokenInstance("SKHY", address(0), address(0), address(0));
tokens[21] = TokenInstance("ASML", address(0), address(0), address(0));
tokens[22] = TokenInstance("MU", address(0), address(0), address(0));
tokens[23] = TokenInstance("AMD", address(0), address(0), address(0));
tokens[24] = TokenInstance("AVGO", address(0), address(0), address(0));
tokens[25] = TokenInstance("AMAT", address(0), address(0), address(0));
tokens[26] = TokenInstance("LRCX", address(0), address(0), address(0));
tokens[27] = TokenInstance("TTWO", address(0), address(0), address(0));
// Deployed on Ethereum mainnet 2026-07-22 by
// `20260706-deploy-tokens-ethereum` (manual-broadcast run
// 29921218929): 28 tokens via the 0.1.1 unified deployer, each wired
// onto the Ethereum V4 authoriser and handed to the Ethereum
// token-owner Safe in the same broadcast. Addresses pinned from the
// run's logged (underlying, receipt, receiptVault, wrapped) tuples.
// Order and underlyings match Base row-for-row (the cross-chain
// parity pin asserts this).
tokens = new TokenInstance[](29);
tokens[0] = TokenInstance(
"MSTR",
address(0xE3772C8695c2cf3dcAA2Dd29759f4Bb91a342763),
address(0x8500189061e2206Bc33Bf04DC10fFB1Fe7dED637),
address(0xd9fE7488B86D3aEaf457b181C744BD1A5a120833)
);
tokens[1] = TokenInstance(
"TSLA",
address(0x3a3E00d6fb65E686941f77DD375ca677Ad7772c2),
address(0xB41fD00d0bA60D9Ae8dCE405cB6AAd5710E5F84d),
address(0x550499e28A3CE8cb1dB3e3Db23fDD0357eD3ff48)
);
tokens[2] = TokenInstance(
"COIN",
address(0x5cF43A3fFd5B979C36B6512800cdAa6A2EF4f352),
address(0x5100ED387Ab3ED37667199aD8f9F6D963157d28e),
address(0xa3d1be1Ab9F4E72309Cb9Bfeaa14aFe46D012e36)
);
tokens[3] = TokenInstance(
"SPYM",
address(0xB023d277f4a50cE056Dd921C28fF7e27F56B3445),
address(0x484AaA9e6542774026b24aeD4EC3058400eD2439),
address(0x7dF3ad1ECC10DBF0296D05F91a697e4A059771c2)
);
tokens[4] = TokenInstance(
"SIVR",
address(0x89dC2d5B33e8DcbD24A2e4A07f7B06f55b5bb24e),
address(0xc6100518997004eFb0701Da3c56000B3d093470a),
address(0x2B310218001C38cf82816c2098AedDCE22D3Df27)
);
tokens[5] = TokenInstance(
"CRCL",
address(0xDf228279B380e8445970a3B4162B9509D4339520),
address(0xeF63EdB9F39Dcd03C103A11e2e7E1878308b9586),
address(0x25Ab6926BA171e1618b214cda774104B2f6ec884)
);
tokens[6] = TokenInstance(
"NVDA",
address(0xA26C89357e6cb53Bf670db2e0e939f5489Ba26A8),
address(0xf6A89b0c9FF897000E37bBD06397992278FfC50d),
address(0xa3947d2A74F5a3A7135A9d0c66B28fC7315f30Da)
);
tokens[7] = TokenInstance(
"IAU",
address(0x9003CAc529d1299891C2aaa08b4c810b81F49488),
address(0xb9A1D1822F57f52959b8c5097A8322D534bceDEe),
address(0x33f3a6401ce08f705eE4B8a03fc37F298395b720)
);
tokens[8] = TokenInstance(
"PPLT",
address(0x216cbEeC16cF7e4dBd53e6e3D8B54b7dA23BE146),
address(0x47C2e6644eFDF58E86dA45dC60e0f67A65043B99),
address(0xCbD06C802BFe993de94d0d635AB5B1fa764519D8)
);
tokens[9] = TokenInstance(
"AMZN",
address(0xA583addaA69142E8588D9ffE3767Dbb0F23fd516),
address(0x6615f3D82989949fa7d167b40FEc0Ef30cdbA476),
address(0x4404E24629a33b85FC1E2D7beA673Cd283054594)
);
tokens[10] = TokenInstance(
"BMNR",
address(0x34BF824C28121EbD421026D70a03A7Ec9Ee5a0d4),
address(0x00472aA0D0611F933c22b8148F02B0cDd1Ae5fbc),
address(0x35e1D3d3Fa6D43438641d2b8f63cBf84C84435c0)
);
tokens[11] = TokenInstance(
"IBHG",
address(0x8e05CB17994Ee9B207e87993717F6Fb2ee7D0bD3),
address(0x36b30F5B5D1AcD3D8135Afe7a5516A300021f139),
address(0x03bBb4148ba82d63993D32fB8E6Eff8Cc51A56f2)
);
tokens[12] = TokenInstance(
"SGOV",
address(0xE4B5Af0bAc3dC97b77d6eE4E95F59c74c679ee5c),
address(0x344147366F648640076d363FAF659c214788E99d),
address(0x06b17E431a957Dd8522Bf106653BAc6B39F437E6)
);
tokens[13] = TokenInstance(
"QQQM",
address(0x1Eb9583d1BB2b00B3CB5ead921d021b445F77dBc),
address(0x5Aa65dfF455C7f18C21370086EaFaEe4f2b63608),
address(0x63fDfe9cf53cB1FD5d98fE7537B881B86aE04A31)
);
tokens[14] = TokenInstance(
"VWO",
address(0x1A09A154E2ae3890d1e18507a37bC3e2FCfA10cc),
address(0x2cc8DCfC649f9633C482C81473cC251226375fE3),
address(0x01EE8b582147D1Aa8A8f2Adc2EBB91fA60082AB0)
);
tokens[15] = TokenInstance(
"ARKK",
address(0xF1E5f11e7fAA40b2C2CEdfAD825D81207f793862),
address(0xDf406836D5A092894ee5d5bdC7F58e5bdc8D196A),
address(0x5D80cAcaABCe0ab4C1541493ceB25D97970D250a)
);
tokens[16] = TokenInstance(
"SPCX",
address(0x46dC08972b1d5D5876d244292c551dbbbC7d7e80),
address(0x659Ea9dd1C833fc76E5328E0E616d8b9D9836dc3),
address(0xC32C8166164E2cA18BB5fbf3E82CB776943d97FB)
);
tokens[17] = TokenInstance(
"CEG",
address(0x99Ffbf38E7c0D9C440BA629D0108E7d0E96cB710),
address(0x6240E93f1A08d43002e52b210cD49c54C813D780),
address(0xc842fC56Dd39B62357d027a0F3B3266353cac991)
);
tokens[18] = TokenInstance(
"DRAM",
address(0xbD4Fa8Fd2643b46eADC499b5A468108817988830),
address(0x5F5a1Bdc00ade7702ea5944B1374DC598dA3759f),
address(0x7e1263f1e1EeF7eCe7fA7e568842f213a6CEa956)
);
tokens[19] = TokenInstance(
"TSM",
address(0x2Ce6A6B9E573ec0444C00103ACEee9dC23223621),
address(0x7Ac659f601bEa2d9f490E0D0D8a68c4282fD9B21),
address(0x050dB961D36DC2047c779798694AeE455CD40BE6)
);
tokens[20] = TokenInstance(
"SKHY",
address(0xd3150728FFDb338eFd9b07ae90A7D5e688bc3B20),
address(0xa3a7BEcF428b250Ec1b88Dbc65F579a9570670c7),
address(0xD13bBc46C4582246656868d32227A99A538D97E1)
);
tokens[21] = TokenInstance(
"ASML",
address(0x6AEBd84df448d2E25080590797075b399Ca43549),
address(0x77Ee94C8B85cF48a426F84B0F2d796eC77e41c7b),
address(0xb8605a64B57E7A8631c87F3187c783493231bdD9)
);
tokens[22] = TokenInstance(
"MU",
address(0x98A3887f51AA93079978D265Cb20E215AfEB8b0f),
address(0x2C845ed32c5fDE012eb14508d0d24BD3300B1D71),
address(0xF01523C4ca52dF88f07938D4Fb32FCBb6b159867)
);
tokens[23] = TokenInstance(
"AMD",
address(0x0e257A952817ef779407aA27E5CD5F27863883Aa),
address(0xe2De878d8Ca6bA544BFE80a10fAb0395DF32Cff0),
address(0xb904955bC71FE6c8e6aBE676ACca640Abc771622)
);
tokens[24] = TokenInstance(
"AVGO",
address(0x607991FE92F9476eBedA4761295E5E2cc37e2834),
address(0x503a69b2918DFA152eb0e0803174ed90ba5be756),
address(0xCee4981Fc273C105e2b9eA1fD19031Aa9a6cf113)
);
tokens[25] = TokenInstance(
"AMAT",
address(0x8C8810F83a0F5a8C1A3D541411100DBFB68C5b0c),
address(0x26139195f7a82a52c62C4047F843C99c61Ed9a5E),
address(0x44DE27A07B33CD708A49fa79629fAC1df03C56d3)
);
tokens[26] = TokenInstance(
"LRCX",
address(0x2630CA3D952b265F88C189f3679FA985dF34A93D),
address(0xe68A46547CdBBB181587B32cCD1A505Bedf0a994),
address(0xD1c1D974837d3f79A92E14048993AD28a6228831)
);
tokens[27] = TokenInstance(
"TTWO",
address(0x47E3487B12272Bb1F933452F855CEb1C5e27204E),
address(0xb62E913f0cC881862527Fa7e41e1C98eEf09cedD),
address(0x1D6F0763e58FA6d472d470Eaaef0a4C08080d208)
);
// RKLB was accidentally omitted from the table when the 28-token
// Ethereum broadcast ran; the gap-filling
// `20260722-deploy-missing-tokens-ethereum` broadcast (EXECUTED
// 2026-07-22, manual-broadcast run 29924926246) deployed it and this
// row pins the logged tuple.
tokens[28] = TokenInstance(
"RKLB",
address(0xFf5b15a4f478F296893b0b244D9b118Be87bCda2),
address(0xED0c085d92C262FB46937CB0B3C9763Af7fCCf30),
address(0x8FC87Be766C0cB6f254F1FDc9351D4B85B560FB3)
);
}

/// @notice Returns the 28 production receipt vault addresses on Base, in
Expand Down
Loading