### Basic idea
ERC1155Upgradeable constract that our RenodeBonding contract uses , is calling _mint() inside bond() function . This bond()function is setting to be external . So it is satisfied with users .
>_mint(_msgSender(), nftIds[_type][_amount], 1, "0x");
This mint function in ERC1155Upgradeable contract is defined as :
function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal {
if (to == address(0)) {
revert ERC1155InvalidReceiver(address(0));
}
(uint256[] memory ids, uint256[] memory amounts) = _asSingletonArrays(id, amount);
_update(address(0), to, ids, amounts, data);
}
which is calling _update() internally , let's take a look at it .
function _update(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
if (ids.length != amounts.length) {
revert ERC1155InvalidArrayLength(ids.length, amounts.length);
}
address operator = _msgSender();
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids.unsafeMemoryAccess(i);
uint256 amount = amounts.unsafeMemoryAccess(i);
if (from != address(0)) {
uint256 fromBalance = _balances[id][from];
if (fromBalance < amount) {
revert ERC1155InsufficientBalance(from, fromBalance, amount, id);
}
unchecked {
_balances[id][from] = fromBalance - amount;
}
}
if (to != address(0)) {
_balances[id][to] += amount;
}
}
if (ids.length == 1) {
uint256 id = ids.unsafeMemoryAccess(0);
uint256 amount = amounts.unsafeMemoryAccess(0);
emit TransferSingle(operator, from, to, id, amount);
if (to != address(0)) {
_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}
} else {
emit TransferBatch(operator, from, to, ids, amounts);
if (to != address(0)) {
_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
}
}
}
Focus on the last if block , we are calling _doSafeBatchTransferAcceptanceCheck function . This meets the case where the resource material.
Specifically function _doSafeBatchTransferAcceptanceCheck is calling address to in the middle . This would potentially cause re-entrancy if the called address is calling back to our contract functions .
### Migations
Add non-reentrant modifier to bond() function or any other external function that calls erc1155's mint() inside .
### Resource
https://www.rareskills.io/post/where-to-find-solidity-reentrancy-attacks