Skip to content
This repository was archived by the owner on May 9, 2024. It is now read-only.
Open
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
128 changes: 121 additions & 7 deletions contracts/ERC1155Safe.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,43 @@ contract ERC1155Safe {
@param amounts Amounts of tokens to transfer.
@param data Additional data.
*/
function lockBatchERC1155(address tokenAddress, address owner, address recipient, uint[] memory tokenIDs, uint[] memory amounts, bytes memory data) internal {
function lockBatchERC1155(
address tokenAddress,
address owner,
address recipient,
uint256[] memory tokenIDs,
uint256[] memory amounts,
bytes memory data
) internal {
IERC1155 erc1155 = IERC1155(tokenAddress);
erc1155.safeBatchTransferFrom(owner, recipient, tokenIDs, amounts, data);
erc1155.safeBatchTransferFrom(
owner,
recipient,
tokenIDs,
amounts,
data
);
}

/**
@notice Used to gain custoday of deposited token
@param tokenAddress Address of ERC1155 to transfer.
@param owner Address of current token owner.
@param recipient Address to transfer token to.
@param tokenID ID of tokens to transfer.
@param amount Amount of tokens to transfer.
@param data Additional data.
*/
function lockERC1155(
address tokenAddress,
address owner,
address recipient,
uint256 tokenID,
uint256 amount,
bytes memory data
) internal {
IERC1155 erc1155 = IERC1155(tokenAddress);
erc1155.safeTransferFrom(owner, recipient, tokenID, amount, data);
}

/**
Expand All @@ -37,9 +71,41 @@ contract ERC1155Safe {
@param amounts Amounts of tokens to transfer.
@param data Additional data.
*/
function releaseBatchERC1155(address tokenAddress, address owner, address recipient, uint256[] memory tokenIDs, uint[] memory amounts, bytes memory data) internal {
function releaseBatchERC1155(
address tokenAddress,
address owner,
address recipient,
uint256[] memory tokenIDs,
uint256[] memory amounts,
bytes memory data
) internal {
IERC1155 erc1155 = IERC1155(tokenAddress);
erc1155.safeBatchTransferFrom(owner, recipient, tokenIDs, amounts, data);
erc1155.safeBatchTransferFrom(
owner,
recipient,
tokenIDs,
amounts,
data
);
}

/**
@notice Transfers custody of token to recipient.
@param tokenAddress Address of ERC1155 to transfer.
@param owner Address of current token owner.
@param recipient Address to transfer token to.
@param tokenID ID of tokens to transfer.
@param amount Amount of tokens to transfer.
*/
function releaseERC1155(
address tokenAddress,
address owner,
address recipient,
uint256 tokenID,
uint256 amount
) internal {
IERC1155 erc1155 = IERC1155(tokenAddress);
erc1155.safeTransferFrom(owner, recipient, tokenID, amount, "0x");
}

/**
Expand All @@ -50,19 +116,67 @@ contract ERC1155Safe {
@param amounts Amounts of token to mint.
@param data Additional data.
*/
function mintBatchERC1155(address tokenAddress, address recipient, uint[] memory tokenIDs, uint[] memory amounts, bytes memory data) internal {
ERC1155PresetMinterPauser erc1155 = ERC1155PresetMinterPauser(tokenAddress);
function mintBatchERC1155(
address tokenAddress,
address recipient,
uint256[] memory tokenIDs,
uint256[] memory amounts,
bytes memory data
) internal {
ERC1155PresetMinterPauser erc1155 = ERC1155PresetMinterPauser(
tokenAddress
);
erc1155.mintBatch(recipient, tokenIDs, amounts, data);
}

/**
@notice Used to create new ERC1155
@param tokenAddress Address of ERC1155 to mint.
@param recipient Address to mint token to.
@param tokenID ID of tokens to mint.
@param amount Amount of token to mint.
*/
function mintERC1155(
address tokenAddress,
address recipient,
uint256 tokenID,
uint256 amount
) internal {
ERC1155PresetMinterPauser erc1155 = ERC1155PresetMinterPauser(
tokenAddress
);
erc1155.mint(recipient, tokenID, amount, "0x");
}

/**
@notice Used to burn ERC1155s with batching.
@param tokenAddress Address of ERC1155 to burn.
@param tokenIDs IDs of tokens to burn.
@param amounts Amounts of tokens to burn.
*/
function burnBatchERC1155(address tokenAddress, address owner, uint[] memory tokenIDs, uint[] memory amounts) internal {
function burnBatchERC1155(
address tokenAddress,
address owner,
uint256[] memory tokenIDs,
uint256[] memory amounts
) internal {
ERC1155Burnable erc1155 = ERC1155Burnable(tokenAddress);
erc1155.burnBatch(owner, tokenIDs, amounts);
}

/**
@notice Used to burn ERC1155.
@param tokenAddress Address of ERC1155 to burn.
@param tokenID ID of tokens to burn.
@param amount Amount of tokens to burn.
*/
function burnERC1155(
address tokenAddress,
address owner,
uint256 tokenID,
uint256 amount
) internal {
ERC1155Burnable erc1155 = ERC1155Burnable(tokenAddress);
erc1155.burn(owner, tokenID, amount);
}
}
110 changes: 80 additions & 30 deletions contracts/handlers/ERC1155Handler.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";

contract ERC1155Handler is IDepositExecute, HandlerHelpers, ERC1155Safe, ERC1155Holder {
contract ERC1155Handler is
IDepositExecute,
HandlerHelpers,
ERC1155Safe,
ERC1155Holder
{
using ERC165Checker for address;

bytes4 private constant _INTERFACE_ERC1155_METADATA = 0x0e89341c;
Expand All @@ -18,30 +23,41 @@ contract ERC1155Handler is IDepositExecute, HandlerHelpers, ERC1155Safe, ERC1155
/**
@param bridgeAddress Contract address of previously deployed Bridge.
*/
constructor(
address bridgeAddress
) public HandlerHelpers(bridgeAddress) {
}
constructor(address bridgeAddress) HandlerHelpers(bridgeAddress) {}

/**
@notice A deposit is initiatied by making a deposit in the Bridge contract.
@param resourceID ResourceID used to find address of token to be used for deposit.
@param depositer Address of account making the deposit in the Bridge contract.
@param data Consists of ABI-encoded arrays of tokenIDs and amounts.
@param data Consists of ABI-encoded arrays of tokenID and amount.
*/
function deposit(bytes32 resourceID, address depositer, bytes calldata data) external override onlyBridge returns (bytes memory metaData) {
uint[] memory tokenIDs;
uint[] memory amounts;
function deposit(
bytes32 resourceID,
address depositer,
bytes calldata data
) external override onlyBridge returns (bytes memory metaData) {
uint256 tokenID;
uint256 amount;

(tokenIDs, amounts) = abi.decode(data, (uint[], uint[]));
(tokenID, amount) = abi.decode(data, (uint256, uint256));

address tokenAddress = _resourceIDToTokenContractAddress[resourceID];
require(tokenAddress != address(0), "provided resourceID does not exist");
require(
tokenAddress != address(0),
"provided resourceID does not exist"
);

if (_burnList[tokenAddress]) {
burnBatchERC1155(tokenAddress, depositer, tokenIDs, amounts);
burnERC1155(tokenAddress, depositer, tokenID, amount);
} else {
lockBatchERC1155(tokenAddress, depositer, address(this), tokenIDs, amounts, EMPTY_BYTES);
lockERC1155(
tokenAddress,
depositer,
address(this),
tokenID,
amount,
EMPTY_BYTES
);
}
}

Expand All @@ -51,27 +67,51 @@ contract ERC1155Handler is IDepositExecute, HandlerHelpers, ERC1155Safe, ERC1155
@param data Consists of ABI-encoded {tokenIDs}, {amounts}, {recipient},
and {transferData} of types uint[], uint[], bytes, bytes.
*/
function executeProposal(bytes32 resourceID, bytes calldata data) external override onlyBridge {
uint[] memory tokenIDs;
uint[] memory amounts;
bytes memory recipient;
bytes memory transferData;

(tokenIDs, amounts, recipient, transferData) = abi.decode(data, (uint[], uint[], bytes, bytes));
function executeProposal(bytes32 resourceID, bytes calldata data)
external
override
onlyBridge
{
uint256 tokenID;
uint256 amount;
uint256 lenDestinationRecipientAddress;
bytes memory destinationRecipientAddress;

(tokenID, amount, lenDestinationRecipientAddress) = abi.decode(
data,
(uint256, uint256, uint256)
);
destinationRecipientAddress = bytes(
data[96:96 + lenDestinationRecipientAddress]
);

bytes20 recipientAddress;
address tokenAddress = _resourceIDToTokenContractAddress[resourceID];

assembly {
recipientAddress := mload(add(recipient, 0x20))
recipientAddress := mload(add(destinationRecipientAddress, 0x20))
}

address tokenAddress = _resourceIDToTokenContractAddress[resourceID];
require(_contractWhitelist[address(tokenAddress)], "provided tokenAddress is not whitelisted");
require(
_contractWhitelist[address(tokenAddress)],
"provided tokenAddress is not whitelisted"
);

if (_burnList[tokenAddress]) {
mintBatchERC1155(tokenAddress, address(recipientAddress), tokenIDs, amounts, transferData);
mintERC1155(
tokenAddress,
address(recipientAddress),
tokenID,
amount
);
} else {
releaseBatchERC1155(tokenAddress, address(this), address(recipientAddress), tokenIDs, amounts, transferData);
releaseERC1155(
tokenAddress,
address(this),
address(recipientAddress),
tokenID,
amount
);
}
}

Expand All @@ -83,12 +123,22 @@ contract ERC1155Handler is IDepositExecute, HandlerHelpers, ERC1155Safe, ERC1155
function withdraw(bytes memory data) external override onlyBridge {
address tokenAddress;
address recipient;
uint[] memory tokenIDs;
uint[] memory amounts;
uint256[] memory tokenIDs;
uint256[] memory amounts;
bytes memory transferData;

(tokenAddress, recipient, tokenIDs, amounts, transferData) = abi.decode(data, (address, address, uint[], uint[], bytes));

releaseBatchERC1155(tokenAddress, address(this), recipient, tokenIDs, amounts, transferData);
(tokenAddress, recipient, tokenIDs, amounts, transferData) = abi.decode(
data,
(address, address, uint256[], uint256[], bytes)
);

releaseBatchERC1155(
tokenAddress,
address(this),
recipient,
tokenIDs,
amounts,
transferData
);
}
}
7 changes: 5 additions & 2 deletions scripts/geth/genesis.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"config": {
"chainId": 5,
"chainId": 1005,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
Expand All @@ -21,6 +21,9 @@
"0x8e0a907331554AF72563Bd8D43051C2E64Be5d35": { "balance": "20000000000000000000"},
"0x24962717f8fA5BA3b931bACaF9ac03924EB475a0": { "balance": "20000000000000000000"},
"0x148FfB2074A9e59eD58142822b3eB3fcBffb0cd7": { "balance": "20000000000000000000"},
"0x47EA8219Cc2b646AC6a10Ae9E59a82CB2A103Ac9": { "balance": "20000000000000000000"},
"0xB03C52C465F0Fb2A7229A70C5a1D79d6c30162B0": { "balance": "20000000000000000000"},
"0x49c965a2194b4630bc05291243e834864762fcea": { "balance": "20000000000000000000"},
"0x4CEEf6139f00F9F4535Ad19640Ff7A0137708485": { "balance": "20000000000000000000"}
}
}
}
28 changes: 14 additions & 14 deletions scripts/geth/start_geth.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ if [[ $QUIET ]]; then
--unlock "0xff93B45308FD417dF303D6515aB04D9e89a750Ca","0x8e0a907331554AF72563Bd8D43051C2E64Be5d35","0x24962717f8fA5BA3b931bACaF9ac03924EB475a0","0x148FfB2074A9e59eD58142822b3eB3fcBffb0cd7","0x4CEEf6139f00F9F4535Ad19640Ff7A0137708485" \
--password ./scripts/geth/password.txt \
--ws \
--wsport 8545 \
--networkid 5 \
--wsorigins="*" \
--rpc \
--rpcport 8545 \
--rpccorsdomain="*" \
--targetgaslimit 8000000 \
--ws.port 8545 \
--networkid 1005 \
--ws.origins="*" \
--http \
--http.port 8545 \
--http.corsdomain="*" \
--dev.gaslimit 8000000 \
--allow-insecure-unlock \
--mine
else
Expand All @@ -37,13 +37,13 @@ else
--unlock "0xff93B45308FD417dF303D6515aB04D9e89a750Ca","0x8e0a907331554AF72563Bd8D43051C2E64Be5d35","0x24962717f8fA5BA3b931bACaF9ac03924EB475a0","0x148FfB2074A9e59eD58142822b3eB3fcBffb0cd7","0x4CEEf6139f00F9F4535Ad19640Ff7A0137708485" \
--password ./scripts/geth/password.txt \
--ws \
--wsport 8545 \
--networkid 5 \
--wsorigins="*" \
--rpc \
--rpcport 8545 \
--rpccorsdomain="*" \
--targetgaslimit 8000000 \
--ws.port 8545 \
--networkid 1005 \
--ws.origins="*" \
--http \
--http.port 8545 \
--http.corsdomain="*" \
--dev.gaslimit 8000000 \
--allow-insecure-unlock \
--mine
fi
Loading