Repository URL to install this package:
|
Version:
0.0.0 ▾
|
{
"address": "0xf30CF8D373D78D7964A2F7793b730BF7ae0970a8",
"abi": [
{
"inputs": [
{
"internalType": "contract IBentoBoxMinimal",
"name": "_bentoBox",
"type": "address"
},
{
"internalType": "contract IFuroStream",
"name": "_furoStream",
"type": "address"
},
{
"internalType": "address",
"name": "_wETH",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "InsufficientShares",
"type": "error"
},
{
"inputs": [],
"name": "bentoBox",
"outputs": [
{
"internalType": "contract IBentoBoxMinimal",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint64",
"name": "startTime",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "endTime",
"type": "uint64"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "bool",
"name": "fromBentoBox",
"type": "bool"
},
{
"internalType": "uint256",
"name": "minShare",
"type": "uint256"
}
],
"name": "createStream",
"outputs": [
{
"internalType": "uint256",
"name": "streamId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "depositedShares",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "furoStream",
"outputs": [
{
"internalType": "contract IFuroStream",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes[]",
"name": "data",
"type": "bytes[]"
}
],
"name": "multicall",
"outputs": [
{
"internalType": "bytes[]",
"name": "results",
"type": "bytes[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "bool",
"name": "approved",
"type": "bool"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "setBentoBoxApproval",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "wETH",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
}
],
"transactionHash": "0x646f8bf615f68540b2bbea1d5c7cc75eb78c1d366b7934802e92014729de9122",
"receipt": {
"to": null,
"from": "0x9346e1966E0510b3491Fe04297bcb33c9e4729D5",
"contractAddress": "0xf30CF8D373D78D7964A2F7793b730BF7ae0970a8",
"transactionIndex": 29,
"gasUsed": "875786",
"logsBloom": "0x00008000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000008000000000020000000000000000000000000000000800020000002000800000000000000000000100000000001004000000000000000000000000000004000000000000000080000000000000000000000020000000000000000000000400000000000000000000000000000000204000010000000000000000000000000000000080000000000000000000004000800000000000080001000000008000000000000000000000100000000000000000020000000000000040000000000000002000000000800000000000100000",
"blockHash": "0x3538449a81684cb109bf1fe21fdcdbe4b794e2a9e8558d82040c32d3baaad6cf",
"transactionHash": "0x646f8bf615f68540b2bbea1d5c7cc75eb78c1d366b7934802e92014729de9122",
"logs": [
{
"transactionIndex": 29,
"blockNumber": 31779436,
"transactionHash": "0x646f8bf615f68540b2bbea1d5c7cc75eb78c1d366b7934802e92014729de9122",
"address": "0x0319000133d3AdA02600f0875d2cf03D442C3367",
"topics": [
"0x5f6ebb64ba012a851c6f014e6cad458ddf213d1512049b31cd06365c2b059257",
"0x0000000000000000000000004ab2fc6e258a0ca7175d05ff10c5cf798a672cae",
"0x000000000000000000000000f30cf8d373d78d7964a2f7793b730bf7ae0970a8"
],
"data": "0x0000000000000000000000000000000000000000000000000000000000000001",
"logIndex": 95,
"blockHash": "0x3538449a81684cb109bf1fe21fdcdbe4b794e2a9e8558d82040c32d3baaad6cf"
},
{
"transactionIndex": 29,
"blockNumber": 31779436,
"transactionHash": "0x646f8bf615f68540b2bbea1d5c7cc75eb78c1d366b7934802e92014729de9122",
"address": "0x0319000133d3AdA02600f0875d2cf03D442C3367",
"topics": [
"0xdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb",
"0x000000000000000000000000f30cf8d373d78d7964a2f7793b730bf7ae0970a8"
],
"data": "0x",
"logIndex": 96,
"blockHash": "0x3538449a81684cb109bf1fe21fdcdbe4b794e2a9e8558d82040c32d3baaad6cf"
},
{
"transactionIndex": 29,
"blockNumber": 31779436,
"transactionHash": "0x646f8bf615f68540b2bbea1d5c7cc75eb78c1d366b7934802e92014729de9122",
"address": "0x0000000000000000000000000000000000001010",
"topics": [
"0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63",
"0x0000000000000000000000000000000000000000000000000000000000001010",
"0x0000000000000000000000009346e1966e0510b3491fe04297bcb33c9e4729d5",
"0x00000000000000000000000067b94473d81d0cd00849d563c94d0432ac988b49"
],
"data": "0x000000000000000000000000000000000000000000000000008331c5ba8a73fe0000000000000000000000000000000000000000000000001f1c7a69dc2cb46600000000000000000000000000000000000000000000133adb66638b182108d40000000000000000000000000000000000000000000000001e9948a421a2406800000000000000000000000000000000000000000000133adbe99550d2ab7cd2",
"logIndex": 97,
"blockHash": "0x3538449a81684cb109bf1fe21fdcdbe4b794e2a9e8558d82040c32d3baaad6cf"
}
],
"blockNumber": 31779436,
"cumulativeGasUsed": "5049586",
"status": 1,
"byzantium": true
},
"args": [
"0x0319000133d3AdA02600f0875d2cf03D442C3367",
"0x4ab2FC6e258a0cA7175D05fF10C5cF798A672cAE",
"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270"
],
"numDeployments": 1,
"solcInputHash": "cfe2c727d806878ef0812370cdeefc97",
"metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IBentoBoxMinimal\",\"name\":\"_bentoBox\",\"type\":\"address\"},{\"internalType\":\"contract IFuroStream\",\"name\":\"_furoStream\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_wETH\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientShares\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bentoBox\",\"outputs\":[{\"internalType\":\"contract IBentoBoxMinimal\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"startTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"fromBentoBox\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"minShare\",\"type\":\"uint256\"}],\"name\":\"createStream\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"streamId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"depositedShares\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"furoStream\",\"outputs\":[{\"internalType\":\"contract IFuroStream\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setBentoBoxApproval\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FuroStreamRouter.sol\":\"FuroStreamRouter\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"@rari-capital/solmate/src/tokens/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-only\\npragma solidity >=0.8.0;\\n\\n/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.\\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)\\n/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.\\nabstract contract ERC721 {\\n /*///////////////////////////////////////////////////////////////\\n EVENTS\\n //////////////////////////////////////////////////////////////*/\\n\\n event Transfer(address indexed from, address indexed to, uint256 indexed id);\\n\\n event Approval(address indexed owner, address indexed spender, uint256 indexed id);\\n\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /*///////////////////////////////////////////////////////////////\\n METADATA STORAGE/LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n string public name;\\n\\n string public symbol;\\n\\n function tokenURI(uint256 id) public view virtual returns (string memory);\\n\\n /*///////////////////////////////////////////////////////////////\\n ERC721 STORAGE \\n //////////////////////////////////////////////////////////////*/\\n\\n mapping(address => uint256) public balanceOf;\\n\\n mapping(uint256 => address) public ownerOf;\\n\\n mapping(uint256 => address) public getApproved;\\n\\n mapping(address => mapping(address => bool)) public isApprovedForAll;\\n\\n /*///////////////////////////////////////////////////////////////\\n CONSTRUCTOR\\n //////////////////////////////////////////////////////////////*/\\n\\n constructor(string memory _name, string memory _symbol) {\\n name = _name;\\n symbol = _symbol;\\n }\\n\\n /*///////////////////////////////////////////////////////////////\\n ERC721 LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function approve(address spender, uint256 id) public virtual {\\n address owner = ownerOf[id];\\n\\n require(msg.sender == owner || isApprovedForAll[owner][msg.sender], \\\"NOT_AUTHORIZED\\\");\\n\\n getApproved[id] = spender;\\n\\n emit Approval(owner, spender, id);\\n }\\n\\n function setApprovalForAll(address operator, bool approved) public virtual {\\n isApprovedForAll[msg.sender][operator] = approved;\\n\\n emit ApprovalForAll(msg.sender, operator, approved);\\n }\\n\\n function transferFrom(\\n address from,\\n address to,\\n uint256 id\\n ) public virtual {\\n require(from == ownerOf[id], \\\"WRONG_FROM\\\");\\n\\n require(to != address(0), \\\"INVALID_RECIPIENT\\\");\\n\\n require(\\n msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender],\\n \\\"NOT_AUTHORIZED\\\"\\n );\\n\\n // Underflow of the sender's balance is impossible because we check for\\n // ownership above and the recipient's balance can't realistically overflow.\\n unchecked {\\n balanceOf[from]--;\\n\\n balanceOf[to]++;\\n }\\n\\n ownerOf[id] = to;\\n\\n delete getApproved[id];\\n\\n emit Transfer(from, to, id);\\n }\\n\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id\\n ) public virtual {\\n transferFrom(from, to, id);\\n\\n require(\\n to.code.length == 0 ||\\n ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, \\\"\\\") ==\\n ERC721TokenReceiver.onERC721Received.selector,\\n \\\"UNSAFE_RECIPIENT\\\"\\n );\\n }\\n\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n bytes memory data\\n ) public virtual {\\n transferFrom(from, to, id);\\n\\n require(\\n to.code.length == 0 ||\\n ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==\\n ERC721TokenReceiver.onERC721Received.selector,\\n \\\"UNSAFE_RECIPIENT\\\"\\n );\\n }\\n\\n /*///////////////////////////////////////////////////////////////\\n ERC165 LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {\\n return\\n interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165\\n interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721\\n interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata\\n }\\n\\n /*///////////////////////////////////////////////////////////////\\n INTERNAL MINT/BURN LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function _mint(address to, uint256 id) internal virtual {\\n require(to != address(0), \\\"INVALID_RECIPIENT\\\");\\n\\n require(ownerOf[id] == address(0), \\\"ALREADY_MINTED\\\");\\n\\n // Counter overflow is incredibly unrealistic.\\n unchecked {\\n balanceOf[to]++;\\n }\\n\\n ownerOf[id] = to;\\n\\n emit Transfer(address(0), to, id);\\n }\\n\\n function _burn(uint256 id) internal virtual {\\n address owner = ownerOf[id];\\n\\n require(ownerOf[id] != address(0), \\\"NOT_MINTED\\\");\\n\\n // Ownership check above ensures no underflow.\\n unchecked {\\n balanceOf[owner]--;\\n }\\n\\n delete ownerOf[id];\\n\\n delete getApproved[id];\\n\\n emit Transfer(owner, address(0), id);\\n }\\n\\n /*///////////////////////////////////////////////////////////////\\n INTERNAL SAFE MINT LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function _safeMint(address to, uint256 id) internal virtual {\\n _mint(to, id);\\n\\n require(\\n to.code.length == 0 ||\\n ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, \\\"\\\") ==\\n ERC721TokenReceiver.onERC721Received.selector,\\n \\\"UNSAFE_RECIPIENT\\\"\\n );\\n }\\n\\n function _safeMint(\\n address to,\\n uint256 id,\\n bytes memory data\\n ) internal virtual {\\n _mint(to, id);\\n\\n require(\\n to.code.length == 0 ||\\n ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==\\n ERC721TokenReceiver.onERC721Received.selector,\\n \\\"UNSAFE_RECIPIENT\\\"\\n );\\n }\\n}\\n\\n/// @notice A generic interface for a contract which properly accepts ERC721 tokens.\\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)\\ninterface ERC721TokenReceiver {\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 id,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xf97378ab999188b3d5d97037fabbecbc726892c74cba6536899b852eb4756d6a\",\"license\":\"AGPL-3.0-only\"},\"contracts/FuroStreamRouter.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\nimport './interfaces/IFuroStream.sol';\\n\\ncontract FuroStreamRouter is Multicall {\\n IBentoBoxMinimal public immutable bentoBox;\\n IFuroStream public immutable furoStream;\\n address public immutable wETH;\\n\\n // custom errors\\n error InsufficientShares();\\n\\n constructor(\\n IBentoBoxMinimal _bentoBox,\\n IFuroStream _furoStream,\\n address _wETH\\n ) {\\n bentoBox = _bentoBox;\\n furoStream = _furoStream;\\n wETH = _wETH;\\n _bentoBox.setMasterContractApproval(address(this), address(_furoStream), true, 0, bytes32(0), bytes32(0));\\n _bentoBox.registerProtocol();\\n }\\n\\n function setBentoBoxApproval(\\n address user,\\n bool approved,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external payable {\\n bentoBox.setMasterContractApproval(user, address(this), approved, v, r, s);\\n }\\n\\n function createStream(\\n address recipient,\\n address token,\\n uint64 startTime,\\n uint64 endTime,\\n uint256 amount, /// @dev in token amount and not in shares\\n bool fromBentoBox,\\n uint256 minShare\\n ) external payable returns (uint256 streamId, uint256 depositedShares) {\\n depositedShares = _depositToken(token, msg.sender, address(this), amount, fromBentoBox);\\n\\n if (depositedShares < minShare) revert InsufficientShares();\\n\\n (streamId, ) = furoStream.createStream(\\n recipient,\\n token == address(0) ? wETH : token,\\n startTime,\\n endTime,\\n amount,\\n true\\n );\\n\\n furoStream.updateSender(streamId, msg.sender);\\n }\\n\\n function _depositToken(\\n address token,\\n address from,\\n address to,\\n uint256 amount,\\n bool fromBentoBox\\n ) internal returns (uint256 depositedShares) {\\n if (fromBentoBox) {\\n depositedShares = bentoBox.toShare(token, amount, false);\\n bentoBox.transfer(token, from, to, depositedShares);\\n } else {\\n (, depositedShares) = bentoBox.deposit{value: token == address(0) ? amount : 0}(token, from, to, amount, 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x51a8e13f2d2cfef9370cf76cafb44b585290f76b694ccb2d1c09249ae17a0969\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/IBentoBoxMinimal.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\n/// @notice Minimal BentoBox vault interface.\\n/// @dev `token` is aliased as `address` from `IERC20` for simplicity.\\ninterface IBentoBoxMinimal {\\n /// @notice Balance per ERC-20 token per account in shares.\\n function balanceOf(address, address) external view returns (uint256);\\n\\n /// @dev Helper function to represent an `amount` of `token` in shares.\\n /// @param token The ERC-20 token.\\n /// @param amount The `token` amount.\\n /// @param roundUp If the result `share` should be rounded up.\\n /// @return share The token amount represented in shares.\\n function toShare(\\n address token,\\n uint256 amount,\\n bool roundUp\\n ) external view returns (uint256 share);\\n\\n /// @dev Helper function to represent shares back into the `token` amount.\\n /// @param token The ERC-20 token.\\n /// @param share The amount of shares.\\n /// @param roundUp If the result should be rounded up.\\n /// @return amount The share amount back into native representation.\\n function toAmount(\\n address token,\\n uint256 share,\\n bool roundUp\\n ) external view returns (uint256 amount);\\n\\n /// @notice Registers this contract so that users can approve it for BentoBox.\\n function registerProtocol() external;\\n\\n /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n /// @param token_ The ERC-20 token to deposit.\\n /// @param from which account to pull the tokens.\\n /// @param to which account to push the tokens.\\n /// @param amount Token amount in native representation to deposit.\\n /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n /// @return amountOut The amount deposited.\\n /// @return shareOut The deposited amount represented in shares.\\n function deposit(\\n address token_,\\n address from,\\n address to,\\n uint256 amount,\\n uint256 share\\n ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n /// @notice Withdraws an amount of `token` from a user account.\\n /// @param token_ The ERC-20 token to withdraw.\\n /// @param from which user to pull the tokens.\\n /// @param to which user to push the tokens.\\n /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n /// @param share Like above, but `share` takes precedence over `amount`.\\n function withdraw(\\n address token_,\\n address from,\\n address to,\\n uint256 amount,\\n uint256 share\\n ) external returns (uint256 amountOut, uint256 shareOut);\\n\\n /// @notice Transfer shares from a user account to another one.\\n /// @param token The ERC-20 token to transfer.\\n /// @param from which user to pull the tokens.\\n /// @param to which user to push the tokens.\\n /// @param share The amount of `token` in shares.\\n function transfer(\\n address token,\\n address from,\\n address to,\\n uint256 share\\n ) external;\\n\\n function setMasterContractApproval(\\n address user,\\n address masterContract,\\n bool approved,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0x3e135c9c5030751760c2a558bda7c699bc0525b15fdea6f084075dc2804064c9\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/IFuroStream.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\nimport \\\"./ITasker.sol\\\";\\nimport \\\"./ITokenURIFetcher.sol\\\";\\nimport \\\"./IBentoBoxMinimal.sol\\\";\\nimport \\\"../utils/Multicall.sol\\\";\\nimport \\\"../utils/BoringOwnable.sol\\\";\\nimport \\\"@rari-capital/solmate/src/tokens/ERC721.sol\\\";\\n\\ninterface IFuroStream {\\n function setBentoBoxApproval(\\n address user,\\n bool approved,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external payable;\\n\\n function createStream(\\n address recipient,\\n address token,\\n uint64 startTime,\\n uint64 endTime,\\n uint256 amount, /// @dev in token amount and not in shares\\n bool fromBento\\n ) external payable returns (uint256 streamId, uint256 depositedShares);\\n\\n function withdrawFromStream(\\n uint256 streamId,\\n uint256 sharesToWithdraw,\\n address withdrawTo,\\n bool toBentoBox,\\n bytes memory taskData\\n ) external returns (uint256 recipientBalance, address to);\\n\\n function cancelStream(uint256 streamId, bool toBentoBox)\\n external\\n returns (uint256 senderBalance, uint256 recipientBalance);\\n\\n function updateSender(uint256 streamId, address sender) external;\\n\\n function updateStream(\\n uint256 streamId,\\n uint128 topUpAmount,\\n uint64 extendTime,\\n bool fromBentoBox\\n ) external payable returns (uint256 depositedShares);\\n\\n function streamBalanceOf(uint256 streamId)\\n external\\n view\\n returns (uint256 senderBalance, uint256 recipientBalance);\\n\\n function getStream(uint256 streamId) external view returns (Stream memory);\\n\\n event CreateStream(\\n uint256 indexed streamId,\\n address indexed sender,\\n address indexed recipient,\\n address token,\\n uint256 amount,\\n uint256 startTime,\\n uint256 endTime,\\n bool fromBentoBox\\n );\\n\\n event UpdateStream(\\n uint256 indexed streamId,\\n uint128 indexed topUpAmount,\\n uint64 indexed extendTime,\\n bool fromBentoBox\\n );\\n\\n event Withdraw(\\n uint256 indexed streamId,\\n uint256 indexed sharesToWithdraw,\\n address indexed withdrawTo,\\n address token,\\n bool toBentoBox\\n );\\n\\n event CancelStream(\\n uint256 indexed streamId,\\n uint256 indexed senderBalance,\\n uint256 indexed recipientBalance,\\n address token,\\n bool toBentoBox\\n );\\n\\n struct Stream {\\n address sender;\\n address token;\\n uint128 depositedShares;\\n uint128 withdrawnShares;\\n uint64 startTime;\\n uint64 endTime;\\n }\\n}\\n\",\"keccak256\":\"0x044410d1fbf3ed8264e52444947b90b6a313518f594c8ff45a6831a0a8f877f8\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/ITasker.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\ninterface ITasker {\\n function onTaskReceived(\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0x11e5f363d8e6250c7e34e2845a2f1f6a33085a07efa286fd047fe9d5aa9e0a02\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/ITokenURIFetcher.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\ninterface ITokenURIFetcher {\\n function fetchTokenURIData(uint256 id)\\n external\\n view\\n returns (string memory);\\n}\\n\",\"keccak256\":\"0x96bff838b3cf677bcdcc63618f7991be418601bdf854ca8247e3d942c665d68f\",\"license\":\"GPL-3.0-or-later\"},\"contracts/utils/BoringOwnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.6.12;\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n address public owner;\\n address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n /// @notice `owner` defaults to msg.sender on construction.\\n constructor() {\\n owner = msg.sender;\\n emit OwnershipTransferred(address(0), msg.sender);\\n }\\n\\n /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n /// Can only be invoked by the current `owner`.\\n /// @param newOwner Address of the new owner.\\n /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n function transferOwnership(\\n address newOwner,\\n bool direct,\\n bool renounce\\n ) public onlyOwner {\\n if (direct) {\\n // Checks\\n require(\\n newOwner != address(0) || renounce,\\n \\\"Ownable: zero address\\\"\\n );\\n\\n // Effects\\n emit OwnershipTransferred(owner, newOwner);\\n owner = newOwner;\\n pendingOwner = address(0);\\n } else {\\n // Effects\\n pendingOwner = newOwner;\\n }\\n }\\n\\n /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n function claimOwnership() public {\\n address _pendingOwner = pendingOwner;\\n\\n // Checks\\n require(\\n msg.sender == _pendingOwner,\\n \\\"Ownable: caller != pending owner\\\"\\n );\\n\\n // Effects\\n emit OwnershipTransferred(owner, _pendingOwner);\\n owner = _pendingOwner;\\n pendingOwner = address(0);\\n }\\n\\n /// @notice Only allows the `owner` to execute the function.\\n modifier onlyOwner() {\\n require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x6ceaca1fef363dd2a8a71e48b1f73aeb673cf08c9336378e8dc40b23615336b9\",\"license\":\"MIT\"},\"contracts/utils/Multicall.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\npragma solidity 0.8.10;\\n\\n/// @title Multicall\\n/// @notice Enables calling multiple methods in a single call to the contract\\nabstract contract Multicall {\\n function multicall(bytes[] calldata data)\\n public\\n payable\\n returns (bytes[] memory results)\\n {\\n results = new bytes[](data.length);\\n for (uint256 i = 0; i < data.length; i++) {\\n (bool success, bytes memory result) = address(this).delegatecall(\\n data[i]\\n );\\n\\n if (!success) {\\n // Next 5 lines from https://ethereum.stackexchange.com/a/83577\\n if (result.length < 68) revert();\\n assembly {\\n result := add(result, 0x04)\\n }\\n revert(abi.decode(result, (string)));\\n }\\n\\n results[i] = result;\\n }\\n }\\n}\",\"keccak256\":\"0x45f781fda06ef92136bdf1b418bcff631c619015b8001d9eebbacb2f91fcfa51\",\"license\":\"GPL-2.0-or-later\"}},\"version\":1}",
"bytecode": "0x60e060405234801561001057600080fd5b50604051610fc0380380610fc083398101604081905261002f91610133565b6001600160a01b03838116608081905283821660a081905291831660c05260405163c0a47c9360e01b81523060048201526024810192909252600160448301526000606483018190526084830181905260a48301529063c0a47c939060c401600060405180830381600087803b1580156100a857600080fd5b505af11580156100bc573d6000803e3d6000fd5b50505050826001600160a01b031663aee4d1b26040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156100fb57600080fd5b505af115801561010f573d6000803e3d6000fd5b50505050505050610180565b6001600160a01b038116811461013057600080fd5b50565b60008060006060848603121561014857600080fd5b83516101538161011b565b60208501519093506101648161011b565b60408501519092506101758161011b565b809150509250925092565b60805160a05160c051610de16101df6000396000818161016b015261031f015260008181610117015281816102a8015261043301526000818160be015281816101f7015281816106860152818161075001526107ca0152610de16000f3fe6080604052600436106100655760003560e01c80636f972346116100435780636f97234614610105578063ac9650d814610139578063f24286211461015957600080fd5b8063489bb0b21461006a57806365e1d2e11461007f5780636b2ace87146100ac575b600080fd5b61007d6100783660046108f3565b61018d565b005b61009261008d366004610968565b61025a565b604080519283526020830191909152015b60405180910390f35b3480156100b857600080fd5b506100e07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a3565b34801561011157600080fd5b506100e07f000000000000000000000000000000000000000000000000000000000000000081565b61014c6101473660046109e0565b6104b0565b6040516100a39190610acf565b34801561016557600080fd5b506100e07f000000000000000000000000000000000000000000000000000000000000000081565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f0000000000000000000000000000000000000000000000000000000000000000169063c0a47c939060c401600060405180830381600087803b15801561023b57600080fd5b505af115801561024f573d6000803e3d6000fd5b505050505050505050565b60008061026a883330888861062b565b9050828110156102a6576040517f3999656700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c14cf8f08a600073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161461031d578a61033f565b7f00000000000000000000000000000000000000000000000000000000000000005b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015267ffffffffffffffff808b1660448301528916606482015260848101889052600160a482015260c40160408051808303816000875af11580156103d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fa9190610b4f565b506040517f2b913453000000000000000000000000000000000000000000000000000000008152600481018290523360248201529092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632b91345390604401600060405180830381600087803b15801561048c57600080fd5b505af11580156104a0573d6000803e3d6000fd5b5050505097509795505050505050565b60608167ffffffffffffffff8111156104cb576104cb610b73565b6040519080825280602002602001820160405280156104fe57816020015b60608152602001906001900390816104e95790505b50905060005b82811015610624576000803086868581811061052257610522610ba2565b90506020028101906105349190610bd1565b604051610542929190610c3d565b600060405180830381855af49150503d806000811461057d576040519150601f19603f3d011682016040523d82523d6000602084013e610582565b606091505b5091509150816105f15760448151101561059b57600080fd5b600481019050808060200190518101906105b59190610c4d565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e89190610d18565b60405180910390fd5b8084848151811061060457610604610ba2565b60200260200101819052505050808061061c90610d32565b915050610504565b5092915050565b600081156107b3576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f0000000000000000000000000000000000000000000000000000000000000000169063da5139ca90606401602060405180830381865afa1580156106cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f19190610d92565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f18d03cc90608401600060405180830381600087803b15801561079657600080fd5b505af11580156107aa573d6000803e3d6000fd5b505050506108b1565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906302b9446c90881615610800576000610802565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af1158015610888573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108ad9190610b4f565b9150505b95945050505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108de57600080fd5b919050565b803580151581146108de57600080fd5b600080600080600060a0868803121561090b57600080fd5b610914866108ba565b9450610922602087016108e3565b9350604086013560ff8116811461093857600080fd5b94979396509394606081013594506080013592915050565b803567ffffffffffffffff811681146108de57600080fd5b600080600080600080600060e0888a03121561098357600080fd5b61098c886108ba565b965061099a602089016108ba565b95506109a860408901610950565b94506109b660608901610950565b9350608088013592506109cb60a089016108e3565b915060c0880135905092959891949750929550565b600080602083850312156109f357600080fd5b823567ffffffffffffffff80821115610a0b57600080fd5b818501915085601f830112610a1f57600080fd5b813581811115610a2e57600080fd5b8660208260051b8501011115610a4357600080fd5b60209290920196919550909350505050565b60005b83811015610a70578181015183820152602001610a58565b83811115610a7f576000848401525b50505050565b60008151808452610a9d816020860160208601610a55565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610b42577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452610b30858351610a85565b94509285019290850190600101610af6565b5092979650505050505050565b60008060408385031215610b6257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610c0657600080fd5b83018035915067ffffffffffffffff821115610c2157600080fd5b602001915036819003821315610c3657600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215610c5f57600080fd5b815167ffffffffffffffff80821115610c7757600080fd5b818401915084601f830112610c8b57600080fd5b815181811115610c9d57610c9d610b73565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610ce357610ce3610b73565b81604052828152876020848701011115610cfc57600080fd5b610d0d836020830160208801610a55565b979650505050505050565b602081526000610d2b6020830184610a85565b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610d8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b600060208284031215610da457600080fd5b505191905056fea2646970667358221220ed79c6d404efbcf7510b580e3fbcaf634f736a6657264f4f98fbea64bf21946264736f6c634300080a0033",
"deployedBytecode": "0x6080604052600436106100655760003560e01c80636f972346116100435780636f97234614610105578063ac9650d814610139578063f24286211461015957600080fd5b8063489bb0b21461006a57806365e1d2e11461007f5780636b2ace87146100ac575b600080fd5b61007d6100783660046108f3565b61018d565b005b61009261008d366004610968565b61025a565b604080519283526020830191909152015b60405180910390f35b3480156100b857600080fd5b506100e07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a3565b34801561011157600080fd5b506100e07f000000000000000000000000000000000000000000000000000000000000000081565b61014c6101473660046109e0565b6104b0565b6040516100a39190610acf565b34801561016557600080fd5b506100e07f000000000000000000000000000000000000000000000000000000000000000081565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f0000000000000000000000000000000000000000000000000000000000000000169063c0a47c939060c401600060405180830381600087803b15801561023b57600080fd5b505af115801561024f573d6000803e3d6000fd5b505050505050505050565b60008061026a883330888861062b565b9050828110156102a6576040517f3999656700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c14cf8f08a600073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161461031d578a61033f565b7f00000000000000000000000000000000000000000000000000000000000000005b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015267ffffffffffffffff808b1660448301528916606482015260848101889052600160a482015260c40160408051808303816000875af11580156103d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fa9190610b4f565b506040517f2b913453000000000000000000000000000000000000000000000000000000008152600481018290523360248201529092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632b91345390604401600060405180830381600087803b15801561048c57600080fd5b505af11580156104a0573d6000803e3d6000fd5b5050505097509795505050505050565b60608167ffffffffffffffff8111156104cb576104cb610b73565b6040519080825280602002602001820160405280156104fe57816020015b60608152602001906001900390816104e95790505b50905060005b82811015610624576000803086868581811061052257610522610ba2565b90506020028101906105349190610bd1565b604051610542929190610c3d565b600060405180830381855af49150503d806000811461057d576040519150601f19603f3d011682016040523d82523d6000602084013e610582565b606091505b5091509150816105f15760448151101561059b57600080fd5b600481019050808060200190518101906105b59190610c4d565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e89190610d18565b60405180910390fd5b8084848151811061060457610604610ba2565b60200260200101819052505050808061061c90610d32565b915050610504565b5092915050565b600081156107b3576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f0000000000000000000000000000000000000000000000000000000000000000169063da5139ca90606401602060405180830381865afa1580156106cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f19190610d92565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f18d03cc90608401600060405180830381600087803b15801561079657600080fd5b505af11580156107aa573d6000803e3d6000fd5b505050506108b1565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906302b9446c90881615610800576000610802565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af1158015610888573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108ad9190610b4f565b9150505b95945050505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108de57600080fd5b919050565b803580151581146108de57600080fd5b600080600080600060a0868803121561090b57600080fd5b610914866108ba565b9450610922602087016108e3565b9350604086013560ff8116811461093857600080fd5b94979396509394606081013594506080013592915050565b803567ffffffffffffffff811681146108de57600080fd5b600080600080600080600060e0888a03121561098357600080fd5b61098c886108ba565b965061099a602089016108ba565b95506109a860408901610950565b94506109b660608901610950565b9350608088013592506109cb60a089016108e3565b915060c0880135905092959891949750929550565b600080602083850312156109f357600080fd5b823567ffffffffffffffff80821115610a0b57600080fd5b818501915085601f830112610a1f57600080fd5b813581811115610a2e57600080fd5b8660208260051b8501011115610a4357600080fd5b60209290920196919550909350505050565b60005b83811015610a70578181015183820152602001610a58565b83811115610a7f576000848401525b50505050565b60008151808452610a9d816020860160208601610a55565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610b42577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452610b30858351610a85565b94509285019290850190600101610af6565b5092979650505050505050565b60008060408385031215610b6257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610c0657600080fd5b83018035915067ffffffffffffffff821115610c2157600080fd5b602001915036819003821315610c3657600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215610c5f57600080fd5b815167ffffffffffffffff80821115610c7757600080fd5b818401915084601f830112610c8b57600080fd5b815181811115610c9d57610c9d610b73565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610ce357610ce3610b73565b81604052828152876020848701011115610cfc57600080fd5b610d0d836020830160208801610a55565b979650505050505050565b602081526000610d2b6020830184610a85565b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610d8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b600060208284031215610da457600080fd5b505191905056fea2646970667358221220ed79c6d404efbcf7510b580e3fbcaf634f736a6657264f4f98fbea64bf21946264736f6c634300080a0033",
"devdoc": {
"kind": "dev",
"methods": {},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
},
"storageLayout": {
"storage": [],
"types": null
}
}