Platform: Code4rena
Start Date: 18/10/2022
Pot Size: $75,000 USDC
Total HM: 27
Participants: 144
Period: 7 days
Judge: gzeon
Total Solo HM: 13
Id: 170
League: ETH
Rank: 63/144
Findings: 2
Award: $55.67
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: Rolezn
Also found by: 0x1f8b, 0x52, 0x5rings, 0xNazgul, 0xSmartContract, 0xZaharina, 0xhunter, 0xzh, 8olidity, Amithuddar, Aymen0909, B2, Bnke0x0, Chom, Deivitto, Diana, Diraco, Dravee, Franfran, JC, Jeiwan, Josiah, JrNet, Jujic, KingNFT, KoKo, Lambda, Margaret, Migue, Ocean_Sky, PaludoX0, Picodes, Rahoz, RaoulSchaffranek, RaymondFam, RedOneN, ReyAdmirado, Shinchan, Tagir2003, Trust, Waze, Yiko, __141345__, a12jmx, adriro, ajtra, arcoun, aysha, ballx, bin2chen, bobirichman, brgltd, bulej93, catchup, catwhiskeys, caventa, cccz, cdahlheimer, ch0bu, chaduke, chrisdior4, cloudjunky, cryptostellar5, cryptphi, csanuragjain, cylzxje, d3e4, delfin454000, djxploit, durianSausage, erictee, fatherOfBlocks, francoHacker, gianganhnguyen, gogo, hansfriese, i_got_hacked, ignacio, imare, karanctf, kv, leosathya, louhk, lukris02, lyncurion, m_Rassska, malinariy, martin, mcwildy, mics, minhtrng, nicobevi, oyc_109, pashov, peanuts, pedr02b2, peiw, rbserver, ret2basic, rotcivegaf, rvierdiiev, ryshaw, sakman, sakshamguruji, saneryee, securerodd, seyni, sikorico, svskaushik, teawaterwire, tnevler, w0Lfrum
55.6726 USDC - $55.67
all three slot has comment bytes32(uint256(keccak256('eip1967.Holograph.operator')) - 1) but the hash is different,
/** * @dev bytes32(uint256(keccak256('eip1967.Holograph.operator')) - 1) */ bytes32 constant _operatorSlot = 0x7caba557ad34138fa3b7e43fb574e0e6cc10481c3073e0dffbc560db81b5c60f; /** * @dev bytes32(uint256(keccak256('eip1967.Holograph.operator')) - 1) */ bytes32 constant _baseGasSlot = 0x1eaa99919d5563fbfdd75d9d906ff8de8cf52beab1ed73875294c8a0c9e9d83a; /** * @dev bytes32(uint256(keccak256('eip1967.Holograph.operator')) - 1) */ bytes32 constant _gasPerByteSlot = 0x99d8b07d37c89d4c4f4fa0fd9b7396caeb5d1d4e58b41c61c71e3cf7d424a625;
only the first one map to bytes32(uint256(keccak256('eip1967.Holograph.operator')) - 1) hash.
bytes32 constant _operatorSlot = 0x7caba557ad34138fa3b7e43fb574e0e6cc10481c3073e0dffbc560db81b5c60f;
https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/
transfer() uses a fixed amount of gas, which can result in revert.
Use call instead of transfer(). Example: (bool succeeded, ) = _to.call{value: _amount}(""); require(succeeded, "Transfer failed.");
payable(hToken).transfer(hlgFee);
In PA1D.sol,
function getPayoutInfo()
is a read function
yet the function below are write function
function getEthPayout() public function getTokenPayout(address tokenAddress) public function getTokensPayout(address[] memory tokenAddresses) public
can change the function name
from getTokenPayout to claimTokenPayout in PA1D.sol from getTokensPayout to claimTokensPayout in PA1D.sol from getETHPayout to claimETHPayout in PA1D.sol
to imply that function performs write operation instead of read operation.
function setFactory(address factory) external onlyAdmin {
function setHolograph(address holograph) external onlyAdmin {
function setOperator(address operator) external onlyAdmin {
function setRegistry(address registry) external onlyAdmin {
function resetOperator(
function setBridge(address bridge) external onlyAdmin {
function setHolograph(address holograph) external onlyAdmin {
function setInterfaces(address interfaces) external onlyAdmin {
function setMessagingModule(address messagingModule) external onlyAdmin {
function setRegistry(address registry) external onlyAdmin {
function setUtilityToken(address utilityToken) external onlyAdmin {
function setHolograph(address holograph) external onlyAdmin {
function setRegistry(address registry) external onlyAdmin {
function setBridge(address bridge) external onlyAdmin {
function setInterfaces(address interfaces) external onlyAdmin {
function setLZEndpoint(address lZEndpoint) external onlyAdmin {
function setOperator(address operator) external onlyAdmin {
function setBaseGas(uint256 baseGas) external onlyAdmin {
function setGasPerByte(uint256 gasPerByte) external onlyAdmin {
function _setDefaultReceiver(address receiver) private {
function _setDefaultBp(uint256 bp) private {
function _setReceiver(uint256 tokenId, address receiver) private {
function _setBp(uint256 tokenId, uint256 bp) private {
function _setPayoutAddresses(address payable[] memory addresses) private {
function _setPayoutBps(uint256[] memory bps) private {
function _setTokenAddress(string memory tokenName, address tokenAddress) private {
function setRoyalties(
function _setOwner(address ownerAddress) internal {
function _setOwner(address ownerAddress) internal {
🌟 Selected for report: oyc_109
Also found by: 0x040, 0x1f8b, 0x5rings, 0xNazgul, 0xSmartContract, 0xZaharina, 0xsam, 0xzh, 2997ms, Amithuddar, Aymen0909, B2, Bnke0x0, Deivitto, Diana, Dinesh11G, Franfran, JC, JrNet, Jujic, KingNFT, KoKo, Mathieu, Metatron, Mukund, Olivierdem, PaludoX0, Pheonix, Picodes, RaymondFam, RedOneN, ReyAdmirado, Rolezn, Saintcode_, Satyam_Sharma, Shinchan, Tagir2003, Tomio, Waze, Yiko, __141345__, adriro, ajtra, aysha, ballx, beardofginger, bobirichman, brgltd, bulej93, catchup, catwhiskeys, cdahlheimer, ch0bu, chaduke, chrisdior4, cryptostellar5, cylzxje, d3e4, delfin454000, dharma09, djxploit, durianSausage, emrekocak, erictee, exolorkistis, fatherOfBlocks, gianganhnguyen, gogo, halden, hxzy, i_got_hacked, iepathos, karanctf, leosathya, lucacez, lukris02, lyncurion, m_Rassska, martin, mcwildy, mics, nicobevi, peanuts, peiw, rbserver, ret2basic, rotcivegaf, ryshaw, sakman, sakshamguruji, saneryee, sikorico, skyle, svskaushik, tnevler, vv7, w0Lfrum, zishansami
0 USDC - $0.00
abi.encode(abi.encode(config.chainType, holograph, config.contractType, sourceContractAddress), config.initCode)
return (Holographable.bridgeOut.selector, abi.encode(from, to, tokenId, data));
return (Holographable.bridgeOut.selector, abi.encode(from, to, amount, data));
abi.encode( 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9, account, spender, amount, _useNonce(account), deadline )
https://github.com/code-423n4/2022-01-xdefi-findings/issues/128
See this issue which describes the fact that there is a larger deployment gas cost, but with enough runtime calls, the change ends up being cheaper
require(_bondedOperators[operator] == 0 && _bondedAmounts[operator] == 0, "HOLOGRAPH: operator is bonded");
require(success && selector == InitializableInterface.init.selector, "initialization failed");
require(success && selector == InitializableInterface.init.selector, "ERC721: coud not init PA1D");
function configurePayouts(address payable[] memory addresses, uint256[] memory bps) public onlyOwner {
function getPayoutInfo() public view returns (address payable[] memory addresses, uint256[] memory bps) {
function getEthPayout() public {
function getTokenPayout(address tokenAddress) public {
function getTokensPayout(address[] memory tokenAddresses) public {
function royaltyInfo(uint256 tokenId, uint256 value) public view returns (address, uint256) {
function getFeeBps(uint256 tokenId) public view returns (uint256[] memory) {
function getFeeRecipients(uint256 tokenId) public view returns (address payable[] memory) {
function getFees(uint256 tokenId) public view returns (address payable[] memory, uint256[] memory) {
function tokenCreator(
function calculateRoyaltyFee(
function marketContract() public view returns (address) {
function tokenCreators(uint256 tokenId) public view returns (address) {
function bidSharesForToken(uint256 tokenId) public view returns (ZoraBidShares memory bidShares) {
function getTokenAddress(string memory tokenName) public view returns (address) {