diff --git a/.openzeppelin/unknown-46630.json b/.openzeppelin/unknown-46630.json new file mode 100644 index 0000000..bd59519 --- /dev/null +++ b/.openzeppelin/unknown-46630.json @@ -0,0 +1,2558 @@ +{ + "manifestVersion": "3.2", + "proxies": [ + { + "address": "0x13476E520fE1e4B56d3D1659e6897908cDa1D135", + "txHash": "0x38977377b38c069a34c288e40ba66a7db5f9986454d81988c1d46f2765fb7c59", + "kind": "transparent" + }, + { + "address": "0x3b7B54Bfad32DAffdc554bfE22368DCb18C08c00", + "txHash": "0x6843b0ce9bb773709d4900575246e2c479c0b98348025c7bc35a26ec6f2bbf07", + "kind": "transparent" + }, + { + "address": "0x0445C9AA3b0474DeCc6A655D6590a24D1896Dd3B", + "txHash": "0x596a6ec24c88140f4a8f58914eaca1c2daaa0cd257a663bf4144163a6fad6c78", + "kind": "transparent" + }, + { + "address": "0x8eFcc3C1a78525907FEf665BaFa7fabd26EFbfD5", + "txHash": "0x6447c37056ab6d398d7b063361b31c5a0645c2f8b7251daa5d12158eea01eff8", + "kind": "transparent" + }, + { + "address": "0x40A1D83B08bCcC34EA4307b46858ab6cBB849A4b", + "txHash": "0x1b73e4d9310722f8ee32bc366bae0bcb352d7c848f618dba4d086c98ef74e67b", + "kind": "transparent" + }, + { + "address": "0x7E9ef5B01bDdc7702B017977fEc3afe8A4468d83", + "txHash": "0x2f813483918572a8250c6e7384d0e7f1957ffd5db7ee49f77846f8dad9a80cae", + "kind": "transparent" + }, + { + "address": "0x52AEb0c5762dA668aAb245559C7ca2981c2542C1", + "txHash": "0xcbecd57b6bc4364863a69283197feec804a40c37bc365e3456a21b650089d3c5", + "kind": "transparent" + }, + { + "address": "0x3685636792d83c46490705309A865872d925CaB9", + "txHash": "0xee4034f671cc5dfb05d64591d6a02903c07263ebaadc75a8e3e607ff452e72ad", + "kind": "transparent" + } + ], + "impls": { + "4404c04f459a91d19124ebe6b6ddae906577fc2e37f77bf4f411cd18a8a65cd8": { + "address": "0xC08ffCfCD03F069915d10671D325F35d86798323", + "txHash": "0x9092d0e123c01bfb0e905098bf3187058d86e46e009dc0567876c1394a800bb3", + "layout": { + "solcVersion": "0.8.26", + "storage": [ + { + "label": "coreTypes", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_uint8,t_string_storage)", + "contract": "CoreRegistry", + "src": "contracts/virtualPersona/CoreRegistry.sol:7" + }, + { + "label": "_nextCoreType", + "offset": 0, + "slot": "1", + "type": "t_uint8", + "contract": "CoreRegistry", + "src": "contracts/virtualPersona/CoreRegistry.sol:8" + }, + { + "label": "_validatorsMap", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_bool))", + "contract": "ValidatorRegistry", + "src": "contracts/virtualPersona/ValidatorRegistry.sol:8" + }, + { + "label": "_baseValidatorScore", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "ValidatorRegistry", + "src": "contracts/virtualPersona/ValidatorRegistry.sol:10" + }, + { + "label": "_validators", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_uint256,t_array(t_address)dyn_storage)", + "contract": "ValidatorRegistry", + "src": "contracts/virtualPersona/ValidatorRegistry.sol:12" + }, + { + "label": "_getScoreOf", + "offset": 0, + "slot": "5", + "type": "t_function_internal_view(t_uint256,t_address)returns(t_uint256)", + "contract": "ValidatorRegistry", + "src": "contracts/virtualPersona/ValidatorRegistry.sol:14" + }, + { + "label": "_getMaxScore", + "offset": 8, + "slot": "5", + "type": "t_function_internal_view(t_uint256)returns(t_uint256)", + "contract": "ValidatorRegistry", + "src": "contracts/virtualPersona/ValidatorRegistry.sol:15" + }, + { + "label": "_getPastScore", + "offset": 16, + "slot": "5", + "type": "t_function_internal_view(t_uint256,t_address,t_uint256)returns(t_uint256)", + "contract": "ValidatorRegistry", + "src": "contracts/virtualPersona/ValidatorRegistry.sol:16" + }, + { + "label": "_nextVirtualId", + "offset": 0, + "slot": "6", + "type": "t_uint256", + "contract": "AgentNftV2", + "src": "contracts/virtualPersona/AgentNftV2.sol:27" + }, + { + "label": "_stakingTokenToVirtualId", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_uint256)", + "contract": "AgentNftV2", + "src": "contracts/virtualPersona/AgentNftV2.sol:28" + }, + { + "label": "virtualInfos", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_uint256,t_struct(VirtualInfo)89113_storage)", + "contract": "AgentNftV2", + "src": "contracts/virtualPersona/AgentNftV2.sol:47" + }, + { + "label": "_contributionNft", + "offset": 0, + "slot": "9", + "type": "t_address", + "contract": "AgentNftV2", + "src": "contracts/virtualPersona/AgentNftV2.sol:49" + }, + { + "label": "_serviceNft", + "offset": 0, + "slot": "10", + "type": "t_address", + "contract": "AgentNftV2", + "src": "contracts/virtualPersona/AgentNftV2.sol:50" + }, + { + "label": "_blacklists", + "offset": 0, + "slot": "11", + "type": "t_mapping(t_uint256,t_bool)", + "contract": "AgentNftV2", + "src": "contracts/virtualPersona/AgentNftV2.sol:54" + }, + { + "label": "virtualLPs", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_uint256,t_struct(VirtualLP)89125_storage)", + "contract": "AgentNftV2", + "src": "contracts/virtualPersona/AgentNftV2.sol:55" + }, + { + "label": "_eloCalculator", + "offset": 0, + "slot": "13", + "type": "t_address", + "contract": "AgentNftV2", + "src": "contracts/virtualPersona/AgentNftV2.sol:56" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)460_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)470_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)460_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(ERC721Storage)2305_storage": { + "label": "struct ERC721Upgradeable.ERC721Storage", + "members": [ + { + "label": "_name", + "type": "t_string_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_symbol", + "type": "t_string_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "_owners", + "type": "t_mapping(t_uint256,t_address)", + "offset": 0, + "slot": "2" + }, + { + "label": "_balances", + "type": "t_mapping(t_address,t_uint256)", + "offset": 0, + "slot": "3" + }, + { + "label": "_tokenApprovals", + "type": "t_mapping(t_uint256,t_address)", + "offset": 0, + "slot": "4" + }, + { + "label": "_operatorApprovals", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(ERC721URIStorageStorage)2763_storage": { + "label": "struct ERC721URIStorageUpgradeable.ERC721URIStorageStorage", + "members": [ + { + "label": "_tokenURIs", + "type": "t_mapping(t_uint256,t_string_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)1948_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)460_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint8)dyn_storage": { + "label": "uint8[]", + "numberOfBytes": "32" + }, + "t_function_internal_view(t_uint256)returns(t_uint256)": { + "label": "function (uint256) view returns (uint256)", + "numberOfBytes": "8" + }, + "t_function_internal_view(t_uint256,t_address)returns(t_uint256)": { + "label": "function (uint256,address) view returns (uint256)", + "numberOfBytes": "8" + }, + "t_function_internal_view(t_uint256,t_address,t_uint256)returns(t_uint256)": { + "label": "function (uint256,address,uint256) view returns (uint256)", + "numberOfBytes": "8" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_array(t_address)dyn_storage)": { + "label": "mapping(uint256 => address[])", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_bool))": { + "label": "mapping(uint256 => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(VirtualInfo)89113_storage)": { + "label": "mapping(uint256 => struct IAgentNft.VirtualInfo)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(VirtualLP)89125_storage)": { + "label": "mapping(uint256 => struct IAgentNft.VirtualLP)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint8,t_string_storage)": { + "label": "mapping(uint8 => string)", + "numberOfBytes": "32" + }, + "t_struct(VirtualInfo)89113_storage": { + "label": "struct IAgentNft.VirtualInfo", + "members": [ + { + "label": "dao", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "token", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "founder", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "tba", + "type": "t_address", + "offset": 0, + "slot": "3" + }, + { + "label": "coreTypes", + "type": "t_array(t_uint8)dyn_storage", + "offset": 0, + "slot": "4" + } + ], + "numberOfBytes": "160" + }, + "t_struct(VirtualLP)89125_storage": { + "label": "struct IAgentNft.VirtualLP", + "members": [ + { + "label": "pool", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "veToken", + "type": "t_address", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)460_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.ERC721URIStorage": [ + { + "contract": "ERC721URIStorageUpgradeable", + "label": "_tokenURIs", + "type": "t_mapping(t_uint256,t_string_storage)", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol:25", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.ERC721": [ + { + "contract": "ERC721Upgradeable", + "label": "_name", + "type": "t_string_storage", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:27", + "offset": 0, + "slot": "0" + }, + { + "contract": "ERC721Upgradeable", + "label": "_symbol", + "type": "t_string_storage", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:30", + "offset": 0, + "slot": "1" + }, + { + "contract": "ERC721Upgradeable", + "label": "_owners", + "type": "t_mapping(t_uint256,t_address)", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:32", + "offset": 0, + "slot": "2" + }, + { + "contract": "ERC721Upgradeable", + "label": "_balances", + "type": "t_mapping(t_address,t_uint256)", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:34", + "offset": 0, + "slot": "3" + }, + { + "contract": "ERC721Upgradeable", + "label": "_tokenApprovals", + "type": "t_mapping(t_uint256,t_address)", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:36", + "offset": 0, + "slot": "4" + }, + { + "contract": "ERC721Upgradeable", + "label": "_operatorApprovals", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:38", + "offset": 0, + "slot": "5" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "c390bd02a2bca55cb7a2c3d3977153326b96326dfa8c7044582c7058cd659571": { + "address": "0xF15514c682B7650b503fba47d842A90f113B59A0", + "txHash": "0x73b1ace2e1efd0b4d0ec471e41beda1047105e47347f62d8e8d7e0aae57a8b50", + "layout": { + "solcVersion": "0.8.26", + "storage": [ + { + "label": "assetToken", + "offset": 0, + "slot": "0", + "type": "t_address", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:53" + }, + { + "label": "taxToken", + "offset": 0, + "slot": "1", + "type": "t_address", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:54" + }, + { + "label": "router", + "offset": 0, + "slot": "2", + "type": "t_contract(IRouter)1485", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:55" + }, + { + "label": "treasury", + "offset": 0, + "slot": "3", + "type": "t_address", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:56" + }, + { + "label": "feeRate", + "offset": 20, + "slot": "3", + "type": "t_uint16", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:57" + }, + { + "label": "minSwapThreshold", + "offset": 0, + "slot": "4", + "type": "t_uint256", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:58" + }, + { + "label": "maxSwapThreshold", + "offset": 0, + "slot": "5", + "type": "t_uint256", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:59" + }, + { + "label": "tokenRecipients", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_address,t_struct(TaxRecipient)1536_storage)", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:61" + }, + { + "label": "tokenTaxAmounts", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_struct(TaxAmounts)1541_storage)", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:62" + }, + { + "label": "bondingV5", + "offset": 0, + "slot": "8", + "type": "t_contract(IBondingV5ForTaxV2)1522", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:64" + }, + { + "label": "partnerRecipients", + "offset": 0, + "slot": "9", + "type": "t_mapping(t_bytes32,t_address)", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:66" + }, + { + "label": "tokenPartnerConfigs", + "offset": 0, + "slot": "10", + "type": "t_mapping(t_address,t_struct(TokenPartnerConfig)1546_storage)", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:67" + }, + { + "label": "maxPartnerFeeRate", + "offset": 0, + "slot": "11", + "type": "t_uint16", + "contract": "AgentTaxV2", + "src": "contracts/tax/AgentTaxV2.sol:70" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)24_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)34_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)24_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)145_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)24_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_contract(IBondingV5ForTaxV2)1522": { + "label": "contract IBondingV5ForTaxV2", + "numberOfBytes": "20" + }, + "t_contract(IRouter)1485": { + "label": "contract IRouter", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_struct(TaxAmounts)1541_storage)": { + "label": "mapping(address => struct AgentTaxV2.TaxAmounts)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(TaxRecipient)1536_storage)": { + "label": "mapping(address => struct AgentTaxV2.TaxRecipient)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(TokenPartnerConfig)1546_storage)": { + "label": "mapping(address => struct AgentTaxV2.TokenPartnerConfig)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_address)": { + "label": "mapping(bytes32 => address)", + "numberOfBytes": "32" + }, + "t_struct(TaxAmounts)1541_storage": { + "label": "struct AgentTaxV2.TaxAmounts", + "members": [ + { + "label": "amountCollected", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "amountSwapped", + "type": "t_uint256", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(TaxRecipient)1536_storage": { + "label": "struct AgentTaxV2.TaxRecipient", + "members": [ + { + "label": "tba", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(TokenPartnerConfig)1546_storage": { + "label": "struct AgentTaxV2.TokenPartnerConfig", + "members": [ + { + "label": "partnerId", + "type": "t_bytes32", + "offset": 0, + "slot": "0" + }, + { + "label": "partnerFeeRate", + "type": "t_uint16", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)24_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "e2355dd3c8296597f82bb1827f5d0b769dee9b1476e134381a18877b06f17601": { + "address": "0x2a125a7cDFd73e0941Aad3DC96F008d32698D6A6", + "txHash": "0x0d3f55e6df6cf8d1d990551fc955bc853762e11099545ac2977e9fedc3d3045c", + "layout": { + "solcVersion": "0.8.26", + "storage": [ + { + "label": "_pair", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_mapping(t_address,t_address))", + "contract": "FFactoryV3", + "src": "contracts/launchpadv2/FFactoryV3.sol:26" + }, + { + "label": "pairs", + "offset": 0, + "slot": "1", + "type": "t_array(t_address)dyn_storage", + "contract": "FFactoryV3", + "src": "contracts/launchpadv2/FFactoryV3.sol:28" + }, + { + "label": "router", + "offset": 0, + "slot": "2", + "type": "t_address", + "contract": "FFactoryV3", + "src": "contracts/launchpadv2/FFactoryV3.sol:30" + }, + { + "label": "taxVault", + "offset": 0, + "slot": "3", + "type": "t_address", + "contract": "FFactoryV3", + "src": "contracts/launchpadv2/FFactoryV3.sol:32" + }, + { + "label": "buyTax", + "offset": 0, + "slot": "4", + "type": "t_uint256", + "contract": "FFactoryV3", + "src": "contracts/launchpadv2/FFactoryV3.sol:33" + }, + { + "label": "sellTax", + "offset": 0, + "slot": "5", + "type": "t_uint256", + "contract": "FFactoryV3", + "src": "contracts/launchpadv2/FFactoryV3.sol:34" + }, + { + "label": "antiSniperBuyTaxStartValue", + "offset": 0, + "slot": "6", + "type": "t_uint256", + "contract": "FFactoryV3", + "src": "contracts/launchpadv2/FFactoryV3.sol:35" + }, + { + "label": "antiSniperTaxVault", + "offset": 0, + "slot": "7", + "type": "t_address", + "contract": "FFactoryV3", + "src": "contracts/launchpadv2/FFactoryV3.sol:36" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)460_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)470_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)460_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)1948_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(ReentrancyGuardStorage)2967_storage": { + "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage", + "members": [ + { + "label": "_status", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)460_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_address)": { + "label": "mapping(address => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_address))": { + "label": "mapping(address => mapping(address => address))", + "numberOfBytes": "32" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.ReentrancyGuard": [ + { + "contract": "ReentrancyGuardUpgradeable", + "label": "_status", + "type": "t_uint256", + "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)460_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "b80e1834a2354ea32b7450ade1893f41ca815cd217757b8f4bbe1a61b9a984ee": { + "address": "0x28f03acC51a8F7e14e0dcd6fcf8d5B2e1AFff78f", + "txHash": "0x4d01b808844fd9fb9eb96dd7fa85149988fa8677d1d359140b6d0d0a2773ae76", + "layout": { + "solcVersion": "0.8.26", + "storage": [ + { + "label": "factory", + "offset": 0, + "slot": "0", + "type": "t_contract(FFactoryV3)47632", + "contract": "FRouterV3", + "src": "contracts/launchpadv2/FRouterV3.sol:48" + }, + { + "label": "assetToken", + "offset": 0, + "slot": "1", + "type": "t_address", + "contract": "FRouterV3", + "src": "contracts/launchpadv2/FRouterV3.sol:49" + }, + { + "label": "bondingV5", + "offset": 0, + "slot": "2", + "type": "t_contract(IBondingV5ForRouter)49564", + "contract": "FRouterV3", + "src": "contracts/launchpadv2/FRouterV3.sol:52" + }, + { + "label": "bondingConfig", + "offset": 0, + "slot": "3", + "type": "t_contract(IBondingConfigForRouter)49577", + "contract": "FRouterV3", + "src": "contracts/launchpadv2/FRouterV3.sol:53" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)460_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)470_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)460_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)1948_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(ReentrancyGuardStorage)2967_storage": { + "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage", + "members": [ + { + "label": "_status", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)460_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_contract(FFactoryV3)47632": { + "label": "contract FFactoryV3", + "numberOfBytes": "20" + }, + "t_contract(IBondingConfigForRouter)49577": { + "label": "contract IBondingConfigForRouter", + "numberOfBytes": "20" + }, + "t_contract(IBondingV5ForRouter)49564": { + "label": "contract IBondingV5ForRouter", + "numberOfBytes": "20" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.ReentrancyGuard": [ + { + "contract": "ReentrancyGuardUpgradeable", + "label": "_status", + "type": "t_uint256", + "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)460_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "823d9f87074c1707e7e21efbf3614fd7672f08c60bfd718fc135042b37ccadc4": { + "address": "0xFB87ec5b49345c48443C24b27FC767e66ed8977a", + "txHash": "0xa8b699a5bafc6a5dd818a37c6413c1cb714e3b7c5df23dd3fd3536d8fffb6d54", + "layout": { + "solcVersion": "0.8.26", + "storage": [ + { + "label": "taxRecipient", + "offset": 0, + "slot": "0", + "type": "t_address", + "contract": "TaxAccountingAdapter", + "src": "contracts/tax/TaxAccountingAdapter.sol:36" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_struct(InitializableStorage)1948_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(OwnableStorage)642_storage": { + "label": "struct OwnableUpgradeable.OwnableStorage", + "members": [ + { + "label": "_owner", + "type": "t_address", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(ReentrancyGuardStorage)2967_storage": { + "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage", + "members": [ + { + "label": "_status", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.Ownable": [ + { + "contract": "OwnableUpgradeable", + "label": "_owner", + "type": "t_address", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.ReentrancyGuard": [ + { + "contract": "ReentrancyGuardUpgradeable", + "label": "_status", + "type": "t_uint256", + "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "08f5d446f9d3f41429cb1e12cc992416b1528e9bb926f71bb4bf34645bee4351": { + "address": "0x7B9e4E0aD521118A1591Cc21f49FdD52aAe3a167", + "txHash": "0xde104f854f78d1cabd517bba310e023b6b5933b8e5bf9ad303487bdaf15720e0", + "layout": { + "solcVersion": "0.8.26", + "storage": [ + { + "label": "_roles", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_bytes32,t_struct(RoleData)8943_storage)", + "contract": "AccessControl", + "src": "@openzeppelin/contracts/access/AccessControl.sol:55" + }, + { + "label": "_nextId", + "offset": 0, + "slot": "1", + "type": "t_uint256", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:66" + }, + { + "label": "tokenImplementation", + "offset": 0, + "slot": "2", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:70" + }, + { + "label": "daoImplementation", + "offset": 0, + "slot": "3", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:71" + }, + { + "label": "nft", + "offset": 0, + "slot": "4", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:72" + }, + { + "label": "tbaRegistry", + "offset": 0, + "slot": "5", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:73" + }, + { + "label": "allTokens", + "offset": 0, + "slot": "6", + "type": "t_array(t_address)dyn_storage", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:75" + }, + { + "label": "allDAOs", + "offset": 0, + "slot": "7", + "type": "t_array(t_address)dyn_storage", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:76" + }, + { + "label": "assetToken", + "offset": 0, + "slot": "8", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:78" + }, + { + "label": "maturityDuration", + "offset": 0, + "slot": "9", + "type": "t_uint256", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:79" + }, + { + "label": "_applications", + "offset": 0, + "slot": "10", + "type": "t_mapping(t_uint256,t_struct(Application)75838_storage)", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:116" + }, + { + "label": "gov", + "offset": 0, + "slot": "11", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:118" + }, + { + "label": "_vault", + "offset": 0, + "slot": "12", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:129" + }, + { + "label": "locked", + "offset": 20, + "slot": "12", + "type": "t_bool", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:131" + }, + { + "label": "allTradingTokens", + "offset": 0, + "slot": "13", + "type": "t_array(t_address)dyn_storage", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:143" + }, + { + "label": "_uniswapRouter", + "offset": 0, + "slot": "14", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:144" + }, + { + "label": "veTokenImplementation", + "offset": 0, + "slot": "15", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:145" + }, + { + "label": "_minter", + "offset": 0, + "slot": "16", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:146" + }, + { + "label": "_tokenAdmin", + "offset": 0, + "slot": "17", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:147" + }, + { + "label": "defaultDelegatee", + "offset": 0, + "slot": "18", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:148" + }, + { + "label": "_tokenSupplyParams", + "offset": 0, + "slot": "19", + "type": "t_bytes_storage", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:151" + }, + { + "label": "_tokenTaxParams", + "offset": 0, + "slot": "20", + "type": "t_bytes_storage", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:152" + }, + { + "label": "_tokenMultiplier", + "offset": 0, + "slot": "21", + "type": "t_uint16", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:153" + }, + { + "label": "_existingAgents", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_bool)", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:161" + }, + { + "label": "taxAccountingAdapter", + "offset": 0, + "slot": "23", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:164" + }, + { + "label": "legacyAgentTokenV3Implementation", + "offset": 0, + "slot": "24", + "type": "t_address", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:174" + }, + { + "label": "v3SwapThresholdBasisPoints", + "offset": 0, + "slot": "25", + "type": "t_uint256", + "contract": "AgentFactoryV7", + "src": "contracts/virtualPersona/AgentFactoryV7.sol:176" + } + ], + "types": { + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_struct(InitializableStorage)1948_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(PausableStorage)2903_storage": { + "label": "struct PausableUpgradeable.PausableStorage", + "members": [ + { + "label": "_paused", + "type": "t_bool", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint8)dyn_storage": { + "label": "uint8[]", + "numberOfBytes": "32" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_enum(ApplicationStatus)75807": { + "label": "enum AgentFactoryV7.ApplicationStatus", + "members": [ + "Active", + "Executed", + "Withdrawn" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)8943_storage)": { + "label": "mapping(bytes32 => struct AccessControl.RoleData)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Application)75838_storage)": { + "label": "mapping(uint256 => struct AgentFactoryV7.Application)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Application)75838_storage": { + "label": "struct AgentFactoryV7.Application", + "members": [ + { + "label": "name", + "type": "t_string_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "symbol", + "type": "t_string_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "tokenURI", + "type": "t_string_storage", + "offset": 0, + "slot": "2" + }, + { + "label": "status", + "type": "t_enum(ApplicationStatus)75807", + "offset": 0, + "slot": "3" + }, + { + "label": "withdrawableAmount", + "type": "t_uint256", + "offset": 0, + "slot": "4" + }, + { + "label": "proposer", + "type": "t_address", + "offset": 0, + "slot": "5" + }, + { + "label": "cores", + "type": "t_array(t_uint8)dyn_storage", + "offset": 0, + "slot": "6" + }, + { + "label": "proposalEndBlock", + "type": "t_uint256", + "offset": 0, + "slot": "7" + }, + { + "label": "virtualId", + "type": "t_uint256", + "offset": 0, + "slot": "8" + }, + { + "label": "tbaSalt", + "type": "t_bytes32", + "offset": 0, + "slot": "9" + }, + { + "label": "tbaImplementation", + "type": "t_address", + "offset": 0, + "slot": "10" + }, + { + "label": "daoVotingPeriod", + "type": "t_uint32", + "offset": 20, + "slot": "10" + }, + { + "label": "daoThreshold", + "type": "t_uint256", + "offset": 0, + "slot": "11" + }, + { + "label": "tokenAddress", + "type": "t_address", + "offset": 0, + "slot": "12" + } + ], + "numberOfBytes": "416" + }, + "t_struct(RoleData)8943_storage": { + "label": "struct AccessControl.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.Pausable": [ + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:21", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "7a897a622182cf7744792957d6f73b7c019f92272e60f471ff6e1c2916925f2e": { + "address": "0xfE8BB7D9f4D60e271784B932C0e9E7d6Af44c665", + "txHash": "0xa9a4fe2cde4735bda914809009c5f69faa227b1a24beaa0126e69ea375e60e5a", + "layout": { + "solcVersion": "0.8.26", + "storage": [ + { + "label": "reserveSupplyParams", + "offset": 0, + "slot": "0", + "type": "t_struct(ReserveSupplyParams)1331_storage", + "contract": "BondingConfig", + "src": "contracts/launchpadv2/BondingConfig.sol:26" + }, + { + "label": "scheduledLaunchParams", + "offset": 0, + "slot": "1", + "type": "t_struct(ScheduledLaunchParams)1350_storage", + "contract": "BondingConfig", + "src": "contracts/launchpadv2/BondingConfig.sol:41" + }, + { + "label": "teamTokenReservedWallet", + "offset": 0, + "slot": "4", + "type": "t_address", + "contract": "BondingConfig", + "src": "contracts/launchpadv2/BondingConfig.sol:44" + }, + { + "label": "isPrivilegedLauncher", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_bool)", + "contract": "BondingConfig", + "src": "contracts/launchpadv2/BondingConfig.sol:47" + }, + { + "label": "bondingCurveParams", + "offset": 0, + "slot": "6", + "type": "t_struct(BondingCurveParams)1365_storage", + "contract": "BondingConfig", + "src": "contracts/launchpadv2/BondingConfig.sol:54" + }, + { + "label": "deployParams", + "offset": 0, + "slot": "8", + "type": "t_struct(DeployParams)1452_storage", + "contract": "BondingConfig", + "src": "contracts/launchpadv2/BondingConfig.sol:109" + }, + { + "label": "initialSupply", + "offset": 0, + "slot": "11", + "type": "t_uint256", + "contract": "BondingConfig", + "src": "contracts/launchpadv2/BondingConfig.sol:112" + }, + { + "label": "feeTo", + "offset": 0, + "slot": "12", + "type": "t_address", + "contract": "BondingConfig", + "src": "contracts/launchpadv2/BondingConfig.sol:113" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_struct(InitializableStorage)73_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(OwnableStorage)13_storage": { + "label": "struct OwnableUpgradeable.OwnableStorage", + "members": [ + { + "label": "_owner", + "type": "t_address", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_struct(BondingCurveParams)1365_storage": { + "label": "struct BondingConfig.BondingCurveParams", + "members": [ + { + "label": "fakeInitialVirtualLiq", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "targetRealVirtual", + "type": "t_uint256", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(DeployParams)1452_storage": { + "label": "struct BondingConfig.DeployParams", + "members": [ + { + "label": "tbaSalt", + "type": "t_bytes32", + "offset": 0, + "slot": "0" + }, + { + "label": "tbaImplementation", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "daoVotingPeriod", + "type": "t_uint32", + "offset": 20, + "slot": "1" + }, + { + "label": "daoThreshold", + "type": "t_uint256", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(ReserveSupplyParams)1331_storage": { + "label": "struct BondingConfig.ReserveSupplyParams", + "members": [ + { + "label": "maxAirdropBips", + "type": "t_uint16", + "offset": 0, + "slot": "0" + }, + { + "label": "maxTotalReservedBips", + "type": "t_uint16", + "offset": 2, + "slot": "0" + }, + { + "label": "acfReservedBips", + "type": "t_uint16", + "offset": 4, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(ScheduledLaunchParams)1350_storage": { + "label": "struct BondingConfig.ScheduledLaunchParams", + "members": [ + { + "label": "startTimeDelay", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "normalLaunchFee", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "acfFee", + "type": "t_uint256", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.Ownable": [ + { + "contract": "OwnableUpgradeable", + "label": "_owner", + "type": "t_address", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "1c25b07c8d8c3b2115c4b6cabad107ed42f7ec9b7f74c93a94e7e6534ab7c134": { + "address": "0x996168CefD7160cB6Dcaa539d9e009302B6052B8", + "txHash": "0x5950f1e45a219a9b98af7802ccd775538b09831903790be917885060ed7cfb46", + "layout": { + "solcVersion": "0.8.26", + "storage": [ + { + "label": "factory", + "offset": 0, + "slot": "0", + "type": "t_contract(IFFactoryV2Minimal)1989", + "contract": "BondingV5", + "src": "contracts/launchpadv2/BondingV5.sol:95" + }, + { + "label": "router", + "offset": 0, + "slot": "1", + "type": "t_contract(IFRouterV3Minimal)2051", + "contract": "BondingV5", + "src": "contracts/launchpadv2/BondingV5.sol:96" + }, + { + "label": "agentFactory", + "offset": 0, + "slot": "2", + "type": "t_contract(IAgentFactoryV7Minimal)2116", + "contract": "BondingV5", + "src": "contracts/launchpadv2/BondingV5.sol:97" + }, + { + "label": "bondingConfig", + "offset": 0, + "slot": "3", + "type": "t_contract(BondingConfig)1951", + "contract": "BondingV5", + "src": "contracts/launchpadv2/BondingV5.sol:98" + }, + { + "label": "tokenInfo", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(Token)1432_storage)", + "contract": "BondingV5", + "src": "contracts/launchpadv2/BondingV5.sol:100" + }, + { + "label": "tokenInfos", + "offset": 0, + "slot": "5", + "type": "t_array(t_address)dyn_storage", + "contract": "BondingV5", + "src": "contracts/launchpadv2/BondingV5.sol:101" + }, + { + "label": "tokenLaunchParams", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_address,t_struct(LaunchParams)1443_storage)", + "contract": "BondingV5", + "src": "contracts/launchpadv2/BondingV5.sol:107" + }, + { + "label": "tokenGradThreshold", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_uint256)", + "contract": "BondingV5", + "src": "contracts/launchpadv2/BondingV5.sol:110" + }, + { + "label": "isFeeDelegation", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_address,t_bool)", + "contract": "BondingV5", + "src": "contracts/launchpadv2/BondingV5.sol:112" + }, + { + "label": "tokenPreLaunchExtParams", + "offset": 0, + "slot": "9", + "type": "t_mapping(t_address,t_bytes_storage)", + "contract": "BondingV5", + "src": "contracts/launchpadv2/BondingV5.sol:115" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_struct(InitializableStorage)73_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(OwnableStorage)13_storage": { + "label": "struct OwnableUpgradeable.OwnableStorage", + "members": [ + { + "label": "_owner", + "type": "t_address", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(ReentrancyGuardStorage)158_storage": { + "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage", + "members": [ + { + "label": "_status", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint8)dyn_storage": { + "label": "uint8[]", + "numberOfBytes": "32" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(BondingConfig)1951": { + "label": "contract BondingConfig", + "numberOfBytes": "20" + }, + "t_contract(IAgentFactoryV7Minimal)2116": { + "label": "contract IAgentFactoryV7Minimal", + "numberOfBytes": "20" + }, + "t_contract(IFFactoryV2Minimal)1989": { + "label": "contract IFFactoryV2Minimal", + "numberOfBytes": "20" + }, + "t_contract(IFRouterV3Minimal)2051": { + "label": "contract IFRouterV3Minimal", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bytes_storage)": { + "label": "mapping(address => bytes)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(LaunchParams)1443_storage)": { + "label": "mapping(address => struct BondingConfig.LaunchParams)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Token)1432_storage)": { + "label": "mapping(address => struct BondingConfig.Token)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Data)1393_storage": { + "label": "struct BondingConfig.Data", + "members": [ + { + "label": "token", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "name", + "type": "t_string_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "_name", + "type": "t_string_storage", + "offset": 0, + "slot": "2" + }, + { + "label": "ticker", + "type": "t_string_storage", + "offset": 0, + "slot": "3" + }, + { + "label": "supply", + "type": "t_uint256", + "offset": 0, + "slot": "4" + }, + { + "label": "price", + "type": "t_uint256", + "offset": 0, + "slot": "5" + }, + { + "label": "marketCap", + "type": "t_uint256", + "offset": 0, + "slot": "6" + }, + { + "label": "liquidity", + "type": "t_uint256", + "offset": 0, + "slot": "7" + }, + { + "label": "volume", + "type": "t_uint256", + "offset": 0, + "slot": "8" + }, + { + "label": "volume24H", + "type": "t_uint256", + "offset": 0, + "slot": "9" + }, + { + "label": "prevPrice", + "type": "t_uint256", + "offset": 0, + "slot": "10" + }, + { + "label": "lastUpdated", + "type": "t_uint256", + "offset": 0, + "slot": "11" + } + ], + "numberOfBytes": "384" + }, + "t_struct(LaunchParams)1443_storage": { + "label": "struct BondingConfig.LaunchParams", + "members": [ + { + "label": "launchMode", + "type": "t_uint8", + "offset": 0, + "slot": "0" + }, + { + "label": "airdropBips", + "type": "t_uint16", + "offset": 1, + "slot": "0" + }, + { + "label": "needAcf", + "type": "t_bool", + "offset": 3, + "slot": "0" + }, + { + "label": "antiSniperTaxType", + "type": "t_uint8", + "offset": 4, + "slot": "0" + }, + { + "label": "isProject60days", + "type": "t_bool", + "offset": 5, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Token)1432_storage": { + "label": "struct BondingConfig.Token", + "members": [ + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "token", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "pair", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "agentToken", + "type": "t_address", + "offset": 0, + "slot": "3" + }, + { + "label": "data", + "type": "t_struct(Data)1393_storage", + "offset": 0, + "slot": "4" + }, + { + "label": "description", + "type": "t_string_storage", + "offset": 0, + "slot": "16" + }, + { + "label": "cores", + "type": "t_array(t_uint8)dyn_storage", + "offset": 0, + "slot": "17" + }, + { + "label": "image", + "type": "t_string_storage", + "offset": 0, + "slot": "18" + }, + { + "label": "twitter", + "type": "t_string_storage", + "offset": 0, + "slot": "19" + }, + { + "label": "telegram", + "type": "t_string_storage", + "offset": 0, + "slot": "20" + }, + { + "label": "youtube", + "type": "t_string_storage", + "offset": 0, + "slot": "21" + }, + { + "label": "website", + "type": "t_string_storage", + "offset": 0, + "slot": "22" + }, + { + "label": "trading", + "type": "t_bool", + "offset": 0, + "slot": "23" + }, + { + "label": "tradingOnUniswap", + "type": "t_bool", + "offset": 1, + "slot": "23" + }, + { + "label": "applicationId", + "type": "t_uint256", + "offset": 0, + "slot": "24" + }, + { + "label": "initialPurchase", + "type": "t_uint256", + "offset": 0, + "slot": "25" + }, + { + "label": "virtualId", + "type": "t_uint256", + "offset": 0, + "slot": "26" + }, + { + "label": "launchExecuted", + "type": "t_bool", + "offset": 0, + "slot": "27" + } + ], + "numberOfBytes": "896" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.Ownable": [ + { + "contract": "OwnableUpgradeable", + "label": "_owner", + "type": "t_address", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.ReentrancyGuard": [ + { + "contract": "ReentrancyGuardUpgradeable", + "label": "_status", + "type": "t_uint256", + "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + } + } +} diff --git a/hardhat.config.js b/hardhat.config.js index 21f36ff..2fd8f25 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -165,7 +165,30 @@ module.exports = { // The xlayer_* entries below are kept for reference but verification goes through okxweb3explorer below. // Set OKLINK_API_KEY (or ETHERSCAN_API_KEY) to your OKLink API key when verifying on xlayer_*. // https://www.oklink.com/docs/zh/#explorer-api-tools-contract-verification-verify-source-code-using-hardhat - apiKey: process.env.OKLINK_API_KEY || process.env.ETHERSCAN_API_KEY, + // Object format required so hardhat-verify uses customChains.urls.apiURL per network. + // String format routes ALL chains to Etherscan V2 (api.etherscan.io/v2/api?chainid=...) and + // ignores customChains apiURLs — breaking chains not in Etherscan V2's supported list (e.g. robinhood_testnet). + apiKey: { + // Etherscan V2 chains (all share the same key via api.etherscan.io/v2/api?chainid=) + eth_mainnet: process.env.ETHERSCAN_API_KEY || "", + sepolia: process.env.ETHERSCAN_API_KEY || "", + eth_sepolia: process.env.ETHERSCAN_API_KEY || "", + bsc_mainnet: process.env.ETHERSCAN_API_KEY || "", + bsc_testnet: process.env.ETHERSCAN_API_KEY || "", + base: process.env.ETHERSCAN_API_KEY || "", + base_sepolia: process.env.ETHERSCAN_API_KEY || "", + abstract_testnet: process.env.ETHERSCAN_API_KEY || "", + abstract_mainnet: process.env.ETHERSCAN_API_KEY || "", + monad_testnet: process.env.ETHERSCAN_API_KEY || "", + monad_mainnet: process.env.ETHERSCAN_API_KEY || "", + arbitrum_sepolia: process.env.ETHERSCAN_API_KEY || "", + // X Layer — OKLink key used by okverify task; kept here for completeness + xlayer_testnet: process.env.OKLINK_API_KEY || process.env.ETHERSCAN_API_KEY || "", + xlayer_mainnet: process.env.OKLINK_API_KEY || process.env.ETHERSCAN_API_KEY || "", + // Robinhood testnet — Blockscout explorer (chainId 46630 not in Etherscan V2). + // Blockscout does not validate API keys; any non-empty string works. + robinhood_testnet: process.env.ETHERSCAN_API_KEY || "blockscout", + }, customChains: [ { network: "base", @@ -227,6 +250,18 @@ module.exports = { browserURL: "https://sepolia.arbiscan.io/", }, }, + // Robinhood testnet (chainId 46630) is NOT in Etherscan V2's chainlist. + // apiKey is an object (see above), so hardhat-verify uses this Blockscout apiURL directly + // instead of routing to Etherscan V2. Blockscout is Etherscan-compatible and does not + // validate API key values. The robinhood_testnet entry in apiKey holds any non-empty string. + { + network: "robinhood_testnet", + chainId: 46630, + urls: { + apiURL: "https://explorer.testnet.chain.robinhood.com/api", + browserURL: "https://explorer.testnet.chain.robinhood.com", + }, + }, // X Layer (OKLink) — kept for reference only. Verification uses okxweb3explorer (okverify) below. // Standard Etherscan format (verify:verify / verify:etherscan) fails with "Missing or unsupported chainid parameter". { @@ -376,6 +411,13 @@ module.exports = { accounts: [process.env.PRIVATE_KEY], chainId: 421614, }, + robinhood_testnet: { + url: + process.env.ROBINHOOD_TESTNET_RPC_URL || + "https://testnet.rpc.robinhood.com", + accounts: [process.env.PRIVATE_KEY], + chainId: 46630, + }, // X Layer (OKX) // Do not fall back to RPC_URL to avoid accidental cross-chain deploys. xlayer_testnet: { diff --git a/scripts/launchpadv5/e2e_test.ts b/scripts/launchpadv5/e2e_test.ts index 36705d8..60e6dd4 100644 --- a/scripts/launchpadv5/e2e_test.ts +++ b/scripts/launchpadv5/e2e_test.ts @@ -642,7 +642,7 @@ async function main() { console.log("Anti-Sniper Tax Vault Balance:", formatEther(antiSniperTaxVaultBalanceBeforeBuy2), "VIRTUAL"); // Large buy may graduate; wallet must hold enough VIRTUAL + FRouter allowance (set in Step 2). - const buyAmount2 = parseEther("50000"); // 50_000 VIRTUAL + const buyAmount2 = parseEther("10000"); // 10_000 VIRTUAL const deadline2 = Math.floor(Date.now() / 1000) + 300; console.log("\n--- Executing buy (after anti-sniper period) ---"); diff --git a/scripts/launchpadv5/run_local_deploy.sh b/scripts/launchpadv5/run_local_deploy.sh index bc9ce35..5b64ef5 100755 --- a/scripts/launchpadv5/run_local_deploy.sh +++ b/scripts/launchpadv5/run_local_deploy.sh @@ -204,9 +204,12 @@ case "$NETWORK" in echo "Press Ctrl+C within 5 seconds to cancel..." sleep 5 ;; + "robinhood_testnet") + HARDHAT_NETWORK="robinhood_testnet" + ;; *) echo "Error: Unknown network '$NETWORK'" - echo "Valid networks: local, base_sepolia, base, bsc_testnet, abstract_testnet, abstract_mainnet, monad_testnet, xlayer_testnet, xlayer_mainnet" + echo "Valid networks: local, base_sepolia, base, bsc_testnet, abstract_testnet, abstract_mainnet, monad_testnet, xlayer_testnet, xlayer_mainnet, robinhood_testnet" exit 1 ;; esac @@ -313,7 +316,7 @@ save_univ2_env_from_log() { run_univ2_liquidity_deploy() { case "$HARDHAT_NETWORK" in - local|bsc_testnet|monad_testnet|xlayer_testnet) + local|bsc_testnet|monad_testnet|xlayer_testnet|robinhood_testnet) ;; *) echo "Skipping deployUniswapV2TestnetLiquidity.ts (not run on network $HARDHAT_NETWORK)" diff --git a/scripts/launchpadv5/utils.ts b/scripts/launchpadv5/utils.ts index 7f0fff1..f08a3aa 100644 --- a/scripts/launchpadv5/utils.ts +++ b/scripts/launchpadv5/utils.ts @@ -86,6 +86,20 @@ export async function promptYes(question: string): Promise { export const HARDHAT_SIGNER_GAS_CEILING = 30_000_000; export const HARDHAT_SIGNER_GAS_CEILING_BIGINT = 30_000_000n; +/** + * Robinhood testnet is an Arbitrum Orbit chain. L1 calldata cost is folded into intrinsic gas + * (gas_limit × price), so for large contracts the intrinsic gas can far exceed 15M. + * Use eth_estimateGas (gasLimit = undefined) instead of a hardcoded ceiling. + */ +export function isRobinhoodHardhatNetwork(): boolean { + try { + const n = hre.network?.name as string | undefined; + return n === "robinhood_testnet" || n === "robinhood_mainnet"; + } catch { + return false; + } +} + /** https://docs.monad.xyz — fee = gas_limit × price (not gas_used). */ export function isMonadHardhatNetwork(): boolean { try { @@ -176,8 +190,14 @@ export function launchpadDefaultTxGasLimit(): bigint { return BigInt(clampGasInt(def)); } -/** Gas for heavy deploys / factory / V3 mint (capped at Hardhat signer max). */ -export function launchpadHeavyTxGasLimit(): number { +/** + * Gas for heavy deploys / factory / V3 mint (capped at Hardhat signer max). + * Returns `undefined` for Robinhood networks — L1 calldata cost is folded into intrinsic gas + * on Arbitrum Orbit chains, so a hardcoded ceiling can be below the actual intrinsic requirement + * for large contracts. Returning undefined lets ethers.js call eth_estimateGas instead. + */ +export function launchpadHeavyTxGasLimit(): number | undefined { + if (isRobinhoodHardhatNetwork()) return undefined; const nonMonadDefault = isHardhatLocalNetwork() ? HARDHAT_SIGNER_GAS_CEILING : LAUNCHPAD_HEAVY_DEFAULT_REMOTE; @@ -312,6 +332,39 @@ export async function verifyContract( return; } + if (net === "robinhood_testnet") { + // Robinhood testnet (chainId 46630) is not in Etherscan V2's chainlist. + // hardhat.config.js uses apiKey as an object so hardhat-verify routes to the Blockscout + // explorer at https://explorer.testnet.chain.robinhood.com/api (from customChains). + // Blockscout is Etherscan-compatible and does not enforce API key validity. + console.log( + " Robinhood testnet: verifying via Blockscout explorer (https://explorer.testnet.chain.robinhood.com)." + ); + try { + await run("verify:verify", { + address, + constructorArguments, + ...(opts?.contract ? { contract: opts.contract } : {}), + }); + console.log("✅ Contract verified (Robinhood explorer)"); + } catch (error: any) { + const msg = error?.message ?? String(error); + if ( + msg.includes("Already Verified") || + msg.includes("already been verified") || + msg.includes("Already verified") + ) { + console.log("✅ Contract already verified"); + } else { + console.log("⚠️ Verification failed:", msg); + console.log( + ` Manual verification: ${address} on https://explorer.testnet.chain.robinhood.com` + ); + } + } + return; + } + if (net === "xlayer_testnet" || net === "xlayer_mainnet") { // Use okverify (Method 1: @okxweb3/hardhat-explorer-verify plugin). // This sends requests in OKLink's own format — not standard Etherscan POST.